diff --git a/Server/data/configs/interface_configs.json b/Server/data/configs/interface_configs.json index e255f7175..50a5a64ed 100644 --- a/Server/data/configs/interface_configs.json +++ b/Server/data/configs/interface_configs.json @@ -1,7 +1,7 @@ [ { "id": "5", - "interfaceType": "1", + "interfaceType": "8", "walkable": "true", "tabIndex": "-1" }, @@ -25,7 +25,49 @@ }, { "id": "24", - "interfaceType": "1", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "34", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "38", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "42", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "46", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "57", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "58", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "59", + "interfaceType": "8", "walkable": "true", "tabIndex": "-1" }, @@ -125,6 +167,12 @@ "walkable": "true", "tabIndex": "-1" }, + { + "id": "139", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "140", "interfaceType": "4", @@ -137,6 +185,12 @@ "walkable": "true", "tabIndex": "3" }, + { + "id": "169", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "172", "interfaceType": "4", @@ -197,15 +251,33 @@ "walkable": "true", "tabIndex": "6" }, + { + "id": "194", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "195", - "interfaceType": "1", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "196", + "interfaceType": "8", "walkable": "true", "tabIndex": "-1" }, { "id": "198", - "interfaceType": "1", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "209", + "interfaceType": "8", "walkable": "true", "tabIndex": "-1" }, @@ -263,6 +335,12 @@ "walkable": "false", "tabIndex": "-1" }, + { + "id": "240", + "interfaceType": "3", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "241", "interfaceType": "4", @@ -287,6 +365,12 @@ "walkable": "false", "tabIndex": "-1" }, + { + "id": "256", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "259", "interfaceType": "2", @@ -377,6 +461,12 @@ "walkable": "false", "tabIndex": "-1" }, + { + "id": "328", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "336", "interfaceType": "3", @@ -401,6 +491,12 @@ "walkable": "true", "tabIndex": "-1" }, + { + "id": "377", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "380", "interfaceType": "1", @@ -455,12 +551,24 @@ "walkable": "true", "tabIndex": "4" }, + { + "id": "418", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "421", "interfaceType": "4", "walkable": "false", "tabIndex": "-1" }, + { + "id": "428", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "430", "interfaceType": "2", @@ -479,6 +587,30 @@ "walkable": "true", "tabIndex": "-1" }, + { + "id": "485", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "486", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "487", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "488", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "498", "interfaceType": "0", @@ -499,7 +631,7 @@ }, { "id": "532", - "interfaceType": "1", + "interfaceType": "8", "walkable": "true", "tabIndex": "-1" }, @@ -611,9 +743,15 @@ "walkable": "false", "tabIndex": "-1" }, + { + "id": "653", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, { "id": "656", - "interfaceType": "1", + "interfaceType": "8", "walkable": "true", "tabIndex": "-1" }, @@ -727,7 +865,7 @@ }, { "id": "809", - "interfaceType": "1", + "interfaceType": "8", "walkable": "true", "tabIndex": "-1" } diff --git a/Server/src/main/content/global/handlers/iface/EquipmentInterface.java b/Server/src/main/content/global/handlers/iface/EquipmentInterface.java index 3461a0236..f8cfa2660 100644 --- a/Server/src/main/content/global/handlers/iface/EquipmentInterface.java +++ b/Server/src/main/content/global/handlers/iface/EquipmentInterface.java @@ -1,5 +1,7 @@ package content.global.handlers.iface; +import content.global.skill.summoning.familiar.BurdenBeast; +import core.api.ContentAPIKt; import core.cache.def.impl.ItemDefinition; import core.game.component.Component; import core.game.component.ComponentDefinition; @@ -24,6 +26,7 @@ import core.game.global.action.EquipHandler; import core.game.interaction.IntType; import core.game.interaction.InteractionListeners; import core.game.world.GameWorld; +import core.tools.Log; /** * Represents the equipment interface. @@ -35,6 +38,7 @@ public final class EquipmentInterface extends ComponentPlugin { @Override public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(102, this); ComponentDefinition.put(387, this); ComponentDefinition.put(667, this); ComponentDefinition.put(670, this); @@ -111,20 +115,46 @@ public final class EquipmentInterface extends ComponentPlugin { if (p.getInterfaceManager().isOpened() && p.getInterfaceManager().getOpened().getId() == 102) { return true; } - boolean skulled = p.getSkullManager().isSkulled(); - boolean usingProtect = p.getPrayer().get(PrayerType.PROTECT_ITEMS); - p.getInterfaceManager().openComponent(102); - p.getPacketDispatch().sendIfaceSettings(211, 0, 2, 6684690, 4); - p.getPacketDispatch().sendIfaceSettings(212, 0, 2, 6684693, 42); + + // (Highlight white items are auto destroyed on death Enum#616 (Items kept on death interface) TODO: Parse server sided + // SCRIPT 118 - Items kept on death interface CS + // ARG 0: Safe location check Takes: 0 Safe Area/2 in POH/3 in Castle Wars/4 in Trouble Brewing/5 in Barbass + int zoneType = p.getZoneMonitor().getType(); + // ARG 1: Amount of items kept on death Takes: 0/1/3/4 Container[] itemArray = DeathTask.getContainers(p); Container kept = itemArray[0]; - int state = 0; // 1=familiar carrying items - int keptItems = skulled ? (usingProtect ? 1 : 0) : (usingProtect ? 4 : 3); - int zoneType = p.getZoneMonitor().getType(); - int pvpType = p.getSkullManager().isWilderness() ? 0 : 1; - Object[] params = new Object[] { 11510, 12749, "", state, pvpType, kept.getId(3), kept.getId(2), kept.getId(1), kept.getId(0), keptItems, zoneType }; - PacketRepository.send(ContainerPacket.class, new ContainerContext(p, 149, 0, 91, itemArray[1], false)); - p.getPacketDispatch().sendRunScript(118, "iiooooiisii", params); + int amtKeptOnDeath = kept.itemCount(); + if (amtKeptOnDeath > 4 && zoneType == 0) { + ContentAPIKt.log(this.getClass(), Log.ERR, "Items kept on death interface should not contain more than 4 items when not in a safe zone!"); + } + // ARG 2: Item kept on death slot 0 + int slot0 = kept.getId(0); + // ARG 3: Item kept on death slot 1 + int slot1 = kept.getId(1); + // ARG 4: Item kept on death slot 2 + int slot2 = kept.getId(2); + // ARG 5: Item kept on death slot 3 + int slot3 = kept.getId(3); + // ARG 6: Player skulled Takes: 0 not skulled/1 skulled + int skulled = p.getSkullManager().isSkulled() ? 1 : 0; + // ARG 7: Player has summoning creature out Takes: 0 not out/1 Creature summoned + int hasBoB; + if (p.getFamiliarManager().hasFamiliar()) { + if (p.getFamiliarManager().getFamiliar().isBurdenBeast()) { + hasBoB = ((BurdenBeast) p.getFamiliarManager().getFamiliar()).getContainer().isEmpty() ? 0 : 1; + } else { + hasBoB = 0; + } + } else { + hasBoB = 0; + } + // ARG 8: String for effect: + // if (arg1 == 0) arg8 + " This reduces the items you keep from three to zero!" + // if (arg1 == 1) arg8 + " This reduces the items you keep from three to zero!" + "
" + "
" + "However, you also have the " + "" + "Protect Items" + "" + " prayer active, which saves you one extra item!"); + Object[] params = new Object[] { hasBoB, skulled, slot3, slot2, slot1, slot0, amtKeptOnDeath, zoneType, "You are skulled." }; + p.getPacketDispatch().sendRunScript(118, "siiooooii", params); + + p.getInterfaceManager().openComponent(102); break; case 28: if (opcode == 81) { diff --git a/Server/src/main/content/global/handlers/item/EmptyOptionListener.kt b/Server/src/main/content/global/handlers/item/EmptyOptionListener.kt index bb231c345..f82728e7f 100644 --- a/Server/src/main/content/global/handlers/item/EmptyOptionListener.kt +++ b/Server/src/main/content/global/handlers/item/EmptyOptionListener.kt @@ -4,6 +4,7 @@ import core.api.* import core.cache.def.impl.ItemDefinition import core.game.interaction.IntType import core.game.interaction.InteractionListener +import core.game.node.item.Item import org.rs09.consts.Items import org.rs09.consts.Sounds import java.util.* @@ -17,18 +18,14 @@ class EmptyOptionListener : InteractionListener { on(EmptyItem.emptyItemList.toIntArray(), IntType.ITEM, "empty", "empty bowl", "empty dish") { player, node -> if (node.name.contains("brew") || node.name.contains("potion") || node.name.lowercase(Locale.getDefault()).contains("poison") || node.name.lowercase(Locale.getDefault()).contains("serum") || node.name.contains("cure") || node.name.contains("mix") || node.name.contains("balm")) { - if (removeItem(player, node.id)) { - addItem(player, EmptyItem.getEmpty(Items.POTION_195)!!) - playAudio(player, EmptyItem.getEmptyAudio(Items.POTION_195)!!) - } + replaceSlot(player, node.asItem().slot, Item(EmptyItem.getEmpty(Items.POTION_195)!!), node.asItem()) + playAudio(player, EmptyItem.getEmptyAudio(Items.POTION_195)!!) return@on true } if (EmptyItem.emptyItemMap[node.id] != null) { - if (removeItem(player, node.id)) { - addItem(player, EmptyItem.getEmpty(node.id)!!) - if (EmptyItem.getEmptyAudio(node.id) != -1) playAudio(player, EmptyItem.getEmptyAudio(node.id)!!) - EmptyItem.getEmptyMessage(node.id)?.let { sendMessage(player, it) } - } + replaceSlot(player, node.asItem().slot, Item(EmptyItem.getEmpty(node.id)!!), node.asItem()) + if (EmptyItem.getEmptyAudio(node.id) != -1) playAudio(player, EmptyItem.getEmptyAudio(node.id)!!) + EmptyItem.getEmptyMessage(node.id)?.let { sendMessage(player, it) } } return@on true } diff --git a/Server/src/main/content/global/skill/cooking/CookingDialogue.kt b/Server/src/main/content/global/skill/cooking/CookingDialogue.kt index f3ea44026..a560c8026 100644 --- a/Server/src/main/content/global/skill/cooking/CookingDialogue.kt +++ b/Server/src/main/content/global/skill/cooking/CookingDialogue.kt @@ -3,7 +3,6 @@ package content.global.skill.cooking import core.api.* import core.cache.def.impl.ItemDefinition import core.game.node.scenery.Scenery -import content.global.skill.cooking.CookableItems import content.global.skill.cooking.CookingRewrite.Companion.cook import core.net.packet.PacketRepository import core.net.packet.context.ChildPositionContext @@ -15,6 +14,7 @@ import core.tools.START_DIALOGUE /** * @author Ceikry * @author bushtail - fixing it up + * @auther Woah - for more fixing up */ class CookingDialogue(vararg val args: Any) : DialogueFile(){ @@ -47,7 +47,7 @@ class CookingDialogue(vararg val args: Any) : DialogueFile(){ "Dry the meat into sinew", "Cook the meat" ) - stage = 100 + stage = if (amountInInventory(player!!, initial) > 1) 100 else 101 return } } @@ -78,7 +78,7 @@ class CookingDialogue(vararg val args: Any) : DialogueFile(){ when (buttonID) { 1 -> { product = Items.SINEW_9436 - display(Items.COOKED_MEAT_2142) + display() } 2 -> { product = CookableItems.forId(initial).cooked @@ -86,6 +86,19 @@ class CookingDialogue(vararg val args: Any) : DialogueFile(){ } } } + + 101 -> { + when (buttonID) { + 1 -> { + end() + cook(player!!, `object`, initial, Items.SINEW_9436, 1) + } + 2 -> { + end() + cook(player!!, `object`, initial, CookableItems.forId(initial).cooked, 1) + } + } + } } } @@ -99,12 +112,23 @@ class CookingDialogue(vararg val args: Any) : DialogueFile(){ return -1 } - fun display(vararg args : Int) { + fun display() { + player!!.packetDispatch.sendItemZoomOnInterface(initial, 160, 307, 2) + player!!.packetDispatch.sendString("



${ItemDefinition.forId(initial).name}", 307, 6) + + // Re-format this interface because it is not formatted properly for the chat-box + // Swords + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 307, 0, 12, 15)) + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 307, 1, 431, 15)) + // "How many would you like to cook?" + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 307, 7, 0, 12)) + // Right click context menu boxes + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 307, 3, 58, 27)) + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 307, 4, 58, 27)) + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 307, 5, 58, 27)) + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 307, 6, 58, 27)) + player!!.interfaceManager.openChatbox(307) - PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 307, 3, 60, 90)) - PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 307, 2, 208, 20)) - player!!.packetDispatch.sendItemZoomOnInterface(if(args.size == 1) args[0] else product, 160, 307, 2) - player!!.packetDispatch.sendString(ItemDefinition.forId(product).name, 307, 3) stage = 1 } } \ No newline at end of file diff --git a/Server/src/main/content/global/skill/cooking/CookingRewrite.kt b/Server/src/main/content/global/skill/cooking/CookingRewrite.kt index 5da124cb8..76d485956 100644 --- a/Server/src/main/content/global/skill/cooking/CookingRewrite.kt +++ b/Server/src/main/content/global/skill/cooking/CookingRewrite.kt @@ -1,5 +1,6 @@ package content.global.skill.cooking +import core.api.amountInInventory import core.game.interaction.IntType import core.game.interaction.InteractionListener import core.game.node.entity.player.Player @@ -15,6 +16,7 @@ import org.rs09.consts.Items.UNCOOKED_CAKE_1889 /** * @author Ceikry * @author bushtail - added bear meat for sinew making + * @author Woah - added single food cooking */ class CookingRewrite : InteractionListener { @@ -47,7 +49,17 @@ class CookingRewrite : InteractionListener { } //cook a standard item - player.dialogueInterpreter.open(CookingDialogue(item.id,obj)) + if (amountInInventory(player, item.id) > 1) { + player.dialogueInterpreter.open(CookingDialogue(item.id,obj)) + } else { + // Don't display dialogue if player only has *1* of the item + val product = if (CookableItems.intentionalBurn(item.id)) { // checks intentional burning + CookableItems.getIntentionalBurn(item.id).id + } else { + CookableItems.forId(item.id).cooked + } + cook(player, obj, item.id, product, 1) + } return@onUseWith true } diff --git a/Server/src/main/content/global/skill/crafting/StuddedArmourPlugin.java b/Server/src/main/content/global/skill/crafting/StuddedArmourPlugin.java index e17ba01f9..1abe86feb 100644 --- a/Server/src/main/content/global/skill/crafting/StuddedArmourPlugin.java +++ b/Server/src/main/content/global/skill/crafting/StuddedArmourPlugin.java @@ -71,7 +71,7 @@ public final class StuddedArmourPlugin extends UseWithHandler { * @version 1.0 */ public enum StuddedArmour { - CHAPS(new Item(1095), new Item(1097), 18, 27), BODY(new Item(1129), new Item(1133), 41, 40); + CHAPS(new Item(1095), new Item(1097), 44, 42), BODY(new Item(1129), new Item(1133), 41, 40); /** * Represents the unstudded item. diff --git a/Server/src/main/content/global/skill/fletching/FletchingListeners.kt b/Server/src/main/content/global/skill/fletching/FletchingListeners.kt index 461df2d2c..54ac72b5d 100644 --- a/Server/src/main/content/global/skill/fletching/FletchingListeners.kt +++ b/Server/src/main/content/global/skill/fletching/FletchingListeners.kt @@ -63,7 +63,7 @@ class FletchingListeners : InteractionListener { onUseWith(IntType.ITEM,ARROW_SHAFT,*FEATHERS){ player, shaft, feather -> val handler: SkillDialogueHandler = - object : SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, Item(FLETCHED_SHAFT)) { + object : SkillDialogueHandler(player, SkillDialogue.MAKE_SET_ONE_OPTION, Item(FLETCHED_SHAFT)) { override fun create(amount: Int, index: Int) { player.pulseManager.run(HeadlessArrowPulse(player, shaft.asItem(), Item(feather.id), amount)) } @@ -73,14 +73,13 @@ class FletchingListeners : InteractionListener { } } handler.open() - PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, Components.SKILL_MULTI1_309, 2, 210, 10)) return@onUseWith true } onUseWith(IntType.ITEM,FLETCHED_SHAFT,*UNFINISHED_ARROWS){ player, shaft, unfinished -> val head = Fletching.arrowHeadMap[unfinished.id] ?: return@onUseWith false val handler: SkillDialogueHandler = - object : SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, head.getFinished()) { + object : SkillDialogueHandler(player, SkillDialogue.MAKE_SET_ONE_OPTION, head.getFinished()) { override fun create(amount: Int, index: Int) { player.pulseManager.run(ArrowHeadPulse(player, shaft.asItem(), head, amount)) } @@ -90,7 +89,6 @@ class FletchingListeners : InteractionListener { } } handler.open() - PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, Components.SKILL_MULTI1_309, 2, 210, 10)) return@onUseWith true } diff --git a/Server/src/main/content/global/skill/fletching/FletchingPlugin.java b/Server/src/main/content/global/skill/fletching/FletchingPlugin.java index 961c320f2..3ec122866 100644 --- a/Server/src/main/content/global/skill/fletching/FletchingPlugin.java +++ b/Server/src/main/content/global/skill/fletching/FletchingPlugin.java @@ -49,7 +49,7 @@ public class FletchingPlugin extends UseWithHandler { //handle darts if(Fletching.isDart(event.getUsedItem().getId())){ final Fletching.Darts dart = Fletching.dartMap.get(event.getUsedItem().getId()); - SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, dart.getFinished()) { + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.MAKE_SET_ONE_OPTION, dart.getFinished()) { @Override public void create(final int amount, int index) { player.getPulseManager().run(new DartPulse(player, event.getUsedItem(), dart, amount)); @@ -60,7 +60,6 @@ public class FletchingPlugin extends UseWithHandler { } }; handler.open(); - PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 309, 2, 230, 10)); return true; } @@ -78,7 +77,7 @@ public class FletchingPlugin extends UseWithHandler { final boolean hasFeather = (featherId == 314 || (featherId >= 10087 && featherId <= 10091)); if (hasFeather) { - SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, bolt.getFinished()) { + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.MAKE_SET_ONE_OPTION, bolt.getFinished()) { @Override public void create(final int amount, int index) { player.getPulseManager().run(new BoltPulse(player, event.getUsedItem(), bolt, new Item(featherId), amount)); @@ -89,7 +88,6 @@ public class FletchingPlugin extends UseWithHandler { } }; handler.open(); - PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 309, 2, 210, 10)); return true; } return false; diff --git a/Server/src/main/content/global/skill/fletching/GemBoltListener.kt b/Server/src/main/content/global/skill/fletching/GemBoltListener.kt index fb2bcca60..94c09c65b 100644 --- a/Server/src/main/content/global/skill/fletching/GemBoltListener.kt +++ b/Server/src/main/content/global/skill/fletching/GemBoltListener.kt @@ -53,7 +53,7 @@ class GemBoltListener : InteractionListener { val handler: SkillDialogueHandler = - object : SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, Item(bolt.product)) { + object : SkillDialogueHandler(player, SkillDialogue.MAKE_SET_ONE_OPTION, Item(bolt.product)) { override fun create(amount: Int, index: Int) { player.pulseManager.run(GemBoltPulse(player, used as? Item, bolt, amount)) } @@ -63,7 +63,6 @@ class GemBoltListener : InteractionListener { } } handler.open() - PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 309, 2, 210, 10)) return@onUseWith true } } diff --git a/Server/src/main/content/global/skill/fletching/items/bow/StringPulse.java b/Server/src/main/content/global/skill/fletching/items/bow/StringPulse.java index fdae3a1bb..fd1b2c560 100644 --- a/Server/src/main/content/global/skill/fletching/items/bow/StringPulse.java +++ b/Server/src/main/content/global/skill/fletching/items/bow/StringPulse.java @@ -1,5 +1,7 @@ package content.global.skill.fletching.items.bow; +import core.api.Container; +import core.api.ContentAPIKt; import core.game.node.entity.player.link.diary.DiaryType; import core.game.world.map.zone.ZoneBorders; import core.game.node.entity.skill.SkillPulse; @@ -46,6 +48,9 @@ public class StringPulse extends SkillPulse { player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + bow.level + " to string this bow."); return false; } + if (!player.getInventory().containsItem(new Item(bow.unfinished))) { + return false; + } if (!player.getInventory().containsItem(new Item(bow.string))) { player.getDialogueInterpreter().sendDialogue("You seem to have run out of bow strings."); return false; diff --git a/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt b/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt new file mode 100644 index 000000000..0c8d93296 --- /dev/null +++ b/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt @@ -0,0 +1,34 @@ +package content.global.skill.herblore + +import core.api.* +import core.game.interaction.IntType +import core.game.interaction.InteractionListener +import core.game.node.entity.skill.Skills +import core.game.node.item.Item +import java.util.* + +/** + * Dirty herb cleaning listener + * @author Woah + */ +class HerbCleanListener : InteractionListener { + override fun defineListeners() { + on(IntType.ITEM, "clean") { player, node -> + lock(player, 1) + if (!requireQuest(player, "Druidic Ritual", "before you can use Herblore.")) return@on true + val herb: Herbs = Herbs.forItem(node as Item) ?: return@on true + + if (getDynLevel(player, Skills.HERBLORE) < herb.level) { + sendMessage(player, "You need level " + herb.level + " Herblore to clean the " + herb.product.name.replace("Clean", "Grimy") + ".") + return@on true + } + + val exp = herb.experience + replaceSlot(player, node.asItem().slot, herb.product, node.asItem()) + rewardXP(player, Skills.HERBLORE, exp) + playAudio(player, 5153) + sendMessage(player, "You clean the dirt from the " + herb.product.name.lowercase(Locale.getDefault()).replace("clean", "").trim { it <= ' ' } + " leaf.") + return@on true + } + } +} \ No newline at end of file diff --git a/Server/src/main/content/global/skill/herblore/HerbCleanPlugin.java b/Server/src/main/content/global/skill/herblore/HerbCleanPlugin.java deleted file mode 100644 index 3de0c24f0..000000000 --- a/Server/src/main/content/global/skill/herblore/HerbCleanPlugin.java +++ /dev/null @@ -1,56 +0,0 @@ -package content.global.skill.herblore; - -import core.api.Container; -import static core.api.ContentAPIKt.*; -import core.cache.def.impl.ItemDefinition; -import core.game.interaction.OptionHandler; -import core.game.node.Node; -import core.game.node.entity.player.Player; -import core.game.node.entity.skill.Skills; -import core.game.node.item.Item; -import core.plugin.Initializable; -import core.plugin.Plugin; -import core.tools.RandomFunction; - -/** - * Represents the cleaning of a dirty herb. - * @author Vexia - * @version 1.0 - */ -@Initializable -public final class HerbCleanPlugin extends OptionHandler { - - @Override - public Plugin newInstance(Object arg) throws Throwable { - ItemDefinition.setOptionHandler("clean", this); - return this; - } - - @Override - public boolean handle(Player player, Node node, String option) { - if (!player.getQuestRepository().isComplete("Druidic Ritual")) { - player.getPacketDispatch().sendMessage("You must complete the Druidic Ritual quest before you can use Herblore."); - return true; - } - final Herbs herb = Herbs.forItem((Item) node); - if (player.getSkills().getLevel(Skills.HERBLORE) < herb.getLevel()) { - player.getPacketDispatch().sendMessage("You need level " + herb.getLevel() + " Herblore to clean the " + herb.getProduct().getName().replace("Clean", "Grimy") + "."); - return true; - } - double exp = herb.getExperience(); - if (removeItem(player, node.asItem(), Container.INVENTORY)){ - player.getSkills().addExperience(Skills.HERBLORE, exp, true); - addItem(player, herb.getProduct().getId(), 1, Container.INVENTORY); - playAudio(player, 5153); - player.getPacketDispatch().sendMessage("You clean the dirt from the " + herb.getProduct().getName().toLowerCase().replace("clean", "").trim() + " leaf."); - } - player.lock(1); - return true; - } - - @Override - public boolean isWalk() { - return false; - } - -} diff --git a/Server/src/main/content/minigame/puropuro/PuroPuroPlugin.java b/Server/src/main/content/minigame/puropuro/PuroPuroPlugin.java index 81651326d..3aa053f8a 100644 --- a/Server/src/main/content/minigame/puropuro/PuroPuroPlugin.java +++ b/Server/src/main/content/minigame/puropuro/PuroPuroPlugin.java @@ -1,21 +1,14 @@ package content.minigame.puropuro; -import java.util.ArrayList; -import java.util.List; - import core.cache.def.impl.ItemDefinition; import core.cache.def.impl.NPCDefinition; -import core.cache.def.impl.SceneryDefinition; import core.game.component.Component; -import core.plugin.Initializable; -import core.game.node.entity.skill.Skills; import core.game.interaction.Option; import core.game.interaction.OptionHandler; import core.game.node.Node; import core.game.node.entity.Entity; -import core.game.node.entity.impl.ForceMovement; import core.game.node.entity.player.Player; -import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.entity.skill.Skills; import core.game.node.item.Item; import core.game.node.scenery.Scenery; import core.game.node.scenery.SceneryBuilder; @@ -31,473 +24,490 @@ import core.game.world.update.flag.context.Animation; import core.net.packet.PacketRepository; import core.net.packet.context.MinimapStateContext; import core.net.packet.out.MinimapState; -import core.plugin.Plugin; import core.plugin.ClassScanner; +import core.plugin.Initializable; +import core.plugin.Plugin; import core.tools.RandomFunction; +import org.rs09.consts.Items; -import static core.api.ContentAPIKt.animateScenery; -import static core.api.ContentAPIKt.submitWorldPulse; -import static core.api.ContentAPIKt.animationDuration; -import static core.api.ContentAPIKt.forceMove; +import java.util.ArrayList; +import java.util.List; + +import static core.api.ContentAPIKt.*; /** * Handles the puro puro activity. + * * @author Vexia */ @Initializable public final class PuroPuroPlugin extends MapZone implements Plugin { - /** - * The moving wheat. - */ - private static final List WHEAT = new ArrayList<>(20); + /** + * The moving wheat. + */ + private static final List WHEAT = new ArrayList<>(20); - /** - * The pulse. - */ - private static final Pulse PULSE = new Pulse(1) { - @Override - public boolean pulse() { - for (WheatSet set : WHEAT) { - if (set.canWhilt()) { - set.whilt(); - } - } - return false; - } - }; + /** + * The pulse. + */ + private static final Pulse PULSE = new Pulse(1) { + @Override + public boolean pulse() { + for (WheatSet set : WHEAT) { + if (set.canWhilt()) { + set.whilt(); + } + } + return false; + } + }; - /** - * Constructs a new {@code PuroPuroActivity} {@code Object}. - */ - public PuroPuroPlugin() { - super("puro puro", true); - setZoneType(ZoneType.SAFE.getId()); - } + /** + * Constructs a new {@code PuroPuroActivity} {@code Object}. + */ + public PuroPuroPlugin() { + super("puro puro", true); + setZoneType(ZoneType.SAFE.getId()); + } - @Override - public Plugin newInstance(Object arg) throws Throwable { - PULSE.stop(); - ZoneBuilder.configure(this); - ClassScanner.definePlugin(new FairyAerykaDialogue()); - ClassScanner.definePlugin(new WanderingImplingDialogue()); - ClassScanner.definePlugin(new ElnockInquisitorDialogue()); - ClassScanner.definePlugin(new PuroOptionHandler()); - return this; - } + @Override + public Plugin newInstance(Object arg) throws Throwable { + PULSE.stop(); + ZoneBuilder.configure(this); + ClassScanner.definePlugin(new FairyAerykaDialogue()); + ClassScanner.definePlugin(new WanderingImplingDialogue()); + ClassScanner.definePlugin(new ElnockInquisitorDialogue()); + ClassScanner.definePlugin(new PuroOptionHandler()); + return this; + } - @Override - public Object fireEvent(String identifier, Object... args) { - return null; - } + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } - @Override - public boolean enter(Entity e) { - if (e instanceof Player) { - Player p = e.asPlayer(); - PacketRepository.send(MinimapState.class, new MinimapStateContext(p, 2)); - } - if (!PULSE.isRunning()) { - spawnWheat(); - PULSE.restart(); - PULSE.start(); - GameWorld.getPulser().submit(PULSE); - } - return super.enter(e); - } + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player p = e.asPlayer(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(p, 2)); + } + if (!PULSE.isRunning()) { + spawnWheat(); + PULSE.restart(); + PULSE.start(); + GameWorld.getPulser().submit(PULSE); + } + return super.enter(e); + } - @Override - public boolean leave(Entity e, boolean logout) { - if (e instanceof Player) { - Player p = e.asPlayer(); - if (!logout) { - p.getInterfaceManager().close(); - p.getInterfaceManager().closeOverlay(); - PacketRepository.send(MinimapState.class, new MinimapStateContext(p, 0)); - } - } - return super.leave(e, logout); - } + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player p = e.asPlayer(); + if (!logout) { + p.getInterfaceManager().close(); + p.getInterfaceManager().closeOverlay(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(p, 0)); + } + } + return super.leave(e, logout); + } - @Override - public boolean interact(Entity e, Node target, Option option) { - if (e instanceof Player) { - Player p = (Player) e; - switch (target.getId()) { - case 25016: - case 25029: - case 25019: - case 25018: - case 25020: - case 25021: - pushThrough(p, (Scenery) target); - return true; + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + Player p = (Player) e; + switch (target.getId()) { + case 25016: + case 25029: + case 25019: + case 25018: + case 25020: + case 25021: + pushThrough(p, (Scenery) target); + return true; + } + } + return super.interact(e, target, option); + } + + /** + * Pushes through the wheat. + * + * @param player the player. + * @param object the object. + */ + private void pushThrough(final Player player, final Scenery object) { + if (player.getSkills().getStaticLevel(Skills.HUNTER) < 17) { + player.sendMessage("You need a Hunting level of at least 17 to enter the maze."); + return; + } + if (hasImplingBox(player)) { + player.getDialogueInterpreter().sendDialogue("Something prevents you from entering. You think the portal is", "offended by your imp boxes. They are not popular on imp", "and impling planes."); + return; + } + final Location dest = object.getLocation().transform(Direction.getLogicalDirection(player.getLocation(), object.getLocation()), 1); + if (RegionManager.getObject(dest) != null) { + player.sendMessage("An object on the other side is in your way."); + return; + } + if (RandomFunction.random(2) == 0) { + player.sendMessage("You use your strength to push through the wheat."); + } else { + player.sendMessage("You use your strength to push through the wheat. It's hard work though."); + } + player.setAttribute("cantMove", true); + forceMove(player, player.getLocation(), dest, 0, 265, null, 6595, null); + } + + /** + * Spawns the wheat. + */ + private void spawnWheat() { + for (WheatSet set : WHEAT) { + set.init(); + } + } + + /** + * Checks if the player has an impling box. + * + * @param player the player. + * @return {@code True} if so. + */ + private boolean hasImplingBox(Player player) { + return player.getInventory().contains(10025, 1) || player.getInventory().contains(10027, 1) || player.getInventory().contains(10028, 1); + } + + @Override + public void configure() { + registerRegion(10307); + WHEAT.add(new WheatSet(0, Location.create(2606, 4329, 0), Location.create(2606, 4328, 0))); + WHEAT.add(new WheatSet(1, Location.create(2596, 4331, 0), Location.create(2597, 4331, 0))); + WHEAT.add(new WheatSet(0, Location.create(2580, 4326, 0), Location.create(2580, 4325, 0))); + WHEAT.add(new WheatSet(1, Location.create(2595, 4308, 0), Location.create(2596, 4308, 0))); + WHEAT.add(new WheatSet(0, Location.create(2603, 4314, 0), Location.create(2603, 4313, 0))); + WHEAT.add(new WheatSet(1, Location.create(2599, 4305, 0), Location.create(2600, 4305, 0))); + WHEAT.add(new WheatSet(0, Location.create(2577, 4327, 0), Location.create(2577, 4328, 0))); + WHEAT.add(new WheatSet(1, Location.create(2587, 4334, 0), Location.create(2586, 4334, 0))); + WHEAT.add(new WheatSet(0, Location.create(2609, 4310, 0), Location.create(2609, 4309, 0))); + WHEAT.add(new WheatSet(1, Location.create(2586, 4302, 0), Location.create(2587, 4302, 0))); + WHEAT.add(new WheatSet(0, Location.create(2574, 4310, 0), Location.create(2574, 4311, 0))); + WHEAT.add(new WheatSet(1, Location.create(2582, 4337, 0), Location.create(2581, 4337, 0))); + WHEAT.add(new WheatSet(0, Location.create(2571, 4316, 0), Location.create(2571, 4315, 0))); + WHEAT.add(new WheatSet(1, Location.create(2601, 4340, 0), Location.create(2602, 4340, 0))); + WHEAT.add(new WheatSet(0, Location.create(2612, 4324, 0), Location.create(2612, 4323, 0))); + WHEAT.add(new WheatSet(1, Location.create(2584, 4296, 0), Location.create(2583, 4296, 0))); + WHEAT.add(new WheatSet(0, Location.create(2568, 4329, 0), Location.create(2568, 4330, 0))); + WHEAT.add(new WheatSet(1, Location.create(2595, 4343, 0), Location.create(2596, 4343, 0))); + WHEAT.add(new WheatSet(0, Location.create(2615, 4315, 0), Location.create(2615, 4314, 0))); + WHEAT.add(new WheatSet(1, Location.create(2601, 4293, 0), Location.create(2600, 4293, 0))); + WHEAT.add(new WheatSet(0, Location.create(2565, 4310, 0), Location.create(2565, 4311, 0))); + WHEAT.add(new WheatSet(1, Location.create(2582, 4346, 0), Location.create(2583, 4346, 0))); + WHEAT.add(new WheatSet(0, Location.create(2568, 4348, 0), Location.create(2568, 4347, 0))); + WHEAT.add(new WheatSet(0, Location.create(2615, 4347, 0), Location.create(2615, 4348, 0))); + WHEAT.add(new WheatSet(0, Location.create(2612, 4345, 0), Location.create(2612, 4344, 0))); + WHEAT.add(new WheatSet(0, Location.create(2614, 4292, 0), Location.create(2614, 4291, 0))); + WHEAT.add(new WheatSet(0, Location.create(2568, 4292, 0), Location.create(2568, 4291, 0))); + WHEAT.add(new WheatSet(0, Location.create(2571, 4295, 0), Location.create(2571, 4294, 0))); + WHEAT.add(new WheatSet(0, Location.create(2575, 4297, 0), Location.create(2575, 4298, 0))); + WHEAT.add(new WheatSet(0, Location.create(2584, 4330, 0), Location.create(2584, 4329, 0))); + WHEAT.add(new WheatSet(0, Location.create(2599, 4329, 0), Location.create(2599, 4330, 0))); + WHEAT.add(new WheatSet(1, Location.create(2602, 4312, 0), Location.create(2601, 4312, 0))); + WHEAT.add(new WheatSet(1, Location.create(2610, 4312, 0), Location.create(2611, 4312, 0))); + WHEAT.add(new WheatSet(1, Location.create(2570, 4309, 0), Location.create(2569, 4309, 0))); + WHEAT.add(new WheatSet(0, Location.create(2583, 4304, 0), Location.create(2583, 4303, 0))); + } + + /** + * Handles the puro puro options. + * + * @author Vexia + */ + public class PuroOptionHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(6070).getHandlers().put("option:trade", this); + ItemDefinition.forId(11273).getHandlers().put("option:toggle-view", this); + ItemDefinition.forId(11258).getHandlers().put("option:butterfly-jar", this); + ItemDefinition.forId(11258).getHandlers().put("option:impling-jar", this); + ItemDefinition.forId(11258).getHandlers().put("option:check", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 11258: + handleJarGenerator(player, (Item) node, option); + break; + case 6070: + ElnockInquisitorDialogue.openShop(player); + break; + case 11273: + if (!player.getZoneMonitor().isInZone("puro puro")) { + player.sendMessage("You can only use this in the Puro Puro Maze."); + break; + } else { + if (player.getInterfaceManager().getOverlay() != null) { + player.getInterfaceManager().closeOverlay(); + break; } - } - return super.interact(e, target, option); - } - /** - * Pushes through the wheat. - * @param player the player. - * @param object the object. - */ - private void pushThrough(final Player player, final Scenery object) { - if (player.getSkills().getStaticLevel(Skills.HUNTER) < 17) { - player.sendMessage("You need a Hunting level of at least 17 to enter the maze."); - return; - } - if (hasImplingBox(player)) { - player.getDialogueInterpreter().sendDialogue("Something prevents you from entering. You think the portal is", "offended by your imp boxes. They are not popular on imp", "and impling planes."); - return; - } - final Location dest = object.getLocation().transform(Direction.getLogicalDirection(player.getLocation(), object.getLocation()), 1); - if (RegionManager.getObject(dest) != null) { - player.sendMessage("An object on the other side is in your way."); - return; - } - if (RandomFunction.random(2) == 0) { - player.sendMessage("You use your strength to push through the wheat."); - } else { - player.sendMessage("You use your strength to push through the wheat. It's hard work though."); - } - player.setAttribute("cantMove", true); - forceMove(player, player.getLocation(), dest, 0, 265, null, 6595, null); - } + player.getInterfaceManager().openOverlay(new Component(169)); + } + return true; + } + return true; + } - /** - * Spawns the wheat. - */ - private void spawnWheat() { - for (WheatSet set : WHEAT) { - set.init(); - } - } + /** + * Handles the jar generator. + * + * @param player the player. + * @param item the item. + * @param option the option. + */ + private void handleJarGenerator(Player player, Item item, String option) { + switch (option) { + case "butterfly-jar": + case "impling-jar": + generate(player, item, option); + break; + case "check": + player.sendMessage("Your jar generator has a charge percentage of " + getPercent(item) + "."); + break; + } + } - /** - * Checks if the player has an impling box. - * @param player the player. - * @return {@code True} if so. - */ - private boolean hasImplingBox(Player player) { - return player.getInventory().contains(10025, 1) || player.getInventory().contains(10027, 1) || player.getInventory().contains(10028, 1); - } + /** + * Generates a new jar. + * + * @param player the player. + * @param item the item. + * @param option the option. + */ + private void generate(Player player, Item item, String option) { + final Item jar = option.equals("butterfly-jar") ? new Item(10012) : new Item(11260); + final int percent = jar.getId() == 10012 ? 1 : 3; + if (!hasPercent(item, percent)) { + player.sendMessage("Your jar generator doesn't have enough charges to make another " + jar.getName().toLowerCase() + "."); + return; + } + player.lock(5); + player.animate(new Animation(6592)); + player.getInventory().add(jar); + setPercent(item, percent); + player.sendMessage("Your jar generator generates a " + jar.getName().toLowerCase() + "."); + if (getPercent(item) <= 0) { + player.getInventory().remove(item); + player.sendMessage("Your jar generator runs out of charges."); + } + } - @Override - public void configure() { - registerRegion(10307); - WHEAT.add(new WheatSet(0, Location.create(2606, 4329, 0), Location.create(2606, 4328, 0))); - WHEAT.add(new WheatSet(1, Location.create(2596, 4331, 0), Location.create(2597, 4331, 0))); - WHEAT.add(new WheatSet(0, Location.create(2580, 4326, 0), Location.create(2580, 4325, 0))); - WHEAT.add(new WheatSet(1, Location.create(2595, 4308, 0), Location.create(2596, 4308, 0))); - WHEAT.add(new WheatSet(0, Location.create(2603, 4314, 0), Location.create(2603, 4313, 0))); - WHEAT.add(new WheatSet(1, Location.create(2599, 4305, 0), Location.create(2600, 4305, 0))); - WHEAT.add(new WheatSet(0, Location.create(2577, 4327, 0), Location.create(2577, 4328, 0))); - WHEAT.add(new WheatSet(1, Location.create(2587, 4334, 0), Location.create(2586, 4334, 0))); - WHEAT.add(new WheatSet(0, Location.create(2609, 4310, 0), Location.create(2609, 4309, 0))); - WHEAT.add(new WheatSet(1, Location.create(2586, 4302, 0), Location.create(2587, 4302, 0))); - WHEAT.add(new WheatSet(0, Location.create(2574, 4310, 0), Location.create(2574, 4311, 0))); - WHEAT.add(new WheatSet(1, Location.create(2582, 4337, 0), Location.create(2581, 4337, 0))); - WHEAT.add(new WheatSet(0, Location.create(2571, 4316, 0), Location.create(2571, 4315, 0))); - WHEAT.add(new WheatSet(1, Location.create(2601, 4340, 0), Location.create(2602, 4340, 0))); - WHEAT.add(new WheatSet(0, Location.create(2612, 4324, 0), Location.create(2612, 4323, 0))); - WHEAT.add(new WheatSet(1, Location.create(2584, 4296, 0), Location.create(2583, 4296, 0))); - WHEAT.add(new WheatSet(0, Location.create(2568, 4329, 0), Location.create(2568, 4330, 0))); - WHEAT.add(new WheatSet(1, Location.create(2595, 4343, 0), Location.create(2596, 4343, 0))); - WHEAT.add(new WheatSet(0, Location.create(2615, 4315, 0), Location.create(2615, 4314, 0))); - WHEAT.add(new WheatSet(1, Location.create(2601, 4293, 0), Location.create(2600, 4293, 0))); - WHEAT.add(new WheatSet(0, Location.create(2565, 4310, 0), Location.create(2565, 4311, 0))); - WHEAT.add(new WheatSet(1, Location.create(2582, 4346, 0), Location.create(2583, 4346, 0))); - WHEAT.add(new WheatSet(0, Location.create(2568, 4348, 0), Location.create(2568, 4347, 0))); - WHEAT.add(new WheatSet(0, Location.create(2615, 4347, 0), Location.create(2615, 4348, 0))); - WHEAT.add(new WheatSet(0, Location.create(2612, 4345, 0), Location.create(2612, 4344, 0))); - WHEAT.add(new WheatSet(0, Location.create(2614, 4292, 0), Location.create(2614, 4291, 0))); - WHEAT.add(new WheatSet(0, Location.create(2568, 4292, 0), Location.create(2568, 4291, 0))); - WHEAT.add(new WheatSet(0, Location.create(2571, 4295, 0), Location.create(2571, 4294, 0))); - WHEAT.add(new WheatSet(0, Location.create(2575, 4297, 0), Location.create(2575, 4298, 0))); - WHEAT.add(new WheatSet(0, Location.create(2584, 4330, 0), Location.create(2584, 4329, 0))); - WHEAT.add(new WheatSet(0, Location.create(2599, 4329, 0), Location.create(2599, 4330, 0))); - WHEAT.add(new WheatSet(1, Location.create(2602, 4312, 0), Location.create(2601, 4312, 0))); - WHEAT.add(new WheatSet(1, Location.create(2610, 4312, 0), Location.create(2611, 4312, 0))); - WHEAT.add(new WheatSet(1, Location.create(2570, 4309, 0), Location.create(2569, 4309, 0))); - WHEAT.add(new WheatSet(0, Location.create(2583, 4304, 0), Location.create(2583, 4303, 0))); - } + /** + * Checks if the player has the percent. + * + * @param item the item. + * @param percent the percent. + * @return + */ + private boolean hasPercent(Item item, int percent) { + return getPercent(item) - percent >= 0; + } - /** - * Handles the puro puro options. - * @author Vexia - */ - public class PuroOptionHandler extends OptionHandler { + /** + * The percent to set. + * + * @param item the item. + * @param percent the percent. + */ + private void setPercent(Item item, int percent) { + item.setCharge(item.getCharge() - percent); + } - @Override - public Plugin newInstance(Object arg) throws Throwable { - NPCDefinition.forId(6070).getHandlers().put("option:trade", this); - ItemDefinition.forId(11273).getHandlers().put("option:toggle-view", this); - ItemDefinition.forId(11258).getHandlers().put("option:butterfly-jar", this); - ItemDefinition.forId(11258).getHandlers().put("option:impling-jar", this); - ItemDefinition.forId(11258).getHandlers().put("option:check", this); - return this; - } + /** + * Gets the percent. + * + * @param item the item. + * @return the percent. + */ + private int getPercent(Item item) { + int difference = item.getCharge() - 1000; + return difference + 100; + } - @Override - public boolean handle(Player player, Node node, String option) { - switch (node.getId()) { - case 11258: - handleJarGenerator(player, (Item) node, option); - break; - case 6070: - ElnockInquisitorDialogue.openShop(player); - break; - case 11273: - if (!player.getZoneMonitor().isInZone("puro puro")) { - player.sendMessage("You can only use this in the Puro Puro Maze."); - break; - } else { - if (player.getInterfaceManager().getOverlay() != null) { - player.getInterfaceManager().closeOverlay(); - break; - } - player.getInterfaceManager().openOverlay(new Component(541)); - } - return true; - } - return true; - } + @Override + public boolean isWalk(Player p, Node n) { + return !(n instanceof Item); - /** - * Handles the jar generator. - * @param player the player. - * @param item the item. - * @param option the option. - */ - private void handleJarGenerator(Player player, Item item, String option) { - switch (option) { - case "butterfly-jar": - case "impling-jar": - generate(player, item, option); - break; - case "check": - player.sendMessage("Your jar generator has a charge percentage of " + getPercent(item) + "."); - break; - } - } + } - /** - * Generates a new jar. - * @param player the player. - * @param item the item. - * @param option the option. - */ - private void generate(Player player, Item item, String option) { - final Item jar = option.equals("butterfly-jar") ? new Item(10012) : new Item(11260); - final int percent = jar.getId() == 10012 ? 1 : 3; - if (!hasPercent(item, percent)) { - player.sendMessage("Your jar generator doesn't have enough charges to make another " + jar.getName().toLowerCase() + "."); - return; - } - player.lock(5); - player.animate(new Animation(6592)); - player.getInventory().add(jar); - setPercent(item, percent); - player.sendMessage("Your jar generator generates a " + jar.getName().toLowerCase() + "."); - if (getPercent(item) <= 0) { - player.getInventory().remove(item); - player.sendMessage("Your jar generator runs out of charges."); - } - } + @Override + public boolean isWalk() { + return false; + } + } - /** - * Checks if the player has the percent. - * @param item the item. - * @param percent the percent. - * @return - */ - private boolean hasPercent(Item item, int percent) { - return getPercent(item) - percent >= 0; - } + /** + * A wheat set. + */ + public static class WheatSet { - /** - * The percent to set. - * @param item the item. - * @param percent the percent. - */ - private void setPercent(Item item, int percent) { - item.setCharge(item.getCharge() - percent); - } + /** + * The locations of the wheat. + */ + private final Location[] locations; - /** - * Gets the percent. - * @param item the item. - * @return the percent. - */ - private int getPercent(Item item) { - int difference = item.getCharge() - 1000; - return difference + 100; - } + /** + * The scenerys. + */ + private Scenery[] objects = new Scenery[2]; - @Override - public boolean isWalk(Player p, Node n) { - return !(n instanceof Item); + /** + * The rotation. + */ + private int rot; - } + /** + * The time until the next whilt. + */ + private int nextWhilt; - @Override - public boolean isWalk() { - return false; - } - } + /** + * The busy ticks. + */ + private int busyTicks; - /** - * A wheat set. - */ - public static class WheatSet { + /** + * If the wheat is removed. + */ + private boolean removed; - /** - * The locations of the wheat. - */ - private final Location[] locations; + /** + * Constructs a new {@code WheatSet} {@code Object}. + * + * @param locations the locations. + */ + public WheatSet(int rot, Location... locations) { + this.rot = rot; + this.locations = locations; + } - /** - * The scenerys. - */ - private Scenery[] objects = new Scenery[2]; + /** + * Initializes the wheat. + */ + public void init() { + int index = 0; + for (Location location : locations) { + Scenery object = new Scenery(25021, location, 22, rot); + SceneryBuilder.add(object); + objects[index] = object; + index++; + } + setNextWhilt(); + } - /** - * The rotation. - */ - private int rot; + /** + * Whilts the wheat. + */ + public void whilt() { + busyTicks = GameWorld.getTicks() + 5; + for (Scenery object : objects) { + if (object == null) { + continue; + } + if (removed) { + submitWorldPulse(new Pulse() { + int counter = 0; - /** - * The time until the next whilt. - */ - private int nextWhilt; + @Override + public boolean pulse() { + if (counter++ == 0) { + animateScenery(object, 6596); + setDelay(animationDuration(new Animation(6596))); + return false; + } + return true; + } + }); + SceneryBuilder.add(object); + continue; + } + submitWorldPulse(new Pulse() { + int counter = 0; - /** - * The busy ticks. - */ - private int busyTicks; + @Override + public boolean pulse() { + if (counter++ == 0) { + animateScenery(object, 6599); + setDelay(animationDuration(new Animation(6599))); + return false; + } + SceneryBuilder.remove(object); + return true; + } + }); + } + removed = !removed; + setNextWhilt(); + } - /** - * If the wheat is removed. - */ - private boolean removed; + /** + * Sets the object spawns. + */ + public void setObjects() { + for (int i = 0; i < locations.length; i++) { + objects[i] = RegionManager.getObject(locations[i]); + } + } - /** - * Constructs a new {@code WheatSet} {@code Object}. - * @param locations the locations. - */ - public WheatSet(int rot, Location... locations) { - this.rot = rot; - this.locations = locations; - } + /** + * Sets the next whilt. + */ + public void setNextWhilt() { + this.nextWhilt = GameWorld.getTicks() + RandomFunction.random(40, 300); + } - /** - * Initializes the wheat. - */ - public void init() { - int index = 0; - for (Location location : locations) { - Scenery object = new Scenery(25021, location, 22, rot); - SceneryBuilder.add(object); - objects[index] = object; - index++; - } - setNextWhilt(); - } + /** + * Checks if the wheat can whilt. + * + * @return {@code True} if so. + */ + public boolean canWhilt() { + return GameWorld.getTicks() > nextWhilt && GameWorld.getTicks() > busyTicks; + } - /** - * Whilts the wheat. - */ - public void whilt() { - busyTicks = GameWorld.getTicks() + 5; - for (Scenery object : objects) { - if (object == null) { - continue; - } - if (removed) { - submitWorldPulse(new Pulse() { - int counter = 0; + /** + * Gets the nextWhilt. + * + * @return The nextWhilt. + */ + public int getNextWhilt() { + return nextWhilt; + } - @Override - public boolean pulse() { - if (counter++ == 0) { - animateScenery (object, 6596); - setDelay(animationDuration(new Animation(6596))); - return false; - } - return true; - } - }); - SceneryBuilder.add(object); - continue; - } - submitWorldPulse(new Pulse() { - int counter = 0; + /** + * Sets the nextWhilt. + * + * @param nextWhilt The nextWhilt to set. + */ + public void setNextWhilt(int nextWhilt) { + this.nextWhilt = nextWhilt; + } - @Override - public boolean pulse() { - if (counter++ == 0) { - animateScenery (object, 6599); - setDelay(animationDuration(new Animation(6599))); - return false; - } - SceneryBuilder.remove(object); - return true; - } - }); - } - removed = !removed; - setNextWhilt(); - } + /** + * Gets the locations. + * + * @return The locations. + */ + public Location[] getLocations() { + return locations; + } - /** - * Sets the object spawns. - */ - public void setObjects() { - for (int i = 0; i < locations.length; i++) { - objects[i] = RegionManager.getObject(locations[i]); - } - } - - /** - * Sets the next whilt. - */ - public void setNextWhilt() { - this.nextWhilt = GameWorld.getTicks() + RandomFunction.random(40, 300); - } - - /** - * Checks if the wheat can whilt. - * @return {@code True} if so. - */ - public boolean canWhilt() { - return GameWorld.getTicks() > nextWhilt && GameWorld.getTicks() > busyTicks; - } - - /** - * Gets the nextWhilt. - * @return The nextWhilt. - */ - public int getNextWhilt() { - return nextWhilt; - } - - /** - * Sets the nextWhilt. - * @param nextWhilt The nextWhilt to set. - */ - public void setNextWhilt(int nextWhilt) { - this.nextWhilt = nextWhilt; - } - - /** - * Gets the locations. - * @return The locations. - */ - public Location[] getLocations() { - return locations; - } - - } + } } diff --git a/Server/src/main/core/cache/def/impl/ItemDefinition.java b/Server/src/main/core/cache/def/impl/ItemDefinition.java index 46b141761..60baf51ea 100644 --- a/Server/src/main/core/cache/def/impl/ItemDefinition.java +++ b/Server/src/main/core/cache/def/impl/ItemDefinition.java @@ -1551,7 +1551,6 @@ public class ItemDefinition extends Definition { if (!player.getAttribute("equip_stats_open", false)) { return; } - PacketRepository.send(WeightUpdate.class, player.getPacketDispatch().getContext()); int index = 0; int[] bonuses = player.getProperties().getBonuses(); for (int i = 36; i < 50; i++) { @@ -1563,8 +1562,6 @@ public class ItemDefinition extends Definition { player.getPacketDispatch().sendString(BONUS_NAMES[index++] + bonusValue, 667, i); } player.getPacketDispatch().sendString("Attack bonus", 667, 34); - DecimalFormat dec = new DecimalFormat("#.#"); - player.getPacketDispatch().sendString(dec.format(player.getSettings().getWeight())+" kg", 667, 32); } /** diff --git a/Server/src/main/core/game/component/InterfaceType.java b/Server/src/main/core/game/component/InterfaceType.java index 937012ec6..59dd77e2a 100644 --- a/Server/src/main/core/game/component/InterfaceType.java +++ b/Server/src/main/core/game/component/InterfaceType.java @@ -53,7 +53,7 @@ public enum InterfaceType { /** * Wilderness overlay */ - WILDERNESS_OVERLAY(Components.TOPLEVEL_548, Components.TOPLEVEL_FULLSCREEN_746, 11, 3); + OVERLAY_B(Components.TOPLEVEL_548, Components.TOPLEVEL_FULLSCREEN_746, 11, 3); /** * The fixed window pane id. diff --git a/Server/src/main/core/game/container/impl/EquipmentContainer.java b/Server/src/main/core/game/container/impl/EquipmentContainer.java index 48b3f2e8a..8ecc54bf5 100644 --- a/Server/src/main/core/game/container/impl/EquipmentContainer.java +++ b/Server/src/main/core/game/container/impl/EquipmentContainer.java @@ -363,7 +363,6 @@ public final class EquipmentContainer extends Container { if (!player.getInterfaceManager().hasMainComponent(667)) { return; } - PacketRepository.send(WeightUpdate.class, player.getPacketDispatch().getContext()); int index = 0; int[] bonuses = player.getProperties().getBonuses(); for (int i = 36; i < 50; i++) { diff --git a/Server/src/main/core/game/dialogue/DialogueInterpreter.java b/Server/src/main/core/game/dialogue/DialogueInterpreter.java index 5d387f6a3..06a93a303 100644 --- a/Server/src/main/core/game/dialogue/DialogueInterpreter.java +++ b/Server/src/main/core/game/dialogue/DialogueInterpreter.java @@ -11,8 +11,10 @@ import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; import core.net.packet.context.ContainerContext; import core.net.packet.out.ContainerPacket; +import core.net.packet.out.RepositionChild; import core.plugin.PluginManifest; import core.plugin.PluginType; import core.game.system.config.ItemConfigParser; @@ -263,8 +265,6 @@ public final class DialogueInterpreter { * @return The component. */ public Component sendDestroyItem(int id, String message) { - player.getInterfaceManager().openChatbox(94); - PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 94, 93, 93, new Item[] { new Item(id) }, 1, false)); String text = ItemDefinition.forId(id).getConfiguration(ItemConfigParser.DESTROY_MESSAGE, "Are you sure you want to destroy this object?"); if (text.length() > 200) { String[] words = text.split(" "); @@ -279,11 +279,11 @@ public final class DialogueInterpreter { } text = sb.toString(); } - player.getPacketDispatch().sendString("Are you sure you want to destroy this object?", 94, 2); - player.getPacketDispatch().sendString("Yes.", 94, 3); - player.getPacketDispatch().sendString("No.", 94, 4); player.getPacketDispatch().sendString(text, 94, 7); player.getPacketDispatch().sendString(ItemDefinition.forId(id).getName(), 94, 8); + player.getPacketDispatch().sendItemOnInterface(id, 1, 94, 9); + + player.getInterfaceManager().openChatbox(94); return player.getInterfaceManager().getChatbox(); } diff --git a/Server/src/main/core/game/dialogue/SkillDialogueHandler.kt b/Server/src/main/core/game/dialogue/SkillDialogueHandler.kt index e38896310..e706b7ada 100644 --- a/Server/src/main/core/game/dialogue/SkillDialogueHandler.kt +++ b/Server/src/main/core/game/dialogue/SkillDialogueHandler.kt @@ -123,6 +123,37 @@ open class SkillDialogueHandler( } } }, + MAKE_SET_ONE_OPTION(582, 4, 1) { + override fun display(player: Player, handler: SkillDialogueHandler) { + val item = handler.data[0] as Item + + // Send item + item name to interface + player.packetDispatch.sendItemZoomOnInterface(item.id, 160, 582, 2) + player.packetDispatch.sendString("



" + item.name, 582, 5) + + // Re-format this interface because it is not formatted properly for the chat-box + // Swords + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 582, 0, 12, 15)) + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 582, 1, 431, 15)) + // "How many would you like to make?" + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 582, 6, 0, 12)) + // Item displayed + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 582, 2, 207, 23)) + // Right click context menu boxes + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 582, 3, 58, 27)) + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 582, 4, 58, 27)) + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 582, 5, 58, 27)) + } + + override fun getAmount(handler: SkillDialogueHandler, buttonId: Int): Int { + return when(buttonId){ + 4 -> 1 + 3 -> 5 + 2 -> 10 + else -> handler.getAll(getIndex(handler, buttonId)) + } + } + }, TWO_OPTION(303, 7, 2) { override fun display(player: Player, handler: SkillDialogueHandler) { var item: Item diff --git a/Server/src/main/core/game/node/entity/player/link/InterfaceManager.java b/Server/src/main/core/game/node/entity/player/link/InterfaceManager.java index 3b917dd84..4a0fb00ae 100644 --- a/Server/src/main/core/game/node/entity/player/link/InterfaceManager.java +++ b/Server/src/main/core/game/node/entity/player/link/InterfaceManager.java @@ -15,7 +15,6 @@ import core.net.packet.out.WindowsPane; import core.tools.Log; import org.rs09.consts.Components; import content.region.misc.tutisland.handlers.TutorialStage; -import core.tools.SystemLogger; import static core.api.ContentAPIKt.log; import static core.api.ContentAPIKt.*; @@ -612,7 +611,7 @@ public final class InterfaceManager { return; } overlay = component; - if (overlay.getDefinition().getType() != InterfaceType.OVERLAY) { + if (overlay.getDefinition().getType() != InterfaceType.OVERLAY && overlay.getDefinition().getType() != InterfaceType.OVERLAY_B) { log(this.getClass(), Log.WARN, "Set interface type to OVERLAY for component " + component.getId() + ", definition requires updating!"); overlay.getDefinition().setType(InterfaceType.OVERLAY); overlay.getDefinition().setWalkable(true); @@ -620,23 +619,6 @@ public final class InterfaceManager { overlay.open(player); } - /** - * Opens the wilderness overlay. - * @param component The component. - */ - public void openWildernessOverlay(Component component) { - if (wildyOverlay != null && !wildyOverlay.close(player)) { - return; - } - wildyOverlay = component; - if (wildyOverlay.getDefinition().getType() != InterfaceType.WILDERNESS_OVERLAY) { - log(this.getClass(), Log.WARN, "Set interface type to WILDERNESS_OVERLAY for component " + component.getId() + ", definition requires updating!"); - wildyOverlay.getDefinition().setType(InterfaceType.WILDERNESS_OVERLAY); - wildyOverlay.getDefinition().setWalkable(true); - } - wildyOverlay.open(player); - } - /** * Closes the current overlay. */ diff --git a/Server/src/main/core/game/node/entity/player/link/Settings.java b/Server/src/main/core/game/node/entity/player/link/Settings.java index cd02c0b03..640e44723 100644 --- a/Server/src/main/core/game/node/entity/player/link/Settings.java +++ b/Server/src/main/core/game/node/entity/player/link/Settings.java @@ -428,6 +428,7 @@ public final class Settings { } weight += item.getDefinition().getConfiguration(ItemConfigParser.WEIGHT, 0.0); } + player.getPacketDispatch().sendString((int) weight + " kg", 667, 32); } /** diff --git a/Server/src/main/core/game/system/command/sets/QuestCommandSet.kt b/Server/src/main/core/game/system/command/sets/QuestCommandSet.kt index 022b592cc..6c7bc19c6 100644 --- a/Server/src/main/core/game/system/command/sets/QuestCommandSet.kt +++ b/Server/src/main/core/game/system/command/sets/QuestCommandSet.kt @@ -3,9 +3,9 @@ package core.game.system.command.sets import core.game.component.Component import core.game.node.entity.player.Player import core.game.node.entity.player.link.quest.QuestRepository -import core.game.system.command.Command import core.plugin.Initializable import core.game.system.command.Privilege +import core.game.world.repository.Repository @Initializable class QuestCommandSet : CommandSet(Privilege.ADMIN){ @@ -22,8 +22,20 @@ class QuestCommandSet : CommandSet(Privilege.ADMIN){ /** * Displays the currently implemented quests with debug information */ - define("quest"){player,_ -> - sendQuestsDebug(player) + define("quest"){player,args -> + if (args.size < 3) { + val lookupP = if (args.size == 1) { + player + } else if (Repository.getPlayerByName(args[1]) != null) { + Repository.getPlayerByName(args[1]) ?: return@define + } else { + reject(player, "ERROR: Username not found. Usage: ::quest ") + return@define + } + sendQuestsDebug(player, lookupP) + } else { + reject(player, "Usage: ::quest || ::quest ") + } } /** @@ -71,20 +83,26 @@ class QuestCommandSet : CommandSet(Privilege.ADMIN){ /** * Sends the list of quests with debug information - * @param player the player. + * @param admin the player. */ - private fun sendQuestsDebug(player: Player?) { - player!!.interfaceManager.open(Component(275)) + private fun sendQuestsDebug(admin: Player?, lookupUser: Player?) { + admin!!.interfaceManager.open(Component(275)) for (i in 0..310) { - player.packetDispatch.sendString("", 275, i) + admin.packetDispatch.sendString("", 275, i) } var lineId = 11 - player.packetDispatch.sendString("" + "Quests Debug" + "", 275, 2) + admin.packetDispatch.sendString("${lookupUser!!.username}'s Quest Debug", 275, 2) for (q in QuestRepository.getQuests().values) { // Add a space to beginning and end of string for the strikethrough - player.packetDispatch.sendString("${q.name}", 275, lineId++) - player.packetDispatch.sendString("Index: ${q.index} | Stage: ${player.questRepository.getStage(q)}", 275, lineId++) - player.packetDispatch.sendString(" ", 275, lineId++) + val stage = lookupUser.questRepository.getStage(q) + val statusColor = when { + stage >= 100 -> "80ff00" + stage in 1..99 -> "ff8400" + else -> "ff0000" + } + admin.packetDispatch.sendString("${q.name}", 275, lineId++) + admin.packetDispatch.sendString("Index: ${q.index} | Stage: ${lookupUser.questRepository.getStage(q)}", 275, lineId++) + admin.packetDispatch.sendString(" ", 275, lineId++) } } } diff --git a/Server/src/main/core/game/world/map/zone/impl/WildernessZone.java b/Server/src/main/core/game/world/map/zone/impl/WildernessZone.java index 38252c8d2..6b1f27270 100644 --- a/Server/src/main/core/game/world/map/zone/impl/WildernessZone.java +++ b/Server/src/main/core/game/world/map/zone/impl/WildernessZone.java @@ -232,7 +232,7 @@ public final class WildernessZone extends MapZone { if (p.getSkullManager().isWildernessDisabled()) { return; } - p.getInterfaceManager().openWildernessOverlay(new Component(381)); + p.getInterfaceManager().openOverlay(new Component(381)); p.getSkullManager().setLevel(getWilderness(p)); p.getPacketDispatch().sendString("Level: " + p.getSkullManager().getLevel(), 381, 1); if(GameWorld.getSettings().getWild_pvp_enabled()) { diff --git a/Server/src/main/core/net/packet/PacketRepository.java b/Server/src/main/core/net/packet/PacketRepository.java index 28d834db8..60c6fddb0 100644 --- a/Server/src/main/core/net/packet/PacketRepository.java +++ b/Server/src/main/core/net/packet/PacketRepository.java @@ -70,7 +70,7 @@ public final class PacketRepository { OUTGOING_PACKETS.put(CommunicationMessage.class, new CommunicationMessage()); // OUTGOING_PACKETS.put(UpdateClanChat.class, new UpdateClanChat()); // OUTGOING_PACKETS.put(UpdateGroundItemAmount.class, new UpdateGroundItemAmount()); // - OUTGOING_PACKETS.put(WeightUpdate.class, new WeightUpdate()); // + //OUTGOING_PACKETS.put(WeightUpdate.class, new WeightUpdate()); // OUTGOING_PACKETS.put(UpdateRandomFile.class, new UpdateRandomFile()); // OUTGOING_PACKETS.put(InstancedLocationUpdate.class, new InstancedLocationUpdate()); // OUTGOING_PACKETS.put(CSConfigPacket.class, new CSConfigPacket()); //