Rewrote Rimmington

Enabled pickpocketing of Anja and Hengel
This commit is contained in:
thelemir
2024-06-08 12:13:21 +00:00
committed by Ryan
parent 2c3b5cb5a4
commit ca3bc9cd70
18 changed files with 566 additions and 845 deletions
@@ -10,7 +10,7 @@ import core.api.utils.WeightedItem
import java.util.stream.IntStream
enum class Pickpockets(val ids: IntArray, val requiredLevel: Int, val low: Double, val high: Double, val experience: Double, val stunDamageMin: Int, val stunDamageMax: Int, val stunTime: Int, val table: WeightBasedTable) {
MAN(intArrayOf(1, 2, 3, 4, 5, 6, 16, 24, 25, 170, 1086, 3224, 3915, 3226, 3227, 5924, 5923), 1, 180.0, 240.0, 8.0, 1, 1,5, WeightBasedTable.create(
MAN(intArrayOf(1, 2, 3, 4, 5, 6, 16, 24, 25, 170, 1086, 2683, 2684, 3224, 3915, 3226, 3227, 5924, 5923), 1, 180.0, 240.0, 8.0, 1, 1,5, WeightBasedTable.create(
WeightedItem(Items.COINS_995,3,3,1.0,true)
)),
FARMER(intArrayOf(7, 1757, 1758), 10, 180.0, 240.0, 14.5, 1,1,5, WeightBasedTable.create(
@@ -0,0 +1,87 @@
package content.region.asgarnia.rimmington.dialogue
import core.api.*
import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.entity.npc.NPC
import core.game.world.map.RegionManager
import core.tools.RandomFunction
import core.plugin.Initializable
import core.tools.END_DIALOGUE
import org.rs09.consts.Items
import org.rs09.consts.NPCs
/**
* Handles Anja's dialogue.
*/
@Initializable
class AnjaDialogue(player: Player? = null) : DialoguePlugin(player) {
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
player(FacialExpression.NEUTRAL, "Hello.").also { stage = 0 }
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
0 -> npcl(FacialExpression.ASKING, "Hello @g[sir,madam]. What are you doing in my house?").also { stage++ }
1 -> options("I'm just wandering around.", "I was hoping you'd give me some free stuff.", "I've come to kill you.").also { stage++ }
2 -> when (buttonId) {
1 -> playerl(FacialExpression.NEUTRAL, "I'm just wondering around.").also { stage = 10 }
2 -> playerl(FacialExpression.NEUTRAL, "I was hoping you'd give me some free stuff.").also { stage = 20 }
3 -> playerl(FacialExpression.ANGRY_WITH_SMILE, "I've come to kill you.").also { stage = 30 }
}
10 -> npcl(FacialExpression.NEUTRAL, "Oh dear, are you lost?").also { stage++ }
11 -> options("Yes, I'm lost.", "No, I know where I am.").also { stage++ }
12 -> when (buttonId) {
1 -> playerl(FacialExpression.NEUTRAL, "Yes, I'm lost.").also { stage = 13 }
2 -> playerl(FacialExpression.NEUTRAL, "No, I know where I am.").also { stage = 15 }
}
13 -> npcl(FacialExpression.FRIENDLY, "Okay, just walk north-east when you leave this house and soon you'll reach the big city of Falador.").also { stage++ }
14 -> playerl(FacialExpression.FRIENDLY, "Thanks a lot.").also { stage = END_DIALOGUE }
15 -> npcl(FacialExpression.ASKING, "Oh? Well, would you mind wandering somewhere else?").also { stage++ }
16 -> npcl(FacialExpression.NEUTRAL, "This is my house.").also { stage++ }
17 -> playerl(FacialExpression.NEUTRAL, "Meh!").also { stage = END_DIALOGUE }
20 -> {
val dialogues = arrayOf("Do you REALLY need it?", "I don't have much on me...", "I don't know...")
npcl(FacialExpression.NEUTRAL, dialogues[RandomFunction.random(0, 3)])
stage++
}
21 -> playerl(FacialExpression.ASKING, "I promise I'll stop bothering you!").also { stage++ }
22 -> playerl(FacialExpression.ASKING, "Pleeease!").also { stage++ }
23 -> playerl(FacialExpression.ASKING, "Pwetty pleathe wiv thugar on top!").also { stage++ }
24 -> {
npcl(FacialExpression.NEUTRAL, "Oh, alright. Here you go.")
addItemOrDrop(player, Items.COINS_995, RandomFunction.random(1, 3))
stage = END_DIALOGUE
}
30 -> {
stage = END_DIALOGUE
close()
val hengel = findLocalNPC(npc, NPCs.HENGEL_2683)
if(hengel != null)
sendChat(hengel, "Aaaaarrgh!")
sendChat(npc, "Eeeek!")
}
}
return true
}
override fun newInstance(player: Player?): DialoguePlugin {
return AnjaDialogue(player)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.ANJA_2684)
}
}
@@ -1,144 +0,0 @@
package content.region.asgarnia.rimmington.dialogue;
import core.game.dialogue.DialoguePlugin;
import core.game.dialogue.FacialExpression;
import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player;
import core.game.node.item.Item;
import core.game.world.map.RegionManager;
import core.plugin.Initializable;
import core.tools.RandomFunction;
/**
* Represents the dialogue plugin used for the anja npc.
* @author jamix77
*/
@Initializable
public final class AnjaDialoguePlugin extends DialoguePlugin {
/**
*
* Constructs a new @{Code AnjaDialoguePlugin} object.
*/
public AnjaDialoguePlugin() {
/**
* empty.
*/
}
/**
* Constructs a new {@code AjjatDialoguePlugin} {@code Object}.
* @param player the player.
*/
public AnjaDialoguePlugin(Player player) {
super(player);
}
@Override
public DialoguePlugin newInstance(Player player) {
return new AnjaDialoguePlugin(player);
}
@Override
public boolean open(Object... args) {
npc = (NPC) args[0];
player("Hello.");
stage = 0;
return true;
}
@Override
public boolean handle(int interfaceId, int buttonId) {
switch (stage) {
case 0:
npc("Hello sir. What are you doing in my house?");
stage = 1;
break;
case 1:
interpreter.sendOptions("Select an Option", "I'm just wandering around.", "I was hoping you'd give me some free stuff.", "I've come to kill you.");
stage = 2;
break;
case 2:
if (buttonId == 1) {
player("I'm just wondering around.");
stage = 3;
} else if (buttonId == 2) {
player("I was hoping you'd give me some free stuff.");
stage = 10;
} else if (buttonId == 3) {
player("I've come to kill you.");
stage = 13;
}
break;
case 3:
npc("Oh dear are you lost?");
stage++;
break;
case 4:
interpreter.sendOptions("Select an Option.", "Yes, I'm lost.", "No, I know where I am.");
stage++;
break;
case 5:
switch (buttonId) {
case 1:
player("Yes, I'm lost.");
stage =6;
break;
case 2:
player("No I know where I am.");
stage = 8;
break;
}
break;
case 6:
npc("Okay, just walk north-east when you leave this house,","and soon you'll reach the big city of Falador.");
stage++;
break;
case 7:
player("Thanks a lot.");
stage = 605;
break;
case 8:
npc("Oh? Well, would you mind wandering somewhere else?", "This is my house.");
stage++;
break;
case 9:
player("Meh!");
stage = 605;
break;
case 10:
String[] dialogues = {"Do you REALLY need it","I don't have much on me...", "I don't know..."};
npc(dialogues[RandomFunction.random(0, 2)]);
stage++;
break;
case 11:
interpreter.sendDialogues(player, FacialExpression.ASKING, "I promise I'll stop bothering you!", "Pleeease!","Pwetty pleathe wiv thugar on top!");
stage++;
break;
case 12:
npc("Oh, alright. Here you go.");
player.getInventory().add(new Item(995,RandomFunction.random(1, 3)));
stage = 605;
break;
case 13:
npc.sendChat("Eeeek!");
for (NPC npc1 : RegionManager.getLocalNpcs(player)) {
if (npc1.getName().equalsIgnoreCase("Hengel")) {
npc1.sendChat("Aaaaarrgh!");
break;
}
}
end();
break;
case 605:
end();
break;
}
return true;
}
@Override
public int[] getIds() {
return new int[] { 2684 };
}
}
@@ -1,81 +0,0 @@
package content.region.asgarnia.rimmington.dialogue;
import core.game.dialogue.DialoguePlugin;
import core.game.dialogue.FacialExpression;
import core.game.node.entity.npc.NPC;
import core.plugin.Initializable;
import core.game.node.entity.player.Player;
/**
* Represents the dialogue plugin used to handle the brain archery npc.
* @author 'Vexia
* @version 1.0
*/
@Initializable
public final class BrianArcheryDialogue extends DialoguePlugin {
/**
* Constructs a new {@code BrianArcheryDialogue} {@code Object}.
*/
public BrianArcheryDialogue() {
/**
* empty.
*/
}
/**
* Constructs a new {@code BrianArcheryDialogue} {@code Object}.
* @param player the player.
*/
public BrianArcheryDialogue(Player player) {
super(player);
}
@Override
public DialoguePlugin newInstance(Player player) {
return new BrianArcheryDialogue(player);
}
@Override
public boolean open(Object... args) {
npc = (NPC) args[0];
interpreter.sendDialogues(npc, FacialExpression.HAPPY, "Would you like to buy some archery equipment?");
stage = 0;
return true;
}
@Override
public boolean handle(int interfaceId, int buttonId) {
switch (stage) {
case 0:
interpreter.sendOptions("Select an Option", "No thanks, I've got all the archery equipment I need.", "Let's see what you've got, then.");
stage = 1;
break;
case 1:
switch (buttonId) {
case 1:
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks, I've got all the archery equipment I need.");
stage = 10;
break;
case 2:
end();
npc.openShop(player);
break;
}
break;
case 10:
interpreter.sendDialogues(npc, FacialExpression.FRIENDLY, "Okay. Fare well on your travels.");
stage = 11;
break;
case 11:
end();
break;
}
return true;
}
@Override
public int[] getIds() {
return new int[] { 1860 };
}
}
@@ -0,0 +1,47 @@
package content.region.asgarnia.rimmington.dialogue
import core.api.openNpcShop
import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.entity.npc.NPC
import core.plugin.Initializable
import core.tools.END_DIALOGUE
import org.rs09.consts.NPCs
/**
* Handles the BrianArchery's dialogue.
*/
@Initializable
class BrianArcheryDialogue(player: Player? = null) : DialoguePlugin(player) {
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
npcl(FacialExpression.HAPPY, "Would you like to buy some archery equipment?").also { stage = 0 }
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
0 -> options("Let's see what you've got, then.", "No thanks, I've got all the archery equipment I need.").also { stage++ }
1 -> when (buttonId) {
1 -> end().also { openNpcShop(player, npc.id) }
2 -> playerl(FacialExpression.HALF_GUILTY, "No thanks, I've got all the archery equipment I need.").also { stage = 10 }
}
10 -> {
npcl(FacialExpression.FRIENDLY, "Okay. Fare well on your travels.")
stage = END_DIALOGUE
}
}
return true
}
override fun newInstance(player: Player?): DialoguePlugin {
return BrianArcheryDialogue(player)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.BRIAN_1860)
}
}
@@ -0,0 +1,67 @@
package content.region.asgarnia.rimmington.dialogue
import core.api.findLocalNPC
import core.api.sendChat
import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.entity.npc.NPC
import core.game.world.map.RegionManager
import core.plugin.Initializable
import core.tools.END_DIALOGUE
import org.rs09.consts.NPCs
/**
* Handles the Hengel's dialogue.
*/
@Initializable
class HengelDialogue(player: Player? = null) : DialoguePlugin(player) {
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
playerl(FacialExpression.NEUTRAL, "Hello.").also { stage = 0 }
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
0 -> npcl(FacialExpression.ASKING, "What are you doing here?").also { stage++ }
1 -> options("I'm just wandering around.", "I was hoping you'd give me some free stuff.", "I've come to kill you.").also { stage++ }
2 -> when (buttonId) {
1 -> playerl(FacialExpression.NEUTRAL, "I'm just wondering around.").also { stage = 10 }
2 -> playerl(FacialExpression.NEUTRAL, "I was hoping you'd give me some free stuff.").also { stage = 20 }
3 -> playerl(FacialExpression.ANGRY_WITH_SMILE, "I've come to kill you.").also { stage = 30 }
}
10 -> npcl(FacialExpression.ASKING, "You do realise you're wandering around in my house?").also { stage++ }
11 -> playerl(FacialExpression.NEUTRAL, "Yep.").also { stage++ }
12 -> npcl(FacialExpression.ANNOYED, "Well please get out!").also { stage++ }
13 -> playerl(FacialExpression.NEUTRAL, "Sheesh, keep your wig on!").also { stage = END_DIALOGUE }
20 -> npcl(FacialExpression.ANNOYED, "No, I jolly well wouldn't!").also { stage++ }
21 -> npcl(FacialExpression.ANNOYED, "Get out of my house!").also { stage++ }
22 -> playerl(FacialExpression.NEUTRAL, "Meanie!").also { stage = END_DIALOGUE }
30 -> {
stage = END_DIALOGUE
close()
val anja = findLocalNPC(npc, NPCs.ANJA_2684)
if(anja != null)
sendChat(anja, "Eeeek!")
sendChat(npc, "Aaaaarrgh!")
}
}
return true
}
override fun newInstance(player: Player?): DialoguePlugin {
return HengelDialogue(player)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.HENGEL_2683)
}
}
@@ -1,115 +0,0 @@
package content.region.asgarnia.rimmington.dialogue;
import core.game.dialogue.DialoguePlugin;
import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player;
import core.game.world.map.RegionManager;
import core.plugin.Initializable;
/**
* Represents the dialogue plugin used for the hengel npc.
* @author jamix77
*/
@Initializable
public final class HengelDialoguePlugin extends DialoguePlugin {
/**
*
* Constructs a new @{Code HengelDialoguePlugin} object.
*/
public HengelDialoguePlugin() {
/**
* empty.
*/
}
/**
* Constructs a new {@code AjjatDialoguePlugin} {@code Object}.
* @param player the player.
*/
public HengelDialoguePlugin(Player player) {
super(player);
}
@Override
public DialoguePlugin newInstance(Player player) {
return new HengelDialoguePlugin(player);
}
@Override
public boolean open(Object... args) {
npc = (NPC) args[0];
player("Hello.");
stage = 0;
return true;
}
@Override
public boolean handle(int interfaceId, int buttonId) {
switch (stage) {
case 0:
npc("What are you doing here?");
stage = 1;
break;
case 1:
interpreter.sendOptions("Select an Option", "I'm just wandering around.", "I was hoping you'd give me some free stuff.", "I've come to kill you.");
stage = 2;
break;
case 2:
if (buttonId == 1) {
player("I'm just wondering around.");
stage = 3;
} else if (buttonId == 2) {
player("I was hoping you'd give me some free stuff.");
stage = 7;
} else if (buttonId == 3) {
player("I've come to kill you.");
stage = 9;
}
break;
case 3:
npc("You do realise you're wandering around in my house?");
stage++;
break;
case 4:
player("Yep.");
stage++;
break;
case 5:
npc("Well please get out!");
stage++;
break;
case 6:
player("Sheesh, keep your wig on!");
stage = 605;
break;
case 7:
npc("No, I jolly well wouldn't!","Get out of my house");
stage++;
break;
case 8:
player("Meanie!");
stage = 605;
break;
case 9:
npc.sendChat("Aaaaarrgh!");
for (NPC npc1 : RegionManager.getLocalNpcs(player)) {
if (npc1.getName().equalsIgnoreCase("anja")) {
npc1.sendChat("Eeeek!");
break;
}
}
end();
break;
case 605:
end();
break;
}
return true;
}
@Override
public int[] getIds() {
return new int[] { 2683 };
}
}
@@ -1,226 +0,0 @@
package content.region.asgarnia.rimmington.dialogue;
import core.game.dialogue.DialoguePlugin;
import core.game.dialogue.FacialExpression;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.quest.Quest;
import core.plugin.Initializable;
import core.game.node.item.Item;
/**
* Represents the dialogue plugin used for the hetty npc.
* @author 'Vexia
* @version 1.0
*/
@Initializable
public final class HettyDialogue extends DialoguePlugin {
/**
* Constructs a new {@code HettyDialogue} {@code Object}.
*/
public HettyDialogue() {
/**
* empty.
*/
}
/**
* Constructs a new {@code HettyDialogue} {@code Object}.
* @param player the player.
*/
public HettyDialogue(Player player) {
super(player);
}
@Override
public DialoguePlugin newInstance(Player player) {
return new HettyDialogue(player);
}
@Override
public boolean open(Object... args) {
Quest quest = player.getQuestRepository().getQuest("Witch's Potion");
if (quest.isCompleted(player)) {
interpreter.sendDialogues(307, FacialExpression.ASKING, "How's your magic coming along?");
stage = 0;
}
switch (quest.getStage(player)) {
case 0:
interpreter.sendDialogues(307, FacialExpression.NEUTRAL, "What could you want with an old woman like me?");
stage = 11;
break;
case 20:
interpreter.sendDialogues(307, FacialExpression.HAPPY, "So have you found the things for the potion?");
stage = 100;
break;
case 40:
if (args.length == 2) {
interpreter.sendDialogue("You drink from the cauldron, it tastes horrible! You feel yourself", "imbued with power.");
stage = 41;
} else {
interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Well are you going to drink the potion or not?");
stage = 500;
}
break;
}
return true;
}
@Override
public boolean handle(int interfaceId, int buttonId) {
Quest quest = player.getQuestRepository().getQuest("Witch's Potion");
switch (stage) {
case 0:
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm practicing and slowly getting better.");
stage = 1;
break;
case 1:
interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Good, good.");
stage = 2;
break;
case 2:
end();
break;
case 11:
interpreter.sendOptions("Select an Option", "I am in search of a quest.", "I've heard that you are a witch.");
stage = 12;
break;
case 12:
switch (buttonId) {
case 1:
interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "I am in search of a quest.");
stage = 13;
break;
case 2:
interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "I've heard that you are a witch.");
stage = 20;
break;
}
break;
case 13:
interpreter.sendDialogues(307, FacialExpression.HAPPY, "Hmmm... Maybe I can think of something for you.");
stage = 14;
break;
case 14:
interpreter.sendDialogues(307, FacialExpression.HAPPY, "Would you like to become more proficient in the dark", "arts?");
stage = 15;
break;
case 15:
interpreter.sendOptions("Select an Option", "Yes help me become one with my darker side.", "No I have my principles and honour.");
stage = 16;
break;
case 16:
switch (buttonId) {
case 1:
interpreter.sendDialogues(player, FacialExpression.HAPPY, "Yes help me become one with my darker side.");
stage = 30;
break;
case 2:
interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "No I have my principles and honour.");
stage = 17;
break;
}
break;
case 17:
interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Suit yourself, but you're missing out.");
stage = 18;
break;
case 18:
end();
break;
case 20:
interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Yes it does seem to be getting fairly common", "knowledge.");
stage = 21;
break;
case 21:
interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "I fear I may get a visit from the witch hunter of", "Falador before long.");
stage = 22;
break;
case 22:
end();
break;
case 30:
interpreter.sendDialogues(307, FacialExpression.NEUTRAL, "Ok I'm going to make a potion to help bring out your", "darker self.");
stage = 31;
break;
case 31:
interpreter.sendDialogues(307, FacialExpression.NEUTRAL, "You will need certain ingredients.");
stage = 32;
break;
case 32:
interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "What do I need?");
stage = 33;
break;
case 33:
interpreter.sendDialogues(307, FacialExpression.NEUTRAL, "You need an eye of newt, a rat's tail, and onion... Oh", "and a piece of burnt meat.");
stage = 34;
break;
case 34:
interpreter.sendDialogues(player, FacialExpression.HAPPY, "Great, I'll go get them.");
stage = 35;
break;
case 35:
quest.start(player);
quest.setStage(player, 20);
end();
break;
case 100:
// Her:Well I can't make the potion without them!
// Remember.../You
// need an eye of newt, a rat's tail, an onion, and a/piece of
// burnt
// meat. Off you go dear! Me:end();
if (!player.getInventory().containItems(1957, 300, 2146, 221)) {
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm afraid I don't have all of them yet.");
stage = 101;
} else {
interpreter.sendDialogues(player, FacialExpression.HAPPY, "Yes I have everything!");
stage = 110;
}
break;
case 110:
interpreter.sendDialogues(307, FacialExpression.HAPPY, "Excellent, can I have them then?");
stage = 111;
break;
case 111:
interpreter.sendDialogue("You pass the ingredients to Hetty and she puts them all into her", "cauldron. Hetty closes her eyes and begins to chant. The cauldron", "bubbles mysteriously.");
stage = 112;
break;
case 112:
interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "Well, is it ready?");
stage = 113;
break;
case 113:
if (player.getInventory().remove(new Item(1957), new Item(300), new Item(2146), new Item(221))) {
quest.setStage(player, 40);
interpreter.sendDialogues(307, FacialExpression.HAPPY, "Ok, now drink from the cauldron.");
stage = 114;
}
break;
case 114:
end();
break;
case 101:
interpreter.sendDialogues(307, FacialExpression.NEUTRAL, "Well I can't make the potion without them! Remember...", "You need an eye of newt, a rat's tail, an onion, and a", "piece of burnt meat. Off you go dear!");
stage = 102;
break;
case 102:
end();
break;
case 500:
end();
break;
case 41:
end();
quest.finish(player);
player.getQuestRepository().syncronizeTab(player);
break;
}
return true;
}
@Override
public int[] getIds() {
return new int[] { 307 };
}
}
@@ -0,0 +1,83 @@
package content.region.asgarnia.rimmington.dialogue
import content.region.asgarnia.rimmington.quest.witchpotion.HettyWitchsPotionDialogue
import content.region.asgarnia.rimmington.quest.witchpotion.WitchsPotion
import core.api.*
import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.entity.npc.NPC
import core.plugin.Initializable
import core.tools.END_DIALOGUE
import org.rs09.consts.NPCs
/**
* Handles the Hetty's dialogue.
*/
@Initializable
class HettyDialogue(player: Player? = null) : DialoguePlugin(player) {
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
val questStage = getQuestStage(player, WitchsPotion.QUEST_NAME)
when(questStage) {
0 -> npcl(FacialExpression.NEUTRAL, "What could you want with an old woman like me?").also { stage = 0 }
in 1..99 -> openDialogue(player, HettyWitchsPotionDialogue(questStage), npc)
else -> npcl(FacialExpression.ASKING, "How's your magic coming along?").also { stage = 30 }
}
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
0 -> options("I am in search of a quest.", "I've heard that you are a witch.").also { stage++ }
1 -> when (buttonId) {
1 -> playerl(FacialExpression.NEUTRAL, "I am in search of a quest.").also { stage = 10 }
2 -> playerl(FacialExpression.NEUTRAL, "I've heard that you are a witch.").also { stage = 20 }
}
10 -> npcl(FacialExpression.HAPPY, "Hmmm... Maybe I can think of something for you.").also { stage++ }
11 -> npcl(FacialExpression.HAPPY, "Would you like to become more proficient in the dark arts?").also { stage++ }
12 -> options("Yes help me become one with my darker side.", "No I have my principles and honour.", "What, you mean improve my magic?").also { stage++ }
13 -> when (buttonId) {
1 -> playerl(FacialExpression.HAPPY, "Yes help me become one with my darker side.").also { stage = 14 }
2 -> playerl(FacialExpression.NEUTRAL, "No I have my principles and honour.").also { stage = 15 }
3 -> playerl(FacialExpression.ASKING, "What, you mean improve my magic?").also { stage = 40 }
}
14 -> openDialogue(player, HettyWitchsPotionDialogue(0), npc)
15 -> npcl(FacialExpression.HALF_GUILTY, "Suit yourself, but you're missing out.").also { stage = END_DIALOGUE }
20 -> npcl(FacialExpression.HALF_GUILTY, "Yes it does seem to be getting fairly common knowledge").also { stage++ }
21 -> npcl(FacialExpression.HALF_GUILTY, "I fear I may get a visit from the witch hunter of Falador before long.").also { stage = END_DIALOGUE }
30 -> playerl(FacialExpression.HALF_GUILTY, "I'm practicing and slowly getting better.").also { stage++ }
31 -> npcl(FacialExpression.HALF_GUILTY, "Good, good.").also { stage = END_DIALOGUE }
40 -> sendDialogue("The witch sighs.").also { stage++ }
41 -> npcl(FacialExpression.ANNOYED, "Yes, improve your magic...").also { stage++ }
42 -> npcl(FacialExpression.ASKING, "Do you have no sense of drama?").also { stage++ }
43 -> options("Yes I'd like to improve my magic.", "No I'm not interested.", "Show me the mysteries of the dark arts...").also { stage++ }
44 -> when(buttonId) {
// TODO: Find authentic source for dialogue option
1 -> playerl(FacialExpression.NEUTRAL, "Yes I'd like to improve my magic.").also { stage = 14 }
// TODO: Find authentic source for dialogue option
2 -> playerl(FacialExpression.NEUTRAL, "No I'm not interested.").also { stage = 15 }
3 -> playerl(FacialExpression.NEUTRAL, "Show me the mysteries of the dark arts...").also { stage++ }
}
45 -> sendDialogue("The witch smiles mysteriously.").also { stage = 14 }
}
return true
}
override fun newInstance(player: Player?): DialoguePlugin {
return HettyDialogue(player)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.HETTY_307)
}
}
@@ -1,74 +0,0 @@
package content.region.asgarnia.rimmington.dialogue;
import core.game.dialogue.DialoguePlugin;
import core.game.dialogue.FacialExpression;
import core.game.node.entity.npc.NPC;
import core.plugin.Initializable;
import core.game.node.entity.player.Player;
/**
* Handles the RimmingtonShopKeeperDialogue dialogue.
* @author 'Vexia
*/
@Initializable
public class RimmingtonShopKeeperDialogue extends DialoguePlugin {
public RimmingtonShopKeeperDialogue() {
}
public RimmingtonShopKeeperDialogue(Player player) {
super(player);
}
@Override
public int[] getIds() {
return new int[] { 531, 530 };
}
@Override
public boolean handle(int interfaceId, int buttonId) {
switch (stage) {
case 0:
interpreter.sendOptions("Select an Option", "Yes, please. What are you selling?", "How should I use your shop?", "No, thanks.");
stage = 1;
break;
case 1:
switch (buttonId) {
case 1:
end();
npc.openShop(player);
break;
case 2:
interpreter.sendDialogues(npc, FacialExpression.HAPPY, "I'm glad you ask! You can buy as many of the items", "stocked as you wish. You can also sell most items to the", "shop.");
stage = 10;
break;
case 3:
end();
break;
}
break;
case 10:
end();
break;
}
return true;
}
@Override
public DialoguePlugin newInstance(Player player) {
return new RimmingtonShopKeeperDialogue(player);
}
@Override
public boolean open(Object... args) {
npc = (NPC) args[0];
interpreter.sendDialogues(npc, FacialExpression.HAPPY, "Can I help you at all?");
stage = 0;
return true;
}
}
@@ -0,0 +1,44 @@
package content.region.asgarnia.rimmington.dialogue
import core.api.openNpcShop
import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.entity.npc.NPC
import core.plugin.Initializable
import core.tools.END_DIALOGUE
import org.rs09.consts.NPCs
/**
* Handles the RimmingtonShopKeeper dialogue.
*/
@Initializable
class RimmingtonShopKeeperDialogue(player: Player? = null) : DialoguePlugin(player) {
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
npcl(FacialExpression.HAPPY, "Can I help you at all?").also { stage = 0 }
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
0 -> options("Yes, please. What are you selling?", "How should I use your shop?", "No, thanks.").also { stage++ }
1 -> when (buttonId) {
1 -> end().also { openNpcShop(player, npc.id) }
2 -> npcl(FacialExpression.HAPPY, "I'm glad you ask! You can buy as many of the items stocked as you wish. You can also sell most items to the shop.").also { stage = END_DIALOGUE }
3 -> end()
}
}
return true
}
override fun newInstance(player: Player?): DialoguePlugin {
return RimmingtonShopKeeperDialogue(player)
}
override fun getIds(): IntArray = intArrayOf(
NPCs.SHOPKEEPER_530,
NPCs.SHOP_ASSISTANT_531
)
}
@@ -0,0 +1,48 @@
package content.region.asgarnia.rimmington.dialogue
import core.api.openNpcShop
import core.game.dialogue.DialoguePlugin
import core.game.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.entity.npc.NPC
import core.plugin.Initializable
import core.tools.END_DIALOGUE
import org.rs09.consts.NPCs
/**
* Handles the Rommik's dialogue.
*/
@Initializable
class RommikDialogue(player: Player? = null) : DialoguePlugin(player) {
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
npcl(FacialExpression.HAPPY, "Would you like to buy some crafting equipment?").also { stage = 0 }
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
0 -> options("Let's see what you've got, then.", "No thanks, I've got all the crafting equipment I need.").also { stage++ }
1 -> when (buttonId) {
1 -> end().also { openNpcShop(player, npc.id) }
2 -> playerl(FacialExpression.HALF_GUILTY, "No thanks, I've got all the crafting equipment I need.").also { stage = 10 }
}
10 -> {
npcl(FacialExpression.FRIENDLY, "Okay. Fare well on your travels.")
stage = END_DIALOGUE
}
}
return true
}
override fun newInstance(player: Player?): DialoguePlugin {
return RommikDialogue(player)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.ROMMIK_585)
}
}
@@ -1,73 +0,0 @@
package content.region.asgarnia.rimmington.dialogue;
import core.game.dialogue.DialoguePlugin;
import core.game.dialogue.FacialExpression;
import core.game.node.entity.npc.NPC;
import core.plugin.Initializable;
import core.game.node.entity.player.Player;
/**
* Handles the RoomikDialogue dialogue.
* @author 'Vexia
*/
@Initializable
public class RoomikDialogue extends DialoguePlugin {
public RoomikDialogue() {
}
public RoomikDialogue(Player player) {
super(player);
}
@Override
public int[] getIds() {
return new int[] { 585 };
}
@Override
public boolean handle(int interfaceId, int buttonId) {
switch (stage) {
case 0:
interpreter.sendOptions("Choose an option:", "Let's see what you've got, then.", "No thanks, I've got all the crafting equipment I need.");
stage = 1;
break;
case 1:
switch (buttonId) {
case 1:
end();
npc.openShop(player);
break;
case 2:
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I've got all the crafting equipment I need.");
stage = 20;
break;
}
break;
case 20:
interpreter.sendDialogues(npc, FacialExpression.FRIENDLY, "Okay. Fare well on your travels.");
stage = 21;
break;
case 21:
end();
break;
}
return true;
}
@Override
public DialoguePlugin newInstance(Player player) {
return new RoomikDialogue(player);
}
@Override
public boolean open(Object... args) {
npc = (NPC) args[0];
interpreter.sendDialogues(npc, FacialExpression.HAPPY, "Would you like to buy some Crafting equipment?");
stage = 0;
return true;
}
}
@@ -0,0 +1,76 @@
package content.region.asgarnia.rimmington.quest.witchpotion
import core.api.*
import core.game.dialogue.DialogueFile
import core.game.dialogue.FacialExpression
import core.game.node.item.Item
import core.game.node.entity.player.Player
import core.tools.END_DIALOGUE
import org.rs09.consts.Items
/**
* Handles Hetty's dialogue for the Witch's Potion Quest.
*/
class HettyWitchsPotionDialogue(private val dStage: Int) : DialogueFile() {
override fun handle(componentID: Int, buttonID: Int) {
when (dStage) {
0 -> handleQuestStartDialogue(player)
20 -> handleGiveItemsDialogue(player)
40 -> npcl(FacialExpression.ANNOYED, "Well are you going to drink the potion or not?").also { stage = END_DIALOGUE }
}
}
private fun handleQuestStartDialogue(player: Player?) {
player ?: return
when (stage) {
0 -> npcl(FacialExpression.HAPPY, "Ok I'm going to make a potion to help bring out your darker self.").also { stage++ }
1 -> npcl(FacialExpression.NEUTRAL, "You will need certain ingredients.").also { stage++ }
2 -> playerl(FacialExpression.NEUTRAL, "What do I need?").also { stage++ }
3 -> npcl(FacialExpression.NEUTRAL, "You need an eye of newt, a rat's tail, an onion... Oh and a piece of burnt meat.").also { stage++ }
4 -> {
playerl(FacialExpression.HAPPY, "Great, I'll go and get them.")
startQuest(player, WitchsPotion.QUEST_NAME)
setQuestStage(player, WitchsPotion.QUEST_NAME, 20)
stage = END_DIALOGUE
}
}
}
private fun handleGiveItemsDialogue(player: Player?) {
player ?: return
when (stage) {
0 -> npcl(FacialExpression.HAPPY, "So have you found the things for the potion?").also { stage++ }
1 -> {
if (inInventory(player, Items.ONION_1957, 1) &&
inInventory(player, Items.RATS_TAIL_300, 1) &&
inInventory(player, Items.BURNT_MEAT_2146, 1) &&
inInventory(player, Items.EYE_OF_NEWT_221, 1)) {
playerl(FacialExpression.HAPPY, "Yes I have everything!").also { stage = 20 }
} else {
playerl(FacialExpression.HALF_GUILTY, "I'm afraid I don't have all of them yet.").also { stage = 10 }
}
}
10 -> npcl(FacialExpression.ANNOYED, "Well I can't make the potion without them! Remember...").also { stage++ }
11 -> npcl(FacialExpression.NEUTRAL, "You need an eye of newt, a rat's tail, an onion, and a piece of burnt meat.").also { stage++ }
12 -> npcl(FacialExpression.FRIENDLY, "Off you go dear!").also { stage = END_DIALOGUE }
20 -> npcl(FacialExpression.HAPPY, "Excellent, can I have them then?").also { stage++ }
21 -> sendDialogue(player, "You pass the ingredients to Hetty and she puts them all into her cauldron. Hetty closes her eyes and begins to chant. The cauldron bubbles mysteriously.").also { stage++ }
22 -> playerl(FacialExpression.NEUTRAL, "Well, is it ready?").also { stage++ }
23 -> {
// Removing the items at this stage is authentic behavior
if (removeItem(player, Item(Items.ONION_1957, 1)) &&
removeItem(player, Item(Items.RATS_TAIL_300, 1)) &&
removeItem(player, Item(Items.BURNT_MEAT_2146, 1)) &&
removeItem(player, Item(Items.EYE_OF_NEWT_221, 1))) {
npcl(FacialExpression.HAPPY, "Ok, now drink from the cauldron.")
setQuestStage(player, WitchsPotion.QUEST_NAME, 40)
stage = END_DIALOGUE
}
}
}
}
}
@@ -1,90 +0,0 @@
package content.region.asgarnia.rimmington.quest.witchpotion;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.player.Player;
import core.plugin.Initializable;
import core.game.node.entity.player.link.quest.Quest;
/**
* Represents the witch's potion quest.
* @author 'Vexia
*/
@Initializable
public class WitchsPotion extends Quest {
/**
* Constructs a new {@code WitchsPotion} {@code Object}.
*/
public WitchsPotion() {
super("Witch's Potion", 31, 30, 1, 67, 0, 1, 3);
}
@Override
public void drawJournal(Player player, int stage) {
super.drawJournal(player, stage);
switch (getStage(player)) {
case 0:
line(player, BLUE + "I can start this quest by speaking to " + RED + "Hetty " + BLUE + "in her house in", 4+ 7);
line(player, RED + "Rimmington" + BLUE + ", West of " + RED + "Port Sarim", 5+ 7);
break;
case 20:
line(player, "<str>I spoke to Hetty in her house at Rimmington. hetty told me", 4+ 7);
line(player, "<str>she could increase my magic power if I can bring her", 5+ 7);
line(player, "<str>certain ingredients for a potion.", 6+ 7);
line(player, BLUE + "Hetty needs me to bring her the following:", 8+ 7);
if (player.getInventory().contains(1957, 1)) {
line(player, "<str>I have an onion with me", 9+ 7);
} else {
line(player, RED + "An onion", 9+ 7);
}
if (player.getInventory().contains(1957, 1)) {
line(player, "<str>I have an onion with me", 9+ 7);
} else {
line(player, RED + "An onion", 9+ 7);
}
if (player.getInventory().contains(300, 1)) {
line(player, "<str>I have a rat's tail with me", 10+ 7);
} else {
line(player, RED + "A rat's tail", 10+ 7);
}
if (player.getInventory().contains(2146, 1)) {
line(player, "<str>I have a piece of burnt meat with me", 11+ 7);
} else {
line(player, RED + "A piece of burnt meat", 11+ 7);
}
if (player.getInventory().contains(221, 1)) {
line(player, "<str>I have an eye of newt with me", 12+ 7);
} else {
line(player, RED + "An eye of newt", 12+ 7);
}
break;
case 40:
line(player, "<str>I brought her an onion, a rat's tail, a piece of burnt meat", 4+ 7);
line(player, "<str>and eye of newt which she used to make a potion.", 5+ 7);
line(player, BLUE + "I should drink from the " + RED + "cauldron" + BLUE + " and improve my magic!", 7+ 7);
break;
case 100:
line(player, "<str>I brought her an onion, a rat's tail, a piece of burnt meat", 4+ 7);
line(player, "<str>and an eye of newt which she used to make a potion.", 5+ 7);
line(player, "<str>I drank from the cauldron and my magic power increased!", 7+ 7);
line(player, "<col=FF0000>QUEST COMPLETE!", 9+ 7);
break;
}
}
@Override
public void finish(Player player) {
super.finish(player);
player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2);
player.getPacketDispatch().sendString("325 Magic XP", 277, 9 + 2);
player.getSkills().addExperience(Skills.MAGIC, 325);
player.getInterfaceManager().closeChatbox();
player.getPacketDispatch().sendItemZoomOnInterface(221, 240, 277, 3 + 2);
}
@Override
public Quest newInstance(Object object) {
// TODO Auto-generated method stub
return this;
}
}
@@ -0,0 +1,88 @@
package content.region.asgarnia.rimmington.quest.witchpotion
import core.api.*
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.quest.Quest
import core.game.node.entity.skill.Skills
import core.plugin.Initializable
import org.rs09.consts.Components
import org.rs09.consts.Items
/**
* Represents the Witch's Potion Quest
*/
@Initializable
class WitchsPotion : Quest(QUEST_NAME, 31, 30, 1, 67, 0, 1, 3) {
companion object {
const val QUEST_NAME = "Witch's Potion"
}
override fun drawJournal(player: Player?, stage: Int) {
super.drawJournal(player, stage)
player ?: return
var line = 11
if (stage == 0) {
line(player, "I can start this quest by speaking to !!Hetty?? who in her house in", line++)
line(player, "!!Rimmington??, West of !!Port Sarim??.", line++)
} else if (stage in 1..39) {
line(player, "I spoke to !!Hetty?? in her house at Rimmington. Hetty told me", line++, true)
line(player, "she could increase my magic power if I can bring her", line++, true)
line(player, "certain ingredients for a potion.", line++, true)
line++
line(player, "Hetty needs me to bring her the following:", line++)
if(inInventory(player, Items.ONION_1957, 1))
line(player, "I have an onion with me", line++, true)
else
line(player, "!!An onion??", line++)
if(inInventory(player, Items.RATS_TAIL_300, 1))
line(player, "I have a rat's tail with me", line++, true)
else
line(player, "!!A rat's tail??", line++)
if(inInventory(player, Items.BURNT_MEAT_2146, 1))
line(player, "I have a piece of burnt meat with me", line++, true)
else
line(player, "!!A piece of burnt meat??", line++)
if(inInventory(player, Items.EYE_OF_NEWT_221, 1))
line(player, "I have an eye of newt with me", line++, true)
else
line(player, "!!An eye of newt??", line++)
} else if (stage in 40..99) {
line(player, "I spoke to !!Hetty?? in her house at Rimmington. Hetty told me.", line++, true)
line(player, "she could increase my magic power if I can bring her", line++, true)
line(player, "certain ingredients for a potion.", line++, true)
line(player, "I brought her an onion, a rat's tail, a piece of burnt meat", line++, true)
line(player, "and an eye of newt which she used to make a potion.", line++, true)
line(player, "I should drink from the !!cauldron?? and improve my magic!", line++)
} else if (stage == 100) {
line(player, "I have spoken to !!Hetty??.", line++, true)
line(player, "I spoke to !!Hetty?? in her house at Rimmington. Hetty told me.", line++, true)
line(player, "she could increase my magic power if I can bring her", line++, true)
line(player, "certain ingredients for a potion.", line++, true)
line(player, "I brought her an onion, a rat's tail, a piece of burnt meat", line++, true)
line(player, "and an eye of newt which she used to make a potion.", line++, true)
line(player, "I drank from the cauldron and my magic power increased!", line++, true)
line++
line(player, "%%QUEST COMPLETE!&&", line++)
}
}
override fun finish(player: Player?) {
super.finish(player)
player ?: return
var line = 10
sendItemZoomOnInterface(player, Components.QUEST_COMPLETE_SCROLL_277, 5, Items.EYE_OF_NEWT_221)
drawReward(player, "1 Quest Point", line++)
drawReward(player, "325 Magic XP", line++)
rewardXP(player, Skills.MAGIC, 325.0)
}
override fun newInstance(`object`: Any?): Quest {
return this
}
}
@@ -0,0 +1,25 @@
package content.region.asgarnia.rimmington.quest.witchpotion
import core.api.*
import core.game.interaction.IntType
import core.game.interaction.InteractionListener
import org.rs09.consts.Scenery
/**
* Interaction Listener for Witch's Potion Quest.
*/
class WitchsPotionListener : InteractionListener {
override fun defineListeners() {
on(Scenery.CAULDRON_2024, IntType.SCENERY, "drink from") { player, node ->
if (getQuestStage(player, WitchsPotion.QUEST_NAME) == 40) {
sendDialogue(player, "You drink from the cauldron, it tastes horrible! You feel yourself imbued with power.")
finishQuest(player, WitchsPotion.QUEST_NAME)
} else {
sendDialogue(player, "As nice as that looks I think I'll give it a miss for now.")
}
return@on true
}
}
}
@@ -1,41 +0,0 @@
package content.region.asgarnia.rimmington.quest.witchpotion;
import core.cache.def.impl.SceneryDefinition;
import core.game.interaction.OptionHandler;
import core.game.node.Node;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.quest.Quest;
import core.plugin.Initializable;
import core.plugin.Plugin;
/**
* Represents the witchs potion plugin.
* @author 'Vexia
* @version 1.0
*/
@Initializable
public final class WitchsPotionPlugin extends OptionHandler {
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
SceneryDefinition.forId(2024).getHandlers().put("option:drink from", this);
SceneryDefinition.forId(2024).getHandlers().put("option:Drink From", this);
return this;
}
@Override
public boolean handle(Player player, Node node, String option) {
final Quest quest = player.getQuestRepository().getQuest("Witch's Potion");
switch (quest.getStage(player)) {
case 20:
case 100:
player.getDialogueInterpreter().sendDialogues(player, null, "As nice as that looks I think I'll give it a miss for now.");
break;
case 40:
player.getDialogueInterpreter().open(307, true, 1);
break;
}
return true;
}
}