package net.therosegarden.firefighter; import me.ryanhamshire.GriefPrevention.ClaimPermission; import me.ryanhamshire.GriefPrevention.events.ClaimPermissionCheckEvent; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEvent; final class GriefPreventionBridge implements Listener { private final EmergencyManager emergencies; private final EmergencyPermissionManager permissions; private final EmergencyConstructionManager construction; GriefPreventionBridge(EmergencyManager emergencies, EmergencyPermissionManager permissions, EmergencyConstructionManager construction) { this.emergencies = emergencies; this.permissions = permissions; this.construction = construction; } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false) public void onClaimPermissionCheck(ClaimPermissionCheckEvent event) { if (event.getRequiredPermission() != ClaimPermission.Build || event.getDenialReason() == null) { return; } Player player = event.getCheckedPlayer(); if (player == null || !permissions.hasBuildAccess(player)) { return; } EmergencySite activeSite = emergencies.activeSite(); if (!isIncidentClaim(activeSite, event)) { return; } Event trigger = event.getTriggeringEvent(); if (trigger instanceof BlockPlaceEvent placeEvent) { allowIfInside(event, placeEvent.getBlock().getLocation()); return; } if (trigger instanceof PlayerBucketEmptyEvent bucketEvent) { allowIfInside(event, bucketEvent.getBlock().getLocation()); return; } if (trigger instanceof PlayerInteractEvent interactEvent) { Block block = interactEvent.getClickedBlock(); if (block != null) { allowIfInside(event, block.getLocation()); } return; } if (trigger instanceof BlockBreakEvent breakEvent) { Block block = breakEvent.getBlock(); if (permissions.isInsideActiveSite(block.getLocation()) && (emergencies.isEmergencyFire(block) || construction.isTemporaryBlock(block) || construction.isForcedEntryEnabled())) { event.setDenialReason(null); } } } private boolean isIncidentClaim(EmergencySite activeSite, ClaimPermissionCheckEvent event) { if (activeSite == null || activeSite.griefPreventionClaimId() == null || event.getClaim() == null) { return false; } Long checkedClaimId = event.getClaim().getID(); return checkedClaimId != null && checkedClaimId.equals(activeSite.griefPreventionClaimId()); } private void allowIfInside(ClaimPermissionCheckEvent event, Location location) { if (permissions.isInsideActiveSite(location)) { event.setDenialReason(null); } } }