1
0
mirror of https://github.com/essentials/Essentials.git synced 2025-08-18 20:41:37 +02:00

More work on Protect

This commit is contained in:
snowleo
2012-01-03 02:51:19 +01:00
parent 869d79ae73
commit 801562ac2c
6 changed files with 270 additions and 148 deletions

View File

@@ -618,6 +618,7 @@ public final class Util
} }
parent = perm; parent = perm;
} }
perm.recalculatePermissibles();
return perm; return perm;
} }
private static transient final Pattern COLOR_PATTERN = Pattern.compile("(?i)\u00A7[0-9A-F]"); private static transient final Pattern COLOR_PATTERN = Pattern.compile("(?i)\u00A7[0-9A-F]");

View File

@@ -0,0 +1,43 @@
package com.earth2me.essentials.protect;
import com.earth2me.essentials.api.IPermission;
import com.earth2me.essentials.perm.AbstractSuperpermsPermission;
import java.util.EnumMap;
import java.util.Locale;
import java.util.Map;
import org.bukkit.Material;
import org.bukkit.permissions.PermissionDefault;
public class BlockBreakPermissions extends AbstractSuperpermsPermission{
private static Map<Material,IPermission> permissions = new EnumMap<Material, IPermission>(Material.class);
private static final String base = "essentials.protect.blockbreak.";
private final String permission;
public static IPermission getPermission(Material mat)
{
IPermission perm = permissions.get(mat);
if (perm == null) {
perm = new BlockBreakPermissions(mat.toString().toLowerCase(Locale.ENGLISH));
permissions.put(mat, perm);
}
return perm;
}
private BlockBreakPermissions(String matName)
{
this.permission = base + matName;
}
@Override
public String getPermission()
{
return this.permission;
}
@Override
public PermissionDefault getPermissionDefault()
{
return PermissionDefault.TRUE;
}
}

View File

@@ -0,0 +1,42 @@
package com.earth2me.essentials.protect;
import com.earth2me.essentials.api.IPermission;
import com.earth2me.essentials.perm.AbstractSuperpermsPermission;
import java.util.EnumMap;
import java.util.Locale;
import java.util.Map;
import org.bukkit.Material;
import org.bukkit.permissions.PermissionDefault;
public class BlockPlacePermissions extends AbstractSuperpermsPermission{
private static Map<Material,IPermission> permissions = new EnumMap<Material, IPermission>(Material.class);
private static final String base = "essentials.protect.blockplace.";
private final String permission;
public static IPermission getPermission(Material mat)
{
IPermission perm = permissions.get(mat);
if (perm == null) {
perm = new BlockPlacePermissions(mat.toString().toLowerCase(Locale.ENGLISH));
permissions.put(mat, perm);
}
return perm;
}
private BlockPlacePermissions(String matName)
{
this.permission = base + matName;
}
@Override
public String getPermission()
{
return this.permission;
}
@Override
public PermissionDefault getPermissionDefault()
{
return PermissionDefault.TRUE;
}
}

View File

