diff --git a/Server/src/main/java/core/game/content/dialogue/ChemistDialogue.java b/Server/src/main/java/core/game/content/dialogue/ChemistDialogue.java index bf8c99c57..b063bb7a1 100644 --- a/Server/src/main/java/core/game/content/dialogue/ChemistDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/ChemistDialogue.java @@ -15,7 +15,6 @@ import core.game.node.item.Item; @Initializable public final class ChemistDialogue extends DialoguePlugin { private boolean replacementReward = false; - private AchievementDiary diary; private int level = 1; /** @@ -45,10 +44,7 @@ public final class ChemistDialogue extends DialoguePlugin { public boolean open(Object... args) { interpreter.sendOptions("Do you want to talk about lamps?", "Yes.", "No.", "No, I'm more interested in impling jars.", "Falador Achievement Diary"); stage = 0; - diary = player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR); - replacementReward = diary.isLevelRewarded(level) - && diary.isComplete(level, true) - && !player.hasItem(diary.getType().getRewards(level)[0]); + replacementReward = AchievementDiary.canReplaceReward(player, DiaryType.FALADOR, level); return true; } @@ -211,7 +207,7 @@ public final class ChemistDialogue extends DialoguePlugin { } break; case 80: - player.getInventory().add(diary.getType().getRewards(level)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.FALADOR, level); npc("Here's your replacement. Please be more careful."); stage = 999; break; @@ -238,7 +234,7 @@ public final class ChemistDialogue extends DialoguePlugin { break; // https://www.youtube.com/watch?v=ZW9k1922Ggk case 105: - if (!diary.isLevelRewarded(1)) { + if (!AchievementDiary.hasClaimedLevelRewards(player, DiaryType.FALADOR, level)) { options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); stage = 106; } else { @@ -349,10 +345,10 @@ public final class ChemistDialogue extends DialoguePlugin { break; case 200: - if (diary.isLevelRewarded(level)) { + if (AchievementDiary.hasClaimedLevelRewards(player, DiaryType.FALADOR, level)) { npc("But you've already gotten yours!"); stage = 105; - } else if (diary.isComplete(level, true)) { + } else if (AchievementDiary.hasCompletedLevel(player, DiaryType.FALADOR, level)) { npc("So, you've finished. Well done! I believe congratulations", "are in order."); stage = 201; } else { @@ -370,13 +366,8 @@ public final class ChemistDialogue extends DialoguePlugin { break; case 203: npc("This is the second stage of the Falador shield: a kite", "shield. It grants you all the benefits fo the buckler, but", "with increased Prayer restore, and Farming experience", "when using the patches near Falador."); - if (!diary.isLevelRewarded(level)) { - for (Item i : diary.getType().getRewards(level)) { - if (!player.getInventory().add(i, player)) { - GroundItemManager.create(i, player); - } - } - diary.setLevelRewarded(level); + if (!AchievementDiary.hasClaimedLevelRewards(player, DiaryType.FALADOR, level)) { + AchievementDiary.flagRewarded(player, DiaryType.FALADOR, level); } stage = 204; break; diff --git a/Server/src/main/java/core/game/content/dialogue/ExplorerJackDialogue.java b/Server/src/main/java/core/game/content/dialogue/ExplorerJackDialogue.java index 6cc533d82..744fef1e2 100644 --- a/Server/src/main/java/core/game/content/dialogue/ExplorerJackDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/ExplorerJackDialogue.java @@ -18,7 +18,6 @@ public class ExplorerJackDialogue extends DialoguePlugin { /** * The achievement diary. */ - private AchievementDiary diary; private final int level = 0; /** @@ -52,17 +51,14 @@ public class ExplorerJackDialogue extends DialoguePlugin { @Override public boolean handle(int interfaceId, int buttonId) { - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.LUMBRIDGE); - } switch (stage) { case -1: - if (diary.isComplete(level, true) && !diary.isLevelRewarded(level)) { + if (AchievementDiary.canClaimLevelRewards(player, DiaryType.LUMBRIDGE, level)) { player("I've done all the beginner tasks in my Lumbridge", "Achievement Diary."); stage = 50; break; } - if (diary.isLevelRewarded(level) && diary.isComplete(level, true) && !player.hasItem(diary.getType().getRewards(level)[0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.LUMBRIDGE, level)) { player("I've seemed to have lost my explorer's ring..."); stage = 60; break; @@ -146,10 +142,7 @@ public class ExplorerJackDialogue extends DialoguePlugin { stage++; break; case 52: - diary.setLevelRewarded(level); - for (Item i : diary.getType().getRewards(level)) { - player.getInventory().add(i, player); - } + AchievementDiary.flagRewarded(player, DiaryType.LUMBRIDGE, level); player.getEmoteManager().unlock(Emotes.EXPLORE); npc("This ring is a representation of the adventures you", "went on to complete your tasks."); stage ++; @@ -159,7 +152,7 @@ public class ExplorerJackDialogue extends DialoguePlugin { stage = -1; break; case 60: - player.getInventory().add(diary.getType().getRewards(level)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.LUMBRIDGE, level); npc("You better be more careful this time."); stage = -1; break; diff --git a/Server/src/main/java/core/game/content/dialogue/FaladorSquireDialogue.java b/Server/src/main/java/core/game/content/dialogue/FaladorSquireDialogue.java index d5d97c6b8..961eb5c4d 100644 --- a/Server/src/main/java/core/game/content/dialogue/FaladorSquireDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/FaladorSquireDialogue.java @@ -20,7 +20,6 @@ import rs09.game.world.GameWorld; public final class FaladorSquireDialogue extends DialoguePlugin { private boolean useDiaryDialogueTree = false; private boolean replacementReward = false; - private AchievementDiary diary; private int level = 2; /** @@ -62,10 +61,7 @@ public final class FaladorSquireDialogue extends DialoguePlugin { quest = player.getQuestRepository().getQuest("The Knight's Sword"); interpreter.sendOptions("What do you want to do?", "Chat", "Talk about the Falador Achievement Diary"); stage = -1; - diary = player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR); - replacementReward = diary.isLevelRewarded(level) - && diary.isComplete(level, true) - && !player.hasItem(diary.getType().getRewards(level)[0]); + replacementReward = AchievementDiary.canReplaceReward(player, DiaryType.FALADOR, level); return true; } @@ -84,7 +80,7 @@ public final class FaladorSquireDialogue extends DialoguePlugin { } break; case 80: - player.getInventory().add(diary.getType().getRewards(level)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.FALADOR, level); npc("Here's your replacement. Please be more careful."); stage = 999; break; @@ -109,7 +105,7 @@ public final class FaladorSquireDialogue extends DialoguePlugin { } break; case 105: - if (!diary.isLevelRewarded(level)) { + if (!AchievementDiary.hasClaimedLevelRewards(player, DiaryType.FALADOR, level)) { options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); stage = 106; } else { @@ -228,10 +224,10 @@ public final class FaladorSquireDialogue extends DialoguePlugin { break; case 200: - if (diary.isLevelRewarded(level)) { + if (AchievementDiary.hasClaimedLevelRewards(player, DiaryType.FALADOR, level)) { npc("But you've already gotten yours!"); stage = 105; - } else if (diary.isComplete(level, true)) { + } else if (AchievementDiary.hasCompletedLevel(player, DiaryType.FALADOR, level)) { npc("So, you've finished. Well done! I believe congratulations", "are in order."); stage = 201; } else { @@ -249,14 +245,7 @@ public final class FaladorSquireDialogue extends DialoguePlugin { break; case 203: npc("This is the final stage of the Falador shield: a tower", "shield. It grants you all the benefits fo the buckler", "and kiteshield did, full Prayer restore, and access to", "some interesting new seeds that my friend Wyson has"); - if (!diary.isLevelRewarded(level)) { - for (Item i : diary.getType().getRewards(level)) { - if (!player.getInventory().add(i, player)) { - GroundItemManager.create(i, player); - } - } - diary.setLevelRewarded(level); - } + AchievementDiary.flagRewarded(player, DiaryType.FALADOR, level); stage = 204; break; case 204: diff --git a/Server/src/main/java/core/game/content/dialogue/JungleForesterDialogue.java b/Server/src/main/java/core/game/content/dialogue/JungleForesterDialogue.java index d92570368..63e487ade 100644 --- a/Server/src/main/java/core/game/content/dialogue/JungleForesterDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/JungleForesterDialogue.java @@ -1,5 +1,6 @@ package core.game.content.dialogue; +import core.game.component.CloseEvent; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.diary.AchievementDiary; import core.game.node.entity.player.link.diary.DiaryType; @@ -12,12 +13,6 @@ import core.game.node.item.Item; */ @Initializable public class JungleForesterDialogue extends DialoguePlugin { - - /** - * The achievement diary. - */ - private AchievementDiary diary; - /** * Constructs a new {@code KalebParamaya} {@code Object} */ @@ -51,15 +46,12 @@ public class JungleForesterDialogue extends DialoguePlugin { public boolean handle(int interfaceId, int buttonId) { switch (stage) { case 41: - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); - } - if (diary.isComplete(2) && !diary.isLevelRewarded(2)) { + if (AchievementDiary.canClaimLevelRewards(player, DiaryType.KARAMJA, 2)) { player("I've done all the hard tasks in my Karamja", "Achievement Diary."); stage = 440; break; } - if (diary.isLevelRewarded(2) && diary.isComplete(2) && !player.hasItem(diary.getType().getRewards(2)[0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.KARAMJA, 2)) { player("I've seemed to have lost my gloves.."); stage = 450; break; @@ -68,9 +60,6 @@ public class JungleForesterDialogue extends DialoguePlugin { stage++; break; case 42: - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); - } switch (buttonId) { case 1: player("What is the Achievement Diary?"); @@ -98,10 +87,7 @@ public class JungleForesterDialogue extends DialoguePlugin { stage++; break; case 442: - diary.setLevelRewarded(2); - for (Item i : diary.getType().getRewards(2)) { - player.getInventory().add(i, player); - } + AchievementDiary.flagRewarded(player, DiaryType.KARAMJA, 2); npc("These Karamja gloves are a symbol of your explorin'", "on the island. All the merchants will recognise them", "and mabe give you a discount. I'll", "have a word with some of the seafarin' folk who sail to"); stage += 2; case 443: @@ -113,7 +99,7 @@ public class JungleForesterDialogue extends DialoguePlugin { stage = 41; break; case 450: - player.getInventory().add(diary.getType().getRewards(2)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.KARAMJA, 2); npc("You better be more careful this time."); stage = 41; break; diff --git a/Server/src/main/java/core/game/content/dialogue/KalebParamaya.java b/Server/src/main/java/core/game/content/dialogue/KalebParamaya.java index e23607abb..11a4e7887 100644 --- a/Server/src/main/java/core/game/content/dialogue/KalebParamaya.java +++ b/Server/src/main/java/core/game/content/dialogue/KalebParamaya.java @@ -12,12 +12,6 @@ import core.game.node.item.Item; */ @Initializable public class KalebParamaya extends DialoguePlugin { - - /** - * The achievement diary. - */ - private AchievementDiary diary; - /** * Constructs a new {@code KalebParamaya} {@code Object} */ @@ -51,15 +45,12 @@ public class KalebParamaya extends DialoguePlugin { public boolean handle(int interfaceId, int buttonId) { switch (stage) { case 41: - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); - } - if (diary.isComplete(1) && !diary.isLevelRewarded(1)) { + if (AchievementDiary.canClaimLevelRewards(player, DiaryType.KARAMJA, 1)) { player("I've done all the medium tasks in my Karamja", "Achievement Diary."); stage = 440; break; } - if (diary.isLevelRewarded(1) && diary.isComplete(1) && !player.hasItem(diary.getType().getRewards(1)[0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.KARAMJA, 1)) { player("I've seemed to have lost my gloves.."); stage = 450; break; @@ -68,9 +59,6 @@ public class KalebParamaya extends DialoguePlugin { stage++; break; case 42: - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); - } switch (buttonId) { case 1: player("What is the Achievement Diary?"); @@ -98,10 +86,7 @@ public class KalebParamaya extends DialoguePlugin { stage++; break; case 442: - diary.setLevelRewarded(1); - for (Item i : diary.getType().getRewards(1)) { - player.getInventory().add(i, player); - } + AchievementDiary.flagRewarded(player, DiaryType.KARAMJA, 1); npc("These Karamja gloves are a symbol of your explorin'", "on the island. All the merchants will recognise them", "and mabe give you a discount. I'll", "have a word with some of the seafarin' folk who sail to"); stage++; break; @@ -114,7 +99,7 @@ public class KalebParamaya extends DialoguePlugin { stage = 41; break; case 450: - player.getInventory().add(diary.getType().getRewards(1)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.KARAMJA, 1); npc("You better be more careful this time."); stage = 41; break; diff --git a/Server/src/main/java/core/game/content/dialogue/PirateJackieDialogue.java b/Server/src/main/java/core/game/content/dialogue/PirateJackieDialogue.java index 646595681..ccda301e3 100644 --- a/Server/src/main/java/core/game/content/dialogue/PirateJackieDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/PirateJackieDialogue.java @@ -20,11 +20,6 @@ public final class PirateJackieDialogue extends DialoguePlugin { */ private static final Component COMPONENT = new Component(6); - /** - * The achievement diary. - */ - private AchievementDiary diary; - /** * Constructs a new {@code PirateJackieDialogue} {@code Object}. */ @@ -121,15 +116,12 @@ public final class PirateJackieDialogue extends DialoguePlugin { player.getInterfaceManager().open(COMPONENT); break; case 41: - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); - } - if (diary.isComplete(0) && !diary.isLevelRewarded(0)) { + if (AchievementDiary.canClaimLevelRewards(player, DiaryType.KARAMJA, 0)) { player("I've done all the easy tasks in my Karamja Achievement", "Diary."); stage = 440; break; } - if (diary.isLevelRewarded(0) && diary.isComplete(0) && !player.hasItem(diary.getType().getRewards(0)[0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.KARAMJA, 0)) { player("I've seemed to have lost my gloves.."); stage = 450; break; @@ -138,9 +130,6 @@ public final class PirateJackieDialogue extends DialoguePlugin { stage++; break; case 42: - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); - } switch (buttonId) { case 1: player("What is the Achievement Diary?"); @@ -168,10 +157,7 @@ public final class PirateJackieDialogue extends DialoguePlugin { stage++; break; case 442: - diary.setLevelRewarded(0); - for (Item i : diary.getType().getRewards(0)) { - player.getInventory().add(i, player); - } + AchievementDiary.flagRewarded(player, DiaryType.KARAMJA, 0); npc("These 'ere Karamja gloves be a symbol of yer explorin'", "on the island. All the merchants will recognise 'em when", "yer wear 'em and mabe give ye a little discount. I'll", "ave a word with some of the seafarin' folk who sail to"); stage++; break; @@ -184,7 +170,7 @@ public final class PirateJackieDialogue extends DialoguePlugin { stage = 41; break; case 450: - player.getInventory().add(diary.getType().getRewards(0)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.KARAMJA, 0); npc("Arr matey, have another pair. Ye better be more", "careful this time."); stage = 41; break; diff --git a/Server/src/main/java/core/game/content/dialogue/RedbeardFrankDialogue.java b/Server/src/main/java/core/game/content/dialogue/RedbeardFrankDialogue.java index b5330d5ad..86fa86ffc 100644 --- a/Server/src/main/java/core/game/content/dialogue/RedbeardFrankDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/RedbeardFrankDialogue.java @@ -9,6 +9,8 @@ import core.game.node.item.GroundItemManager; import core.plugin.Initializable; import core.game.node.item.Item; +import static rs09.tools.DialogueConstKt.END_DIALOGUE; + /** * Represents the dialogue to handle Rebeard Frank. * @@ -17,7 +19,6 @@ import core.game.node.item.Item; @Initializable public class RedbeardFrankDialogue extends DialoguePlugin { private boolean replacementReward = false; - private AchievementDiary diary; private int level = 0; /** @@ -59,10 +60,7 @@ public class RedbeardFrankDialogue extends DialoguePlugin { quest = player.getQuestRepository().getQuest("Pirate's Treasure"); npc("Arr, Matey!"); stage = 0; - diary = player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR); - replacementReward = diary.isLevelRewarded(level) - && diary.isComplete(level, true) - && !player.hasItem(diary.getType().getRewards(level)[0]); + replacementReward = AchievementDiary.canReplaceReward(player, DiaryType.FALADOR, level); return true; } @@ -323,7 +321,7 @@ public class RedbeardFrankDialogue extends DialoguePlugin { stage = 105; break; case 105: - if (!diary.isLevelRewarded(level)) { + if (!AchievementDiary.hasClaimedLevelRewards(player, DiaryType.FALADOR, level)) { options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); stage = 106; } else { @@ -434,10 +432,13 @@ public class RedbeardFrankDialogue extends DialoguePlugin { break; case 200: - if (diary.isLevelRewarded(level)) { + if (AchievementDiary.canReplaceReward(player, DiaryType.FALADOR, level)) { + playerl(FacialExpression.HALF_GUILTY, "I seem to have lost my shield..."); + stage = 250; + } else if (AchievementDiary.hasClaimedLevelRewards(player, DiaryType.FALADOR, level)) { npc("But you've already gotten yours!"); stage = 105; - } else if (diary.isComplete(level, true)) { + } else if (AchievementDiary.hasCompletedLevel(player, DiaryType.FALADOR, level)) { npc("So, you've finished. Well done! I believe congratulations", "are in order."); stage = 201; } else { @@ -455,14 +456,7 @@ public class RedbeardFrankDialogue extends DialoguePlugin { break; case 203: npc("This is the first stage of the Falador shield: a buckler. It", "grants you access to a Prayer restore ability and an", "emote."); - if (!diary.isLevelRewarded(level)) { - for (Item i : diary.getType().getRewards(level)) { - if (!player.getInventory().add(i, player)) { - GroundItemManager.create(i, player); - }; - } - diary.setLevelRewarded(level); - } + AchievementDiary.flagRewarded(player, DiaryType.FALADOR, level); stage = 204; break; case 204: @@ -493,8 +487,15 @@ public class RedbeardFrankDialogue extends DialoguePlugin { npc("Keep it up!"); stage = 105; break; - - + case 250: + npcl(FacialExpression.LAUGH, "Alright, matey, I'll give ye a new one."); + stage++; + break; + case 251: + AchievementDiary.grantReplacement(player, DiaryType.FALADOR, level); + npcl(FacialExpression.FRIENDLY, "Be more careful this time, aye?"); + stage = END_DIALOGUE; + break; } return true; } diff --git a/Server/src/main/java/core/game/content/dialogue/SeerDialoguePlugin.java b/Server/src/main/java/core/game/content/dialogue/SeerDialoguePlugin.java index d057b5f0d..febf6bddc 100644 --- a/Server/src/main/java/core/game/content/dialogue/SeerDialoguePlugin.java +++ b/Server/src/main/java/core/game/content/dialogue/SeerDialoguePlugin.java @@ -44,7 +44,6 @@ public class SeerDialoguePlugin extends DialoguePlugin { @Override public boolean handle(int interfaceId, int buttonId) { - AchievementDiary diary = player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE); int level = 0; switch (stage) { @@ -58,22 +57,17 @@ public class SeerDialoguePlugin extends DialoguePlugin { stage = 1; break; case 2: - if (!diary.isStarted(level)) { - player("Do you have an Achievement Diary for me?"); - stage = 100; - break; - } - else if (diary.isLevelRewarded(level) && !player.hasItem(diary.getType().getRewards()[level][0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.SEERS_VILLAGE, 0)) { player("I seem to have lost my seers' headband..."); stage = 80; break; } - else if (diary.isLevelRewarded(level)) { + else if (AchievementDiary.hasClaimedLevelRewards(player, DiaryType.SEERS_VILLAGE, 0)) { player("Can you remind me what my headband does?"); stage = 90; break; } - else if (diary.isComplete(level, true)) { + else if (AchievementDiary.canClaimLevelRewards(player, DiaryType.SEERS_VILLAGE, 0)) { player("Hi. I've completed the Easy tasks in my Achievement", "Diary."); stage = 200; break; @@ -86,7 +80,7 @@ public class SeerDialoguePlugin extends DialoguePlugin { } break; case 80: - player.getInventory().add(diary.getType().getRewards(level)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.SEERS_VILLAGE, 0); npc("Here's your replacement. Please be more careful."); stage = 999; break; @@ -107,14 +101,11 @@ public class SeerDialoguePlugin extends DialoguePlugin { stage++; break; case 201: - if (!player.getInventory().hasSpaceFor(diary.getType().getRewards(level))) { + if (!AchievementDiary.flagRewarded(player, DiaryType.SEERS_VILLAGE, 0)) { npc("Come back when you have two free inventory slots."); stage = 999; } else { - diary.setLevelRewarded(level); - player.getInventory().add(diary.getType().getRewards()[level][0]); - player.getInventory().add(diary.getType().getRewards()[level][1]); - interpreter.sendItemMessage(diary.getType().getRewards()[level][0], "The seer hands you a strange-looking headband and a", "rusty lamp."); + interpreter.sendItemMessage(AchievementDiary.getRewards(DiaryType.SEERS_VILLAGE, 0)[0], "The seer hands you a strange-looking headband and a", "rusty lamp."); stage++; } break; diff --git a/Server/src/main/java/core/game/content/dialogue/StankersDialogue.java b/Server/src/main/java/core/game/content/dialogue/StankersDialogue.java index ea022144d..3fff17488 100644 --- a/Server/src/main/java/core/game/content/dialogue/StankersDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/StankersDialogue.java @@ -40,7 +40,6 @@ public class StankersDialogue extends DialoguePlugin { @Override public boolean handle(int interfaceId, int buttonId) { - AchievementDiary diary = player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE); int level = 1; switch (stage) { @@ -62,22 +61,17 @@ public class StankersDialogue extends DialoguePlugin { stage = 20; break; case 3: - if (!diary.isStarted(level)) { - player("Do you have an Achievement Diary for me?"); - stage = 100; - break; - } - else if (diary.isLevelRewarded(level) && !player.hasItem(diary.getType().getRewards()[level][0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.SEERS_VILLAGE, level)) { player("I seem to have lost my seers' headband..."); stage = 80; break; } - else if (diary.isLevelRewarded(level)) { + else if (AchievementDiary.hasClaimedLevelRewards(player, DiaryType.SEERS_VILLAGE, level)) { player("Can you remind me what my headband does?"); stage = 90; break; } - else if (diary.isComplete(level, true)) { + else if (AchievementDiary.canClaimLevelRewards(player, DiaryType.SEERS_VILLAGE, level)) { player("Hi. I've completed the Medium tasks in my Achievement", "Diary. Can I have a reward?"); stage = 200; break; @@ -151,7 +145,7 @@ public class StankersDialogue extends DialoguePlugin { break; case 80: - player.getInventory().add(diary.getType().getRewards(level)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.SEERS_VILLAGE, level); npc("Here's your replacement. Please be more careful."); stage = 999; break; @@ -176,12 +170,11 @@ public class StankersDialogue extends DialoguePlugin { stage++; break; case 201: - if (!player.hasItem(diary.getType().getRewards()[level][0])) { + if (!player.hasItem(AchievementDiary.getRewards(DiaryType.SEERS_VILLAGE, level)[0])) { npc("I need your headband to anoint it! Come back when", "you have it."); stage = 999; } else { - diary.setLevelRewarded(level); - player.getInventory().add(diary.getType().getRewards()[level][1]); + AchievementDiary.flagRewarded(player, DiaryType.SEERS_VILLAGE, level); sendDialogue("Stankers produces a chalice containing a vile-looking concoction that", "he pours all over your headband."); stage++; } diff --git a/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ReldoDialogue.java b/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ReldoDialogue.java index 4d92b87d0..bd1a0f10b 100644 --- a/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ReldoDialogue.java +++ b/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ReldoDialogue.java @@ -28,11 +28,6 @@ public class ReldoDialogue extends DialoguePlugin { */ private Quest shieldArrav; - /** - * The achievement diary. - */ - private AchievementDiary diary; - /** * If w'ere chatting about our diary. */ @@ -91,9 +86,6 @@ public class ReldoDialogue extends DialoguePlugin { stage++; break; case 0: - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); - } switch (buttonId) { case 1: player("What is the Achievement Diary?"); @@ -126,10 +118,7 @@ public class ReldoDialogue extends DialoguePlugin { stage = 444; break; case 444: - diary.setLevelRewarded(level); - for (Item i : diary.getType().getRewards(level)) { - player.getInventory().add(i, player); - } + AchievementDiary.flagRewarded(player, DiaryType.VARROCK, level); sendDialogue("Reldo takes the Varrock armour and attaches some more plate metal", "to it, filling it out to look like a proper suit of armour. He etches", "some words into the armour, which glows slightly before fading."); stage++; break; @@ -167,7 +156,7 @@ public class ReldoDialogue extends DialoguePlugin { break; case 460: - player.getInventory().add(diary.getType().getRewards(level)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.VARROCK, level); npc("You better be more careful this time."); stage = 999; break; @@ -588,15 +577,12 @@ public class ReldoDialogue extends DialoguePlugin { */ private void sendDiaryDialogue() { isDiary = true; - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); - } - if (diary.isComplete(level) && !diary.isLevelRewarded(level)) { + if (AchievementDiary.canClaimLevelRewards(player, DiaryType.VARROCK, level)) { player("I've finished all the medium tasks in my Varrock", "Achievement Diary."); stage = 440; return; } - if (diary.isLevelRewarded(level) && diary.isComplete(level) && !player.hasItem(diary.getType().getRewards(level)[0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.VARROCK, level)) { player("I've seemed to have lost my armour..."); stage = 460; return; diff --git a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/SirKayDialogue.java b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/SirKayDialogue.java index 9492f6580..c0f75f7ce 100644 --- a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/SirKayDialogue.java +++ b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/SirKayDialogue.java @@ -52,7 +52,6 @@ public final class SirKayDialogue extends DialoguePlugin { @Override public boolean handle(int interfaceId, int buttonId) { - AchievementDiary diary = player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE); int level = 2; switch (stage) { @@ -66,22 +65,17 @@ public final class SirKayDialogue extends DialoguePlugin { stage = 1; break; case 2: - if (!diary.isStarted(level)) { - player("Do you have an Achievement Diary for me?"); - stage = 100; - break; - } - else if (diary.isLevelRewarded(level) && !player.hasItem(diary.getType().getRewards()[level][0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.SEERS_VILLAGE, level)) { player("I seem to have lost my seers' headband..."); stage = 80; break; } - else if (diary.isLevelRewarded(level)) { + else if (AchievementDiary.hasClaimedLevelRewards(player, DiaryType.SEERS_VILLAGE, level)) { player("Can you remind me what my headband does?"); stage = 90; break; } - else if (diary.isComplete(level, true)) { + else if (AchievementDiary.canClaimLevelRewards(player, DiaryType.SEERS_VILLAGE, level)) { player("Greetings, Sir Kay. I have completed all of the Hard", "tasks in my Achievement Diary. May I have a reward?"); stage = 200; break; @@ -154,7 +148,7 @@ public final class SirKayDialogue extends DialoguePlugin { break; case 80: - player.getInventory().add(diary.getType().getRewards(level)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.SEERS_VILLAGE, level); npc("Here's your replacement. Please be more careful."); stage = 999; break; @@ -179,12 +173,11 @@ public final class SirKayDialogue extends DialoguePlugin { stage++; break; case 201: - if (!player.hasItem(diary.getType().getRewards()[level][0])) { + if (!player.hasItem(AchievementDiary.getRewards(DiaryType.SEERS_VILLAGE, level)[0])) { npc("I need your headband. Come back when", "you have it."); stage = 999; } else { - diary.setLevelRewarded(level); - player.getInventory().add(diary.getType().getRewards()[level][1]); + AchievementDiary.flagRewarded(player, DiaryType.SEERS_VILLAGE, level); sendDialogue("You hand Sir Kay your headband and he concentrates for a", "moment. Some mysterious knightly energy passes through his hands", "and he gives the headband back to you, along with an old lamp."); stage++; } diff --git a/Server/src/main/java/core/game/content/quest/members/whatliesbelow/RatBurgissDialogue.java b/Server/src/main/java/core/game/content/quest/members/whatliesbelow/RatBurgissDialogue.java index 64787eba5..fa3c90924 100644 --- a/Server/src/main/java/core/game/content/quest/members/whatliesbelow/RatBurgissDialogue.java +++ b/Server/src/main/java/core/game/content/quest/members/whatliesbelow/RatBurgissDialogue.java @@ -15,12 +15,6 @@ import rs09.game.node.entity.player.link.diary.dialogues.RatBurgissDiaryDialogue * @author Vexia */ public class RatBurgissDialogue extends DialoguePlugin { - - /** - * The achievement diary. - */ - private AchievementDiary diary; - /** * The quest. */ @@ -452,15 +446,12 @@ public class RatBurgissDialogue extends DialoguePlugin { */ private void sendDiaryDialogue() { isDiary = true; - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); - } - if (diary.isComplete(level) && !diary.isLevelRewarded(level)) { + if (AchievementDiary.canClaimLevelRewards(player, DiaryType.VARROCK, level)) { player("I think I've finished all of the tasks in my Varrock", "Achievement Diary."); stage = 440; return; } - if (diary.isLevelRewarded(0) && diary.isComplete(level) && !player.hasItem(diary.getType().getRewards(level)[0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.VARROCK, level)) { player("I've seemed to have lost my armour..."); stage = 460; return; diff --git a/Server/src/main/java/core/game/interaction/npc/bob/BobDialogue.java b/Server/src/main/java/core/game/interaction/npc/bob/BobDialogue.java index cffa0e677..d60fffa55 100644 --- a/Server/src/main/java/core/game/interaction/npc/bob/BobDialogue.java +++ b/Server/src/main/java/core/game/interaction/npc/bob/BobDialogue.java @@ -36,7 +36,6 @@ public final class BobDialogue extends DialoguePlugin { /** * The achievement diary. */ - private AchievementDiary diary; private final int level = 1; /** @@ -178,15 +177,12 @@ public final class BobDialogue extends DialoguePlugin { end(); break; case 30: - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.LUMBRIDGE); - } - if (diary.isComplete(level, true) && !diary.isLevelRewarded(level)) { + if (AchievementDiary.canClaimLevelRewards(player, DiaryType.LUMBRIDGE, level)) { player("I've done all the medium tasks in my Lumbridge", "Achievement Diary."); stage = 150; break; } - if (diary.isLevelRewarded(1) && diary.isComplete(level, true) && !player.hasItem(diary.getType().getRewards(level)[0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.LUMBRIDGE, level)) { player("I've seemed to have lost my explorer's ring..."); stage = 160; break; @@ -254,10 +250,7 @@ public final class BobDialogue extends DialoguePlugin { stage++; break; case 152: - diary.setLevelRewarded(level); - for (Item i : diary.getType().getRewards(level)) { - player.getInventory().add(i, player); - } + AchievementDiary.flagRewarded(player, DiaryType.LUMBRIDGE, level); npc("This ring is a representation of the adventures you", "went on to complete your tasks."); stage ++; break; @@ -266,7 +259,7 @@ public final class BobDialogue extends DialoguePlugin { stage = 30; break; case 160: - player.getInventory().add(diary.getType().getRewards(level)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.LUMBRIDGE, level); npc("You better be more careful this time."); stage = -1; break; diff --git a/Server/src/main/java/core/game/node/entity/player/link/diary/AchievementDiary.java b/Server/src/main/java/core/game/node/entity/player/link/diary/AchievementDiary.java index 0b5917945..31966c45d 100644 --- a/Server/src/main/java/core/game/node/entity/player/link/diary/AchievementDiary.java +++ b/Server/src/main/java/core/game/node/entity/player/link/diary/AchievementDiary.java @@ -3,11 +3,15 @@ package core.game.node.entity.player.link.diary; import core.cache.def.impl.NPCDefinition; import core.game.component.Component; import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import rs09.game.node.entity.player.link.diary.DiaryLevel; import java.util.ArrayList; +import java.util.Arrays; /** * Represents an achievement diary. @@ -414,4 +418,150 @@ public class AchievementDiary { return levelRewarded; } + /** + * Removes the non-lamp reward item for the given level of the given type + * @param player the player to remove the reward from + * @param type the DiaryType: LUMBRIDGE, FALADOR, etc. + * @param level the diary level. 0-indexed. + * @return whether or not a reward was removed + */ + public static boolean removeRewardsFor(Player player, DiaryType type, int level) { + Item[] rewards = type.getRewards(level); + //lamps are always the 2nd reward for a level, don't remove lamps + boolean hasRemoved = + player.getInventory().remove(rewards[0]) + ||player.getBank().remove(rewards[0]) + ||player.getEquipment().remove(rewards[0]); + + if (hasRemoved) { + player.debug("Removed previous reward"); + } + + return hasRemoved; + } + + /** + * Adds all rewards for the given level of the given type (including lamps) + * Will return false if the player can't fit all the items in their inventory. + * @param player the player to grant the items to + * @param type the DiaryType: LUMBRIDGE, FALADOR, etc. + * @param level the diary level. 0-indexed. + * @return whether or not we successfully added the reward items to the player's inventory. + */ + public static boolean addRewardsFor(Player player, DiaryType type, int level) { + Item[] rewards = type.getRewards(level); + + int freeSlots = player.getInventory().freeSlots(); + if (freeSlots < rewards.length) + return false; + + boolean allRewarded = true; + for (Item reward : rewards) { + allRewarded &= player.getInventory().add(reward); + } + + if (!allRewarded) { + Arrays.stream(rewards).forEach((item) -> { + boolean _ignored = player.getInventory().remove(item); + }); + } + + return allRewarded; + } + + /** + * Convenience method. Flags a level as complete, removes previous level's reward item, then adds new reward items. + * @param player the player to flag completion for + * @param type the DiaryType: LUMBRIDGE, FALADOR, etc. + * @param level the diary level. 0-indexed. + */ + public static boolean flagRewarded(Player player, DiaryType type, int level) { + if (level > 0) { + removeRewardsFor(player, type, level - 1); + } + if (addRewardsFor(player, type, level)) + player.getAchievementDiaryManager().getDiary(type).setLevelRewarded(level); + else { + player.sendMessage("You do not have enough space in your inventory to claim these rewards."); + return false; + } + + return true; + } + + /** + * Determines if a replacement reward can be given for the particular diary and level. + * Checks to make sure the player has completed the level and claimed the rewards, and has not completed + * the next diary level. + * @param player the player to check + * @param type the DiaryType: LUMBRIDGE, FALADOR, etc. + * @param level the diary level. 0-indexed. + * @return whether or not a replacement can be granted. + */ + public static boolean canReplaceReward(Player player, DiaryType type, int level) { + Item reward = type.getRewards(level)[0]; + return hasCompletedLevel(player, type, level) + && !hasCompletedLevel(player, type, level + 1) + && hasClaimedLevelRewards(player, type, level) + && !player.hasItem(reward); + } + + /** + * Grants the replacement for the given level provided the player is eligible. + * Does not refund lamps. + * @param player the player to grant the reward to + * @param type the DiaryType: LUMBRIDGE, FALADOR, etc. + * @param level the diary level, 0-indexed + * @return whether or not the player was granted the replacement + */ + public static boolean grantReplacement(Player player, DiaryType type, int level) { + Item reward = type.getRewards(level)[0]; //Can only replace non-lamp reward + return canReplaceReward(player, type, level) && player.getInventory().add(reward); + } + + /** + * Checks if a player has completed the given level of the given diary. + * @param player the player to check + * @param type the DiaryType: LUMBRIDGE, FALADOR, etc. + * @param level the level to check, 0-indexed + * @return whether or not the player has completed the level. + */ + public static boolean hasCompletedLevel(Player player, DiaryType type, int level) { + if (level > type.getLevelNames().length - 1) + return false; + return player.getAchievementDiaryManager().getDiary(type).isComplete(level, true); + } + + /** + * Checks if a player has claimed the rewards for the given level of the given diary + * @param player the player to check + * @param type the DiaryType: LUMBRIDGE, FALADOR, etc. + * @param level the level te check + * @return whether or not the player has claimed the rewards + */ + public static boolean hasClaimedLevelRewards(Player player, DiaryType type, int level) { + return player.getAchievementDiaryManager().getDiary(type).isLevelRewarded(level); + } + + /** + * Checks if a player can claim the rewards for the given level of the given diary + * Checks to make sure the player hasn't completed the next level. + * @param player the player to check + * @param type the DiaryType: LUMBRIDGE, FALADOR, etc. + * @param level the level to check + * @return whether or not the player can claim the rewards + */ + public static boolean canClaimLevelRewards(Player player, DiaryType type, int level) { + return !hasCompletedLevel(player, type, level + 1) && hasCompletedLevel(player, type, level) && !hasClaimedLevelRewards(player, type, level); + } + + /** + * Fetches the rewards for a given diary at the given level. + * @param type the DiaryType: LUMBRIDGE, FALADOR, etc. + * @param level the level, 0-indexed. + * @return an array of the reward items for that level. Includes lamps. The non-lamp reward is always index 0. + */ + public static Item[] getRewards(DiaryType type, int level) { + return type.getRewards(level); + } } diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java index ca6965183..e6f4e843a 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java @@ -61,11 +61,6 @@ public final class SlayerMasterDialogue extends DialoguePlugin { */ private Quest quest; - /** - * The achievement diary. - */ - private AchievementDiary diary; - /** * If we're chatting about our diary. */ @@ -135,9 +130,6 @@ public final class SlayerMasterDialogue extends DialoguePlugin { stage++; break; case 0: - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); - } switch (buttonId) { case 1: player("What is the Achievement Diary?"); @@ -166,10 +158,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin { stage++; break; case 442: - diary.setLevelRewarded(level); - for (Item i : diary.getType().getRewards(level)) { - player.getInventory().add(i, player); - } + AchievementDiary.grantReplacement(player, DiaryType.VARROCK, level); npc("I'm happy to say that you've done well, so I will reward", "you suitably for your work."); stage++; break; @@ -182,7 +171,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin { stage++; break; case 450: - player.getInventory().add(diary.getType().getRewards(2)[0], player); + AchievementDiary.grantReplacement(player, DiaryType.VARROCK, level); npc("You better be more careful this time."); stage = 41; break; @@ -690,15 +679,12 @@ public final class SlayerMasterDialogue extends DialoguePlugin { */ private void sendDiaryDialogue() { isDiary = true; - if (diary == null) { - diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); - } - if (diary.isComplete(level) && !diary.isLevelRewarded(level)) { + if (AchievementDiary.canClaimLevelRewards(player, DiaryType.VARROCK, level)) { player("I've completed all the hard tasks in my Varrock", "Achievement Diary and, let me tell you, it wasn't an", "easy job."); stage = 440; return; } - if (diary.isLevelRewarded(level) && diary.isComplete(level) && !player.hasItem(diary.getType().getRewards(level)[0])) { + if (AchievementDiary.canReplaceReward(player, DiaryType.VARROCK, level)) { player("I've seemed to have lost my armour..."); stage = 460; return; diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/dialogues/NedDiaryDialogue.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/dialogues/NedDiaryDialogue.kt index 844bc2d5c..9ef788131 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/dialogues/NedDiaryDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/dialogues/NedDiaryDialogue.kt @@ -1,19 +1,19 @@ package rs09.game.node.entity.player.link.diary.dialogues +import core.game.node.entity.player.link.diary.AchievementDiary import core.game.node.entity.player.link.diary.DiaryType import rs09.game.content.dialogue.DialogueFile class NedDiaryDialogue : DialogueFile() { override fun handle(componentID: Int, buttonID: Int) { - val diary = player!!.achievementDiaryManager.getDiary(DiaryType.LUMBRIDGE) val level = 2 when(stage) { 0 -> { - if (diary.isComplete(level, true) && !diary.isLevelRewarded(level)) { + if (AchievementDiary.canClaimLevelRewards(player, DiaryType.LUMBRIDGE, level)) { player("I've done all the medium tasks in my Lumbridge", "Achievement Diary.") stage = 50 } - else if (diary.isLevelRewarded(level) && diary.isComplete(level, true) && !player!!.hasItem(diary.type.getRewards(level)[0])) { + else if (AchievementDiary.canReplaceReward(player, DiaryType.LUMBRIDGE, level)) { player("I've seemed to have lost my explorer's ring...") stage = 60 } @@ -106,10 +106,7 @@ class NedDiaryDialogue : DialogueFile() { stage++ } 52 -> { - diary.setLevelRewarded(level) - for (i in diary.type.getRewards(level)) { - player!!.inventory.add(i, player) - } + AchievementDiary.grantReplacement(player, DiaryType.LUMBRIDGE, level) npc("This ring is a representation of the adventures you", "went on to complete your tasks.") stage++ } @@ -118,7 +115,7 @@ class NedDiaryDialogue : DialogueFile() { stage = 0 } 60 -> { - player!!.inventory.add(diary.type.getRewards(level)[0], player) + AchievementDiary.grantReplacement(player, DiaryType.LUMBRIDGE, level); npc("You better be more careful this time.") stage = 0 } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/dialogues/RatBurgissDiaryDialogue.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/dialogues/RatBurgissDiaryDialogue.kt index 2423210ac..3badca882 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/dialogues/RatBurgissDiaryDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/dialogues/RatBurgissDiaryDialogue.kt @@ -4,6 +4,7 @@ import api.addItemOrDrop import api.getAttribute import api.setAttribute import core.game.content.dialogue.FacialExpression +import core.game.node.entity.player.link.diary.AchievementDiary import core.game.node.entity.player.link.diary.DiaryType import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.IfTopic @@ -12,17 +13,16 @@ import rs09.tools.END_DIALOGUE class RatBurgissDiaryDialogue : DialogueFile() { override fun handle(componentID: Int, buttonID: Int) { - val diary = player!!.achievementDiaryManager.getDiary(DiaryType.VARROCK) - val easyDiaryComplete = diary.isComplete(0) + val easyDiaryComplete = AchievementDiary.hasCompletedLevel(player, DiaryType.VARROCK, 0) val alternateTeleport = getAttribute(player!!, "diaries:varrock:alttele", false) when(stage) { 0 -> { - if (easyDiaryComplete && !diary.isLevelRewarded(0)) { + if (AchievementDiary.canClaimLevelRewards(player, DiaryType.VARROCK, 0)) { playerl(FacialExpression.FRIENDLY, "I think I've finished all of the tasks in my Varrock Achievement Diary.") stage = 40 return } - else if (diary.isLevelRewarded(0) && !player!!.hasItem(diary.type.getRewards(0)[0])) { + else if (AchievementDiary.canReplaceReward(player, DiaryType.VARROCK, 0)) { playerl(FacialExpression.ANNOYED, "I seem to have lost my armor.") stage = 50 return @@ -50,8 +50,7 @@ class RatBurgissDiaryDialogue : DialogueFile() { 41 -> playerl(FacialExpression.FRIENDLY, "Thank you. Uh... can I have the reward?").also { stage++ } 42 -> npcl(FacialExpression.FRIENDLY, "Reward? Ah yes! Of course. Your reward, it's right here.").also { stage++ } 43 -> { - diary.setLevelRewarded(0) - diary.type.getRewards(0).forEach { addItemOrDrop(player!!, it.id, it.amount) } + AchievementDiary.flagRewarded(player, DiaryType.VARROCK, 0) npcl(FacialExpression.FRIENDLY, "Now, this body armour is magically enhanced to help you with your Smithing and Mining. There is a furnace, not far from here, in Edgeville. Use this armour there and, when smelting ores up to and") stage++ } @@ -63,7 +62,7 @@ class RatBurgissDiaryDialogue : DialogueFile() { 49 -> npcl(FacialExpression.FRIENDLY, "If you should lose this armour, come back and see me for another set.").also { stage = 0 } 50 -> { - addItemOrDrop(player!!, diary.type.getRewards(0)[0].id, 1) + AchievementDiary.grantReplacement(player, DiaryType.VARROCK, 0) npcl(FacialExpression.ANNOYED, "You better be more careful this time.").also { stage = END_DIALOGUE } }