Added InterfaceListener.kt and converted a few interfaces over to it

This commit is contained in:
Ceikry 2021-03-15 01:12:07 -05:00
parent ad1bbaa5b4
commit 35cbb7f2f4
18 changed files with 301 additions and 256 deletions

View file

@ -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;
}

View file

@ -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))) {

View file

@ -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;
}

View file

@ -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())) {

View file

@ -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();

View file

@ -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;
}
}
}

View file

@ -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)){

View file

@ -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);

View file

@ -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<Any> {
ComponentDefinition.put(COMPONENT_ID,this)
return this
}
}

View file

@ -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)
}
}

View file

@ -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<String,(Player, Node) -> Boolean>(1000)
private val useWithListeners = HashMap<String,(Player,Node,Node) -> Boolean>(1000)
private val destinationOverrides = HashMap<String,(Node) -> Location>(100)

View file

@ -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)
}
}

View file

@ -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<String,(Player, Component, Int, Int, Int, Int) -> Boolean>(1000)
val openListeners = HashMap<String,(Player,Component) -> 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)
}
}

View file

@ -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<Any> {
ComponentDefinition.put(734,this)
ComponentDefinition.put(735,this)
return this
}
}
enum class FairyRing(val tile: Location?, val tip: String = "", val childId: Int = -1) {

View file

@ -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() {

View file

@ -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<Any> {
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
}
}
}

View file

@ -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<Any> {
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){

View file

@ -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()
}
}
/**