@@ -32,8 +32,11 @@ public class EssentialsProtectBlockListener extends BlockListener
} }
final IUser user = ess.getUser(event.getPlayer()); final IUser user = ess.getUser(event.getPlayer());
final ProtectHolder settings = prot.getSettings();
if (prot.getSettingBool(ProtectConfig.disable_build) && !user.isAuthorized(Permissions.BUILD)) settings.acquireReadLock();
try
{
if (!user.isAuthorized(Permissions.BUILD))
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
@@ -42,20 +45,20 @@ public class EssentialsProtectBlockListener extends BlockListener
final Block blockPlaced = event.getBlockPlaced(); final Block blockPlaced = event.getBlockPlaced();
final int id = blockPlaced.getTypeId(); final int id = blockPlaced.getTypeId();
if (prot.checkProtectionItems(ProtectConfig.blacklist_placement, id) && !user.isAuthorized("essentials.protect.exemptplacement")) if (!user.isAuthorized(BlockPlacePermissions.getPermission(blockPlaced.getType())))
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (prot.checkProtectionItems(ProtectConfig.alert_on_placement, id)) if (settings.getData().getAlertOnPlacement().contains(blockPlaced.getType()))
{ {
prot.getEssentialsConnect().alert(user, blockPlaced.getType().toString(), _("alertPlaced")); prot.getEssentialsConnect().alert(user, blockPlaced.getType().toString(), _("alertPlaced"));
} }
final Block below = blockPlaced.getRelative(BlockFace.DOWN); final Block below = blockPlaced.getRelative(BlockFace.DOWN);
if ((below.getType() == Material.RAILS || below.getType() == Material.POWERED_RAIL || below.getType() == Material.DETECTOR_RAIL) if ((below.getType() == Material.RAILS || below.getType() == Material.POWERED_RAIL || below.getType() == Material.DETECTOR_RAIL)
&& prot.getSettingBool(ProtectConfig.prevent_block_on_rail) && settings.getData().getSignsAndRails().isPreventBlockAboveRails()
&& prot.getStorage().isProtected(below, user.getName())) && prot.getStorage().isProtected(below, user.getName()))
{ {
event.setCancelled(true); event.setCancelled(true);
@@ -64,22 +67,22 @@ public class EssentialsProtectBlockListener extends BlockListener
final List<Block> protect = new ArrayList<Block>(); final List<Block> protect = new ArrayList<Block>();
if ((blockPlaced.getType() == Material.RAILS || blockPlaced.getType() == Material.POWERED_RAIL || blockPlaced.getType() == Material.DETECTOR_RAIL) if ((blockPlaced.getType() == Material.RAILS || blockPlaced.getType() == Material.POWERED_RAIL || blockPlaced.getType() == Material.DETECTOR_RAIL)
&& prot.getSettingBool(ProtectConfig.protect_rails) && settings.getData().getSignsAndRails().isRails()
&& user.isAuthorized("essentials.protect")) && user.isAuthorized("essentials.protect"))
{ {
protect.add(blockPlaced); protect.add(blockPlaced);
if (prot.getSettingBool(ProtectConfig.protect_below_rails) if (settings.getData().getSignsAndRails().isBlockBelow()
&& !prot.getStorage().isProtected(blockPlaced.getRelative(BlockFace.DOWN), user.getName())) && !prot.getStorage().isProtected(blockPlaced.getRelative(BlockFace.DOWN), user.getName()))
{ {
protect.add(blockPlaced.getRelative(BlockFace.DOWN)); protect.add(blockPlaced.getRelative(BlockFace.DOWN));
} }
} }
if ((blockPlaced.getType() == Material.SIGN_POST || blockPlaced.getType() == Material.WALL_SIGN) if ((blockPlaced.getType() == Material.SIGN_POST || blockPlaced.getType() == Material.WALL_SIGN)
&& prot.getSettingBool(ProtectConfig.protect_signs) && settings.getData().getSignsAndRails().isSigns()
&& user.isAuthorized("essentials.protect")) && user.isAuthorized("essentials.protect"))
{ {
protect.add(blockPlaced); protect.add(blockPlaced);
if (prot.getSettingBool(ProtectConfig.protect_against_signs) if (settings.getData().getSignsAndRails().isBlockBelow()
&& event.getBlockAgainst().getType() != Material.SIGN_POST && event.getBlockAgainst().getType() != Material.SIGN_POST
&& event.getBlockAgainst().getType() != Material.WALL_SIGN && event.getBlockAgainst().getType() != Material.WALL_SIGN
&& !prot.getStorage().isProtected(event.getBlockAgainst(), user.getName())) && !prot.getStorage().isProtected(event.getBlockAgainst(), user.getName()))
@@ -92,6 +95,11 @@ public class EssentialsProtectBlockListener extends BlockListener
prot.getStorage().protectBlock(block, user.getName()); prot.getStorage().protectBlock(block, user.getName());
} }
} }
finally
{
settings.unlock();
}
}
@Override @Override
public void onBlockIgnite(BlockIgniteEvent event) public void onBlockIgnite(BlockIgniteEvent event)
@@ -100,15 +108,19 @@ public class EssentialsProtectBlockListener extends BlockListener
{ {
return; return;
} }
final ProtectHolder settings = prot.getSettings();
settings.acquireReadLock();
try
{
final Block block = event.getBlock(); final Block block = event.getBlock();
if ((block.getType() == Material.RAILS || block.getType() == Material.POWERED_RAIL || block.getType() == Material.DETECTOR_RAIL) if ((block.getType() == Material.RAILS || block.getType() == Material.POWERED_RAIL || block.getType() == Material.DETECTOR_RAIL)
&& prot.getSettingBool(ProtectConfig.protect_rails)) && settings.getData().getSignsAndRails().isRails())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if ((block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) if ((block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)
&& prot.getSettingBool(ProtectConfig.protect_signs)) && settings.getData().getSignsAndRails().isSigns())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
@@ -116,33 +128,38 @@ public class EssentialsProtectBlockListener extends BlockListener
if (event.getBlock().getType() == Material.OBSIDIAN if (event.getBlock().getType() == Material.OBSIDIAN
|| event.getBlock().getRelative(BlockFace.DOWN).getType() == Material.OBSIDIAN) || event.getBlock().getRelative(BlockFace.DOWN).getType() == Material.OBSIDIAN)
{ {
event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_portal_creation)); event.setCancelled(settings.getData().getPrevent().isPortalCreation());
return; return;
} }
if (event.getCause().equals(BlockIgniteEvent.IgniteCause.SPREAD)) if (event.getCause().equals(BlockIgniteEvent.IgniteCause.SPREAD))
{ {
event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_fire_spread)); event.setCancelled(settings.getData().getPrevent().isFirespread());
return; return;
} }
if (event.getCause().equals(BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL)) if (event.getCause().equals(BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL) && event.getPlayer() != null)
{ {
event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_flint_fire)); event.setCancelled(ess.getUser(event.getPlayer()).isAuthorized(Permissions.USEFLINTSTEEL));
return; return;
} }
if (event.getCause().equals(BlockIgniteEvent.IgniteCause.LAVA)) if (event.getCause().equals(BlockIgniteEvent.IgniteCause.LAVA))
{ {
event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_lava_fire_spread)); event.setCancelled(settings.getData().getPrevent().isLavaFirespread());
return; return;
} }
if (event.getCause().equals(BlockIgniteEvent.IgniteCause.LIGHTNING)) if (event.getCause().equals(BlockIgniteEvent.IgniteCause.LIGHTNING))
{ {
event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_lightning_fire_spread)); event.setCancelled(settings.getData().getPrevent().isLightningFirespread());
return; return;
} }
} }
finally
{
settings.unlock();
}
}
@Override @Override
public void onBlockFromTo(final BlockFromToEvent event) public void onBlockFromTo(final BlockFromToEvent event)
@@ -151,15 +168,19 @@ public class EssentialsProtectBlockListener extends BlockListener
{ {
return; return;
} }
final ProtectHolder settings = prot.getSettings();
settings.acquireReadLock();
try
{
final Block toBlock = event.getToBlock(); final Block toBlock = event.getToBlock();
if ((toBlock.getType() == Material.RAILS || toBlock.getType() == Material.POWERED_RAIL || toBlock.getType() == Material.DETECTOR_RAIL) if ((toBlock.getType() == Material.RAILS || toBlock.getType() == Material.POWERED_RAIL || toBlock.getType() == Material.DETECTOR_RAIL)
&& prot.getSettingBool(ProtectConfig.protect_rails)) && settings.getData().getSignsAndRails().isRails())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if ((toBlock.getType() == Material.WALL_SIGN || toBlock.getType() == Material.SIGN_POST) if ((toBlock.getType() == Material.WALL_SIGN || toBlock.getType() == Material.SIGN_POST)
&& prot.getSettingBool(ProtectConfig.protect_signs)) && settings.getData().getSignsAndRails().isSigns())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
@@ -168,20 +189,25 @@ public class EssentialsProtectBlockListener extends BlockListener
final Block block = event.getBlock(); final Block block = event.getBlock();
if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER) if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER)
{ {
event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_water_flow)); event.setCancelled(settings.getData().getPrevent().isWaterFlow());
return; return;
} }
if (block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) if (block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA)
{ {
event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_lava_flow)); event.setCancelled(settings.getData().getPrevent().isLavaFlow());
return; return;
} }
// TODO: Test if this still works
if (block.getType() == Material.AIR) /*
* if (block.getType() == Material.AIR) {
* event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_water_bucket_flow)); return;
}
*/
}
finally
{ {
event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_water_bucket_flow)); settings.unlock();
return;
} }
} }
@@ -192,24 +218,34 @@ public class EssentialsProtectBlockListener extends BlockListener
{ {
return; return;
} }
final ProtectHolder settings = prot.getSettings();
settings.acquireReadLock();
try
{
final Block block = event.getBlock(); final Block block = event.getBlock();
if ((block.getType() == Material.RAILS || block.getType() == Material.POWERED_RAIL || block.getType() == Material.DETECTOR_RAIL) && prot.getSettingBool(ProtectConfig.protect_rails)) if ((block.getType() == Material.RAILS || block.getType() == Material.POWERED_RAIL || block.getType() == Material.DETECTOR_RAIL)
&& settings.getData().getSignsAndRails().isRails())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if ((block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) if ((block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)
&& prot.getSettingBool(ProtectConfig.protect_signs)) && settings.getData().getSignsAndRails().isSigns())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (prot.getSettingBool(ProtectConfig.prevent_fire_spread)) if (settings.getData().getPrevent().isFirespread())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} }
finally
{
settings.unlock();
}
}
private final static BlockFace[] faces = new BlockFace[] private final static BlockFace[] faces = new BlockFace[]
{ {
BlockFace.NORTH, BlockFace.NORTH,
@@ -230,7 +266,7 @@ public class EssentialsProtectBlockListener extends BlockListener
} }
final IUser user = ess.getUser(event.getPlayer()); final IUser user = ess.getUser(event.getPlayer());
if (prot.getSettingBool(ProtectConfig.disable_build) && !user.isAuthorized(Permissions.BUILD)) if (!user.isAuthorized(Permissions.BUILD))
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
@@ -238,8 +274,7 @@ public class EssentialsProtectBlockListener extends BlockListener
final Block block = event.getBlock(); final Block block = event.getBlock();
final int typeId = block.getTypeId(); final int typeId = block.getTypeId();
if (prot.checkProtectionItems(ProtectConfig.blacklist_break, typeId) if (!user.isAuthorized(BlockBreakPermissions.getPermission(block.getType())))
&& !user.isAuthorized("essentials.protect.exemptbreak"))
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;

