/* * 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 . */ 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.
*
* Actions :
*
*
  • Get the text of the selected HTML file in function of the npcId and of the page number
  • Send a Server->Client NpcHtmlMessage containing the text of the L2NpcInstance to the L2PcInstance
  • Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the * client wait another packet

  • * @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.NO_LOTTERY_TICKETS_CURRENT_SOLD); return; } if (!Lottery.getInstance().isSellableTickets()) { // tickets can't be sold player.sendPacket(SystemMessageId.NO_LOTTERY_TICKETS_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.NO_LOTTERY_TICKETS_CURRENT_SOLD); return; } if (!Lottery.getInstance().isSellableTickets()) { // tickets can't be sold player.sendPacket(SystemMessageId.NO_LOTTERY_TICKETS_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_NOT_ENOUGH_ADENA); player.sendPacket(sm); return; } if (!player.reduceAdena("Loto", price, npc, true)) { return; } Lottery.getInstance().increasePrize(price); sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_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 + "" + 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 += "
    "; } } if (message.isEmpty()) { message += "There has been no winning lottery ticket.
    "; } 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; } }