350 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			350 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (C) 2004-2015 L2J DataPack
 | 
						|
 * 
 | 
						|
 * This file is part of L2J DataPack.
 | 
						|
 * 
 | 
						|
 * L2J DataPack is free software: you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License as published by
 | 
						|
 * the Free Software Foundation, either version 3 of the License, or
 | 
						|
 * (at your option) any later version.
 | 
						|
 * 
 | 
						|
 * L2J DataPack is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
						|
 * General Public License for more details.
 | 
						|
 * 
 | 
						|
 * You should have received a copy of the GNU General Public License
 | 
						|
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 */
 | 
						|
package handlers.bypasshandlers;
 | 
						|
 | 
						|
import java.text.DateFormat;
 | 
						|
 | 
						|
import com.l2jserver.Config;
 | 
						|
import com.l2jserver.gameserver.handler.IBypassHandler;
 | 
						|
import com.l2jserver.gameserver.idfactory.IdFactory;
 | 
						|
import com.l2jserver.gameserver.instancemanager.games.Lottery;
 | 
						|
import com.l2jserver.gameserver.model.actor.L2Character;
 | 
						|
import com.l2jserver.gameserver.model.actor.L2Npc;
 | 
						|
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 | 
						|
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 | 
						|
import com.l2jserver.gameserver.network.SystemMessageId;
 | 
						|
import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 | 
						|
import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
 | 
						|
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
 | 
						|
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 | 
						|
 | 
						|
