/* * This program 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. This program 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 silentium.gameserver.model.actor.instance; import java.util.List; import silentium.commons.utils.StringUtil; import silentium.gameserver.data.html.StaticHtmPath; import silentium.gameserver.model.L2ItemInstance; import silentium.gameserver.model.L2Multisell; import silentium.gameserver.model.entity.Hero; import silentium.gameserver.model.olympiad.CompetitionType; import silentium.gameserver.model.olympiad.Olympiad; import silentium.gameserver.model.olympiad.OlympiadGameManager; import silentium.gameserver.model.olympiad.OlympiadGameTask; import silentium.gameserver.model.olympiad.OlympiadManager; import silentium.gameserver.network.SystemMessageId; import silentium.gameserver.network.serverpackets.ActionFailed; import silentium.gameserver.network.serverpackets.ExHeroList; import silentium.gameserver.network.serverpackets.InventoryUpdate; import silentium.gameserver.network.serverpackets.NpcHtmlMessage; import silentium.gameserver.network.serverpackets.SystemMessage; import silentium.gameserver.templates.chars.L2NpcTemplate; /** * Olympiad Npcs * * @author godson && Tryskell */ public class L2OlympiadManagerInstance extends L2NpcInstance { private static final int GATE_PASS = 6651; public L2OlympiadManagerInstance(int objectId, L2NpcTemplate template) { super(objectId, template); } @Override public String getHtmlPath(int npcId, int val) { // Only used by Olympiad managers. Monument of Heroes don't use "Chat" bypass. String pom = "noble"; if (val > 0) pom = "noble_" + val; return pom + ".htm"; } @Override public void showChatWindow(L2PcInstance player, int val) { int npcId = getTemplate().getNpcId(); String filename = getHtmlPath(npcId, val); switch (npcId) { case 31688: // Olympiad managers if (player.isNoble() && val == 0) filename = "noble_main.htm"; break; case 31690: // Monuments of Heroes case 31769: case 31770: case 31771: case 31772: if (player.isHero() || Hero.getInstance().isInactiveHero(player.getObjectId())) filename = "hero_main.htm"; else filename = "hero_main2.htm"; break; } // Send a Server->Client NpcHtmlMessage containing the text of the L2Npc to the L2PcInstance NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); html.setFile(StaticHtmPath.OlympiadHtmPath + filename, player); // Hidden option for players who are in inactive mode. if (filename == "hero_main.htm") { String hiddenText = ""; if (Hero.getInstance().isInactiveHero(player.getObjectId())) hiddenText = "<a action=\"bypass -h npc_%objectId%_Olympiad 5\">\"I want to be a Hero.\"</a><br>"; html.replace("%hero%", hiddenText); } html.replace("%objectId%", String.valueOf(getObjectId())); 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 void onBypassFeedback(L2PcInstance player, String command) { if (command.startsWith("OlympiadNoble")) { final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); if (player.isCursedWeaponEquipped()) { html.setFile(StaticHtmPath.OlympiadHtmPath + "noble_cant_cw.htm", player); player.sendPacket(html); return; } if (player.getClassIndex() != 0) { html.setFile(StaticHtmPath.OlympiadHtmPath + "noble_cant_sub.htm", player); html.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(html); return; } if (!player.isNoble() || (player.getClassId().level() < 3)) { html.setFile(StaticHtmPath.OlympiadHtmPath + "noble_cant_thirdclass.htm", player); html.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(html); return; } int passes; int val = Integer.parseInt(command.substring(14)); switch (val) { case 1: // Unregister OlympiadManager.getInstance().unRegisterNoble(player); break; case 2: // Show waiting list final int nonClassed = OlympiadManager.getInstance().getRegisteredNonClassBased().size(); final int classed = OlympiadManager.getInstance().getRegisteredClassBased().size(); html.setFile(StaticHtmPath.OlympiadHtmPath + "noble_registered.htm", player); html.replace("%listClassed%", String.valueOf(classed)); html.replace("%listNonClassed%", String.valueOf(nonClassed)); html.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(html); break; case 3: // There are %points% Grand Olympiad points granted for this event. int points = Olympiad.getInstance().getNoblePoints(player.getObjectId()); html.setFile(StaticHtmPath.OlympiadHtmPath + "noble_points1.htm", player); html.replace("%points%", String.valueOf(points)); html.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(html); break; case 4: // register non classed based OlympiadManager.getInstance().registerNoble(player, CompetitionType.NON_CLASSED); break; case 5: // register classed based OlympiadManager.getInstance().registerNoble(player, CompetitionType.CLASSED); break; case 6: // request tokens reward passes = Olympiad.getInstance().getNoblessePasses(player, false); if (passes > 0) { html.setFile(StaticHtmPath.OlympiadHtmPath + "noble_settle.htm", player); html.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(html); } else { html.setFile(StaticHtmPath.OlympiadHtmPath + "noble_nopoints2.htm", player); html.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(html); } break; case 7: // Rewards L2Multisell.getInstance().separateAndSend(102, player, false, getCastle().getTaxRate()); break; case 10: // Give tokens to player passes = Olympiad.getInstance().getNoblessePasses(player, true); if (passes > 0) { L2ItemInstance item = player.getInventory().addItem("Olympiad", GATE_PASS, passes, player, this); InventoryUpdate iu = new InventoryUpdate(); iu.addModifiedItem(item); player.sendPacket(iu); player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S).addItemName(item).addItemNumber(passes)); } break; default: _log.warn("Olympiad System: Couldnt send packet for request: " + val); break; } } else if (command.startsWith("Olympiad")) { int val = Integer.parseInt(command.substring(9, 10)); NpcHtmlMessage reply = new NpcHtmlMessage(getObjectId()); switch (val) { case 2: // Show rank for a specific class, example >> Olympiad 1_88 int classId = Integer.parseInt(command.substring(11)); if (classId >= 88 && classId <= 118) { List<String> names = Olympiad.getInstance().getClassLeaderBoard(classId); reply.setFile(StaticHtmPath.OlympiadHtmPath + "noble_ranking.htm", player); int index = 1; for (String name : names) { reply.replace("%place" + index + "%", String.valueOf(index)); reply.replace("%rank" + index + "%", name); index++; if (index > 10) break; } for (; index <= 10; index++) { reply.replace("%place" + index + "%", ""); reply.replace("%rank" + index + "%", ""); } reply.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(reply); } break; case 3: // Spectator overview StringBuilder list = new StringBuilder(2000); OlympiadGameTask task; reply.setFile(StaticHtmPath.OlympiadHtmPath + "olympiad_observe_list.htm", player); for (int i = 0; i <= 21; i++) { task = OlympiadGameManager.getInstance().getOlympiadTask(i); if (task != null) { StringUtil.append(list, "<a action=\"bypass arenachange ", String.valueOf(i), "\">Arena ", String.valueOf(i + 1), " "); if (task.isGameStarted()) { if (task.isInTimerTime()) StringUtil.append(list, "(&$907;)"); // Counting In Progress else if (task.isBattleStarted()) StringUtil.append(list, "(&$829;)"); // In Progress else StringUtil.append(list, "(&$908;)"); // Terminate StringUtil.append(list, " ", task.getGame().getPlayerNames()[0], "  :  ", task.getGame().getPlayerNames()[1]); } else StringUtil.append(list, "(&$906;)", "</td><td> "); // Initial State StringUtil.append(list, "</a><br>"); } } reply.replace("%list%", list.toString()); reply.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(reply); break; case 4: // Send heroes list. player.sendPacket(new ExHeroList()); break; case 5: // Hero pending state. if (Hero.getInstance().isInactiveHero(player.getObjectId())) { reply.setFile(StaticHtmPath.OlympiadHtmPath + "hero_confirm.htm", player); reply.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(reply); } break; case 6: // Hero confirm action. if (Hero.getInstance().isInactiveHero(player.getObjectId())) { if (player.isSubClassActive() || player.getLevel() < 76) { player.sendMessage("You may only become an hero on a main class whose level is 75 or more."); return; } Hero.getInstance().activateHero(player); } break; case 7: // Main panel reply.setFile(StaticHtmPath.OlympiadHtmPath + "hero_main.htm", player); String hiddenText = ""; if (Hero.getInstance().isInactiveHero(player.getObjectId())) hiddenText = "<a action=\"bypass -h npc_%objectId%_Olympiad 5\">\"I want to be a Hero.\"</a><br>"; reply.replace("%hero%", hiddenText); reply.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(reply); break; default: _log.warn("Olympiad System: Couldnt send packet for request: " + val); break; } } else super.onBypassFeedback(player, command); } }