View File

@@ -145,43 +145,38 @@ public class EssentialsProtectEntityListener extends EntityListener
if (target instanceof Player) if (target instanceof Player)
{ {
if (cause == DamageCause.FALL if (cause == DamageCause.FALL
&& prot.getSettingBool(ProtectConfig.disable_fall) && (user.isAuthorized(Permissions.PREVENTDAMAGE_FALL)
&& !(user.isAuthorized("essentials.protect.damage.fall") && !user.isAuthorized(Permissions.PREVENTDAMAGE_NONE)))
&& !user.isAuthorized("essentials.protect.damage.disable")))
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (cause == DamageCause.SUFFOCATION if (cause == DamageCause.SUFFOCATION
&& prot.getSettingBool(ProtectConfig.disable_suffocate) && (user.isAuthorized(Permissions.PREVENTDAMAGE_SUFFOCATION)
&& !(user.isAuthorized("essentials.protect.damage.suffocation") && !user.isAuthorized(Permissions.PREVENTDAMAGE_NONE)))
&& !user.isAuthorized("essentials.protect.damage.disable")))
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if ((cause == DamageCause.FIRE if ((cause == DamageCause.FIRE
|| cause == DamageCause.FIRE_TICK) || cause == DamageCause.FIRE_TICK)
&& prot.getSettingBool(ProtectConfig.disable_firedmg) && (user.isAuthorized(Permissions.PREVENTDAMAGE_FIRE)
&& !(user.isAuthorized("essentials.protect.damage.fire") && !user.isAuthorized(Permissions.PREVENTDAMAGE_NONE)))
&& !user.isAuthorized("essentials.protect.damage.disable")))
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (cause == DamageCause.DROWNING if (cause == DamageCause.DROWNING
&& prot.getSettingBool(ProtectConfig.disable_drown) && (user.isAuthorized(Permissions.PREVENTDAMAGE_DROWNING)
&& !(user.isAuthorized("essentials.protect.damage.drowning") && !user.isAuthorized(Permissions.PREVENTDAMAGE_NONE)))
&& !user.isAuthorized("essentials.protect.damage.disable")))
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (cause == DamageCause.LIGHTNING if (cause == DamageCause.LIGHTNING
&& prot.getSettingBool(ProtectConfig.disable_lightning) && (user.isAuthorized(Permissions.PREVENTDAMAGE_LIGHTNING)
&& !(user.isAuthorized("essentials.protect.damage.lightning") && !user.isAuthorized(Permissions.PREVENTDAMAGE_NONE)))
&& !user.isAuthorized("essentials.protect.damage.disable")))
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;

View File

@@ -9,9 +9,15 @@ import org.bukkit.permissions.PermissionDefault;
public enum Permissions implements IPermission public enum Permissions implements IPermission
{ {
BUILD, BUILD(PermissionDefault.TRUE),
PREVENTDAMAGE_FALL, INTERACT(PermissionDefault.TRUE),
PREVENTDAMAGE_NONE USEFLINTSTEEL(PermissionDefault.TRUE),
PREVENTDAMAGE_FALL(PermissionDefault.FALSE),
PREVENTDAMAGE_SUFFOCATION(PermissionDefault.FALSE),
PREVENTDAMAGE_FIRE(PermissionDefault.FALSE),
PREVENTDAMAGE_DROWNING(PermissionDefault.FALSE),
PREVENTDAMAGE_LIGHTNING(PermissionDefault.FALSE),
PREVENTDAMAGE_NONE(PermissionDefault.FALSE)
; ;
private static final String base = "essentials.protect."; private static final String base = "essentials.protect.";
private final String permission; private final String permission;