/* * 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 quests.Q00605_AllianceWithKetraOrcs; import java.util.HashMap; import java.util.Map; import com.l2jserver.gameserver.enums.QuestSound; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.quest.Quest; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.model.quest.State; /** * Alliance with Ketra Orcs (605) * @author malyelfik */ public class Q00605_AllianceWithKetraOrcs extends Quest { private static class DropInfo { private final int _chance; private final int _minCond; private final int _itemId; public DropInfo(int chance, int minCond) { _chance = chance; _minCond = minCond; switch (_minCond) { case 1: _itemId = VARKA_BADGE_SOLDIER; break; case 2: _itemId = VARKA_BADGE_OFFICER; break; default: _itemId = VARKA_BADGE_CAPTAIN; break; } } public int getMinCond() { return _minCond; } public int getChance() { return _chance; } public int getItemId() { return _itemId; } } // NPC private static final int WAHKAN = 31371; // Monsters private static final Map<Integer, DropInfo> MOBS = new HashMap<>(); static { MOBS.put(21350, new DropInfo(500, 1)); // Varka Silenos Recruit MOBS.put(21351, new DropInfo(500, 1)); // Varka Silenos Footman MOBS.put(21353, new DropInfo(509, 1)); // Varka Silenos Scout MOBS.put(21354, new DropInfo(521, 1)); // Varka Silenos Hunter MOBS.put(21355, new DropInfo(519, 1)); // Varka Silenos Shaman MOBS.put(21357, new DropInfo(500, 2)); // Varka Silenos Priest MOBS.put(21358, new DropInfo(500, 2)); // Varka Silenos Warrior MOBS.put(21360, new DropInfo(509, 2)); // Varka Silenos Medium MOBS.put(21361, new DropInfo(518, 2)); // Varka Silenos Magus MOBS.put(21362, new DropInfo(518, 2)); // Varka Silenos Officer MOBS.put(21364, new DropInfo(527, 2)); // Varka Silenos Seer MOBS.put(21365, new DropInfo(500, 3)); // Varka Silenos Great Magus MOBS.put(21366, new DropInfo(500, 3)); // Varka Silenos General MOBS.put(21368, new DropInfo(508, 3)); // Varka Silenos Great Seer MOBS.put(21369, new DropInfo(628, 2)); // Varka's Commander MOBS.put(21370, new DropInfo(604, 2)); // Varka's Elite Guard MOBS.put(21371, new DropInfo(627, 3)); // Varka's Head Magus MOBS.put(21372, new DropInfo(604, 3)); // Varka's Head Guard MOBS.put(21373, new DropInfo(649, 3)); // Varka's Prophet MOBS.put(21374, new DropInfo(626, 3)); // Prophet's Guard MOBS.put(21375, new DropInfo(626, 3)); // Disciple of Prophet } // Items private static final int VARKA_BADGE_SOLDIER = 7216; private static final int VARKA_BADGE_OFFICER = 7217; private static final int VARKA_BADGE_CAPTAIN = 7218; private static final int VALOR_TOTEM = 7219; private static final int WISDOM_TOTEM = 7220; private static final int[] KETRA_MARKS = { 7211, // Mark of Ketra's Alliance - Level 1 7212, // Mark of Ketra's Alliance - Level 2 7213, // Mark of Ketra's Alliance - Level 3 7214, // Mark of Ketra's Alliance - Level 4 7215, // Mark of Ketra's Alliance - Level 5 }; private static final int[] VARKA_MARKS = { 7221, // Mark of Varka's Alliance - Level 1 7222, // Mark of Varka's Alliance - Level 2 7223, // Mark of Varka's Alliance - Level 3 7224, // Mark of Varka's Alliance - Level 4 7225, // Mark of Varka's Alliance - Level 5 }; // Misc private static final int MIN_LEVEL = 74; private static final int[] SOLDIER_BADGE_COUNT = { 100, // cond 1 200, // cond 2 300, // cond 3 300, // cond 4 400, // cond 5 }; private static final int[] OFFICER_BADGE_COUNT = { 0, // cond 1 100, // cond 2 200, // cond 3 300, // cond 4 400, // cond 5 }; private static final int[] CAPTAIN_BADGE_COUNT = { 0, // cond 1 0, // cond 2 100, // cond 3 200, // cond 4 200, // cond 5 }; public Q00605_AllianceWithKetraOrcs() { super(605, Q00605_AllianceWithKetraOrcs.class.getSimpleName(), "Alliance with Ketra Orcs"); addStartNpc(WAHKAN); addTalkId(WAHKAN); addKillId(MOBS.keySet()); registerQuestItems(VARKA_BADGE_SOLDIER, VARKA_BADGE_OFFICER, VARKA_BADGE_CAPTAIN); } private boolean canGetItem(QuestState st, int itemId) { int count = 0; switch (itemId) { case VARKA_BADGE_SOLDIER: count = SOLDIER_BADGE_COUNT[st.getCond() - 1]; break; case VARKA_BADGE_OFFICER: count = OFFICER_BADGE_COUNT[st.getCond() - 1]; break; case VARKA_BADGE_CAPTAIN: count = CAPTAIN_BADGE_COUNT[st.getCond() - 1]; break; } if (st.getQuestItemsCount(itemId) < count) { return true; } return false; } @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { final QuestState st = player.getQuestState(getName()); if (st == null) { return null; } String htmltext = event; switch (event) { case "31371-12a.html": case "31371-12b.html": case "31371-25.html": break; case "31371-04.htm": if (hasAtLeastOneQuestItem(player, VARKA_MARKS)) { return "31371-03.htm"; } st.setState(State.STARTED); st.playSound(QuestSound.ITEMSOUND_QUEST_ACCEPT); for (int i = 0; i < KETRA_MARKS.length; i++) { if (st.hasQuestItems(KETRA_MARKS[i])) { st.setCond(i + 2); return "31371-0" + (i + 5) + ".htm"; } } st.setCond(1); break; case "31371-12.html": if (st.getQuestItemsCount(VARKA_BADGE_SOLDIER) < SOLDIER_BADGE_COUNT[0]) { return getNoQuestMsg(player); } st.takeItems(VARKA_BADGE_SOLDIER, -1); st.giveItems(KETRA_MARKS[0], 1); st.setCond(2, true); break; case "31371-15.html": if ((st.getQuestItemsCount(VARKA_BADGE_SOLDIER) < SOLDIER_BADGE_COUNT[1]) || (st.getQuestItemsCount(VARKA_BADGE_OFFICER) < OFFICER_BADGE_COUNT[1])) { return getNoQuestMsg(player); } takeItems(player, -1, VARKA_BADGE_SOLDIER, VARKA_BADGE_OFFICER, KETRA_MARKS[0]); st.giveItems(KETRA_MARKS[1], 1); st.setCond(3, true); break; case "31371-18.html": if ((st.getQuestItemsCount(VARKA_BADGE_SOLDIER) < SOLDIER_BADGE_COUNT[2]) || (st.getQuestItemsCount(VARKA_BADGE_OFFICER) < OFFICER_BADGE_COUNT[2]) || (st.getQuestItemsCount(VARKA_BADGE_CAPTAIN) < CAPTAIN_BADGE_COUNT[2])) { return getNoQuestMsg(player); } takeItems(player, -1, VARKA_BADGE_SOLDIER, VARKA_BADGE_OFFICER, VARKA_BADGE_CAPTAIN, KETRA_MARKS[1]); st.giveItems(KETRA_MARKS[2], 1); st.setCond(4, true); break; case "31371-21.html": if (!st.hasQuestItems(VALOR_TOTEM) || (st.getQuestItemsCount(VARKA_BADGE_SOLDIER) < SOLDIER_BADGE_COUNT[3]) || (st.getQuestItemsCount(VARKA_BADGE_OFFICER) < OFFICER_BADGE_COUNT[3]) || (st.getQuestItemsCount(VARKA_BADGE_CAPTAIN) < CAPTAIN_BADGE_COUNT[3])) { return getNoQuestMsg(player); } takeItems(player, -1, VARKA_BADGE_SOLDIER, VARKA_BADGE_OFFICER, VARKA_BADGE_CAPTAIN, VALOR_TOTEM, KETRA_MARKS[2]); st.giveItems(KETRA_MARKS[3], 1); st.setCond(5, true); break; case "31371-26.html": takeItems(player, -1, KETRA_MARKS); takeItems(player, -1, VALOR_TOTEM, WISDOM_TOTEM); st.exitQuest(true, true); break; default: htmltext = null; break; } return htmltext; } @Override public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { final L2PcInstance member = getRandomPartyMemberState(killer, State.STARTED); if (member != null) { final QuestState st = member.getQuestState(getName()); final DropInfo info = MOBS.get(npc.getId()); if ((st.getCond() >= info.getMinCond()) && (st.getCond() < 6) && canGetItem(st, info.getItemId()) && (getRandom(1000) < info.getChance())) { st.giveItems(info.getItemId(), 1); } } return super.onKill(npc, killer, isSummon); } @Override public String onTalk(L2Npc npc, L2PcInstance player) { String htmltext = getNoQuestMsg(player); final QuestState st = player.getQuestState(getName()); if (st == null) { return htmltext; } switch (st.getState()) { case State.CREATED: htmltext = (player.getLevel() >= MIN_LEVEL) ? "31371-01.htm" : "31371-02.htm"; break; case State.STARTED: switch (st.getCond()) { case 1: htmltext = (st.getQuestItemsCount(VARKA_BADGE_SOLDIER) >= SOLDIER_BADGE_COUNT[0]) ? "31371-11.html" : "31371-10.html"; break; case 2: htmltext = (st.hasQuestItems(KETRA_MARKS[0]) && (st.getQuestItemsCount(VARKA_BADGE_SOLDIER) >= SOLDIER_BADGE_COUNT[1]) && (st.getQuestItemsCount(VARKA_BADGE_OFFICER) >= OFFICER_BADGE_COUNT[1])) ? "31371-14.html" : "31371-13.html"; break; case 3: htmltext = (st.hasQuestItems(KETRA_MARKS[1]) && (st.getQuestItemsCount(VARKA_BADGE_SOLDIER) >= SOLDIER_BADGE_COUNT[2]) && (st.getQuestItemsCount(VARKA_BADGE_OFFICER) >= OFFICER_BADGE_COUNT[2]) && (st.getQuestItemsCount(VARKA_BADGE_CAPTAIN) >= CAPTAIN_BADGE_COUNT[2])) ? "31371-17.html" : "31371-16.html"; break; case 4: htmltext = (hasQuestItems(player, KETRA_MARKS[2], VALOR_TOTEM) && (st.getQuestItemsCount(VARKA_BADGE_SOLDIER) >= SOLDIER_BADGE_COUNT[3]) && (st.getQuestItemsCount(VARKA_BADGE_OFFICER) >= OFFICER_BADGE_COUNT[3]) && (st.getQuestItemsCount(VARKA_BADGE_CAPTAIN) >= CAPTAIN_BADGE_COUNT[3])) ? "31371-20.html" : "31371-19.html"; break; case 5: if (!st.hasQuestItems(KETRA_MARKS[3]) || !st.hasQuestItems(WISDOM_TOTEM) || (st.getQuestItemsCount(VARKA_BADGE_SOLDIER) < SOLDIER_BADGE_COUNT[4]) || (st.getQuestItemsCount(VARKA_BADGE_OFFICER) < OFFICER_BADGE_COUNT[4]) || (st.getQuestItemsCount(VARKA_BADGE_CAPTAIN) < CAPTAIN_BADGE_COUNT[4])) { return "31371-22.html"; } st.setCond(6, true); takeItems(player, -1, VARKA_BADGE_SOLDIER, VARKA_BADGE_OFFICER, VARKA_BADGE_CAPTAIN, WISDOM_TOTEM, KETRA_MARKS[3]); st.giveItems(KETRA_MARKS[4], 1); htmltext = "31371-23.html"; break; case 6: if (st.hasQuestItems(KETRA_MARKS[4])) { htmltext = "31371-24.html"; } break; } break; } return htmltext; } }