From b7f2a374b0e3d97a82cf8613ef3d632f8565b5db Mon Sep 17 00:00:00 2001 From: Ceikry Date: Mon, 7 Mar 2022 09:42:28 +0000 Subject: [PATCH] Rewrote the water sources plugin into a listener and properly handled wells --- .../item/withobject/WaterSourcePlugin.java | 209 ------------------ .../item/withobject/WaterSourceListener.kt | 134 +++++++++++ 2 files changed, 134 insertions(+), 209 deletions(-) delete mode 100644 Server/src/main/java/core/game/interaction/item/withobject/WaterSourcePlugin.java create mode 100644 Server/src/main/kotlin/rs09/game/interaction/item/withobject/WaterSourceListener.kt diff --git a/Server/src/main/java/core/game/interaction/item/withobject/WaterSourcePlugin.java b/Server/src/main/java/core/game/interaction/item/withobject/WaterSourcePlugin.java deleted file mode 100644 index 09670bfcb..000000000 --- a/Server/src/main/java/core/game/interaction/item/withobject/WaterSourcePlugin.java +++ /dev/null @@ -1,209 +0,0 @@ -package core.game.interaction.item.withobject; - -import static api.ContentAPIKt.*; -import core.plugin.Initializable; -import org.rs09.consts.Items; -import core.game.interaction.NodeUsageEvent; -import core.game.interaction.UseWithHandler; -import core.game.node.entity.player.Player; -import core.game.node.entity.player.link.diary.DiaryType; -import core.game.node.item.Item; -import core.game.node.scenery.Scenery; -import core.game.system.task.Pulse; -import core.game.world.update.flag.context.Animation; -import core.plugin.Plugin; - -/** - * Represents the plugin used to fill a bucket. - * @author 'Vexia - * @version 1.5 - */ -@Initializable -public final class WaterSourcePlugin extends UseWithHandler { - - /** - * Represents the objects to use the buckets on. - */ - private static final int[] OBJECTS = new int[] { 21355, 16302, 6827, 11661, 24160, 34577, 15936, 15937, 15938, 23920, 35469, 24265, 153, 879, 880, 2864, 6232, 10436, 10437, 10827, 11007, 11759, 21764, 22973, 24161, 24214, 24265, 28662, 30223, 30820, 34579, 36781, 873, 874, 4063, 6151, 8699, 9143, 9684, 10175, 12279, 12974, 13563, 13564, 14868, 14917, 15678, 16704, 16705, 20358, 22715, 24112, 24314, 25729, 25929, 26966, 29105, 33458, 34082, 34411, 34496, 34547, 34566, 35762, 36971, 37154, 37155, 878, 884, 3264, 3305, 3359, 4004, 4005, 6097, 6249, 6549, 8747, 8927, 11793, 12201, 12897, 24166, 26945, 31359, 32023, 32024, 34576, 35671, 40063, 13561, 13563, 13559, 12089 }; - - /** - * Represents the animation to use. - */ - private static final Animation ANIMATION = new Animation(832); - - /** - * Constructs a new {@code FillBucketPlugin} {@code Object}. - */ - public WaterSourcePlugin() { - super(WaterRecipient.getIds()); - } - - @Override - public Plugin newInstance(Object arg) throws Throwable { - for (int i : OBJECTS) { - if(sceneryDefinition(i).getName().toLowerCase().contains("well")){ - continue; - } - addHandler(i, OBJECT_TYPE, this); - } - return this; - } - - @Override - public boolean handle(NodeUsageEvent event) { - final WaterRecipient recipient = WaterRecipient.forItem(event.getUsedItem()); - recipient.handle(event.getUsedWith().asScenery(), event.getPlayer()); - return true; - } - - /** - * Represents a water recipient. - * @author 'Vexia - * @version 1.0 - */ - public enum WaterRecipient { - BUCKET(new Item(1925), new Item(1929), "You fill the bucket with water."), - VIAL(new Item(229), new Item(227)), - JUG(new Item(1935), new Item(1937)), - BOWL(new Item(1923), new Item(1921)), - CLAY(new Item(434), new Item(1761), "You mix the clay and water. You now have some soft, workable clay."), - WATERING_CAN(new Item(5331), new Item(5340), "You fill the watering can."), - WATERING_CAN7(new Item(5339), new Item(5340), "You fill the watering can."), - WATERING_CAN6(new Item(5338), new Item(5340), "You fill the watering can."), - WATERING_CAN5(new Item(5337), new Item(5340), "You fill the watering can."), - WATERING_CAN4(new Item(5336), new Item(5340), "You fill the watering can."), - WATERING_CAN3(new Item(5335), new Item(5340), "You fill the watering can."), - WATERING_CAN2(new Item(5334), new Item(5340), "You fill the watering can."), - WATERING_CAN1(new Item(5333), new Item(5340), "You fill the watering can."), - WATER_SKIN0(new Item(1831), new Item(1823), "You fill the waterskin."), - WATER_SKIN1(new Item(1829),new Item(1823),"You fill the waterskin."), - WATER_SKIN2(new Item(1827), new Item(1823), "You fill the waterskin."), - FISHBOWL(new Item(Items.FISHBOWL_6667), new Item(Items.FISHBOWL_6668)); - - /** - * Represents the required item. - */ - private final Item required; - - /** - * Represents the product item. - */ - private final Item product; - - /** - * Represents the message to display. - */ - private final String message; - - /** - * Constructs a new {@code WaterSourcePlugin} {@code Object}. - * @param required the required item. - * @param product the product item. - * @param message the message item. - */ - WaterRecipient(final Item required, final Item product, final String message) { - this.required = required; - this.product = product; - this.message = message; - } - - /** - * Constructs a new {@code WaterSourcePlugin} {@code Object}. - * @param required the required item. - * @param product the product. - */ - WaterRecipient(final Item required, final Item product) { - this(required, product, "You fill the " + required.getName().toLowerCase() + " with water."); - } - - /** - * Method used to handle the interaction. - * @param player the player. - */ - public final void handle(final Scenery object, final Player player) { - if (object.getId() == 11661 - && required.getId() == Items.BUCKET_1925 - && !player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0,7)) { - player.getPulseManager().run(new Pulse(2, player) { - @Override - public boolean pulse() { - if (player.getInventory().remove(getRequired())) { - player.animate(ANIMATION); - player.getPacketDispatch().sendMessage(getMessage()); - player.getInventory().add(getProduct()); - player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player, 0, 7, true); - } - return !player.getInventory().containsItem(getRequired()); - } - }); - } else { - player.getPulseManager().run(new Pulse(1, player) { - @Override - public boolean pulse() { - if (player.getInventory().remove(getRequired())) { - player.animate(ANIMATION); - player.getPacketDispatch().sendMessage(getMessage()); - player.getInventory().add(getProduct()); - } - return !player.getInventory().containsItem(getRequired()); - } - - @Override - public void stop() { - super.stop(); - } - }); - } - } - - /** - * Gets the required. - * @return The required. - */ - public Item getRequired() { - return required; - } - - /** - * Gets the product. - * @return The product. - */ - public Item getProduct() { - return product; - } - - /** - * Gets the message. - * @return The message. - */ - public String getMessage() { - return message; - } - - /** - * Gets the recipient ids. - * @return the ids. - */ - public static int[] getIds() { - int[] ids = new int[values().length]; - for (int i = 0; i < ids.length; i++) { - ids[i] = values()[i].getRequired().getId(); - } - return ids; - } - - /** - * Gets the water recipient for the item. - * @param item the item. - * @return the {@code WaterRecipient} {@code Object}. - */ - public static WaterRecipient forItem(final Item item) { - for (WaterRecipient recipient : values()) { - if (recipient.getRequired().getId() == item.getId()) { - return recipient; - } - } - return null; - } - } -} diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/withobject/WaterSourceListener.kt b/Server/src/main/kotlin/rs09/game/interaction/item/withobject/WaterSourceListener.kt new file mode 100644 index 000000000..03834186d --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/item/withobject/WaterSourceListener.kt @@ -0,0 +1,134 @@ +package rs09.game.interaction.item.withobject + +import api.* +import core.game.node.entity.player.link.diary.DiaryType +import core.game.world.update.flag.context.Animation +import org.rs09.consts.Items +import rs09.game.interaction.InteractionListener + +/** + * Handles filling most water sources. + * @author Ceikry + */ +class WaterSourceListener : InteractionListener() { + //this is ugly! + private val waterSources = intArrayOf(21355, 16302, 6827, 11661, 24160, 34577, 15936, 15937, 15938, 23920, 35469, 24265, 153, 879, 880, 2864, 6232, 10436, 10437, 10827, 11007, 11759, 21764, 22973, 24161, 24214, 24265, 28662, 30223, 30820, 34579, 36781, 873, 874, 4063, 6151, 8699, 9143, 9684, 10175, 12279, 12974, 13563, 13564, 14868, 14917, 15678, 16704, 16705, 20358, 22715, 24112, 24314, 25729, 25929, 26966, 29105, 33458, 34082, 34411, 34496, 34547, 34566, 35762, 36971, 37154, 37155, 878, 884, 3264, 3305, 3359, 4004, 4005, 6097, 6249, 6549, 8747, 8927, 11793, 12201, 12897, 24166, 26945, 31359, 32023, 32024, 34576, 35671, 40063, 13561, 13563, 13559, 12089) + + private val nonWellableMsg = "If I drop my @ down there, I don't think I'm likely to get it back." + private val animation = Animation(832) + + override fun defineListeners() + { + onUseWith(SCENERY, WaterVessel.getInputs(), *waterSources){player, used, with -> + val vessel = WaterVessel.forId(used.id) ?: return@onUseWith false + + if(with.name.contains("well", ignoreCase = true) && !vessel.wellable) + { + sendMessage(player, formatMsgText(used.name, nonWellableMsg)) + return@onUseWith true + } + + //ugly achievement code, achievement system sux + if(vessel == WaterVessel.BUCKET && with.id == 11661) + { + if(!player.achievementDiaryManager.getDiary(DiaryType.FALADOR).isComplete(0,7)) + player.achievementDiaryManager.getDiary(DiaryType.FALADOR).updateTask(player, 0, 7, true) + } + + runTask(player, 1){ + if(removeItem(player, used)) + { + animate(player, animation) + sendMessage(player, formatMsgText(used.name, vessel.fillMsg)) + addItemOrDrop(player, vessel.output) + } + } + + return@onUseWith true + } + } + + private fun formatMsgText(name: String, template: String): String + { + val sb = StringBuilder() + val templateChars = template.toCharArray() + val nameChars = name.toCharArray() + + for(tc in templateChars) + { + if(tc == '@'){ + for(nc in nameChars) + { + if (nc == '(') break + else sb.append(nc.toLowerCase()) + } + } + else sb.append(tc) + } + + return sb.toString() + } + + internal enum class WaterVessel(val inputs: IntArray, val output: Int, val wellable: Boolean = false, val fillMsg: String = "You fill the @.") + { + BUCKET( + inputs = intArrayOf(Items.BUCKET_1925), + output = Items.BUCKET_OF_WATER_1929, + wellable = true + ), + VIAL( + inputs = intArrayOf(Items.VIAL_229), + output = Items.VIAL_OF_WATER_227 + ), + JUG( + inputs = intArrayOf(Items.JUG_1935), + output = Items.JUG_OF_WATER_1937 + ), + BOWL( + inputs = intArrayOf(Items.BOWL_1923), + output = Items.BOWL_OF_WATER_1921 + ), + CLAY( + inputs = intArrayOf(Items.CLAY_434), + output = Items.SOFT_CLAY_1761, + wellable = false, + fillMsg = "You mix the clay and water. You now have some soft, workable clay." + ), + WATERING_CAN( + inputs = intArrayOf(Items.WATERING_CAN1_5333, Items.WATERING_CAN2_5334, Items.WATERING_CAN3_5335, Items.WATERING_CAN4_5336, Items.WATERING_CAN5_5337, Items.WATERING_CAN6_5338, Items.WATERING_CAN7_5339), + output = Items.WATERING_CAN8_5340 + ), + WATER_SKIN( + inputs = intArrayOf(Items.WATERSKIN0_1831, Items.WATERSKIN1_1829, Items.WATERSKIN2_1827, Items.WATERSKIN3_1825), + output = Items.WATERSKIN4_1823 + ), + FISHBOWL( + inputs = intArrayOf(Items.FISHBOWL_6667), + output = Items.FISHBOWL_6668 + ); + + companion object + { + //map our input item IDs to their respective WaterVessel entry + private val itemMap = HashMap() + + init { + for(entry in values()) + { + entry.inputs.forEach { itemMap[it] = entry } + } + } + + //return a nice list of all the input IDs + fun getInputs(): IntArray + { + return itemMap.keys.toIntArray() + } + + fun forId(id: Int): WaterVessel? + { + return itemMap[id] + } + } + } +}