/* * 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.commons.utils.Rnd; import silentium.gameserver.instancemanager.FourSepulchersManager; 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.utils.Util; import java.util.Arrays; public class Q620_FourGoblets extends Quest implements ScriptFile { private static final String qn = "Q620_FourGoblets"; // NPCs private static final int NAMELESS_SPIRIT = 31453; private static final int GHOST_OF_WIGOTH_1 = 31452; private static final int GHOST_OF_WIGOTH_2 = 31454; private static final int CONQ_SM = 31921; private static final int EMPER_SM = 31922; private static final int SAGES_SM = 31923; private static final int JUDGE_SM = 31924; private static final int GHOST_CHAMBERLAIN_1 = 31919; private static final int GHOST_CHAMBERLAIN_2 = 31920; // Items private static final int GRAVE_PASS = 7261; private static final int[] GOBLETS = { 7256, 7257, 7258, 7259 }; private static final int RELIC = 7254; public static final int SEALED_BOX = 7255; // Rewards private static final int ANTIQUE_BROOCH = 7262; private static final int[] RCP_REWARDS = { 6881, 6883, 6885, 6887, 6891, 6893, 6895, 6897, 6899, 7580 }; public Q620_FourGoblets(final int scriptId, final String name, final String dname, final String path) { super(scriptId, name, dname, path); questItemIds = new int[] { SEALED_BOX, GRAVE_PASS, 7256, 7257, 7258, 7259 }; addStartNpc(NAMELESS_SPIRIT); addStartNpc(CONQ_SM); addStartNpc(EMPER_SM); addStartNpc(SAGES_SM); addStartNpc(JUDGE_SM); addStartNpc(GHOST_CHAMBERLAIN_1); addStartNpc(GHOST_CHAMBERLAIN_2); addTalkId(NAMELESS_SPIRIT); addTalkId(CONQ_SM); addTalkId(EMPER_SM); addTalkId(SAGES_SM); addTalkId(JUDGE_SM); addTalkId(GHOST_CHAMBERLAIN_1); addTalkId(GHOST_CHAMBERLAIN_2); addTalkId(GHOST_OF_WIGOTH_1); addTalkId(GHOST_OF_WIGOTH_2); for (int id = 18120; id <= 18256; id++) addKillId(id); } public static void onLoad() { new Q620_FourGoblets(620, "Q620_FourGoblets", "Four Goblets", "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; final int cond = st.getInt("cond"); if ("Enter".equalsIgnoreCase(event)) { FourSepulchersManager.getInstance().tryEntry(npc, player); return null; } else if ("accept".equalsIgnoreCase(event)) { if (cond == 0) { if (st.getPlayer().getLevel() >= 74) { st.setState(QuestState.STARTED); st.playSound(QuestState.SOUND_ACCEPT); htmltext = "31453-13.htm"; st.set("cond", "1"); } else { htmltext = "31453-12.htm"; st.exitQuest(true); } } } else if ("11".equalsIgnoreCase(event)) { if (st.getQuestItemsCount(SEALED_BOX) >= 1) { htmltext = "31454-13.htm"; st.takeItems(SEALED_BOX, 1); if (!calculateBoxReward(st)) { htmltext = Rnd.get(2) == 0 ? "31454-14.htm" : "31454-15.htm"; } } } else if ("12".equalsIgnoreCase(event)) { if (st.getQuestItemsCount(GOBLETS[0]) >= 1 && st.getQuestItemsCount(GOBLETS[1]) >= 1 && st.getQuestItemsCount(GOBLETS[2]) >= 1 && st.getQuestItemsCount(GOBLETS[3]) >= 1) { st.takeItems(GOBLETS[0], -1); st.takeItems(GOBLETS[1], -1); st.takeItems(GOBLETS[2], -1); st.takeItems(GOBLETS[3], -1); st.giveItems(ANTIQUE_BROOCH, 1); st.set("cond", "2"); st.playSound(QuestState.SOUND_FINISH); htmltext = "31453-16.htm"; } else htmltext = "31453-14.htm"; } else if ("31453-18.htm".equalsIgnoreCase(event)) { st.playSound(QuestState.SOUND_FINISH); st.exitQuest(true); } else if ("14".equalsIgnoreCase(event)) { htmltext = "31453-13.htm"; if (cond == 2) htmltext = "31453-19.htm"; } // Ghost Chamberlain of Elmoreden: Teleport to 4th sepulcher else if ("15".equalsIgnoreCase(event)) { if (st.getQuestItemsCount(ANTIQUE_BROOCH) >= 1) { st.getPlayer().teleToLocation(178298, -84574, -7216); htmltext = null; } else if (st.getQuestItemsCount(GRAVE_PASS) >= 1) { st.takeItems(GRAVE_PASS, 1); st.getPlayer().teleToLocation(178298, -84574, -7216); htmltext = null; } else htmltext = npc.getNpcId() + "-0.htm"; } // Ghost Chamberlain of Elmoreden: Teleport to Imperial Tomb entrance else if ("16".equalsIgnoreCase(event)) { if (st.getQuestItemsCount(ANTIQUE_BROOCH) >= 1) { st.getPlayer().teleToLocation(186942, -75602, -2834); htmltext = null; } else if (st.getQuestItemsCount(GRAVE_PASS) >= 1) { st.takeItems(GRAVE_PASS, 1); st.getPlayer().teleToLocation(186942, -75602, -2834); htmltext = null; } else htmltext = npc.getNpcId() + "-0.htm"; } // Teleport to Pilgrims Temple else if ("17".equalsIgnoreCase(event)) { if (st.getQuestItemsCount(ANTIQUE_BROOCH) >= 1) st.getPlayer().teleToLocation(169590, -90218, -2914); else { st.takeItems(GRAVE_PASS, 1); st.getPlayer().teleToLocation(169590, -90218, -2914); } htmltext = "31452-6.htm"; } else if ("18".equalsIgnoreCase(event)) { if (st.getQuestItemsCount(GOBLETS[0]) + st.getQuestItemsCount(GOBLETS[1]) + st.getQuestItemsCount(GOBLETS[2]) + st.getQuestItemsCount(GOBLETS[3]) < 3) htmltext = "31452-3.htm"; else if (st.getQuestItemsCount(GOBLETS[0]) + st.getQuestItemsCount(GOBLETS[1]) + st.getQuestItemsCount(GOBLETS[2]) + st.getQuestItemsCount(GOBLETS[3]) == 3) htmltext = "31452-4.htm"; else if (st.getQuestItemsCount(GOBLETS[0]) + st.getQuestItemsCount(GOBLETS[1]) + st.getQuestItemsCount(GOBLETS[2]) + st.getQuestItemsCount(GOBLETS[3]) >= 4) htmltext = "31452-5.htm"; } else if ("19".equalsIgnoreCase(event)) { if (st.getQuestItemsCount(SEALED_BOX) >= 1) { htmltext = "31919-3.htm"; st.takeItems(SEALED_BOX, 1); if (!calculateBoxReward(st)) { htmltext = Rnd.get(2) == 0 ? "31919-4.htm" : "31919-5.htm"; } } else htmltext = "31919-6.htm"; } // If event is a simple digit, parse it to get an integer form, then test the reward list else if (Util.isDigit(event)) { final int id = Integer.parseInt(event); Arrays.sort(RCP_REWARDS); if (Arrays.binarySearch(RCP_REWARDS, id) > 0) { st.takeItems(RELIC, 1000); st.giveItems(id, 1); return "31454-17.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; final int npcId = npc.getNpcId(); final int id = st.getState(); final int cond = st.getInt("cond"); if (id == QuestState.CREATED) st.set("cond", "0"); if (npcId == NAMELESS_SPIRIT) { if (cond == 0) { if (st.getPlayer().getLevel() >= 74) htmltext = "31453-1.htm"; else { htmltext = "31453-12.htm"; st.exitQuest(true); } } else if (cond == 1) { htmltext = st.getQuestItemsCount(GOBLETS[0]) >= 1 && st.getQuestItemsCount(GOBLETS[1]) >= 1 && st.getQuestItemsCount(GOBLETS[2]) >= 1 && st.getQuestItemsCount(GOBLETS[3]) >= 1 ? "31453-15.htm" : "31453-14.htm"; } else if (cond == 2) htmltext = "31453-17.htm"; } else if (npcId == GHOST_OF_WIGOTH_1) { if (cond == 2) htmltext = "31452-2.htm"; else if (cond == 1) if (st.getQuestItemsCount(GOBLETS[0]) + st.getQuestItemsCount(GOBLETS[1]) + st.getQuestItemsCount(GOBLETS[2]) + st.getQuestItemsCount(GOBLETS[3]) == 1) htmltext = "31452-1.htm"; else if (st.getQuestItemsCount(GOBLETS[0]) + st.getQuestItemsCount(GOBLETS[1]) + st.getQuestItemsCount(GOBLETS[2]) + st.getQuestItemsCount(GOBLETS[3]) > 1) htmltext = "31452-2.htm"; } else if (npcId == GHOST_OF_WIGOTH_2) { if (st.getQuestItemsCount(RELIC) >= 1000) if (st.getQuestItemsCount(SEALED_BOX) >= 1) if (st.getQuestItemsCount(GOBLETS[0]) >= 1 && st.getQuestItemsCount(GOBLETS[1]) >= 1 && st.getQuestItemsCount(GOBLETS[2]) >= 1 && st.getQuestItemsCount(GOBLETS[3]) >= 1) htmltext = "31454-4.htm"; else htmltext = st.getQuestItemsCount(GOBLETS[0]) + st.getQuestItemsCount(GOBLETS[1]) + st.getQuestItemsCount(GOBLETS[2]) + st.getQuestItemsCount(GOBLETS[3]) > 1 ? "31454-8.htm" : "31454-12.htm"; else if (st.getQuestItemsCount(GOBLETS[0]) >= 1 && st.getQuestItemsCount(GOBLETS[1]) >= 1 && st.getQuestItemsCount(GOBLETS[2]) >= 1 && st.getQuestItemsCount(GOBLETS[3]) >= 1) htmltext = "31454-3.htm"; else htmltext = st.getQuestItemsCount(GOBLETS[0]) + st.getQuestItemsCount(GOBLETS[1]) + st.getQuestItemsCount(GOBLETS[2]) + st.getQuestItemsCount(GOBLETS[3]) > 1 ? "31454-7.htm" : "31454-11.htm"; else if (st.getQuestItemsCount(SEALED_BOX) >= 1) if (st.getQuestItemsCount(GOBLETS[0]) >= 1 && st.getQuestItemsCount(GOBLETS[1]) >= 1 && st.getQuestItemsCount(GOBLETS[2]) >= 1 && st.getQuestItemsCount(GOBLETS[3]) >= 1) htmltext = "31454-2.htm"; else htmltext = st.getQuestItemsCount(GOBLETS[0]) + st.getQuestItemsCount(GOBLETS[1]) + st.getQuestItemsCount(GOBLETS[2]) + st.getQuestItemsCount(GOBLETS[3]) > 1 ? "31454-6.htm" : "31454-10.htm"; else if (st.getQuestItemsCount(GOBLETS[0]) >= 1 && st.getQuestItemsCount(GOBLETS[1]) >= 1 && st.getQuestItemsCount(GOBLETS[2]) >= 1 && st.getQuestItemsCount(GOBLETS[3]) >= 1) htmltext = "31454-1.htm"; else htmltext = st.getQuestItemsCount(GOBLETS[0]) + st.getQuestItemsCount(GOBLETS[1]) + st.getQuestItemsCount(GOBLETS[2]) + st.getQuestItemsCount(GOBLETS[3]) > 1 ? "31454-5.htm" : "31454-9.htm"; } else if (npcId == CONQ_SM) htmltext = "31921-E.htm"; else if (npcId == EMPER_SM) htmltext = "31922-E.htm"; else if (npcId == SAGES_SM) htmltext = "31923-E.htm"; else if (npcId == JUDGE_SM) htmltext = "31924-E.htm"; else if (npcId == GHOST_CHAMBERLAIN_1) htmltext = "31919-1.htm"; return htmltext; } @Override public String onKill(final L2Npc npc, final L2PcInstance player, final boolean isPet) { final L2PcInstance partyMember = getRandomPartyMemberState(player, npc, QuestState.STARTED); if (partyMember == null) return null; if (Rnd.get(100) < 30) { final QuestState st = partyMember.getQuestState(qn); st.giveItems(SEALED_BOX, 1); st.playSound(QuestState.SOUND_ITEMGET); } return null; } /** * Calculate boxes rewards, then return if there was a reward. * * @param st the QuestState of the player, used to reward him. * @return true if there was a reward, false if not (used to call a "no-reward" html) */ private boolean calculateBoxReward(final QuestState st) { boolean reward = false; final int rnd = Rnd.get(5); if (rnd == 0) { st.giveItems(57, 10000); reward = true; } else if (rnd == 1) { if (Rnd.get(1000) < 848) { reward = true; final int i = Rnd.get(1000); if (i < 43) st.giveItems(1884, 42); else if (i < 66) st.giveItems(1895, 36); else if (i < 184) st.giveItems(1876, 4); else if (i < 250) st.giveItems(1881, 6); else if (i < 287) st.giveItems(5549, 8); else if (i < 484) st.giveItems(1874, 1); else if (i < 681) st.giveItems(1889, 1); else if (i < 799) st.giveItems(1877, 1); else if (i < 902) st.giveItems(1894, 1); else st.giveItems(4043, 1); } if (Rnd.get(1000) < 323) { reward = true; final int i = Rnd.get(1000); if (i < 335) st.giveItems(1888, 1); else if (i < 556) st.giveItems(4040, 1); else if (i < 725) st.giveItems(1890, 1); else if (i < 872) st.giveItems(5550, 1); else if (i < 962) st.giveItems(1893, 1); else if (i < 986) st.giveItems(4046, 1); else st.giveItems(4048, 1); } } else if (rnd == 2) { if (Rnd.get(1000) < 847) { reward = true; final int i = Rnd.get(1000); if (i < 148) st.giveItems(1878, 8); else if (i < 175) st.giveItems(1882, 24); else if (i < 273) st.giveItems(1879, 4); else if (i < 322) st.giveItems(1880, 6); else if (i < 357) st.giveItems(1885, 6); else if (i < 554) st.giveItems(1875, 1); else if (i < 685) st.giveItems(1883, 1); else if (i < 803) st.giveItems(5220, 1); else if (i < 901) st.giveItems(4039, 1); else st.giveItems(4044, 1); } if (Rnd.get(1000) < 251) { reward = true; final int i = Rnd.get(1000); if (i < 350) st.giveItems(1887, 1); else if (i < 587) st.giveItems(4042, 1); else if (i < 798) st.giveItems(1886, 1); else if (i < 922) st.giveItems(4041, 1); else if (i < 966) st.giveItems(1892, 1); else if (i < 996) st.giveItems(1891, 1); else st.giveItems(4047, 1); } } else if (rnd == 3) { if (Rnd.get(1000) < 31) { reward = true; final int i = Rnd.get(1000); if (i < 223) st.giveItems(730, 1); else if (i < 893) st.giveItems(948, 1); else st.giveItems(960, 1); } if (Rnd.get(1000) < 5) { reward = true; final int i = Rnd.get(1000); if (i < 202) st.giveItems(729, 1); else if (i < 928) st.giveItems(947, 1); else st.giveItems(959, 1); } } else if (rnd == 4) { if (Rnd.get(1000) < 329) { reward = true; final int i = Rnd.get(1000); if (i < 88) st.giveItems(6698, 1); else if (i < 185) st.giveItems(6699, 1); else if (i < 238) st.giveItems(6700, 1); else if (i < 262) st.giveItems(6701, 1); else if (i < 292) st.giveItems(6702, 1); else if (i < 356) st.giveItems(6703, 1); else if (i < 420) st.giveItems(6704, 1); else if (i < 482) st.giveItems(6705, 1); else if (i < 554) st.giveItems(6706, 1); else if (i < 576) st.giveItems(6707, 1); else if (i < 640) st.giveItems(6708, 1); else if (i < 704) st.giveItems(6709, 1); else if (i < 777) st.giveItems(6710, 1); else if (i < 799) st.giveItems(6711, 1); else if (i < 863) st.giveItems(6712, 1); else if (i < 927) st.giveItems(6713, 1); else st.giveItems(6714, 1); } if (Rnd.get(1000) < 54) { reward = true; final int i = Rnd.get(1000); if (i < 100) st.giveItems(6688, 1); else if (i < 198) st.giveItems(6689, 1); else if (i < 298) st.giveItems(6690, 1); else if (i < 398) st.giveItems(6691, 1); else if (i < 499) st.giveItems(7579, 1); else if (i < 601) st.giveItems(6693, 1); else if (i < 703) st.giveItems(6694, 1); else if (i < 801) st.giveItems(6695, 1); else if (i < 902) st.giveItems(6696, 1); else st.giveItems(6697, 1); } } return reward; } }