mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-25 23:53:44 +02:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			world-stat
			...
			feat/v7/gu
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 803b53f020 | ||
|   | dca9ec385f | ||
|   | 7cb5df6253 | 
| @@ -28,6 +28,7 @@ package com.plotsquared.bukkit.inject; | |||||||
| import com.google.inject.AbstractModule; | import com.google.inject.AbstractModule; | ||||||
| import com.google.inject.Provides; | import com.google.inject.Provides; | ||||||
| import com.google.inject.Singleton; | import com.google.inject.Singleton; | ||||||
|  | import com.google.inject.TypeLiteral; | ||||||
| import com.google.inject.assistedinject.FactoryModuleBuilder; | import com.google.inject.assistedinject.FactoryModuleBuilder; | ||||||
| import com.plotsquared.bukkit.BukkitPlatform; | import com.plotsquared.bukkit.BukkitPlatform; | ||||||
| import com.plotsquared.bukkit.listener.SingleWorldListener; | import com.plotsquared.bukkit.listener.SingleWorldListener; | ||||||
| @@ -43,6 +44,8 @@ import com.plotsquared.bukkit.util.BukkitSetupUtils; | |||||||
| import com.plotsquared.bukkit.util.BukkitUtil; | import com.plotsquared.bukkit.util.BukkitUtil; | ||||||
| import com.plotsquared.bukkit.util.fawe.FaweRegionManager; | import com.plotsquared.bukkit.util.fawe.FaweRegionManager; | ||||||
| import com.plotsquared.bukkit.util.fawe.FaweSchematicHandler; | import com.plotsquared.bukkit.util.fawe.FaweSchematicHandler; | ||||||
|  | import com.plotsquared.bukkit.util.gui.BukkitPlotInventory; | ||||||
|  | import com.plotsquared.bukkit.util.gui.BukkitPlotInventoryProvider; | ||||||
| import com.plotsquared.core.PlotPlatform; | import com.plotsquared.core.PlotPlatform; | ||||||
| import com.plotsquared.core.PlotSquared; | import com.plotsquared.core.PlotSquared; | ||||||
| import com.plotsquared.core.configuration.Settings; | import com.plotsquared.core.configuration.Settings; | ||||||
| @@ -70,6 +73,7 @@ import com.plotsquared.core.util.RegionManager; | |||||||
| import com.plotsquared.core.util.SchematicHandler; | import com.plotsquared.core.util.SchematicHandler; | ||||||
| import com.plotsquared.core.util.SetupUtils; | import com.plotsquared.core.util.SetupUtils; | ||||||
| import com.plotsquared.core.util.WorldUtil; | import com.plotsquared.core.util.WorldUtil; | ||||||
|  | import com.plotsquared.core.util.gui.PlotInventoryProvider; | ||||||
| import com.sk89q.worldedit.bukkit.WorldEditPlugin; | import com.sk89q.worldedit.bukkit.WorldEditPlugin; | ||||||
| import com.sk89q.worldedit.extension.platform.Actor; | import com.sk89q.worldedit.extension.platform.Actor; | ||||||
| import org.apache.logging.log4j.LogManager; | import org.apache.logging.log4j.LogManager; | ||||||
| @@ -103,6 +107,7 @@ public class BukkitModule extends AbstractModule { | |||||||
|         bind(InventoryUtil.class).to(BukkitInventoryUtil.class); |         bind(InventoryUtil.class).to(BukkitInventoryUtil.class); | ||||||
|         bind(SetupUtils.class).to(BukkitSetupUtils.class); |         bind(SetupUtils.class).to(BukkitSetupUtils.class); | ||||||
|         bind(WorldUtil.class).to(BukkitUtil.class); |         bind(WorldUtil.class).to(BukkitUtil.class); | ||||||
|  |         bind(new TypeLiteral<PlotInventoryProvider<?, ?>>(){}).to(BukkitPlotInventoryProvider.class); | ||||||
|         install(new FactoryModuleBuilder() |         install(new FactoryModuleBuilder() | ||||||
|                 .implement(ProgressSubscriber.class, DefaultProgressSubscriber.class) |                 .implement(ProgressSubscriber.class, DefaultProgressSubscriber.class) | ||||||
|                 .build(ProgressSubscriberFactory.class)); |                 .build(ProgressSubscriberFactory.class)); | ||||||
|   | |||||||
| @@ -364,6 +364,11 @@ public class BukkitPlayer extends PlotPlayer<Player> { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void closeInventory() { | ||||||
|  |         this.player.closeInventory(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Convert from PlotSquared's {@link TeleportCause} to Bukkit's {@link PlayerTeleportEvent.TeleportCause} |      * Convert from PlotSquared's {@link TeleportCause} to Bukkit's {@link PlayerTeleportEvent.TeleportCause} | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -0,0 +1,170 @@ | |||||||
|  | /* | ||||||
|  |  *       _____  _       _    _____                                _ | ||||||
|  |  *      |  __ \| |     | |  / ____|                              | | | ||||||
|  |  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||||
|  |  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||||
|  |  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||||
|  |  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||||
|  |  *                                    | | | ||||||
|  |  *                                    |_| | ||||||
|  |  *            PlotSquared plot management system for Minecraft | ||||||
|  |  *               Copyright (C) 2014 - 2022 IntellectualSites | ||||||
|  |  * | ||||||
|  |  *     This program is free software: you can redistribute it and/or modify | ||||||
|  |  *     it under the terms of the GNU General Public License as published by | ||||||
|  |  *     the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *     (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *     This program is distributed in the hope that it will be useful, | ||||||
|  |  *     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *     GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *     You should have received a copy of the GNU General Public License | ||||||
|  |  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.bukkit.util.gui; | ||||||
|  |  | ||||||
|  | import com.google.common.base.Preconditions; | ||||||
|  | import com.plotsquared.bukkit.BukkitPlatform; | ||||||
|  | import com.plotsquared.bukkit.util.BukkitUtil; | ||||||
|  | import com.plotsquared.core.PlotSquared; | ||||||
|  | import com.plotsquared.core.configuration.caption.Caption; | ||||||
|  | import com.plotsquared.core.player.PlotPlayer; | ||||||
|  | import com.plotsquared.core.plot.PlotItemStack; | ||||||
|  | import com.plotsquared.core.util.gui.PlotInventory; | ||||||
|  | import com.plotsquared.core.util.gui.PlotInventoryClickHandler; | ||||||
|  | import com.sk89q.worldedit.bukkit.BukkitAdapter; | ||||||
|  | import net.kyori.adventure.text.Component; | ||||||
|  | import net.kyori.adventure.text.minimessage.MiniMessage; | ||||||
|  | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
|  | import org.bukkit.Bukkit; | ||||||
|  | import org.bukkit.Material; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.event.Listener; | ||||||
|  | import org.bukkit.inventory.Inventory; | ||||||
|  | import org.bukkit.inventory.ItemStack; | ||||||
|  | import org.bukkit.inventory.meta.ItemMeta; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.UUID; | ||||||
|  | import java.util.WeakHashMap; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Implementation of the {@link PlotInventory} for the bukkit platform. | ||||||
|  |  */ | ||||||
|  | public class BukkitPlotInventory extends PlotInventory<Player, ItemStack> { | ||||||
|  |  | ||||||
|  |     private static Listener INVENTORY_LISTENER; | ||||||
|  |     private static final Map<UUID, BukkitPlotInventory> INVENTORIES = new WeakHashMap<>(); | ||||||
|  |  | ||||||
|  |     private final ItemStack[] items; | ||||||
|  |     final PlotInventoryClickHandler[] clickHandlers; | ||||||
|  |     Inventory nativeInventory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * {@inheritDoc} | ||||||
|  |      */ | ||||||
|  |     protected BukkitPlotInventory( | ||||||
|  |             PlotPlayer<Player> player, final int size, final Caption titleCaption, | ||||||
|  |             final TagResolver... titleResolvers | ||||||
|  |     ) { | ||||||
|  |         super(player, size, titleCaption, titleResolvers); | ||||||
|  |         this.items = new ItemStack[size]; | ||||||
|  |         this.clickHandlers = new PlotInventoryClickHandler[size]; | ||||||
|  |         this.nativeInventory = Bukkit.createInventory(player.getPlatformPlayer(), size(), | ||||||
|  |                 BukkitUtil.LEGACY_COMPONENT_SERIALIZER.serialize(MiniMessage.miniMessage().deserialize( | ||||||
|  |                         titleCaption().getComponent(player), titleResolvers() | ||||||
|  |                 )) | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         if (INVENTORY_LISTENER == null) { | ||||||
|  |             INVENTORY_LISTENER = new BukkitPlotInventoryListener(INVENTORIES); | ||||||
|  |             BukkitPlatform bukkitPlatform = ((BukkitPlatform) PlotSquared.platform()); | ||||||
|  |             bukkitPlatform.getServer().getPluginManager().registerEvents(INVENTORY_LISTENER, bukkitPlatform); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void setItem(final int slot, final PlotItemStack item, final PlotInventoryClickHandler onClick) { | ||||||
|  |         Preconditions.checkElementIndex(slot, size(), "Slot must be in range (0, " + size() + ")"); | ||||||
|  |         this.items[slot] = toPlatformItem(item); | ||||||
|  |         this.clickHandlers[slot] = onClick; | ||||||
|  |         this.nativeInventory.setItem(slot, this.items[slot]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void addItem(final PlotItemStack item, final PlotInventoryClickHandler onClick) { | ||||||
|  |         // TODO: probably needs more love (who doesn't) | ||||||
|  |         int slot = -1; | ||||||
|  |         // try to fill stacks | ||||||
|  |         for (int i = 0; i < items.length; i++) { | ||||||
|  |             if (Objects.equals(items[i], toPlatformItem(item))) { | ||||||
|  |                 slot = i; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         // search for empty slots | ||||||
|  |         if (slot == -1) { | ||||||
|  |             for (int i = 0; i < items.length; i++) { | ||||||
|  |                 if (items[i] == null || items[i].getType() == Material.AIR) { | ||||||
|  |                     slot = i; | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         Preconditions.checkElementIndex(slot, size()); | ||||||
|  |         this.items[slot] = toPlatformItem(item); | ||||||
|  |         this.clickHandlers[slot] = onClick; | ||||||
|  |         this.nativeInventory.setItem(slot, this.items[slot]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void open() { | ||||||
|  |         INVENTORIES.put(player().getUUID(), this); | ||||||
|  |         player().getPlatformPlayer().openInventory(this.nativeInventory); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void close() { | ||||||
|  |         if (Objects.equals(player().getPlatformPlayer().getOpenInventory().getTopInventory(), this.nativeInventory)) { | ||||||
|  |             player().getPlatformPlayer().closeInventory(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public ItemStack toPlatformItem(final PlotItemStack item) { | ||||||
|  |         if (item == null) { | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |         Material material = BukkitAdapter.adapt(item.getType()); | ||||||
|  |         if (material == null) { | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |         ItemStack stack = new ItemStack(material, item.getAmount()); | ||||||
|  |         ItemMeta meta = null; | ||||||
|  |         if (item.getName() != null) { | ||||||
|  |             meta = stack.getItemMeta(); | ||||||
|  |             Component nameComponent = BukkitUtil.MINI_MESSAGE.deserialize(item.getName()); | ||||||
|  |             meta.setDisplayName(BukkitUtil.LEGACY_COMPONENT_SERIALIZER.serialize(nameComponent)); | ||||||
|  |         } | ||||||
|  |         if (item.getLore() != null) { | ||||||
|  |             if (meta == null) { | ||||||
|  |                 meta = stack.getItemMeta(); | ||||||
|  |             } | ||||||
|  |             List<String> lore = new ArrayList<>(); | ||||||
|  |             for (String entry : item.getLore()) { | ||||||
|  |                 lore.add(BukkitUtil.LEGACY_COMPONENT_SERIALIZER.serialize(BukkitUtil.MINI_MESSAGE.deserialize(entry))); | ||||||
|  |             } | ||||||
|  |             meta.setLore(lore); | ||||||
|  |         } | ||||||
|  |         if (meta != null) { | ||||||
|  |             stack.setItemMeta(meta); | ||||||
|  |         } | ||||||
|  |         return stack; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,112 @@ | |||||||
|  | /* | ||||||
|  |  *       _____  _       _    _____                                _ | ||||||
|  |  *      |  __ \| |     | |  / ____|                              | | | ||||||
|  |  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||||
|  |  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||||
|  |  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||||
|  |  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||||
|  |  *                                    | | | ||||||
|  |  *                                    |_| | ||||||
|  |  *            PlotSquared plot management system for Minecraft | ||||||
|  |  *               Copyright (C) 2014 - 2022 IntellectualSites | ||||||
|  |  * | ||||||
|  |  *     This program is free software: you can redistribute it and/or modify | ||||||
|  |  *     it under the terms of the GNU General Public License as published by | ||||||
|  |  *     the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *     (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *     This program is distributed in the hope that it will be useful, | ||||||
|  |  *     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *     GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *     You should have received a copy of the GNU General Public License | ||||||
|  |  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.bukkit.util.gui; | ||||||
|  |  | ||||||
|  | import com.plotsquared.bukkit.util.BukkitUtil; | ||||||
|  | import com.plotsquared.core.player.PlotPlayer; | ||||||
|  | import com.plotsquared.core.plot.PlotItemStack; | ||||||
|  | import com.plotsquared.core.util.gui.PlotInventoryClickHandler; | ||||||
|  | import com.plotsquared.core.util.gui.PlotInventoryClickType; | ||||||
|  | import com.sk89q.worldedit.bukkit.BukkitAdapter; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.event.EventHandler; | ||||||
|  | import org.bukkit.event.Listener; | ||||||
|  | import org.bukkit.event.inventory.ClickType; | ||||||
|  | import org.bukkit.event.inventory.InventoryCloseEvent; | ||||||
|  | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
|  | import java.util.EnumMap; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.UUID; | ||||||
|  |  | ||||||
|  | public class BukkitPlotInventoryListener implements Listener { | ||||||
|  |  | ||||||
|  |     private static final EnumMap<ClickType, PlotInventoryClickType> CLICK_MAPPING = new EnumMap<>(ClickType.class); | ||||||
|  |  | ||||||
|  |     static { | ||||||
|  |         CLICK_MAPPING.put(ClickType.LEFT, PlotInventoryClickType.LEFT); | ||||||
|  |         CLICK_MAPPING.put(ClickType.RIGHT, PlotInventoryClickType.RIGHT); | ||||||
|  |         CLICK_MAPPING.put(ClickType.SHIFT_LEFT, PlotInventoryClickType.SHIFT_LEFT); | ||||||
|  |         CLICK_MAPPING.put(ClickType.SHIFT_RIGHT, PlotInventoryClickType.SHIFT_RIGHT); | ||||||
|  |         CLICK_MAPPING.put(ClickType.MIDDLE, PlotInventoryClickType.MIDDLE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private final Map<UUID, BukkitPlotInventory> inventories; | ||||||
|  |  | ||||||
|  |     public BukkitPlotInventoryListener(final Map<UUID, BukkitPlotInventory> inventories) { | ||||||
|  |         this.inventories = inventories; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @EventHandler | ||||||
|  |     public void onInventoryClick(final org.bukkit.event.inventory.InventoryClickEvent event) { | ||||||
|  |         final PlotPlayer<Player> player = BukkitUtil.adapt((Player) event.getWhoClicked()); | ||||||
|  |  | ||||||
|  |         BukkitPlotInventory currentInventory = inventories.get(player.getUUID()); | ||||||
|  |         if (currentInventory == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (!Objects.equals(event.getClickedInventory(), currentInventory.nativeInventory)) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         final int slot = event.getRawSlot(); | ||||||
|  |         if (slot < 0 || slot >= currentInventory.size()) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         PlotInventoryClickType clickType = CLICK_MAPPING.getOrDefault(event.getClick(), PlotInventoryClickType.OTHER); | ||||||
|  |         event.setCancelled(true); | ||||||
|  |  | ||||||
|  |         final PlotInventoryClickHandler clickHandler = currentInventory.clickHandlers[slot]; | ||||||
|  |         if (clickHandler == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         final ItemStack item = event.getCurrentItem(); | ||||||
|  |         if (item == null) { | ||||||
|  |             clickHandler.handle(null, clickType); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         clickHandler.handle(new PlotItemStack( | ||||||
|  |                 BukkitAdapter.asItemType(item.getType()), | ||||||
|  |                 item.getAmount(), | ||||||
|  |                 item.getItemMeta().getDisplayName(), | ||||||
|  |                 item.getItemMeta().hasLore() ? item.getItemMeta().getLore().toArray(String[]::new) : new String[0] | ||||||
|  |         ), clickType); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @EventHandler | ||||||
|  |     public void onInventoryClose(InventoryCloseEvent event) { | ||||||
|  |         final PlotPlayer<Player> player = BukkitUtil.adapt((Player) event.getPlayer()); | ||||||
|  |         BukkitPlotInventory currentInventory = inventories.get(player.getUUID()); | ||||||
|  |         if (currentInventory == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         currentInventory.nativeInventory = null; | ||||||
|  |         inventories.remove(player.getUUID()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,48 @@ | |||||||
|  | /* | ||||||
|  |  *       _____  _       _    _____                                _ | ||||||
|  |  *      |  __ \| |     | |  / ____|                              | | | ||||||
|  |  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||||
|  |  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||||
|  |  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||||
|  |  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||||
|  |  *                                    | | | ||||||
|  |  *                                    |_| | ||||||
|  |  *            PlotSquared plot management system for Minecraft | ||||||
|  |  *               Copyright (C) 2014 - 2022 IntellectualSites | ||||||
|  |  * | ||||||
|  |  *     This program is free software: you can redistribute it and/or modify | ||||||
|  |  *     it under the terms of the GNU General Public License as published by | ||||||
|  |  *     the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *     (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *     This program is distributed in the hope that it will be useful, | ||||||
|  |  *     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *     GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *     You should have received a copy of the GNU General Public License | ||||||
|  |  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.bukkit.util.gui; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.configuration.caption.Caption; | ||||||
|  | import com.plotsquared.core.player.PlotPlayer; | ||||||
|  | import com.plotsquared.core.util.gui.PlotInventory; | ||||||
|  | import com.plotsquared.core.util.gui.PlotInventoryProvider; | ||||||
|  | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
|  | public class BukkitPlotInventoryProvider implements PlotInventoryProvider<Player, ItemStack> { | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public PlotInventory<Player, ItemStack> createInventory( | ||||||
|  |             PlotPlayer<?> player, | ||||||
|  |             final int size, | ||||||
|  |             final Caption titleCaption, | ||||||
|  |             final TagResolver... titleResolvers | ||||||
|  |     ) { | ||||||
|  |         return new BukkitPlotInventory((PlotPlayer<Player>) player, size, titleCaption, titleResolvers); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -27,32 +27,18 @@ package com.plotsquared.core.command; | |||||||
|  |  | ||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
| import com.plotsquared.core.configuration.caption.TranslatableCaption; | import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||||
| import com.plotsquared.core.events.PlotFlagAddEvent; | import com.plotsquared.core.gui.PlotMusicInventory; | ||||||
| import com.plotsquared.core.events.PlotFlagRemoveEvent; |  | ||||||
| import com.plotsquared.core.events.Result; |  | ||||||
| import com.plotsquared.core.location.Location; | import com.plotsquared.core.location.Location; | ||||||
| import com.plotsquared.core.permissions.Permission; | import com.plotsquared.core.permissions.Permission; | ||||||
| import com.plotsquared.core.player.PlotPlayer; | import com.plotsquared.core.player.PlotPlayer; | ||||||
| import com.plotsquared.core.plot.Plot; | import com.plotsquared.core.plot.Plot; | ||||||
| import com.plotsquared.core.plot.PlotInventory; |  | ||||||
| import com.plotsquared.core.plot.PlotItemStack; |  | ||||||
| import com.plotsquared.core.plot.flag.PlotFlag; |  | ||||||
| import com.plotsquared.core.plot.flag.implementations.MusicFlag; |  | ||||||
| import com.plotsquared.core.util.EventDispatcher; | import com.plotsquared.core.util.EventDispatcher; | ||||||
| import com.plotsquared.core.util.InventoryUtil; |  | ||||||
| import com.plotsquared.core.util.Permissions; | import com.plotsquared.core.util.Permissions; | ||||||
| import com.sk89q.worldedit.world.item.ItemType; | import com.plotsquared.core.util.gui.PlotInventoryProvider; | ||||||
| import com.sk89q.worldedit.world.item.ItemTypes; |  | ||||||
| import net.kyori.adventure.text.Component; |  | ||||||
| import net.kyori.adventure.text.minimessage.tag.Tag; | import net.kyori.adventure.text.minimessage.tag.Tag; | ||||||
| import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
| import org.checkerframework.checker.nullness.qual.NonNull; | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
| import javax.annotation.Nullable; |  | ||||||
| import java.util.Arrays; |  | ||||||
| import java.util.Collection; |  | ||||||
| import java.util.Locale; |  | ||||||
|  |  | ||||||
| @CommandDeclaration(command = "music", | @CommandDeclaration(command = "music", | ||||||
|         permission = "plots.music", |         permission = "plots.music", | ||||||
|         usage = "/plot music", |         usage = "/plot music", | ||||||
| @@ -60,20 +46,16 @@ import java.util.Locale; | |||||||
|         requiredType = RequiredType.PLAYER) |         requiredType = RequiredType.PLAYER) | ||||||
| public class Music extends SubCommand { | public class Music extends SubCommand { | ||||||
|  |  | ||||||
|     private static final Collection<String> DISCS = Arrays |  | ||||||
|             .asList("music_disc_13", "music_disc_cat", "music_disc_blocks", "music_disc_chirp", |  | ||||||
|                     "music_disc_far", "music_disc_mall", "music_disc_mellohi", "music_disc_stal", |  | ||||||
|                     "music_disc_strad", "music_disc_ward", "music_disc_11", "music_disc_wait", "music_disc_otherside", |  | ||||||
|                     "music_disc_pigstep" |  | ||||||
|             ); |  | ||||||
|  |  | ||||||
|     private final InventoryUtil inventoryUtil; |  | ||||||
|     private final EventDispatcher eventDispatcher; |     private final EventDispatcher eventDispatcher; | ||||||
|  |     private final PlotInventoryProvider<?, ?> inventoryProvider; | ||||||
|  |  | ||||||
|     @Inject |     @Inject | ||||||
|     public Music(final @Nullable InventoryUtil inventoryUtil, final @NonNull EventDispatcher eventDispatcher) { |     public Music( | ||||||
|         this.inventoryUtil = inventoryUtil; |             final @NonNull EventDispatcher eventDispatcher, | ||||||
|  |             final PlotInventoryProvider<?, ?> inventoryProvider | ||||||
|  |     ) { | ||||||
|         this.eventDispatcher = eventDispatcher; |         this.eventDispatcher = eventDispatcher; | ||||||
|  |         this.inventoryProvider = inventoryProvider; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -99,85 +81,8 @@ public class Music extends SubCommand { | |||||||
|             ); |             ); | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
|         PlotInventory inv = new PlotInventory( |  | ||||||
|                 this.inventoryUtil, |  | ||||||
|                 player, |  | ||||||
|                 2, |  | ||||||
|                 TranslatableCaption.of("plotjukebox.jukebox_header").getComponent(player) |  | ||||||
|         ) { |  | ||||||
|             @Override |  | ||||||
|             public boolean onClick(int index) { |  | ||||||
|                 PlotItemStack item = getItem(index); |  | ||||||
|                 if (item == null) { |  | ||||||
|                     return true; |  | ||||||
|                 } |  | ||||||
|                 if (item.getType() == ItemTypes.BEDROCK) { |  | ||||||
|                     PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class) |  | ||||||
|                             .createFlagInstance(item.getType()); |  | ||||||
|                     PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(plotFlag, plot); |  | ||||||
|                     if (event.getEventResult() == Result.DENY) { |  | ||||||
|                         getPlayer().sendMessage( |  | ||||||
|                                 TranslatableCaption.of("events.event_denied"), |  | ||||||
|                                 TagResolver.resolver("value", Tag.inserting(Component.text("Music removal"))) |  | ||||||
|                         ); |  | ||||||
|                         return true; |  | ||||||
|                     } |  | ||||||
|                     plot.removeFlag(event.getFlag()); |  | ||||||
|                     getPlayer().sendMessage( |  | ||||||
|                             TranslatableCaption.of("flag.flag_removed"), |  | ||||||
|                             TagResolver.builder() |  | ||||||
|                                     .tag("flag", Tag.inserting(Component.text("music"))) |  | ||||||
|                                     .tag("value", Tag.inserting(Component.text("music_disc"))) |  | ||||||
|                                     .build() |  | ||||||
|                     ); |  | ||||||
|                 } else if (item.getName().toLowerCase(Locale.ENGLISH).contains("disc")) { |  | ||||||
|                     PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class) |  | ||||||
|                             .createFlagInstance(item.getType()); |  | ||||||
|                     PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot); |  | ||||||
|                     if (event.getEventResult() == Result.DENY) { |  | ||||||
|                         getPlayer().sendMessage( |  | ||||||
|                                 TranslatableCaption.of("events.event_denied"), |  | ||||||
|                                 TagResolver.resolver("value", Tag.inserting(Component.text("Music addition"))) |  | ||||||
|                         ); |  | ||||||
|                         return true; |  | ||||||
|                     } |  | ||||||
|                     plot.setFlag(event.getFlag()); |  | ||||||
|                     getPlayer().sendMessage( |  | ||||||
|                             TranslatableCaption.of("flag.flag_added"), |  | ||||||
|                             TagResolver.builder() |  | ||||||
|                                     .tag("flag", Tag.inserting(Component.text("music"))) |  | ||||||
|                                     .tag("value", Tag.inserting(Component.text(event.getFlag().getValue().toString()))) |  | ||||||
|                                     .build() |  | ||||||
|                     ); |  | ||||||
|                 } else { |  | ||||||
|                     getPlayer().sendMessage(TranslatableCaption.of("flag.flag_not_added")); |  | ||||||
|                 } |  | ||||||
|                 return false; |  | ||||||
|             } |  | ||||||
|         }; |  | ||||||
|         int index = 0; |  | ||||||
|  |  | ||||||
|         for (final String disc : DISCS) { |         new PlotMusicInventory<>(inventoryProvider, player, plot, eventDispatcher).open(); | ||||||
|             final String name = String.format("<gold>%s</gold>", disc); |  | ||||||
|             final String[] lore = {TranslatableCaption.of("plotjukebox.click_to_play").getComponent(player)}; |  | ||||||
|             ItemType type = ItemTypes.get(disc); |  | ||||||
|             if (type == null) { |  | ||||||
|                 continue; |  | ||||||
|             } |  | ||||||
|             final PlotItemStack item = new PlotItemStack(type, 1, name, lore); |  | ||||||
|             if (inv.setItemChecked(index, item)) { |  | ||||||
|                 index++; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // Always add the cancel button |  | ||||||
|         // if (player.getMeta("music") != null) { |  | ||||||
|         String name = TranslatableCaption.of("plotjukebox.cancel_music").getComponent(player); |  | ||||||
|         String[] lore = {TranslatableCaption.of("plotjukebox.reset_music").getComponent(player)}; |  | ||||||
|         inv.setItem(index, new PlotItemStack("bedrock", 1, name, lore)); |  | ||||||
|         // } |  | ||||||
|  |  | ||||||
|         inv.openInventory(); |  | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -0,0 +1,145 @@ | |||||||
|  | /* | ||||||
|  |  *       _____  _       _    _____                                _ | ||||||
|  |  *      |  __ \| |     | |  / ____|                              | | | ||||||
|  |  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||||
|  |  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||||
|  |  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||||
|  |  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||||
|  |  *                                    | | | ||||||
|  |  *                                    |_| | ||||||
|  |  *            PlotSquared plot management system for Minecraft | ||||||
|  |  *               Copyright (C) 2014 - 2022 IntellectualSites | ||||||
|  |  * | ||||||
|  |  *     This program is free software: you can redistribute it and/or modify | ||||||
|  |  *     it under the terms of the GNU General Public License as published by | ||||||
|  |  *     the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *     (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *     This program is distributed in the hope that it will be useful, | ||||||
|  |  *     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *     GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *     You should have received a copy of the GNU General Public License | ||||||
|  |  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.core.gui; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||||
|  | import com.plotsquared.core.events.PlotFlagAddEvent; | ||||||
|  | import com.plotsquared.core.events.PlotFlagRemoveEvent; | ||||||
|  | import com.plotsquared.core.events.Result; | ||||||
|  | import com.plotsquared.core.player.PlotPlayer; | ||||||
|  | import com.plotsquared.core.plot.Plot; | ||||||
|  | import com.plotsquared.core.plot.PlotItemStack; | ||||||
|  | import com.plotsquared.core.plot.flag.PlotFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.MusicFlag; | ||||||
|  | import com.plotsquared.core.util.EventDispatcher; | ||||||
|  | import com.plotsquared.core.util.gui.ExtendablePlotInventory; | ||||||
|  | import com.plotsquared.core.util.gui.PlotInventoryProvider; | ||||||
|  | import com.sk89q.worldedit.world.item.ItemTypes; | ||||||
|  | import net.kyori.adventure.text.Component; | ||||||
|  | import net.kyori.adventure.text.minimessage.tag.Tag; | ||||||
|  | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.stream.Stream; | ||||||
|  |  | ||||||
|  | public class PlotMusicInventory<P, I> extends ExtendablePlotInventory<P, I> { | ||||||
|  |  | ||||||
|  |     private static final List<String> DISCS = Stream.of( | ||||||
|  |             "music_disc_13", | ||||||
|  |             "music_disc_cat", | ||||||
|  |             "music_disc_blocks", | ||||||
|  |             "music_disc_chirp", | ||||||
|  |             "music_disc_far", | ||||||
|  |             "music_disc_mall", | ||||||
|  |             "music_disc_mellohi", | ||||||
|  |             "music_disc_stal", | ||||||
|  |             "music_disc_strad", | ||||||
|  |             "music_disc_ward", | ||||||
|  |             "music_disc_11", | ||||||
|  |             "music_disc_wait", | ||||||
|  |             "music_disc_otherside", | ||||||
|  |             "music_disc_pigstep" | ||||||
|  |     ).filter(s -> ItemTypes.get(s) != null).toList(); | ||||||
|  |     private final Plot plot; | ||||||
|  |     private final EventDispatcher eventDispatcher; | ||||||
|  |  | ||||||
|  |     public PlotMusicInventory( | ||||||
|  |             final PlotInventoryProvider<P, I> provider, | ||||||
|  |             PlotPlayer<?> player, | ||||||
|  |             Plot plot, | ||||||
|  |             EventDispatcher eventDispatcher | ||||||
|  |     ) { | ||||||
|  |         super( | ||||||
|  |                 provider, player, 2 * 9, | ||||||
|  |                 TranslatableCaption.of("plotjukebox.jukebox_header") | ||||||
|  |         ); | ||||||
|  |         this.plot = plot; | ||||||
|  |         this.eventDispatcher = eventDispatcher; | ||||||
|  |         setDiscs(); | ||||||
|  |         setCancelButton(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void setDiscs() { | ||||||
|  |         for (final String disc : DISCS) { | ||||||
|  |             PlotItemStack itemStack = new PlotItemStack( | ||||||
|  |                     disc, 1, String.format("<gold>%s</gold>", disc), | ||||||
|  |                     TranslatableCaption.of("plotjukebox.click_to_play").getComponent(player()) | ||||||
|  |             ); | ||||||
|  |             addItem(itemStack, (item, type) -> { | ||||||
|  |                 close(); | ||||||
|  |                 PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class) | ||||||
|  |                         .createFlagInstance(item.getType()); | ||||||
|  |                 PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot); | ||||||
|  |                 if (event.getEventResult() == Result.DENY) { | ||||||
|  |                     player().sendMessage( | ||||||
|  |                             TranslatableCaption.of("events.event_denied"), | ||||||
|  |                             TagResolver.resolver("value", Tag.inserting(Component.text("Music addition"))) | ||||||
|  |                     ); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 plot.setFlag(event.getFlag()); | ||||||
|  |                 player().sendMessage( | ||||||
|  |                         TranslatableCaption.of("flag.flag_added"), | ||||||
|  |                         TagResolver.builder() | ||||||
|  |                                 .tag("flag", Tag.inserting(Component.text("music"))) | ||||||
|  |                                 .tag("value", Tag.inserting(Component.text(event.getFlag().getValue().toString()))) | ||||||
|  |                                 .build() | ||||||
|  |                 ); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private void setCancelButton() { | ||||||
|  |         PlotItemStack cancelItem = new PlotItemStack( | ||||||
|  |                 ItemTypes.BEDROCK, 1, | ||||||
|  |                 TranslatableCaption.of("plotjukebox.cancel_music").getComponent(player()), | ||||||
|  |                 TranslatableCaption.of("plotjukebox.reset_music").getComponent(player()) | ||||||
|  |         ); | ||||||
|  |         setItem(size() - 1, cancelItem, (item, type) -> { | ||||||
|  |             close(); | ||||||
|  |             PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class) | ||||||
|  |                     .createFlagInstance(item.getType()); | ||||||
|  |             PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(plotFlag, plot); | ||||||
|  |             if (event.getEventResult() == Result.DENY) { | ||||||
|  |                 player().sendMessage( | ||||||
|  |                         TranslatableCaption.of("events.event_denied"), | ||||||
|  |                         TagResolver.resolver("value", Tag.inserting(Component.text("Music removal"))) | ||||||
|  |                 ); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             plot.removeFlag(event.getFlag()); | ||||||
|  |             player().sendMessage( | ||||||
|  |                     TranslatableCaption.of("flag.flag_removed"), | ||||||
|  |                     TagResolver.builder() | ||||||
|  |                             .tag("flag", Tag.inserting(Component.text("music"))) | ||||||
|  |                             .tag("value", Tag.inserting(Component.text("music_disc"))) | ||||||
|  |                             .build() | ||||||
|  |             ); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -258,4 +258,8 @@ public class ConsolePlayer extends PlotPlayer<Actor> { | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void closeInventory() { | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1015,6 +1015,12 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer, | |||||||
|     public @NonNull |     public @NonNull | ||||||
|     abstract Audience getAudience(); |     abstract Audience getAudience(); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Closes the current open inventory, if present | ||||||
|  |      * @since TODO | ||||||
|  |      */ | ||||||
|  |     public abstract void closeInventory(); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Get this player's {@link LockRepository} |      * Get this player's {@link LockRepository} | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -0,0 +1,74 @@ | |||||||
|  | /* | ||||||
|  |  *       _____  _       _    _____                                _ | ||||||
|  |  *      |  __ \| |     | |  / ____|                              | | | ||||||
|  |  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||||
|  |  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||||
|  |  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||||
|  |  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||||
|  |  *                                    | | | ||||||
|  |  *                                    |_| | ||||||
|  |  *            PlotSquared plot management system for Minecraft | ||||||
|  |  *               Copyright (C) 2014 - 2022 IntellectualSites | ||||||
|  |  * | ||||||
|  |  *     This program is free software: you can redistribute it and/or modify | ||||||
|  |  *     it under the terms of the GNU General Public License as published by | ||||||
|  |  *     the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *     (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *     This program is distributed in the hope that it will be useful, | ||||||
|  |  *     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *     GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *     You should have received a copy of the GNU General Public License | ||||||
|  |  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.core.util.gui; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.configuration.caption.Caption; | ||||||
|  | import com.plotsquared.core.player.PlotPlayer; | ||||||
|  | import com.plotsquared.core.plot.PlotItemStack; | ||||||
|  | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
|  |  | ||||||
|  | public class ExtendablePlotInventory<P, I> extends PlotInventory<P, I> { | ||||||
|  |  | ||||||
|  |     private final PlotInventory<P, I> delegate; | ||||||
|  |  | ||||||
|  |     public ExtendablePlotInventory(PlotInventory<P, I> delegate) { | ||||||
|  |         super(delegate.player(), delegate.size(), delegate.titleCaption(), delegate.titleResolvers()); | ||||||
|  |         this.delegate = delegate; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public ExtendablePlotInventory( | ||||||
|  |             PlotInventoryProvider<P, I> provider, PlotPlayer<?> player, int size, Caption title, | ||||||
|  |             TagResolver... titleResolver | ||||||
|  |     ) { | ||||||
|  |         this(provider.createInventory(player, size, title, titleResolver)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void setItem(final int slot, final PlotItemStack item, final PlotInventoryClickHandler onClick) { | ||||||
|  |         delegate.setItem(slot, item, onClick); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void addItem(final PlotItemStack item, final PlotInventoryClickHandler onClick) { | ||||||
|  |         delegate.addItem(item, onClick); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void open() { | ||||||
|  |         delegate.open(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void close() { | ||||||
|  |         delegate.close(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public I toPlatformItem(final PlotItemStack item) { | ||||||
|  |         return delegate.toPlatformItem(item); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,145 @@ | |||||||
|  | /* | ||||||
|  |  *       _____  _       _    _____                                _ | ||||||
|  |  *      |  __ \| |     | |  / ____|                              | | | ||||||
|  |  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||||
|  |  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||||
|  |  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||||
|  |  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||||
|  |  *                                    | | | ||||||
|  |  *                                    |_| | ||||||
|  |  *            PlotSquared plot management system for Minecraft | ||||||
|  |  *               Copyright (C) 2014 - 2022 IntellectualSites | ||||||
|  |  * | ||||||
|  |  *     This program is free software: you can redistribute it and/or modify | ||||||
|  |  *     it under the terms of the GNU General Public License as published by | ||||||
|  |  *     the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *     (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *     This program is distributed in the hope that it will be useful, | ||||||
|  |  *     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *     GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *     You should have received a copy of the GNU General Public License | ||||||
|  |  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.core.util.gui; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.configuration.caption.Caption; | ||||||
|  | import com.plotsquared.core.player.PlotPlayer; | ||||||
|  | import com.plotsquared.core.plot.PlotItemStack; | ||||||
|  | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @param <P> The platform player | ||||||
|  |  * @param <I> The platform item object | ||||||
|  |  * @since TODO | ||||||
|  |  */ | ||||||
|  | public abstract class PlotInventory<P, I> { | ||||||
|  |  | ||||||
|  |     private final PlotInventoryClickHandler NOOP_CLICK_HANDLER = (x, y) -> { | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     private final PlotPlayer<P> player; | ||||||
|  |     private final int size; | ||||||
|  |     private final Caption titleCaption; | ||||||
|  |     private final TagResolver[] titleResolvers; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Instantiates a new Plot inventory. | ||||||
|  |      * | ||||||
|  |      * @param size           The size of the inventory - must be a multiple of 9 | ||||||
|  |      * @param titleCaption   The caption to use for the title | ||||||
|  |      * @param titleResolvers The tag resolvers to use for the title | ||||||
|  |      * @since 7.0.0 | ||||||
|  |      */ | ||||||
|  |     protected PlotInventory(PlotPlayer<P> player, int size, Caption titleCaption, TagResolver... titleResolvers) { | ||||||
|  |         this.player = player; | ||||||
|  |         this.size = size; | ||||||
|  |         this.titleCaption = titleCaption; | ||||||
|  |         this.titleResolvers = titleResolvers; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Set an item in this inventory at a specific slot / index. | ||||||
|  |      * Overrides existing items and click handler. | ||||||
|  |      * | ||||||
|  |      * @param slot    The slot / index where to place the item | ||||||
|  |      * @param item    The item to add to this inventory | ||||||
|  |      * @param onClick The handler to call when clicking this item | ||||||
|  |      * @since TODO | ||||||
|  |      */ | ||||||
|  |     public abstract void setItem(int slot, PlotItemStack item, PlotInventoryClickHandler onClick); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Set an item in this inventory at a specific slot / index. | ||||||
|  |      * Overrides existing items and click handler. | ||||||
|  |      * | ||||||
|  |      * @param slot The slot / index where to place the item | ||||||
|  |      * @param item The item to add to this inventory | ||||||
|  |      * @since TODO | ||||||
|  |      */ | ||||||
|  |     public void setItem(int slot, PlotItemStack item) { | ||||||
|  |         setItem(slot, item, NOOP_CLICK_HANDLER); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Add an item to this inventory, at the first slot possible (first empty slot, or first slot with the exact same item) | ||||||
|  |      * | ||||||
|  |      * @param item    The item to add to this inventory | ||||||
|  |      * @param onClick The handler to call when clicking this item | ||||||
|  |      * @since TODO | ||||||
|  |      */ | ||||||
|  |     public abstract void addItem(PlotItemStack item, PlotInventoryClickHandler onClick); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Add an item to this inventory, at the first slot possible (first empty slot, or first slot with the exact same item) | ||||||
|  |      * | ||||||
|  |      * @param item The item to add to this inventory | ||||||
|  |      * @since TODO | ||||||
|  |      */ | ||||||
|  |     public void addItem(PlotItemStack item) { | ||||||
|  |         addItem(item, NOOP_CLICK_HANDLER); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Opens this inventory | ||||||
|  |      * | ||||||
|  |      * @since TODO | ||||||
|  |      */ | ||||||
|  |     public abstract void open(); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Close this inventory | ||||||
|  |      * | ||||||
|  |      * @since TODO | ||||||
|  |      */ | ||||||
|  |     public abstract void close(); | ||||||
|  |  | ||||||
|  |     public abstract I toPlatformItem(PlotItemStack item); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @return the size of this inventory (must be a multiple of 9) | ||||||
|  |      * @since TODO | ||||||
|  |      */ | ||||||
|  |     public int size() { | ||||||
|  |         return size; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get the associated player of this inventory | ||||||
|  |      * @return {@link PlotPlayer} | ||||||
|  |      */ | ||||||
|  |     public PlotPlayer<P> player() { | ||||||
|  |         return player; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected Caption titleCaption() { | ||||||
|  |         return titleCaption; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected TagResolver[] titleResolvers() { | ||||||
|  |         return titleResolvers; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,34 @@ | |||||||
|  | /* | ||||||
|  |  *       _____  _       _    _____                                _ | ||||||
|  |  *      |  __ \| |     | |  / ____|                              | | | ||||||
|  |  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||||
|  |  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||||
|  |  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||||
|  |  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||||
|  |  *                                    | | | ||||||
|  |  *                                    |_| | ||||||
|  |  *            PlotSquared plot management system for Minecraft | ||||||
|  |  *               Copyright (C) 2014 - 2022 IntellectualSites | ||||||
|  |  * | ||||||
|  |  *     This program is free software: you can redistribute it and/or modify | ||||||
|  |  *     it under the terms of the GNU General Public License as published by | ||||||
|  |  *     the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *     (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *     This program is distributed in the hope that it will be useful, | ||||||
|  |  *     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *     GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *     You should have received a copy of the GNU General Public License | ||||||
|  |  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.core.util.gui; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.plot.PlotItemStack; | ||||||
|  |  | ||||||
|  | public interface PlotInventoryClickHandler { | ||||||
|  |  | ||||||
|  |     void handle(PlotItemStack itemStack, PlotInventoryClickType clickType); | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,37 @@ | |||||||
|  | /* | ||||||
|  |  *       _____  _       _    _____                                _ | ||||||
|  |  *      |  __ \| |     | |  / ____|                              | | | ||||||
|  |  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||||
|  |  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||||
|  |  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||||
|  |  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||||
|  |  *                                    | | | ||||||
|  |  *                                    |_| | ||||||
|  |  *            PlotSquared plot management system for Minecraft | ||||||
|  |  *               Copyright (C) 2014 - 2022 IntellectualSites | ||||||
|  |  * | ||||||
|  |  *     This program is free software: you can redistribute it and/or modify | ||||||
|  |  *     it under the terms of the GNU General Public License as published by | ||||||
|  |  *     the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *     (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *     This program is distributed in the hope that it will be useful, | ||||||
|  |  *     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *     GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *     You should have received a copy of the GNU General Public License | ||||||
|  |  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.core.util.gui; | ||||||
|  |  | ||||||
|  | public enum PlotInventoryClickType { | ||||||
|  |  | ||||||
|  |     LEFT, | ||||||
|  |     SHIFT_LEFT, | ||||||
|  |     RIGHT, | ||||||
|  |     SHIFT_RIGHT, | ||||||
|  |     MIDDLE, | ||||||
|  |     OTHER | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,50 @@ | |||||||
|  | /* | ||||||
|  |  *       _____  _       _    _____                                _ | ||||||
|  |  *      |  __ \| |     | |  / ____|                              | | | ||||||
|  |  *      | |__) | | ___ | |_| (___   __ _ _   _  __ _ _ __ ___  __| | | ||||||
|  |  *      |  ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | | ||||||
|  |  *      | |    | | (_) | |_ ____) | (_| | |_| | (_| | | |  __/ (_| | | ||||||
|  |  *      |_|    |_|\___/ \__|_____/ \__, |\__,_|\__,_|_|  \___|\__,_| | ||||||
|  |  *                                    | | | ||||||
|  |  *                                    |_| | ||||||
|  |  *            PlotSquared plot management system for Minecraft | ||||||
|  |  *               Copyright (C) 2014 - 2022 IntellectualSites | ||||||
|  |  * | ||||||
|  |  *     This program is free software: you can redistribute it and/or modify | ||||||
|  |  *     it under the terms of the GNU General Public License as published by | ||||||
|  |  *     the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *     (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *     This program is distributed in the hope that it will be useful, | ||||||
|  |  *     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *     GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *     You should have received a copy of the GNU General Public License | ||||||
|  |  *     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.core.util.gui; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.configuration.caption.Caption; | ||||||
|  | import com.plotsquared.core.player.PlotPlayer; | ||||||
|  | import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Provider for creating a {@link PlotInventory} | ||||||
|  |  * | ||||||
|  |  * @param <P> The platform player | ||||||
|  |  * @param <I> The platform item | ||||||
|  |  */ | ||||||
|  | public interface PlotInventoryProvider<P, I> { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Creates a new {@link PlotInventory} based on the passed data for the current platform. | ||||||
|  |      * | ||||||
|  |      * @param size           The size of the inventory (must be a multiple of 9) | ||||||
|  |      * @param titleCaption   The title for the inventory | ||||||
|  |      * @param titleResolvers The (optional) placeholder resolvers for the inventory | ||||||
|  |      * @return The platform inventory | ||||||
|  |      */ | ||||||
|  |     PlotInventory<P, I> createInventory(PlotPlayer<?> player, int size, Caption titleCaption, TagResolver... titleResolvers); | ||||||
|  |  | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user