diff --git a/Server/src/main/java/core/game/content/activity/bountyhunter/BountyLocateSpell.java b/Server/src/main/java/core/game/content/activity/bountyhunter/BountyLocateSpell.java index 7007e1873..473d3cf90 100644 --- a/Server/src/main/java/core/game/content/activity/bountyhunter/BountyLocateSpell.java +++ b/Server/src/main/java/core/game/content/activity/bountyhunter/BountyLocateSpell.java @@ -1,5 +1,6 @@ package core.game.content.activity.bountyhunter; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.skill.magic.MagicSpell; import core.game.node.entity.skill.magic.Runes; import core.game.interaction.MovementPulse; @@ -74,7 +75,7 @@ public final class BountyLocateSpell extends MagicSpell { public boolean pulse() { return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } Location destination = RegionManager.getTeleportLocation(entry.getTarget().getLocation(), 5); diff --git a/Server/src/main/java/core/game/content/activity/clanwars/ClanWarsActivityPlugin.java b/Server/src/main/java/core/game/content/activity/clanwars/ClanWarsActivityPlugin.java index d154f5a48..a983721ee 100644 --- a/Server/src/main/java/core/game/content/activity/clanwars/ClanWarsActivityPlugin.java +++ b/Server/src/main/java/core/game/content/activity/clanwars/ClanWarsActivityPlugin.java @@ -83,7 +83,6 @@ public final class ClanWarsActivityPlugin extends ActivityPlugin { @Override public boolean handle(Player player, Node node, String option) { - player.getPulseManager().clear("interaction:attack:" + node.hashCode()); player.getProperties().getCombatPulse().attack(node); return true; } diff --git a/Server/src/main/java/core/game/content/activity/duel/DuelArea.java b/Server/src/main/java/core/game/content/activity/duel/DuelArea.java index 220d3aba3..1bc7110a3 100644 --- a/Server/src/main/java/core/game/content/activity/duel/DuelArea.java +++ b/Server/src/main/java/core/game/content/activity/duel/DuelArea.java @@ -67,7 +67,6 @@ public class DuelArea extends MapZone { @Override public boolean handle(Player player, Node node, String option) { - player.getPulseManager().clear("interaction:attack:" + node.hashCode()); player.getProperties().getCombatPulse().attack(node); return true; } diff --git a/Server/src/main/java/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC.java b/Server/src/main/java/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC.java index 000846402..7a22f51a9 100644 --- a/Server/src/main/java/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC.java +++ b/Server/src/main/java/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC.java @@ -4,6 +4,7 @@ import core.game.interaction.MovementPulse; import core.game.node.Node; import core.game.node.entity.Entity; import core.game.node.entity.combat.BattleState; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.AbstractNPC; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; @@ -155,7 +156,7 @@ public class PCRavagerNPC extends AbstractNPC { public boolean pulse() { return true; } - }, "movement"); + }, PulseType.STANDARD); } /** diff --git a/Server/src/main/java/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC.java b/Server/src/main/java/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC.java index 6b00811b5..0f4584fba 100644 --- a/Server/src/main/java/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC.java +++ b/Server/src/main/java/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC.java @@ -5,6 +5,7 @@ import core.game.node.entity.Entity; import core.game.node.entity.combat.BattleState; import core.game.node.entity.combat.ImpactHandler.HitsplatType; import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.AbstractNPC; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; @@ -72,7 +73,7 @@ public final class PCSpinnerNPC extends AbstractNPC { public boolean pulse() { return true; } - }, "movement"); + }, PulseType.STANDARD); } } } diff --git a/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java b/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java index abbd96dae..ed20e9572 100644 --- a/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java +++ b/Server/src/main/java/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java @@ -3,6 +3,7 @@ package core.game.content.activity.pyramidplunder; import core.game.interaction.MovementPulse; import core.game.node.entity.Entity; import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.AbstractNPC; import core.game.node.entity.player.Player; import rs09.game.world.GameWorld; @@ -150,7 +151,7 @@ public abstract class PyramidPlunderNPC extends AbstractNPC { public boolean pulse() { return false; } - }, "movement"); + }, PulseType.STANDARD); face(player); } diff --git a/Server/src/main/java/core/game/content/quest/free/demonslayer/DemonSlayerPlugin.java b/Server/src/main/java/core/game/content/quest/free/demonslayer/DemonSlayerPlugin.java index 8405a488a..ba5d571b5 100644 --- a/Server/src/main/java/core/game/content/quest/free/demonslayer/DemonSlayerPlugin.java +++ b/Server/src/main/java/core/game/content/quest/free/demonslayer/DemonSlayerPlugin.java @@ -58,7 +58,6 @@ public final class DemonSlayerPlugin extends OptionHandler { return true; } player.face(((NPC) node)); - player.getPulseManager().clear("interaction:attack:" + node.hashCode()); player.getProperties().getCombatPulse().attack(node); return true; case DRAIN_ID: 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 415cbfb56..0eaf4aa7c 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 @@ -141,7 +141,6 @@ public final class DragonSlayerPlugin extends OptionHandler { player.getPacketDispatch().sendMessage("You have already slain Elvarg the dragon."); return true; } - player.getPulseManager().clear("interaction:attack:" + node.hashCode()); player.getProperties().getCombatPulse().attack(node); player.face((Entity) node); break; @@ -230,7 +229,6 @@ public final class DragonSlayerPlugin extends OptionHandler { break; case 745: if (option.equals("attack")) { - player.getPulseManager().clear("interaction:attack:" + node.hashCode()); player.getProperties().getCombatPulse().attack(node); return true; } diff --git a/Server/src/main/java/core/game/content/quest/members/fishingcontest/FenceInteraction.java b/Server/src/main/java/core/game/content/quest/members/fishingcontest/FenceInteraction.java index 649a16186..fdca09b3c 100644 --- a/Server/src/main/java/core/game/content/quest/members/fishingcontest/FenceInteraction.java +++ b/Server/src/main/java/core/game/content/quest/members/fishingcontest/FenceInteraction.java @@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest; import core.game.interaction.MovementPulse; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.player.Player; import core.game.system.task.Pulse; import rs09.game.world.GameWorld; @@ -29,7 +30,7 @@ public class FenceInteraction extends PluginInteraction { GameWorld.getPulser().submit(new SqueezePulse(player)); return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } diff --git a/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingContestCutscene.java b/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingContestCutscene.java index e85409c21..c21102162 100644 --- a/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingContestCutscene.java +++ b/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingContestCutscene.java @@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest; import core.game.interaction.MovementPulse; import core.game.node.entity.Entity; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.system.task.Pulse; @@ -140,7 +141,7 @@ public class FishingContestCutscene extends CutscenePlugin { player.getWalkingQueue().setRunDisabled(true); return true; } - }, "movement"); + }, PulseType.STANDARD); break; case 12: stranger.sendChat("You're switching with me. Go."); @@ -152,7 +153,7 @@ public class FishingContestCutscene extends CutscenePlugin { player.getDialogueInterpreter().sendDialogue("Your spot is now by the pipes."); return true; } - }, "movement"); + }, PulseType.STANDARD); break; case 22: stranger.getPulseManager().run(new MovementPulse(stranger, base.getLocation().transform(7, 43, 0)) { @@ -160,7 +161,7 @@ public class FishingContestCutscene extends CutscenePlugin { public boolean pulse() { return true; } - }, "movement"); + },PulseType.STANDARD); GameWorld.getPulser().submit(new FishingPulse()); return true; } diff --git a/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingSpotInteraction.java b/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingSpotInteraction.java index c425e1971..4bf4dfa4b 100644 --- a/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingSpotInteraction.java +++ b/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingSpotInteraction.java @@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest; import core.game.interaction.MovementPulse; import core.game.interaction.Option; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.world.map.Location; @@ -24,7 +25,7 @@ public class FishingSpotInteraction extends PluginInteraction { player.getDialogueInterpreter().sendDialogues(3677, FacialExpression.NEUTRAL, "I think you will find that is","my spot."); return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } else if (npc_loc.equals(2630, 3435, 0)){ player.getPulseManager().run(new MovementPulse(player, npc.getLocation().transform(1, 0, 0)) { @@ -33,7 +34,7 @@ public class FishingSpotInteraction extends PluginInteraction { player.getDialogueInterpreter().sendDialogues(225, FacialExpression.NEUTRAL, "Hey, you need to pay to enter the", "competition first! Only 5gp entrance fee!"); return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } else if (npc_loc.equals(Location.create(2632, 3427, 0))){ player.getPulseManager().run(new MovementPulse(player, npc.getLocation().transform(1, 0, 0)) { @@ -42,7 +43,7 @@ public class FishingSpotInteraction extends PluginInteraction { player.getDialogueInterpreter().sendDialogues(228, FacialExpression.NEUTRAL, "I think you will find that is my spot."); return true; } - }, "movement"); + },PulseType.STANDARD); return true; } else if(npc_loc.equals(Location.create(2627,3415,0))) { player.getPulseManager().run(new MovementPulse(player, npc.getLocation().transform(1, 0, 0)) { @@ -51,7 +52,7 @@ public class FishingSpotInteraction extends PluginInteraction { player.getDialogueInterpreter().sendDialogues(228, FacialExpression.NEUTRAL, "I think you will find that is my spot."); return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } } diff --git a/Server/src/main/java/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction.java b/Server/src/main/java/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction.java index 164c0a7bd..5ce5871c1 100644 --- a/Server/src/main/java/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction.java +++ b/Server/src/main/java/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction.java @@ -3,6 +3,7 @@ package core.game.content.quest.members.fishingcontest; import core.game.interaction.MovementPulse; import core.game.interaction.NodeUsageEvent; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.game.node.scenery.Scenery; @@ -39,7 +40,7 @@ public class GarlicPipeInteraction extends PluginInteraction { player.setAttribute("fishing_contest:garlic",true); return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } } @@ -57,7 +58,7 @@ public class GarlicPipeInteraction extends PluginInteraction { player.getDialogueInterpreter().sendDialogue("This is the pipe I stuffed that garlic into."); return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } } diff --git a/Server/src/main/java/core/game/content/quest/members/fishingcontest/GateInteraction.java b/Server/src/main/java/core/game/content/quest/members/fishingcontest/GateInteraction.java index 08f706856..041d20b03 100644 --- a/Server/src/main/java/core/game/content/quest/members/fishingcontest/GateInteraction.java +++ b/Server/src/main/java/core/game/content/quest/members/fishingcontest/GateInteraction.java @@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest; import core.game.interaction.MovementPulse; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.player.Player; import core.game.world.map.Location; import core.plugin.Initializable; @@ -37,7 +38,7 @@ public class GateInteraction extends PluginInteraction { } return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } else { if(!player.getInventory().containsItem(FishingContest.FISHING_ROD)){ @@ -55,7 +56,7 @@ public class GateInteraction extends PluginInteraction { player.getDialogueInterpreter().sendDialogue("This gate is locked."); return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } return false; diff --git a/Server/src/main/java/core/game/content/quest/members/fishingcontest/StairInteraction.java b/Server/src/main/java/core/game/content/quest/members/fishingcontest/StairInteraction.java index 360238047..9adf450c1 100644 --- a/Server/src/main/java/core/game/content/quest/members/fishingcontest/StairInteraction.java +++ b/Server/src/main/java/core/game/content/quest/members/fishingcontest/StairInteraction.java @@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest; import core.game.interaction.MovementPulse; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; @@ -35,7 +36,7 @@ public class StairInteraction extends PluginInteraction { player.getDialogueInterpreter().open(npc_id,new NPC(npc_id)); return true; } - }, "movement"); + }, PulseType.STANDARD); } @Override diff --git a/Server/src/main/java/core/game/content/quest/members/fishingcontest/VineInteraction.java b/Server/src/main/java/core/game/content/quest/members/fishingcontest/VineInteraction.java index f64cddca9..b9eb4956c 100644 --- a/Server/src/main/java/core/game/content/quest/members/fishingcontest/VineInteraction.java +++ b/Server/src/main/java/core/game/content/quest/members/fishingcontest/VineInteraction.java @@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest; import core.game.interaction.MovementPulse; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; import core.game.world.update.flag.context.Animation; @@ -36,7 +37,7 @@ public class VineInteraction extends PluginInteraction { } return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } } diff --git a/Server/src/main/java/core/game/content/quest/members/sheepherder/GateInteractionHandler.java b/Server/src/main/java/core/game/content/quest/members/sheepherder/GateInteractionHandler.java index d9e718bbf..9a7012033 100644 --- a/Server/src/main/java/core/game/content/quest/members/sheepherder/GateInteractionHandler.java +++ b/Server/src/main/java/core/game/content/quest/members/sheepherder/GateInteractionHandler.java @@ -3,6 +3,7 @@ package core.game.content.quest.members.sheepherder; import core.game.interaction.DestinationFlag; import core.game.interaction.MovementPulse; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.player.Player; import rs09.game.system.SystemLogger; import core.plugin.Initializable; @@ -40,7 +41,7 @@ public class GateInteractionHandler extends PluginInteraction { player.getDialogueInterpreter().sendDialogues(SheepHerder.FARMER_BRUMTY, FacialExpression.SUSPICIOUS, "You can't enter without your protective gear!", "Can't have you spreading the plague!"); return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } return false; diff --git a/Server/src/main/java/core/game/content/quest/members/sheepherder/ProdActionHandler.java b/Server/src/main/java/core/game/content/quest/members/sheepherder/ProdActionHandler.java index 24e27750e..f152ba95b 100644 --- a/Server/src/main/java/core/game/content/quest/members/sheepherder/ProdActionHandler.java +++ b/Server/src/main/java/core/game/content/quest/members/sheepherder/ProdActionHandler.java @@ -4,6 +4,7 @@ import core.game.interaction.DestinationFlag; import core.game.interaction.MovementPulse; import core.game.interaction.Option; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import rs09.game.system.SystemLogger; @@ -30,7 +31,7 @@ public class ProdActionHandler extends PluginInteraction { handleProd(player,n); return true; } - }, "movement"); + }, PulseType.STANDARD); return true; } return false; diff --git a/Server/src/main/java/core/game/content/quest/members/witchshouse/BallInteraction.java b/Server/src/main/java/core/game/content/quest/members/witchshouse/BallInteraction.java index 337af2bd2..b96bc61e7 100644 --- a/Server/src/main/java/core/game/content/quest/members/witchshouse/BallInteraction.java +++ b/Server/src/main/java/core/game/content/quest/members/witchshouse/BallInteraction.java @@ -2,6 +2,7 @@ package core.game.content.quest.members.witchshouse; import core.game.interaction.MovementPulse; import core.game.interaction.Option; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.game.world.map.Location; @@ -35,7 +36,7 @@ public class BallInteraction extends PluginInteraction { public boolean pulse() { return true; } - }, "movement"); + }, PulseType.STANDARD); handleBall(player); } return handled; diff --git a/Server/src/main/java/core/game/interaction/Interaction.java b/Server/src/main/java/core/game/interaction/Interaction.java index b49b6f5f6..f7d210ea9 100644 --- a/Server/src/main/java/core/game/interaction/Interaction.java +++ b/Server/src/main/java/core/game/interaction/Interaction.java @@ -3,6 +3,7 @@ package core.game.interaction; import api.events.InteractionEvent; import core.game.container.Container; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.item.Item; @@ -70,18 +71,17 @@ public class Interaction { } player.debug("Received interaction request " + option.getName()); boolean hasHandler = option.getHandler() != null; - String pulseType = "interaction:" + option.getName() + ":" + node.hashCode(); boolean walk = hasHandler && option.getHandler().isWalk(); if (!walk && hasHandler && option.getHandler().isWalk(player, node)) { walk = true; } if (!hasHandler || walk) { - handleWalkOption(player, option, pulseType); + handleWalkOption(player, option, PulseType.STANDARD); } else if (hasHandler) { player.debug("Option handler being used=" + option.getHandler().getClass().getSimpleName()); - handleDefaultOption(player, option, pulseType); + handleDefaultOption(player, option, PulseType.STANDARD); } else { - player.getPulseManager().runUnhandledAction(player, pulseType); + player.getPulseManager().runUnhandledAction(player, PulseType.STANDARD); } player.dispatch(new InteractionEvent(node, option.getName().toLowerCase())); } catch (Exception e){ @@ -100,7 +100,7 @@ public class Interaction { if (player.getLocks().isInteractionLocked()) { return; } - player.getPulseManager().clear("interaction:" + option.getName() + ":" + node.hashCode()); + player.getPulseManager().clear(PulseType.STANDARD); GameWorld.getPulser().submit(new Pulse(1, player) { @Override public boolean pulse() { @@ -154,9 +154,9 @@ public class Interaction { } return true; } - }, "interaction:invalid:" + node.hashCode()); + }, PulseType.STANDARD); } else { - player.getPulseManager().runUnhandledAction(player, "interaction:invalid:" + node.hashCode()); + player.getPulseManager().runUnhandledAction(player, PulseType.STANDARD); } } @@ -166,7 +166,7 @@ public class Interaction { * @param option The option. * @param pulseType The pulse type. */ - private void handleWalkOption(final Player player, final Option option, String pulseType) { + private void handleWalkOption(final Player player, final Option option, PulseType pulseType) { if (node.getLocation() == null) { player.getPulseManager().runUnhandledAction(player, pulseType); return; @@ -201,7 +201,7 @@ public class Interaction { * @param option The option. * @param pulseType The pulse type. */ - private void handleDefaultOption(final Player player, final Option option, String pulseType) { + private void handleDefaultOption(final Player player, final Option option, PulseType pulseType) { if (!option.getHandler().isDelayed(player)) { if (player.getZoneMonitor().interact(node, option)) { return; diff --git a/Server/src/main/java/core/game/interaction/UseWithHandler.java b/Server/src/main/java/core/game/interaction/UseWithHandler.java index 01161eddf..66a2a11d0 100644 --- a/Server/src/main/java/core/game/interaction/UseWithHandler.java +++ b/Server/src/main/java/core/game/interaction/UseWithHandler.java @@ -3,6 +3,7 @@ package core.game.interaction; import api.events.UseWithEvent; import core.cache.def.impl.SceneryDefinition; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.item.Item; @@ -126,7 +127,7 @@ public abstract class UseWithHandler implements Plugin { } if (handler == null) { if (n instanceof Item && !(event.getUsed() instanceof Player)) { - event.getPlayer().getPulseManager().runUnhandledAction(event.getPlayer()); + event.getPlayer().getPulseManager().runUnhandledAction(event.getPlayer(), PulseType.STANDARD); } else { event.getPlayer().getPulseManager().run(new MovementPulse(event.getPlayer(), event.getUsedWith()) { @Override @@ -135,7 +136,7 @@ public abstract class UseWithHandler implements Plugin { event.getPlayer().getPacketDispatch().sendMessage("Nothing interesting happens."); return true; } - }, "movement"); + }, PulseType.STANDARD); } return; } @@ -164,7 +165,7 @@ public abstract class UseWithHandler implements Plugin { } return true; } - }); + }, PulseType.STANDARD); return; } event.getPlayer().getPulseManager().run(new MovementPulse(event.getPlayer(), event.getUsedWith(), handler.get(0)) { @@ -188,7 +189,7 @@ public abstract class UseWithHandler implements Plugin { } return true; } - }, "movement"); + }, PulseType.STANDARD); } catch (Exception e){ e.printStackTrace(); } diff --git a/Server/src/main/java/core/game/interaction/city/PortSarimPlugin.java b/Server/src/main/java/core/game/interaction/city/PortSarimPlugin.java index 4bf051ea8..a25a1a136 100644 --- a/Server/src/main/java/core/game/interaction/city/PortSarimPlugin.java +++ b/Server/src/main/java/core/game/interaction/city/PortSarimPlugin.java @@ -75,7 +75,6 @@ public final class PortSarimPlugin extends OptionHandler { if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) != 20) { player.getPacketDispatch().sendMessage("The goblin is already in prison. You have no reason to attack him."); } else { - player.getPulseManager().clear("interaction:attack:" + node.hashCode()); player.getProperties().getCombatPulse().attack(node); } break; diff --git a/Server/src/main/java/core/game/interaction/npc/CanafisWereWolfPlugin.java b/Server/src/main/java/core/game/interaction/npc/CanafisWereWolfPlugin.java index d0388a626..825218d2a 100644 --- a/Server/src/main/java/core/game/interaction/npc/CanafisWereWolfPlugin.java +++ b/Server/src/main/java/core/game/interaction/npc/CanafisWereWolfPlugin.java @@ -58,7 +58,6 @@ public final class CanafisWereWolfPlugin extends OptionHandler { } }); } else { - player.getPulseManager().clear("interaction:attack:" + node.hashCode()); player.getProperties().getCombatPulse().attack(node); } return true; diff --git a/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java b/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java index 4160b8c32..a0803aa69 100644 --- a/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java +++ b/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java @@ -5,6 +5,7 @@ import core.game.component.Component; import core.game.interaction.MovementPulse; import core.game.interaction.OptionHandler; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; import core.plugin.Initializable; @@ -37,7 +38,7 @@ public final class WildernessDitchPlugin extends OptionHandler { handleDitch(player, node); return true; } - }, "movement"); + }, PulseType.STANDARD); } return true; } diff --git a/Server/src/main/java/core/game/interaction/player/FollowOptionPlugin.java b/Server/src/main/java/core/game/interaction/player/FollowOptionPlugin.java index bf8de8f96..bdc05261f 100644 --- a/Server/src/main/java/core/game/interaction/player/FollowOptionPlugin.java +++ b/Server/src/main/java/core/game/interaction/player/FollowOptionPlugin.java @@ -5,6 +5,7 @@ import core.game.interaction.MovementPulse; import core.game.interaction.Option; import core.game.interaction.OptionHandler; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.player.Player; import core.plugin.Initializable; import core.plugin.Plugin; @@ -38,7 +39,7 @@ public final class FollowOptionPlugin extends OptionHandler { super.stop(); mover.face(null); } - }, "movement"); + }, PulseType.STANDARD); return true; } } diff --git a/Server/src/main/java/core/game/node/entity/Entity.java b/Server/src/main/java/core/game/node/entity/Entity.java index c67459fd2..cc939e4f2 100644 --- a/Server/src/main/java/core/game/node/entity/Entity.java +++ b/Server/src/main/java/core/game/node/entity/Entity.java @@ -358,7 +358,6 @@ public abstract class Entity extends Node { * @param node the node. */ public void attack(final Node node) { - getPulseManager().clear("interaction:attack:" + node.hashCode()); getProperties().getCombatPulse().attack(node); } diff --git a/Server/src/main/java/core/game/node/entity/combat/DeathTask.java b/Server/src/main/java/core/game/node/entity/combat/DeathTask.java index b49c72c01..5050dc0ba 100644 --- a/Server/src/main/java/core/game/node/entity/combat/DeathTask.java +++ b/Server/src/main/java/core/game/node/entity/combat/DeathTask.java @@ -6,6 +6,7 @@ import core.game.container.ContainerType; import core.game.node.Node; import core.game.node.entity.Entity; import core.game.node.entity.impl.Animator; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.IronmanMode; @@ -152,13 +153,11 @@ public final class DeathTask extends NodeTask { @SuppressWarnings("deprecation") public static void startDeath(Entity entity, Entity killer) { if (!isDead(entity)) { - entity.getPulseManager().clear(); if (killer == null) { killer = entity; } Pulse pulse = SINGLETON.schedule(entity, killer); - pulse.start(); - entity.getPulseManager().set(pulse); + entity.getPulseManager().run(pulse, PulseType.STRONG); } } diff --git a/Server/src/main/java/core/game/node/entity/impl/PulseManager.java b/Server/src/main/java/core/game/node/entity/impl/PulseManager.java index f7cafd0cf..d3538aaf8 100644 --- a/Server/src/main/java/core/game/node/entity/impl/PulseManager.java +++ b/Server/src/main/java/core/game/node/entity/impl/PulseManager.java @@ -8,6 +8,9 @@ import core.game.system.task.Pulse; import rs09.game.node.entity.combat.CombatPulse; import rs09.game.world.GameWorld; +import java.util.ArrayList; +import java.util.HashMap; + /** * Represents an entity's pulse manager. * @author Emperor @@ -17,47 +20,61 @@ public final class PulseManager { /** * The movement pulse. */ - private Pulse current; + private final HashMap currentPulses = new HashMap<>(); + + public void run(Pulse pulse) { + run(pulse, PulseType.STANDARD); + } /** * Runs a pulse. * @param pulse The pulse. * @param pulseType The pulse type we're trying to run. */ - public void run(Pulse pulse, String... pulseType) { - run(pulse, false, pulseType); - } + public void run(Pulse pulse, PulseType pulseType) { + ArrayList toRemove = new ArrayList<>(currentPulses.size()); + currentPulses.forEach((key, value) -> { + if (value != null && !value.isRunning()) { + toRemove.add(key); + } + }); + for (PulseType t : toRemove) currentPulses.remove(t); + + if (currentPulses.get(PulseType.STRONG) != null) { + //strong pulses cannot be interrupted or ran alongside anything else. They are the ONLY pulse type when they are present. + return; + } - public void run(Pulse pulse, boolean fast, String... pulseType) { if (!clear(pulseType)) { return; } + + if (pulseType == PulseType.STRONG) { + clear(); + } + + currentPulses.put(pulseType, pulse); pulse.start(); if (pulse.isRunning()) { - if (fast) { - GameWorld.getPulser().submit(current = pulse); - } else { - GameWorld.getPulser().submit(current = pulse); - } + GameWorld.getPulser().submit(pulse); } } + public void clear() { + currentPulses.forEach((type, pulse) -> { + if (type != PulseType.STRONG && pulse != null) pulse.stop(); + }); + } + /** * Clears the pulses. */ - public boolean clear(String... pulseType) { - if (current != null && current.isRunning()) { - if (pulseType.length > 0) { - int length = pulseType.length; - for (int i = 0; i < length; i++) { - if (!current.removeFor(pulseType[i])) { - return false; - } - } - } else if (!current.removeFor("unspecified")) { - return false; - } - current.stop(); + public boolean clear(PulseType pulseType) { + Pulse pulse = currentPulses.get(pulseType); + + if (pulse != null) { + pulse.stop(); + currentPulses.remove(pulseType); } return true; } @@ -68,7 +85,7 @@ public final class PulseManager { * @return The pulse. * @param pulseType The pulse type. */ - public Pulse runUnhandledAction(final Player player, String... pulseType) { + public Pulse runUnhandledAction(final Player player, PulseType pulseType) { Pulse pulse = new Pulse(1, player) { @Override public boolean pulse() { @@ -85,13 +102,12 @@ public final class PulseManager { * @return {@code True} if so. */ public boolean isMovingPulse() { - if (current != null && !current.isRunning()) { + if (!hasPulseRunning()) { return false; } - if (current instanceof CombatPulse) { - return true; - } - return current instanceof MovementPulse; + + Pulse current = getCurrent(); + return current instanceof MovementPulse || current instanceof CombatPulse; } /** @@ -99,7 +115,7 @@ public final class PulseManager { * @return {@code True} if so. */ public boolean hasPulseRunning() { - return current != null && current.isRunning(); + return getCurrent() != null && getCurrent().isRunning(); } /** @@ -107,20 +123,10 @@ public final class PulseManager { * @param e The entity. */ public static void cancelDeathTask(Entity e) { - if (!DeathTask.isDead(e) || e.getPulseManager().current == null) { + if (!DeathTask.isDead(e) || e.getPulseManager().getCurrent() == null) { return; } - e.getPulseManager().current.stop(); - } - - /** - * Sets the current pulse. - * @deprecated This should only be used by death pulse, use - * {@link #run(Pulse, String...)} instead. - */ - @Deprecated - public void set(Pulse schedule) { - this.current = schedule; + e.getPulseManager().getCurrent().stop(); } /** @@ -128,6 +134,14 @@ public final class PulseManager { * @return The current. */ public Pulse getCurrent() { - return current; + PulseType[] types = PulseType.values(); + for (PulseType type : types) { + if (currentPulses.get(type) != null) { + return currentPulses.get(type); + } + } + return null; } -} \ No newline at end of file + +} + diff --git a/Server/src/main/java/core/game/node/entity/impl/PulseType.java b/Server/src/main/java/core/game/node/entity/impl/PulseType.java new file mode 100644 index 000000000..315069557 --- /dev/null +++ b/Server/src/main/java/core/game/node/entity/impl/PulseType.java @@ -0,0 +1,11 @@ +package core.game.node.entity.impl; + +//facilitating pseudo-entity-queues in a clean manner with minimal disruption to existing code. +//this is NOT perfect. +//bit shit, really. +public enum PulseType { + STANDARD, //standard pulse slot, should be interrupted/replaced by most things + STRONG, //enforces itself as the only that can run + CUSTOM_1, //custom slots for extra tasks that should run alongside standard tasks. + CUSTOM_2 +} diff --git a/Server/src/main/java/core/game/node/entity/npc/other/StrayDogNPC.java b/Server/src/main/java/core/game/node/entity/npc/other/StrayDogNPC.java index 1151d1cb9..931a577d8 100644 --- a/Server/src/main/java/core/game/node/entity/npc/other/StrayDogNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/other/StrayDogNPC.java @@ -5,6 +5,7 @@ import java.util.List; import core.game.interaction.DestinationFlag; import core.game.interaction.MovementPulse; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.AbstractNPC; import core.game.node.entity.player.Player; import core.game.world.map.Location; @@ -71,7 +72,7 @@ public class StrayDogNPC extends AbstractNPC { players = RegionManager.getLocalPlayers(this, 7); if (players.size() != 0) { target = players.get(RandomFunction.random(players.size())); - getPulseManager().run(getFollowPulse(target), "movement"); + getPulseManager().run(getFollowPulse(target), PulseType.STANDARD); delay = System.currentTimeMillis() + 150000; } } diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/AgilityHandler.java b/Server/src/main/java/core/game/node/entity/skill/agility/AgilityHandler.java index 6ddb5c655..16e56cace 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/AgilityHandler.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/AgilityHandler.java @@ -1,6 +1,8 @@ package core.game.node.entity.skill.agility; import static api.ContentAPIKt.*; + +import core.game.node.entity.impl.PulseType; import core.game.node.entity.player.link.TeleportManager; import core.game.node.entity.skill.Skills; import core.game.interaction.MovementPulse; @@ -267,7 +269,7 @@ public final class AgilityHandler { walk(player, courseIndex, start, end, animation, experience, message, infiniteRun); return true; } - }, "movement"); + }, PulseType.STANDARD); return; } player.getWalkingQueue().reset(); diff --git a/Server/src/main/java/core/game/node/entity/skill/agility/shortcuts/StileShortcut.java b/Server/src/main/java/core/game/node/entity/skill/agility/shortcuts/StileShortcut.java index 01b87715b..e973781c4 100644 --- a/Server/src/main/java/core/game/node/entity/skill/agility/shortcuts/StileShortcut.java +++ b/Server/src/main/java/core/game/node/entity/skill/agility/shortcuts/StileShortcut.java @@ -1,6 +1,7 @@ package core.game.node.entity.skill.agility.shortcuts; import core.game.content.activity.ActivityManager; +import core.game.node.entity.impl.PulseType; import core.plugin.Initializable; import core.game.node.entity.skill.agility.AgilityShortcut; import core.game.interaction.MovementPulse; @@ -39,7 +40,7 @@ public class StileShortcut extends AgilityShortcut { climb(player, object); return true; } - }, "movement"); + }, PulseType.STANDARD); } /** diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/npc/HouseServantDialogue.java b/Server/src/main/java/core/game/node/entity/skill/construction/npc/HouseServantDialogue.java index 6fa1874c0..fe29eb39d 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/npc/HouseServantDialogue.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/npc/HouseServantDialogue.java @@ -3,6 +3,7 @@ package core.game.node.entity.skill.construction.npc; import core.game.content.dialogue.DialoguePlugin; import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.construction.HouseManager; import core.game.node.entity.skill.construction.Servant; @@ -172,7 +173,7 @@ public class HouseServantDialogue extends DialoguePlugin { case 3: player("Stop following me."); if (servant.getPulseManager().isMovingPulse()) { - servant.getPulseManager().clear("movement"); + servant.getPulseManager().clear(PulseType.STANDARD); } stage = 100; break; @@ -562,6 +563,6 @@ public class HouseServantDialogue extends DialoguePlugin { public boolean pulse() { return false; } - }, "movement"); + }, PulseType.STANDARD); } } \ No newline at end of file diff --git a/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java b/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java index 439551dca..9ceb0fd09 100644 --- a/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java +++ b/Server/src/main/java/core/game/node/entity/skill/summoning/familiar/Familiar.java @@ -7,6 +7,7 @@ import core.game.node.entity.combat.BattleState; import core.game.node.entity.combat.CombatStyle; import core.game.node.entity.combat.equipment.WeaponInterface; import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.entity.skill.SkillBonus; @@ -517,7 +518,7 @@ public abstract class Familiar extends NPC implements Plugin { public boolean pulse() { return false; } - }, "movement"); + }, PulseType.STANDARD); face(owner); } diff --git a/Server/src/main/java/core/game/system/task/Pulse.java b/Server/src/main/java/core/game/system/task/Pulse.java index 827bca3aa..dc81708c3 100644 --- a/Server/src/main/java/core/game/system/task/Pulse.java +++ b/Server/src/main/java/core/game/system/task/Pulse.java @@ -12,7 +12,7 @@ public abstract class Pulse implements Runnable { /** * If the task is still running. */ - private boolean running = true; + public boolean running = true; /** * The amount of game-ticks to wait before execution. 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 551b8e0d5..19adc90fe 100644 --- a/Server/src/main/java/core/net/packet/in/InteractionPacket.java +++ b/Server/src/main/java/core/net/packet/in/InteractionPacket.java @@ -8,6 +8,7 @@ import core.game.interaction.MovementPulse; import core.game.interaction.Option; import core.game.interaction.SpecialGroundItems; import core.game.node.Node; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.node.item.GroundItem; @@ -243,7 +244,7 @@ public final class InteractionPacket implements IncomingPacket { player.getDialogueInterpreter().addAction((player1, buttonId) -> player1.teleport(new Location(3140, 4230, 2))); return true; } - }, "movement"); + }, PulseType.STANDARD); return; } if (objectId == 6898) { diff --git a/Server/src/main/java/core/net/packet/in/InterfaceUseOnPacket.java b/Server/src/main/java/core/net/packet/in/InterfaceUseOnPacket.java index 15197610f..0f3d00fb3 100644 --- a/Server/src/main/java/core/net/packet/in/InterfaceUseOnPacket.java +++ b/Server/src/main/java/core/net/packet/in/InterfaceUseOnPacket.java @@ -1,5 +1,6 @@ package core.net.packet.in; +import core.game.node.entity.impl.PulseType; import rs09.ServerConstants; import core.game.node.entity.skill.magic.MagicSpell; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; @@ -81,7 +82,7 @@ public class InterfaceUseOnPacket implements IncomingPacket { MagicSpell.castSpell(player, SpellBookManager.SpellBook.MODERN, spell, groundItem); return true; } - }, "movement"); + }, PulseType.STANDARD); } break; case 195: // Interface On Player diff --git a/Server/src/main/java/core/net/packet/in/WalkPacket.java b/Server/src/main/java/core/net/packet/in/WalkPacket.java index a934d4a36..9adf6d834 100644 --- a/Server/src/main/java/core/net/packet/in/WalkPacket.java +++ b/Server/src/main/java/core/net/packet/in/WalkPacket.java @@ -2,6 +2,7 @@ package core.net.packet.in; import core.game.interaction.MovementPulse; import core.game.node.entity.Entity; +import core.game.node.entity.impl.PulseType; import core.game.node.entity.player.Player; import rs09.game.ai.AIPlayer; import core.game.world.map.Location; @@ -60,7 +61,7 @@ public final class WalkPacket implements IncomingPacket { } return true; } - }, true, "movement"); + }, PulseType.STANDARD); if (opcode == 39) { buffer.get(); // The x-coordinate of where we clicked on the // minimap. diff --git a/Server/src/main/java/rs09/game/ai/AIPlayer.java b/Server/src/main/java/rs09/game/ai/AIPlayer.java index 4a64c5ec4..c6dc99243 100644 --- a/Server/src/main/java/rs09/game/ai/AIPlayer.java +++ b/Server/src/main/java/rs09/game/ai/AIPlayer.java @@ -1,5 +1,6 @@ package rs09.game.ai; +import core.game.node.entity.impl.PulseType; import rs09.ServerConstants; import core.game.container.impl.EquipmentContainer; import core.game.interaction.DestinationFlag; @@ -287,7 +288,7 @@ public class AIPlayer extends Player { face(e); return false; } - }, "movement"); + }, PulseType.STANDARD); } public void randomWalkAroundPoint(Location point, int radius) { diff --git a/Server/src/main/kotlin/api/ContentAPI.kt b/Server/src/main/kotlin/api/ContentAPI.kt index f5a31835a..274d64855 100644 --- a/Server/src/main/kotlin/api/ContentAPI.kt +++ b/Server/src/main/kotlin/api/ContentAPI.kt @@ -788,7 +788,11 @@ fun setAttribute(entity: Entity, attribute: String, value: T) { } fun removeAttribute(entity: Entity, attribute: String) { - entity.removeAttribute(attribute) + entity.removeAttribute(attribute.replace("/save:","")) +} + +fun removeAttributes(entity: Entity, vararg attributes: String) { + for (attribute in attributes) removeAttribute(entity, attribute) } /** diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/GreenDragonKiller.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/GreenDragonKiller.kt index 278120b0d..2ef9d710e 100644 --- a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/GreenDragonKiller.kt +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/GreenDragonKiller.kt @@ -277,7 +277,7 @@ class GreenDragonKiller(val style: CombatStyle, area: ZoneBorders? = null) : Scr override fun canSwing(entity: Entity, victim: Entity): InteractionType? { if(victim is Player || victim.name.contains("revenant", ignoreCase = true)) { script.state = State.RUNNING - script.bot.pulseManager.current.stop() + script.bot.pulseManager.clear() } return super.canSwing(entity, victim) } diff --git a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt index 01499c1fa..0ae6cf706 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt @@ -2,6 +2,7 @@ package rs09.game.content.ame import api.poofClear import core.game.interaction.MovementPulse +import core.game.node.entity.impl.PulseType import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player import core.game.node.item.Item @@ -36,7 +37,7 @@ abstract class RandomEventNPC(id: Int) : NPC(id) { open fun terminate() { finalized = true - pulseManager.clear("amemovement") + pulseManager.clear(PulseType.STANDARD) RandomEventManager.getInstance(player)?.event = null if (initialized) { poofClear(this) @@ -49,7 +50,7 @@ abstract class RandomEventNPC(id: Int) : NPC(id) { face(player) return false } - }), "amemovement") + }), PulseType.STANDARD) } override fun tick() { diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt index 98010fc66..2de88c610 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt @@ -2,6 +2,7 @@ package rs09.game.content.ame.events.certer import api.addItemOrDrop import core.game.component.Component +import core.game.node.entity.impl.PulseType import core.game.node.entity.player.link.emote.Emotes import rs09.game.content.ame.RandomEventManager import rs09.game.content.dialogue.DialogueFile @@ -47,7 +48,7 @@ class CerterDialogue(val initial: Boolean) : DialogueFile() { super.end() if (player!!.getAttribute("certer:reward", false)) { // Remove movement pulse to stop following player - npc!!.pulseManager.clear("amemovement") + npc!!.pulseManager.clear(PulseType.STANDARD) // Wave goodbye npc!!.animate(Emotes.WAVE.animation) // Terminate the event diff --git a/Server/src/main/kotlin/rs09/game/content/zone/phasmatys/bonegrinder/BoneGrinderListener.kt b/Server/src/main/kotlin/rs09/game/content/zone/phasmatys/bonegrinder/BoneGrinderListener.kt index 1bc75404b..f4e923838 100644 --- a/Server/src/main/kotlin/rs09/game/content/zone/phasmatys/bonegrinder/BoneGrinderListener.kt +++ b/Server/src/main/kotlin/rs09/game/content/zone/phasmatys/bonegrinder/BoneGrinderListener.kt @@ -3,6 +3,7 @@ package rs09.game.content.zone.phasmatys.bonegrinder import api.Container import api.* import core.game.content.global.Bones +import core.game.node.entity.impl.PulseType import core.game.node.entity.player.Player import core.game.node.item.Item import core.game.system.task.Pulse @@ -146,7 +147,7 @@ class BoneGrinderListener : InteractionListener { } }) } else { - Pulser.submit(fillPulse) + player.pulseManager.run(fillPulse, PulseType.CUSTOM_1) } return true } @@ -162,7 +163,7 @@ class BoneGrinderListener : InteractionListener { return true } - Pulser.submit(object : Pulse(){ + player.pulseManager.run(object : Pulse(){ var stage = 0 override fun pulse(): Boolean { when(stage++){ @@ -181,7 +182,7 @@ class BoneGrinderListener : InteractionListener { } return false } - }) + }, PulseType.CUSTOM_1) return true } @@ -199,14 +200,18 @@ class BoneGrinderListener : InteractionListener { return true } - fun handleEmpty(player: Player): Boolean{ - if(!getAttribute(player,BONE_BIN_KEY,false)){ - sendMessage(player,"You have no bonemeal to collect.") - return true - } + fun handleEmpty(player: Player): Boolean { + val inHopper = getAttribute(player, BONE_HOPPER_KEY, false) + val boneType = getAttribute(player, LOADED_BONE_KEY, -1) + val hasMeal = getAttribute(player, BONE_BIN_KEY, false) && boneType != -1 - if(getAttribute(player,BONE_HOPPER_KEY,false) && !getAttribute(player,BONE_BIN_KEY,false)){ - sendMessage(player,"You need to wind the wheel to grind the bones.") + if(!hasMeal){ + if (inHopper) + sendMessage(player,"You need to wind the wheel to grind the bones.") + else if (boneType == -1) + sendMessage(player, "You need to load some bones in the hopper first.") + else + sendMessage(player,"You have no bonemeal to collect.") return true } @@ -215,31 +220,29 @@ class BoneGrinderListener : InteractionListener { return true } - val bone = Bones.values()[getAttribute(player,LOADED_BONE_KEY,-1)] + val bone = Bones.values()[boneType] + removeAttributes(player, BONE_HOPPER_KEY, BONE_BIN_KEY, LOADED_BONE_KEY) + lock(player, SCOOP_ANIM.duration + 1) - Pulser.submit(object : Pulse(){ + player.pulseManager.run(object : Pulse(){ var stage = 0 override fun pulse(): Boolean { when(stage++){ 0 -> { face(player,Location(3658, 3525, 1)) - lock(player, SCOOP_ANIM.duration) animate(player,SCOOP_ANIM) } SCOOP_ANIM.duration -> { if(removeItem(player,Item(Items.EMPTY_POT_1931),Container.INVENTORY)){ addItem(player,bone.boneMeal.id) - setAttribute(player,BONE_BIN_KEY,false) - setAttribute(player,BONE_HOPPER_KEY,false) - setAttribute(player,LOADED_BONE_KEY,-1) } return true } } return false } - }) + }, PulseType.CUSTOM_1) return true } diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedJewelleryListener.kt b/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedJewelleryListener.kt index 8cea2ecb2..426710ef9 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedJewelleryListener.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedJewelleryListener.kt @@ -3,6 +3,7 @@ package rs09.game.interaction.item import api.openDialogue import api.sendMessage import core.game.node.Node +import core.game.node.entity.impl.PulseType import core.game.node.entity.player.Player import core.game.node.item.Item import rs09.game.content.dialogue.DialogueFile @@ -29,7 +30,7 @@ class EnchantedJewelleryListener : InteractionListener { } } private fun handle(player: Player, node: Node, isEquipped: Boolean) { - player.pulseManager.current.stop() + player.pulseManager.clear(PulseType.STANDARD) val item = node.asItem() val jewellery = EnchantedJewellery.idMap[item.id] if (jewellery != null) { diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatPulse.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatPulse.kt index 3ba26e7ab..58ccb9d39 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatPulse.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatPulse.kt @@ -29,7 +29,7 @@ class CombatPulse( /** * The entity. */ - private val entity: Entity?) : Pulse(1, entity, null) { + val entity: Entity?) : Pulse(1, entity, null) { /** * The victim. @@ -108,6 +108,11 @@ class CombatPulse( * The last attack recieved. */ var lastReceivedAttack = 0 + + init { + running = false + } + override fun pulse(): Boolean { if (victim == null || DeathTask.isDead(entity) || DeathTask.isDead(victim)) { return true @@ -179,7 +184,7 @@ class CombatPulse( } } if (!victim.pulseManager.isMovingPulse) { - victim.pulseManager.clear("combat") + victim.pulseManager.clear() } victim.setAttribute("combat-time", System.currentTimeMillis() + 10000) victim.setAttribute("combat-attacker", entity) @@ -291,7 +296,9 @@ class CombatPulse( } setVictim(victim) entity.onAttack(victim as Entity?) - entity.pulseManager.run(this) + + if (!isAttacking) + entity.pulseManager.run(this) } /**