From a2a16d7b7f9aa81db7b63b47022e5a5377f11927 Mon Sep 17 00:00:00 2001 From: Major- Date: Sat, 9 Aug 2014 19:13:08 +0100 Subject: [PATCH] Improve existing verification handlers and add PlayerActionVerificationHandler. --- data/messages.xml | 6 +++ .../impl/NpcActionVerificationHandler.java | 13 ++++-- .../impl/ObjectActionVerificationHandler.java | 12 ++++-- .../impl/PlayerActionVerificationHandler.java | 40 +++++++++++++++++++ 4 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 src/org/apollo/game/message/handler/impl/PlayerActionVerificationHandler.java diff --git a/data/messages.xml b/data/messages.xml index ddf444dd..c80a0d30 100644 --- a/data/messages.xml +++ b/data/messages.xml @@ -96,6 +96,12 @@ org.apollo.game.message.handler.impl.NpcActionVerificationHandler + + org.apollo.game.message.impl.PlayerActionMessage + + org.apollo.game.message.handler.impl.PlayerActionVerificationHandler + + org.apollo.game.message.impl.ObjectActionMessage diff --git a/src/org/apollo/game/message/handler/impl/NpcActionVerificationHandler.java b/src/org/apollo/game/message/handler/impl/NpcActionVerificationHandler.java index 565befc1..3b5287fa 100644 --- a/src/org/apollo/game/message/handler/impl/NpcActionVerificationHandler.java +++ b/src/org/apollo/game/message/handler/impl/NpcActionVerificationHandler.java @@ -4,6 +4,7 @@ import org.apollo.game.message.handler.MessageHandler; import org.apollo.game.message.handler.MessageHandlerContext; import org.apollo.game.message.impl.NpcActionMessage; import org.apollo.game.model.World; +import org.apollo.game.model.def.NpcDefinition; import org.apollo.game.model.entity.Npc; import org.apollo.game.model.entity.Player; import org.apollo.util.MobRepository; @@ -16,9 +17,13 @@ import org.apollo.util.MobRepository; */ public final class NpcActionVerificationHandler extends MessageHandler { + /** + * The world's npc repository. + */ + private final MobRepository repository = World.getWorld().getNpcRepository(); + @Override public void handle(MessageHandlerContext ctx, Player player, NpcActionMessage message) { - MobRepository repository = World.getWorld().getNpcRepository(); int index = message.getIndex(); if (index < 0 || index >= repository.capacity()) { @@ -28,12 +33,14 @@ public final class NpcActionVerificationHandler extends MessageHandler= npc.getDefinition().getInteractions().length) { + NpcDefinition definition = npc.getDefinition(); + if (message.getOption() >= definition.getInteractions().length) { ctx.breakHandlerChain(); return; } diff --git a/src/org/apollo/game/message/handler/impl/ObjectActionVerificationHandler.java b/src/org/apollo/game/message/handler/impl/ObjectActionVerificationHandler.java index 7809efa2..38846a5b 100644 --- a/src/org/apollo/game/message/handler/impl/ObjectActionVerificationHandler.java +++ b/src/org/apollo/game/message/handler/impl/ObjectActionVerificationHandler.java @@ -8,6 +8,7 @@ import org.apollo.game.message.impl.ObjectActionMessage; import org.apollo.game.model.Position; import org.apollo.game.model.World; import org.apollo.game.model.area.Sector; +import org.apollo.game.model.area.SectorRepository; import org.apollo.game.model.def.ObjectDefinition; import org.apollo.game.model.entity.Entity.EntityType; import org.apollo.game.model.entity.GameObject; @@ -20,6 +21,11 @@ import org.apollo.game.model.entity.Player; */ public final class ObjectActionVerificationHandler extends MessageHandler { + /** + * The world's sector repository. + */ + private final SectorRepository repository = World.getWorld().getSectorRepository(); + @Override public void handle(MessageHandlerContext ctx, Player player, ObjectActionMessage message) { int id = message.getId(); @@ -29,7 +35,7 @@ public final class ObjectActionVerificationHandler extends MessageHandler objects = sector.getEntities(position, EntityType.GAME_OBJECT); if (!containsObject(id, objects)) { @@ -42,8 +48,8 @@ public final class ObjectActionVerificationHandler extends MessageHandler= ObjectDefinition.lookup(id).getMenuActions().length) { + ObjectDefinition definition = ObjectDefinition.lookup(id); + if (message.getOption() >= definition.getMenuActions().length) { ctx.breakHandlerChain(); return; } diff --git a/src/org/apollo/game/message/handler/impl/PlayerActionVerificationHandler.java b/src/org/apollo/game/message/handler/impl/PlayerActionVerificationHandler.java new file mode 100644 index 00000000..849614f8 --- /dev/null +++ b/src/org/apollo/game/message/handler/impl/PlayerActionVerificationHandler.java @@ -0,0 +1,40 @@ +package org.apollo.game.message.handler.impl; + +import org.apollo.game.message.handler.MessageHandler; +import org.apollo.game.message.handler.MessageHandlerContext; +import org.apollo.game.message.impl.PlayerActionMessage; +import org.apollo.game.model.World; +import org.apollo.game.model.entity.Player; +import org.apollo.util.MobRepository; + +/** + * A verification {@link MessageHandler} for the {@link PlayerActionMessage}. + * + * @author Major + */ +public final class PlayerActionVerificationHandler extends MessageHandler { + + /** + * The world's player repository. + */ + private final MobRepository repository = World.getWorld().getPlayerRepository(); + + @Override + public void handle(MessageHandlerContext ctx, Player player, PlayerActionMessage message) { + int index = message.getIndex(); + + if (index < 0 || index >= repository.capacity()) { + ctx.breakHandlerChain(); + return; + } + + Player other = repository.get(index); + if (other == null + || !player.getPosition().isWithinDistance(other.getPosition(), player.getViewingDistance() + 1)) { + // +1 in case it was decremented after the player clicked the action. + ctx.breakHandlerChain(); + return; + } + } + +} \ No newline at end of file