diff --git a/data/events.xml b/data/events.xml index e544028c..93017663 100644 --- a/data/events.xml +++ b/data/events.xml @@ -90,4 +90,10 @@ org.apollo.game.event.handler.impl.ItemVerificationHandler + + org.apollo.game.event.impl.NpcActionEvent + + org.apollo.game.event.handler.impl.NpcActionVerificationHandler + + \ No newline at end of file diff --git a/src/org/apollo/game/event/handler/impl/NpcActionVerificationHandler.java b/src/org/apollo/game/event/handler/impl/NpcActionVerificationHandler.java new file mode 100644 index 00000000..f6a9972b --- /dev/null +++ b/src/org/apollo/game/event/handler/impl/NpcActionVerificationHandler.java @@ -0,0 +1,33 @@ +package org.apollo.game.event.handler.impl; + +import org.apollo.game.event.handler.EventHandler; +import org.apollo.game.event.handler.EventHandlerContext; +import org.apollo.game.event.impl.NpcActionEvent; +import org.apollo.game.model.Npc; +import org.apollo.game.model.Player; +import org.apollo.game.model.World; +import org.apollo.game.model.WorldConstants; + +/** + * An {@link EventHandler} that verifies {@link org.apollo.game.event.impl.NpcActionEvent} + * + * @author Stuart + */ +public class NpcActionVerificationHandler extends EventHandler { + + @Override + public void handle(EventHandlerContext ctx, Player player, NpcActionEvent event) { + if(event.getIndex() < 0 || event.getIndex() > WorldConstants.MAXIMUM_NPCS) { + ctx.breakHandlerChain(); + return; + } + + Npc npc = (Npc)World.getWorld().getNpcRepository().get(event.getIndex()); + + if(npc == null || !player.getPosition().isWithinDistance(npc.getPosition(), 15)) { + ctx.breakHandlerChain(); + return; + } + } + +} \ No newline at end of file diff --git a/src/org/apollo/game/event/impl/NpcActionEvent.java b/src/org/apollo/game/event/impl/NpcActionEvent.java index 5196139c..7cc247fc 100644 --- a/src/org/apollo/game/event/impl/NpcActionEvent.java +++ b/src/org/apollo/game/event/impl/NpcActionEvent.java @@ -29,7 +29,7 @@ public abstract class NpcActionEvent extends Event { */ public NpcActionEvent(int option, int index) { this.option = option; - this.index = index; + this.index = index - 1; } /** diff --git a/src/org/apollo/net/release/r317/FirstNpcActionEventDecoder.java b/src/org/apollo/net/release/r317/FirstNpcActionEventDecoder.java index b032e894..0eeda0c6 100644 --- a/src/org/apollo/net/release/r317/FirstNpcActionEventDecoder.java +++ b/src/org/apollo/net/release/r317/FirstNpcActionEventDecoder.java @@ -1,10 +1,7 @@ package org.apollo.net.release.r317; import org.apollo.game.event.impl.FirstNpcActionEvent; -import org.apollo.net.codec.game.DataTransformation; -import org.apollo.net.codec.game.DataType; -import org.apollo.net.codec.game.GamePacket; -import org.apollo.net.codec.game.GamePacketReader; +import org.apollo.net.codec.game.*; import org.apollo.net.release.EventDecoder; /** @@ -17,7 +14,7 @@ public final class FirstNpcActionEventDecoder extends EventDecoder implements Iterable { return false; } + /** + * Gets the mob at the given index + * + * @param index The index of the mob + * @return The mob instance + */ + public Mob get(int index) { + if (index < 0 || index >= mobs.length) { + throw new IndexOutOfBoundsException("Mob index is out of bounds."); + } + + return mobs[index]; + } + /** * Gets the size of this repository. *