350 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			350 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2004-2014 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;
 | |
| 	}
 | |
| }
 | 
