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