diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00106_ForgottenTruth/Q00106_ForgottenTruth.java b/src/main/java/com/l2jserver/datapack/quests/Q00106_ForgottenTruth/Q00106_ForgottenTruth.java index 61b47fe3673e271217d0566b16a9fbefdd1a7e77..c6e34576ff1ca7e406b1e3c0238c4086d773bb0f 100644 --- a/src/main/java/com/l2jserver/datapack/quests/Q00106_ForgottenTruth/Q00106_ForgottenTruth.java +++ b/src/main/java/com/l2jserver/datapack/quests/Q00106_ForgottenTruth/Q00106_ForgottenTruth.java @@ -20,9 +20,9 @@ package com.l2jserver.datapack.quests.Q00106_ForgottenTruth; import com.l2jserver.datapack.quests.Q00281_HeadForTheHills.Q00281_HeadForTheHills; import com.l2jserver.gameserver.enums.Race; -import com.l2jserver.gameserver.enums.audio.Sound; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.holders.QuestItemChanceHolder; import com.l2jserver.gameserver.model.quest.Quest; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.model.quest.State; @@ -42,9 +42,9 @@ public final class Q00106_ForgottenTruth extends Quest { // Items private static final int ONYX_TALISMAN1 = 984; private static final int ONYX_TALISMAN2 = 985; - private static final int ANCIENT_SCROLL = 986; - private static final int ANCIENT_CLAY_TABLET = 987; private static final int KARTAS_TRANSLATION = 988; + private static final QuestItemChanceHolder ANCIENT_SCROLL = new QuestItemChanceHolder(986, 20.0, 1L); + private static final QuestItemChanceHolder ANCIENT_CLAY_TABLET = new QuestItemChanceHolder(987, 20.0, 1L); // Misc private static final int MIN_LVL = 10; @@ -53,7 +53,7 @@ public final class Q00106_ForgottenTruth extends Quest { addStartNpc(THIFIELL); addTalkId(THIFIELL, KARTA); addKillId(TUMRAN_ORC_BRIGAND); - registerQuestItems(KARTAS_TRANSLATION, ONYX_TALISMAN1, ONYX_TALISMAN2, ANCIENT_SCROLL, ANCIENT_CLAY_TABLET); + registerQuestItems(KARTAS_TRANSLATION, ONYX_TALISMAN1, ONYX_TALISMAN2, ANCIENT_SCROLL.getId(), ANCIENT_CLAY_TABLET.getId()); } @Override @@ -84,13 +84,11 @@ public final class Q00106_ForgottenTruth extends Quest { public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { final QuestState st = getQuestState(killer, false); if ((st != null) && st.isCond(2) && Util.checkIfInRange(1500, npc, killer, true)) { - if ((getRandom(100) < 20) && st.hasQuestItems(ONYX_TALISMAN2)) { - if (!st.hasQuestItems(ANCIENT_SCROLL)) { - st.giveItems(ANCIENT_SCROLL, 1); - st.playSound(Sound.ITEMSOUND_QUEST_MIDDLE); - } else if (!st.hasQuestItems(ANCIENT_CLAY_TABLET)) { - st.setCond(3, true); - st.giveItems(ANCIENT_CLAY_TABLET, 1); + if (st.hasQuestItems(ONYX_TALISMAN2)) { + if (!hasQuestItems(st.getPlayer(), ANCIENT_SCROLL.getId())) { + giveItemRandomly(st.getPlayer(), npc, ANCIENT_SCROLL, true); + } else if (giveItemRandomly(st.getPlayer(), npc, ANCIENT_CLAY_TABLET, true)) { + st.setCond(3); } } } @@ -151,9 +149,9 @@ public final class Q00106_ForgottenTruth extends Quest { break; } case 3: { - if (st.hasQuestItems(ANCIENT_SCROLL, ANCIENT_CLAY_TABLET)) { + if (st.hasQuestItems(ANCIENT_SCROLL.getId(), ANCIENT_CLAY_TABLET.getId())) { st.setCond(4, true); - takeItems(talker, -1, ANCIENT_SCROLL, ANCIENT_CLAY_TABLET, ONYX_TALISMAN2); + takeItems(talker, -1, ANCIENT_SCROLL.getId(), ANCIENT_CLAY_TABLET.getId(), ONYX_TALISMAN2); st.giveItems(KARTAS_TRANSLATION, 1); htmltext = "30133-03.html"; } @@ -173,4 +171,4 @@ public final class Q00106_ForgottenTruth extends Quest { } return htmltext; } -} \ No newline at end of file +} diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00169_OffspringOfNightmares/Q00169_OffspringOfNightmares.java b/src/main/java/com/l2jserver/datapack/quests/Q00169_OffspringOfNightmares/Q00169_OffspringOfNightmares.java index 97b634ebb121208578d19711692804b917b4c6cf..78ad4ab47a04df9a42b1f03b18eee60f98f1d675 100644 --- a/src/main/java/com/l2jserver/datapack/quests/Q00169_OffspringOfNightmares/Q00169_OffspringOfNightmares.java +++ b/src/main/java/com/l2jserver/datapack/quests/Q00169_OffspringOfNightmares/Q00169_OffspringOfNightmares.java @@ -19,14 +19,16 @@ package com.l2jserver.datapack.quests.Q00169_OffspringOfNightmares; import com.l2jserver.gameserver.enums.Race; -import com.l2jserver.gameserver.enums.audio.Sound; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.holders.QuestItemChanceHolder; import com.l2jserver.gameserver.model.quest.Quest; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.model.quest.State; import com.l2jserver.gameserver.network.NpcStringId; +import static com.l2jserver.gameserver.model.quest.QuestDroplist.singleDropItem; + /** * Offspring of Nightmares (169) * @author xban1x @@ -40,7 +42,7 @@ public class Q00169_OffspringOfNightmares extends Quest { // Items private static final int BONE_GAITERS = 31; private static final int CRACKED_SKULL = 1030; - private static final int PERFECT_SKULL = 1031; + private static final QuestItemChanceHolder PERFECT_SKULL = new QuestItemChanceHolder(1031, 20.0, 1L); // Misc private static final int MIN_LVL = 15; @@ -49,7 +51,7 @@ public class Q00169_OffspringOfNightmares extends Quest { addStartNpc(VLASTY); addTalkId(VLASTY); addKillId(LESSER_DARK_HORROR, DARK_HORROR); - registerQuestItems(CRACKED_SKULL, PERFECT_SKULL); + registerQuestItems(CRACKED_SKULL, PERFECT_SKULL.getId()); } @Override @@ -64,7 +66,7 @@ public class Q00169_OffspringOfNightmares extends Quest { break; } case "30145-07.html": { - if (st.isCond(2) && st.hasQuestItems(PERFECT_SKULL)) { + if (st.isCond(2) && st.hasQuestItems(PERFECT_SKULL.getId())) { st.giveItems(BONE_GAITERS, 1); st.addExpAndSp(17475, 818); st.giveAdena(17030 + (10 * st.getQuestItemsCount(CRACKED_SKULL)), true); @@ -83,12 +85,10 @@ public class Q00169_OffspringOfNightmares extends Quest { public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { final QuestState st = getQuestState(killer, false); if ((st != null) && st.isStarted()) { - if ((getRandom(10) > 7) && !st.hasQuestItems(PERFECT_SKULL)) { - st.giveItems(PERFECT_SKULL, 1); - st.setCond(2, true); - } else if (getRandom(10) > 4) { - st.giveItems(CRACKED_SKULL, 1); - st.playSound(Sound.ITEMSOUND_QUEST_ITEMGET); + if (!hasQuestItems(st.getPlayer(), PERFECT_SKULL.getId()) && giveItemRandomly(st.getPlayer(), npc, PERFECT_SKULL, true)) { + st.setCond(2); + } else { + giveItemRandomly(st.getPlayer(), npc, singleDropItem(CRACKED_SKULL, 50.0), 0, true); } } return super.onKill(npc, killer, isSummon); @@ -104,11 +104,11 @@ public class Q00169_OffspringOfNightmares extends Quest { break; } case State.STARTED: { - if (st.hasQuestItems(CRACKED_SKULL) && !st.hasQuestItems(PERFECT_SKULL)) { + if (st.hasQuestItems(CRACKED_SKULL) && !st.hasQuestItems(PERFECT_SKULL.getId())) { htmltext = "30145-05.html"; - } else if (st.isCond(2) && st.hasQuestItems(PERFECT_SKULL)) { + } else if (st.isCond(2) && st.hasQuestItems(PERFECT_SKULL.getId())) { htmltext = "30145-06.html"; - } else if (!st.hasQuestItems(CRACKED_SKULL, PERFECT_SKULL)) { + } else if (!st.hasQuestItems(CRACKED_SKULL, PERFECT_SKULL.getId())) { htmltext = "30145-04.html"; } break; @@ -120,4 +120,4 @@ public class Q00169_OffspringOfNightmares extends Quest { } return htmltext; } -} \ No newline at end of file +} diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00412_PathOfTheDarkWizard/Q00412_PathOfTheDarkWizard.java b/src/main/java/com/l2jserver/datapack/quests/Q00412_PathOfTheDarkWizard/Q00412_PathOfTheDarkWizard.java index 403a4171f24e66c36032cbc6cc864d7e0e7afa27..7f2508a10161914273f49abc227f158b4ec7f2d3 100644 --- a/src/main/java/com/l2jserver/datapack/quests/Q00412_PathOfTheDarkWizard/Q00412_PathOfTheDarkWizard.java +++ b/src/main/java/com/l2jserver/datapack/quests/Q00412_PathOfTheDarkWizard/Q00412_PathOfTheDarkWizard.java @@ -18,15 +18,18 @@ */ package com.l2jserver.datapack.quests.Q00412_PathOfTheDarkWizard; -import com.l2jserver.gameserver.enums.audio.Sound; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.base.ClassId; +import com.l2jserver.gameserver.model.holders.QuestItemChanceHolder; import com.l2jserver.gameserver.model.quest.Quest; +import com.l2jserver.gameserver.model.quest.QuestDroplist; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.network.serverpackets.SocialAction; import com.l2jserver.gameserver.util.Util; +import java.util.Map; + /** * Path Of The Dark Wizard (412) * @author ivantotov @@ -37,25 +40,37 @@ public final class Q00412_PathOfTheDarkWizard extends Quest { private static final int ANNIKA = 30418; private static final int ARKENIA = 30419; private static final int VARIKA = 30421; + // Monster + private static final int MARSH_ZOMBIE = 20015; + private static final int MISERY_SKELETON = 20022; + private static final int SKELETON_SCOUT = 20045; + private static final int SKELETON_HUNTER = 20517; + private static final int SKELETON_HUNTER_ARCHER = 20518; // Items private static final int SEEDS_OF_ANGER = 1253; private static final int SEEDS_OF_DESPAIR = 1254; private static final int SEEDS_OF_HORROR = 1255; private static final int SEEDS_OF_LUNACY = 1256; - private static final int FAMILYS_REMAINS = 1257; - private static final int KNEE_BONE = 1259; - private static final int HEART_OF_LUNACY = 1260; private static final int LUCKY_KEY = 1277; private static final int CANDLE = 1278; private static final int HUB_SCENT = 1279; + private static final QuestItemChanceHolder FAMILYS_REMAINS = new QuestItemChanceHolder(1257, 50.0, 3L); + private static final QuestItemChanceHolder KNEE_BONE = new QuestItemChanceHolder(1259, 50.0, 2L); + private static final QuestItemChanceHolder HEART_OF_LUNACY = new QuestItemChanceHolder(1260, 50.0, 3L); + // Droplist + private static final QuestDroplist DROPLIST = QuestDroplist.builder() + .addSingleDrop(MARSH_ZOMBIE, FAMILYS_REMAINS) + .bulkAddSingleDrop(KNEE_BONE).withNpcs(MISERY_SKELETON, SKELETON_HUNTER, SKELETON_HUNTER_ARCHER).build() + .addSingleDrop(SKELETON_SCOUT, HEART_OF_LUNACY) + .build(); + private static final Map<Integer, Integer> MOBS_REQUIRED_ITEM = Map.of( + MARSH_ZOMBIE, LUCKY_KEY, + MISERY_SKELETON, CANDLE, + SKELETON_HUNTER, CANDLE, + SKELETON_HUNTER_ARCHER, CANDLE, + SKELETON_SCOUT, HUB_SCENT); // Reward private static final int JEWEL_OF_DARKNESS = 1261; - // Monster - private static final int MARSH_ZOMBIE = 20015; - private static final int MISERY_SKELETON = 20022; - private static final int SKELETON_SCOUT = 20045; - private static final int SKELETON_HUNTER = 20517; - private static final int SKELETON_HUNTER_ARCHER = 20518; // Misc private static final int MIN_LEVEL = 18; @@ -64,7 +79,7 @@ public final class Q00412_PathOfTheDarkWizard extends Quest { addStartNpc(VARIKA); addTalkId(VARIKA, CHARKEREN, ANNIKA, ARKENIA); addKillId(MARSH_ZOMBIE, MISERY_SKELETON, SKELETON_SCOUT, SKELETON_HUNTER, SKELETON_HUNTER_ARCHER); - registerQuestItems(SEEDS_OF_ANGER, SEEDS_OF_DESPAIR, SEEDS_OF_HORROR, SEEDS_OF_LUNACY, FAMILYS_REMAINS, KNEE_BONE, HEART_OF_LUNACY, LUCKY_KEY, CANDLE, HUB_SCENT); + registerQuestItems(SEEDS_OF_ANGER, SEEDS_OF_DESPAIR, SEEDS_OF_HORROR, SEEDS_OF_LUNACY, FAMILYS_REMAINS.getId(), KNEE_BONE.getId(), HEART_OF_LUNACY.getId(), LUCKY_KEY, CANDLE, HUB_SCENT); } @Override @@ -142,49 +157,9 @@ public final class Q00412_PathOfTheDarkWizard extends Quest { @Override public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { final QuestState qs = getQuestState(killer, false); - if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, killer, true)) { - switch (npc.getId()) { - case MARSH_ZOMBIE: { - if (hasQuestItems(killer, LUCKY_KEY) && (getQuestItemsCount(killer, FAMILYS_REMAINS) < 3)) { - if (getRandom(2) == 0) { - giveItems(killer, FAMILYS_REMAINS, 1); - if (getQuestItemsCount(killer, FAMILYS_REMAINS) == 3) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case MISERY_SKELETON: - case SKELETON_HUNTER: - case SKELETON_HUNTER_ARCHER: { - if (hasQuestItems(killer, CANDLE) && (getQuestItemsCount(killer, KNEE_BONE) < 2)) { - if (getRandom(2) == 0) { - giveItems(killer, KNEE_BONE, 1); - if (getQuestItemsCount(killer, KNEE_BONE) == 2) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case SKELETON_SCOUT: { - if (hasQuestItems(killer, HUB_SCENT) && (getQuestItemsCount(killer, HEART_OF_LUNACY) < 3)) { - if (getRandom(2) == 0) { - giveItems(killer, HEART_OF_LUNACY, 1); - if (getQuestItemsCount(killer, HEART_OF_LUNACY) == 3) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } + if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, qs.getPlayer(), true)) { + if (hasQuestItems(qs.getPlayer(), MOBS_REQUIRED_ITEM.get(npc.getId()))) { + giveItemRandomly(qs.getPlayer(), npc, DROPLIST.get(npc), true); } } return super.onKill(npc, killer, isSummon); @@ -221,7 +196,7 @@ public final class Q00412_PathOfTheDarkWizard extends Quest { qs.saveGlobalQuestVar("1ClassQuestFinished", "1"); htmltext = "30421-13.html"; } else if (hasQuestItems(player, SEEDS_OF_DESPAIR)) { - if (!hasAtLeastOneQuestItem(player, FAMILYS_REMAINS, LUCKY_KEY, CANDLE, HUB_SCENT, KNEE_BONE, HEART_OF_LUNACY)) { + if (!hasAtLeastOneQuestItem(player, FAMILYS_REMAINS.getId(), LUCKY_KEY, CANDLE, HUB_SCENT, KNEE_BONE.getId(), HEART_OF_LUNACY.getId())) { htmltext = "30421-14.html"; } else if (!hasQuestItems(player, SEEDS_OF_ANGER)) { htmltext = "30421-08.html"; @@ -235,13 +210,13 @@ public final class Q00412_PathOfTheDarkWizard extends Quest { } case CHARKEREN: { if (!hasQuestItems(player, SEEDS_OF_ANGER) && hasQuestItems(player, SEEDS_OF_DESPAIR)) { - if (!hasAtLeastOneQuestItem(player, FAMILYS_REMAINS, LUCKY_KEY)) { + if (!hasAtLeastOneQuestItem(player, FAMILYS_REMAINS.getId(), LUCKY_KEY)) { htmltext = "30415-01.html"; - } else if (hasQuestItems(player, LUCKY_KEY) && (getQuestItemsCount(player, FAMILYS_REMAINS) < 3)) { + } else if (hasQuestItems(player, LUCKY_KEY) && !hasItemsAtLimit(player, FAMILYS_REMAINS)) { htmltext = "30415-04.html"; } else { giveItems(player, SEEDS_OF_ANGER, 1); - takeItems(player, FAMILYS_REMAINS, -1); + takeItems(player, FAMILYS_REMAINS.getId(), -1); takeItems(player, LUCKY_KEY, 1); htmltext = "30415-05.html"; } @@ -252,13 +227,13 @@ public final class Q00412_PathOfTheDarkWizard extends Quest { } case ANNIKA: { if (!hasQuestItems(player, SEEDS_OF_HORROR) && hasQuestItems(player, SEEDS_OF_DESPAIR)) { - if (!hasAtLeastOneQuestItem(player, CANDLE, KNEE_BONE)) { + if (!hasAtLeastOneQuestItem(player, CANDLE, KNEE_BONE.getId())) { htmltext = "30418-01.html"; - } else if (hasQuestItems(player, CANDLE) && (getQuestItemsCount(player, KNEE_BONE) < 2)) { + } else if (hasQuestItems(player, CANDLE) && !hasItemsAtLimit(player, KNEE_BONE)) { htmltext = "30418-03.html"; } else { giveItems(player, SEEDS_OF_HORROR, 1); - takeItems(player, KNEE_BONE, -1); + takeItems(player, KNEE_BONE.getId(), -1); takeItems(player, CANDLE, 1); htmltext = "30418-04.html"; } @@ -267,14 +242,14 @@ public final class Q00412_PathOfTheDarkWizard extends Quest { } case ARKENIA: { if (!hasQuestItems(player, SEEDS_OF_LUNACY)) { - if (!hasAtLeastOneQuestItem(player, HUB_SCENT, HEART_OF_LUNACY)) { + if (!hasAtLeastOneQuestItem(player, HUB_SCENT, HEART_OF_LUNACY.getId())) { giveItems(player, HUB_SCENT, 1); htmltext = "30419-01.html"; - } else if (hasQuestItems(player, HUB_SCENT) && (getQuestItemsCount(player, HEART_OF_LUNACY) < 3)) { + } else if (hasQuestItems(player, HUB_SCENT) && !hasItemsAtLimit(player, HEART_OF_LUNACY)) { htmltext = "30419-02.html"; } else { giveItems(player, SEEDS_OF_LUNACY, 1); - takeItems(player, HEART_OF_LUNACY, -1); + takeItems(player, HEART_OF_LUNACY.getId(), -1); takeItems(player, HUB_SCENT, 1); htmltext = "30419-03.html"; } diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00419_GetAPet/Q00419_GetAPet.java b/src/main/java/com/l2jserver/datapack/quests/Q00419_GetAPet/Q00419_GetAPet.java index 135ab426c25b907f35cad5f7b87dec314cea45ac..a9d3b35fd006e38f557f61366ddc3c273f8852c7 100644 --- a/src/main/java/com/l2jserver/datapack/quests/Q00419_GetAPet/Q00419_GetAPet.java +++ b/src/main/java/com/l2jserver/datapack/quests/Q00419_GetAPet/Q00419_GetAPet.java @@ -25,7 +25,9 @@ import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.enums.audio.Sound; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.holders.QuestItemChanceHolder; import com.l2jserver.gameserver.model.quest.Quest; +import com.l2jserver.gameserver.model.quest.QuestDroplist; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.util.Util; @@ -39,22 +41,6 @@ public final class Q00419_GetAPet extends Quest { private static final int ACCESSORY_MERCHANT_ELICE = 30091; private static final int GATEKEEPER_BELLA = 30256; private static final int PET_MENAGER_MARTIN = 30731; - // Items - private static final int ANIMAL_LOVERS_LIST = 3417; - private static final int ANIMAL_SLAYERS_1ST_LIST = 3418; - private static final int ANIMAL_SLAYERS_2ND_LIST = 3419; - private static final int ANIMAL_SLAYERS_3RD_LIST = 3420; - private static final int ANIMAL_SLAYERS_4TH_LIST = 3421; - private static final int ANIMAL_SLAYERS_5TH_LIST = 3422; - private static final int BLOODY_FANG = 3423; - private static final int BLOODY_CLAW = 3424; - private static final int BLOODY_NAIL = 3425; - private static final int BLOODY_KASHA_FANG = 3426; - private static final int BLOODY_TARANTULA_NAIL = 3427; - private static final int ANIMAL_SLAYERS_LIST = 10164; - private static final int BLOODY_RED_CLAW = 10165; - // Reward - private static final int WOLF_COLLAR = 2375; // Monster private static final int LESSER_DARK_HORROR = 20025; private static final int PROWLER = 20034; @@ -71,11 +57,62 @@ public final class Q00419_GetAPet extends Quest { private static final int KASHA_BLADE_SPIDER = 20478; private static final int PLUNDER_TARANTULA = 20508; private static final int CRIMSON_SPIDER2 = 22244; + // Items + private static final int ANIMAL_LOVERS_LIST = 3417; + private static final int ANIMAL_SLAYERS_1ST_LIST = 3418; + private static final int ANIMAL_SLAYERS_2ND_LIST = 3419; + private static final int ANIMAL_SLAYERS_3RD_LIST = 3420; + private static final int ANIMAL_SLAYERS_4TH_LIST = 3421; + private static final int ANIMAL_SLAYERS_5TH_LIST = 3422; + private static final int ANIMAL_SLAYERS_LIST = 10164; + private static final QuestItemChanceHolder BLOODY_FANG = new QuestItemChanceHolder(3423, 50L); + private static final QuestItemChanceHolder BLOODY_CLAW = new QuestItemChanceHolder(3424, 50L); + private static final QuestItemChanceHolder BLOODY_NAIL = new QuestItemChanceHolder(3425, 50L); + private static final QuestItemChanceHolder BLOODY_KASHA_FANG = new QuestItemChanceHolder(3426, 50L); + private static final QuestItemChanceHolder BLOODY_TARANTULA_NAIL = new QuestItemChanceHolder(3427, 50L); + private static final QuestItemChanceHolder BLOODY_RED_CLAW = new QuestItemChanceHolder(10165, 50L); + // Droplist + private static final QuestDroplist DROPLIST = QuestDroplist.builder() + .addSingleDrop(LESSER_DARK_HORROR, BLOODY_NAIL, 60.0) + .addSingleDrop(PROWLER, BLOODY_NAIL, 100.0) + .addSingleDrop(GIANT_SPIDER, BLOODY_FANG, 60.0) + .addSingleDrop(DARK_HORROR, BLOODY_NAIL, 75.0) + .addSingleDrop(TALON_SPIDER, BLOODY_FANG, 75.0) + .addSingleDrop(BLADE_SPIDER, BLOODY_FANG, 100.0) + .addSingleDrop(HOOK_SPIDER, BLOODY_CLAW, 75.0) + .addSingleDrop(HUNTER_TARANTULA, BLOODY_TARANTULA_NAIL, 75.0) + .addSingleDrop(CRIMSON_SPIDER, BLOODY_CLAW, 60.0) + .addSingleDrop(PINCER_SPIDER, BLOODY_CLAW, 100.0) + .addSingleDrop(KASHA_SPIDER, BLOODY_KASHA_FANG, 60.0) + .addSingleDrop(KASHA_FANG_SPIDER, BLOODY_KASHA_FANG, 75.0) + .addSingleDrop(KASHA_BLADE_SPIDER, BLOODY_KASHA_FANG, 100.0) + .addSingleDrop(PLUNDER_TARANTULA, BLOODY_TARANTULA_NAIL, 100.0) + .addSingleDrop(CRIMSON_SPIDER2, BLOODY_RED_CLAW, 75.0) + .build(); + private static final Map<Integer, Integer> MOBS_REQUIRED_ITEM = new HashMap<>(); + static { + MOBS_REQUIRED_ITEM.put(LESSER_DARK_HORROR, ANIMAL_SLAYERS_3RD_LIST); + MOBS_REQUIRED_ITEM.put(PROWLER, ANIMAL_SLAYERS_3RD_LIST); + MOBS_REQUIRED_ITEM.put(GIANT_SPIDER, ANIMAL_SLAYERS_1ST_LIST); + MOBS_REQUIRED_ITEM.put(DARK_HORROR, ANIMAL_SLAYERS_3RD_LIST); + MOBS_REQUIRED_ITEM.put(TALON_SPIDER, ANIMAL_SLAYERS_1ST_LIST); + MOBS_REQUIRED_ITEM.put(BLADE_SPIDER, ANIMAL_SLAYERS_1ST_LIST); + MOBS_REQUIRED_ITEM.put(HOOK_SPIDER, ANIMAL_SLAYERS_2ND_LIST); + MOBS_REQUIRED_ITEM.put(HUNTER_TARANTULA, ANIMAL_SLAYERS_5TH_LIST); + MOBS_REQUIRED_ITEM.put(CRIMSON_SPIDER, ANIMAL_SLAYERS_2ND_LIST); + MOBS_REQUIRED_ITEM.put(PINCER_SPIDER, ANIMAL_SLAYERS_2ND_LIST); + MOBS_REQUIRED_ITEM.put(KASHA_SPIDER, ANIMAL_SLAYERS_4TH_LIST); + MOBS_REQUIRED_ITEM.put(KASHA_FANG_SPIDER, ANIMAL_SLAYERS_4TH_LIST); + MOBS_REQUIRED_ITEM.put(KASHA_BLADE_SPIDER, ANIMAL_SLAYERS_4TH_LIST); + MOBS_REQUIRED_ITEM.put(PLUNDER_TARANTULA, ANIMAL_SLAYERS_5TH_LIST); + MOBS_REQUIRED_ITEM.put(CRIMSON_SPIDER2, ANIMAL_SLAYERS_LIST); + } + // Reward + private static final int WOLF_COLLAR = 2375; // Misc private static final int MIN_LEVEL = 15; // Links private static final Map<Integer, String> LINKS = new HashMap<>(); - static { LINKS.put(1110001, "<a action=\"bypass -h Quest Q00419_GetAPet 30731-14.html\">Can be used for item transportation.</a><br>"); LINKS.put(1110002, "<a action=\"bypass -h Quest Q00419_GetAPet 30731-14.html\">Can help during hunting by assisting in attacks.</a><br>"); @@ -154,7 +191,7 @@ public final class Q00419_GetAPet extends Quest { addStartNpc(PET_MENAGER_MARTIN); addTalkId(PET_MENAGER_MARTIN, GUARD_METTY, ACCESSORY_MERCHANT_ELICE, GATEKEEPER_BELLA); addKillId(LESSER_DARK_HORROR, PROWLER, GIANT_SPIDER, DARK_HORROR, TALON_SPIDER, BLADE_SPIDER, HOOK_SPIDER, HUNTER_TARANTULA, CRIMSON_SPIDER, PINCER_SPIDER, KASHA_SPIDER, KASHA_FANG_SPIDER, KASHA_BLADE_SPIDER, PLUNDER_TARANTULA, CRIMSON_SPIDER2); - registerQuestItems(ANIMAL_LOVERS_LIST, ANIMAL_SLAYERS_1ST_LIST, ANIMAL_SLAYERS_2ND_LIST, ANIMAL_SLAYERS_3RD_LIST, ANIMAL_SLAYERS_4TH_LIST, ANIMAL_SLAYERS_5TH_LIST, BLOODY_FANG, BLOODY_CLAW, BLOODY_NAIL, BLOODY_KASHA_FANG, BLOODY_TARANTULA_NAIL, ANIMAL_SLAYERS_LIST, BLOODY_RED_CLAW); + registerQuestItems(ANIMAL_LOVERS_LIST, ANIMAL_SLAYERS_1ST_LIST, ANIMAL_SLAYERS_2ND_LIST, ANIMAL_SLAYERS_3RD_LIST, ANIMAL_SLAYERS_4TH_LIST, ANIMAL_SLAYERS_5TH_LIST, BLOODY_FANG.getId(), BLOODY_CLAW.getId(), BLOODY_NAIL.getId(), BLOODY_KASHA_FANG.getId(), BLOODY_TARANTULA_NAIL.getId(), ANIMAL_SLAYERS_LIST, BLOODY_RED_CLAW.getId()); } @Override @@ -201,39 +238,39 @@ public final class Q00419_GetAPet extends Quest { } case "30731-12.html": { if (player.getRace() == Race.HUMAN) { - if (hasQuestItems(player, ANIMAL_SLAYERS_1ST_LIST) && (getQuestItemsCount(player, BLOODY_FANG) >= 50)) { + if (hasQuestItems(player, ANIMAL_SLAYERS_1ST_LIST) && hasItemsAtLimit(player, BLOODY_FANG)) { takeItems(player, ANIMAL_SLAYERS_1ST_LIST, -1); - takeItems(player, BLOODY_FANG, -1); + takeItems(player, BLOODY_FANG.getId(), -1); giveItems(player, ANIMAL_LOVERS_LIST, 1); } } else if (player.getRace() == Race.ELF) { - if (hasQuestItems(player, ANIMAL_SLAYERS_2ND_LIST) && (getQuestItemsCount(player, BLOODY_CLAW) >= 50)) { + if (hasQuestItems(player, ANIMAL_SLAYERS_2ND_LIST) && hasItemsAtLimit(player, BLOODY_CLAW)) { takeItems(player, ANIMAL_SLAYERS_2ND_LIST, -1); - takeItems(player, BLOODY_CLAW, -1); + takeItems(player, BLOODY_CLAW.getId(), -1); giveItems(player, ANIMAL_LOVERS_LIST, 1); } } else if (player.getRace() == Race.DARK_ELF) { - if (hasQuestItems(player, ANIMAL_SLAYERS_3RD_LIST) && (getQuestItemsCount(player, BLOODY_NAIL) >= 50)) { + if (hasQuestItems(player, ANIMAL_SLAYERS_3RD_LIST) && hasItemsAtLimit(player, BLOODY_NAIL)) { takeItems(player, ANIMAL_SLAYERS_3RD_LIST, -1); - takeItems(player, BLOODY_NAIL, -1); + takeItems(player, BLOODY_NAIL.getId(), -1); giveItems(player, ANIMAL_LOVERS_LIST, 1); } } else if (player.getRace() == Race.ORC) { - if (hasQuestItems(player, ANIMAL_SLAYERS_4TH_LIST) && (getQuestItemsCount(player, BLOODY_KASHA_FANG) >= 50)) { + if (hasQuestItems(player, ANIMAL_SLAYERS_4TH_LIST) && hasItemsAtLimit(player, BLOODY_KASHA_FANG)) { takeItems(player, ANIMAL_SLAYERS_4TH_LIST, -1); - takeItems(player, BLOODY_KASHA_FANG, -1); + takeItems(player, BLOODY_KASHA_FANG.getId(), -1); giveItems(player, ANIMAL_LOVERS_LIST, 1); } } else if (player.getRace() == Race.DWARF) { - if (hasQuestItems(player, ANIMAL_SLAYERS_5TH_LIST) && (getQuestItemsCount(player, BLOODY_TARANTULA_NAIL) >= 50)) { + if (hasQuestItems(player, ANIMAL_SLAYERS_5TH_LIST) && hasItemsAtLimit(player, BLOODY_TARANTULA_NAIL)) { takeItems(player, ANIMAL_SLAYERS_5TH_LIST, -1); - takeItems(player, BLOODY_TARANTULA_NAIL, -1); + takeItems(player, BLOODY_TARANTULA_NAIL.getId(), -1); giveItems(player, ANIMAL_LOVERS_LIST, 1); } } else if (player.getRace() == Race.KAMAEL) { - if (hasQuestItems(player, ANIMAL_SLAYERS_LIST) && (getQuestItemsCount(player, BLOODY_RED_CLAW) >= 50)) { + if (hasQuestItems(player, ANIMAL_SLAYERS_LIST) && hasItemsAtLimit(player, BLOODY_RED_CLAW)) { takeItems(player, ANIMAL_SLAYERS_LIST, -1); - takeItems(player, BLOODY_RED_CLAW, -1); + takeItems(player, BLOODY_RED_CLAW.getId(), -1); giveItems(player, ANIMAL_LOVERS_LIST, 1); } } @@ -315,203 +352,9 @@ public final class Q00419_GetAPet extends Quest { @Override public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { final QuestState qs = getQuestState(killer, false); - if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, killer, true)) { - switch (npc.getId()) { - case LESSER_DARK_HORROR: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_3RD_LIST) && (getQuestItemsCount(killer, BLOODY_NAIL) < 50)) { - if (getRandom(100) < 60) { - giveItems(killer, BLOODY_NAIL, 1); - if (getQuestItemsCount(killer, BLOODY_NAIL) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case PROWLER: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_3RD_LIST) && (getQuestItemsCount(killer, BLOODY_NAIL) < 50)) { - if (getRandom(100) < 100) { - giveItems(killer, BLOODY_NAIL, 1); - if (getQuestItemsCount(killer, BLOODY_NAIL) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case GIANT_SPIDER: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_1ST_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_FANG) < 50) && (getRandom(100) < 60)) { - giveItems(killer, BLOODY_FANG, 1); - if (getQuestItemsCount(killer, BLOODY_FANG) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case DARK_HORROR: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_3RD_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_NAIL) < 50) && (getRandom(100) < 75)) { - giveItems(killer, BLOODY_NAIL, 1); - if (getQuestItemsCount(killer, BLOODY_NAIL) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case TALON_SPIDER: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_1ST_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_FANG) < 50) && (getRandom(100) < 75)) { - giveItems(killer, BLOODY_FANG, 1); - if (getQuestItemsCount(killer, BLOODY_FANG) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case BLADE_SPIDER: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_1ST_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_FANG) < 50) && (getRandom(100) < 100)) { - giveItems(killer, BLOODY_FANG, 1); - if (getQuestItemsCount(killer, BLOODY_FANG) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case HOOK_SPIDER: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_2ND_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_CLAW) < 50) && (getRandom(100) < 75)) { - giveItems(killer, BLOODY_CLAW, 1); - if (getQuestItemsCount(killer, BLOODY_CLAW) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case HUNTER_TARANTULA: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_5TH_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_TARANTULA_NAIL) < 50) && (getRandom(100) < 75)) { - giveItems(killer, BLOODY_TARANTULA_NAIL, 1); - if (getQuestItemsCount(killer, BLOODY_TARANTULA_NAIL) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case CRIMSON_SPIDER: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_2ND_LIST) && (getQuestItemsCount(killer, BLOODY_CLAW) < 50)) { - if (getRandom(100) < 60) { - giveItems(killer, BLOODY_CLAW, 1); - if (getQuestItemsCount(killer, BLOODY_CLAW) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case PINCER_SPIDER: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_2ND_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_CLAW) < 50) && (getRandom(100) < 100)) { - giveItems(killer, BLOODY_CLAW, 1); - if (getQuestItemsCount(killer, BLOODY_CLAW) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case KASHA_SPIDER: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_4TH_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_KASHA_FANG) < 50) && (getRandom(100) < 60)) { - giveItems(killer, BLOODY_KASHA_FANG, 1); - if (getQuestItemsCount(killer, BLOODY_KASHA_FANG) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case KASHA_FANG_SPIDER: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_4TH_LIST) && (getQuestItemsCount(killer, BLOODY_KASHA_FANG) < 50)) { - if (getRandom(100) < 75) { - giveItems(killer, BLOODY_KASHA_FANG, 1); - if (getQuestItemsCount(killer, BLOODY_KASHA_FANG) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case KASHA_BLADE_SPIDER: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_4TH_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_KASHA_FANG) < 50) && (getRandom(100) < 100)) { - giveItems(killer, BLOODY_KASHA_FANG, 1); - if (getQuestItemsCount(killer, BLOODY_KASHA_FANG) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case PLUNDER_TARANTULA: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_5TH_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_TARANTULA_NAIL) < 50) && (getRandom(100) < 100)) { - giveItems(killer, BLOODY_TARANTULA_NAIL, 1); - if (getQuestItemsCount(killer, BLOODY_TARANTULA_NAIL) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } - case CRIMSON_SPIDER2: { - if (hasQuestItems(killer, ANIMAL_SLAYERS_LIST)) { - if ((getQuestItemsCount(killer, BLOODY_RED_CLAW) < 50) && (getRandom(100) < 75)) { - giveItems(killer, BLOODY_RED_CLAW, 1); - if (getQuestItemsCount(killer, BLOODY_RED_CLAW) >= 50) { - playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE); - } else { - playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET); - } - } - } - break; - } + if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, qs.getPlayer(), true)) { + if (hasQuestItems(qs.getPlayer(), MOBS_REQUIRED_ITEM.get(npc.getId()))) { + giveItemRandomly(qs.getPlayer(), npc, DROPLIST.get(npc), true); } } return super.onKill(npc, killer, isSummon); @@ -533,8 +376,8 @@ public final class Q00419_GetAPet extends Quest { switch (npc.getId()) { case PET_MENAGER_MARTIN: { if (hasQuestItems(player, ANIMAL_SLAYERS_LIST)) { - if (getQuestItemsCount(player, BLOODY_RED_CLAW) < 50) { - if (!hasQuestItems(player, BLOODY_RED_CLAW)) { + if (!hasItemsAtLimit(player, BLOODY_RED_CLAW)) { + if (!hasQuestItems(player, BLOODY_RED_CLAW.getId())) { htmltext = "30731-09.html"; } else { htmltext = "30731-10.html"; @@ -543,8 +386,8 @@ public final class Q00419_GetAPet extends Quest { htmltext = "30731-11.html"; } } else if (hasQuestItems(player, ANIMAL_SLAYERS_1ST_LIST)) { - if (getQuestItemsCount(player, BLOODY_FANG) < 50) { - if (!hasQuestItems(player, BLOODY_FANG)) { + if (!hasItemsAtLimit(player, BLOODY_FANG)) { + if (!hasQuestItems(player, BLOODY_FANG.getId())) { htmltext = "30731-09.html"; } else { htmltext = "30731-10.html"; @@ -553,8 +396,8 @@ public final class Q00419_GetAPet extends Quest { htmltext = "30731-11.html"; } } else if (hasQuestItems(player, ANIMAL_SLAYERS_2ND_LIST)) { - if (getQuestItemsCount(player, BLOODY_CLAW) < 50) { - if (!hasQuestItems(player, BLOODY_CLAW)) { + if (!hasItemsAtLimit(player, BLOODY_CLAW)) { + if (!hasQuestItems(player, BLOODY_CLAW.getId())) { htmltext = "30731-09.html"; } else { htmltext = "30731-10.html"; @@ -563,8 +406,8 @@ public final class Q00419_GetAPet extends Quest { htmltext = "30731-11.html"; } } else if (hasQuestItems(player, ANIMAL_SLAYERS_3RD_LIST)) { - if (getQuestItemsCount(player, BLOODY_NAIL) < 50) { - if (!hasQuestItems(player, BLOODY_NAIL)) { + if (!hasItemsAtLimit(player, BLOODY_NAIL)) { + if (!hasQuestItems(player, BLOODY_NAIL.getId())) { htmltext = "30731-09.html"; } else { htmltext = "30731-10.html"; @@ -573,8 +416,8 @@ public final class Q00419_GetAPet extends Quest { htmltext = "30731-11.html"; } } else if (hasQuestItems(player, ANIMAL_SLAYERS_4TH_LIST)) { - if (getQuestItemsCount(player, BLOODY_KASHA_FANG) < 50) { - if (!hasQuestItems(player, BLOODY_KASHA_FANG)) { + if (!hasItemsAtLimit(player, BLOODY_KASHA_FANG)) { + if (!hasQuestItems(player, BLOODY_KASHA_FANG.getId())) { htmltext = "30731-09.html"; } else { htmltext = "30731-10.html"; @@ -583,8 +426,8 @@ public final class Q00419_GetAPet extends Quest { htmltext = "30731-11.html"; } } else if (hasQuestItems(player, ANIMAL_SLAYERS_5TH_LIST)) { - if (getQuestItemsCount(player, BLOODY_TARANTULA_NAIL) < 50) { - if (!hasQuestItems(player, BLOODY_TARANTULA_NAIL)) { + if (!hasItemsAtLimit(player, BLOODY_TARANTULA_NAIL)) { + if (!hasQuestItems(player, BLOODY_TARANTULA_NAIL.getId())) { htmltext = "30731-09.html"; } else { htmltext = "30731-10.html";