From 785f72215fec1c212effe6bde03044f6effcaa13 Mon Sep 17 00:00:00 2001 From: Ceikry Date: Tue, 6 Sep 2022 23:37:08 +0000 Subject: [PATCH] Made the PulseManager capable of running multiple pulses simultaneously, in different slots (this makes it function a bit more like an entity queue, though not quite) Fixed the dupe in the ectofuntus by demoting the action pulses for grinding bones from world pulses to individual pulses, and correcting a bit of the logic Added function to remove multiple attributes at once to the ContentAPI --- .../bountyhunter/BountyLocateSpell.java | 3 +- .../clanwars/ClanWarsActivityPlugin.java | 1 - .../game/content/activity/duel/DuelArea.java | 1 - .../pestcontrol/monsters/PCRavagerNPC.java | 3 +- .../pestcontrol/monsters/PCSpinnerNPC.java | 3 +- .../pyramidplunder/PyramidPlunderNPC.java | 3 +- .../free/demonslayer/DemonSlayerPlugin.java | 1 - .../free/dragonslayer/DragonSlayerPlugin.java | 2 - .../fishingcontest/FenceInteraction.java | 3 +- .../FishingContestCutscene.java | 7 +- .../FishingSpotInteraction.java | 9 +- .../fishingcontest/GarlicPipeInteraction.java | 5 +- .../fishingcontest/GateInteraction.java | 5 +- .../fishingcontest/StairInteraction.java | 3 +- .../fishingcontest/VineInteraction.java | 3 +- .../sheepherder/GateInteractionHandler.java | 3 +- .../sheepherder/ProdActionHandler.java | 3 +- .../members/witchshouse/BallInteraction.java | 3 +- .../core/game/interaction/Interaction.java | 18 ++-- .../core/game/interaction/UseWithHandler.java | 9 +- .../interaction/city/PortSarimPlugin.java | 1 - .../npc/CanafisWereWolfPlugin.java | 1 - .../wildyditch/WildernessDitchPlugin.java | 3 +- .../player/FollowOptionPlugin.java | 3 +- .../java/core/game/node/entity/Entity.java | 1 - .../game/node/entity/combat/DeathTask.java | 5 +- .../game/node/entity/impl/PulseManager.java | 102 ++++++++++-------- .../core/game/node/entity/impl/PulseType.java | 11 ++ .../node/entity/npc/other/StrayDogNPC.java | 3 +- .../entity/skill/agility/AgilityHandler.java | 4 +- .../agility/shortcuts/StileShortcut.java | 3 +- .../npc/HouseServantDialogue.java | 5 +- .../skill/summoning/familiar/Familiar.java | 3 +- .../java/core/game/system/task/Pulse.java | 2 +- .../core/net/packet/in/InteractionPacket.java | 3 +- .../net/packet/in/InterfaceUseOnPacket.java | 3 +- .../java/core/net/packet/in/WalkPacket.java | 3 +- .../src/main/java/rs09/game/ai/AIPlayer.java | 3 +- Server/src/main/kotlin/api/ContentAPI.kt | 6 +- .../scriptrepository/GreenDragonKiller.kt | 2 +- .../rs09/game/content/ame/RandomEventNPC.kt | 5 +- .../ame/events/certer/CerterDialogue.kt | 3 +- .../bonegrinder/BoneGrinderListener.kt | 37 ++++--- .../item/EnchantedJewelleryListener.kt | 3 +- .../game/node/entity/combat/CombatPulse.kt | 13 ++- 45 files changed, 188 insertions(+), 128 deletions(-) create mode 100644 Server/src/main/java/core/game/node/entity/impl/PulseType.java 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) } /**