/* * 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.scripts.quests; import silentium.gameserver.model.actor.L2Npc; import silentium.gameserver.model.actor.instance.L2PcInstance; import silentium.gameserver.model.quest.Quest; import silentium.gameserver.model.quest.QuestState; import silentium.gameserver.scripting.ScriptFile; import silentium.gameserver.tables.ItemTable; import java.util.HashMap; import java.util.Map; public class Q234_FatesWhisper extends Quest implements ScriptFile { private static final String qn = "Q234_FatesWhisper"; // Items private static final int REIRIAS_SOUL_ORB = 4666; private static final int KERMONS_INFERNIUM_SCEPTER = 4667; private static final int GOLKONDAS_INFERNIUM_SCEPTER = 4668; private static final int HALLATES_INFERNIUM_SCEPTER = 4669; private static final int INFERNIUM_VARNISH = 4672; private static final int REORINS_HAMMER = 4670; private static final int REORINS_MOLD = 4671; private static final int PIPETTE_KNIFE = 4665; private static final int RED_PIPETTE_KNIFE = 4673; private static final int CRYSTAL_B = 1460; // Reward private static final int STAR_OF_DESTINY = 5011; // Chest Spawn private static final Map<Integer, Integer> CHEST_SPAWN = new HashMap<>(); static { CHEST_SPAWN.put(25035, 31027); CHEST_SPAWN.put(25054, 31028); CHEST_SPAWN.put(25126, 31029); CHEST_SPAWN.put(25220, 31030); } // Weapons private static final Map<Integer, String> Weapons = new HashMap<>(); static { Weapons.put(79, "Sword of Damascus"); Weapons.put(97, "Lance"); Weapons.put(171, "Deadman's Glory"); Weapons.put(175, "Art of Battle Axe"); Weapons.put(210, "Staff of Evil Spirits"); Weapons.put(234, "Demon Dagger"); Weapons.put(268, "Bellion Cestus"); Weapons.put(287, "Bow of Peril"); Weapons.put(2626, "Samurai Dual-sword"); Weapons.put(7883, "Guardian Sword"); Weapons.put(7889, "Wizard's Tear"); Weapons.put(7893, "Kaim Vanul's Bones"); Weapons.put(7901, "Star Buster"); } public Q234_FatesWhisper(final int scriptId, final String name, final String dname, final String path) { super(scriptId, name, dname, path); questItemIds = new int[] { PIPETTE_KNIFE, RED_PIPETTE_KNIFE }; addStartNpc(31002); addTalkId(31002, 30182, 30847, 30178, 30833, 31028, 31029, 31030, 31027); // The 4 bosses which spawn chests addKillId(25035, 25054, 25126, 25220); // Baium addAttackId(29020); } public static void onLoad() { new Q234_FatesWhisper(234, "Q234_FatesWhisper", "Fates Whisper", "quests"); } @Override public String onAdvEvent(final String event, final L2Npc npc, final L2PcInstance player) { String htmltext = event; final QuestState st = player.getQuestState(qn); if (st == null) return htmltext; if ("31002-03.htm".equalsIgnoreCase(event)) { st.set("cond", "1"); st.setState(QuestState.STARTED); st.playSound(QuestState.SOUND_ACCEPT); } else if ("30182-01c.htm".equalsIgnoreCase(event)) { st.giveItems(INFERNIUM_VARNISH, 1); st.playSound(QuestState.SOUND_ITEMGET); } else if ("30178-01a.htm".equalsIgnoreCase(event)) { st.set("cond", "6"); st.playSound(QuestState.SOUND_MIDDLE); } else if ("30833-01b.htm".equalsIgnoreCase(event)) { st.set("cond", "7"); st.giveItems(PIPETTE_KNIFE, 1); st.playSound(QuestState.SOUND_MIDDLE); } else if (event.startsWith("selectBGrade_")) { if (st.getInt("bypass") == 1) return null; final String bGradeId = event.replace("selectBGrade_", ""); st.set("weaponId", bGradeId); htmltext = st.showHtmlFile("31002-13.htm").replace("%weaponname%", Weapons.get(st.getInt("weaponId"))); } else if (event.startsWith("confirmWeapon")) { st.set("bypass", "1"); htmltext = st.showHtmlFile("31002-14.htm").replace("%weaponname%", Weapons.get(st.getInt("weaponId"))); } else if (event.startsWith("selectAGrade_")) { if (st.getInt("bypass") == 1) { final int itemId = st.getInt("weaponId"); if (st.hasQuestItems(itemId)) { final int aGradeItemId = Integer.parseInt(event.replace("selectAGrade_", "")); htmltext = st.showHtmlFile("31002-12.htm").replace("%weaponname%", ItemTable.getInstance().getTemplate(aGradeItemId).getName()); st.takeItems(itemId, 1); st.giveItems(aGradeItemId, 1); st.giveItems(STAR_OF_DESTINY, 1); st.playSound(QuestState.SOUND_FINISH); st.exitQuest(false); } else htmltext = st.showHtmlFile("31002-15.htm").replace("%weaponname%", Weapons.get(itemId)); } else htmltext = "31002-16.htm"; } return htmltext; } @Override public String onTalk(final L2Npc npc, final L2PcInstance player) { final QuestState st = player.getQuestState(qn); String htmltext = getNoQuestMsg(); if (st == null) return htmltext; switch (st.getState()) { case QuestState.CREATED: if (player.getLevel() >= 75) htmltext = "31002-02.htm"; else { htmltext = "31002-01.htm"; st.exitQuest(true); } break; case QuestState.STARTED: final int cond = st.getInt("cond"); switch (npc.getNpcId()) { case 31002: if (cond == 1) { if (!st.hasQuestItems(REIRIAS_SOUL_ORB)) htmltext = "31002-04b.htm"; else { st.set("cond", "2"); htmltext = "31002-05.htm"; st.takeItems(REIRIAS_SOUL_ORB, 1); st.playSound(QuestState.SOUND_MIDDLE); } } else if (cond == 2) { if (!st.hasQuestItems(KERMONS_INFERNIUM_SCEPTER) || !st.hasQuestItems(GOLKONDAS_INFERNIUM_SCEPTER) || !st.hasQuestItems(HALLATES_INFERNIUM_SCEPTER)) htmltext = "31002-05c.htm"; else { st.set("cond", "3"); htmltext = "31002-06.htm"; st.takeItems(KERMONS_INFERNIUM_SCEPTER, 1); st.takeItems(GOLKONDAS_INFERNIUM_SCEPTER, 1); st.takeItems(HALLATES_INFERNIUM_SCEPTER, 1); st.playSound(QuestState.SOUND_MIDDLE); } } else if (cond == 3) { if (st.getQuestItemsCount(INFERNIUM_VARNISH) < 1) htmltext = "31002-06b.htm"; else { st.set("cond", "4"); htmltext = "31002-07.htm"; st.takeItems(INFERNIUM_VARNISH, 1); st.playSound(QuestState.SOUND_MIDDLE); } } else if (cond == 4) { if (st.getQuestItemsCount(REORINS_HAMMER) < 1) htmltext = "31002-07b.htm"; else { st.set("cond", "5"); htmltext = "31002-08.htm"; st.takeItems(REORINS_HAMMER, 1); st.playSound(QuestState.SOUND_MIDDLE); } } else if (cond > 4 && cond < 8) htmltext = "31002-08b.htm"; else if (cond == 8) { st.set("cond", "9"); htmltext = "31002-09.htm"; st.takeItems(REORINS_MOLD, 1); st.playSound(QuestState.SOUND_MIDDLE); } else if (cond == 9) { if (st.getQuestItemsCount(CRYSTAL_B) < 984) htmltext = "31002-09b.htm"; else { st.set("cond", "10"); htmltext = "31002-BGradeList.htm"; st.takeItems(CRYSTAL_B, 984); st.playSound(QuestState.SOUND_MIDDLE); } } else if (cond == 10) { // If a weapon is selected if (st.getInt("bypass") == 1) { // If you got it in the inventory final int itemId = st.getInt("weaponId"); htmltext = st.showHtmlFile(st.hasQuestItems(itemId) ? "31002-AGradeList.htm" : "31002-15.htm").replace("%weaponname%", Weapons.get(itemId)); } // B weapon is still not selected else htmltext = "31002-BGradeList.htm"; } break; case 30182: if (cond == 3) { htmltext = !st.hasQuestItems(INFERNIUM_VARNISH) ? "30182-01.htm" : "30182-02.htm"; } break; case 30847: if (cond == 4 && !st.hasQuestItems(REORINS_HAMMER)) { htmltext = "30847-01.htm"; st.giveItems(REORINS_HAMMER, 1); st.playSound(QuestState.SOUND_ITEMGET); } else if (cond >= 4 && st.hasQuestItems(REORINS_HAMMER)) htmltext = "30847-02.htm"; break; case 30178: if (cond == 5) htmltext = "30178-01.htm"; else if (cond >= 6) htmltext = "30178-02.htm"; break; case 30833: if (cond == 6) htmltext = "30833-01.htm"; else if (cond == 7) { if (st.hasQuestItems(PIPETTE_KNIFE) && !st.hasQuestItems(RED_PIPETTE_KNIFE)) htmltext = "30833-02.htm"; else { htmltext = "30833-03.htm"; st.set("cond", "8"); st.takeItems(RED_PIPETTE_KNIFE, 1); st.giveItems(REORINS_MOLD, 1); st.playSound(QuestState.SOUND_MIDDLE); } } else if (cond >= 8) htmltext = "30833-04.htm"; break; case 31027: if (cond == 1) { if (!st.hasQuestItems(REIRIAS_SOUL_ORB)) { htmltext = "31027-01.htm"; st.giveItems(REIRIAS_SOUL_ORB, 1); st.playSound(QuestState.SOUND_ITEMGET); } else htmltext = "31027-02.htm"; } else htmltext = "31027-02.htm"; break; case 31028: if (cond == 2) { if (!st.hasQuestItems(KERMONS_INFERNIUM_SCEPTER)) { htmltext = "31028-01.htm"; st.giveItems(KERMONS_INFERNIUM_SCEPTER, 1); st.playSound(QuestState.SOUND_ITEMGET); } else htmltext = "31028-02.htm"; } else htmltext = "31028-02.htm"; break; case 31029: if (cond == 2) { if (!st.hasQuestItems(GOLKONDAS_INFERNIUM_SCEPTER)) { htmltext = "31029-01.htm"; st.giveItems(GOLKONDAS_INFERNIUM_SCEPTER, 1); st.playSound(QuestState.SOUND_ITEMGET); } else htmltext = "31029-02.htm"; } else htmltext = "31029-02.htm"; break; case 31030: if (cond == 2) { if (!st.hasQuestItems(HALLATES_INFERNIUM_SCEPTER)) { htmltext = "31030-01.htm"; st.giveItems(HALLATES_INFERNIUM_SCEPTER, 1); st.playSound(QuestState.SOUND_ITEMGET); } else htmltext = "31030-02.htm"; } else htmltext = "31030-02.htm"; break; } break; case QuestState.COMPLETED: htmltext = Quest.getAlreadyCompletedMsg(); break; } return htmltext; } @Override public String onAttack(final L2Npc npc, final L2PcInstance attacker, final int damage, final boolean isPet) { final QuestState st = attacker.getQuestState(qn); if (st == null || !st.isStarted() || isPet) return null; if (st.getInt("cond") == 7) { if (attacker.getActiveWeaponItem() != null && attacker.getActiveWeaponItem().getItemId() == PIPETTE_KNIFE && st.getQuestItemsCount(RED_PIPETTE_KNIFE) == 0) { st.giveItems(RED_PIPETTE_KNIFE, 1); st.takeItems(PIPETTE_KNIFE, 1); st.playSound(QuestState.SOUND_ITEMGET); } } return null; } @Override public String onKill(final L2Npc npc, final L2PcInstance player, final boolean isPet) { // Chests aren't influenced by conditions, or even if the killer got the quest. It just spawns. final int npcId = npc.getNpcId(); if (CHEST_SPAWN.containsKey(npcId)) addSpawn(CHEST_SPAWN.get(npcId), npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), true, 60000); return null; } }