Added dynamic tools

This commit is contained in:
Robin Kupper
2011-08-27 21:37:32 +02:00
parent 9829a76824
commit 844a63f518
6 changed files with 160 additions and 153 deletions

View File

@@ -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")) {

View File

@@ -30,10 +30,10 @@ public class Config
public final LogKillsLevel logKillsLevel;
public final Set<Integer> dontRollback, replaceAnyway;
public final int rollbackMaxTime, rollbackMaxArea;
public final QueryParams toolQuery, toolBlockQuery;
public final HashMap<String, Tool> toolsByName;
public final HashMap<Integer, Tool> 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<Integer> hiddenPlayers, hiddenBlocks;
@@ -43,7 +43,7 @@ public class Config
}
Config(LogBlock logblock) throws DataFormatException, IOException {
final Map<String, Object> def = new HashMap<String, Object>();
final Map<String, Object> def = new HashMap<String, Object>(), tooldef = new HashMap<String, Object>(), tbdef = new HashMap<String, Object>(), tdef = new HashMap<String, Object>();
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<String, Object> e : def.entrySet())
@@ -118,28 +131,8 @@ public class Config
replaceAnyway = new HashSet<Integer>(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<String> toolNames = config.getKeys("tools");
System.out.println(toolNames.size());
final List<Tool> tools = new ArrayList<Tool>();
for (final String toolName : toolNames)
try {
final List<String> 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<String, Tool>();
toolsByType = new HashMap<Integer, Tool>();
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<String> worldNames = config.getStringList("loggedWorlds", null);
worlds = new HashMap<Integer, WorldConfig>();
if (worldNames == null || worldNames.size() == 0)

View File

@@ -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<Integer, Tool> toolsByType;
private final Map<Integer, WorldConfig> 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());
}
}
}
}
}

View File

@@ -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<Tool, ToolData> toolData;
Session(LogBlock logblock) {
toolQuery = logblock.getConfig().toolQuery.clone();
toolBlockQuery = logblock.getConfig().toolBlockQuery.clone();
toolData = new HashMap<Tool, ToolData>();
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;
}
}

View File

@@ -0,0 +1,29 @@
package de.diddiz.LogBlock;
import java.util.List;
public class Tool
{
public final String name;
public final List<String> 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<String> 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
}

View File

@@ -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;
}