From 792e8663e684e90eca93190bb46b89b106d4ee05 Mon Sep 17 00:00:00 2001 From: sk89q Date: Sat, 2 Apr 2011 10:17:02 -0700 Subject: [PATCH] Re-implemented the block/player interact hooks that changed in Bukkit recently. --- .../bukkit/WorldGuardBlockListener.java | 175 ---------------- .../bukkit/WorldGuardPlayerListener.java | 191 ++++++++++++++++-- .../protection/ApplicableRegionSet.java | 9 + 3 files changed, 181 insertions(+), 194 deletions(-) diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java index 371964ea..ccdcc4cb 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java @@ -380,73 +380,6 @@ public void onBlockPhysics(BlockPhysicsEvent event) { } } - /** - * Called when a block is interacted with - * - * @param event Relevant event details - *//* - @Override - public void onBlockInteract(BlockInteractEvent event) { - - if (event.isCancelled()) { - return; - } - - Block block = event.getBlock(); - Material type = block.getType(); - LivingEntity entity = event.getEntity(); - - GlobalConfiguration cfg = plugin.getGlobalConfiguration(); - WorldConfiguration wcfg = cfg.getWorldConfig(event.getBlock().getWorld().getName()); - - if (entity instanceof Player - && (block.getType() == Material.CHEST - || block.getType() == Material.DISPENSER - || block.getType() == Material.FURNACE - || block.getType() == Material.BURNING_FURNACE - || block.getType() == Material.NOTE_BLOCK)) { - Player player = (Player) entity; - if (wcfg.useRegions) { - Vector pt = toVector(block); - LocalPlayer localPlayer = plugin.wrapPlayer(player); - RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld().getName()); - - if (!plugin.hasPermission(player, "region.bypass")) { - ApplicableRegionSet set = mgr.getApplicableRegions(pt); - if (!set.allows(DefaultFlag.CHEST_ACCESS) && !set.canBuild(localPlayer)) { - player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area."); - event.setCancelled(true); - return; - } - } - } - } - - if (wcfg.useRegions && (type == Material.LEVER || type == Material.STONE_BUTTON) && entity instanceof Player) { - Vector pt = toVector(block); - RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().get(((Player)entity).getWorld().getName()); - ApplicableRegionSet applicableRegions = mgr.getApplicableRegions(pt); - LocalPlayer localPlayer = plugin.wrapPlayer((Player)entity); - - if (!applicableRegions.canUse(localPlayer)) { - ((Player)entity).sendMessage(ChatColor.DARK_RED + "You don't have permission for this area."); - event.setCancelled(true); - return; - } - } - - if (wcfg.getBlacklist() != null && entity instanceof Player) { - Player player = (Player) entity; - - if (!wcfg.getBlacklist().check( - new BlockInteractBlacklistEvent(plugin.wrapPlayer(player), toVector(block), - block.getTypeId()), false, false)) { - event.setCancelled(true); - return; - } - } - }*/ - /** * Called when a player places a block * @@ -496,114 +429,6 @@ public void onBlockPlace(BlockPlaceEvent event) { } } - /** - * Called when a player right clicks a block - * - * @param event Relevant event details - */ - /* - @Override - public void onBlockRightClick(BlockRightClickEvent event) { - Player player = event.getPlayer(); - Block blockClicked = event.getBlock(); - - GlobalConfiguration cfg = plugin.getGlobalConfiguration(); - WorldConfiguration wcfg = cfg.getWorldConfig(blockClicked.getWorld().getName()); - - if (wcfg.useRegions && event.getItemInHand().getTypeId() == wcfg.regionWand) { - Vector pt = toVector(blockClicked); - - RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld().getName()); - ApplicableRegionSet app = mgr.getApplicableRegions(pt); - List regions = mgr.getApplicableRegionsIDs(pt); - - if (regions.size() > 0) { - player.sendMessage(ChatColor.YELLOW + "Can you build? " - + (app.canBuild(plugin.wrapPlayer(player)) ? "Yes" : "No")); - - StringBuilder str = new StringBuilder(); - for (Iterator it = regions.iterator(); it.hasNext();) { - str.append(it.next()); - if (it.hasNext()) { - str.append(", "); - } - } - - player.sendMessage(ChatColor.YELLOW + "Applicable regions: " + str.toString()); - } else { - player.sendMessage(ChatColor.YELLOW + "WorldGuard: No defined regions here!"); - } - } - - Material type = blockClicked.getType(); - - if (wcfg.useRegions && type == Material.CAKE_BLOCK) { - - Vector pt = toVector(blockClicked); - - if (!cfg.canBuild(player, pt)) { - player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area."); - - byte newData = (byte) (blockClicked.getData() - 1); - newData = newData < 0 ? 0 : newData; - - blockClicked.setData(newData); - player.setHealth(player.getHealth() - 3); - - return; - } - } - - if (wcfg.useRegions && wcfg.useiConomy && cfg.getiConomy() != null - && (type == Material.SIGN_POST || type == Material.SIGN || type == Material.WALL_SIGN)) { - BlockState block = blockClicked.getState(); - - if (((Sign)block).getLine(0).equalsIgnoreCase("[WorldGuard]") - && ((Sign)block).getLine(1).equalsIgnoreCase("For sale")) { - String regionId = ((Sign)block).getLine(2); - //String regionComment = ((Sign)block).getLine(3); - - if (regionId != null && regionId != "") { - RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().get(player.getWorld().getName()); - ProtectedRegion region = mgr.getRegion(regionId); - - if (region != null) { - RegionFlags flags = region.getFlags(); - - if (flags.getBooleanFlag(DefaultFlag.BUYABLE).getValue(false)) { - if (iConomy.getBank().hasAccount(player.getName())) { - Account account = iConomy.getBank().getAccount(player.getName()); - double balance = account.getBalance(); - double regionPrice = flags.getDoubleFlag(DefaultFlag.PRICE).getValue(); - - if (balance >= regionPrice) { - account.subtract(regionPrice); - player.sendMessage(ChatColor.YELLOW + "You have bought the region " + regionId + " for " + - iConomy.getBank().format(regionPrice)); - DefaultDomain owners = region.getOwners(); - owners.addPlayer(player.getName()); - region.setOwners(owners); - flags.getBooleanFlag(DefaultFlag.BUYABLE).setValue(false); - account.save(); - } else { - player.sendMessage(ChatColor.YELLOW + "You have not enough money."); - } - } else { - player.sendMessage(ChatColor.YELLOW + "You have not enough money."); - } - } else { - player.sendMessage(ChatColor.RED + "Region: " + regionId + " is not buyable"); - } - } else { - player.sendMessage(ChatColor.DARK_RED + "The region " + regionId + " does not exist."); - } - } else { - player.sendMessage(ChatColor.DARK_RED + "No region specified."); - } - } - } - }*/ - /** * Called when redstone changes * From: the source of the redstone change diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java index 6328f6b7..cc5e432c 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java @@ -19,16 +19,29 @@ package com.sk89q.worldguard.bukkit; import static com.sk89q.worldguard.bukkit.BukkitUtil.toVector; +import java.util.Iterator; import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; import org.bukkit.event.block.Action; import org.bukkit.event.player.*; +import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.PluginManager; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldguard.LocalPlayer; +import com.sk89q.worldguard.blacklist.events.BlockInteractBlacklistEvent; import com.sk89q.worldguard.blacklist.events.ItemAcquireBlacklistEvent; import com.sk89q.worldguard.blacklist.events.ItemDropBlacklistEvent; +import com.sk89q.worldguard.blacklist.events.ItemUseBlacklistEvent; +import com.sk89q.worldguard.protection.ApplicableRegionSet; +import com.sk89q.worldguard.protection.flags.DefaultFlag; +import com.sk89q.worldguard.protection.managers.RegionManager; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; /** * Handles all events thrown in relation to a Player @@ -40,11 +53,6 @@ public class WorldGuardPlayerListener extends PlayerListener { */ private WorldGuardPlugin plugin; - /** - * Interact Handler - */ - private WorldGuardInteractHandler interactHandler; - /** * Construct the object; * @@ -58,7 +66,6 @@ public WorldGuardPlayerListener(WorldGuardPlugin plugin) { public void registerEvents() { PluginManager pm = plugin.getServer().getPluginManager(); - //pm.registerEvent(Event.Type.PLAYER_ITEM, this, Priority.High, plugin); pm.registerEvent(Event.Type.PLAYER_INTERACT, this, Priority.High, plugin); pm.registerEvent(Event.Type.PLAYER_DROP_ITEM, this, Priority.High, plugin); pm.registerEvent(Event.Type.PLAYER_PICKUP_ITEM, this, Priority.High, plugin); @@ -75,22 +82,168 @@ public void registerEvents() { */ @Override public void onPlayerInteract(PlayerInteractEvent event) { - ConfigurationManager cfg = plugin.getGlobalConfiguration(); - WorldConfiguration wcfg = cfg.get(event.getPlayer().getWorld()); - - if(event.getAction() == Action.LEFT_CLICK_AIR - || event.getAction() == Action.LEFT_CLICK_BLOCK) { - this.interactHandler.onBlockClick(event, cfg, wcfg, - event.getAction(), event.getPlayer(), event.getClickedBlock(), event.getItem(), event.getItem().getTypeId()); + if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { + handleblockRightClick(event); } - if(event.getAction() == Action.RIGHT_CLICK_AIR - || event.getAction() == Action.RIGHT_CLICK_BLOCK) { - if(!this.interactHandler.itemInHand(event, wcfg, event.getAction(), - event.getPlayer(), event.getClickedBlock(), event.getItem(), event.getItem().getTypeId())) { - this.interactHandler.onBlockRightclick(event, cfg, wcfg, - event.getAction(), event.getPlayer(), event.getClickedBlock(), event.getItem(), event.getItem().getTypeId()); + } + + /** + * Called when a block is damaged. + * + * @param event + */ + public void handleblockRightClick(PlayerInteractEvent event) { + if (event.isCancelled()) { + return; + } + + Block block = event.getClickedBlock(); + World world = block.getWorld(); + Material type = block.getType(); + Player player = event.getPlayer(); + ItemStack item = player.getItemInHand(); + + ConfigurationManager cfg = plugin.getGlobalConfiguration(); + WorldConfiguration wcfg = cfg.get(world); + + if (wcfg.useRegions) { + Vector pt = toVector(block); + RegionManager mgr = plugin.getGlobalRegionManager().get(world); + ApplicableRegionSet set = mgr.getApplicableRegions(pt); + LocalPlayer localPlayer = plugin.wrapPlayer(player); + + if (item.getTypeId() == wcfg.regionWand) { + if (set.size() > 0) { + player.sendMessage(ChatColor.YELLOW + "Can you build? " + + (set.canBuild(localPlayer) ? "Yes" : "No")); + + StringBuilder str = new StringBuilder(); + for (Iterator it = set.iterator(); it.hasNext();) { + str.append(it.next().getId()); + if (it.hasNext()) { + str.append(", "); + } + } + + player.sendMessage(ChatColor.YELLOW + "Applicable regions: " + str.toString()); + } else { + player.sendMessage(ChatColor.YELLOW + "WorldGuard: No defined regions here!"); + } + + event.setCancelled(true); + return; + } + + if (item.getType() == Material.FLINT_AND_STEEL) { + if (!set.allows(DefaultFlag.LIGHTER)) { + event.setCancelled(true); + return; + } + } + + if ((block.getType() == Material.CHEST + || block.getType() == Material.DISPENSER + || block.getType() == Material.FURNACE + || block.getType() == Material.BURNING_FURNACE + || block.getType() == Material.NOTE_BLOCK)) { + + if (!set.allows(DefaultFlag.CHEST_ACCESS) + && !set.canBuild(localPlayer)) { + player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area."); + event.setCancelled(true); + return; + } + } + + if (type == Material.LEVER || type == Material.STONE_BUTTON) { + if (!set.allows(DefaultFlag.USE) + && !set.canBuild(localPlayer)) { + player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area."); + event.setCancelled(true); + return; + } + } + + if (wcfg.useRegions && type == Material.CAKE_BLOCK) { + if (!set.canBuild(localPlayer)) { + player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area."); + + byte newData = (byte) (block.getData() - 1); + newData = newData < 0 ? 0 : newData; + block.setData(newData); + player.setHealth(player.getHealth() - 3); + + return; + } } } + + if (wcfg.getBlacklist() != null) { + if (item.getType() == Material.FLINT_AND_STEEL) { + if (!wcfg.getBlacklist().check( + new ItemUseBlacklistEvent(plugin.wrapPlayer(player), toVector(block), + item.getTypeId()), false, false)) { + event.setCancelled(true); + return; + } + } + + if (!wcfg.getBlacklist().check( + new BlockInteractBlacklistEvent(plugin.wrapPlayer(player), toVector(block), + block.getTypeId()), false, false)) { + event.setCancelled(true); + return; + } + } + + /*if (wcfg.useRegions && wcfg.useiConomy && cfg.getiConomy() != null + && (type == Material.SIGN_POST || type == Material.SIGN || type == Material.WALL_SIGN)) { + BlockState block = blockClicked.getState(); + + if (((Sign)block).getLine(0).equalsIgnoreCase("[WorldGuard]") + && ((Sign)block).getLine(1).equalsIgnoreCase("For sale")) { + String regionId = ((Sign)block).getLine(2); + //String regionComment = ((Sign)block).getLine(3); + + if (regionId != null && regionId != "") { + RegionManager mgr = cfg.getWorldGuardPlugin().getGlobalRegionManager().get(player.getWorld().getName()); + ProtectedRegion region = mgr.getRegion(regionId); + + if (region != null) { + RegionFlags flags = region.getFlags(); + + if (flags.getBooleanFlag(DefaultFlag.BUYABLE).getValue(false)) { + if (iConomy.getBank().hasAccount(player.getName())) { + Account account = iConomy.getBank().getAccount(player.getName()); + double balance = account.getBalance(); + double regionPrice = flags.getDoubleFlag(DefaultFlag.PRICE).getValue(); + + if (balance >= regionPrice) { + account.subtract(regionPrice); + player.sendMessage(ChatColor.YELLOW + "You have bought the region " + regionId + " for " + + iConomy.getBank().format(regionPrice)); + DefaultDomain owners = region.getOwners(); + owners.addPlayer(player.getName()); + region.setOwners(owners); + flags.getBooleanFlag(DefaultFlag.BUYABLE).setValue(false); + account.save(); + } else { + player.sendMessage(ChatColor.YELLOW + "You have not enough money."); + } + } else { + player.sendMessage(ChatColor.YELLOW + "You have not enough money."); + } + } else { + player.sendMessage(ChatColor.RED + "Region: " + regionId + " is not buyable"); + } + } else { + player.sendMessage(ChatColor.DARK_RED + "The region " + regionId + " does not exist."); + } + } else { + player.sendMessage(ChatColor.DARK_RED + "No region specified."); + } + } + }*/ } /** diff --git a/src/com/sk89q/worldguard/protection/ApplicableRegionSet.java b/src/com/sk89q/worldguard/protection/ApplicableRegionSet.java index ecb35aea..19061b36 100644 --- a/src/com/sk89q/worldguard/protection/ApplicableRegionSet.java +++ b/src/com/sk89q/worldguard/protection/ApplicableRegionSet.java @@ -314,4 +314,13 @@ private void clearParents(Map needsClear, public int size() { return applicable.size(); } + + /** + * Get an iterator of affected regions. + * + * @return + */ + public Iterator iterator() { + return applicable.iterator(); + } }