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 extends Mob> 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