126 lines
No EOL
3.8 KiB
Java
126 lines
No EOL
3.8 KiB
Java
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.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
|
|
)
|
|
);
|
|
}
|
|
|
|
public static void onInteractionEvent(PlayerInteractEvent 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)
|
|
);
|
|
}
|
|
|
|
public static void onEntityDamageByEntityEvent(EntityDamageByEntityEvent 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;
|
|
}
|
|
} |