diff --git a/game/data/messages.xml b/game/data/messages.xml index 910c4a15..f4a5bec2 100644 --- a/game/data/messages.xml +++ b/game/data/messages.xml @@ -71,6 +71,12 @@ org.apollo.game.message.handler.ItemVerificationHandler + + org.apollo.game.message.impl.MagicOnMobMessage + + org.apollo.game.message.handler.MagicOnMobVerificationHandler + + org.apollo.game.message.impl.NpcActionMessage diff --git a/game/src/main/java/org/apollo/game/message/handler/MagicOnMobVerificationHandler.java b/game/src/main/java/org/apollo/game/message/handler/MagicOnMobVerificationHandler.java new file mode 100644 index 00000000..7df2ba75 --- /dev/null +++ b/game/src/main/java/org/apollo/game/message/handler/MagicOnMobVerificationHandler.java @@ -0,0 +1,51 @@ +package org.apollo.game.message.handler; + +import org.apollo.game.message.impl.MagicOnMobMessage; +import org.apollo.game.model.World; +import org.apollo.game.model.entity.EntityType; +import org.apollo.game.model.entity.Mob; +import org.apollo.game.model.entity.MobRepository; +import org.apollo.game.model.entity.Player; + +/** + * A verification {@link MessageHandler} for the {@link MagicOnMobMessage}. + * + * @author Tom + */ +public final class MagicOnMobVerificationHandler extends MessageHandler{ + + /** + * Creates the MessageListener. + * + * @param world The {@link World} the {@link MagicOnMobMessage} occurred in. + */ + public MagicOnMobVerificationHandler(World world) { + super(world); + } + + @Override + public void handle(Player player, MagicOnMobMessage message) { + int index = message.getIndex(); + MobRepository repository; + + if (message.getType() == EntityType.NPC) { + repository = world.getNpcRepository(); + } else if (message.getType() == EntityType.PLAYER) { + repository = world.getPlayerRepository(); + } else { + throw new IllegalStateException("Invalid mob type for message: " + message.toString()); + } + + if (index < 0 || index >= repository.capacity()) { + message.terminate(); + return; + } + + Mob mob = repository.get(index); + + if (mob == null || !player.getPosition().isWithinDistance(mob.getPosition(), player.getViewingDistance() + 1)) { + // +1 in case it was decremented after the player clicked the action. + message.terminate(); + } + } +} diff --git a/game/src/main/java/org/apollo/game/message/impl/MagicOnMobMessage.java b/game/src/main/java/org/apollo/game/message/impl/MagicOnMobMessage.java index f408f9b3..fabdc16b 100644 --- a/game/src/main/java/org/apollo/game/message/impl/MagicOnMobMessage.java +++ b/game/src/main/java/org/apollo/game/message/impl/MagicOnMobMessage.java @@ -1,5 +1,6 @@ package org.apollo.game.message.impl; +import com.google.common.base.MoreObjects; import org.apollo.game.model.entity.EntityType; import org.apollo.net.message.Message; @@ -65,4 +66,8 @@ public abstract class MagicOnMobMessage extends Message { return spellId; } + @Override + public String toString() { + return MoreObjects.toStringHelper(this).add("type", getType()).add("index", getIndex()).add("spellId", getSpellId()).toString(); + } } \ No newline at end of file