From 71670f0d5054ad7ee0ef6e4917e2bccf90e8ca2f Mon Sep 17 00:00:00 2001 From: paisc Date: Thu, 3 Apr 2025 15:25:27 +0200 Subject: [PATCH] changes --- .../applicationLobby/ApplicationLobby.java | 2 + .../commands/HologramCommand.java | 2 +- .../applicationLobby/phone/AppItem.java | 29 ++++ .../applicationLobby/phone/PhoneItem.java | 19 ++ .../applicationLobby/phone/PhoneManager.java | 164 ++++++++++++++++++ .../phone/items/CommandAppItem.java | 25 +++ .../phone/items/EmptyAppItem.java | 20 +++ .../phone/items/FunctionAppItem.java | 24 +++ .../phone/items/LinkAppItem.java | 35 ++++ .../applicationLobby/util/CharRepo.java | 116 +++++++++++++ .../applicationLobby/util/PlayerUtil.java | 5 + .../util/item/InteractListener.java | 33 ++++ .../util/item/InteractableItem.java | 21 +++ .../util/item/ItemRegistry.java | 20 +++ 14 files changed, 514 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/voltexstudios/applicationLobby/phone/AppItem.java create mode 100644 src/main/java/net/voltexstudios/applicationLobby/phone/PhoneItem.java create mode 100644 src/main/java/net/voltexstudios/applicationLobby/phone/PhoneManager.java create mode 100644 src/main/java/net/voltexstudios/applicationLobby/phone/items/CommandAppItem.java create mode 100644 src/main/java/net/voltexstudios/applicationLobby/phone/items/EmptyAppItem.java create mode 100644 src/main/java/net/voltexstudios/applicationLobby/phone/items/FunctionAppItem.java create mode 100644 src/main/java/net/voltexstudios/applicationLobby/phone/items/LinkAppItem.java create mode 100644 src/main/java/net/voltexstudios/applicationLobby/util/CharRepo.java create mode 100644 src/main/java/net/voltexstudios/applicationLobby/util/item/InteractListener.java create mode 100644 src/main/java/net/voltexstudios/applicationLobby/util/item/InteractableItem.java create mode 100644 src/main/java/net/voltexstudios/applicationLobby/util/item/ItemRegistry.java diff --git a/src/main/java/net/voltexstudios/applicationLobby/ApplicationLobby.java b/src/main/java/net/voltexstudios/applicationLobby/ApplicationLobby.java index 27feeb5..a6389e0 100644 --- a/src/main/java/net/voltexstudios/applicationLobby/ApplicationLobby.java +++ b/src/main/java/net/voltexstudios/applicationLobby/ApplicationLobby.java @@ -12,6 +12,7 @@ import net.voltexstudios.applicationLobby.listener.PlayerListener; import net.voltexstudios.applicationLobby.util.EyeTrace; import net.voltexstudios.applicationLobby.util.SimpleLocation; import net.voltexstudios.applicationLobby.util.SpawnUtil; +import net.voltexstudios.applicationLobby.util.item.InteractListener; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -61,6 +62,7 @@ public final class ApplicationLobby extends JavaPlugin { private void registerListeners() { Bukkit.getPluginManager().registerEvents(new PlayerListener(), this); + Bukkit.getPluginManager().registerEvents(new InteractListener(), this); } private void registerCommands() { diff --git a/src/main/java/net/voltexstudios/applicationLobby/commands/HologramCommand.java b/src/main/java/net/voltexstudios/applicationLobby/commands/HologramCommand.java index ed6a588..765eb23 100644 --- a/src/main/java/net/voltexstudios/applicationLobby/commands/HologramCommand.java +++ b/src/main/java/net/voltexstudios/applicationLobby/commands/HologramCommand.java @@ -102,7 +102,7 @@ public class HologramCommand implements CommandExecutor, TabCompleter { return Arrays.stream(HologramType.values()).toList().stream().map(Enum::name).toList(); } else if (strings[0].equalsIgnoreCase("delete")) { - List hologramNames = HologramService.getInstance().getHolograms().stream().map(Hologram::getName).toList(); + List hologramNames = new java.util.ArrayList<>(HologramService.getInstance().getHolograms().stream().map(Hologram::getName).toList()); hologramNames.add("all"); return hologramNames; } diff --git a/src/main/java/net/voltexstudios/applicationLobby/phone/AppItem.java b/src/main/java/net/voltexstudios/applicationLobby/phone/AppItem.java new file mode 100644 index 0000000..06533cd --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/phone/AppItem.java @@ -0,0 +1,29 @@ +package net.voltexstudios.applicationLobby.phone; + +import org.bukkit.Material; + +import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; +import xyz.xenondevs.invui.item.ItemProvider; +import xyz.xenondevs.invui.item.builder.ItemBuilder; +import xyz.xenondevs.invui.item.impl.AbstractItem; + +import java.util.List; + +public abstract class AppItem extends AbstractItem { + + private final ComponentWrapper name; + private final List lore; + + public AppItem(ComponentWrapper name, ComponentWrapper... lore) { + this.name = name; + this.lore = List.of(lore); + } + + @Override + public ItemProvider getItemProvider() { + return new ItemBuilder(Material.DIAMOND) + .setDisplayName(name) + .setLore(lore) + .setCustomModelData(1); + } +} diff --git a/src/main/java/net/voltexstudios/applicationLobby/phone/PhoneItem.java b/src/main/java/net/voltexstudios/applicationLobby/phone/PhoneItem.java new file mode 100644 index 0000000..2a9c9f7 --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/phone/PhoneItem.java @@ -0,0 +1,19 @@ +package net.voltexstudios.applicationLobby.phone; + +import net.voltexstudios.applicationLobby.util.item.InteractableItem; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +public class PhoneItem extends InteractableItem { + + + public PhoneItem(ItemStack itemStack) { + super(itemStack); + } + + @Override + public void onAction(Player player, PlayerInteractEvent event) { + PhoneManager.getInstance().openGUI(player); + } +} diff --git a/src/main/java/net/voltexstudios/applicationLobby/phone/PhoneManager.java b/src/main/java/net/voltexstudios/applicationLobby/phone/PhoneManager.java new file mode 100644 index 0000000..e7453d7 --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/phone/PhoneManager.java @@ -0,0 +1,164 @@ +package net.voltexstudios.applicationLobby.phone; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.voltexstudios.applicationLobby.phone.items.CommandAppItem; +import net.voltexstudios.applicationLobby.phone.items.EmptyAppItem; +import net.voltexstudios.applicationLobby.phone.items.LinkAppItem; +import net.voltexstudios.applicationLobby.util.CharRepo; +import net.voltexstudios.applicationLobby.util.item.InteractableItem; +import net.voltexstudios.applicationLobby.util.item.ItemRegistry; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import xyz.xenondevs.inventoryaccess.component.AdventureComponentWrapper; +import xyz.xenondevs.invui.gui.Gui; +import xyz.xenondevs.invui.item.ItemProvider; +import xyz.xenondevs.invui.item.builder.ItemBuilder; +import xyz.xenondevs.invui.window.Window; + + +public class PhoneManager { + + private static PhoneManager instance; + private final PhoneItem phoneItem; + + private PhoneManager() { + phoneItem = new PhoneItem( + new ItemBuilder(Material.PAPER) + .setDisplayName(new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("[Handy]"))) + .setCustomModelData(37).get() + ); + + ItemRegistry.registerItem(phoneItem); + } + + public InteractableItem getPhoneItem() { + return phoneItem; + } + + public void openGUI(Player player) { + Window window = Window.split() + .setTitle(CharRepo.getNeg(48) + "§f" + CharRepo.PHONE_GUI) + .setUpperGui(getUpperGui()) + .setLowerGui(getLowerGui()) + .setViewer(player) + .build(); + + window.open(); + } + + private Gui getUpperGui() { + + AppItem applicationPlotItem = new CommandAppItem( + "APPLICATION PLOT COMMAND", + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("ᴘʟᴏᴛ")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Phase I")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Bewirb Dich , Lerne Tips und Tricks,")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Verbessere Dich")), + new AdventureComponentWrapper(Component.empty()), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Klicke um zu Starten")) + ); + + AppItem trialPlotItem = new CommandAppItem( + "TRIAL PLOT COMMAND", + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("ᴛʀɪᴀʟ")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Phase II")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Suche dir eines von 3 Themen aus und")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("setze dieses in 7 Tagen um!")), + new AdventureComponentWrapper(Component.empty()), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Klicke zum Starten")) + ); + + AppItem tutorialItem = new EmptyAppItem( + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("ᴛᴜᴛᴏʀɪᴀʟ")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Hier lernst du alle wichtigen Schritte ")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("zum Bauen eines Plots kennen!")), + new AdventureComponentWrapper(Component.empty()), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Coming Soon!")) + ); + + AppItem mailItem = new CommandAppItem( + "MAIL COMMAND", + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("ᴍᴀɪʟ")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Hier erhältst du deine Bewertungen und Tipps!")), + new AdventureComponentWrapper(Component.empty()), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Klicke um dein Postfach zu öffnen")) + ); + + return Gui.normal() + .setStructure( + "x x x x x x x x x", + "x o o o x y y y x", + "x o o o x y y y x", + "x x x x x x x x x", + "x z z z x s s s x", + "x z z z x s s s x" + ) + .addIngredient('o', applicationPlotItem) + .addIngredient('y', trialPlotItem) + .addIngredient('z', tutorialItem) + .addIngredient('s', mailItem) + .build(); + } + + private Gui getLowerGui() { + + AppItem gamesItem = new EmptyAppItem( + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("ɢᴀᴍᴇѕ")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Überbrücke Wartezeit und spiele MiniGames")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("mit deinen Freunden!")), + new AdventureComponentWrapper(Component.empty()), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Coming Soon!")) + ); + + AppItem settingsItem = new EmptyAppItem( + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("ѕᴇᴛᴛɪɴɢѕ")), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Hier kannst du deine Settings umstellen!")), + new AdventureComponentWrapper(Component.empty()), + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("Coming Soon!")) + ); + + AppItem twitterItem = new LinkAppItem( + "https://x.com/Voltexstudio", + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("ᴛᴡɪᴛᴛᴇʀ")) + ); + + AppItem instagramItem = new LinkAppItem( + "https://www.instagram.com/voltex.studios/", + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("ɪɴѕᴛᴀɢʀᴀᴍ")) + ); + + AppItem tiktokItem = new LinkAppItem( + "https://www.tiktok.com/@voltexstudiosofficial", + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("ᴛɪᴋᴛᴏᴋ")) + ); + + AppItem youtubeItem = new LinkAppItem( + "https://www.youtube.com/@VoltexStudio", + new AdventureComponentWrapper(MiniMessage.miniMessage().deserialize("ʏᴏᴜᴛᴜʙᴇ")) + ); + + return Gui.normal() + .setStructure( + "x f f f x g g g x", + "x f f f x g g g x", + "x x x x x x x x x", + "x a x b x c x d x" + ) + .addIngredient('f', gamesItem) + .addIngredient('g', settingsItem) + .addIngredient('a', twitterItem) + .addIngredient('b', instagramItem) + .addIngredient('c', tiktokItem) + .addIngredient('d', youtubeItem) + .build(); + } + + public static PhoneManager getInstance() { + if(instance == null) { + instance = new PhoneManager(); + } + return instance; + } +} diff --git a/src/main/java/net/voltexstudios/applicationLobby/phone/items/CommandAppItem.java b/src/main/java/net/voltexstudios/applicationLobby/phone/items/CommandAppItem.java new file mode 100644 index 0000000..dccf2f3 --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/phone/items/CommandAppItem.java @@ -0,0 +1,25 @@ +package net.voltexstudios.applicationLobby.phone.items; + +import net.voltexstudios.applicationLobby.phone.AppItem; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.jetbrains.annotations.NotNull; +import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; + +public class CommandAppItem extends AppItem { + + private final String command; + + public CommandAppItem(String command, ComponentWrapper name, ComponentWrapper... lore) { + super(name, lore); + this.command = command; + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent inventoryClickEvent) { + //TODO: Implement command execution + player.sendMessage(command); + player.closeInventory(); + } +} diff --git a/src/main/java/net/voltexstudios/applicationLobby/phone/items/EmptyAppItem.java b/src/main/java/net/voltexstudios/applicationLobby/phone/items/EmptyAppItem.java new file mode 100644 index 0000000..c696a52 --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/phone/items/EmptyAppItem.java @@ -0,0 +1,20 @@ +package net.voltexstudios.applicationLobby.phone.items; + +import net.voltexstudios.applicationLobby.phone.AppItem; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.jetbrains.annotations.NotNull; +import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; + +public class EmptyAppItem extends AppItem { + + public EmptyAppItem(ComponentWrapper name, ComponentWrapper... lore) { + super(name, lore); + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent inventoryClickEvent) { + // Do nothing + } +} diff --git a/src/main/java/net/voltexstudios/applicationLobby/phone/items/FunctionAppItem.java b/src/main/java/net/voltexstudios/applicationLobby/phone/items/FunctionAppItem.java new file mode 100644 index 0000000..2f7714c --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/phone/items/FunctionAppItem.java @@ -0,0 +1,24 @@ +package net.voltexstudios.applicationLobby.phone.items; + +import net.voltexstudios.applicationLobby.phone.AppItem; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.jetbrains.annotations.NotNull; +import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; + +public class FunctionAppItem extends AppItem { + + private final Runnable function; + + public FunctionAppItem(Runnable function, ComponentWrapper name, ComponentWrapper... lore) { + super(name, lore); + this.function = function; + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent inventoryClickEvent) { + this.function.run(); + player.closeInventory(); + } +} diff --git a/src/main/java/net/voltexstudios/applicationLobby/phone/items/LinkAppItem.java b/src/main/java/net/voltexstudios/applicationLobby/phone/items/LinkAppItem.java new file mode 100644 index 0000000..b004e70 --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/phone/items/LinkAppItem.java @@ -0,0 +1,35 @@ +package net.voltexstudios.applicationLobby.phone.items; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.voltexstudios.applicationLobby.ApplicationLobby; +import net.voltexstudios.applicationLobby.phone.AppItem; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.jetbrains.annotations.NotNull; +import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; + +public class LinkAppItem extends AppItem { + + private final String link; + + public LinkAppItem(String link, ComponentWrapper name, ComponentWrapper... lore) { + super(name, lore); + this.link = link; + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent inventoryClickEvent) { + Component clickableMessage = ApplicationLobby.PREFIX.append( + Component.text("Klicke hier, um die Webseite zu öffnen!") + .color(NamedTextColor.RED) + .clickEvent(ClickEvent.openUrl(link)) + .hoverEvent(Component.text("Öffne die Webseite im Browser")) + ); + + player.sendMessage(clickableMessage); + player.closeInventory(); + } +} diff --git a/src/main/java/net/voltexstudios/applicationLobby/util/CharRepo.java b/src/main/java/net/voltexstudios/applicationLobby/util/CharRepo.java new file mode 100644 index 0000000..ff38034 --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/util/CharRepo.java @@ -0,0 +1,116 @@ +package net.voltexstudios.applicationLobby.util; + +public enum CharRepo { + + //Spacing Characters + NEG1("\uF801"), + NEG2("\uF802"), + NEG4("\uF804"), + NEG8("\uF808"), + NEG16("\uF809"), + NEG32("\uF80A"), + NEG64("\uF80B"), + NEG128("\uF80C"), + NEG256("\uF80D"), + NEG512("\uF80E"), + NEG1024("\uF80F"), + + POS1("\uF821"), + POS2("\uF822"), + POS4("\uF824"), + POS8("\uF828"), + POS16("\uF829"), + POS32("\uF82A"), + POS64("\uF82B"), + POS128("\uF82C"), + POS256("\uF82D"), + POS512("\uF82E"), + POS1024("\uF82F"), + + + /** + * GUI + */ + PHONE_GUI("\uE20A"); + + + public final String literal; + CharRepo(String literal){ + this.literal = literal; + } + + @Override + public String toString(){ + return this.literal; + } + + private enum SpacingCharacters{ + NEG1(-1, CharRepo.NEG1), + NEG2(-2, CharRepo.NEG2), + NEG4(-4, CharRepo.NEG4), + NEG8(-8, CharRepo.NEG8), + NEG16(-16, CharRepo.NEG16), + NEG32(-32, CharRepo.NEG32), + NEG64(-64, CharRepo.NEG64), + NEG128(-128, CharRepo.NEG128), + NEG256(-256, CharRepo.NEG256), + NEG512(-512, CharRepo.NEG512), + NEG1024(-1024, CharRepo.NEG1024), + + POS1(1, CharRepo.POS1), + POS2(2, CharRepo.POS2), + POS4(4, CharRepo.POS4), + POS8(8, CharRepo.POS8), + POS16(16, CharRepo.POS16), + POS32(32, CharRepo.POS32), + POS64(64, CharRepo.POS64), + POS128(128, CharRepo.POS128), + POS256(256, CharRepo.POS256), + POS512(512, CharRepo.POS512), + POS1024(1024, CharRepo.POS1024); + + private final int weight; + private final CharRepo charRef; + + SpacingCharacters(int weight, CharRepo charRef){ + this.weight = weight; + this.charRef = charRef; + } + } + + public static CharRepo getCharacterByWeight(int weight){ + for(SpacingCharacters ch : SpacingCharacters.values()){ + if(ch.weight == weight) + return ch.charRef; + } + return null; + } + + public static String getSpacing(int pixelAmount){ + //convert amount to binary string + String binary = new StringBuilder(Integer.toBinaryString(Math.abs(pixelAmount))).reverse().toString(); + StringBuilder sb = new StringBuilder(); + char[] chArr = binary.toCharArray(); + for(int index = 0; index < chArr.length; index++){ + char ch = chArr[index]; + if(ch == '0') continue; + + int weight = (int)Math.pow(2, index); + //if we are getting negative, flip weight + weight = pixelAmount < 0 ? -weight : weight; + CharRepo ref = getCharacterByWeight(weight); + + if(ref != null) + sb.append(ref.literal); + } + return sb.toString(); + } + + public static String getNeg(int pixelAmount){ + return getSpacing(-Math.abs(pixelAmount)); + } + + public static String getPos(int pixelAmount){ + return getSpacing(Math.abs(pixelAmount)); + } +} diff --git a/src/main/java/net/voltexstudios/applicationLobby/util/PlayerUtil.java b/src/main/java/net/voltexstudios/applicationLobby/util/PlayerUtil.java index e78a0fa..270157a 100644 --- a/src/main/java/net/voltexstudios/applicationLobby/util/PlayerUtil.java +++ b/src/main/java/net/voltexstudios/applicationLobby/util/PlayerUtil.java @@ -2,6 +2,7 @@ package net.voltexstudios.applicationLobby.util; import net.voltexstudios.applicationLobby.ApplicationLobby; import net.voltexstudios.applicationLobby.holograms.HologramService; +import net.voltexstudios.applicationLobby.phone.PhoneManager; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; @@ -44,6 +45,7 @@ public final class PlayerUtil { } private static void giveLobbyItems(Player player) { + player.getInventory().clear(); //give invisible offhand item ItemStack offHand = new ItemStack(Material.DIAMOND); @@ -52,6 +54,9 @@ public final class PlayerUtil { offHand.setItemMeta(meta); player.getInventory().setItem(EquipmentSlot.OFF_HAND, offHand); + //give phone + player.getInventory().setItem(0, PhoneManager.getInstance().getPhoneItem().getItemStack()); + player.updateInventory(); } diff --git a/src/main/java/net/voltexstudios/applicationLobby/util/item/InteractListener.java b/src/main/java/net/voltexstudios/applicationLobby/util/item/InteractListener.java new file mode 100644 index 0000000..32ece21 --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/util/item/InteractListener.java @@ -0,0 +1,33 @@ +package net.voltexstudios.applicationLobby.util.item; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; + +public class InteractListener implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onInteract(PlayerInteractEvent event) { + Player player = event.getPlayer(); + + InteractableItem item = ItemRegistry.getItem(event.getItem()); + if(item != null) { + item.onAction(player, event); + event.setCancelled(true); + } + } + + @EventHandler + public void onSwitchHand(PlayerSwapHandItemsEvent event) { + Player player = event.getPlayer(); + + InteractableItem mainItem = ItemRegistry.getItem(event.getMainHandItem()); + if(mainItem != null) { + event.setCancelled(true); + } + } + +} diff --git a/src/main/java/net/voltexstudios/applicationLobby/util/item/InteractableItem.java b/src/main/java/net/voltexstudios/applicationLobby/util/item/InteractableItem.java new file mode 100644 index 0000000..42b4145 --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/util/item/InteractableItem.java @@ -0,0 +1,21 @@ +package net.voltexstudios.applicationLobby.util.item; + +import lombok.Getter; +import lombok.Setter; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +@Getter +@Setter +public abstract class InteractableItem { + + public ItemStack itemStack; + + public InteractableItem(ItemStack itemStack) { + this.itemStack = itemStack; + } + + public abstract void onAction(Player player, PlayerInteractEvent event); + +} diff --git a/src/main/java/net/voltexstudios/applicationLobby/util/item/ItemRegistry.java b/src/main/java/net/voltexstudios/applicationLobby/util/item/ItemRegistry.java new file mode 100644 index 0000000..8624473 --- /dev/null +++ b/src/main/java/net/voltexstudios/applicationLobby/util/item/ItemRegistry.java @@ -0,0 +1,20 @@ +package net.voltexstudios.applicationLobby.util.item; + +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class ItemRegistry { + + private static final List items = new ArrayList<>(); + + public static InteractableItem getItem(ItemStack itemStack) { + return items.stream().filter(item -> item.getItemStack().equals(itemStack)).findFirst().orElse(null); + } + + public static void registerItem(InteractableItem item) { + items.add(item); + } + +}