Add action and handler for gliding, equip, refactored PolicyParser and implementations to support world matching
Some checks are pending
Build / build (push) Waiting to run

This commit is contained in:
天クマ 2026-05-19 15:27:04 -03:00
commit f4a362c1c7
35 changed files with 651 additions and 177 deletions

View file

@ -1,34 +1,126 @@
package io.github.adrianvic.nemesiseye;
import io.github.adrianvic.nemesiseye.policy.Action;
import org.bukkit.Material;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.PlayerHarvestBlockEvent;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack;
import java.util.List;
public class Events {
public static void onBlockBreak(BlockBreakEvent event) {
event.setCancelled(!Validator.can(event.getPlayer(), List.of(Action.BREAK, Action.USE_ENCHANTMENT), event));
event.setCancelled(
!Validator.can(
event.getPlayer(),
List.of(Action.BREAK, Action.USE_ENCHANTMENT),
event
)
);
}
public static void onInteractionEvent(PlayerInteractEvent event) {
if (event.getItem() != null) {
event.setCancelled(!Validator.can(event.getPlayer(), Action.INTERACT, event));
ItemStack item = event.getItem();
if (item == null || item.getType().isAir()) {
return;
}
// Right-click armor equipping
if (isArmor(item)
&& !Validator.can(event.getPlayer(), Action.EQUIP, event)) {
event.setCancelled(true);
return;
}
// Normal item interaction
event.setCancelled(
!Validator.can(event.getPlayer(), Action.INTERACT, event)
);
}
public static void onBlockPlaceEvent(BlockPlaceEvent event) {
event.setCancelled(!Validator.can(event.getPlayer(), Action.PLACE, event));
event.setCancelled(
!Validator.can(event.getPlayer(), Action.PLACE, event)
);
}
public static void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Player) {
event.setCancelled(!Validator.can((HumanEntity) event.getDamager(), List.of(Action.HIT, Action.USE_ENCHANTMENT), event));
if (event.getDamager() instanceof Player player) {
event.setCancelled(
!Validator.can(
player,
List.of(Action.HIT, Action.USE_ENCHANTMENT),
event
)
);
}
}
}
public static void onPlayerMoveEvent(PlayerMoveEvent event) {
if (event.getPlayer().isGliding()
&& !Validator.can(
event.getPlayer(),
List.of(Action.GLYDE),
event
)) {
event.getPlayer().setGliding(false);
}
}
public static void onInventoryClickEvent(InventoryClickEvent event) {
if (!isArmorEquipAttempt(event)) {
return;
}
HumanEntity entity = event.getWhoClicked();
if (!Validator.can(entity, Action.EQUIP, event)) {
event.setCancelled(true);
}
}
private static boolean isArmorEquipAttempt(InventoryClickEvent event) {
if (event.getSlotType() == InventoryType.SlotType.ARMOR) {
return true;
}
if (event.isShiftClick()) {
return isArmor(event.getCurrentItem());
}
if (event.getClick() == ClickType.NUMBER_KEY
&& event.getSlotType() == InventoryType.SlotType.ARMOR
&& event.getWhoClicked() instanceof Player player) {
return isArmor(
player.getInventory().getItem(event.getHotbarButton())
);
}
return false;
}
private static boolean isArmor(ItemStack item) {
if (item == null || item.getType().isAir()) {
return false;
}
Material type = item.getType();
String name = type.name();
return name.endsWith("_HELMET")
|| name.endsWith("_CHESTPLATE")
|| name.endsWith("_LEGGINGS")
|| name.endsWith("_BOOTS")
|| type == Material.ELYTRA;
}
}