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
This commit is contained in:
Ceikry
2022-09-06 23:37:08 +00:00
committed by Ryan
parent 4ecdbbac7e
commit 785f72215f
45 changed files with 188 additions and 128 deletions
@@ -1,5 +1,6 @@
package core.game.content.activity.bountyhunter; 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.MagicSpell;
import core.game.node.entity.skill.magic.Runes; import core.game.node.entity.skill.magic.Runes;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
@@ -74,7 +75,7 @@ public final class BountyLocateSpell extends MagicSpell {
public boolean pulse() { public boolean pulse() {
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} }
Location destination = RegionManager.getTeleportLocation(entry.getTarget().getLocation(), 5); Location destination = RegionManager.getTeleportLocation(entry.getTarget().getLocation(), 5);
@@ -83,7 +83,6 @@ public final class ClanWarsActivityPlugin extends ActivityPlugin {
@Override @Override
public boolean handle(Player player, Node node, String option) { public boolean handle(Player player, Node node, String option) {
player.getPulseManager().clear("interaction:attack:" + node.hashCode());
player.getProperties().getCombatPulse().attack(node); player.getProperties().getCombatPulse().attack(node);
return true; return true;
} }
@@ -67,7 +67,6 @@ public class DuelArea extends MapZone {
@Override @Override
public boolean handle(Player player, Node node, String option) { public boolean handle(Player player, Node node, String option) {
player.getPulseManager().clear("interaction:attack:" + node.hashCode());
player.getProperties().getCombatPulse().attack(node); player.getProperties().getCombatPulse().attack(node);
return true; return true;
} }
@@ -4,6 +4,7 @@ import core.game.interaction.MovementPulse;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.Entity; import core.game.node.entity.Entity;
import core.game.node.entity.combat.BattleState; 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.AbstractNPC;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
@@ -155,7 +156,7 @@ public class PCRavagerNPC extends AbstractNPC {
public boolean pulse() { public boolean pulse() {
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
} }
/** /**
@@ -5,6 +5,7 @@ import core.game.node.entity.Entity;
import core.game.node.entity.combat.BattleState; import core.game.node.entity.combat.BattleState;
import core.game.node.entity.combat.ImpactHandler.HitsplatType; import core.game.node.entity.combat.ImpactHandler.HitsplatType;
import core.game.node.entity.impl.Animator.Priority; 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.AbstractNPC;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
@@ -72,7 +73,7 @@ public final class PCSpinnerNPC extends AbstractNPC {
public boolean pulse() { public boolean pulse() {
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
} }
} }
} }
@@ -3,6 +3,7 @@ package core.game.content.activity.pyramidplunder;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.node.entity.Entity; import core.game.node.entity.Entity;
import core.game.node.entity.combat.CombatStyle; 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.npc.AbstractNPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
@@ -150,7 +151,7 @@ public abstract class PyramidPlunderNPC extends AbstractNPC {
public boolean pulse() { public boolean pulse() {
return false; return false;
} }
}, "movement"); }, PulseType.STANDARD);
face(player); face(player);
} }
@@ -58,7 +58,6 @@ public final class DemonSlayerPlugin extends OptionHandler {
return true; return true;
} }
player.face(((NPC) node)); player.face(((NPC) node));
player.getPulseManager().clear("interaction:attack:" + node.hashCode());
player.getProperties().getCombatPulse().attack(node); player.getProperties().getCombatPulse().attack(node);
return true; return true;
case DRAIN_ID: case DRAIN_ID:
@@ -141,7 +141,6 @@ public final class DragonSlayerPlugin extends OptionHandler {
player.getPacketDispatch().sendMessage("You have already slain Elvarg the dragon."); player.getPacketDispatch().sendMessage("You have already slain Elvarg the dragon.");
return true; return true;
} }
player.getPulseManager().clear("interaction:attack:" + node.hashCode());
player.getProperties().getCombatPulse().attack(node); player.getProperties().getCombatPulse().attack(node);
player.face((Entity) node); player.face((Entity) node);
break; break;
@@ -230,7 +229,6 @@ public final class DragonSlayerPlugin extends OptionHandler {
break; break;
case 745: case 745:
if (option.equals("attack")) { if (option.equals("attack")) {
player.getPulseManager().clear("interaction:attack:" + node.hashCode());
player.getProperties().getCombatPulse().attack(node); player.getProperties().getCombatPulse().attack(node);
return true; return true;
} }
@@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.system.task.Pulse; import core.game.system.task.Pulse;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
@@ -29,7 +30,7 @@ public class FenceInteraction extends PluginInteraction {
GameWorld.getPulser().submit(new SqueezePulse(player)); GameWorld.getPulser().submit(new SqueezePulse(player));
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} }
@@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.node.entity.Entity; 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.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.system.task.Pulse; import core.game.system.task.Pulse;
@@ -140,7 +141,7 @@ public class FishingContestCutscene extends CutscenePlugin {
player.getWalkingQueue().setRunDisabled(true); player.getWalkingQueue().setRunDisabled(true);
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
break; break;
case 12: case 12:
stranger.sendChat("You're switching with me. Go."); 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."); player.getDialogueInterpreter().sendDialogue("Your spot is now by the pipes.");
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
break; break;
case 22: case 22:
stranger.getPulseManager().run(new MovementPulse(stranger, base.getLocation().transform(7, 43, 0)) { stranger.getPulseManager().run(new MovementPulse(stranger, base.getLocation().transform(7, 43, 0)) {
@@ -160,7 +161,7 @@ public class FishingContestCutscene extends CutscenePlugin {
public boolean pulse() { public boolean pulse() {
return true; return true;
} }
}, "movement"); },PulseType.STANDARD);
GameWorld.getPulser().submit(new FishingPulse()); GameWorld.getPulser().submit(new FishingPulse());
return true; return true;
} }
@@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.interaction.Option; import core.game.interaction.Option;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.world.map.Location; import core.game.world.map.Location;
@@ -24,7 +25,7 @@ public class FishingSpotInteraction extends PluginInteraction {
player.getDialogueInterpreter().sendDialogues(3677, FacialExpression.NEUTRAL, "I think you will find that is","my spot."); player.getDialogueInterpreter().sendDialogues(3677, FacialExpression.NEUTRAL, "I think you will find that is","my spot.");
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} else if (npc_loc.equals(2630, 3435, 0)){ } else if (npc_loc.equals(2630, 3435, 0)){
player.getPulseManager().run(new MovementPulse(player, npc.getLocation().transform(1, 0, 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!"); player.getDialogueInterpreter().sendDialogues(225, FacialExpression.NEUTRAL, "Hey, you need to pay to enter the", "competition first! Only 5gp entrance fee!");
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} else if (npc_loc.equals(Location.create(2632, 3427, 0))){ } else if (npc_loc.equals(Location.create(2632, 3427, 0))){
player.getPulseManager().run(new MovementPulse(player, npc.getLocation().transform(1, 0, 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."); player.getDialogueInterpreter().sendDialogues(228, FacialExpression.NEUTRAL, "I think you will find that is my spot.");
return true; return true;
} }
}, "movement"); },PulseType.STANDARD);
return true; return true;
} else if(npc_loc.equals(Location.create(2627,3415,0))) { } else if(npc_loc.equals(Location.create(2627,3415,0))) {
player.getPulseManager().run(new MovementPulse(player, npc.getLocation().transform(1, 0, 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."); player.getDialogueInterpreter().sendDialogues(228, FacialExpression.NEUTRAL, "I think you will find that is my spot.");
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} }
} }
@@ -3,6 +3,7 @@ package core.game.content.quest.members.fishingcontest;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.interaction.NodeUsageEvent; import core.game.interaction.NodeUsageEvent;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
import core.game.node.scenery.Scenery; import core.game.node.scenery.Scenery;
@@ -39,7 +40,7 @@ public class GarlicPipeInteraction extends PluginInteraction {
player.setAttribute("fishing_contest:garlic",true); player.setAttribute("fishing_contest:garlic",true);
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} }
} }
@@ -57,7 +58,7 @@ public class GarlicPipeInteraction extends PluginInteraction {
player.getDialogueInterpreter().sendDialogue("This is the pipe I stuffed that garlic into."); player.getDialogueInterpreter().sendDialogue("This is the pipe I stuffed that garlic into.");
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} }
} }
@@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.world.map.Location; import core.game.world.map.Location;
import core.plugin.Initializable; import core.plugin.Initializable;
@@ -37,7 +38,7 @@ public class GateInteraction extends PluginInteraction {
} }
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} else { } else {
if(!player.getInventory().containsItem(FishingContest.FISHING_ROD)){ if(!player.getInventory().containsItem(FishingContest.FISHING_ROD)){
@@ -55,7 +56,7 @@ public class GateInteraction extends PluginInteraction {
player.getDialogueInterpreter().sendDialogue("This gate is locked."); player.getDialogueInterpreter().sendDialogue("This gate is locked.");
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} }
return false; return false;
@@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.scenery.Scenery; import core.game.node.scenery.Scenery;
@@ -35,7 +36,7 @@ public class StairInteraction extends PluginInteraction {
player.getDialogueInterpreter().open(npc_id,new NPC(npc_id)); player.getDialogueInterpreter().open(npc_id,new NPC(npc_id));
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
} }
@Override @Override
@@ -2,6 +2,7 @@ package core.game.content.quest.members.fishingcontest;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.scenery.Scenery; import core.game.node.scenery.Scenery;
import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Animation;
@@ -36,7 +37,7 @@ public class VineInteraction extends PluginInteraction {
} }
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} }
} }
@@ -3,6 +3,7 @@ package core.game.content.quest.members.sheepherder;
import core.game.interaction.DestinationFlag; import core.game.interaction.DestinationFlag;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import rs09.game.system.SystemLogger; import rs09.game.system.SystemLogger;
import core.plugin.Initializable; 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!"); 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; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} }
return false; return false;
@@ -4,6 +4,7 @@ import core.game.interaction.DestinationFlag;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.interaction.Option; import core.game.interaction.Option;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import rs09.game.system.SystemLogger; import rs09.game.system.SystemLogger;
@@ -30,7 +31,7 @@ public class ProdActionHandler extends PluginInteraction {
handleProd(player,n); handleProd(player,n);
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} }
return false; return false;
@@ -2,6 +2,7 @@ package core.game.content.quest.members.witchshouse;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.interaction.Option; import core.game.interaction.Option;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
import core.game.world.map.Location; import core.game.world.map.Location;
@@ -35,7 +36,7 @@ public class BallInteraction extends PluginInteraction {
public boolean pulse() { public boolean pulse() {
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
handleBall(player); handleBall(player);
} }
return handled; return handled;
@@ -3,6 +3,7 @@ package core.game.interaction;
import api.events.InteractionEvent; import api.events.InteractionEvent;
import core.game.container.Container; import core.game.container.Container;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
@@ -70,18 +71,17 @@ public class Interaction {
} }
player.debug("Received interaction request " + option.getName()); player.debug("Received interaction request " + option.getName());
boolean hasHandler = option.getHandler() != null; boolean hasHandler = option.getHandler() != null;
String pulseType = "interaction:" + option.getName() + ":" + node.hashCode();
boolean walk = hasHandler && option.getHandler().isWalk(); boolean walk = hasHandler && option.getHandler().isWalk();
if (!walk && hasHandler && option.getHandler().isWalk(player, node)) { if (!walk && hasHandler && option.getHandler().isWalk(player, node)) {
walk = true; walk = true;
} }
if (!hasHandler || walk) { if (!hasHandler || walk) {
handleWalkOption(player, option, pulseType); handleWalkOption(player, option, PulseType.STANDARD);
} else if (hasHandler) { } else if (hasHandler) {
player.debug("Option handler being used=" + option.getHandler().getClass().getSimpleName()); player.debug("Option handler being used=" + option.getHandler().getClass().getSimpleName());
handleDefaultOption(player, option, pulseType); handleDefaultOption(player, option, PulseType.STANDARD);
} else { } else {
player.getPulseManager().runUnhandledAction(player, pulseType); player.getPulseManager().runUnhandledAction(player, PulseType.STANDARD);
} }
player.dispatch(new InteractionEvent(node, option.getName().toLowerCase())); player.dispatch(new InteractionEvent(node, option.getName().toLowerCase()));
} catch (Exception e){ } catch (Exception e){
@@ -100,7 +100,7 @@ public class Interaction {
if (player.getLocks().isInteractionLocked()) { if (player.getLocks().isInteractionLocked()) {
return; return;
} }
player.getPulseManager().clear("interaction:" + option.getName() + ":" + node.hashCode()); player.getPulseManager().clear(PulseType.STANDARD);
GameWorld.getPulser().submit(new Pulse(1, player) { GameWorld.getPulser().submit(new Pulse(1, player) {
@Override @Override
public boolean pulse() { public boolean pulse() {
@@ -154,9 +154,9 @@ public class Interaction {
} }
return true; return true;
} }
}, "interaction:invalid:" + node.hashCode()); }, PulseType.STANDARD);
} else { } 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 option The option.
* @param pulseType The pulse type. * @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) { if (node.getLocation() == null) {
player.getPulseManager().runUnhandledAction(player, pulseType); player.getPulseManager().runUnhandledAction(player, pulseType);
return; return;
@@ -201,7 +201,7 @@ public class Interaction {
* @param option The option. * @param option The option.
* @param pulseType The pulse type. * @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 (!option.getHandler().isDelayed(player)) {
if (player.getZoneMonitor().interact(node, option)) { if (player.getZoneMonitor().interact(node, option)) {
return; return;
@@ -3,6 +3,7 @@ package core.game.interaction;
import api.events.UseWithEvent; import api.events.UseWithEvent;
import core.cache.def.impl.SceneryDefinition; import core.cache.def.impl.SceneryDefinition;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.item.Item; import core.game.node.item.Item;
@@ -126,7 +127,7 @@ public abstract class UseWithHandler implements Plugin<Object> {
} }
if (handler == null) { if (handler == null) {
if (n instanceof Item && !(event.getUsed() instanceof Player)) { if (n instanceof Item && !(event.getUsed() instanceof Player)) {
event.getPlayer().getPulseManager().runUnhandledAction(event.getPlayer()); event.getPlayer().getPulseManager().runUnhandledAction(event.getPlayer(), PulseType.STANDARD);
} else { } else {
event.getPlayer().getPulseManager().run(new MovementPulse(event.getPlayer(), event.getUsedWith()) { event.getPlayer().getPulseManager().run(new MovementPulse(event.getPlayer(), event.getUsedWith()) {
@Override @Override
@@ -135,7 +136,7 @@ public abstract class UseWithHandler implements Plugin<Object> {
event.getPlayer().getPacketDispatch().sendMessage("Nothing interesting happens."); event.getPlayer().getPacketDispatch().sendMessage("Nothing interesting happens.");
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
} }
return; return;
} }
@@ -164,7 +165,7 @@ public abstract class UseWithHandler implements Plugin<Object> {
} }
return true; return true;
} }
}); }, PulseType.STANDARD);
return; return;
} }
event.getPlayer().getPulseManager().run(new MovementPulse(event.getPlayer(), event.getUsedWith(), handler.get(0)) { event.getPlayer().getPulseManager().run(new MovementPulse(event.getPlayer(), event.getUsedWith(), handler.get(0)) {
@@ -188,7 +189,7 @@ public abstract class UseWithHandler implements Plugin<Object> {
} }
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
} catch (Exception e){ } catch (Exception e){
e.printStackTrace(); e.printStackTrace();
} }
@@ -75,7 +75,6 @@ public final class PortSarimPlugin extends OptionHandler {
if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) != 20) { 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."); player.getPacketDispatch().sendMessage("The goblin is already in prison. You have no reason to attack him.");
} else { } else {
player.getPulseManager().clear("interaction:attack:" + node.hashCode());
player.getProperties().getCombatPulse().attack(node); player.getProperties().getCombatPulse().attack(node);
} }
break; break;
@@ -58,7 +58,6 @@ public final class CanafisWereWolfPlugin extends OptionHandler {
} }
}); });
} else { } else {
player.getPulseManager().clear("interaction:attack:" + node.hashCode());
player.getProperties().getCombatPulse().attack(node); player.getProperties().getCombatPulse().attack(node);
} }
return true; return true;
@@ -5,6 +5,7 @@ import core.game.component.Component;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.interaction.OptionHandler; import core.game.interaction.OptionHandler;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.scenery.Scenery; import core.game.node.scenery.Scenery;
import core.plugin.Initializable; import core.plugin.Initializable;
@@ -37,7 +38,7 @@ public final class WildernessDitchPlugin extends OptionHandler {
handleDitch(player, node); handleDitch(player, node);
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
} }
return true; return true;
} }
@@ -5,6 +5,7 @@ import core.game.interaction.MovementPulse;
import core.game.interaction.Option; import core.game.interaction.Option;
import core.game.interaction.OptionHandler; import core.game.interaction.OptionHandler;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.plugin.Plugin; import core.plugin.Plugin;
@@ -38,7 +39,7 @@ public final class FollowOptionPlugin extends OptionHandler {
super.stop(); super.stop();
mover.face(null); mover.face(null);
} }
}, "movement"); }, PulseType.STANDARD);
return true; return true;
} }
} }
@@ -358,7 +358,6 @@ public abstract class Entity extends Node {
* @param node the node. * @param node the node.
*/ */
public void attack(final Node node) { public void attack(final Node node) {
getPulseManager().clear("interaction:attack:" + node.hashCode());
getProperties().getCombatPulse().attack(node); getProperties().getCombatPulse().attack(node);
} }
@@ -6,6 +6,7 @@ import core.game.container.ContainerType;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.Entity; import core.game.node.entity.Entity;
import core.game.node.entity.impl.Animator; 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.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.IronmanMode; import core.game.node.entity.player.link.IronmanMode;
@@ -152,13 +153,11 @@ public final class DeathTask extends NodeTask {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static void startDeath(Entity entity, Entity killer) { public static void startDeath(Entity entity, Entity killer) {
if (!isDead(entity)) { if (!isDead(entity)) {
entity.getPulseManager().clear();
if (killer == null) { if (killer == null) {
killer = entity; killer = entity;
} }
Pulse pulse = SINGLETON.schedule(entity, killer); Pulse pulse = SINGLETON.schedule(entity, killer);
pulse.start(); entity.getPulseManager().run(pulse, PulseType.STRONG);
entity.getPulseManager().set(pulse);
} }
} }
@@ -8,6 +8,9 @@ import core.game.system.task.Pulse;
import rs09.game.node.entity.combat.CombatPulse; import rs09.game.node.entity.combat.CombatPulse;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
import java.util.ArrayList;
import java.util.HashMap;
/** /**
* Represents an entity's pulse manager. * Represents an entity's pulse manager.
* @author Emperor * @author Emperor
@@ -17,47 +20,61 @@ public final class PulseManager {
/** /**
* The movement pulse. * The movement pulse.
*/ */
private Pulse current; private final HashMap<PulseType, Pulse> currentPulses = new HashMap<>();
public void run(Pulse pulse) {
run(pulse, PulseType.STANDARD);
}
/** /**
* Runs a pulse. * Runs a pulse.
* @param pulse The pulse. * @param pulse The pulse.
* @param pulseType The pulse type we're trying to run. * @param pulseType The pulse type we're trying to run.
*/ */
public void run(Pulse pulse, String... pulseType) { public void run(Pulse pulse, PulseType pulseType) {
run(pulse, false, pulseType); ArrayList<PulseType> 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)) { if (!clear(pulseType)) {
return; return;
} }
if (pulseType == PulseType.STRONG) {
clear();
}
currentPulses.put(pulseType, pulse);
pulse.start(); pulse.start();
if (pulse.isRunning()) { if (pulse.isRunning()) {
if (fast) { GameWorld.getPulser().submit(pulse);
GameWorld.getPulser().submit(current = pulse);
} else {
GameWorld.getPulser().submit(current = pulse);
} }
} }
public void clear() {
currentPulses.forEach((type, pulse) -> {
if (type != PulseType.STRONG && pulse != null) pulse.stop();
});
} }
/** /**
* Clears the pulses. * Clears the pulses.
*/ */
public boolean clear(String... pulseType) { public boolean clear(PulseType pulseType) {
if (current != null && current.isRunning()) { Pulse pulse = currentPulses.get(pulseType);
if (pulseType.length > 0) {
int length = pulseType.length; if (pulse != null) {
for (int i = 0; i < length; i++) { pulse.stop();
if (!current.removeFor(pulseType[i])) { currentPulses.remove(pulseType);
return false;
}
}
} else if (!current.removeFor("unspecified")) {
return false;
}
current.stop();
} }
return true; return true;
} }
@@ -68,7 +85,7 @@ public final class PulseManager {
* @return The pulse. * @return The pulse.
* @param pulseType The pulse type. * @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) { Pulse pulse = new Pulse(1, player) {
@Override @Override
public boolean pulse() { public boolean pulse() {
@@ -85,13 +102,12 @@ public final class PulseManager {
* @return {@code True} if so. * @return {@code True} if so.
*/ */
public boolean isMovingPulse() { public boolean isMovingPulse() {
if (current != null && !current.isRunning()) { if (!hasPulseRunning()) {
return false; return false;
} }
if (current instanceof CombatPulse) {
return true; Pulse current = getCurrent();
} return current instanceof MovementPulse || current instanceof CombatPulse;
return current instanceof MovementPulse;
} }
/** /**
@@ -99,7 +115,7 @@ public final class PulseManager {
* @return {@code True} if so. * @return {@code True} if so.
*/ */
public boolean hasPulseRunning() { 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. * @param e The entity.
*/ */
public static void cancelDeathTask(Entity e) { public static void cancelDeathTask(Entity e) {
if (!DeathTask.isDead(e) || e.getPulseManager().current == null) { if (!DeathTask.isDead(e) || e.getPulseManager().getCurrent() == null) {
return; return;
} }
e.getPulseManager().current.stop(); e.getPulseManager().getCurrent().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;
} }
/** /**
@@ -128,6 +134,14 @@ public final class PulseManager {
* @return The current. * @return The current.
*/ */
public Pulse getCurrent() { public Pulse getCurrent() {
return current; PulseType[] types = PulseType.values();
for (PulseType type : types) {
if (currentPulses.get(type) != null) {
return currentPulses.get(type);
} }
} }
return null;
}
}
@@ -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
}
@@ -5,6 +5,7 @@ import java.util.List;
import core.game.interaction.DestinationFlag; import core.game.interaction.DestinationFlag;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.npc.AbstractNPC; import core.game.node.entity.npc.AbstractNPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.world.map.Location; import core.game.world.map.Location;
@@ -71,7 +72,7 @@ public class StrayDogNPC extends AbstractNPC {
players = RegionManager.getLocalPlayers(this, 7); players = RegionManager.getLocalPlayers(this, 7);
if (players.size() != 0) { if (players.size() != 0) {
target = players.get(RandomFunction.random(players.size())); target = players.get(RandomFunction.random(players.size()));
getPulseManager().run(getFollowPulse(target), "movement"); getPulseManager().run(getFollowPulse(target), PulseType.STANDARD);
delay = System.currentTimeMillis() + 150000; delay = System.currentTimeMillis() + 150000;
} }
} }
@@ -1,6 +1,8 @@
package core.game.node.entity.skill.agility; package core.game.node.entity.skill.agility;
import static api.ContentAPIKt.*; import static api.ContentAPIKt.*;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.player.link.TeleportManager; import core.game.node.entity.player.link.TeleportManager;
import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.Skills;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
@@ -267,7 +269,7 @@ public final class AgilityHandler {
walk(player, courseIndex, start, end, animation, experience, message, infiniteRun); walk(player, courseIndex, start, end, animation, experience, message, infiniteRun);
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return; return;
} }
player.getWalkingQueue().reset(); player.getWalkingQueue().reset();
@@ -1,6 +1,7 @@
package core.game.node.entity.skill.agility.shortcuts; package core.game.node.entity.skill.agility.shortcuts;
import core.game.content.activity.ActivityManager; import core.game.content.activity.ActivityManager;
import core.game.node.entity.impl.PulseType;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.game.node.entity.skill.agility.AgilityShortcut; import core.game.node.entity.skill.agility.AgilityShortcut;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
@@ -39,7 +40,7 @@ public class StileShortcut extends AgilityShortcut {
climb(player, object); climb(player, object);
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
} }
/** /**
@@ -3,6 +3,7 @@ package core.game.node.entity.skill.construction.npc;
import core.game.content.dialogue.DialoguePlugin; import core.game.content.dialogue.DialoguePlugin;
import core.game.content.dialogue.FacialExpression; 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.Skills;
import core.game.node.entity.skill.construction.HouseManager; import core.game.node.entity.skill.construction.HouseManager;
import core.game.node.entity.skill.construction.Servant; import core.game.node.entity.skill.construction.Servant;
@@ -172,7 +173,7 @@ public class HouseServantDialogue extends DialoguePlugin {
case 3: case 3:
player("Stop following me."); player("Stop following me.");
if (servant.getPulseManager().isMovingPulse()) { if (servant.getPulseManager().isMovingPulse()) {
servant.getPulseManager().clear("movement"); servant.getPulseManager().clear(PulseType.STANDARD);
} }
stage = 100; stage = 100;
break; break;
@@ -562,6 +563,6 @@ public class HouseServantDialogue extends DialoguePlugin {
public boolean pulse() { public boolean pulse() {
return false; return false;
} }
}, "movement"); }, PulseType.STANDARD);
} }
} }
@@ -7,6 +7,7 @@ import core.game.node.entity.combat.BattleState;
import core.game.node.entity.combat.CombatStyle; import core.game.node.entity.combat.CombatStyle;
import core.game.node.entity.combat.equipment.WeaponInterface; import core.game.node.entity.combat.equipment.WeaponInterface;
import core.game.node.entity.impl.Projectile; 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.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.skill.SkillBonus; import core.game.node.entity.skill.SkillBonus;
@@ -517,7 +518,7 @@ public abstract class Familiar extends NPC implements Plugin<Object> {
public boolean pulse() { public boolean pulse() {
return false; return false;
} }
}, "movement"); }, PulseType.STANDARD);
face(owner); face(owner);
} }
@@ -12,7 +12,7 @@ public abstract class Pulse implements Runnable {
/** /**
* If the task is still running. * If the task is still running.
*/ */
private boolean running = true; public boolean running = true;
/** /**
* The amount of game-ticks to wait before execution. * The amount of game-ticks to wait before execution.
@@ -8,6 +8,7 @@ import core.game.interaction.MovementPulse;
import core.game.interaction.Option; import core.game.interaction.Option;
import core.game.interaction.SpecialGroundItems; import core.game.interaction.SpecialGroundItems;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.item.GroundItem; 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))); player.getDialogueInterpreter().addAction((player1, buttonId) -> player1.teleport(new Location(3140, 4230, 2)));
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
return; return;
} }
if (objectId == 6898) { if (objectId == 6898) {
@@ -1,5 +1,6 @@
package core.net.packet.in; package core.net.packet.in;
import core.game.node.entity.impl.PulseType;
import rs09.ServerConstants; import rs09.ServerConstants;
import core.game.node.entity.skill.magic.MagicSpell; import core.game.node.entity.skill.magic.MagicSpell;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; 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); MagicSpell.castSpell(player, SpellBookManager.SpellBook.MODERN, spell, groundItem);
return true; return true;
} }
}, "movement"); }, PulseType.STANDARD);
} }
break; break;
case 195: // Interface On Player case 195: // Interface On Player
@@ -2,6 +2,7 @@ package core.net.packet.in;
import core.game.interaction.MovementPulse; import core.game.interaction.MovementPulse;
import core.game.node.entity.Entity; import core.game.node.entity.Entity;
import core.game.node.entity.impl.PulseType;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import rs09.game.ai.AIPlayer; import rs09.game.ai.AIPlayer;
import core.game.world.map.Location; import core.game.world.map.Location;
@@ -60,7 +61,7 @@ public final class WalkPacket implements IncomingPacket {
} }
return true; return true;
} }
}, true, "movement"); }, PulseType.STANDARD);
if (opcode == 39) { if (opcode == 39) {
buffer.get(); // The x-coordinate of where we clicked on the buffer.get(); // The x-coordinate of where we clicked on the
// minimap. // minimap.
@@ -1,5 +1,6 @@
package rs09.game.ai; package rs09.game.ai;
import core.game.node.entity.impl.PulseType;
import rs09.ServerConstants; import rs09.ServerConstants;
import core.game.container.impl.EquipmentContainer; import core.game.container.impl.EquipmentContainer;
import core.game.interaction.DestinationFlag; import core.game.interaction.DestinationFlag;
@@ -287,7 +288,7 @@ public class AIPlayer extends Player {
face(e); face(e);
return false; return false;
} }
}, "movement"); }, PulseType.STANDARD);
} }
public void randomWalkAroundPoint(Location point, int radius) { public void randomWalkAroundPoint(Location point, int radius) {
+5 -1
View File
@@ -788,7 +788,11 @@ fun <T> setAttribute(entity: Entity, attribute: String, value: T) {
} }
fun removeAttribute(entity: Entity, attribute: String) { 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)
} }
/** /**
@@ -277,7 +277,7 @@ class GreenDragonKiller(val style: CombatStyle, area: ZoneBorders? = null) : Scr
override fun canSwing(entity: Entity, victim: Entity): InteractionType? { override fun canSwing(entity: Entity, victim: Entity): InteractionType? {
if(victim is Player || victim.name.contains("revenant", ignoreCase = true)) { if(victim is Player || victim.name.contains("revenant", ignoreCase = true)) {
script.state = State.RUNNING script.state = State.RUNNING
script.bot.pulseManager.current.stop() script.bot.pulseManager.clear()
} }
return super.canSwing(entity, victim) return super.canSwing(entity, victim)
} }
@@ -2,6 +2,7 @@ package rs09.game.content.ame
import api.poofClear import api.poofClear
import core.game.interaction.MovementPulse import core.game.interaction.MovementPulse
import core.game.node.entity.impl.PulseType
import core.game.node.entity.npc.NPC import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.node.item.Item import core.game.node.item.Item
@@ -36,7 +37,7 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
open fun terminate() { open fun terminate() {
finalized = true finalized = true
pulseManager.clear("amemovement") pulseManager.clear(PulseType.STANDARD)
RandomEventManager.getInstance(player)?.event = null RandomEventManager.getInstance(player)?.event = null
if (initialized) { if (initialized) {
poofClear(this) poofClear(this)
@@ -49,7 +50,7 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
face(player) face(player)
return false return false
} }
}), "amemovement") }), PulseType.STANDARD)
} }
override fun tick() { override fun tick() {
@@ -2,6 +2,7 @@ package rs09.game.content.ame.events.certer
import api.addItemOrDrop import api.addItemOrDrop
import core.game.component.Component import core.game.component.Component
import core.game.node.entity.impl.PulseType
import core.game.node.entity.player.link.emote.Emotes import core.game.node.entity.player.link.emote.Emotes
import rs09.game.content.ame.RandomEventManager import rs09.game.content.ame.RandomEventManager
import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.DialogueFile
@@ -47,7 +48,7 @@ class CerterDialogue(val initial: Boolean) : DialogueFile() {
super.end() super.end()
if (player!!.getAttribute("certer:reward", false)) { if (player!!.getAttribute("certer:reward", false)) {
// Remove movement pulse to stop following player // Remove movement pulse to stop following player
npc!!.pulseManager.clear("amemovement") npc!!.pulseManager.clear(PulseType.STANDARD)
// Wave goodbye // Wave goodbye
npc!!.animate(Emotes.WAVE.animation) npc!!.animate(Emotes.WAVE.animation)
// Terminate the event // Terminate the event
@@ -3,6 +3,7 @@ package rs09.game.content.zone.phasmatys.bonegrinder
import api.Container import api.Container
import api.* import api.*
import core.game.content.global.Bones import core.game.content.global.Bones
import core.game.node.entity.impl.PulseType
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.node.item.Item import core.game.node.item.Item
import core.game.system.task.Pulse import core.game.system.task.Pulse
@@ -146,7 +147,7 @@ class BoneGrinderListener : InteractionListener {
} }
}) })
} else { } else {
Pulser.submit(fillPulse) player.pulseManager.run(fillPulse, PulseType.CUSTOM_1)
} }
return true return true
} }
@@ -162,7 +163,7 @@ class BoneGrinderListener : InteractionListener {
return true return true
} }
Pulser.submit(object : Pulse(){ player.pulseManager.run(object : Pulse(){
var stage = 0 var stage = 0
override fun pulse(): Boolean { override fun pulse(): Boolean {
when(stage++){ when(stage++){
@@ -181,7 +182,7 @@ class BoneGrinderListener : InteractionListener {
} }
return false return false
} }
}) }, PulseType.CUSTOM_1)
return true return true
} }
@@ -200,13 +201,17 @@ class BoneGrinderListener : InteractionListener {
} }
fun handleEmpty(player: Player): Boolean { fun handleEmpty(player: Player): Boolean {
if(!getAttribute(player,BONE_BIN_KEY,false)){ val inHopper = getAttribute(player, BONE_HOPPER_KEY, false)
sendMessage(player,"You have no bonemeal to collect.") val boneType = getAttribute(player, LOADED_BONE_KEY, -1)
return true val hasMeal = getAttribute(player, BONE_BIN_KEY, false) && boneType != -1
}
if(getAttribute(player,BONE_HOPPER_KEY,false) && !getAttribute(player,BONE_BIN_KEY,false)){ if(!hasMeal){
if (inHopper)
sendMessage(player,"You need to wind the wheel to grind the bones.") 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 return true
} }
@@ -215,31 +220,29 @@ class BoneGrinderListener : InteractionListener {
return true 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 var stage = 0
override fun pulse(): Boolean { override fun pulse(): Boolean {
when(stage++){ when(stage++){
0 -> { 0 -> {
face(player,Location(3658, 3525, 1)) face(player,Location(3658, 3525, 1))
lock(player, SCOOP_ANIM.duration)
animate(player,SCOOP_ANIM) animate(player,SCOOP_ANIM)
} }
SCOOP_ANIM.duration -> { SCOOP_ANIM.duration -> {
if(removeItem(player,Item(Items.EMPTY_POT_1931),Container.INVENTORY)){ if(removeItem(player,Item(Items.EMPTY_POT_1931),Container.INVENTORY)){
addItem(player,bone.boneMeal.id) 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 true
} }
} }
return false return false
} }
}) }, PulseType.CUSTOM_1)
return true return true
} }
@@ -3,6 +3,7 @@ package rs09.game.interaction.item
import api.openDialogue import api.openDialogue
import api.sendMessage import api.sendMessage
import core.game.node.Node import core.game.node.Node
import core.game.node.entity.impl.PulseType
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.node.item.Item import core.game.node.item.Item
import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.DialogueFile
@@ -29,7 +30,7 @@ class EnchantedJewelleryListener : InteractionListener {
} }
} }
private fun handle(player: Player, node: Node, isEquipped: Boolean) { private fun handle(player: Player, node: Node, isEquipped: Boolean) {
player.pulseManager.current.stop() player.pulseManager.clear(PulseType.STANDARD)
val item = node.asItem() val item = node.asItem()
val jewellery = EnchantedJewellery.idMap[item.id] val jewellery = EnchantedJewellery.idMap[item.id]
if (jewellery != null) { if (jewellery != null) {
@@ -29,7 +29,7 @@ class CombatPulse(
/** /**
* The entity. * The entity.
*/ */
private val entity: Entity?) : Pulse(1, entity, null) { val entity: Entity?) : Pulse(1, entity, null) {
/** /**
* The victim. * The victim.
@@ -108,6 +108,11 @@ class CombatPulse(
* The last attack recieved. * The last attack recieved.
*/ */
var lastReceivedAttack = 0 var lastReceivedAttack = 0
init {
running = false
}
override fun pulse(): Boolean { override fun pulse(): Boolean {
if (victim == null || DeathTask.isDead(entity) || DeathTask.isDead(victim)) { if (victim == null || DeathTask.isDead(entity) || DeathTask.isDead(victim)) {
return true return true
@@ -179,7 +184,7 @@ class CombatPulse(
} }
} }
if (!victim.pulseManager.isMovingPulse) { if (!victim.pulseManager.isMovingPulse) {
victim.pulseManager.clear("combat") victim.pulseManager.clear()
} }
victim.setAttribute("combat-time", System.currentTimeMillis() + 10000) victim.setAttribute("combat-time", System.currentTimeMillis() + 10000)
victim.setAttribute("combat-attacker", entity) victim.setAttribute("combat-attacker", entity)
@@ -291,6 +296,8 @@ class CombatPulse(
} }
setVictim(victim) setVictim(victim)
entity.onAttack(victim as Entity?) entity.onAttack(victim as Entity?)
if (!isAttacking)
entity.pulseManager.run(this) entity.pulseManager.run(this)
} }