Also contains a bit of refactoring on internal logic. Modifies (secondary) siege mechanics. * Un-couple siege from core claim functions * UUID overload, documentation, naming clarity * Add internal special message override support * Fix permission calculation issues in subclaims * Migrate egg handling to new methods * Use suppliers for denial message In many use cases addons don't care why a denial occurred, only that it did. On-demand calculation is vastly preferable to reduce server impact.
101 lines
4.1 KiB
Java
101 lines
4.1 KiB
Java
package me.ryanhamshire.GriefPrevention;
|
|
|
|
import me.ryanhamshire.GriefPrevention.events.ClaimPermissionCheckEvent;
|
|
import org.bukkit.Material;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.event.block.Action;
|
|
import org.bukkit.event.block.BlockBreakEvent;
|
|
import org.bukkit.event.player.PlayerInteractEvent;
|
|
|
|
public class SiegeEventHandler implements Listener
|
|
{
|
|
|
|
@EventHandler(priority = EventPriority.LOWEST)
|
|
public void onClaimPermissionCheck(ClaimPermissionCheckEvent event)
|
|
{
|
|
if (event.getRequiredPermission() == ClaimPermission.Manage) return;
|
|
|
|
Player player = event.getCheckedPlayer();
|
|
|
|
// Player must be online to use siege features.
|
|
if (player == null) return;
|
|
|
|
Claim claim = event.getClaim();
|
|
|
|
// Admin claims cannot be sieged.
|
|
if (claim.isAdminClaim()) return;
|
|
|
|
// Claim modification during siege is not allowed.
|
|
if (event.getRequiredPermission() == ClaimPermission.Edit)
|
|
{
|
|
if (claim.siegeData != null)
|
|
event.setDenialReason(() -> GriefPrevention.instance.dataStore.getMessage(Messages.NoModifyDuringSiege));
|
|
return;
|
|
}
|
|
|
|
// Following a siege where the defender lost, the claim will allow everyone access for a time.
|
|
if (event.getRequiredPermission() == ClaimPermission.Access)
|
|
{
|
|
if (claim.doorsOpen)
|
|
event.setDenialReason(null);
|
|
return;
|
|
}
|
|
|
|
// If under siege, nobody accesses containers.
|
|
if (event.getRequiredPermission() == ClaimPermission.Inventory)
|
|
{
|
|
// Trying to access inventory in a claim may extend an existing siege to include this claim.
|
|
GriefPrevention.instance.dataStore.tryExtendSiege(player, claim);
|
|
|
|
if (claim.siegeData != null)
|
|
event.setDenialReason(() -> GriefPrevention.instance.dataStore.getMessage(Messages.NoContainersSiege, claim.siegeData.attacker.getName()));
|
|
|
|
return;
|
|
}
|
|
|
|
// When a player tries to build in a claim, if he's under siege, the siege may extend to include the new claim.
|
|
GriefPrevention.instance.dataStore.tryExtendSiege(player, claim);
|
|
|
|
// If claim is not under siege and doors are not open, use default behavior.
|
|
if (claim.siegeData == null && !claim.doorsOpen)
|
|
return;
|
|
|
|
// If under siege, some blocks will be breakable.
|
|
Material broken = null;
|
|
if (event.getTriggeringEvent() instanceof BlockBreakEvent)
|
|
broken = ((BlockBreakEvent) event.getTriggeringEvent()).getBlock().getType();
|
|
else if (event.getTriggeringEvent() instanceof Claim.CompatBuildBreakEvent)
|
|
{
|
|
Claim.CompatBuildBreakEvent triggeringEvent = (Claim.CompatBuildBreakEvent) event.getTriggeringEvent();
|
|
if (triggeringEvent.isBreak())
|
|
broken = triggeringEvent.getMaterial();
|
|
}
|
|
else if (event.getTriggeringEvent() instanceof PlayerInteractEvent)
|
|
{
|
|
PlayerInteractEvent triggeringEvent = (PlayerInteractEvent) event.getTriggeringEvent();
|
|
if (triggeringEvent.getAction() == Action.PHYSICAL && triggeringEvent.getClickedBlock() != null
|
|
&& triggeringEvent.getClickedBlock().getType() == Material.TURTLE_EGG)
|
|
broken = Material.TURTLE_EGG;
|
|
}
|
|
|
|
if (broken != null)
|
|
{
|
|
// Error messages for siege mode.
|
|
if (!GriefPrevention.instance.config_siege_blocks.contains(broken))
|
|
event.setDenialReason(() -> GriefPrevention.instance.dataStore.getMessage(Messages.NonSiegeMaterial));
|
|
else if (player.getUniqueId().equals(claim.ownerID))
|
|
event.setDenialReason(() -> GriefPrevention.instance.dataStore.getMessage(Messages.NoOwnerBuildUnderSiege));
|
|
return;
|
|
}
|
|
|
|
// No building while under siege.
|
|
if (claim.siegeData != null)
|
|
event.setDenialReason(() -> GriefPrevention.instance.dataStore.getMessage(Messages.NoBuildUnderSiege, claim.siegeData.attacker.getName()));
|
|
|
|
}
|
|
|
|
}
|