From 14528411a7009fa3152066cf838fabcd2e6b8933 Mon Sep 17 00:00:00 2001 From: Avi Weinstock Date: Sat, 29 Jan 2022 11:31:19 -0500 Subject: [PATCH] Add InteractionListener.onUseWithWildcard. --- .../game/interaction/InteractionListener.kt | 7 +++++- .../game/interaction/InteractionListeners.kt | 25 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Server/src/main/kotlin/rs09/game/interaction/InteractionListener.kt b/Server/src/main/kotlin/rs09/game/interaction/InteractionListener.kt index ffc9ae3c3..beeaec6b3 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/InteractionListener.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/InteractionListener.kt @@ -30,6 +30,11 @@ abstract class InteractionListener : Listener{ fun onUseWith(type: Int, used: IntArray, vararg with: Int, handler: (player: Player, used: Node, with: Node) -> Boolean){ InteractionListeners.add(type,used,with,handler) } + // Note: wildcard listeners incur overhead on every use-with interaction, only use them as a space-time tradeoff when something + // is actually supposed to have a response to every item used with it (e.g. imp boxes, certain quest npcs) + fun onUseWithWildcard(type: Int, predicate: (used: Int, with: Int) -> Boolean, handler: (player: Player, used: Node, with: Node) -> Boolean) { + InteractionListeners.addWildcard(type, predicate, handler) + } fun onEquip(id: Int, handler: (player: Player, node: Node) -> Boolean){ InteractionListeners.addEquip(id,handler) } @@ -53,4 +58,4 @@ abstract class InteractionListener : Listener{ fun onDig(location: Location,method: (player: Player) -> Unit){ SpadeDigListener.registerListener(location,method) } -} \ No newline at end of file +} diff --git a/Server/src/main/kotlin/rs09/game/interaction/InteractionListeners.kt b/Server/src/main/kotlin/rs09/game/interaction/InteractionListeners.kt index 2a73fdeee..0bcbbb7e6 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/InteractionListeners.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/InteractionListeners.kt @@ -12,6 +12,7 @@ import rs09.game.system.SystemLogger object InteractionListeners { private val listeners = HashMap Boolean>(1000) private val useWithListeners = HashMap Boolean>(1000) + private val useWithWildcardListeners = HashMap Boolean, (Player, Node, Node) -> Boolean>>>(10) private val destinationOverrides = HashMap Location>(100) private val equipListeners = HashMap Boolean>(10) @@ -55,6 +56,14 @@ object InteractionListeners { } } + @JvmStatic + fun addWildcard(type: Int, predicate: (used: Int, with: Int) -> Boolean, handler: (player: Player, used: Node, with: Node) -> Boolean) { + if(!useWithWildcardListeners.containsKey(type)) { + useWithWildcardListeners.put(type, ArrayList()) + } + useWithWildcardListeners[type]!!.add(Pair(predicate, handler)) + } + @JvmStatic fun addEquip(id: Int,method: (Player, Node) -> Boolean){ equipListeners["equip:$id"] = method @@ -76,8 +85,18 @@ object InteractionListeners { } @JvmStatic - fun get(used: Int, with: Int, type: Int): ((Player,Node,Node) -> Boolean)?{ - return useWithListeners["$used:$with:$type"] + fun get(used: Int, with: Int, type: Int): ((Player,Node,Node) -> Boolean)? { + var method = useWithListeners["$used:$with:$type"] + if(method != null) { + return method + } + val handlers = useWithWildcardListeners[type] ?: return null + for(pair in handlers) { + if(pair.first(used, with)) { + return pair.second + } + } + return null } @JvmStatic @@ -214,4 +233,4 @@ object InteractionListeners { } } } -} \ No newline at end of file +}