diff --git a/src/main/java/ru/tehkode/modifyworld/ModifyworldListener.java b/src/main/java/ru/tehkode/modifyworld/ModifyworldListener.java index 173ee4c..f2ebe0b 100644 --- a/src/main/java/ru/tehkode/modifyworld/ModifyworldListener.java +++ b/src/main/java/ru/tehkode/modifyworld/ModifyworldListener.java @@ -99,13 +99,17 @@ public abstract class ModifyworldListener implements Listener { protected String getMaterialPermission(Material type) { return this.useMaterialNames ? type.name().toLowerCase().replace("_", "") : Integer.toString(type.getId()); } - - protected String getItemPermission(ItemStack item) { - return this.getMaterialPermission(item.getType()) + (this.checkMetadata ? "." + item.getData().getData() : ""); + + protected String getMaterialPermission(Material type, byte metadata) { + return this.getMaterialPermission(type) + (metadata > 0 ? ":" + metadata : ""); } - + + protected String getItemPermission(ItemStack item) { + return this.getMaterialPermission(item.getType(), item.getData().getData()); + } + protected String getBlockPermission(Block block) { - return this.getMaterialPermission(block.getType()) + (this.checkMetadata ? "." + block.getData() : ""); + return this.getMaterialPermission(block.getType(), block.getData()); } protected boolean canInteractWithMaterial(Player player, String basePermission, Material type) { @@ -113,11 +117,11 @@ public abstract class ModifyworldListener implements Listener { } protected boolean canInteractWithItem(Player player, String basePermission, ItemStack item) { - return permissionsManager.has(player, basePermission + this.getItemPermission(item)); + return permissionsManager.has(player, basePermission + this.getMaterialPermission(item.getType(), item.getData().getData())); } protected boolean canInteractWithBlock(Player player, String basePermission, Block block) { - return permissionsManager.has(player, basePermission + this.getBlockPermission(block)); + return permissionsManager.has(player, basePermission + this.getMaterialPermission(block.getType(), block.getData())); } private void registerEvents(Plugin plugin) { diff --git a/src/main/java/ru/tehkode/modifyworld/handlers/PlayerListener.java b/src/main/java/ru/tehkode/modifyworld/handlers/PlayerListener.java index 89f1e93..931afc4 100644 --- a/src/main/java/ru/tehkode/modifyworld/handlers/PlayerListener.java +++ b/src/main/java/ru/tehkode/modifyworld/handlers/PlayerListener.java @@ -40,24 +40,24 @@ import ru.tehkode.permissions.PermissionUser; * @author t3hk0d3 */ public class PlayerListener extends ModifyworldListener { - + public final static String WHITELIST_MESSAGE = "You are not allowed to join this server. Goodbye!"; public final static String PROHIBITED_ITEM = "You have prohibited item \"%s\"."; protected boolean checkInventory = false; protected boolean dropRestrictedItem = false; protected String whitelistKickMessage = WHITELIST_MESSAGE; protected String prohibitedItemMessage = PROHIBITED_ITEM; - + public PlayerListener(Plugin plugin, ConfigurationNode config) { super(plugin, config); - + this.whitelistKickMessage = config.getString("messages.whitelist", this.whitelistKickMessage); this.prohibitedItemMessage = config.getString("messages.prohibitedItem", this.prohibitedItemMessage); this.checkInventory = config.getBoolean("itemRestrictions", this.checkInventory); this.dropRestrictedItem = config.getBoolean("drop-restricted-item", this.dropRestrictedItem); - + } - + @EventHandler(Type.PLAYER_TOGGLE_SNEAK) public void onPlayerSneak(PlayerToggleSneakEvent event) { if (event.isSneaking() && !permissionsManager.has(event.getPlayer(), "modifyworld.sneak")) { @@ -65,7 +65,7 @@ public class PlayerListener extends ModifyworldListener { event.getPlayer().setSneaking(false); } } - + @EventHandler(Type.PLAYER_TOGGLE_SPRINT) public void onPlayerSprint(PlayerToggleSprintEvent event) { if (event.isSprinting() && !permissionsManager.has(event.getPlayer(), "modifyworld.sprint")) { @@ -73,30 +73,30 @@ public class PlayerListener extends ModifyworldListener { event.getPlayer().setSprinting(false); } } - + @EventHandler(Type.PLAYER_PRELOGIN) @Toggleable("whitelist") public void onPlayerPreLogin(PlayerPreLoginEvent event) { PermissionUser user = this.permissionsManager.getUser(event.getName()); - + if (user != null && !user.has("modifyworld.login", Bukkit.getServer().getWorlds().get(0).getName())) { event.disallow(PlayerPreLoginEvent.Result.KICK_WHITELIST, whitelistKickMessage); Logger.getLogger("Minecraft").info("Player \"" + user.getName() + "\" were kicked by Modifyworld - lack of modifyworld.login permission"); } } - + @EventHandler(Type.PLAYER_LOGIN) @Toggleable("whitelist") public void onPlayerLogin(PlayerLoginEvent event) { PermissionUser user = this.permissionsManager.getUser(event.getPlayer()); - + if (user != null && !user.has("modifyworld.login", Bukkit.getServer().getWorlds().get(0).getName())) { event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, whitelistKickMessage); //event.getPlayer().kickPlayer(whitelistKickMessage); Logger.getLogger("Minecraft").info("Player \"" + user.getName() + "\" were kicked by Modifyworld - lack of modifyworld.login permission"); } } - + @EventHandler(Type.PLAYER_BED_ENTER) public void onPlayerBedEnter(PlayerBedEnterEvent event) { if (!permissionsManager.has(event.getPlayer(), "modifyworld.usebeds")) { @@ -104,7 +104,7 @@ public class PlayerListener extends ModifyworldListener { event.setCancelled(true); } } - + @EventHandler(Type.PLAYER_BUCKET_EMPTY) public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { String bucketName = event.getBucket().toString().toLowerCase().replace("_bucket", ""); // WATER_BUCKET -> water @@ -113,7 +113,7 @@ public class PlayerListener extends ModifyworldListener { event.setCancelled(true); } } - + @EventHandler(Type.PLAYER_BUCKET_FILL) public void onPlayerBucketFill(PlayerBucketFillEvent event) { String materialName = event.getBlockClicked().getType().toString().toLowerCase().replace("stationary_", ""); // STATIONARY_WATER -> water @@ -122,7 +122,7 @@ public class PlayerListener extends ModifyworldListener { event.setCancelled(true); } } - + @EventHandler(Type.PLAYER_COMMAND_PREPROCESS) public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { if (event.getMessage().startsWith("/tell") && !permissionsManager.has(event.getPlayer(), "modifyworld.chat.private")) { @@ -130,7 +130,7 @@ public class PlayerListener extends ModifyworldListener { event.setCancelled(true); } } - + @EventHandler(Type.PLAYER_CHAT) public void onPlayerChat(PlayerChatEvent event) { if (!permissionsManager.has(event.getPlayer(), "modifyworld.chat")) { @@ -138,36 +138,36 @@ public class PlayerListener extends ModifyworldListener { event.setCancelled(true); } } - + @EventHandler(Type.PLAYER_PICKUP_ITEM) public void onPlayerPickupItem(PlayerPickupItemEvent event) { if (!canInteractWithItem(event.getPlayer(), "modifyworld.items.pickup.", event.getItem().getItemStack())) { event.setCancelled(true); } - + this.checkPlayerInventory(event.getPlayer()); } - + @EventHandler(Type.PLAYER_DROP_ITEM) public void onPlayerDropItem(PlayerDropItemEvent event) { if (!canInteractWithItem(event.getPlayer(), "modifyworld.items.drop.", event.getItemDrop().getItemStack())) { informPlayerAboutDenial(event.getPlayer()); event.setCancelled(true); } - + this.checkPlayerInventory(event.getPlayer()); } - + @EventHandler(Type.PLAYER_INVENTORY) public void onInventoryOpen(PlayerInventoryEvent event) { this.checkPlayerInventory(event.getPlayer()); } - + @EventHandler(Type.PLAYER_ITEM_HELD) public void onItemHeldChange(PlayerItemHeldEvent event) { this.checkPlayerInventory(event.getPlayer()); } - + @EventHandler(Type.PLAYER_INTERACT_ENTITY) public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { if (this.checkItemUse) { @@ -175,70 +175,70 @@ public class PlayerListener extends ModifyworldListener { event.setCancelled(true); informPlayerAboutDenial(event.getPlayer()); } - + return; } - + if (!event.isCancelled() && !permissionsManager.has(event.getPlayer(), "modifyworld.interact." + getEntityName(event.getRightClicked()))) { event.setCancelled(true); informPlayerAboutDenial(event.getPlayer()); } } - + @EventHandler(Type.PLAYER_INTERACT) public void onPlayerInteract(PlayerInteractEvent event) { Action action = event.getAction(); - + if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) { // item restriction check this.checkPlayerInventory(event.getPlayer()); } - + if (action != Action.LEFT_CLICK_BLOCK && action != Action.RIGHT_CLICK_BLOCK && action != Action.PHYSICAL) { return; } - + if (this.checkItemUse && action != Action.PHYSICAL) { if (!permissionsManager.has(event.getPlayer(), "modifyworld.item.use." + getItemPermission(event.getPlayer().getItemInHand()) + ".on.block." + getBlockPermission(event.getClickedBlock()))) { event.setCancelled(true); informPlayerAboutDenial(event.getPlayer()); } - + return; } - + if (!event.isCancelled() && !canInteractWithBlock(event.getPlayer(), "modifyworld.blocks.interact.", event.getClickedBlock())) { informPlayerAboutDenial(event.getPlayer()); event.setCancelled(true); } } - + @EventHandler(Type.FOOD_LEVEL_CHANGE) public void onFoodLevelChange(FoodLevelChangeEvent event) { Player player = event.getEntity() instanceof Player ? (Player) event.getEntity() : null; - + if (player == null) { return; } - + if (!permissionsManager.has(player, "modifyworld.digestion")) { event.setCancelled(true); } } - + protected void checkPlayerInventory(Player player) { if (!checkInventory) { return; } - + Inventory inventory = player.getInventory(); for (ItemStack stack : inventory.getContents()) { if (stack != null && !canInteractWithItem(player, "modifyworld.items.have.", stack)) { inventory.remove(stack); - + if (this.dropRestrictedItem) { player.getWorld().dropItemNaturally(player.getLocation(), stack); } - + informPlayer(player, String.format(this.prohibitedItemMessage, stack.getType().name())); } }