Added UseWithListener.kt

This commit is contained in:
Ceikry
2021-03-12 23:20:47 -06:00
parent 61195135bb
commit 866962ff2b
12 changed files with 106 additions and 42 deletions
@@ -15,7 +15,9 @@ import core.net.packet.IoBuffer;
import core.net.packet.PacketRepository;
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.node.entity.skill.farming.CompostBins;
import rs09.game.node.entity.skill.farming.FarmingPatch;
import rs09.game.node.entity.skill.farming.UseWithBinHandler;
@@ -23,7 +25,6 @@ import rs09.game.node.entity.skill.farming.UseWithPatchHandler;
import rs09.game.system.SystemLogger;
import rs09.game.system.command.rottenpotato.RottenPotatoUseWithHandler;
import rs09.game.world.repository.Repository;
import org.rs09.consts.Items;
/**
* The incoming item reward packet.
@@ -68,6 +69,9 @@ public class ItemActionPacket implements IncomingPacket {
if(PluginInteractionManager.handle(player,event)){
return;
}
if(Listeners.run(item,npc,2,player)){
return;
}
event = new NodeUsageEvent(player, interfaceId, item, npc);
try {
UseWithHandler.run(event);
@@ -124,6 +128,9 @@ public class ItemActionPacket implements IncomingPacket {
RottenPotatoUseWithHandler.handle(used,player);
return;
}
if(Listeners.run(used,with,0,player)){
return;
}
if (usedItemId < usedWithItemId) {
item = used;
used = with;
@@ -172,6 +179,9 @@ public class ItemActionPacket implements IncomingPacket {
RottenPotatoUseWithHandler.handle(object,player);
return;
}
if(Listeners.run(used,object,1,player)){
return;
}
event = new NodeUsageEvent(player, 0, used, object);
/**
@@ -8,7 +8,6 @@ import core.game.node.item.Item
import core.game.world.map.Direction
import core.game.world.map.Location
import core.game.world.update.flag.context.Animation
import core.plugin.Initializable
import org.rs09.consts.Items
import rs09.game.interaction.OptionListener
import java.util.*
@@ -17,7 +16,6 @@ import java.util.*
* Handles repairing and climbing of the 3 beacon shortcuts needed to access them
* @author Ceikry
*/
@Initializable
class AFURepairClimbHandler : OptionListener() {
val repairIDs = intArrayOf(38480,38470,38494)
@@ -22,7 +22,6 @@ import kotlin.math.ceil
* Option handler for fishing trawler
* @author Ceikry
*/
@Initializable
class FishingTrawlerOptionHandler : OptionListener() {
val ENTRANCE_PLANK = 2178
val EXIT_PLANK = 2179
@@ -0,0 +1,5 @@
package rs09.game.interaction
interface Listener {
fun defineListeners()
}
@@ -6,7 +6,8 @@ import core.game.node.Node
import core.game.node.entity.player.Player
object Listeners {
private val listeners = HashMap<String,(Player, Node) -> Boolean>()
private val listeners = HashMap<String,(Player, Node) -> Boolean>(1000)
private val useWithListeners = HashMap<String,(Player,Node,Node) -> Boolean>(1000)
@JvmStatic
fun add(id: Int, type: Int, option: Array<out String>, method: (Player,Node) -> Boolean){
@@ -36,6 +37,23 @@ object Listeners {
}
}
@JvmStatic
fun add(used: Int, with: Int, type: Int, method: (Player,Node,Node) -> Boolean){
useWithListeners["$used:$with:$type"] = method
}
@JvmStatic
fun add(type: Int, used: Int, with: IntArray, method: (Player, Node, Node) -> Boolean){
for(id in with){
useWithListeners["$used:$with:$type"] = method
}
}
@JvmStatic
fun get(used: Int, with: Int, type: Int): ((Player,Node,Node) -> Boolean)?{
return useWithListeners["$used:$with:$type"]
}
@JvmStatic
fun get(id: Int, type: Int, option: String): ((Player,Node) -> Boolean)?{
return listeners["$id:$type:${option.toLowerCase()}"]
@@ -46,6 +64,34 @@ object Listeners {
return listeners["$type:${option.toLowerCase()}"]
}
@JvmStatic
fun run(used: Node, with: Node, type: Int,player: Player): Boolean{
val flag = when(type){
2 -> DestinationFlag.ENTITY
1 -> DestinationFlag.OBJECT
else -> DestinationFlag.OBJECT
}
var flipped = false
val method = get(used.id,with.id,type) ?: get(with.id,used.id,type).also { flipped = true } ?: return false
if(type != 0) {
player.pulseManager.run(object : MovementPulse(player, with, flag) {
override fun pulse(): Boolean {
player.faceLocation(with.location)
if(flipped) method.invoke(player,with,used)
else method.invoke(player,used,with)
return true
}
})
} else {
if(flipped) method.invoke(player,with,used)
else method.invoke(player,used,with)
}
return true
}
@JvmStatic
fun run(id: Int, type: Int, option: String, player: Player, node: Node): Boolean{
val flag = when(type){
@@ -3,11 +3,10 @@ package rs09.game.interaction
import core.game.node.Node
import core.game.node.entity.player.Player
abstract class OptionListener {
abstract class OptionListener : Listener{
val ITEM = 0
val OBJECT = 1
val NPC = 2
abstract fun defineListeners()
fun on(id: Int, type: Int, vararg option: String,handler: (Player, Node) -> Boolean){
Listeners.add(id,type,option,handler)
}
@@ -0,0 +1,16 @@
package rs09.game.interaction
import core.game.node.Node
import core.game.node.entity.player.Player
abstract class UseWithListener : Listener {
val ITEM = 0
val OBJECT = 1
val NPC = 2
fun on(used: Int, with: Int, type: Int, handler: (Player, Node, Node) -> Boolean){
Listeners.add(used,with,type,handler)
}
fun on(type: Int,used: Int,vararg with: Int, handler: (Player, Node, Node) -> Boolean){
Listeners.add(type,used,with,handler)
}
}
@@ -1,7 +1,6 @@
package rs09.game.interaction.city
import core.game.world.map.Location
import core.plugin.Initializable
import rs09.game.interaction.OptionListener
/**
@@ -10,7 +9,6 @@ import rs09.game.interaction.OptionListener
* @author Sir Kermit
*/
@Initializable
class IsafdarListeners : OptionListener() {
val CAVE_ENTRANCE = 4006
@@ -4,7 +4,6 @@ import core.game.node.entity.impl.ForceMovement
import core.game.world.map.Direction
import core.game.world.map.Location
import core.game.world.update.flag.context.Animation
import core.plugin.Initializable
import rs09.game.interaction.OptionListener
/**
@@ -13,7 +12,6 @@ import rs09.game.interaction.OptionListener
* @author Sir Kermit
*/
@Initializable
class MorytaniaListeners : OptionListener() {
val GROTTO_ENTRANCE = 3516
@@ -1,19 +1,11 @@
package rs09.game.interaction.item.withobject
import core.cache.def.impl.ObjectDefinition
import core.game.interaction.NodeUsageEvent
import core.game.interaction.OptionHandler
import core.game.interaction.UseWithHandler
import core.game.node.Node
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.diary.DiaryType
import core.game.node.item.Item
import core.game.world.map.zone.ZoneBorders
import core.plugin.Initializable
import core.plugin.Plugin
import org.rs09.consts.Items
import rs09.game.interaction.OptionListener
import rs09.plugin.PluginManager.definePlugin
import rs09.game.interaction.UseWithListener
import java.util.*
/**
@@ -63,21 +55,20 @@ class CoalTrucksHandler : OptionListener() {
}
//TODO:
inner class useCoalWithTruck : UseWithHandler(Items.COAL_453) {
override fun newInstance(arg: Any?): Plugin<Any>? {
addHandler(2114, OBJECT_TYPE, this)
return this
}
class CoalTruckListener : UseWithListener() {
val COAL_TRUCK_2114 = 2114
val COAL = Items.COAL_453
override fun handle(event: NodeUsageEvent): Boolean {
val player = event.player
override fun defineListeners() {
on(COAL,COAL_TRUCK_2114,OBJECT){player,_,_ ->
var coalInTruck = player.getAttribute("coal-truck-inventory", 0)
var coalInInventory = player.inventory.getAmount(Items.COAL_453)
if(coalInInventory + coalInTruck >= 120){
coalInInventory = 120 - coalInTruck
event.player.packetDispatch.sendMessage("You have filled up the coal truck.")
player.packetDispatch.sendMessage("You have filled up the coal truck.")
//handle coal truck task for seer's village
if (!player.achievementDiaryManager.getDiary(DiaryType.SEERS_VILLAGE).isComplete(1, 2)
@@ -90,7 +81,9 @@ class CoalTrucksHandler : OptionListener() {
coalInTruck += coalInInventory
player.setAttribute("/save:coal-truck-inventory",coalInTruck)
return true
return@on true
}
}
}
}
@@ -5,11 +5,9 @@ import core.game.node.`object`.ObjectBuilder
import core.game.node.item.GroundItemManager
import core.game.node.item.Item
import core.game.world.update.flag.context.Animation
import core.plugin.Initializable
import org.rs09.consts.Items
import rs09.game.interaction.OptionListener
@Initializable
/**
* Handles the muddy chest
* @author Ceikry
@@ -12,6 +12,7 @@ import core.plugin.PluginType
import io.github.classgraph.ClassGraph
import io.github.classgraph.ClassInfo
import rs09.game.interaction.OptionListener
import rs09.game.interaction.UseWithListener
import rs09.game.system.SystemLogger
import rs09.game.system.command.Command
import java.util.*
@@ -75,6 +76,9 @@ object PluginManager {
result.getSubclasses("rs09.game.interaction.OptionListener").forEach {
(it.loadClass().newInstance() as OptionListener).defineListeners()
}
result.getSubclasses("rs09.game.interaction.UseWithListener").forEach {
(it.loadClass().newInstance() as UseWithListener).defineListeners()
}
}
/**