diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java index 08d4e1342..9d4c252b7 100644 --- a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java +++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java @@ -19,17 +19,29 @@ package com.sk89q.worldedit.bukkit; -import com.sk89q.worldedit.*; -import com.sk89q.worldedit.extent.inventory.BlockBag; -import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.LocalWorld; +import com.sk89q.worldedit.PlayerNeededException; +import com.sk89q.worldedit.WorldEditPermissionException; +import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.internal.cui.CUIEvent; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -public class BukkitCommandSender extends LocalPlayer { +import java.io.File; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +class BukkitCommandSender implements Actor { + private CommandSender sender; private WorldEditPlugin plugin; - public BukkitCommandSender(WorldEditPlugin plugin, CommandSender sender) { + BukkitCommandSender(WorldEditPlugin plugin, CommandSender sender) { + checkNotNull(plugin); + checkNotNull(sender); + checkArgument(!(sender instanceof Player), "Cannot wrap a player"); + this.plugin = plugin; this.sender = sender; } @@ -67,6 +79,11 @@ public class BukkitCommandSender extends LocalPlayer { } } + @Override + public boolean canDestroyBedrock() { + return true; + } + @Override public String[] getGroups() { return new String[0]; @@ -74,31 +91,30 @@ public class BukkitCommandSender extends LocalPlayer { @Override public boolean hasPermission(String perm) { - if (!plugin.getLocalConfiguration().noOpPermissions && sender.isOp()) { - return true; - } + return true; + } - return plugin.getPermissionsResolver().hasPermission(null, sender.getName(), perm); + @Override + public void checkPermission(String permission) throws WorldEditPermissionException { } @Override public boolean isPlayer() { - return sender instanceof Player; + return false; } @Override - public int getItemInHand() { - throw new PlayerNeededException(); + public File openFileOpenDialog(String[] extensions) { + return null; } @Override - public Location getLocation() { - throw new PlayerNeededException(); + public File openFileSaveDialog(String[] extensions) { + return null; } @Override - public WorldVector getPosition() { - throw new PlayerNeededException(); + public void dispatchCUIEvent(CUIEvent event) { } @Override @@ -106,28 +122,4 @@ public class BukkitCommandSender extends LocalPlayer { throw new PlayerNeededException(); } - @Override - public double getPitch() { - throw new PlayerNeededException(); - } - - @Override - public double getYaw() { - throw new PlayerNeededException(); - } - - @Override - public void giveItem(int type, int amt) { - throw new PlayerNeededException(); - } - - @Override - public void setPosition(Vector pos, float pitch, float yaw) { - throw new PlayerNeededException(); - } - - @Override - public BlockBag getInventoryBlockBag() { - throw new PlayerNeededException(); - } } diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index e63c1ad80..b66ee0e94 100644 --- a/src/bukkit/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -26,7 +26,9 @@ import com.sk89q.worldedit.bukkit.selections.CuboidSelection; import com.sk89q.worldedit.bukkit.selections.CylinderSelection; import com.sk89q.worldedit.bukkit.selections.Polygonal2DSelection; import com.sk89q.worldedit.bukkit.selections.Selection; +import com.sk89q.worldedit.event.platform.CommandEvent; import com.sk89q.worldedit.event.platform.PlatformReadyEvent; +import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.regions.*; import org.bukkit.World; @@ -214,20 +216,16 @@ public class WorldEditPlugin extends JavaPlugin { } } - /** - * Called on WorldEdit command. - */ @Override - public boolean onCommand(CommandSender sender, org.bukkit.command.Command cmd, - String commandLabel, String[] args) { - + public boolean onCommand(CommandSender sender, org.bukkit.command.Command cmd, String commandLabel, String[] args) { // Add the command to the array because the underlying command handling // code of WorldEdit expects it String[] split = new String[args.length + 1]; System.arraycopy(args, 0, split, 1, args.length); split[0] = "/" + cmd.getName(); - controller.handleCommand(wrapCommandSender(sender), split); + CommandEvent event = new CommandEvent(wrapCommandSender(sender), split); + getWorldEdit().getEventBus().post(event); return true; } @@ -334,7 +332,7 @@ public class WorldEditPlugin extends JavaPlugin { return new BukkitPlayer(this, this.server, player); } - public LocalPlayer wrapCommandSender(CommandSender sender) { + public Actor wrapCommandSender(CommandSender sender) { if (sender instanceof Player) { return wrapPlayer((Player) sender); } diff --git a/src/main/java/com/sk89q/worldedit/LocalSession.java b/src/main/java/com/sk89q/worldedit/LocalSession.java index 935980eb9..2efd2fe00 100644 --- a/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -395,8 +395,7 @@ public class LocalSession { * @return position * @throws IncompleteRegionException */ - public Vector getPlacementPosition(LocalPlayer player) - throws IncompleteRegionException { + public Vector getPlacementPosition(Player player) throws IncompleteRegionException { if (!placeAtPos1) { return player.getBlockIn(); } diff --git a/src/main/java/com/sk89q/worldedit/WorldEdit.java b/src/main/java/com/sk89q/worldedit/WorldEdit.java index 969bdf62d..e52184372 100644 --- a/src/main/java/com/sk89q/worldedit/WorldEdit.java +++ b/src/main/java/com/sk89q/worldedit/WorldEdit.java @@ -29,6 +29,7 @@ import com.sk89q.worldedit.event.platform.CommandEvent; import com.sk89q.worldedit.event.platform.InputType; import com.sk89q.worldedit.event.platform.PlayerInputEvent; import com.sk89q.worldedit.extension.input.ParserContext; +import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.extension.platform.PlatformManager; import com.sk89q.worldedit.extension.registry.BlockRegistry; @@ -626,7 +627,7 @@ public class WorldEdit { * @param player the player * @param editSession the edit session */ - public void flushBlockBag(LocalPlayer player, EditSession editSession) { + public void flushBlockBag(Actor actor, EditSession editSession) { BlockBag blockBag = editSession.getBlockBag(); if (blockBag != null) { @@ -635,7 +636,7 @@ public class WorldEdit { Map missingBlocks = editSession.popMissingBlocks(); - if (missingBlocks.size() > 0) { + if (!missingBlocks.isEmpty()) { StringBuilder str = new StringBuilder(); str.append("Missing these blocks: "); int size = missingBlocks.size(); @@ -657,7 +658,7 @@ public class WorldEdit { } } - player.printError(str.toString()); + actor.printError(str.toString()); } } diff --git a/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java b/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java index 16e20ab35..61cbe98b3 100644 --- a/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java +++ b/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java @@ -22,9 +22,9 @@ package com.sk89q.worldedit.command; import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandPermissions; -import com.sk89q.minecraft.util.commands.Console; import com.sk89q.worldedit.*; import com.sk89q.worldedit.blocks.ItemType; +import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.masks.Mask; /** @@ -151,9 +151,7 @@ public class GeneralCommands { min = 1, max = 1 ) - @Console - public void searchItem(CommandContext args, LocalSession session, LocalPlayer player, - EditSession editSession) throws WorldEditException { + public void searchItem(Actor actor, CommandContext args) throws WorldEditException { String query = args.getString(0).trim().toLowerCase(); boolean blocksOnly = args.hasFlag('b'); @@ -165,9 +163,9 @@ public class GeneralCommands { ItemType type = ItemType.fromID(id); if (type != null) { - player.print("#" + type.getID() + " (" + type.getName() + ")"); + actor.print("#" + type.getID() + " (" + type.getName() + ")"); } else { - player.printError("No item found by ID " + id); + actor.printError("No item found by ID " + id); } return; @@ -175,26 +173,26 @@ public class GeneralCommands { } if (query.length() <= 2) { - player.printError("Enter a longer search string (len > 2)."); + actor.printError("Enter a longer search string (len > 2)."); return; } if (!blocksOnly && !itemsOnly) { - player.print("Searching for: " + query); + actor.print("Searching for: " + query); } else if (blocksOnly && itemsOnly) { - player.printError("You cannot use both the 'b' and 'i' flags simultaneously."); + actor.printError("You cannot use both the 'b' and 'i' flags simultaneously."); return; } else if (blocksOnly) { - player.print("Searching for blocks: " + query); + actor.print("Searching for blocks: " + query); } else { - player.print("Searching for items: " + query); + actor.print("Searching for items: " + query); } int found = 0; for (ItemType type : ItemType.values()) { if (found >= 15) { - player.print("Too many results!"); + actor.print("Too many results!"); break; } @@ -208,7 +206,7 @@ public class GeneralCommands { for (String alias : type.getAliases()) { if (alias.contains(query)) { - player.print("#" + type.getID() + " (" + type.getName() + ")"); + actor.print("#" + type.getID() + " (" + type.getName() + ")"); ++found; break; } @@ -216,7 +214,7 @@ public class GeneralCommands { } if (found == 0) { - player.printError("No items found."); + actor.printError("No items found."); } } diff --git a/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java b/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java index 90afb104d..c45a8b7d5 100644 --- a/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java +++ b/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java @@ -21,6 +21,7 @@ package com.sk89q.worldedit.command; import com.sk89q.minecraft.util.commands.*; import com.sk89q.worldedit.*; +import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.schematic.SchematicFormat; import com.sk89q.worldedit.world.DataException; @@ -207,11 +208,9 @@ public class SchematicCommands { desc = "List available schematic formats", max = 0 ) - @Console @CommandPermissions("worldedit.schematic.formats") - public void formats(CommandContext args, LocalSession session, LocalPlayer player, - EditSession editSession) throws WorldEditException { - player.print("Available schematic formats (Name: Lookup names)"); + public void formats(Actor actor) throws WorldEditException { + actor.print("Available schematic formats (Name: Lookup names)"); StringBuilder builder; boolean first = true; for (SchematicFormat format : SchematicFormat.getFormats()) { @@ -225,7 +224,7 @@ public class SchematicCommands { first = false; } first = true; - player.print(builder.toString()); + actor.print(builder.toString()); } } @@ -238,10 +237,8 @@ public class SchematicCommands { " -d sorts by date, oldest first\n" + " -n sorts by date, newest first\n" ) - @Console @CommandPermissions("worldedit.schematic.list") - public void list(CommandContext args, LocalSession session, LocalPlayer player, - EditSession editSession) throws WorldEditException { + public void list(Actor actor, CommandContext args) throws WorldEditException { File dir = we.getWorkingDirectoryFile(we.getConfiguration().saveDir); File[] files = dir.listFiles(new FileFilter(){ @Override @@ -273,8 +270,8 @@ public class SchematicCommands { } }); - player.print("Available schematics (Filename (Format)):"); - player.print(listFiles("", files)); + actor.print("Available schematics (Filename (Format)):"); + actor.print(listFiles("", files)); } private String listFiles(String prefix, File[] files) { diff --git a/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java b/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java index 8e57def7c..de498d24b 100644 --- a/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java +++ b/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java @@ -23,6 +23,8 @@ import com.sk89q.minecraft.util.commands.*; import com.sk89q.worldedit.*; import com.sk89q.worldedit.LocalWorld.KillFlags; import com.sk89q.worldedit.blocks.BaseBlock; +import com.sk89q.worldedit.entity.Player; +import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.patterns.Pattern; import com.sk89q.worldedit.patterns.SingleBlockPattern; import com.sk89q.worldedit.regions.CuboidRegion; @@ -30,6 +32,7 @@ import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.command.CommandMapping; import com.sk89q.worldedit.util.command.Description; import com.sk89q.worldedit.util.command.Dispatcher; +import com.sk89q.worldedit.util.command.parametric.Optional; import com.sk89q.worldedit.world.World; import java.util.Comparator; @@ -367,9 +370,7 @@ public class UtilityCommands { ) @CommandPermissions("worldedit.butcher") @Logging(PLACEMENT) - @Console - public void butcher(CommandContext args, LocalSession session, LocalPlayer player, - EditSession editSession) throws WorldEditException { + public void butcher(Actor actor, @Optional Player player, @Optional LocalSession session, CommandContext args) throws WorldEditException { LocalConfiguration config = we.getConfiguration(); @@ -388,7 +389,7 @@ public class UtilityCommands { } } - FlagContainer flags = new FlagContainer(player); + FlagContainer flags = new FlagContainer(actor); flags.or(KillFlags.FRIENDLY , args.hasFlag('f')); // No permission check here. Flags will instead be filtered by the subsequent calls. flags.or(KillFlags.PETS , args.hasFlag('p'), "worldedit.butcher.pets"); flags.or(KillFlags.NPCS , args.hasFlag('n'), "worldedit.butcher.npcs"); @@ -400,7 +401,7 @@ public class UtilityCommands { // If you add flags here, please add them to com.sk89q.worldedit.commands.BrushCommands.butcherBrush() as well int killed; - if (player.isPlayer()) { + if (player != null) { killed = player.getWorld().killMobs(session.getPlacementPosition(player), radius, flags.flags); } else { killed = 0; @@ -410,16 +411,16 @@ public class UtilityCommands { } if (radius < 0) { - player.print("Killed " + killed + " mobs."); + actor.print("Killed " + killed + " mobs."); } else { - player.print("Killed " + killed + " mobs in a radius of " + radius + "."); + actor.print("Killed " + killed + " mobs in a radius of " + radius + "."); } } public static class FlagContainer { - private final LocalPlayer player; + private final Actor player; public int flags = 0; - public FlagContainer(LocalPlayer player) { + public FlagContainer(Actor player) { this.player = player; } @@ -445,15 +446,13 @@ public class UtilityCommands { ) @CommandPermissions("worldedit.remove") @Logging(PLACEMENT) - @Console - public void remove(CommandContext args, LocalSession session, LocalPlayer player, - EditSession editSession) throws WorldEditException { + public void remove(Actor actor, @Optional Player player, @Optional LocalSession session, CommandContext args) throws WorldEditException { String typeStr = args.getString(0); int radius = args.getInteger(1); if (radius < -1) { - player.printError("Use -1 to remove all entities in loaded chunks"); + actor.printError("Use -1 to remove all entities in loaded chunks"); return; } @@ -483,12 +482,12 @@ public class UtilityCommands { } else if (typeStr.matches("xp")) { type = EntityType.XP_ORBS; } else { - player.printError("Acceptable types: projectiles, items, paintings, itemframes, boats, minecarts, tnt, xp, or all"); + actor.printError("Acceptable types: projectiles, items, paintings, itemframes, boats, minecarts, tnt, xp, or all"); return; } int removed = 0; - if (player.isPlayer()) { + if (player != null) { Vector origin = session.getPlacementPosition(player); removed = player.getWorld().removeEntities(type, origin, radius); } else { @@ -506,15 +505,12 @@ public class UtilityCommands { min = 0, max = -1 ) - @Console @CommandPermissions("worldedit.help") - public void help(CommandContext args, LocalSession session, LocalPlayer player, - EditSession editSession) throws WorldEditException { - - help(args, we, session, player, editSession); + public void help(Actor actor, CommandContext args) throws WorldEditException { + help(args, we, actor); } - public static void help(CommandContext args, WorldEdit we, LocalSession session, LocalPlayer player, EditSession editSession) { + public static void help(CommandContext args, WorldEdit we, Actor actor) { final Dispatcher dispatcher = we.getPlatformManager().getCommandManager().getDispatcher(); if (args.argsLength() == 0) { @@ -542,7 +538,7 @@ public class UtilityCommands { first = false; } - player.print(sb.toString()); + actor.print(sb.toString()); return; } @@ -551,22 +547,22 @@ public class UtilityCommands { CommandMapping mapping = dispatcher.get(command); if (mapping == null) { - player.printError("Unknown command '" + command + "'."); + actor.printError("Unknown command '" + command + "'."); return; } Description description = mapping.getDescription(); if (description.getUsage() != null) { - player.printDebug("Usage: " + description.getUsage()); + actor.printDebug("Usage: " + description.getUsage()); } if (description.getHelp() != null) { - player.print(description.getHelp()); + actor.print(description.getHelp()); } else if (description.getDescription() != null) { - player.print(description.getDescription()); + actor.print(description.getDescription()); } else { - player.print("No further help is available."); + actor.print("No further help is available."); } } } diff --git a/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java b/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java index 203d1c915..78d1af9df 100644 --- a/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java +++ b/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java @@ -22,8 +22,8 @@ package com.sk89q.worldedit.command; import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandPermissions; -import com.sk89q.minecraft.util.commands.Console; import com.sk89q.worldedit.*; +import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.extension.platform.PlatformManager; @@ -49,24 +49,21 @@ public class WorldEditCommands { min = 0, max = 0 ) - @Console - public void version(CommandContext args, LocalSession session, LocalPlayer player, - EditSession editSession) throws WorldEditException { - - player.print("WorldEdit version " + WorldEdit.getVersion()); - player.print("https://github.com/sk89q/worldedit/"); + public void version(Actor actor) throws WorldEditException { + actor.print("WorldEdit version " + WorldEdit.getVersion()); + actor.print("https://github.com/sk89q/worldedit/"); PlatformManager pm = we.getPlatformManager(); - player.printDebug("----------- Platforms -----------"); + actor.printDebug("----------- Platforms -----------"); for (Platform platform : pm.getPlatforms()) { - player.printDebug(String.format("* %s (%s)", platform.getPlatformName(), platform.getPlatformVersion())); + actor.printDebug(String.format("* %s (%s)", platform.getPlatformName(), platform.getPlatformVersion())); } - player.printDebug("----------- Capabilities -----------"); + actor.printDebug("----------- Capabilities -----------"); for (Capability capability : Capability.values()) { Platform platform = pm.queryCapability(capability); - player.printDebug(String.format("%s: %s", capability.name(), platform != null ? platform.getPlatformName() : "NONE")); + actor.printDebug(String.format("%s: %s", capability.name(), platform != null ? platform.getPlatformName() : "NONE")); } } @@ -78,12 +75,9 @@ public class WorldEditCommands { max = 0 ) @CommandPermissions("worldedit.reload") - @Console - public void reload(CommandContext args, LocalSession session, LocalPlayer player, - EditSession editSession) throws WorldEditException { - + public void reload(Actor actor) throws WorldEditException { we.getServer().reload(); - player.print("Configuration reloaded!"); + actor.print("Configuration reloaded!"); } @Command( @@ -106,7 +100,6 @@ public class WorldEditCommands { min = 1, max = 1 ) - @Console public void tz(CommandContext args, LocalSession session, LocalPlayer player, EditSession editSession) throws WorldEditException { TimeZone tz = TimeZone.getTimeZone(args.getString(0)); @@ -124,10 +117,7 @@ public class WorldEditCommands { max = -1 ) @CommandPermissions("worldedit.help") - @Console - public void help(CommandContext args, LocalSession session, LocalPlayer player, - EditSession editSession) throws WorldEditException { - - UtilityCommands.help(args, we, session, player, editSession); + public void help(Actor actor, CommandContext args) throws WorldEditException { + UtilityCommands.help(args, we, actor); } } diff --git a/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java b/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java index 0cba50b7e..a6b7ebdf1 100644 --- a/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java +++ b/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java @@ -19,8 +19,8 @@ package com.sk89q.worldedit.event.platform; -import com.sk89q.worldedit.LocalPlayer; import com.sk89q.worldedit.event.AbstractCancellable; +import com.sk89q.worldedit.extension.platform.Actor; import static com.google.common.base.Preconditions.checkNotNull; @@ -29,30 +29,30 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class CommandEvent extends AbstractCancellable { - private final LocalPlayer player; + private final Actor actor; private final String[] args; /** * Create a new instance. * - * @param player the player + * @param actor the player * @param args the arguments */ - public CommandEvent(LocalPlayer player, String[] args) { - checkNotNull(player); + public CommandEvent(Actor actor, String[] args) { + checkNotNull(actor); checkNotNull(args); - this.player = player; + this.actor = actor; this.args = args; } /** - * Get the player. + * Get the actor that issued the command. * - * @return the player + * @return the actor that issued the command */ - public LocalPlayer getPlayer() { - return player; + public Actor getActor() { + return actor; } /** diff --git a/src/main/java/com/sk89q/worldedit/extension/platform/CommandManager.java b/src/main/java/com/sk89q/worldedit/extension/platform/CommandManager.java index 318389579..51b54f9d5 100644 --- a/src/main/java/com/sk89q/worldedit/extension/platform/CommandManager.java +++ b/src/main/java/com/sk89q/worldedit/extension/platform/CommandManager.java @@ -192,7 +192,7 @@ public final class CommandManager { public void handleCommand(CommandEvent event) { Request.reset(); - Actor actor = event.getPlayer(); + Actor actor = event.getActor(); String split[] = commandDetection(event.getArguments()); // No command found! @@ -241,7 +241,7 @@ public final class CommandManager { } } - worldEdit.flushBlockBag(event.getPlayer(), editSession); + worldEdit.flushBlockBag(actor, editSession); } } diff --git a/src/main/java/com/sk89q/worldedit/util/WorldEditBinding.java b/src/main/java/com/sk89q/worldedit/util/WorldEditBinding.java index 835d88c8f..725b4b540 100644 --- a/src/main/java/com/sk89q/worldedit/util/WorldEditBinding.java +++ b/src/main/java/com/sk89q/worldedit/util/WorldEditBinding.java @@ -97,6 +97,24 @@ public class WorldEditBinding extends BindingHelper { return worldEdit.getSessionManager().get(sender); } + /** + * Gets an {@link Actor} from a {@link ArgumentStack}. + * + * @param context the context + * @return a local player + * @throws ParameterException on error + */ + @BindingMatch(type = Actor.class, + behavior = BindingBehavior.PROVIDES) + public Actor getActor(ArgumentStack context) throws ParameterException { + Actor sender = context.getContext().getLocals().get(Actor.class); + if (sender == null) { + throw new ParameterException("Missing 'Actor'"); + } else { + return sender; + } + } + /** * Gets an {@link Player} from a {@link ArgumentStack}. *