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";