diff --git a/Server/src/main/java/core/game/component/Component.java b/Server/src/main/java/core/game/component/Component.java index f4fb6d93a..9ce427f4c 100644 --- a/Server/src/main/java/core/game/component/Component.java +++ b/Server/src/main/java/core/game/component/Component.java @@ -5,6 +5,7 @@ import core.game.node.entity.player.link.InterfaceManager; import core.net.packet.PacketRepository; import core.net.packet.context.InterfaceContext; import core.net.packet.out.Interface; +import rs09.game.interaction.InterfaceListeners; /** * Represents a component. @@ -53,6 +54,7 @@ public class Component { */ public void open(Player player) { InterfaceManager manager = player.getInterfaceManager(); + InterfaceListeners.runOpen(player,this); if (definition == null) { PacketRepository.send(Interface.class, new InterfaceContext(player, manager.getWindowPaneId(), manager.getDefaultChildId(), getId(), false)); if (plugin != null) { @@ -82,6 +84,7 @@ public class Component { * @return {@code True} if the component can be closed. */ public boolean close(Player player) { + InterfaceListeners.runClose(player,this); if (closeEvent != null && !closeEvent.close(player, this)) { return false; } diff --git a/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayerPlugin.java b/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayerPlugin.java index cc38e841e..a261d237c 100644 --- a/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayerPlugin.java +++ b/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayerPlugin.java @@ -21,7 +21,7 @@ import core.game.world.map.Location; import core.game.world.map.RegionManager; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; -import rs09.game.interaction.Listeners; +import rs09.game.interaction.InteractionListeners; import java.util.List; @@ -147,7 +147,7 @@ public final class DragonSlayerPlugin extends OptionHandler { player.getPacketDispatch().sendMessage("You need to complete the Dragon Slayer Quest in order to wear this."); return true; } - Listeners.run(node.getId(),0,"equip",player,node); + InteractionListeners.run(node.getId(),0,"equip",player,node); break; case 742: if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 40 && (player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD) || player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD))) { diff --git a/Server/src/main/java/core/game/content/quest/members/lostcity/LostCityPlugin.java b/Server/src/main/java/core/game/content/quest/members/lostcity/LostCityPlugin.java index e246bbfc8..1798856a9 100644 --- a/Server/src/main/java/core/game/content/quest/members/lostcity/LostCityPlugin.java +++ b/Server/src/main/java/core/game/content/quest/members/lostcity/LostCityPlugin.java @@ -17,7 +17,7 @@ import core.game.node.object.GameObject; import core.game.system.task.Pulse; import core.game.world.map.Location; import core.plugin.Plugin; -import rs09.game.interaction.Listeners; +import rs09.game.interaction.InteractionListeners; import rs09.game.world.GameWorld; /** @@ -94,7 +94,7 @@ public final class LostCityPlugin extends OptionHandler { player.getPacketDispatch().sendMessage("You need to have completed the Lost City quest in order to wield that weapon."); return true; } - return Listeners.run(node.getId(),0,"equip",player,node); + return InteractionListeners.run(node.getId(),0,"equip",player,node); } return true; } diff --git a/Server/src/main/java/core/game/interaction/Interaction.java b/Server/src/main/java/core/game/interaction/Interaction.java index 31662ff79..e6a55fd31 100644 --- a/Server/src/main/java/core/game/interaction/Interaction.java +++ b/Server/src/main/java/core/game/interaction/Interaction.java @@ -11,7 +11,7 @@ import core.game.world.update.flag.player.FaceLocationFlag; import core.net.packet.PacketRepository; import core.net.packet.context.InteractionOptionContext; import core.net.packet.out.InteractionOption; -import rs09.game.interaction.Listeners; +import rs09.game.interaction.InteractionListeners; import rs09.game.system.SystemLogger; import rs09.game.world.GameWorld; @@ -106,7 +106,7 @@ public class Interaction { if (player.getLocks().isInteractionLocked() || player.getZoneMonitor().interact(node, option)) { return true; } - if(Listeners.run(node.getId(),0,option.getName(),player,node)){ + if(InteractionListeners.run(node.getId(),0,option.getName(),player,node)){ return true; } if (option.getHandler() == null || !option.getHandler().handle(player, node, option.getName().toLowerCase())) { diff --git a/Server/src/main/java/core/game/interaction/inter/EquipmentInterface.java b/Server/src/main/java/core/game/interaction/inter/EquipmentInterface.java index bac61cc6d..282bf3320 100644 --- a/Server/src/main/java/core/game/interaction/inter/EquipmentInterface.java +++ b/Server/src/main/java/core/game/interaction/inter/EquipmentInterface.java @@ -22,7 +22,7 @@ import core.net.packet.out.ContainerPacket; import core.plugin.Initializable; import core.plugin.Plugin; import rs09.game.content.global.action.EquipHandler; -import rs09.game.interaction.Listeners; +import rs09.game.interaction.InteractionListeners; import rs09.game.world.GameWorld; /** @@ -81,7 +81,7 @@ public final class EquipmentInterface extends ComponentPlugin { GameWorld.getPulser().submit(new Pulse(1, p) { @Override public boolean pulse() { - Listeners.run(item.getId(),0,"equip",p, item); + InteractionListeners.run(item.getId(),0,"equip",p, item); return true; } }); @@ -191,7 +191,7 @@ public final class EquipmentInterface extends ComponentPlugin { if (item == null) { return; } - if(Listeners.run(item.getId(),0,"operate",player,item)){ + if(InteractionListeners.run(item.getId(),0,"operate",player,item)){ return; } OptionHandler handler = item.getOperateHandler(); diff --git a/Server/src/main/java/core/net/packet/in/ActionButtonPacket.java b/Server/src/main/java/core/net/packet/in/ActionButtonPacket.java index 48fe73274..e83768cc8 100644 --- a/Server/src/main/java/core/net/packet/in/ActionButtonPacket.java +++ b/Server/src/main/java/core/net/packet/in/ActionButtonPacket.java @@ -10,9 +10,10 @@ import core.game.node.entity.player.info.login.LoginConfiguration; import core.game.node.entity.player.link.request.assist.AssistSession; import core.game.node.item.Item; import core.game.system.task.Pulse; -import rs09.game.world.GameWorld; import core.net.packet.IncomingPacket; import core.net.packet.IoBuffer; +import rs09.game.interaction.InterfaceListeners; +import rs09.game.world.GameWorld; import java.util.List; @@ -58,10 +59,15 @@ public class ActionButtonPacket implements IncomingPacket { player.debug("Component " + c + " wasn't opened in interface manager."); return; } + int cOpcode = buffer.opcode(); ComponentPlugin plugin = c.getPlugin(); if (plugin != null) { player.debug("Component plugin = " + plugin.getClass().getSimpleName()); - plugin.handle(player, c, buffer.opcode(), buttonId, slot, itemId); + plugin.handle(player, c, cOpcode, buttonId, slot, itemId); + } else { + if(InterfaceListeners.run(player,c,cOpcode,buttonId,slot,itemId)){ + return; + } } } diff --git a/Server/src/main/java/core/net/packet/in/InteractionPacket.java b/Server/src/main/java/core/net/packet/in/InteractionPacket.java index f60fd6209..5dfd64bbb 100644 --- a/Server/src/main/java/core/net/packet/in/InteractionPacket.java +++ b/Server/src/main/java/core/net/packet/in/InteractionPacket.java @@ -22,7 +22,7 @@ import core.net.packet.context.PlayerContext; import core.net.packet.out.ClearMinimapFlag; import rs09.ServerConstants; import rs09.game.ai.AIPlayer; -import rs09.game.interaction.Listeners; +import rs09.game.interaction.InteractionListeners; import rs09.game.world.repository.Repository; import java.util.List; @@ -186,7 +186,7 @@ public final class InteractionPacket implements IncomingPacket { player.debug("spawn=" + npc.getProperties().getSpawnLocation() + "."); player.debug("Varp ID= " + npc.getDefinition().getConfigId() + " Offset=" + npc.getDefinition().getVarbitOffset() + " Size=" + npc.getDefinition().getVarbitSize()); handleAIPLegion(player, 0, optionIndex, index); - if(Listeners.run(npc.getId(),2, option.getName(),player,npc)){ + if(InteractionListeners.run(npc.getId(),2, option.getName(),player,npc)){ return; } if(PluginInteractionManager.handle(player,shown,option)){ @@ -270,7 +270,7 @@ public final class InteractionPacket implements IncomingPacket { } handleAIPLegion(player, 1, optionIndex, x, y, objectId); - if(Listeners.run(object.getId(),1, option.getName(),player,object)){ + if(InteractionListeners.run(object.getId(),1, option.getName(),player,object)){ return; } if(PluginInteractionManager.handle(player,object)){ diff --git a/Server/src/main/java/core/net/packet/in/ItemActionPacket.java b/Server/src/main/java/core/net/packet/in/ItemActionPacket.java index 5feba6f8d..7692c1225 100644 --- a/Server/src/main/java/core/net/packet/in/ItemActionPacket.java +++ b/Server/src/main/java/core/net/packet/in/ItemActionPacket.java @@ -17,7 +17,7 @@ import core.net.packet.context.PlayerContext; import core.net.packet.out.ClearMinimapFlag; import org.rs09.consts.Items; import rs09.game.interaction.ItemOnBankBooth; -import rs09.game.interaction.Listeners; +import rs09.game.interaction.InteractionListeners; import rs09.game.node.entity.skill.farming.CompostBins; import rs09.game.node.entity.skill.farming.FarmingPatch; import rs09.game.node.entity.skill.farming.UseWithBinHandler; @@ -69,7 +69,7 @@ public class ItemActionPacket implements IncomingPacket { if(PluginInteractionManager.handle(player,event)){ return; } - if(Listeners.run(item,npc,2,player)){ + if(InteractionListeners.run(item,npc,2,player)){ return; } event = new NodeUsageEvent(player, interfaceId, item, npc); @@ -128,7 +128,7 @@ public class ItemActionPacket implements IncomingPacket { RottenPotatoUseWithHandler.handle(used,player); return; } - if(Listeners.run(used,with,0,player)){ + if(InteractionListeners.run(used,with,0,player)){ return; } if (usedItemId < usedWithItemId) { @@ -179,7 +179,7 @@ public class ItemActionPacket implements IncomingPacket { RottenPotatoUseWithHandler.handle(object,player); return; } - if(Listeners.run(used,object,1,player)){ + if(InteractionListeners.run(used,object,1,player)){ return; } event = new NodeUsageEvent(player, 0, used, object); diff --git a/Server/src/main/kotlin/rs09/game/interaction/CorporealBeastWarningInterface.kt b/Server/src/main/kotlin/rs09/game/interaction/CorporealBeastWarningInterface.kt index 92bd475f1..4772e322a 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/CorporealBeastWarningInterface.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/CorporealBeastWarningInterface.kt @@ -1,46 +1,35 @@ package rs09.game.interaction import core.game.component.Component -import core.game.component.ComponentDefinition -import core.game.component.ComponentPlugin import core.game.node.entity.player.Player -import core.plugin.Initializable -import core.plugin.Plugin import rs09.game.world.GameWorld -@Initializable /** * Handles the corporeal beast warning interface * @author Ceikry */ -class CorporealBeastWarningInterface : ComponentPlugin(){ - companion object{ - const val COMPONENT_ID = 650 - } +class CorporealBeastWarningInterface : InterfaceListener(){ - override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { - player ?: return false - when(button){ - 17 -> { - if(player.getAttribute("corp-beast-cave-delay",0) <= GameWorld.ticks) { - player.properties.teleportLocation = player.location.transform(4, 0, 0).also { close(player) } - player.setAttribute("corp-beast-cave-delay",GameWorld.ticks + 5) - } else { - close(player) - } + val COMPONENT_ID = 650 + + override fun defineListeners() { + on(COMPONENT_ID,17){player,component,_,_,_,_ -> + if(player.getAttribute("corp-beast-cave-delay",0) <= GameWorld.ticks) { + player.properties.teleportLocation = player.location.transform(4, 0, 0).also { close(player,component) } + player.setAttribute("corp-beast-cave-delay",GameWorld.ticks + 5) + } else { + close(player,component) } - else -> close(player) + return@on true + } + + on(COMPONENT_ID){player, component, _, _, _, _ -> + close(player,component) + return@on true } - return true } - fun close(player: Player){ - player.interfaceManager.close(Component(650)) + fun close(player: Player,component: Component){ + player.interfaceManager.close(component) } - - override fun newInstance(arg: Any?): Plugin { - ComponentDefinition.put(COMPONENT_ID,this) - return this - } - } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/InteractionListener.kt b/Server/src/main/kotlin/rs09/game/interaction/InteractionListener.kt index f99828686..92cae5489 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/InteractionListener.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/InteractionListener.kt @@ -8,31 +8,31 @@ abstract class InteractionListener : Listener{ val ITEM = 0 val OBJECT = 1 val NPC = 2 - fun on(id: Int, type: Int, vararg option: String,handler: (Player, Node) -> Boolean){ - Listeners.add(id,type,option,handler) + fun on(id: Int, type: Int, vararg option: String,handler: (player: Player, node: Node) -> Boolean){ + InteractionListeners.add(id,type,option,handler) } - fun on(ids: IntArray, type: Int, vararg option: String, handler: (Player, Node) -> Boolean){ - Listeners.add(ids,type,option,handler) + fun on(ids: IntArray, type: Int, vararg option: String, handler: (player: Player, node: Node) -> Boolean){ + InteractionListeners.add(ids,type,option,handler) } - fun on(option: String, type: Int, handler: (Player, Node) -> Boolean){ - Listeners.add(option,type,handler) + fun on(option: String, type: Int, handler: (player: Player, node: Node) -> Boolean){ + InteractionListeners.add(option,type,handler) } - fun on(type: Int, vararg option: String, handler: (Player, Node) -> Boolean){ - Listeners.add(option,type,handler) + fun on(type: Int, vararg option: String, handler: (player: Player, node: Node) -> Boolean){ + InteractionListeners.add(option,type,handler) } - fun onUseWith(type: Int, used: Int, vararg with: Int, handler: (Player, Node, Node) -> Boolean){ - Listeners.add(type,used,with,handler) + fun onUseWith(type: Int, used: Int, vararg with: Int, handler: (player: Player, used: Node, with: Node) -> Boolean){ + InteractionListeners.add(type,used,with,handler) } - fun onUseWith(type: Int, used: IntArray, vararg with: Int, handler: (Player, Node, Node) -> Boolean){ - Listeners.add(type,used,with,handler) + fun onUseWith(type: Int, used: IntArray, vararg with: Int, handler: (player: Player, used: Node, with: Node) -> Boolean){ + InteractionListeners.add(type,used,with,handler) } open fun defineDestinationOverrides(){} fun setDest(type: Int, id: Int,handler: (Node) -> Location){ - Listeners.addDestOverride(type,id,handler) + InteractionListeners.addDestOverride(type,id,handler) } fun setDest(type:Int, vararg options: String, handler: (Node) -> Location){ - Listeners.addDestOverrides(type,options,handler) + InteractionListeners.addDestOverrides(type,options,handler) } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/Listeners.kt b/Server/src/main/kotlin/rs09/game/interaction/InteractionListeners.kt similarity index 99% rename from Server/src/main/kotlin/rs09/game/interaction/Listeners.kt rename to Server/src/main/kotlin/rs09/game/interaction/InteractionListeners.kt index c3e580b51..ac3c00241 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/Listeners.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/InteractionListeners.kt @@ -6,7 +6,7 @@ import core.game.node.Node import core.game.node.entity.player.Player import core.game.world.map.Location -object Listeners { +object InteractionListeners { private val listeners = HashMap Boolean>(1000) private val useWithListeners = HashMap Boolean>(1000) private val destinationOverrides = HashMap Location>(100) diff --git a/Server/src/main/kotlin/rs09/game/interaction/InterfaceListener.kt b/Server/src/main/kotlin/rs09/game/interaction/InterfaceListener.kt new file mode 100644 index 000000000..b7f38e092 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/InterfaceListener.kt @@ -0,0 +1,19 @@ +package rs09.game.interaction + +import core.game.component.Component +import core.game.node.entity.player.Player + +abstract class InterfaceListener : Listener { + fun on(componentID: Int, buttonID: Int, handler: (player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int) -> Boolean){ + InterfaceListeners.add(componentID,buttonID,handler) + } + fun on(componentID: Int, handler: (player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int) -> Boolean){ + InterfaceListeners.add(componentID,handler) + } + fun onOpen(componentID: Int,handler: (player: Player, component: Component) -> Boolean){ + InterfaceListeners.addOpenListener(componentID, handler) + } + fun onClose(componentID: Int,handler: (player: Player, component: Component) -> Boolean){ + InterfaceListeners.addCloseListener(componentID,handler) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/InterfaceListeners.kt b/Server/src/main/kotlin/rs09/game/interaction/InterfaceListeners.kt new file mode 100644 index 000000000..7145a3fa9 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/InterfaceListeners.kt @@ -0,0 +1,67 @@ +package rs09.game.interaction + +import core.game.component.Component +import core.game.node.entity.player.Player + +object InterfaceListeners { + val buttonListeners = HashMap Boolean>(1000) + val openListeners = HashMap Boolean>(100) + + @JvmStatic + fun add(componentID: Int, buttonID: Int, handler: (Player,Component,Int,Int,Int,Int) -> Boolean){ + buttonListeners["$componentID:$buttonID"] = handler + } + + @JvmStatic + fun add(componentID: Int, handler: (Player, Component, Int, Int, Int, Int) -> Boolean){ + buttonListeners["$componentID"] = handler + } + + @JvmStatic + fun addOpenListener(componentID: Int, handler: (Player,Component) -> Boolean){ + openListeners["$componentID"] = handler + } + + @JvmStatic + fun addCloseListener(componentID: Int, handler: (Player, Component) -> Boolean){ + openListeners["close:$componentID"] = handler + } + + @JvmStatic + fun get(componentID: Int, buttonID: Int): ((Player,Component,Int,Int,Int,Int) -> Boolean)?{ + return buttonListeners["$componentID:$buttonID"] + } + + @JvmStatic + fun get(componentID: Int): ((Player,Component,Int,Int,Int,Int) -> Boolean)?{ + return buttonListeners["$componentID"] + } + + @JvmStatic + fun getOpenListener(componentID: Int): ((Player,Component) -> Boolean)?{ + return openListeners["$componentID"] + } + + @JvmStatic + fun getCloseListener(componentID: Int): ((Player,Component) -> Boolean)?{ + return openListeners["close:$componentID"] + } + + @JvmStatic + fun runOpen(player: Player,component: Component): Boolean{ + val method = getOpenListener(component.id) ?: return false + return method.invoke(player,component) + } + + @JvmStatic + fun runClose(player: Player,component: Component): Boolean{ + val method = getCloseListener(component.id) ?: return false + return method.invoke(player,component) + } + + @JvmStatic + fun run(player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int): Boolean{ + val method = get(component.id,buttonID) ?: get(component.id) ?: return false + return method.invoke(player,component,opcode,buttonID,slot,itemID) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/inter/FairyRingInterface.kt b/Server/src/main/kotlin/rs09/game/interaction/inter/FairyRingInterface.kt index e39239b83..9665bc980 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/inter/FairyRingInterface.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/inter/FairyRingInterface.kt @@ -1,16 +1,13 @@ package rs09.game.interaction.inter import core.game.component.Component -import core.game.component.ComponentDefinition -import core.game.component.ComponentPlugin import core.game.node.entity.player.Player import core.game.node.entity.player.link.TeleportManager import core.game.system.task.Pulse import core.game.world.map.Location import core.game.world.map.RegionManager -import core.plugin.Initializable -import core.plugin.Plugin import core.tools.RandomFunction +import rs09.game.interaction.InterfaceListener import rs09.game.world.GameWorld val RING_1 = arrayOf('a','d','c','b') @@ -21,51 +18,57 @@ val RING_3 = arrayOf('p','s','r','q') * Handles the fairy ring interface * @author Ceikry */ -@Initializable -class FairyRingInterface : ComponentPlugin(){ - override fun open(player: Player?, component: Component?) { - player ?: return - super.open(player, component) - if(component?.id == 734) { +class FairyRingInterface : InterfaceListener(){ + + val RINGS = 734 + val TRAVEL_LOG = 735 + + override fun defineListeners() { + + onOpen(RINGS){player, _ -> + player.interfaceManager.openSingleTab(Component(TRAVEL_LOG)) player.setAttribute("fr:ring1", 0) player.setAttribute("fr:ring2", 0) player.setAttribute("fr:ring3", 0) FairyRing.drawLog(player) + return@onOpen true + } - component.setCloseEvent { pl, _ -> - pl.removeAttribute("fr:ring1") - pl.removeAttribute("fr:ring2") - pl.removeAttribute("fr:ring3") - pl.configManager.forceSet(816,0,false) - pl.interfaceManager.closeSingleTab() - true + onClose(RINGS){player, _ -> + player.interfaceManager.closeSingleTab() + player.removeAttribute("fr:ring1") + player.removeAttribute("fr:ring2") + player.removeAttribute("fr:ring3") + player.varpManager.get(816).clearBitRange(0,31) + player.varpManager.get(816).send(player) + player.interfaceManager.closeSingleTab() + return@onClose true + } + + on(RINGS){player, _, _, buttonID, _, _ -> + if(player.getAttribute("fr:time",0L) > System.currentTimeMillis()) return@on true + var delayIncrementer = 1750L + when(buttonID){ + 23 -> delayIncrementer += increment(player,1) + 25 -> delayIncrementer += increment(player,2) + 27 -> delayIncrementer += increment(player,3) + 24 -> decrement(player,1) + 26 -> decrement(player,2) + 28 -> decrement(player,3) + 21 -> confirm(player) } + player.setAttribute("fr:time",System.currentTimeMillis() + delayIncrementer) + return@on true } + + on(TRAVEL_LOG,12){player, _, _, _, _, _ -> + toggleSortOrder(player) + return@on true + } + } - override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { - player ?: return false - val delay = player.getAttribute("fr:time",0L) - if(delay > System.currentTimeMillis()){ - return true - } - - var delayIncrementer = 1750L - when(button){ - 23 -> delayIncrementer += increment(player,1) - 25 -> delayIncrementer += increment(player,2) - 27 -> delayIncrementer += increment(player,3) - 24 -> decrement(player,1) - 26 -> decrement(player,2) - 28 -> decrement(player,3) - 21 -> confirm(player) - 12 -> delayIncrementer += toggleSortOrder(player) - } - player.setAttribute("fr:time",System.currentTimeMillis() + delayIncrementer) - return true - } - - fun toggleSortOrder(player: Player): Long{ + private fun toggleSortOrder(player: Player): Long{ val ring1index = player.getAttribute("fr:ring1",0) var toSet = player.getAttribute("fr:sortorder",true) toSet = !toSet @@ -97,7 +100,7 @@ class FairyRingInterface : ComponentPlugin(){ player.setAttribute("fr:ring$ring",nextIndex) } - fun confirm(player: Player){ + private fun confirm(player: Player){ val ring1index = player.getAttribute("fr:ring1",0) val ring2index = player.getAttribute("fr:ring2",0) val ring3index = player.getAttribute("fr:ring3",0) @@ -131,13 +134,6 @@ class FairyRingInterface : ComponentPlugin(){ player.interfaceManager.close() player.teleporter.send(tile,TeleportManager.TeleportType.FAIRY_RING) } - - override fun newInstance(arg: Any?): Plugin { - ComponentDefinition.put(734,this) - ComponentDefinition.put(735,this) - return this - } - } enum class FairyRing(val tile: Location?, val tip: String = "", val childId: Int = -1) { diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/QuestCapeListener.kt b/Server/src/main/kotlin/rs09/game/interaction/item/QuestCapeListener.kt index 330b4ffa0..ed198eea1 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/item/QuestCapeListener.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/item/QuestCapeListener.kt @@ -2,7 +2,7 @@ package rs09.game.interaction.item import core.game.node.entity.player.link.quest.QuestRepository import rs09.game.interaction.InteractionListener -import rs09.game.interaction.Listeners.run +import rs09.game.interaction.InteractionListeners.run class QuestCapeListener : InteractionListener() { diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/LeprechaunNoter.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/LeprechaunNoter.kt index 9c3bcbf01..a6c74763a 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/LeprechaunNoter.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/LeprechaunNoter.kt @@ -1,43 +1,36 @@ package rs09.game.node.entity.skill.farming import core.game.content.dialogue.FacialExpression -import core.game.interaction.NodeUsageEvent -import core.game.interaction.UseWithHandler import core.game.node.item.Item import core.plugin.Initializable -import core.plugin.Plugin import org.rs09.consts.NPCs +import rs09.game.interaction.InteractionListener -@Initializable -class LeprechaunNoter : UseWithHandler(*Plantable.values().map{ it.harvestItem }.toIntArray()) { - override fun newInstance(arg: Any?): Plugin { - addHandler(NPCs.TOOL_LEPRECHAUN_3021, NPC_TYPE,this) - addHandler(NPCs.GOTH_LEPRECHAUN_8000, NPC_TYPE,this) - addHandler(NPCs.TOOL_LEPRECHAUN_4965, NPC_TYPE,this) - return this - } +class LeprechaunNoter : InteractionListener() { - override fun handle(event: NodeUsageEvent?): Boolean { - event ?: return false - val player = event.player ?: return false - val usedItem = event.usedItem ?: return false - val npc = event.usedWith.asNpc() ?: return false + val CROPS = Plantable.values().map{ it.harvestItem }.toIntArray() + val LEPRECHAUNS = intArrayOf(NPCs.TOOL_LEPRECHAUN_3021,NPCs.GOTH_LEPRECHAUN_8000,NPCs.TOOL_LEPRECHAUN_4965) - val expr = when(npc.id){ - 3021 -> FacialExpression.OLD_NORMAL - else -> FacialExpression.FRIENDLY - } - - if(usedItem.noteChange != usedItem.id){ - val amt = player.inventory.getAmount(usedItem.id) - if(player.inventory.remove(Item(usedItem.id,amt))){ - player.inventory.add(Item(usedItem.noteChange,amt)) + override fun defineListeners() { + onUseWith(NPC,CROPS,*LEPRECHAUNS){player, used, with -> + val usedItem = used.asItem() + val npc = with.asNpc() + val expr = when(npc.id){ + 3021 -> FacialExpression.OLD_NORMAL + else -> FacialExpression.FRIENDLY } - player.dialogueInterpreter.sendDialogues(npc.id,expr,"There ya go.") - } else { - player.dialogueInterpreter.sendDialogues(npc.id,expr,"But that's already a note!") - } - return true - } + if(usedItem.noteChange != usedItem.id){ + val amt = player.inventory.getAmount(usedItem.id) + if(player.inventory.remove(Item(usedItem.id,amt))){ + player.inventory.add(Item(usedItem.noteChange,amt)) + } + player.dialogueInterpreter.sendDialogues(npc.id,expr,"There ya go.") + } else { + player.dialogueInterpreter.sendDialogues(npc.id,expr,"But that's already a note!") + } + + return@onUseWith true + } + } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/ToolLeprechaunInterface.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/ToolLeprechaunInterface.kt index 8c1330a2c..9bde87193 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/ToolLeprechaunInterface.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/ToolLeprechaunInterface.kt @@ -1,132 +1,99 @@ package rs09.game.node.entity.skill.farming import core.game.component.Component -import core.game.component.ComponentDefinition -import core.game.component.ComponentPlugin import core.game.node.entity.player.Player import core.game.node.entity.player.link.RunScript import core.game.node.item.Item -import core.plugin.Initializable -import core.plugin.Plugin import org.rs09.consts.Components import org.rs09.consts.Items +import rs09.game.interaction.InterfaceListener private const val varp = 615 -@Initializable -class ToolLeprechaunInterface : ComponentPlugin() { - override fun newInstance(arg: Any?): Plugin { - ComponentDefinition.put(Components.FARMING_TOOLS_125,this) - ComponentDefinition.put(Components.FARMING_TOOLS_SIDE_126,this) - return this - } +class ToolLeprechaunInterface : InterfaceListener() { - override fun open(player: Player?, component: Component?) { - component ?: return - super.open(player, component) - player?.varpManager?.flagSave(varp) - if(component.id == Components.FARMING_TOOLS_125) { - player?.interfaceManager?.openSingleTab(Component(Components.FARMING_TOOLS_SIDE_126)) - component.setCloseEvent { pl, _ -> - pl?.interfaceManager?.closeSingleTab() - true - } - } - } + private val FARMING_TOOLS = Components.FARMING_TOOLS_125 + private val TOOLS_SIDE = Components.FARMING_TOOLS_SIDE_126 - override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { - player ?: return false - component ?: return false - - when(component.id){ - - Components.FARMING_TOOLS_125 -> { - when(button){ - 33 -> doWithdrawal(player, Items.RAKE_5341,::setHasRake,::hasRake) - - 34 -> doWithdrawal(player,Items.SEED_DIBBER_5343,::setHasDibber,::hasDibber) - - 35 -> doWithdrawal(player,Items.SPADE_952,::setHasSpade,::hasSpade) - - 36 -> { - val sec = if(hasMagicSecateurs(player)) Items.MAGIC_SECATEURS_7409 else Items.SECATEURS_5329 - doWithdrawal(player,sec,::setHasSecateurs,::hasSecateurs) - } - - 37 -> { - if(!hasWateringCan(player)){ - player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") - } else { - player.inventory.add(Item(getWateringCan(player))) - setNoWateringCan(player) - } - } - - 38 -> doWithdrawal(player,Items.GARDENING_TROWEL_5325,::setHasGardeningTrowel,::hasGardeningTrowel) - - 39 -> doStackedWithdrawal(player,Items.BUCKET_1925,getAmount(opcode),::updateBuckets,::getNumBuckets) - - 40 -> doStackedWithdrawal(player,Items.COMPOST_6032,getAmount(opcode),::updateCompost,::getNumCompost) - - 41 -> doStackedWithdrawal(player,Items.SUPERCOMPOST_6034,getAmount(opcode),::updateSuperCompost,::getNumSuperCompost) - } - } - - Components.FARMING_TOOLS_SIDE_126 -> { - - when(button){ - - 18 -> doDeposit(player,Items.RAKE_5341,::setHasRake,::hasRake) - - 19 -> doDeposit(player,Items.SEED_DIBBER_5343,::setHasDibber,::hasDibber) - - 20 -> doDeposit(player,Items.SPADE_952,::setHasSpade,::hasSpade) - - 21 -> { - if(!player.inventory.contains(Items.SECATEURS_5329,1) && !player.inventory.contains(Items.MAGIC_SECATEURS_7409,1)){ - player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") - } else if (!hasSecateurs(player)){ - if(player.inventory.contains(Items.MAGIC_SECATEURS_7409,1)){ - player.inventory.remove(Item(Items.MAGIC_SECATEURS_7409)) - setHasSecateurs(player,true) - setHasMagicSecateurs(player,true) - } else { - player.inventory.remove(Item(Items.SECATEURS_5329)) - setHasSecateurs(player,true) - setHasMagicSecateurs(player,false) - } - } else { - player.dialogueInterpreter.sendDialogue("You already have one of those stored.") - } - } - - 22 -> { - val can = getHighestCan(player) - if(can == null){ - player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") - } else if(!hasWateringCan(player)){ - player.inventory.remove(can) - setWateringCan(player,can) - } else { - player.dialogueInterpreter.sendDialogue("You already have one of those stored.") - } - } - - 23 -> doDeposit(player,Items.GARDENING_TROWEL_5325,::setHasGardeningTrowel,::hasGardeningTrowel) - - 24 -> doStackedDeposit(player,Items.BUCKET_1925,getAmount(opcode),::updateBuckets,::getNumBuckets) - - 25 -> doStackedDeposit(player,Items.COMPOST_6032,getAmount(opcode),::updateCompost,::getNumCompost) - - 26 -> doStackedDeposit(player,Items.SUPERCOMPOST_6034,getAmount(opcode),::updateSuperCompost,::getNumSuperCompost) - - } - - } + override fun defineListeners() { + onOpen(FARMING_TOOLS){player, component -> + player.varpManager?.flagSave(varp) + player.interfaceManager.openSingleTab(Component(TOOLS_SIDE)) + return@onOpen true + } + + onClose(FARMING_TOOLS){player, _ -> + player.interfaceManager.closeSingleTab() + } + + on(FARMING_TOOLS){player, _, opcode, buttonID, _, _ -> + when(buttonID){ + 33 -> doWithdrawal(player, Items.RAKE_5341,::setHasRake,::hasRake) + 34 -> doWithdrawal(player,Items.SEED_DIBBER_5343,::setHasDibber,::hasDibber) + 35 -> doWithdrawal(player,Items.SPADE_952,::setHasSpade,::hasSpade) + 36 -> { + val sec = if(hasMagicSecateurs(player)) Items.MAGIC_SECATEURS_7409 else Items.SECATEURS_5329 + doWithdrawal(player,sec,::setHasSecateurs,::hasSecateurs) + } + 37 -> { + if(!hasWateringCan(player)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") + } else { + player.inventory.add(Item(getWateringCan(player))) + setNoWateringCan(player) + } + } + 38 -> doWithdrawal(player,Items.GARDENING_TROWEL_5325,::setHasGardeningTrowel,::hasGardeningTrowel) + 39 -> doStackedWithdrawal(player,Items.BUCKET_1925,getAmount(opcode),::updateBuckets,::getNumBuckets) + 40 -> doStackedWithdrawal(player,Items.COMPOST_6032,getAmount(opcode),::updateCompost,::getNumCompost) + 41 -> doStackedWithdrawal(player,Items.SUPERCOMPOST_6034,getAmount(opcode),::updateSuperCompost,::getNumSuperCompost) + } + player.varpManager.get(varp).send(player) + return@on true + } + + on(TOOLS_SIDE){player, _, opcode, buttonID, _, _ -> + when(buttonID){ + 18 -> doDeposit(player,Items.RAKE_5341,::setHasRake,::hasRake) + 19 -> doDeposit(player,Items.SEED_DIBBER_5343,::setHasDibber,::hasDibber) + 20 -> doDeposit(player,Items.SPADE_952,::setHasSpade,::hasSpade) + 21 -> { + if(!player.inventory.contains(Items.SECATEURS_5329,1) && !player.inventory.contains(Items.MAGIC_SECATEURS_7409,1)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if (!hasSecateurs(player)){ + if(player.inventory.contains(Items.MAGIC_SECATEURS_7409,1)){ + player.inventory.remove(Item(Items.MAGIC_SECATEURS_7409)) + setHasSecateurs(player,true) + setHasMagicSecateurs(player,true) + } else { + player.inventory.remove(Item(Items.SECATEURS_5329)) + setHasSecateurs(player,true) + setHasMagicSecateurs(player,false) + } + } else { + player.dialogueInterpreter.sendDialogue("You already have one of those stored.") + } + } + 22 -> { + val can = getHighestCan(player) + if(can == null){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if(!hasWateringCan(player)){ + player.inventory.remove(can) + setWateringCan(player,can) + } else { + player.dialogueInterpreter.sendDialogue("You already have one of those stored.") + } + } + 23 -> doDeposit(player,Items.GARDENING_TROWEL_5325,::setHasGardeningTrowel,::hasGardeningTrowel) + 24 -> doStackedDeposit(player,Items.BUCKET_1925,getAmount(opcode),::updateBuckets,::getNumBuckets) + 25 -> doStackedDeposit(player,Items.COMPOST_6032,getAmount(opcode),::updateCompost,::getNumCompost) + 26 -> doStackedDeposit(player,Items.SUPERCOMPOST_6034,getAmount(opcode),::updateSuperCompost,::getNumSuperCompost) + } + player.varpManager.get(varp).send(player) + return@on true } - player.varpManager.get(varp).send(player) - return true } private fun doWithdrawal(player: Player?, item: Int, withdrawMethod: (Player?,Boolean) -> Unit, checkMethod: (Player?) -> Boolean){ diff --git a/Server/src/main/kotlin/rs09/plugin/PluginManager.kt b/Server/src/main/kotlin/rs09/plugin/PluginManager.kt index 4ed942ac6..8b243b44e 100644 --- a/Server/src/main/kotlin/rs09/plugin/PluginManager.kt +++ b/Server/src/main/kotlin/rs09/plugin/PluginManager.kt @@ -12,6 +12,7 @@ import core.plugin.PluginType import io.github.classgraph.ClassGraph import io.github.classgraph.ClassInfo import rs09.game.interaction.InteractionListener +import rs09.game.interaction.InterfaceListener import rs09.game.system.SystemLogger import rs09.game.system.command.Command import java.util.* @@ -77,6 +78,10 @@ object PluginManager { clazz.defineListeners() clazz.defineDestinationOverrides() } + result.getSubclasses("rs09.game.interaction.InterfaceListener").forEach { + val clazz = it.loadClass().newInstance() as InterfaceListener + clazz.defineListeners() + } } /**