public class Loto implements IBypassHandler
 | 
						|
{
 | 
						|
	private static final String[] COMMANDS =
 | 
						|
	{
 | 
						|
		"Loto"
 | 
						|
	};
 | 
						|
	
 | 
						|
	@Override
 | 
						|
	public boolean useBypass(String command, L2PcInstance activeChar, L2Character target)
 | 
						|
	{
 | 
						|
		if (!target.isNpc())
 | 
						|
		{
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		
 | 
						|
		int val = 0;
 | 
						|
		try
 | 
						|
		{
 | 
						|
			val = Integer.parseInt(command.substring(5));
 | 
						|
		}
 | 
						|
		catch (IndexOutOfBoundsException ioobe)
 | 
						|
		{
 | 
						|
		}
 | 
						|
		catch (NumberFormatException nfe)
 | 
						|
		{
 | 
						|
		}
 | 
						|
		if (val == 0)
 | 
						|
		{
 | 
						|
			// new loto ticket
 | 
						|
			for (int i = 0; i < 5; i++)
 | 
						|
			{
 | 
						|
				activeChar.setLoto(i, 0);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		showLotoWindow(activeChar, (L2Npc) target, val);
 | 
						|
		
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
	
 | 
						|
	/**
 | 
						|
	 * Open a Loto window on client with the text of the L2NpcInstance.<BR>
 | 
						|
	 * <BR>
 | 
						|
	 * <B><U> Actions</U> :</B><BR>
 | 
						|
	 * <BR>
 | 
						|
	 * <li>Get the text of the selected HTML file in function of the npcId and of the page number</li> <li>Send a Server->Client NpcHtmlMessage containing the text of the L2NpcInstance to the L2PcInstance</li> <li>Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the
 | 
						|
	 * client wait another packet</li><BR>
 | 
						|
	 * @param player The L2PcInstance that talk with the L2NpcInstance
 | 
						|
	 * @param npc L2Npc loto instance
 | 
						|
	 * @param val The number of the page of the L2NpcInstance to display
 | 
						|
	 */
 | 
						|
	// 0 - first buy lottery ticket window
 | 
						|
	// 1-20 - buttons
 | 
						|
	// 21 - second buy lottery ticket window
 | 
						|
	// 22 - selected ticket with 5 numbers
 | 
						|
	// 23 - current lottery jackpot
 | 
						|
	// 24 - Previous winning numbers/Prize claim
 | 
						|
	// >24 - check lottery ticket by item object id
 | 
						|
	public static final void showLotoWindow(L2PcInstance player, L2Npc npc, int val)
 | 
						|
	{
 | 
						|
		int npcId = npc.getTemplate().getId();
 | 
						|
		String filename;
 | 
						|
		SystemMessage sm;
 | 
						|
		final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
 | 
						|
		
 | 
						|
		if (val == 0) // 0 - first buy lottery ticket window
 | 
						|
		{
 | 
						|
			filename = (npc.getHtmlPath(npcId, 1));
 | 
						|
			html.setFile(player.getHtmlPrefix(), filename);
 | 
						|
		}
 | 
						|
		else if ((val >= 1) && (val <= 21)) // 1-20 - buttons, 21 - second buy lottery ticket window
 | 
						|
		{
 | 
						|
			if (!Lottery.getInstance().isStarted())
 | 
						|
			{
 | 
						|
				// tickets can't be sold
 | 
						|
				player.sendPacket(SystemMessageId.LOTTERY_TICKETS_ARE_NOT_CURRENTLY_BEING_SOLD);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			if (!Lottery.getInstance().isSellableTickets())
 | 
						|
			{
 | 
						|
				// tickets can't be sold
 | 
						|
				player.sendPacket(SystemMessageId.TICKETS_FOR_THE_CURRENT_LOTTERY_ARE_NO_LONGER_AVAILABLE);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			
 | 
						|
			filename = (npc.getHtmlPath(npcId, 5));
 | 
						|
			html.setFile(player.getHtmlPrefix(), filename);
 | 
						|
			
 | 
						|
			int count = 0;
 | 
						|
			int found = 0;
 | 
						|
			// counting buttons and unsetting button if found
 | 
						|
			for (int i = 0; i < 5; i++)
 | 
						|
			{
 | 
						|
				if (player.getLoto(i) == val)
 | 
						|
				{
 | 
						|
					// unsetting button
 | 
						|
					player.setLoto(i, 0);
 | 
						|
					found = 1;
 | 
						|
				}
 | 
						|
				else if (player.getLoto(i) > 0)
 | 
						|
				{
 | 
						|
					count++;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			
 | 
						|
			// if not rearched limit 5 and not unseted value
 | 
						|
			if ((count < 5) && (found == 0) && (val <= 20))
 | 
						|
			{
 | 
						|
				for (int i = 0; i < 5; i++)
 | 
						|
				{
 | 
						|
					if (player.getLoto(i) == 0)
 | 
						|
					{
 | 
						|
						player.setLoto(i, val);
 | 
						|
						break;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			
 | 
						|
			// setting pusshed buttons
 | 
						|
			count = 0;
 | 
						|
			for (int i = 0; i < 5; i++)
 | 
						|
			{
 | 
						|
				if (player.getLoto(i) > 0)
 | 
						|
				{
 | 
						|
					count++;
 | 
						|
					String button = String.valueOf(player.getLoto(i));
 | 
						|
					if (player.getLoto(i) < 10)
 | 
						|
					{
 | 
						|
						button = "0" + button;
 | 
						|
					}
 | 
						|
					String search = "fore=\"L2UI.lottoNum" + button + "\" back=\"L2UI.lottoNum" + button + "a_check\"";
 | 
						|
					String replace = "fore=\"L2UI.lottoNum" + button + "a_check\" back=\"L2UI.lottoNum" + button + "\"";
 | 
						|
					html.replace(search, replace);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			
 | 
						|
			if (count == 5)
 | 
						|
			{
 | 
						|
				String search = "0\">Return";
 | 
						|
				String replace = "22\">Your lucky numbers have been selected above.";
 | 
						|
				html.replace(search, replace);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		else if (val == 22) // 22 - selected ticket with 5 numbers
 | 
						|
		{
 | 
						|
			if (!Lottery.getInstance().isStarted())
 | 
						|
			{
 | 
						|
				// tickets can't be sold
 | 
						|
				player.sendPacket(SystemMessageId.LOTTERY_TICKETS_ARE_NOT_CURRENTLY_BEING_SOLD);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			if (!Lottery.getInstance().isSellableTickets())
 | 
						|
			{
 | 
						|
				// tickets can't be sold
 | 
						|
				player.sendPacket(SystemMessageId.TICKETS_FOR_THE_CURRENT_LOTTERY_ARE_NO_LONGER_AVAILABLE);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			
 | 
						|
			long price = Config.ALT_LOTTERY_TICKET_PRICE;
 | 
						|
			int lotonumber = Lottery.getInstance().getId();
 | 
						|
			int enchant = 0;
 | 
						|
			int type2 = 0;
 | 
						|
			
 | 
						|
			for (int i = 0; i < 5; i++)
 | 
						|
			{
 | 
						|
				if (player.getLoto(i) == 0)
 | 
						|
				{
 | 
						|
					return;
 | 
						|
				}
 | 
						|
				
 | 
						|
				if (player.getLoto(i) < 17)
 | 
						|
				{
 | 
						|
					enchant += Math.pow(2, player.getLoto(i) - 1);
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					type2 += Math.pow(2, player.getLoto(i) - 17);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if (player.getAdena() < price)
 | 
						|
			{
 | 
						|
				sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ADENA);
 | 
						|
				player.sendPacket(sm);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			if (!player.reduceAdena("Loto", price, npc, true))
 | 
						|
			{
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			Lottery.getInstance().increasePrize(price);
 | 
						|
			
 | 
						|
			sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_EARNED_S1);
 | 
						|
			sm.addItemName(4442);
 | 
						|
			player.sendPacket(sm);
 | 
						|
			
 | 
						|
			L2ItemInstance item = new L2ItemInstance(IdFactory.getInstance().getNextId(), 4442);
 | 
						|
			item.setCount(1);
 | 
						|
			item.setCustomType1(lotonumber);
 | 
						|
			item.setEnchantLevel(enchant);
 | 
						|
			item.setCustomType2(type2);
 | 
						|
			player.getInventory().addItem("Loto", item, player, npc);
 | 
						|
			
 | 
						|
			InventoryUpdate iu = new InventoryUpdate();
 | 
						|
			iu.addItem(item);
 | 
						|
			L2ItemInstance adenaupdate = player.getInventory().getItemByItemId(57);
 | 
						|
			iu.addModifiedItem(adenaupdate);
 | 
						|
			player.sendPacket(iu);
 | 
						|
			
 | 
						|
			filename = (npc.getHtmlPath(npcId, 6));
 | 
						|
			html.setFile(player.getHtmlPrefix(), filename);
 | 
						|
		}
 | 
						|
		else if (val == 23) // 23 - current lottery jackpot
 | 
						|
		{
 | 
						|
			filename = (npc.getHtmlPath(npcId, 3));
 | 
						|
			html.setFile(player.getHtmlPrefix(), filename);
 | 
						|
		}
 | 
						|
		else if (val == 24) // 24 - Previous winning numbers/Prize claim
 | 
						|
		{
 | 
						|
			filename = (npc.getHtmlPath(npcId, 4));
 | 
						|
			html.setFile(player.getHtmlPrefix(), filename);
 | 
						|
			
 | 
						|
			int lotonumber = Lottery.getInstance().getId();
 | 
						|
			String message = "";
 | 
						|
			for (L2ItemInstance item : player.getInventory().getItems())
 | 
						|
			{
 | 
						|
				if (item == null)
 | 
						|
				{
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
				if ((item.getId() == 4442) && (item.getCustomType1() < lotonumber))
 | 
						|
				{
 | 
						|
					message = message + "<a action=\"bypass -h npc_%objectId%_Loto " + item.getObjectId() + "\">" + item.getCustomType1() + " Event Number ";
 | 
						|
					int[] numbers = Lottery.getInstance().decodeNumbers(item.getEnchantLevel(), item.getCustomType2());
 | 
						|
					for (int i = 0; i < 5; i++)
 | 
						|
					{
 | 
						|
						message += numbers[i] + " ";
 | 
						|
					}
 | 
						|
					long[] check = Lottery.getInstance().checkTicket(item);
 | 
						|
					if (check[0] > 0)
 | 
						|
					{
 | 
						|
						switch ((int) check[0])
 | 
						|
						{
 | 
						|
							case 1:
 | 
						|
								message += "- 1st Prize";
 | 
						|
								break;
 | 
						|
							case 2:
 | 
						|
								message += "- 2nd Prize";
 | 
						|
								break;
 | 
						|
							case 3:
 | 
						|
								message += "- 3th Prize";
 | 
						|
								break;
 | 
						|
							case 4:
 | 
						|
								message += "- 4th Prize";
 | 
						|
								break;
 | 
						|
						}
 | 
						|
						message += " " + check[1] + "a.";
 | 
						|
					}
 | 
						|
					message += "</a><br>";
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if (message.isEmpty())
 | 
						|
			{
 | 
						|
				message += "There has been no winning lottery ticket.<br>";
 | 
						|
			}
 | 
						|
			html.replace("%result%", message);
 | 
						|
		}
 | 
						|
		else if (val == 25) // 25 - lottery instructions
 | 
						|
		{
 | 
						|
			filename = (npc.getHtmlPath(npcId, 2));
 | 
						|
			html.setFile(player.getHtmlPrefix(), filename);
 | 
						|
		}
 | 
						|
		else if (val > 25) // >25 - check lottery ticket by item object id
 | 
						|
		{
 | 
						|
			int lotonumber = Lottery.getInstance().getId();
 | 
						|
			L2ItemInstance item = player.getInventory().getItemByObjectId(val);
 | 
						|
			if ((item == null) || (item.getId() != 4442) || (item.getCustomType1() >= lotonumber))
 | 
						|
			{
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			long[] check = Lottery.getInstance().checkTicket(item);
 | 
						|
			
 | 
						|
			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DISAPPEARED);
 | 
						|
			sm.addItemName(4442);
 | 
						|
			player.sendPacket(sm);
 | 
						|
			
 | 
						|
			long adena = check[1];
 | 
						|
			if (adena > 0)
 | 
						|
			{
 | 
						|
				player.addAdena("Loto", adena, npc, true);
 | 
						|
			}
 | 
						|
			player.destroyItem("Loto", item, npc, false);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		html.replace("%objectId%", String.valueOf(npc.getObjectId()));
 | 
						|
		html.replace("%race%", "" + Lottery.getInstance().getId());
 | 
						|
		html.replace("%adena%", "" + Lottery.getInstance().getPrize());
 | 
						|
		html.replace("%ticket_price%", "" + Config.ALT_LOTTERY_TICKET_PRICE);
 | 
						|
		html.replace("%prize5%", "" + (Config.ALT_LOTTERY_5_NUMBER_RATE * 100));
 | 
						|
		html.replace("%prize4%", "" + (Config.ALT_LOTTERY_4_NUMBER_RATE * 100));
 | 
						|
		html.replace("%prize3%", "" + (Config.ALT_LOTTERY_3_NUMBER_RATE * 100));
 | 
						|
		html.replace("%prize2%", "" + Config.ALT_LOTTERY_2_AND_1_NUMBER_PRIZE);
 | 
						|
		html.replace("%enddate%", "" + DateFormat.getDateInstance().format(Lottery.getInstance().getEndDate()));
 | 
						|
		player.sendPacket(html);
 | 
						|
		
 | 
						|
		// Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait another packet
 | 
						|
		player.sendPacket(ActionFailed.STATIC_PACKET);
 | 
						|
	}
 | 
						|
	
 | 
						|
	@Override
 | 
						|
	public String[] getBypassList()
 | 
						|
	{
 | 
						|
		return COMMANDS;
 | 
						|
	}
 | 
						|
}
 |