From c8c0868f566bdf882f4629120dc3b088748420d2 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Thu, 24 Oct 2024 22:59:06 +0700 Subject: [PATCH] feat: implemented undroppable and static slot items --- .../dragonestia/msb3/api/item/ItemUtil.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 api/src/main/java/ru/dragonestia/msb3/api/item/ItemUtil.java diff --git a/api/src/main/java/ru/dragonestia/msb3/api/item/ItemUtil.java b/api/src/main/java/ru/dragonestia/msb3/api/item/ItemUtil.java new file mode 100644 index 0000000..f309a1f --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/item/ItemUtil.java @@ -0,0 +1,47 @@ +package ru.dragonestia.msb3.api.item; + +import lombok.experimental.UtilityClass; +import net.minestom.server.MinecraftServer; +import net.minestom.server.event.inventory.InventoryPreClickEvent; +import net.minestom.server.event.item.ItemDropEvent; +import net.minestom.server.event.player.PlayerSwapItemEvent; +import net.minestom.server.tag.Tag; + +@UtilityClass +public class ItemUtil { + + private boolean initialized = false; + + public final Tag TAG_UNDROPPABLE = Tag.Boolean("msb3_undroppable"); + public final Tag TAG_STATIC_SLOT = Tag.Boolean("msb3_static_slot"); + + public synchronized void init() { + if (initialized) return; + initialized = true; + + MinecraftServer.getGlobalEventHandler() + .addListener(ItemDropEvent.class, event -> { + var item = event.getItemStack(); + boolean undroppable = false; + + if (item.hasTag(TAG_UNDROPPABLE) && item.getTag(TAG_UNDROPPABLE)) undroppable = true; + if (item.hasTag(TAG_STATIC_SLOT) && item.getTag(TAG_STATIC_SLOT)) undroppable = true; + + if (undroppable) event.setCancelled(true); + }).addListener(PlayerSwapItemEvent.class, event -> { + var item = event.getOffHandItem(); + boolean unswappable = false; + + if (item.hasTag(TAG_UNDROPPABLE) && item.getTag(TAG_UNDROPPABLE)) unswappable = true; + if (item.hasTag(TAG_STATIC_SLOT) && item.getTag(TAG_STATIC_SLOT)) unswappable = true; + + if (unswappable) event.setCancelled(true); + }).addListener(InventoryPreClickEvent.class, event -> { + var inSlot = event.getClickedItem(); + + if (inSlot.hasTag(TAG_STATIC_SLOT) && inSlot.getTag(TAG_STATIC_SLOT)) { + event.setCancelled(true); + } + }); + } +}