From 254089d34ef7a527f859f7cf2a0f40e066c6e490 Mon Sep 17 00:00:00 2001 From: bushtail Date: Fri, 17 Feb 2023 02:12:41 +0000 Subject: [PATCH] Rewrote fruit cutting plugin as listener --- .../handlers/item/withitem/FruitCutting.kt | 87 ++++++ .../item/withitem/FruitCuttingPlugin.java | 273 ------------------ 2 files changed, 87 insertions(+), 273 deletions(-) create mode 100644 Server/src/main/content/global/handlers/item/withitem/FruitCutting.kt delete mode 100644 Server/src/main/content/global/handlers/item/withitem/FruitCuttingPlugin.java diff --git a/Server/src/main/content/global/handlers/item/withitem/FruitCutting.kt b/Server/src/main/content/global/handlers/item/withitem/FruitCutting.kt new file mode 100644 index 000000000..ca6db9081 --- /dev/null +++ b/Server/src/main/content/global/handlers/item/withitem/FruitCutting.kt @@ -0,0 +1,87 @@ +package content.global.handlers.item.withitem + +import core.api.* +import core.game.dialogue.DialogueFile +import core.game.interaction.IntType +import core.game.interaction.InteractionListener +import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import core.tools.START_DIALOGUE +import org.rs09.consts.Items + +class FruitCuttingListener : InteractionListener { + val anim = Animation(1192) // TODO Add fruit cutting animation to ConstLib + + enum class Fruit(val fruit: Int, val chunk: Int, val slice: Item) { + PINEAPPLE(Items.PINEAPPLE_2114, Items.PINEAPPLE_CHUNKS_2116, Item(Items.PINEAPPLE_RING_2118, 4)), + BANANA(Items.BANANA_1963, -1, Item(Items.SLICED_BANANA_3162)), + LEMON(Items.LEMON_2102, Items.LEMON_CHUNKS_2104, Item(Items.LEMON_SLICES_2106)), + LIME(Items.LIME_2120, Items.LIME_CHUNKS_2122, Item(Items.LIME_SLICES_2124)), + ORANGE(Items.ORANGE_2108, Items.ORANGE_CHUNKS_2110, Item(Items.ORANGE_SLICES_2112)); + + companion object { + val productOfChunk = values().associate { it.fruit to it.chunk } + val productOfSlice = values().associate { it.fruit to it.slice } + val cutable = intArrayOf(PINEAPPLE.fruit, BANANA.fruit, LEMON.fruit, LIME.fruit, ORANGE.fruit) + + fun forChunkId(id: Int) : Int { + return productOfChunk[id]!! + } + + fun forSliceId(id: Int) : Item { + return productOfSlice[id]!! + } + } + } + + override fun defineListeners() { + onUseWith(IntType.ITEM, Fruit.cutable, Items.KNIFE_946) { player, used, _ -> + openDialogue( + player, + FruitCuttingDialogue(used.id, Fruit.forChunkId(used.id), Fruit.forSliceId(used.id)) + ) + return@onUseWith true + } + } +} + +class FruitCuttingDialogue(val fruit: Int, val chunk: Int, val slice: Item) : DialogueFile() { + val anim = Animation(1192) + override fun handle(componentID: Int, buttonID: Int) { + when(stage) { + START_DIALOGUE -> { + if(chunk == -1) { + if(removeItem(player!!, fruit) && addItem(player!!, slice.id)) { + animate(player!!, anim, true) + sendMessage(player!!, "You deftly chop the ${getItemName(fruit).lowercase()} into slices.") + } + } else { + setInterfaceText(player!!, "Would you like to...", 140, 4) + sendItemOnInterface(player!!, 140, 6, chunk, 1) + sendItemOnInterface(player!!, 140, 5, slice.id, 1) + setInterfaceText(player!!, "Slice the ${getItemName(fruit).lowercase()}", 140, 2) + setInterfaceText(player!!, "Dice the ${getItemName(fruit).lowercase()}", 140, 3) + openInterface(player!!, 140) + when(buttonID) { + 1 -> { + closeInterface(player!!) + if(removeItem(player!!, fruit) && addItem(player!!, slice.id, slice.amount)) { + animate(player!!, anim, true) + sendMessage(player!!, "You cut the ${getItemName(fruit).lowercase()} into slices.") + } + } + 2 -> { + closeInterface(player!!) + if(removeItem(player!!, fruit) && addItem(player!!, chunk)) { + animate(player!!, anim, true) + sendMessage(player!!, "You cut the ${getItemName(fruit).lowercase()} into chunks.") + } + } + + } + } + } + } + } + +} \ No newline at end of file diff --git a/Server/src/main/content/global/handlers/item/withitem/FruitCuttingPlugin.java b/Server/src/main/content/global/handlers/item/withitem/FruitCuttingPlugin.java deleted file mode 100644 index a9f7fd003..000000000 --- a/Server/src/main/content/global/handlers/item/withitem/FruitCuttingPlugin.java +++ /dev/null @@ -1,273 +0,0 @@ -package content.global.handlers.item.withitem; - -import static core.api.ContentAPIKt.*; -import core.game.component.Component; -import core.plugin.Initializable; -import kotlin.Unit; -import org.rs09.consts.Items; -import core.game.dialogue.DialoguePlugin; -import core.game.interaction.NodeUsageEvent; -import core.game.interaction.UseWithHandler; -import core.game.node.entity.player.Player; -import core.game.node.entity.player.link.RunScript; -import core.game.node.item.Item; -import core.game.world.update.flag.context.Animation; -import core.plugin.Plugin; - -/** - * Represents the fruit cutting plugin. - * @author 'Vexia - * @version 1.0 - */ -@Initializable -public final class FruitCuttingPlugin extends UseWithHandler { - - /** - * Represents the cutting banana animation. - */ - private static final Animation ANIMATION = new Animation(1192); - - /** - * Constructs a new {@code FruitCuttingPlugin} {@code Object}. - */ - public FruitCuttingPlugin() { - super(946); - } - - @Override - public Plugin newInstance(Object arg) throws Throwable { - for (Fruit fruit : Fruit.values()) { - addHandler(fruit.getBase().getId(), ITEM_TYPE, this); - } - new FruitCuttingDialogue().init(); - return this; - } - - @Override - public boolean handle(NodeUsageEvent event) { - final Player player = event.getPlayer(); - final Fruit fruit = Fruit.forBase(event.getUsedItem()); - if (fruit == Fruit.BANANA || fruit == Fruit.LEMON) { - if (player.getInventory().remove(fruit.getBase())) { - player.lock(2); - player.animate(ANIMATION); - player.getInventory().add(fruit.getSliced()); - player.getPacketDispatch().sendMessage("You deftly chop the "+ fruit.name().toLowerCase() + " into slices."); - } - return true; - } - player.getDialogueInterpreter().open(31237434, fruit); - return true; - } - - /** - * Represents the a fruit to cut. - * @author 'Vexia - * @date 30/11/2013 - */ - public enum Fruit { - PINEAPPLE(new Item(2114), new Item(2116), new Item(2118, 4)), - BANANA(new Item(1963), null, new Item(3162)), - LEMON(new Item(2102), new Item(Items.LEMON_CHUNKS_2104), new Item(2106)), - LIME(new Item(Items.LIME_2120),new Item(Items.LIME_CHUNKS_2122), new Item(Items.LIME_SLICES_2124)), - ORANGE(new Item(2108), new Item(2110), new Item(2112)); - - /** - * Constructs a new {@code FruitCuttingPlugin.java} {@code Object}. - * @param base the base item. - * @param diced the diced item. - * @param sliced the sliced item. - */ - Fruit(Item base, Item diced, Item sliced) { - this.base = base; - this.diced = diced; - this.sliced = sliced; - } - - /** - * Represents the base item. - */ - private final Item base; - - /** - * Represents the diced item. - */ - private final Item diced; - - /** - * Represents the sliced item. - */ - private final Item sliced; - - /** - * Gets the base. - * @return The base. - */ - public Item getBase() { - return base; - } - - /** - * Gets the diced. - * @return The diced. - */ - public Item getDiced() { - return diced; - } - - /** - * Gets the sliced. - * @return The sliced. - */ - public Item getSliced() { - return sliced; - } - - /** - * Method used to get the fruit for the base item. - * @param item the item. - * @return the fruit. - */ - public static Fruit forBase(final Item item) { - for (Fruit fruit : values()) { - if (fruit.getBase().getId() == item.getId()) { - return fruit; - } - } - return null; - } - } - - /** - * Represents the dialogue plugin used to cut fruit. - * @author 'Vexia - * @version 1.0 - */ - public static final class FruitCuttingDialogue extends DialoguePlugin { - - /** - * Represents the component interface. - */ - private static final Component COMPONENT = new Component(140); - - /** - * Represents the fruit. - */ - private Fruit fruit; - - /** - * Represents the fruit to cut. - */ - private Item item; - - /** - * Represents if its a sliced cut. - */ - private boolean slice; - - /** - * Constructs a new {@code FruitCuttingDialogue} {@code Object}. - */ - public FruitCuttingDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code FruitCuttingDialogue} {@code Object}. - * @param player the player. - */ - public FruitCuttingDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new FruitCuttingDialogue(player); - } - - @Override - public boolean open(Object... args) { - fruit = ((Fruit) args[0]); - player.getPacketDispatch().sendString("Would you like to...", 140, 4); - player.getPacketDispatch().sendItemOnInterface(fruit.getSliced().getId(), 1, 140, 5); - player.getPacketDispatch().sendItemOnInterface(fruit.getDiced().getId(), 1, 140, 6); - player.getPacketDispatch().sendString("Slice the " + fruit.getBase().getName().toLowerCase() + ".", 140, 2); - player.getPacketDispatch().sendString("Dice the " + fruit.getBase().getName().toLowerCase() + ".", 140, 3); - player.getInterfaceManager().openChatbox(COMPONENT); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - player.getInterfaceManager().openChatbox(309); - player.getPacketDispatch().sendItemZoomOnInterface(1, 160, 309, 2); - slice = buttonId == 2 ? false : true; - item = buttonId == 2 ? fruit.getDiced() : fruit.getSliced(); - player.getPacketDispatch().sendString("



" + item.getName(), 309, 6); - player.getPacketDispatch().sendItemZoomOnInterface(item.getId(), 175, 309, 2); - stage = 1; - break; - case 1: - int amount = 0; - switch (buttonId) { - case 6: - amount = 1; - break; - case 5: - amount = 5; - break; - case 4: - sendInputDialogue(player, false, "Enter the amount:", (value) -> { - String s = value.toString(); - s = s.replace("k","000"); - s = s.replace("K","000"); - int val = Integer.parseInt(s); - cut(player, val, slice); - return Unit.INSTANCE; - }); - return true; - case 3: - amount = player.getInventory().getAmount(fruit.getBase()); - break; - } - cut(player, amount, slice); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[] { 31237434 }; - } - - /** - * Method used to cut a fruit. - * @param player the player. - * @param amount the amount. - * @param slice if its sliced. - */ - private final void cut(final Player player, int amount, boolean slice) { - if (amount > player.getInventory().getAmount(fruit.getBase())) { - amount = player.getInventory().getAmount(fruit.getBase()); - } - end(); - final Item remove = new Item(fruit.getBase().getId(), amount); - if (!player.getInventory().containsItem(remove)) { - return; - } - if (player.getInventory().remove(remove)) { - player.getPacketDispatch().sendMessage("You cut the " + fruit.name().toLowerCase() + " into " + (slice ? fruit == Fruit.PINEAPPLE ? "rings" : "slices" : "chunks") + "."); - for (int i = 0; i < amount; i++) { - player.getInventory().add(slice ? fruit.getSliced() : fruit.getDiced()); - } - } - } - - } -}