From 39196c7b61276543c63f2d907a26c1979da7615b Mon Sep 17 00:00:00 2001 From: garbagemule Date: Fri, 17 Jul 2015 17:50:51 +0200 Subject: [PATCH] Unwrap potential Player proxies in commands. --- .../MobArena/commands/Commands.java | 20 +++++++++++++++++++ .../commands/setup/AddArenaCommand.java | 4 ++-- .../commands/setup/AutoGenerateCommand.java | 4 ++-- .../commands/setup/CheckSpawnsCommand.java | 2 +- .../commands/setup/ClassChestCommand.java | 2 +- .../commands/setup/SetClassCommand.java | 4 ++-- .../MobArena/commands/setup/SetupCommand.java | 2 +- .../commands/user/ArenaListCommand.java | 2 +- .../MobArena/commands/user/JoinCommand.java | 4 ++-- .../MobArena/commands/user/LeaveCommand.java | 4 ++-- .../commands/user/NotReadyCommand.java | 2 +- .../commands/user/PickClassCommand.java | 4 ++-- .../MobArena/commands/user/SpecCommand.java | 4 ++-- 13 files changed, 39 insertions(+), 19 deletions(-) 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.