diff --git a/pom.xml b/pom.xml index 66b7c64..8749cc6 100644 --- a/pom.xml +++ b/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - cn.CityCraft + cn.citycraft ProtectItem - 0.0.1-SNAPSHOT + 1.0 ProtectItem ${project.name} @@ -32,14 +32,9 @@ cn.citycraft:PluginHelper - org.mcstats.*:* - - org.mcstats - ${project.groupId}.${project.artifactId}.mcstats - cn.citycraft.PluginHelper ${project.groupId}.${project.artifactId} @@ -66,17 +61,13 @@ citycraft-repo http://ci.citycraft.cn:8800/jenkins/plugin/repository/everything/ - - Plugin Metrics - http://repo.mcstats.org/content/repositories/public - org.spigotmc spigot-api jar - 1.8.3-R0.1-SNAPSHOT + 1.8.8-R0.1-SNAPSHOT cn.citycraft @@ -84,12 +75,6 @@ jar 1.0 - - org.mcstats.bukkit - metrics - R8-SNAPSHOT - compile - UTF-8 diff --git a/src/main/java/cn/citycraft/ProtectItem/ProtectItem.java b/src/main/java/cn/citycraft/ProtectItem/ProtectItem.java index 123e77f..bba4992 100644 --- a/src/main/java/cn/citycraft/ProtectItem/ProtectItem.java +++ b/src/main/java/cn/citycraft/ProtectItem/ProtectItem.java @@ -1,98 +1,45 @@ package cn.citycraft.ProtectItem; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import cn.citycraft.ProtectItem.commands.ProtectItemCommand; +import cn.citycraft.ProtectItem.listen.ClickItemListen; import cn.citycraft.ProtectItem.listen.DropItemListen; +import cn.citycraft.ProtectItem.listen.InteractItemListen; +import cn.citycraft.ProtectItem.listen.ItemHeldListen; import cn.citycraft.ProtectItem.listen.PickupItemListen; +import cn.citycraft.ProtectItem.utils.ActionType; +import cn.citycraft.ProtectItem.utils.ItemManager; public class ProtectItem extends JavaPlugin { - public String servername; - public String pluginname; + public ItemManager itemManager; - public static String getItemName(final ItemStack i) { - final String name = i.getType().name(); - final int dur = i.getDurability(); - final String dura = i.getMaxStackSize() != 1 ? dur != 0 ? "_" + dur : "" : ""; - final String iname = name + dura; - return iname; - } - - public boolean checkevent(final Player p, final ItemStack i, final String type) { - if (p.hasPermission("pi.bypass")) { - return false; - } - final String iname = getItemName(i); - final Location l = p.getLocation(); - final World pw = l.getWorld(); - for (final String protectworld : getConfig().getStringList("ProtectWorld")) { - if (pw.getName().equalsIgnoreCase(protectworld)) { - for (final String protectitem : getConfig().getStringList("ProtectItem")) { - if (iname.equalsIgnoreCase(protectitem)) { - p.sendMessage(pluginname + getmessage("Message." + type)); - return true; - } - } - } - } - return false; - } - - public String getmessage(final String path) { - final String message = getConfig().getString(path).replaceAll("&", "§"); - return message; - } - - @Override - public boolean onCommand(final CommandSender sender, final Command cmd, final String string, final String[] args) { - final Player p = (Player) sender; - switch (args.length) { - case 0: - final ItemStack item = p.getItemInHand(); - p.sendMessage("\u00a7a手上物品类型名称为: \u00a76" + getItemName(item)); + public boolean actionCheck(final Player p, final ItemStack i, final ActionType action) { + if (itemManager.canAction(i, action)) { + return true; + } else if (itemManager.hasActionPerm(p, i, action)) { return true; - case 1: - if (p.hasPermission("pi.bypass")) { - if (args[0].equalsIgnoreCase("reload")) { - this.reloadConfig(); - p.sendMessage("\u00a7a配置文件已重载..."); - return true; - } - } - break; - default: } return false; } + public ItemManager getItemManager() { + return itemManager; + } + @Override public void onEnable() { - if (getConfig().getBoolean("Protect.Drop", true)) { - Bukkit.getPluginManager().registerEvents(new DropItemListen(this), this); - } - if (getConfig().getBoolean("Protect.Pickup", true)) { - Bukkit.getPluginManager().registerEvents(new PickupItemListen(this), this); - } - // if (getConfig().getBoolean("Protect.Break", true)) - // Bukkit.getPluginManager().registerEvents( - // new BreakBlockListen(this), this); - // if (getConfig().getBoolean("Protect.Place", true)) - // Bukkit.getPluginManager().registerEvents( - // new PlaceBlockListen(this), this); - getLogger().info("ProtectItem已加载!"); + itemManager = new ItemManager(this); + final PluginManager pm = this.getServer().getPluginManager(); + pm.registerEvents(new ClickItemListen(this), this); + pm.registerEvents(new DropItemListen(this), this); + pm.registerEvents(new InteractItemListen(this), this); + pm.registerEvents(new ItemHeldListen(this), this); + pm.registerEvents(new PickupItemListen(this), this); + this.getCommand("pi").setExecutor(new ProtectItemCommand(this)); } - @Override - public void onLoad() { - saveDefaultConfig(); - reloadConfig(); - servername = getmessage("servername"); - pluginname = getmessage("pluginname") + " "; - } } diff --git a/src/main/java/cn/citycraft/ProtectItem/commands/CommandBan.java b/src/main/java/cn/citycraft/ProtectItem/commands/CommandBan.java new file mode 100644 index 0000000..2d36d6b --- /dev/null +++ b/src/main/java/cn/citycraft/ProtectItem/commands/CommandBan.java @@ -0,0 +1,30 @@ +package cn.citycraft.ProtectItem.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandException; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import cn.citycraft.PluginHelper.commands.BaseCommand; +import cn.citycraft.ProtectItem.ProtectItem; + +public class CommandBan extends BaseCommand { + ProtectItem plugin; + + public CommandBan(final ProtectItem main) { + super("ban"); + this.plugin = main; + setOnlyPlayerExecutable(); + setDescription("§c封禁手持物品"); + setPossibleArguments("<封禁类型>"); + } + + @Override + public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { + final Player p = (Player) sender; + final ItemStack item = p.getItemInHand(); + plugin.getItemManager().addbanItem(item); + } + +} diff --git a/src/main/java/cn/citycraft/ProtectItem/commands/CommandUnban.java b/src/main/java/cn/citycraft/ProtectItem/commands/CommandUnban.java new file mode 100644 index 0000000..e7300ad --- /dev/null +++ b/src/main/java/cn/citycraft/ProtectItem/commands/CommandUnban.java @@ -0,0 +1,26 @@ +package cn.citycraft.ProtectItem.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandException; +import org.bukkit.command.CommandSender; + +import cn.citycraft.PluginHelper.commands.BaseCommand; +import cn.citycraft.ProtectItem.ProtectItem; + +public class CommandUnban extends BaseCommand { + ProtectItem plugin; + + public CommandUnban(final ProtectItem main) { + super("unban"); + this.plugin = main; + setOnlyPlayerExecutable(); + setDescription("§a解禁手持物品"); + setPossibleArguments("<解禁类型>"); + } + + @Override + public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { + + } + +} diff --git a/src/main/java/cn/citycraft/ProtectItem/commands/ProtectItemCommand.java b/src/main/java/cn/citycraft/ProtectItem/commands/ProtectItemCommand.java new file mode 100644 index 0000000..aea07f1 --- /dev/null +++ b/src/main/java/cn/citycraft/ProtectItem/commands/ProtectItemCommand.java @@ -0,0 +1,35 @@ +package cn.citycraft.ProtectItem.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandException; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +import cn.citycraft.PluginHelper.commands.DefaultCommand; +import cn.citycraft.PluginHelper.commands.HandlerSubCommand; +import cn.citycraft.ProtectItem.ProtectItem; + +public class ProtectItemCommand implements CommandExecutor, DefaultCommand { + + HandlerSubCommand hsc; + ProtectItem plugin; + + public ProtectItemCommand(final ProtectItem main) { + plugin = main; + hsc = new HandlerSubCommand(main); + hsc.setDefaultCommand(this); + hsc.registerCommand(new CommandBan(main)); + hsc.registerCommand(new CommandUnban(main)); + } + + @Override + public void defaultExecute(final CommandSender sender, final Command command, final String label) throws CommandException { + hsc.sendHelp(sender, label); + } + + @Override + public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) { + return hsc.onCommand(sender, cmd, label, args); + } + +} diff --git a/src/main/java/cn/citycraft/ProtectItem/listen/ClickItemListen.java b/src/main/java/cn/citycraft/ProtectItem/listen/ClickItemListen.java new file mode 100644 index 0000000..d5615c0 --- /dev/null +++ b/src/main/java/cn/citycraft/ProtectItem/listen/ClickItemListen.java @@ -0,0 +1,28 @@ +package cn.citycraft.ProtectItem.listen; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; + +import cn.citycraft.ProtectItem.ProtectItem; +import cn.citycraft.ProtectItem.utils.ActionType; + +public class ClickItemListen implements Listener { + ProtectItem plugin; + + public ClickItemListen(final ProtectItem main) { + plugin = main; + } + + @EventHandler(ignoreCancelled = true) + public void onClickItem(final InventoryClickEvent e) { + final Player p = (Player) e.getWhoClicked(); + final ItemStack i = e.getCurrentItem(); + if (i != null && i.getType() != Material.AIR) { + e.setCancelled(plugin.actionCheck(p, i, ActionType.Click)); + } + } +} diff --git a/src/main/java/cn/citycraft/ProtectItem/listen/DropItemListen.java b/src/main/java/cn/citycraft/ProtectItem/listen/DropItemListen.java index 9058a41..6a4f5b1 100644 --- a/src/main/java/cn/citycraft/ProtectItem/listen/DropItemListen.java +++ b/src/main/java/cn/citycraft/ProtectItem/listen/DropItemListen.java @@ -7,6 +7,7 @@ import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.inventory.ItemStack; import cn.citycraft.ProtectItem.ProtectItem; +import cn.citycraft.ProtectItem.utils.ActionType; public class DropItemListen implements Listener { ProtectItem plugin; @@ -19,6 +20,6 @@ public class DropItemListen implements Listener { public void onDropItem(final PlayerDropItemEvent e) { final Player p = e.getPlayer(); final ItemStack i = e.getItemDrop().getItemStack(); - e.setCancelled(plugin.checkevent(p, i, "Drop")); + e.setCancelled(plugin.actionCheck(p, i, ActionType.Drop)); } } diff --git a/src/main/java/cn/citycraft/ProtectItem/listen/InteractItemListen.java b/src/main/java/cn/citycraft/ProtectItem/listen/InteractItemListen.java new file mode 100644 index 0000000..efb32af --- /dev/null +++ b/src/main/java/cn/citycraft/ProtectItem/listen/InteractItemListen.java @@ -0,0 +1,25 @@ +package cn.citycraft.ProtectItem.listen; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import cn.citycraft.ProtectItem.ProtectItem; +import cn.citycraft.ProtectItem.utils.ActionType; + +public class InteractItemListen implements Listener { + ProtectItem plugin; + + public InteractItemListen(final ProtectItem main) { + plugin = main; + } + + @EventHandler(ignoreCancelled = true) + public void onPickupItem(final PlayerInteractEvent e) { + final Player p = e.getPlayer(); + final ItemStack i = p.getItemInHand(); + e.setCancelled(plugin.actionCheck(p, i, ActionType.Interact)); + } +} diff --git a/src/main/java/cn/citycraft/ProtectItem/listen/ItemHeldListen.java b/src/main/java/cn/citycraft/ProtectItem/listen/ItemHeldListen.java new file mode 100644 index 0000000..a902dab --- /dev/null +++ b/src/main/java/cn/citycraft/ProtectItem/listen/ItemHeldListen.java @@ -0,0 +1,28 @@ +package cn.citycraft.ProtectItem.listen; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerItemHeldEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import cn.citycraft.ProtectItem.ProtectItem; +import cn.citycraft.ProtectItem.utils.ActionType; + +public class ItemHeldListen implements Listener { + ProtectItem plugin; + + public ItemHeldListen(final ProtectItem main) { + plugin = main; + } + + @EventHandler(ignoreCancelled = true) + public void onItemHeld(final PlayerItemHeldEvent e) { + final Player p = e.getPlayer(); + final Inventory inv = p.getInventory(); + final int slot = e.getNewSlot(); + final ItemStack i = inv.getItem(slot); + e.setCancelled(plugin.actionCheck(p, i, ActionType.Held)); + } +} diff --git a/src/main/java/cn/citycraft/ProtectItem/listen/PickupItemListen.java b/src/main/java/cn/citycraft/ProtectItem/listen/PickupItemListen.java index 8d4151a..8f2381a 100644 --- a/src/main/java/cn/citycraft/ProtectItem/listen/PickupItemListen.java +++ b/src/main/java/cn/citycraft/ProtectItem/listen/PickupItemListen.java @@ -7,6 +7,7 @@ import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.inventory.ItemStack; import cn.citycraft.ProtectItem.ProtectItem; +import cn.citycraft.ProtectItem.utils.ActionType; public class PickupItemListen implements Listener { ProtectItem plugin; @@ -19,6 +20,6 @@ public class PickupItemListen implements Listener { public void onPickupItem(final PlayerPickupItemEvent e) { final Player p = e.getPlayer(); final ItemStack i = e.getItem().getItemStack(); - e.setCancelled(plugin.checkevent(p, i, "Pickup")); + e.setCancelled(plugin.actionCheck(p, i, ActionType.Pickup)); } } diff --git a/src/main/java/cn/citycraft/ProtectItem/utils/ActionType.java b/src/main/java/cn/citycraft/ProtectItem/utils/ActionType.java new file mode 100644 index 0000000..df15411 --- /dev/null +++ b/src/main/java/cn/citycraft/ProtectItem/utils/ActionType.java @@ -0,0 +1,9 @@ +package cn.citycraft.ProtectItem.utils; + +public enum ActionType { + Click(), + Drop(), + Held(), + Interact(), + Pickup() +} diff --git a/src/main/java/cn/citycraft/ProtectItem/utils/ItemManager.java b/src/main/java/cn/citycraft/ProtectItem/utils/ItemManager.java new file mode 100644 index 0000000..569948b --- /dev/null +++ b/src/main/java/cn/citycraft/ProtectItem/utils/ItemManager.java @@ -0,0 +1,62 @@ +package cn.citycraft.ProtectItem.utils; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import cn.citycraft.PluginHelper.config.FileConfig; +import cn.citycraft.ProtectItem.ProtectItem; + +public class ItemManager { + FileConfig itemconfig; + HashMap> itemlist; + ProtectItem plugin; + + @SuppressWarnings("unchecked") + public ItemManager(final ProtectItem main) { + plugin = main; + itemconfig = new FileConfig(plugin, "banitems"); + itemlist = (HashMap>) itemconfig.get("banitems"); + } + + public void addbanItem(final ItemStack item) { + addbanItem(item, null); + } + + public void addbanItem(final ItemStack item, final ActionType[] action) { + final String itemname = getItemName(item); + if (itemlist.containsKey(itemname)) { + final List actlist = itemlist.get(itemname); + for (final ActionType actionType : actlist) { + if (!actlist.contains(action)) { + actlist.add(actionType); + } + } + } else { + itemlist.put(itemname, Arrays.asList(action)); + } + itemconfig.set("banitems", itemlist); + } + + public boolean canAction(final ItemStack i, final ActionType action) { + final String itemname = getItemName(i); + final List actlist = itemlist.get(itemname); + final Boolean result = actlist.contains(action); + return result; + } + + public String getItemName(final ItemStack i) { + final int dur = i.getDurability(); + final String dura = i.getMaxStackSize() != 1 ? dur != 0 ? "_" + dur : "" : ""; + return (i.getType().name() + dura).toLowerCase(); + } + + public boolean hasActionPerm(final Player p, final ItemStack i, final ActionType action) { + final String itemname = getItemName(i); + final String perm = String.format("%s.%s", itemname, action.toString().toLowerCase()); + return p.hasPermission(itemname + ".*") ? true : p.hasPermission(perm); + } +} diff --git a/src/main/resources/banitems.yml b/src/main/resources/banitems.yml new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 9cfe674..5edce75 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,34 +1,5 @@ -#ļΪļ -# +#本文件为保护插件的主配置文件 +#服务器名称 servername: '' -# -pluginname: '&6[&3Ʒ&6]&r' - -#ʾϢ -Message: - Reload: '&aļ룡' -#鰲ȫʾ - Drop: '&cǰֹƷ' - Pickup: '&cǰֹʰȡƷ' -# Place: '&cǰֹøƷ' -# Break: '&cǰֹƻƷ' - -#ܵ -Protect: - Drop: true - Pickup: false -##Place: false -##Break: false - -#ܵ(ִСд) -ProtectWorld: - - world - -#Ʒ(ִСд) -ProtectItem: - - XXXX -#(Ʒ,/pishow鿴Ʒ) -# - DIRT -# - GRASS -# - CHEST -# - TRAPPED_CHEST +#插件名称 +pluginname: '&6[&3物品保护&6]&r' diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml new file mode 100644 index 0000000..81af571 --- /dev/null +++ b/src/main/resources/messages.yml @@ -0,0 +1,10 @@ +#提示消息 +Message: + Reload: '&a配置文件已重新载入!' +#方块安全提示 + Drop: '&c当前世界禁止丢弃该物品!' + Pickup: '&c当前世界禁止拾取该物品!' + Place: '&c当前世界禁止放置该物品!' + Break: '&c当前世界禁止破坏该物品!' + Use: '&c当前世界禁止使用该物品!' + Held: '&c当前世界禁止使用该物品!' \ No newline at end of file