diff --git a/Server/src/main/java/core/game/content/activity/guild/HeroGuildPlugin.java b/Server/src/main/java/core/game/content/activity/guild/HeroGuildPlugin.java index 1ff29fbc4..7ef3e4d3b 100644 --- a/Server/src/main/java/core/game/content/activity/guild/HeroGuildPlugin.java +++ b/Server/src/main/java/core/game/content/activity/guild/HeroGuildPlugin.java @@ -1,7 +1,7 @@ package core.game.content.activity.guild; import core.cache.def.impl.SceneryDefinition; -import core.game.content.global.EnchantedJewellery; +import rs09.game.content.global.EnchantedJewellery; import core.game.content.global.action.DoorActionHandler; import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.interaction.NodeUsageEvent; @@ -79,7 +79,9 @@ public final class HeroGuildPlugin extends OptionHandler { @Override public boolean handle(NodeUsageEvent event) { final Player player = event.getPlayer(); - final EnchantedJewellery jewellery = EnchantedJewellery.forItem(event.getUsedItem()); + final EnchantedJewellery jewellery; + assert event.getUsedItem() != null; + jewellery = EnchantedJewellery.Companion.getIdMap().get(event.getUsedItem().getId()); if (jewellery == null && event.getUsedItem().getId() != 2572) { return true; } @@ -96,15 +98,9 @@ public final class HeroGuildPlugin extends OptionHandler { } player.lock(1); player.animate(Animation.create(832)); - if(event.getUsedItem().getId() == 2572){ - player.getInventory().replace(new Item(14646), event.getUsedItem().getSlot()); - } else { - player.getInventory().replace(new Item(jewellery.getIds()[0]), event.getUsedItem().getSlot()); - } - String name = event.getUsedItem().getName().toLowerCase(); - for (int i = 0; i < 4; i++) { - name = name.replace("(" + (i + 1) + ")", "").trim(); - } + Item rechargedItem = new Item(jewellery.getIds()[0]); + player.getInventory().replace(rechargedItem, event.getUsedItem().getSlot()); + String name = jewellery.getJewelleryName(rechargedItem); if (!fam) { player.sendMessage("You dip the " + name + " in the fountain..."); } else { diff --git a/Server/src/main/java/core/game/content/global/EnchantedJewellery.java b/Server/src/main/java/core/game/content/global/EnchantedJewellery.java deleted file mode 100644 index acbd13faf..000000000 --- a/Server/src/main/java/core/game/content/global/EnchantedJewellery.java +++ /dev/null @@ -1,308 +0,0 @@ -package core.game.content.global; - -import core.game.node.entity.player.Player; -import core.game.node.entity.player.link.diary.DiaryType; -import core.game.node.entity.player.link.audio.Audio; -import core.game.node.item.Item; -import core.game.system.task.Pulse; -import rs09.game.world.GameWorld; -import core.game.world.map.Location; -import core.game.world.update.flag.context.Animation; -import core.game.world.update.flag.context.Graphics; - -/** - * Represents an enchanted jewellery. - * @author Vexia - */ -public enum EnchantedJewellery { - RING_OF_SLAYING(new String[] { "Slayer Tower.", "Fremmenik Slayer Dungeon.", "Pollniveach Slayer Dungeon.", "Nowhere." }, new Location[] { Location.create(3429, 3533, 0), Location.create(2793, 3615, 0), Location.create(3313, 2960, 0) }, true, 13281, 13282, 13283, 13284, 13285, 13286, 13287, 13288), - RING_OF_DUELING(new String[] { "Al Kharid Duel Arena.", "Castle Wars Arena.", "Fist of Guthix", "Nowhere." }, new Location[] { Location.create(3314, 3235, 0), Location.create(2442, 3089, 0), Location.create(1693, 5600, 0) }, true, 2552, 2554, 2556, 2558, 2560, 2562, 2564, 2566), - AMULET_OF_GLORY(new String[] { "Edgeville", "Karamja", "Draynor Village", "Al-Kharid", "Nowhere." }, new Location[] { Location.create(3087, 3495, 0), Location.create(2919, 3175, 0), Location.create(3104, 3249, 0), Location.create(3304, 3124, 0) }, 1712, 1710, 1708, 1706, 1704), - AMULET_OF_GLORY_T(new String[] { "Edgeville", "Karamja", "Draynor Village", "Al-Kharid", "Nowhere." }, new Location[] { Location.create(3087, 3495, 0), Location.create(2919, 3175, 0), Location.create(3081, 3250, 0), Location.create(3304, 3124, 0) }, 10354, 10356, 10358, 10360, 10362), - GAMES_NECKLACE(new String[] { "Burthorpe", "Barbarian Assault", "Clan Wars", "Bounty Hunter", "Corporeal Beast" }, new Location[] { Location.create(2899, 3563, 0), Location.create(2520, 3571, 0), Location.create(3266, 3686, 0), Location.create(3179, 3685, 0), Location.create(2885, 4372, 2) }, true, 3853, 3855, 3857, 3859, 3861, 3863, 3865, 3867), - DIGSITE_PENDANT(new String[] {}, new Location[] { Location.create(3342, 3445, 0) }, true, 11194, 11193, 11192, 11191, 11190), - COMBAT_BRACELET(new String[] { "Champions' Guild", "Monastery", "Ranging Guild", "Warriors' Guild", "Nowhere." }, new Location[] { Location.create(3191, 3365, 0), Location.create(3052, 3472, 0), Location.create(2657, 3439, 0), Location.create(2878, 3546, 0) }, 11118, 11120, 11122, 11124, 11126), - SKILLS_NECKLACE(new String[] { "Fishing Guild", "Mining Guild", "Crafting Guild", "Cooking Guild", "Nowhere." }, new Location[] { Location.create(2611, 3392, 0), Location.create(3016, 3338, 0), Location.create(2933, 3290, 0), Location.create(3143, 3442, 0) }, 11105, 11107, 11109, 11111, 11113), - RING_OF_WEALTH(new String[] {"Grand Exchange","Nowhere."}, new Location[] {Location.create(3163, 3464, 0)},14646,14644,14642,14640,14638); - - /** - * Represents the teleport animation. - */ - private static final Animation ANIMATION = new Animation(714); - - /** - * Represents the graphics to use. - */ - private static final Graphics GRAPHICS = new Graphics(308, 100, 50); - - /** - * Represents the charge numbers. - */ - private static final char[] NUMBERS = new char[] { '1', '2', '3', '4', '5', '6', '7', '8' }; - - /** - * Represents the teleport options. - */ - private final String[] options; - - /** - * Represents the locations. - */ - private final Location[] locations; - - /** - * Represents the ids of the jewellery. - */ - private final int[] ids; - - /** - * Represents if it crumbles away into nothing. - */ - private final boolean crumble; - - /** - * Constructs a new {@code EnchantedJewelleryPlugin} {@code Object}. - * @param options the options. - * @param locations the locations. - * @parma crumble if it crumbles. - * @param ids the ids. - */ - EnchantedJewellery(final String[] options, final Location[] locations, final boolean crumble, final int... ids) { - this.options = options; - this.locations = locations; - this.ids = ids; - this.crumble = crumble; - } - - /** - * Constructs a new {@code EnchantedJewelleryPlugin} {@code Object}. - * @param options the options. - * @param locations the locations. - * @param ids the ids. - */ - EnchantedJewellery(final String[] options, final Location[] locations, final int... ids) { - this(options, locations, false, ids); - } - - /** - * Method used to teleport the player to the desired location. - * @param player the player. - * @param item the item. - * @param index the index. - * @param operate If the player is operating. - */ - public void use(final Player player, final Item item, final int index, boolean operate) { - if ((index + 1) == getIds().length || item.getSlot() < 0) { - return; - } - if (index > getLocations().length - 1) { - return; - } - int itemIndex = getItemIndex(item); - Item replace = item; - if (!isLast(itemIndex)) { - if (!(isCrumble() && itemIndex == getIds().length - 1)) { - replace = getReplace(getNext(itemIndex)); - } - } else { - if (!isCrumble()) { - replace = getReplace(getIds()[getIds().length - 1]); - } - } - if (index > getLocations().length - 1) { - return; - } - if (!operate && !player.getInventory().containsItem(item)) { - player.sendMessage("Ooops, you don't have it anymore ;)"); - return; - } else if (operate && !player.getEquipment().containsItem(item)) { - player.sendMessage("Ooops, you don't have it anymore ;)"); - return; - } - if (teleport(player, itemIndex, replace, getLocation(index))) { - if (!isLast(itemIndex) && !(isCrumble() && itemIndex == getIds().length - 1)) { - if (operate) { - player.getEquipment().replace(replace, item.getSlot()); - } else { - player.getInventory().replace(replace, item.getSlot()); - } - } else { - if (isCrumble()) { - if (operate) { - player.getEquipment().replace(null, item.getSlot()); - } else { - if(item.getName().contains("slaying")){ - player.getInventory().replace(new Item(4155, 1), item.getSlot()); - player.sendMessage("Your Ring of Slaying reverts back into a regular enchanted gem."); - } else { - player.getInventory().replace(null, item.getSlot()); - } - } - } - } - if (getLocation(index).withinDistance(new Location(2657,3439,0))) { - player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE,2,0); - } - } - } - - /** - * Method used to teleport to a location. - * @param player the player. - * @param itemIndex the old item index. - * @param item the item. - * @param location the location. - */ - private boolean teleport(final Player player, final int itemIndex, final Item item, final Location location) { - if (player.isTeleBlocked()) { - player.sendMessage("A magical force has stopped you from teleporting."); - return false; - } - if (!player.getZoneMonitor().teleport(1, item)) { - return false; - } - player.lock(); - player.visualize(ANIMATION, GRAPHICS); - player.getAudioManager().send(new Audio(200), true); - player.getImpactHandler().setDisabledTicks(4); - GameWorld.getPulser().submit(new Pulse(4) { - @Override - public boolean pulse() { - player.unlock(); - player.getProperties().setTeleportLocation(location); - player.getAnimator().reset(); - return true; - } - }); - return true; - } - - /** - * Gets the charges of an item. - * @param item the item. - * @return the charges. - */ - public static String getCharges(Item item) { - String[] tokens = item.getName().replace("(t", "(").replace("(", " ").replace(")", "").split(" "); - return tokens[tokens.length - 1]; - } - - /** - * Gets the replacement item. - * @param id the id. - * @return the item. - */ - public Item getReplace(int id) { - return new Item(id); - } - - /** - * Gets the name. - * @param item the item. - * @return the name. - */ - public String getName(Item item) { - String name = item.getName().toLowerCase().replace("(t", "(").replace("(", "").replace(")", ""); - for (char number : NUMBERS) { - name = name.replace(number, '/'); - } - return name.trim().replace("/", ""); - } - - /** - * Gets the name type. - * @param item the item. - * @return - */ - public String getNameType(Item item) { - return this == GAMES_NECKLACE ? "games necklace" : this == DIGSITE_PENDANT ? "necklace" : this == COMBAT_BRACELET ? "bracelet" : this == SKILLS_NECKLACE ? "necklace" : item.getName().toLowerCase().split(" ")[0]; - } - - /** - * Checks if the index is last. - * @param index the index. - * @return {@code True} if so. - */ - public boolean isLast(int index) { - return !isCrumble() ? index == (ids.length - 1) : index == ids.length; - } - - /** - * Gets the next index. - * @param index the index. - * @return the new id - */ - public int getNext(int index) { - return ids[index + 1]; - } - - /** - * Gets the location. - * @param index the index. - * @return the location. - */ - public Location getLocation(int index) { - if (index > locations.length) { - index = locations.length - 1; - } - return locations[index]; - } - - /** - * Gets the options. - * @return The options. - */ - public String[] getOptions() { - return options; - } - - /** - * Gets the locations. - * @return The locations. - */ - public Location[] getLocations() { - return locations; - } - - /** - * Gets the ids. - * @return The ids. - */ - public int[] getIds() { - return ids; - } - - public boolean isCrumble() { - return crumble; - } - - /** - * Gets the enchanted jewellery. - * @param item the item. - * @return {@code EnchantedJewellery}. - */ - public static EnchantedJewellery forItem(final Item item) { - for (EnchantedJewellery jewellery : values()) { - for (int i : jewellery.getIds()) { - if (i == item.getId()) { - return jewellery; - } - } - } - return null; - } - - /** - * Gets the index. - * @param item the item. - * @return the item index. - */ - public int getItemIndex(Item item) { - for (int i = 0; i < getIds().length; i++) { - if (getIds()[i] == item.getId()) { - return i; - } - } - return -1; - } -} \ No newline at end of file diff --git a/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java b/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java index d6dc2890e..6010eb34e 100644 --- a/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java @@ -3,7 +3,7 @@ package core.game.interaction.item; import core.cache.def.impl.ItemDefinition; import core.cache.def.impl.NPCDefinition; import core.game.content.dialogue.DialoguePlugin; -import core.game.content.global.EnchantedJewellery; +import rs09.game.content.global.EnchantedJewellery; import core.game.interaction.OptionHandler; import core.game.node.Node; import core.game.node.entity.player.Player; diff --git a/Server/src/main/kotlin/api/events/Events.kt b/Server/src/main/kotlin/api/events/Events.kt index 2e76c9bd2..12d673e8f 100644 --- a/Server/src/main/kotlin/api/events/Events.kt +++ b/Server/src/main/kotlin/api/events/Events.kt @@ -5,10 +5,11 @@ import core.game.node.Node import core.game.node.entity.Entity import core.game.node.entity.npc.NPC import core.game.node.entity.player.link.TeleportManager.TeleportType +import core.game.world.map.Location data class ResourceProducedEvent(val itemId: Int, val amount: Int, val source: Node, val original: Int = -1) : Event data class NPCKillEvent(val npc: NPC) : Event -data class TeleportEvent(val type: TeleportType, val source: Int = -1) : Event +data class TeleportEvent(val type: TeleportType, val source: Int = -1, val location: Location) : Event data class LitFireEvent(val logId: Int) : Event data class InteractionEvent(val target: Node, val option: String) : Event data class ButtonClickedEvent(val iface: Int, val buttonId: Int) : Event diff --git a/Server/src/main/kotlin/rs09/game/content/global/EnchantedJewellery.kt b/Server/src/main/kotlin/rs09/game/content/global/EnchantedJewellery.kt new file mode 100644 index 000000000..f21b08002 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/global/EnchantedJewellery.kt @@ -0,0 +1,338 @@ +package rs09.game.content.global + +import api.* +import api.events.TeleportEvent +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.TeleportManager +import core.game.node.entity.player.link.audio.Audio +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import org.rs09.consts.Items +import rs09.game.node.entity.skill.slayer.SlayerManager.Companion.getInstance +import rs09.game.world.GameWorld.Pulser +import java.util.* + +/** + * Represents an enchanted jewellery. + * @author Vexia & downthecrop + */ +enum class EnchantedJewellery( + + val options: Array, + val locations: Array, crumble: Boolean, vararg val ids: Int) { + RING_OF_SLAYING( + arrayOf( + "Sumona in Pollnivneach.", + "Morytania Slayer Tower.", + "Rellekka Slayer Caves.", + "Nowhere. Give me a slayer update." + ), + arrayOf( + Location.create(3313, 2960, 0), + Location.create(3429, 3533, 0), + Location.create(2793, 3615, 0), + ), + true, + Items.RING_OF_SLAYING8_13281, + Items.RING_OF_SLAYING7_13282, + Items.RING_OF_SLAYING6_13283, + Items.RING_OF_SLAYING5_13284, + Items.RING_OF_SLAYING4_13285, + Items.RING_OF_SLAYING3_13286, + Items.RING_OF_SLAYING2_13287, + Items.RING_OF_SLAYING1_13288 + ), + + RING_OF_DUELING( + arrayOf( + "Al Kharid Duel Arena.", + "Castle Wars Arena.", + "Fist of Guthix", "Nowhere." + ), + arrayOf( + Location.create(3314, 3235, 0), + Location.create(2442, 3089, 0), + Location.create(1693, 5600, 0) + ), + true, + Items.RING_OF_DUELLING8_2552, + Items.RING_OF_DUELLING7_2554, + Items.RING_OF_DUELLING6_2556, + Items.RING_OF_DUELLING5_2558, + Items.RING_OF_DUELLING4_2560, + Items.RING_OF_DUELLING3_2562, + Items.RING_OF_DUELLING2_2564, + Items.RING_OF_DUELLING1_2566 + ), + AMULET_OF_GLORY( + arrayOf( + "Edgeville", + "Karamja", + "Draynor Village", + "Al-Kharid", + "Nowhere." + ), + arrayOf( + Location.create(3087, 3495, 0), + Location.create(2919, 3175, 0), + Location.create(3104, 3249, 0), + Location.create(3304, 3124, 0) + ), + Items.AMULET_OF_GLORY4_1712, + Items.AMULET_OF_GLORY3_1710, + Items.AMULET_OF_GLORY2_1708, + Items.AMULET_OF_GLORY1_1706, + Items.AMULET_OF_GLORY_1704 + ), + AMULET_OF_GLORY_T( + AMULET_OF_GLORY.options, + AMULET_OF_GLORY.locations, + Items.AMULET_OF_GLORYT4_10354, + Items.AMULET_OF_GLORYT3_10356, + Items.AMULET_OF_GLORYT2_10358, + Items.AMULET_OF_GLORYT1_10360, + Items.AMULET_OF_GLORYT_10362 + ), + GAMES_NECKLACE( + arrayOf( + "Burthorpe Games Room.", + "Barbarian Outpost.", + "Clan Wars.", + "Wilderness Volcano.", + "Corporeal Beast" + ), + arrayOf( + Location.create(2899, 3563, 0), + Location.create(2520, 3571, 0), + Location.create(3266, 3686, 0), + Location.create(3179, 3685, 0), + Location.create(2885, 4372, 2) + ), + true, + Items.GAMES_NECKLACE8_3853, + Items.GAMES_NECKLACE7_3855, + Items.GAMES_NECKLACE6_3857, + Items.GAMES_NECKLACE5_3859, + Items.GAMES_NECKLACE4_3861, + Items.GAMES_NECKLACE3_3863, + Items.GAMES_NECKLACE2_3865, + Items.GAMES_NECKLACE1_3867 + ), + DIGSITE_PENDANT(arrayOf(), + arrayOf( + Location.create(3342, 3445, 0) + ), + true, + Items.DIGSITE_PENDANT_5_11194, + Items.DIGSITE_PENDANT_4_11193, + Items.DIGSITE_PENDANT_3_11192, + Items.DIGSITE_PENDANT_2_11191, + Items.DIGSITE_PENDANT_1_11190 + ), + COMBAT_BRACELET( + arrayOf( + "Champions' Guild", + "Monastery", + "Ranging Guild", + "Warriors' Guild", + "Nowhere." + ), + arrayOf( + Location.create(3191, 3365, 0), + Location.create(3052, 3472, 0), + Location.create(2657, 3439, 0), + Location.create(2878, 3546, 0) + ), + Items.COMBAT_BRACELET4_11118, + Items.COMBAT_BRACELET3_11120, + Items.COMBAT_BRACELET2_11122, + Items.COMBAT_BRACELET1_11124, + Items.COMBAT_BRACELET_11126 + ), + SKILLS_NECKLACE( + arrayOf( + "Fishing Guild", + "Mining Guild", + "Crafting Guild", + "Cooking Guild", + "Nowhere." + ), + arrayOf( + Location.create(2611, 3392, 0), + Location.create(3016, 3338, 0), + Location.create(2933, 3290, 0), + Location.create(3143, 3442, 0) + ), + Items.SKILLS_NECKLACE4_11105, + Items.SKILLS_NECKLACE3_11107, + Items.SKILLS_NECKLACE2_11109, + Items.SKILLS_NECKLACE1_11111, + Items.SKILLS_NECKLACE_11113 + ), + RING_OF_WEALTH( + arrayOf( + "Grand Exchange", + "Nowhere." + ), + arrayOf( + Location.create(3163, 3464, 0) + ), + Items.RING_OF_WEALTH4_14646, + Items.RING_OF_WEALTH3_14644, + Items.RING_OF_WEALTH2_14642, + Items.RING_OF_WEALTH1_14640, + Items.RING_OF_WEALTH_14638 + ); + + val isCrumble: Boolean = crumble + + /** + * Constructs a new `EnchantedJewelleryPlugin` `Object`. + * @param options the dialogue options. + * @param locations the teleport locations. + * @param ids the ordered item ids. + */ + constructor(options: Array, locations: Array, vararg ids: Int) : this(options, locations, false, *ids) + + /** + * Method used to teleport the player to the desired location. + * @param player the player. + * @param item the used jewellery item. + * @param buttonID the button id. + * @param isEquipped If the player is operating. + */ + fun use(player: Player, item: Item, buttonID: Int, isEquipped: Boolean) { + if (buttonID > locations.size - 1) { + if (isSlayerRing(item)) { + slayerProgressDialogue(player) + } + return + } + val itemIndex = getItemIndex(item) + val nextJewellery = Item(getNext(itemIndex)) + if (canTeleport(player, nextJewellery)) { + Pulser.submit(object : Pulse(0) { + private var count = 0 + private var location = getLocation(buttonID) + override fun pulse(): Boolean { + when (count) { + 0 -> { + lock(player,4) + visualize(player, ANIMATION, GRAPHICS) + playAudio(player, AUDIO, true) + player.impactHandler.disabledTicks = 4 + } + 3 -> { + teleport(player,location) + resetAnimator(player) + if (isLastItemIndex(itemIndex)) { + if (isCrumble) crumbleJewellery(player, item, isEquipped) + } else { + replaceJewellery(player, item, nextJewellery, isEquipped) + } + unlock(player) + player.dispatch(TeleportEvent(TeleportManager.TeleportType.NORMAL, 1,location)) + return true + } + } + count += 1 + return false + } + }) + } + } + + private fun replaceJewellery(player: Player, item: Item, nextJewellery: Item, isEquipped: Boolean) { + if (isEquipped) { + replaceSlot(player, item.slot, nextJewellery, Container.EQUIPMENT) + } else { + replaceSlot(player, item.slot, nextJewellery) + } + } + + private fun crumbleJewellery(player: Player, item: Item, isEquipped: Boolean) { + if (isEquipped) { + removeItem(player, item, Container.EQUIPMENT) + } else { + removeItem(player, item) + } + if (isSlayerRing(item)) { + addItem(player, Items.ENCHANTED_GEM_4155) + sendMessage(player, "Your Ring of Slaying reverts back into a regular enchanted gem.") + } + } + + private fun isSlayerRing(item: Item): Boolean { + return (item.id in RING_OF_SLAYING.ids) + } + + private fun slayerProgressDialogue(player: Player) { + val slayerManager = getInstance(player) + if (!slayerManager.hasTask()) { + sendNPCDialogue(player, slayerManager.master!!.npc, "You need something new to hunt. Come and " + + "see me When you can and I'll give you a new task.", FacialExpression.HALF_GUILTY) + return + } + sendNPCDialogue(player, slayerManager.master!!.npc, "You're currently " + + "assigned to kill ${getSlayerTaskName(player).lowercase(Locale.getDefault())}'s; " + + "only ${getSlayerTaskKillsRemaining(player)} more to go.", FacialExpression.FRIENDLY) + // Slayer tracker UI + setVarbit(player, 2502, 0, slayerManager.flags.taskFlags shr 4) + } + + private fun canTeleport(player: Player, item: Item): Boolean { + return player.zoneMonitor.teleport(1, item) + } + + private fun getNext(index: Int): Int { + val i = index + 1 + if (i > ids.size - 1) { + return ids[ids.size - 1] + } + return ids[i] + } + + private fun getLocation(index: Int): Location { + if (index > locations.size - 1) { + return locations[locations.size - 1] + } + return locations[index] + } + + fun getJewelleryName(item: Item): String { + return item.name.replace(""" ?\(t?[0-9]?\)""".toRegex(), "") + } + + fun getJewelleryType(item: Item): String { + return when { + this == GAMES_NECKLACE -> "games necklace" + this == DIGSITE_PENDANT -> "necklace" + this == COMBAT_BRACELET -> "bracelet" + this == SKILLS_NECKLACE -> "necklace" + else -> item.name.split(" ")[0].lowercase(Locale.getDefault()) + } + } + + fun isLastItemIndex(index: Int): Boolean = index == ids.size - 1 + + fun getItemIndex(item: Item): Int { + return ids.indexOf(item.id) + } + + companion object { + private val ANIMATION = Animation(714) + private val AUDIO = Audio(200) + private val GRAPHICS = Graphics(308, 100, 50) + val idMap = HashMap() + + init { + values().forEach { entry -> + entry.ids.forEach { idMap[it] = entry } + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/global/EnchantedJewelleryDialogueFile.kt b/Server/src/main/kotlin/rs09/game/content/global/EnchantedJewelleryDialogueFile.kt deleted file mode 100644 index 519c66b14..000000000 --- a/Server/src/main/kotlin/rs09/game/content/global/EnchantedJewelleryDialogueFile.kt +++ /dev/null @@ -1,18 +0,0 @@ -package rs09.game.content.global - -import core.game.content.global.EnchantedJewellery -import core.game.node.item.Item -import rs09.game.content.dialogue.DialogueFile -import rs09.tools.START_DIALOGUE - -class EnchantedJewelleryDialogueFile(val jewellery: EnchantedJewellery, val item: Item) : DialogueFile() { - override fun handle(componentID: Int, buttonID: Int) { - when(stage){ - START_DIALOGUE -> interpreter!!.sendOptions("Where would you like to go?", *jewellery.options).also { stage++ } - 1 -> { - jewellery.use(player, item, buttonID - 1,item.slot < player!!.equipment.capacity() && player!!.equipment[item.slot] == item) - end() - } - } - } -} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedJewelleryListener.kt b/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedJewelleryListener.kt index 3c01e2780..8cea2ecb2 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedJewelleryListener.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedJewelleryListener.kt @@ -1,48 +1,61 @@ package rs09.game.interaction.item -import core.game.content.global.EnchantedJewellery -import rs09.game.content.global.EnchantedJewelleryDialogueFile +import api.openDialogue +import api.sendMessage +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import rs09.game.content.dialogue.DialogueFile +import rs09.game.content.global.EnchantedJewellery import rs09.game.interaction.InteractionListener -import java.util.* +import rs09.tools.START_DIALOGUE /** * Listener for enchanted jewellery options - * @author Ceikry + * @author Ceikry & downthecrop */ class EnchantedJewelleryListener : InteractionListener { - val IDs: IntArray - init { - val idsList = ArrayList() - for (j in EnchantedJewellery.values()) { - for (id in j.ids) { - idsList.add(id) - } - } - IDs = idsList.toIntArray() - } + val ids = EnchantedJewellery.idMap.keys.toIntArray() override fun defineListeners() { - - on(IDs,ITEM,"rub","operate"){player,node -> - player.pulseManager.current.stop() - val item = node.asItem() - val jewellery = EnchantedJewellery.forItem(item) - if (jewellery.isLast(jewellery.getItemIndex(item))) { - player.packetDispatch.sendMessage("The " + jewellery.getNameType(item) + " has lost its charge.") - player.packetDispatch.sendMessage("It will need to be recharged before you can use it again.") - return@on true - } - player.packetDispatch.sendMessage("You rub the " + jewellery.getNameType(item) + "...") - - if (jewellery == EnchantedJewellery.DIGSITE_PENDANT) { - jewellery.use(player, item, 0, player.equipment.containsItem(item)) - return@on true - } else { - player.dialogueInterpreter.open(EnchantedJewelleryDialogueFile(jewellery,item)) - } + on(ids, ITEM, "operate") { player, node -> + handle(player, node, true) return@on true } + on(ids, ITEM, "rub") { player, node -> + handle(player, node, false) + return@on true + } + } + private fun handle(player: Player, node: Node, isEquipped: Boolean) { + player.pulseManager.current.stop() + val item = node.asItem() + val jewellery = EnchantedJewellery.idMap[item.id] + if (jewellery != null) { + if (jewellery.isLastItemIndex(jewellery.getItemIndex(item)) && !jewellery.isCrumble) { + sendMessage(player, "The ${jewellery.getJewelleryType(item)} has lost its charge.") + sendMessage(player, "It will need to be recharged before you can use it again.") + return + } + sendMessage(player, "You rub the ${jewellery.getJewelleryType(item)}...") + if (jewellery.options.isEmpty()) { + jewellery.use(player, item, 0, isEquipped) + return + } + openDialogue(player,EnchantedJewelleryDialogueFile(jewellery,item,isEquipped)) + } + } + class EnchantedJewelleryDialogueFile(val jewellery: EnchantedJewellery, val item: Item, val isEquipped: Boolean) : DialogueFile() { + override fun handle(componentID: Int, buttonID: Int) { + when (stage) { + START_DIALOGUE -> { + interpreter!!.sendOptions("Where would you like to go?", *jewellery.options) + stage++ + } + 1 -> end().also { jewellery.use(player!!, item, buttonID - 1, isEquipped) } + } + } } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/DiaryEventHook.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/DiaryEventHook.kt index 368c22449..ebbe588b9 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/DiaryEventHook.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/DiaryEventHook.kt @@ -298,8 +298,14 @@ class DiaryEventHook : LoginListener, Commands { } private object DiaryTeleportHooks : EventHook { + val rangingGuild = Location(2657, 3439, 0) override fun process(entity: Entity, event: TeleportEvent) { - TODO("Not yet implemented") + if(entity !is Player) return + when(event.source){ + 1 -> if (event.location.withinDistance(rangingGuild)) { + finishTask(entity, DiaryType.SEERS_VILLAGE, 2, 0) + } + } } }