Changed item/blocks metadata check. Now it's done in much more standard way.

This commit is contained in:
t3hk0d3 2012-02-07 05:08:54 +04:00
parent 91e2c85332
commit 6666353f02
2 changed files with 48 additions and 44 deletions

View File

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

View File

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