Fix explosions not respecting inheritance. Fixes #265

* Remove 'explosion-cancel-block-limit' as it breaks inheritance
  functionality.
This commit is contained in:
bloodshot 2020-11-13 18:05:51 -05:00
parent 771d6eb7e5
commit 6b056d936e
5 changed files with 12 additions and 28 deletions

View File

@ -41,10 +41,6 @@ public class ClaimCategory extends ConfigCategory {
+ "\nEx. If you add 'minecraft:creeper' to the list, creepers would not be able to hurt entities above sea level."
+ "\nNote: This will have higher priority than 'explosion-entity' flag.")
public List<String> explosionEntitySurfaceBlacklist = new ArrayList<>();
@Setting(value = "explosion-cancel-block-limit", comment = "The affected explosion block size limit to cancel events in order to improve performance."
+ "\nEx. If set to '50' and an explosion affects 51+ blocks, the event will cancel when the first protected block is found."
+ "\nNote: To disable, set value to '0'.")
public int explosionCancelBlockLimit = 50;
@Setting(value = "piston-protection-in-claims", comment = "Whether piston protection should be enabled within claims. Note: This does not affect pistons crossing into another claim, that is always protected. This only determines whether or not GD should process pistons if it doesn't cross into another claim.")
public boolean pistonProtectionInClaims = false;
@Setting(value = "auto-chest-claim-block-radius", comment = "Radius used (in blocks) for auto-created claim when a chest is placed. Set to -1 to disable chest claim creation.")

View File

@ -499,7 +499,6 @@ public class BlockEventHandler implements Listener {
GDClaim targetClaim = null;
final List<Block> filteredLocations = new ArrayList<>();
final String sourceId = GDPermissionManager.getInstance().getPermissionIdentifier(source);
final int cancelBlockLimit = GriefDefenderPlugin.getGlobalConfig().getConfig().claim.explosionCancelBlockLimit;
boolean denySurfaceExplosion = GriefDefenderPlugin.getActiveConfig(world.getUID()).getConfig().claim.explosionBlockSurfaceBlacklist.contains(sourceId);
if (!denySurfaceExplosion) {
denySurfaceExplosion = GriefDefenderPlugin.getActiveConfig(world.getUID()).getConfig().claim.explosionBlockSurfaceBlacklist.contains("any");
@ -517,11 +516,6 @@ public class BlockEventHandler implements Listener {
}
Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, location, targetClaim, Flags.EXPLOSION_BLOCK, source, block, user, true);
if (result == Tristate.FALSE) {
// Avoid lagging server from large explosions.
if (event.blockList().size() > cancelBlockLimit) {
event.setCancelled(true);
break;
}
filteredLocations.add(block);
}
}

View File

@ -198,6 +198,12 @@ public class EntityEventHandler implements Listener {
}
final Location location = event.getEntity().getLocation();
final GDClaim targetClaim = GriefDefenderPlugin.getInstance().dataStore.getClaimAt(location);
// If affected claim does not inherit parent, skip logic
if (!targetClaim.isWilderness() && targetClaim.getParent().isPresent() && !targetClaim.getInternalClaimData().doesInheritParent()) {
GDTimings.ENTITY_EXPLOSION_PRE_EVENT.stopTiming();
return;
}
final GDClaim radiusClaim = NMSUtil.getInstance().createClaimFromCenter(location, event.getRadius());
final GDClaimManager claimManager = GriefDefenderPlugin.getInstance().dataStore.getClaimWorldManager(location.getWorld().getUID());
final Set<Claim> surroundingClaims = claimManager.findOverlappingClaims(radiusClaim);
@ -248,7 +254,6 @@ public class EntityEventHandler implements Listener {
}
GDTimings.EXPLOSION_EVENT.startTiming();
GDClaim targetClaim = null;
final int cancelBlockLimit = GriefDefenderPlugin.getGlobalConfig().getConfig().claim.explosionCancelBlockLimit;
final List<Block> filteredLocations = new ArrayList<>();
boolean clearAll = false;
for (Block block : event.blockList()) {
@ -261,13 +266,6 @@ public class EntityEventHandler implements Listener {
}
final Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, location, targetClaim, Flags.EXPLOSION_BLOCK, source, block, user, true);
if (result == Tristate.FALSE) {
// Avoid lagging server from large explosions.
if (event.blockList().size() > cancelBlockLimit) {
// Avoid cancelling as it causing clients not to receive explosion sound
//event.setCancelled(true);
clearAll = true;
break;
}
filteredLocations.add(block);
}
}

