diff --git a/src/main/java/com/garbagemule/MobArena/commands/Commands.java b/src/main/java/com/garbagemule/MobArena/commands/Commands.java
index 46fc4f6..665d13b 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/Commands.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/Commands.java
@@ -1,7 +1,9 @@
package com.garbagemule.MobArena.commands;
import java.util.List;
+import java.util.UUID;
+import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -13,6 +15,24 @@ import com.garbagemule.MobArena.util.TextUtils;
public class Commands
{
+ /**
+ * Unwrap the given CommandSender reference, in case it is a proxy.
+ *
+ * Because plugins like CommandSigns use horrible proxy hacks to do what
+ * they need to do, a Player reference is not necessarily a real Player,
+ * and using that reference brings MobArena into an inconsistent state.
+ *
+ * The method returns the "real" Player reference by making a UUID lookup.
+ *
+ * @param sender a CommandSender reference, possibly a proxy, non-null
+ * @return the real Player reference, possibly the same as the argument
+ */
+ public static Player unwrap(CommandSender sender) {
+ Player proxy = (Player) sender;
+ UUID id = proxy.getUniqueId();
+ return Bukkit.getPlayer(id);
+ }
+
public static boolean isPlayer(CommandSender sender) {
return (sender instanceof Player);
}
diff --git a/src/main/java/com/garbagemule/MobArena/commands/setup/AddArenaCommand.java b/src/main/java/com/garbagemule/MobArena/commands/setup/AddArenaCommand.java
index 3e649b2..3af6b52 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/setup/AddArenaCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/setup/AddArenaCommand.java
@@ -27,8 +27,8 @@ public class AddArenaCommand implements Command
// Require an arena name
if (args.length != 1) return false;
- // Cast the sender.
- Player p = (Player) sender;
+ // Unwrap the sender.
+ Player p = Commands.unwrap(sender);
Arena arena = am.getArenaWithName(args[0]);
if (arena != null) {
diff --git a/src/main/java/com/garbagemule/MobArena/commands/setup/AutoGenerateCommand.java b/src/main/java/com/garbagemule/MobArena/commands/setup/AutoGenerateCommand.java
index f881af6..bc49e79 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/setup/AutoGenerateCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/setup/AutoGenerateCommand.java
@@ -27,8 +27,8 @@ public class AutoGenerateCommand implements Command
// Require an arena name
if (args.length != 1) return false;
- // Cast the sender.
- Player p = (Player) sender;
+ // Unwrap the sender.
+ Player p = Commands.unwrap(sender);
// Check if arena already exists.
Arena arena = am.getArenaWithName(args[0]);
diff --git a/src/main/java/com/garbagemule/MobArena/commands/setup/CheckSpawnsCommand.java b/src/main/java/com/garbagemule/MobArena/commands/setup/CheckSpawnsCommand.java
index e0638d6..4361a5e 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/setup/CheckSpawnsCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/setup/CheckSpawnsCommand.java
@@ -46,7 +46,7 @@ public class CheckSpawnsCommand implements Command
Messenger.tell(sender, "There are no spawnpoints in the selected arena.");
return true;
}
- Player p = (Player) sender;
+ Player p = Commands.unwrap(sender);
arena.getRegion().checkSpawns(p);
return true;
}
diff --git a/src/main/java/com/garbagemule/MobArena/commands/setup/ClassChestCommand.java b/src/main/java/com/garbagemule/MobArena/commands/setup/ClassChestCommand.java
index 6743690..d94b76a 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/setup/ClassChestCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/setup/ClassChestCommand.java
@@ -40,7 +40,7 @@ public class ClassChestCommand implements Command {
return true;
}
- Player p = (Player) sender;
+ Player p = Commands.unwrap(sender);
Block b = p.getTargetBlock((Set) null, 10);
switch (b.getType()) {
diff --git a/src/main/java/com/garbagemule/MobArena/commands/setup/SetClassCommand.java b/src/main/java/com/garbagemule/MobArena/commands/setup/SetClassCommand.java
index df2f439..604e824 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/setup/SetClassCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/setup/SetClassCommand.java
@@ -31,8 +31,8 @@ public class SetClassCommand implements Command
String arg1 = (args.length > 0 ? args[0] : "");
String arg2 = (args.length > 1 ? args[1] : "");
- // Cast the sender.
- Player p = (Player) sender;
+ // Unwrap the sender.
+ Player p = Commands.unwrap(sender);
// Check if we're overwriting.
boolean safe = arg1.equals("safe");
diff --git a/src/main/java/com/garbagemule/MobArena/commands/setup/SetupCommand.java b/src/main/java/com/garbagemule/MobArena/commands/setup/SetupCommand.java
index d87ac2d..e78b78e 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/setup/SetupCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/setup/SetupCommand.java
@@ -63,7 +63,7 @@ public class SetupCommand implements Command, Listener {
return true;
}
}
- Player player = (Player) sender;
+ Player player = Commands.unwrap(sender);
// Create the setup object
Setup setup = new Setup(player, arena);
diff --git a/src/main/java/com/garbagemule/MobArena/commands/user/ArenaListCommand.java b/src/main/java/com/garbagemule/MobArena/commands/user/ArenaListCommand.java
index 993bfa8..95caa50 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/user/ArenaListCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/user/ArenaListCommand.java
@@ -24,7 +24,7 @@ public class ArenaListCommand implements Command
List arenas;
if (Commands.isPlayer(sender)) {
- Player p = (Player) sender;
+ Player p = Commands.unwrap(sender);
arenas = am.getPermittedArenas(p);
} else {
arenas = am.getArenas();
diff --git a/src/main/java/com/garbagemule/MobArena/commands/user/JoinCommand.java b/src/main/java/com/garbagemule/MobArena/commands/user/JoinCommand.java
index f7b83a2..ddcd1bf 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/user/JoinCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/user/JoinCommand.java
@@ -24,8 +24,8 @@ public class JoinCommand implements Command
return true;
}
- // Cast the sender, grab the argument, if any.
- Player p = (Player) sender;
+ // Unwrap the sender, grab the argument, if any.
+ Player p = Commands.unwrap(sender);
String arg1 = (args.length > 0 ? args[0] : null);
// Run some rough sanity checks, and grab the arena to join.
diff --git a/src/main/java/com/garbagemule/MobArena/commands/user/LeaveCommand.java b/src/main/java/com/garbagemule/MobArena/commands/user/LeaveCommand.java
index c89673b..f34449d 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/user/LeaveCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/user/LeaveCommand.java
@@ -24,8 +24,8 @@ public class LeaveCommand implements Command
return true;
}
- // Cast the sender.
- Player p = (Player) sender;
+ // Unwrap the sender.
+ Player p = Commands.unwrap(sender);
Arena arena = am.getArenaWithPlayer(p);
if (arena == null) {
diff --git a/src/main/java/com/garbagemule/MobArena/commands/user/NotReadyCommand.java b/src/main/java/com/garbagemule/MobArena/commands/user/NotReadyCommand.java
index 9fa0e69..743e248 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/user/NotReadyCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/user/NotReadyCommand.java
@@ -32,7 +32,7 @@ public class NotReadyCommand implements Command
return false;
}
} else if (Commands.isPlayer(sender)) {
- Player p = (Player) sender;
+ Player p = Commands.unwrap(sender);
arena = am.getArenaWithPlayer(p);
if (arena == null) {
diff --git a/src/main/java/com/garbagemule/MobArena/commands/user/PickClassCommand.java b/src/main/java/com/garbagemule/MobArena/commands/user/PickClassCommand.java
index b794f14..54e5af1 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/user/PickClassCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/user/PickClassCommand.java
@@ -36,8 +36,8 @@ public class PickClassCommand implements Command
// Require a class name
if (args.length != 1) return false;
- // Cast the sender
- Player p = (Player) sender;
+ // Unwrap the sender
+ Player p = Commands.unwrap(sender);
// Make sure the player is in an arena
Arena arena = am.getArenaWithPlayer(p);
diff --git a/src/main/java/com/garbagemule/MobArena/commands/user/SpecCommand.java b/src/main/java/com/garbagemule/MobArena/commands/user/SpecCommand.java
index fabedd6..daf98c3 100644
--- a/src/main/java/com/garbagemule/MobArena/commands/user/SpecCommand.java
+++ b/src/main/java/com/garbagemule/MobArena/commands/user/SpecCommand.java
@@ -24,8 +24,8 @@ public class SpecCommand implements Command
return false;
}
- // Cast the sender, grab the argument, if any.
- Player p = (Player) sender;
+ // Unwrap the sender, grab the argument, if any.
+ Player p = Commands.unwrap(sender);
String arg1 = (args.length > 0 ? args[0] : null);
// Run some rough sanity checks, and grab the arena to spec.