diff --git a/src/de/diddiz/LogBlock/CommandsHandler.java b/src/de/diddiz/LogBlock/CommandsHandler.java index 166df56..2fa09e9 100644 --- a/src/de/diddiz/LogBlock/CommandsHandler.java +++ b/src/de/diddiz/LogBlock/CommandsHandler.java @@ -135,24 +135,26 @@ public class CommandsHandler implements CommandExecutor msg += ", Chat"; sender.sendMessage(ChatColor.GOLD + msg.substring(2)); } - } else if (command.equals("tool") || command.equals("t")) { + } else if (config.toolsByName.get(command) != null) { if (sender instanceof Player) { final Player player = (Player)sender; + final Session session = logblock.getSession(player.getName()); + final Tool tool = config.toolsByName.get(command); + final ToolData toolData = session.toolData.get(tool); if (args.length == 1) { - if (logblock.hasPermission(player, "logblock.tool")) { - giveTool(player, config.toolID); - logblock.getSession(player.getName()).toolEnabled = true; + if (logblock.hasPermission(player, "logblock.tools." + tool.name)) { + giveTool(player, tool.item); + session.toolData.get(tool).enabled = true; } else sender.sendMessage(ChatColor.RED + "You aren't allowed to do this."); } else if (args[1].equalsIgnoreCase("enable") || args[1].equalsIgnoreCase("on")) { - logblock.getSession(player.getName()).toolEnabled = true; + toolData.enabled = true; player.sendMessage(ChatColor.GREEN + "Tool enabled."); } else if (args[1].equalsIgnoreCase("disable") || args[1].equalsIgnoreCase("off")) { - logblock.getSession(player.getName()).toolEnabled = false; - player.getInventory().removeItem(new ItemStack(config.toolID, 1)); + toolData.enabled = false; + player.getInventory().removeItem(new ItemStack(tool.item, 1)); player.sendMessage(ChatColor.GREEN + "Tool disabled."); } else if (args[1].equalsIgnoreCase("mode")) { - final Session session = logblock.getSession(player.getName()); if (args.length == 3) { final ToolMode mode; try { @@ -162,22 +164,21 @@ public class CommandsHandler implements CommandExecutor return true; } if (logblock.hasPermission(player, mode.getPermission())) { - session.toolMode = mode; + toolData.mode = mode; sender.sendMessage(ChatColor.GREEN + "Tool mode set to " + args[2]); } else sender.sendMessage(ChatColor.RED + "You aren't allowed to use mode " + args[2]); } else player.sendMessage(ChatColor.RED + "No mode specified"); } else if (args[1].equalsIgnoreCase("default")) { - final Session session = logblock.getSession(player.getName()); - session.toolQuery = config.toolQuery.clone(); - session.toolMode = ToolMode.LOOKUP; + toolData.params = tool.params.clone(); + toolData.mode = tool.mode; sender.sendMessage(ChatColor.GREEN + "Tool set to default."); } else if (logblock.hasPermission(player, "logblock.lookup")) try { - final QueryParams params = config.toolQuery.clone(); + final QueryParams params = tool.params.clone(); params.parseArgs(sender, argsToList(args, 1)); - logblock.getSession(player.getName()).toolQuery = params; + toolData.params = params; sender.sendMessage(ChatColor.GREEN + "Set tool query to: " + params.getTitle()); } catch (final Exception ex) { sender.sendMessage(ChatColor.RED + ex.getMessage()); @@ -186,57 +187,6 @@ public class CommandsHandler implements CommandExecutor sender.sendMessage(ChatColor.RED + "You aren't allowed to do this."); } else sender.sendMessage(ChatColor.RED + "You have to be a player."); - } else if (command.equals("toolblock") || command.equals("tb")) { - if (sender instanceof Player) { - final Player player = (Player)sender; - if (args.length == 1) { - if (logblock.hasPermission(player, "logblock.toolblock")) { - giveTool(player, config.toolblockID); - logblock.getSession(player.getName()).toolBlockEnabled = true; - } else - player.sendMessage(ChatColor.RED + "You aren't allowed to do this."); - } else if (args[1].equalsIgnoreCase("enable") || args[1].equalsIgnoreCase("on")) { - logblock.getSession(player.getName()).toolBlockEnabled = true; - player.sendMessage(ChatColor.GREEN + "Tool block enabled."); - } else if (args[1].equalsIgnoreCase("disable") || args[1].equalsIgnoreCase("off")) { - logblock.getSession(player.getName()).toolBlockEnabled = false; - player.getInventory().removeItem(new ItemStack(config.toolblockID, 1)); - player.sendMessage(ChatColor.GREEN + "Tool block disabled."); - } else if (args[1].equalsIgnoreCase("mode")) { - final Session session = logblock.getSession(player.getName()); - if (args.length == 3) { - final ToolMode mode; - try { - mode = ToolMode.valueOf(args[2].toUpperCase()); - } catch (final IllegalArgumentException ex) { - sender.sendMessage(ChatColor.RED + "Can't find mode " + args[2]); - return true; - } - if (logblock.hasPermission(player, mode.getPermission())) { - session.toolBlockMode = mode; - sender.sendMessage(ChatColor.GREEN + "Toolblock mode set to " + args[2]); - } else - sender.sendMessage(ChatColor.RED + "You aren't allowed to use mode " + args[2]); - } else - player.sendMessage(ChatColor.RED + "No mode specified"); - } else if (args[1].equalsIgnoreCase("default")) { - final Session session = logblock.getSession(player.getName()); - session.toolBlockQuery = config.toolBlockQuery.clone(); - session.toolBlockMode = ToolMode.LOOKUP; - sender.sendMessage(ChatColor.GREEN + "Toolblock set to default."); - } else if (logblock.hasPermission(player, "logblock.lookup")) - try { - final QueryParams params = config.toolBlockQuery.clone(); - params.parseArgs(sender, argsToList(args, 1)); - logblock.getSession(player.getName()).toolBlockQuery = params; - sender.sendMessage(ChatColor.GREEN + "Set tool block query to: " + params.getTitle()); - } catch (final Exception ex) { - sender.sendMessage(ChatColor.RED + ex.getMessage()); - } - else - sender.sendMessage(ChatColor.RED + "You aren't allowed to do this."); - } else - sender.sendMessage(ChatColor.RED + "You have to be a player."); } else if (command.equals("hide")) { if (sender instanceof Player) { if (logblock.hasPermission(sender, "logblock.hide")) { diff --git a/src/de/diddiz/LogBlock/Config.java b/src/de/diddiz/LogBlock/Config.java index fa1ed85..1d7b1d8 100644 --- a/src/de/diddiz/LogBlock/Config.java +++ b/src/de/diddiz/LogBlock/Config.java @@ -30,10 +30,10 @@ public class Config public final LogKillsLevel logKillsLevel; public final Set dontRollback, replaceAnyway; public final int rollbackMaxTime, rollbackMaxArea; - public final QueryParams toolQuery, toolBlockQuery; + public final HashMap toolsByName; + public final HashMap toolsByType; public final int defaultDist, defaultTime; public final int linesPerPage, linesLimit; - public final int toolID, toolblockID; public final boolean askRollbacks, askRedos, askClearLogs, askClearLogAfterRollback, askRollbackAfterBan; public final String banPermission; public final Set hiddenPlayers, hiddenBlocks; @@ -43,7 +43,7 @@ public class Config } Config(LogBlock logblock) throws DataFormatException, IOException { - final Map def = new HashMap(); + final Map def = new HashMap(), tooldef = new HashMap(), tbdef = new HashMap(), tdef = new HashMap(); def.put("version", logblock.getDescription().getVersion()); def.put("loggedWorlds", Arrays.asList("world", "world_nether")); def.put("mysql.host", "localhost"); @@ -67,10 +67,6 @@ public class Config def.put("rollback.maxArea", 50); def.put("lookup.defaultDist", 20); def.put("lookup.defaultTime", "30 minutes"); - def.put("lookup.toolID", 270); - def.put("lookup.toolblockID", 7); - def.put("lookup.toolQuery", "area 0 all sum none limit 15 desc silent"); - def.put("lookup.toolBlockQuery", "area 0 all sum none limit 15 desc silent"); def.put("lookup.linesPerPage", 15); def.put("lookup.linesLimit", 1500); def.put("questioner.askRollbacks", true); @@ -79,6 +75,23 @@ public class Config def.put("questioner.askClearLogAfterRollback", true); def.put("questioner.askRollbackAfterBan", false); def.put("questioner.banPermission", "mcbans.ban.local"); + tdef.put("aliases", Arrays.asList("t")); + tdef.put("leftClickBehavior", "NONE"); + tdef.put("rightClickBehavior", "TOOL"); + tdef.put("defaultEnabled", true); + tdef.put("item", 270); + tdef.put("params", "area 0 all sum none limit 15 desc silent"); + tdef.put("mode", "LOOKUP"); + tbdef.put("aliases", Arrays.asList("tb")); + tbdef.put("leftClickBehavior", "TOOL"); + tbdef.put("rightClickBehavior", "BLOCK"); + tbdef.put("defaultEnabled", true); + tbdef.put("item", 7); + tbdef.put("params", "area 0 all sum none limit 15 desc silent"); + tbdef.put("mode", "LOOKUP"); + tooldef.put("tool", tdef); + tooldef.put("toolblock", tbdef); + def.put("tools", tooldef); final Configuration config = logblock.getConfiguration(); config.load(); for (final Entry e : def.entrySet()) @@ -118,28 +131,8 @@ public class Config replaceAnyway = new HashSet(config.getIntList("rollback.replaceAnyway", null)); rollbackMaxTime = parseTimeSpec(config.getString("rollback.maxTime").split(" ")); rollbackMaxArea = config.getInt("rollback.maxArea", 50); - try { - toolQuery = new QueryParams(logblock); - toolQuery.prepareToolQuery = true; - toolQuery.parseArgs(new ConsoleCommandSender(logblock.getServer()), Arrays.asList(config.getString("lookup.toolQuery").split(" "))); - } catch (final IllegalArgumentException ex) { - throw new DataFormatException("Error at lookup.toolQuery: " + ex.getMessage()); - } - try { - toolBlockQuery = new QueryParams(logblock); - toolBlockQuery.prepareToolQuery = true; - toolBlockQuery.parseArgs(new ConsoleCommandSender(logblock.getServer()), Arrays.asList(config.getString("lookup.toolBlockQuery").split(" "))); - } catch (final IllegalArgumentException ex) { - throw new DataFormatException("Error at lookup.toolBlockQuery: " + ex.getMessage()); - } defaultDist = config.getInt("lookup.defaultDist", 20); defaultTime = parseTimeSpec(config.getString("lookup.defaultTime").split(" ")); - toolID = config.getInt("lookup.toolID", 270); - if (Material.getMaterial(toolID) == null || Material.getMaterial(toolID).isBlock()) - throw new DataFormatException("lookup.toolID doesn't appear to be a valid item id"); - toolblockID = config.getInt("lookup.toolblockID", 7); - if (Material.getMaterial(toolblockID) == null || !Material.getMaterial(toolblockID).isBlock() || toolblockID == 0) - throw new DataFormatException("lookup.toolblockID doesn't appear to be a valid block id"); linesPerPage = config.getInt("lookup.linesPerPage", 15); linesLimit = config.getInt("lookup.linesLimit", 1500); askRollbacks = config.getBoolean("questioner.askRollbacks", true); @@ -148,6 +141,33 @@ public class Config askClearLogAfterRollback = config.getBoolean("questioner.askClearLogAfterRollback", true); askRollbackAfterBan = config.getBoolean("questioner.askRollbackAfterBan", false); banPermission = config.getString("questioner.banPermission"); + final List toolNames = config.getKeys("tools"); + System.out.println(toolNames.size()); + final List tools = new ArrayList(); + for (final String toolName : toolNames) + try { + final List aliases = config.getStringList("tools." + toolName + ".aliases", null); + final ToolBehavior leftClickBehavior = ToolBehavior.valueOf(config.getString("tools." + toolName + ".leftClickBehavior")); + final ToolBehavior rightClickBehavior = ToolBehavior.valueOf(config.getString("tools." + toolName + ".rightClickBehavior")); + final boolean defaultEnabled = config.getBoolean("tools." + toolName + ".defaultEnabled", false); + final int item = config.getInt("tools." + toolName + ".item", 0); + final QueryParams params = new QueryParams(logblock); + params.prepareToolQuery = true; + params.parseArgs(new ConsoleCommandSender(logblock.getServer()), Arrays.asList(config.getString("tools." + toolName + ".params").split(" "))); + final ToolMode mode = ToolMode.valueOf(config.getString("tools." + toolName + ".mode")); + tools.add(new Tool(toolName, aliases, leftClickBehavior, rightClickBehavior, defaultEnabled, item, params, mode)); + } catch (final Exception ex) { + ex.printStackTrace(); + throw new DataFormatException("Error at parsing tool '" + toolName + "': " + ex.getMessage()); + } + toolsByName = new HashMap(); + toolsByType = new HashMap(); + for (final Tool tool : tools) { + toolsByType.put(tool.item, tool); + toolsByName.put(tool.name, tool); + for (final String alias : tool.aliases) + toolsByName.put(alias, tool); + } final List worldNames = config.getStringList("loggedWorlds", null); worlds = new HashMap(); if (worldNames == null || worldNames.size() == 0) diff --git a/src/de/diddiz/LogBlock/LBToolListener.java b/src/de/diddiz/LogBlock/LBToolListener.java index 9985a01..3194ab0 100644 --- a/src/de/diddiz/LogBlock/LBToolListener.java +++ b/src/de/diddiz/LogBlock/LBToolListener.java @@ -16,16 +16,14 @@ class LBToolListener extends PlayerListener { private final CommandsHandler handler; private final LogBlock logblock; - private final int toolID; - private final int toolblockID; + private final Map toolsByType; private final Map worlds; LBToolListener(LogBlock logblock) { this.logblock = logblock; handler = logblock.getCommandsHandler(); - toolID = logblock.getConfig().toolID; - toolblockID = logblock.getConfig().toolblockID; worlds = logblock.getConfig().worlds; + toolsByType = logblock.getConfig().toolsByType; } @Override @@ -33,45 +31,43 @@ class LBToolListener extends PlayerListener if (!event.isCancelled() && event.getMaterial() != null) { final Action action = event.getAction(); final int type = event.getMaterial().getId(); - if (type == toolID && action == Action.RIGHT_CLICK_BLOCK || type == toolblockID && (action == Action.LEFT_CLICK_BLOCK || action == Action.RIGHT_CLICK_BLOCK)) { - final Player player = event.getPlayer(); - final Session session = logblock.getSession(player.getName()); - if (type == toolID && session.toolEnabled && logblock.hasPermission(player, "logblock.tool") || type == toolblockID && session.toolBlockEnabled && logblock.hasPermission(player, "logblock.toolblock")) - if (worlds.get(player.getWorld().getName().hashCode()) != null) { - final Block block = event.getClickedBlock(); - if (!(type == toolID && block.getTypeId() == 26)) - event.setCancelled(true); - final QueryParams params = type == toolID ? session.toolQuery : session.toolBlockQuery; - final ToolMode mode = type == toolID ? session.toolMode : session.toolBlockMode; - params.loc = null; - params.sel = null; - if (type == toolblockID && action == Action.RIGHT_CLICK_BLOCK) - params.setLocation(block.getRelative(event.getBlockFace()).getLocation()); - else if (block.getTypeId() != 54 || params.radius != 0) + final Tool tool = toolsByType.get(type); + final Player player = event.getPlayer(); + if (tool != null && (action == Action.RIGHT_CLICK_BLOCK || action == Action.LEFT_CLICK_BLOCK) && worlds.containsKey(player.getWorld().getName().hashCode()) && logblock.hasPermission(player, "logblock.tools." + tool.name)) { + final ToolBehavior behavior = action == Action.RIGHT_CLICK_BLOCK ? tool.rightClickBehavior : tool.leftClickBehavior; + final ToolData toolData = logblock.getSession(player.getName()).toolData.get(tool); + if (behavior != ToolBehavior.NONE && toolData.enabled) { + final Block block = event.getClickedBlock(); + final QueryParams params = toolData.params; + params.loc = null; + params.sel = null; + if (behavior == ToolBehavior.BLOCK) + params.setLocation(block.getRelative(event.getBlockFace()).getLocation()); + else if (block.getTypeId() != 54 || tool.params.radius != 0) + params.setLocation(block.getLocation()); + else { + for (final BlockFace face : new BlockFace[]{BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) + if (block.getRelative(face).getTypeId() == 54) + params.setSelection(new CuboidSelection(event.getPlayer().getWorld(), block.getLocation(), block.getRelative(face).getLocation())); + + if (params.sel == null) params.setLocation(block.getLocation()); - else { - for (final BlockFace face : new BlockFace[]{BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) - if (block.getRelative(face).getTypeId() == 54) - params.setSelection(new CuboidSelection(player.getWorld(), block.getLocation(), block.getRelative(face).getLocation())); - if (params.sel == null) - params.setLocation(block.getLocation()); - } - try { - if (mode == ToolMode.ROLLBACK) - handler.new CommandRollback(player, params, true); - else if (mode == ToolMode.REDO) - handler.new CommandRedo(player, params, true); - else if (mode == ToolMode.CLEARLOG) - handler.new CommandClearLog(player, params, true); - else if (mode == ToolMode.WRITELOGFILE) - handler.new CommandWriteLogFile(player, params, true); - else - handler.new CommandLookup(player, params, true); - } catch (final Exception ex) { - player.sendMessage(ChatColor.RED + ex.getMessage()); - } - } else - player.sendMessage("This world isn't logged"); + } + try { + if (toolData.mode == ToolMode.ROLLBACK) + handler.new CommandRollback(player, params, true); + else if (toolData.mode == ToolMode.REDO) + handler.new CommandRedo(player, params, true); + else if (toolData.mode == ToolMode.CLEARLOG) + handler.new CommandClearLog(player, params, true); + else if (toolData.mode == ToolMode.WRITELOGFILE) + handler.new CommandWriteLogFile(player, params, true); + else + handler.new CommandLookup(player, params, true); + } catch (final Exception ex) { + player.sendMessage(ChatColor.RED + ex.getMessage()); + } + } } } } diff --git a/src/de/diddiz/LogBlock/Session.java b/src/de/diddiz/LogBlock/Session.java index 42d0464..fbd430c 100644 --- a/src/de/diddiz/LogBlock/Session.java +++ b/src/de/diddiz/LogBlock/Session.java @@ -1,19 +1,31 @@ package de.diddiz.LogBlock; +import java.util.HashMap; +import java.util.Map; + public class Session { public QueryParams lastQuery = null; - public boolean toolEnabled = true; - public QueryParams toolQuery; - public ToolMode toolMode; - public boolean toolBlockEnabled = true; - public QueryParams toolBlockQuery; - public ToolMode toolBlockMode; public LookupCacheElement[] lookupCache = null; public int page = 1; + public Map toolData; Session(LogBlock logblock) { - toolQuery = logblock.getConfig().toolQuery.clone(); - toolBlockQuery = logblock.getConfig().toolBlockQuery.clone(); + toolData = new HashMap(); + for (final Tool tool : logblock.getConfig().toolsByType.values()) + toolData.put(tool, new ToolData(tool)); + } +} + +class ToolData +{ + boolean enabled; + QueryParams params; + ToolMode mode; + + ToolData(Tool tool) { + enabled = tool.defaultEnabled; + params = tool.params.clone(); + mode = tool.mode; } } diff --git a/src/de/diddiz/LogBlock/Tool.java b/src/de/diddiz/LogBlock/Tool.java new file mode 100644 index 0000000..5d07dd1 --- /dev/null +++ b/src/de/diddiz/LogBlock/Tool.java @@ -0,0 +1,29 @@ +package de.diddiz.LogBlock; + +import java.util.List; + +public class Tool +{ + public final String name; + public final List aliases; + public final ToolBehavior leftClickBehavior, rightClickBehavior; + public final boolean defaultEnabled; + public final int item; + public final QueryParams params; + public final ToolMode mode; + + public Tool(String name, List aliases, ToolBehavior leftClickBehavior, ToolBehavior rightClickBehavior, boolean defaultEnabled, int item, QueryParams params, ToolMode mode) { + this.name = name; + this.aliases = aliases; + this.leftClickBehavior = leftClickBehavior; + this.rightClickBehavior = rightClickBehavior; + this.defaultEnabled = defaultEnabled; + this.item = item; + this.params = params; + this.mode = mode; + } +} + +enum ToolBehavior { + TOOL, BLOCK, NONE +} diff --git a/src/de/diddiz/util/BukkitUtils.java b/src/de/diddiz/util/BukkitUtils.java index bb52cfd..5c5cb27 100644 --- a/src/de/diddiz/util/BukkitUtils.java +++ b/src/de/diddiz/util/BukkitUtils.java @@ -184,17 +184,17 @@ public class BukkitUtils return y; } - public static int modifyContainer(BlockState b, ItemStack item) throws Exception { - if (!(b instanceof ContainerBlock)) - throw new Exception("No container"); - final Inventory inv = ((ContainerBlock)b).getInventory(); - if (item.getAmount() < 0) { - item.setAmount(-item.getAmount()); - final ItemStack tmp = inv.removeItem(item).get(0); - return tmp != null ? tmp.getAmount() : 0; - } else if (item.getAmount() > 0) { - final ItemStack tmp = inv.addItem(item).get(0); - return tmp != null ? tmp.getAmount() : 0; + public static int modifyContainer(BlockState b, ItemStack item) { + if (b instanceof ContainerBlock) { + final Inventory inv = ((ContainerBlock)b).getInventory(); + if (item.getAmount() < 0) { + item.setAmount(-item.getAmount()); + final ItemStack tmp = inv.removeItem(item).get(0); + return tmp != null ? tmp.getAmount() : 0; + } else if (item.getAmount() > 0) { + final ItemStack tmp = inv.addItem(item).get(0); + return tmp != null ? tmp.getAmount() : 0; + } } return 0; }