View File

@ -41,10 +41,6 @@ public class ClaimCategory extends ConfigCategory {
+ "\nEx. If you add 'minecraft:creeper' to the list, creepers would not be able to hurt entities above sea level."
+ "\nNote: This will have higher priority than 'explosion-entity' flag.")
public List<String> explosionEntitySurfaceBlacklist = new ArrayList<>();
@Setting(value = "explosion-cancel-block-limit", comment = "The affected explosion block size limit to cancel events."
+ "\nEx. If set to '50', and a creeper explodes which affects 51+ blocks, the event will cancel when the first protected block is found."
+ "\nNote: To disable, set value to '0'.")
public int explosionCancelBlockLimit = 50;
@Setting(value = "worldedit-schematics", comment = "Whether to use WorldEdit for schematics. Default: false"
+ "\nNote: If you were using schematics in older GD/GP versions and want old schematics to work then you should keep this setting disabled.")
public boolean useWorldEditSchematics = false;

View File

@ -598,6 +598,12 @@ public class BlockEventHandler {
GDTimings.EXPLOSION_PRE_EVENT.startTimingIfSync();
final User user = CauseContextHelper.getEventUser(event);
final Location<World> location = event.getExplosion().getLocation();
final GDClaim targetClaim = GriefDefenderPlugin.getInstance().dataStore.getClaimAt(location);
// If affected claim does not inherit parent, skip logic
if (!targetClaim.isWilderness() && targetClaim.getParent().isPresent() && !targetClaim.getInternalClaimData().doesInheritParent()) {
GDTimings.EXPLOSION_PRE_EVENT.stopTimingIfSync();
return;
}
final GDClaim radiusClaim = NMSUtil.getInstance().createClaimFromCenter(location, event.getExplosion().getRadius());
final GDClaimManager claimManager = GriefDefenderPlugin.getInstance().dataStore.getClaimWorldManager(location.getExtent().getUniqueId());
final Set<Claim> surroundingClaims = claimManager.findOverlappingClaims(radiusClaim);
@ -646,7 +652,6 @@ public class BlockEventHandler {
GDClaim targetClaim = null;
final List<Location<World>> filteredLocations = new ArrayList<>();
final String sourceId = GDPermissionManager.getInstance().getPermissionIdentifier(source);
final int cancelBlockLimit = GriefDefenderPlugin.getGlobalConfig().getConfig().claim.explosionCancelBlockLimit;
boolean denySurfaceExplosion = GriefDefenderPlugin.getActiveConfig(world.getUniqueId()).getConfig().claim.explosionBlockSurfaceBlacklist.contains(sourceId);
if (!denySurfaceExplosion) {
denySurfaceExplosion = GriefDefenderPlugin.getActiveConfig(world.getUniqueId()).getConfig().claim.explosionBlockSurfaceBlacklist.contains("any");
@ -665,11 +670,6 @@ public class BlockEventHandler {
Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, location, targetClaim, Flags.EXPLOSION_BLOCK, source, location.getBlock(), user, true);
if (result == Tristate.FALSE) {
// Avoid lagging server from large explosions.
if (event.getAffectedLocations().size() > cancelBlockLimit) {
event.setCancelled(true);
break;
}
filteredLocations.add(location);
}
}