From 14556e7afaba794e178369bd85b14fcebeb32995 Mon Sep 17 00:00:00 2001 From: Denis Istratov Date: Wed, 9 Aug 2023 23:24:49 +0300 Subject: [PATCH] 1.0.3 SNAPSHOT --- .gitignore | 4 +- README.md | 25 +--- build.gradle | 3 +- libs/nodropxforgebridge-1.1.jar | Bin 10848 -> 0 bytes libs/nodropxforgebridge-1.4.jar | Bin 0 -> 13536 bytes src/main/java/me/redtea/nodropx/NoDropX.java | 119 +++++++++++------- .../redtea/nodropx/api/facade/NoDropAPI.java | 10 +- .../api/facade/impl/NoDropXFacade.java | 10 +- .../redtea/nodropx/command/NoDropCommand.java | 16 +-- .../redtea/nodropx/folia/FoliaSupporter.java | 73 +++++++++++ .../redtea/nodropx/gui/facade/GuiFacade.java | 9 -- .../gui/facade/impl/GuiFacadeImpl.java | 26 ---- .../message/container/impl/MessagesImpl.java | 10 +- .../nodropx/libs/message/model/Message.java | 6 + .../message/verifier/MessageVerifier.java | 2 +- .../verifier/impl/FileMessageVerifier.java | 5 +- .../nodropx/listener/ConfirmDropHandler.java | 22 ++++ .../nodropx/listener/InventoryHandler.java | 18 ++- .../nodropx/listener/PlayerHandler.java | 8 +- .../listener/menu/SinglePageGuiHandler.java | 40 ++++++ .../me/redtea/nodropx/menu/CachedMenu.java | 8 ++ .../java/me/redtea/nodropx/menu/Menu.java | 7 ++ .../menu/dropconfirm/DropConfirmMFGui.java | 38 ++++++ .../nodropx/menu/facade/MenuFacade.java | 12 ++ .../menu/facade/impl/MenuFacadeImpl.java | 38 ++++++ .../storage/pages/MFPageGui.java} | 38 +++--- .../singlepage/SinglePageController.java | 50 ++++++++ .../storage/singlepage/SinglePageGui.java | 46 +++++++ .../service/capasity/CapacityService.java | 21 ++++ .../capasity/impl/CapacityServiceImpl.java | 52 ++++++++ .../dropconfirm/DropConfirmService.java | 9 ++ .../dropconfirm/impl/DropConfirmNull.java | 21 ++++ .../impl/DropConfirmServiceImpl.java | 27 ++++ .../respawn/impl/NullRespawnService.java | 17 +++ .../respawn/impl/RespawnServiceImpl.java | 10 +- .../storage/impl/StorageServiceImpl.java | 10 +- .../redtea/nodropx/util/ConfigVerifier.java | 37 ++++++ .../nodropx/util/FoliaSupportedUtils.java | 18 +++ .../me/redtea/nodropx/util/MaterialUtils.java | 2 +- .../me/redtea/nodropx/util/UpdateChecker.java | 12 +- src/main/resources/capacity.yml | 4 +- src/main/resources/config.yml | 9 +- src/main/resources/plugin.yml | 1 + src/main/resources/text/legacy/messages.yml | 33 +++-- src/main/resources/text/md5/cosmetics.yml | 3 +- src/main/resources/text/md5/messages.yml | 33 +++-- src/main/resources/text/mm/cosmetics.yml | 2 +- src/main/resources/text/mm/messages.yml | 33 +++-- 48 files changed, 803 insertions(+), 194 deletions(-) delete mode 100644 libs/nodropxforgebridge-1.1.jar create mode 100644 libs/nodropxforgebridge-1.4.jar create mode 100644 src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java delete mode 100644 src/main/java/me/redtea/nodropx/gui/facade/GuiFacade.java delete mode 100644 src/main/java/me/redtea/nodropx/gui/facade/impl/GuiFacadeImpl.java create mode 100644 src/main/java/me/redtea/nodropx/listener/ConfirmDropHandler.java create mode 100644 src/main/java/me/redtea/nodropx/listener/menu/SinglePageGuiHandler.java create mode 100644 src/main/java/me/redtea/nodropx/menu/CachedMenu.java create mode 100644 src/main/java/me/redtea/nodropx/menu/Menu.java create mode 100644 src/main/java/me/redtea/nodropx/menu/dropconfirm/DropConfirmMFGui.java create mode 100644 src/main/java/me/redtea/nodropx/menu/facade/MenuFacade.java create mode 100644 src/main/java/me/redtea/nodropx/menu/facade/impl/MenuFacadeImpl.java rename src/main/java/me/redtea/nodropx/{gui/pages/StorageGui.java => menu/storage/pages/MFPageGui.java} (76%) create mode 100644 src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageController.java create mode 100644 src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageGui.java create mode 100644 src/main/java/me/redtea/nodropx/service/capasity/CapacityService.java create mode 100644 src/main/java/me/redtea/nodropx/service/capasity/impl/CapacityServiceImpl.java create mode 100644 src/main/java/me/redtea/nodropx/service/dropconfirm/DropConfirmService.java create mode 100644 src/main/java/me/redtea/nodropx/service/dropconfirm/impl/DropConfirmNull.java create mode 100644 src/main/java/me/redtea/nodropx/service/dropconfirm/impl/DropConfirmServiceImpl.java create mode 100644 src/main/java/me/redtea/nodropx/service/respawn/impl/NullRespawnService.java create mode 100644 src/main/java/me/redtea/nodropx/util/ConfigVerifier.java create mode 100644 src/main/java/me/redtea/nodropx/util/FoliaSupportedUtils.java diff --git a/.gitignore b/.gitignore index ec61117..fd2ad84 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,6 @@ gradle-app.setting .classpath run -.idea \ No newline at end of file +.idea +.gradle +build \ No newline at end of file diff --git a/README.md b/README.md index f96b6e0..58feefa 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,2 @@ - - - # NoDropX -**Give no drop items!** - -The plugin will allow you to create items that will not drop out of your inventory at death! - -Give an no drop item: `/nodrop give [player] [item] (count)`
-Check all plugin commands: https://github.com/iRedTea/NoDropX/wiki/Commands
-Plugin wiki: https://github.com/iRedTea/NoDropX/wiki
-SpigotMC resource: https://www.spigotmc.org/resources/nodropx.111485/ - -**Features** -- Supports HEX Colors (MiniMessages and MD5 ChatColor) -- Supports all versions from 1.12.2 to 1.20.1 (Spigot/Paper) -- No drop items storage: `/nodrop gui` -- Fully customization -- Items that protect other slots from death -- Developer API -- Mods support (tested on Arclight 1.16.5) -- ItemsAdder support - - -This plugin uses CarcadeX library +Give no drop items! diff --git a/build.gradle b/build.gradle index 7933d76..0e0859a 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'me.redtea' -version = '1.0.2b-SNAPSHOT-HOTFIX' +version = '1.0.3-SNAPSHOT' repositories { mavenCentral() @@ -42,6 +42,7 @@ dependencies { implementation files("libs/MiniMessages.jar") implementation "dev.triumphteam:triumph-gui:3.1.2" compileOnly "com.github.LoneDev6:API-ItemsAdder:3.5.0b" + compileOnly files("libs/nodropxforgebridge-1.4.jar") } def targetJavaVersion = 8 diff --git a/libs/nodropxforgebridge-1.1.jar b/libs/nodropxforgebridge-1.1.jar deleted file mode 100644 index c7ed85607acc681d3c220345676e9e6bc48d0bf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10848 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 diff --git a/libs/nodropxforgebridge-1.4.jar b/libs/nodropxforgebridge-1.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..eb9c46226ed9ac1c24ef4f310ac1702eedc86fe5 GIT binary patch literal 13536 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 Lc@am(-=F>uZs{yo literal 0 HcmV?d00001 diff --git a/src/main/java/me/redtea/nodropx/NoDropX.java b/src/main/java/me/redtea/nodropx/NoDropX.java index 75112c2..5382a57 100644 --- a/src/main/java/me/redtea/nodropx/NoDropX.java +++ b/src/main/java/me/redtea/nodropx/NoDropX.java @@ -10,23 +10,35 @@ import me.redtea.nodropx.factory.item.impl.NoDropItemFactoryImpl; import me.redtea.nodropx.factory.text.TextContext; import me.redtea.nodropx.factory.text.TextServicesFactory; import me.redtea.nodropx.factory.text.impl.TextServicesFactoryImpl; -import me.redtea.nodropx.gui.facade.GuiFacade; -import me.redtea.nodropx.gui.facade.impl.GuiFacadeImpl; -import me.redtea.nodropx.gui.pages.StorageGui; +import me.redtea.nodropx.folia.FoliaSupporter; import me.redtea.nodropx.libs.bstats.Metrics; import me.redtea.nodropx.libs.carcadex.repo.MutableRepo; import me.redtea.nodropx.libs.carcadex.repo.Repo; -import me.redtea.nodropx.libs.carcadex.repo.impl.yaml.YamlRepo; import me.redtea.nodropx.libs.message.container.Messages; import me.redtea.nodropx.libs.message.verifier.impl.FileMessageVerifier; +import me.redtea.nodropx.listener.ConfirmDropHandler; import me.redtea.nodropx.listener.InventoryHandler; import me.redtea.nodropx.listener.PlayerHandler; +import me.redtea.nodropx.listener.menu.SinglePageGuiHandler; +import me.redtea.nodropx.menu.CachedMenu; +import me.redtea.nodropx.menu.Menu; +import me.redtea.nodropx.menu.dropconfirm.DropConfirmMFGui; +import me.redtea.nodropx.menu.facade.MenuFacade; +import me.redtea.nodropx.menu.facade.impl.MenuFacadeImpl; +import me.redtea.nodropx.menu.storage.pages.MFPageGui; +import me.redtea.nodropx.menu.storage.singlepage.SinglePageController; +import me.redtea.nodropx.menu.storage.singlepage.SinglePageGui; import me.redtea.nodropx.model.cosmetic.impl.DisplayNameCosmetic; import me.redtea.nodropx.model.materialprovider.impl.ItemStackProviderDefault; import me.redtea.nodropx.model.materialprovider.impl.ItemsAdderProvider; import me.redtea.nodropx.schema.ItemStackListSchema; +import me.redtea.nodropx.service.capasity.CapacityService; +import me.redtea.nodropx.service.capasity.impl.CapacityServiceImpl; import me.redtea.nodropx.service.cosmetic.CosmeticService; import me.redtea.nodropx.service.cosmetic.impl.CosmeticServiceImpl; +import me.redtea.nodropx.service.dropconfirm.DropConfirmService; +import me.redtea.nodropx.service.dropconfirm.impl.DropConfirmNull; +import me.redtea.nodropx.service.dropconfirm.impl.DropConfirmServiceImpl; import me.redtea.nodropx.service.event.EventService; import me.redtea.nodropx.service.event.impl.EventServiceImpl; import me.redtea.nodropx.service.material.ItemStackService; @@ -39,6 +51,8 @@ import me.redtea.nodropx.service.respawn.RespawnService; import me.redtea.nodropx.service.respawn.impl.RespawnServiceImpl; import me.redtea.nodropx.service.storage.StorageService; import me.redtea.nodropx.service.storage.impl.StorageServiceImpl; +import me.redtea.nodropx.util.ConfigVerifier; +import me.redtea.nodropx.util.FoliaSupportedUtils; import me.redtea.nodropx.util.UpdateChecker; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -50,29 +64,34 @@ import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; public final class NoDropX extends JavaPlugin { private static NoDropAPI noDropAPIInstance; @Getter private static NoDropX instance; - + @Getter private Messages messages; - private CosmeticService cosmeticService; + private CosmeticService noDropCosmeticService; @Getter private boolean supportHEX; @Getter private boolean supportKyoriLore; @Getter private boolean supportItemsAdder; - private MutableRepo> pagesRepo; - private Repo> capacity; - + private MutableRepo> personalStorageRepo; + private CapacityService capacityService; + private MenuFacade menuFacade; + private NoDropService noDropService; + private ItemStackService itemStackService; + private DropConfirmService dropConfirmService; + private FoliaSupportedUtils foliaSupportedUtils; @Override public void onEnable() { instance = this; - saveDefaultConfig(); + new ConfigVerifier().verifyDefaults(this); + + foliaSupportedUtils = new FoliaSupportedUtils(this); TextServicesFactory textServicesFactory = new TextServicesFactoryImpl(); TextContext textContext = textServicesFactory.create(this); @@ -81,51 +100,43 @@ public final class NoDropX extends JavaPlugin { messages = supportKyoriLore ? Messages.of(textContext.getMessages()) : Messages.legacy(textContext.getMessages()); messages.setVerifier(new FileMessageVerifier(getResource(textContext.getPath()), YamlConfiguration.loadConfiguration(textContext.getMessages()), textContext.getMessages())); - cosmeticService = new CosmeticServiceImpl(); - cosmeticService.add(new DisplayNameCosmetic()); - cosmeticService.add(textContext.getLoreStrategy()); - cosmeticService.load(YamlConfiguration.loadConfiguration(textContext.getCosmetics())); - - capacity = new YamlRepo<>( - new File(getDataFolder(), "capacity.yml").toPath(), - this, - conf -> conf.getKeys(false).stream().collect(Collectors.toMap( - value -> value, - conf::getIntegerList)) - ); + noDropCosmeticService = new CosmeticServiceImpl(); + noDropCosmeticService.add(new DisplayNameCosmetic()); + noDropCosmeticService.add(textContext.getLoreStrategy()); + noDropCosmeticService.load(YamlConfiguration.loadConfiguration(textContext.getCosmetics())); NBTService nbtService = new Tr7zwNBTServiceImpl(); - NoDropService noDropService = new NoDropServiceImpl(nbtService, cosmeticService); + noDropService = new NoDropServiceImpl(nbtService, noDropCosmeticService); NoDropItemFactory noDropItemFactory = new NoDropItemFactoryImpl(noDropService); EventService eventService = new EventServiceImpl(noDropService); - RespawnService respawnService = new RespawnServiceImpl(noDropService, capacity); - pagesRepo = Repo.>builder() + capacityService = new CapacityServiceImpl(this); + RespawnService respawnService = new RespawnServiceImpl(noDropService, capacityService); + + //EXPERIMENTAL! Folia support! + FoliaSupporter foliaSupporter = new FoliaSupporter(); + foliaSupporter.run(respawnService, this); + + personalStorageRepo = Repo.>builder() .autoSave(1000 * 60 * 15L) .schema(new ItemStackListSchema(new File(getDataFolder(), "storage"))) .plugin(this) .build(); - ItemStackService itemStackService = initItemStackService(); + itemStackService = initItemStackService(); + dropConfirmService = getConfig().getBoolean("confirmThrowNoDropItem") ? new DropConfirmServiceImpl() : new DropConfirmNull(); - GuiFacade guiFacade = new GuiFacadeImpl( - new StorageGui(messages, pagesRepo, noDropService, this, itemStackService) - ); - StorageService storageService = new StorageServiceImpl(guiFacade, pagesRepo, noDropService); + menuFacade = initMenus(); + StorageService storageService = new StorageServiceImpl(menuFacade, personalStorageRepo, noDropService); - NoDropAPI noDropAPI = new NoDropXFacade(noDropService, noDropItemFactory, storageService, capacity, itemStackService); + NoDropAPI noDropAPI = new NoDropXFacade(noDropService, noDropItemFactory, storageService, capacityService, itemStackService); noDropAPIInstance = noDropAPI; - Bukkit.getPluginManager().registerEvents( - new InventoryHandler(eventService), - this - ); - Bukkit.getPluginManager().registerEvents( - new PlayerHandler(respawnService, eventService, guiFacade), - this - ); + Bukkit.getPluginManager().registerEvents(new InventoryHandler(eventService, noDropService, dropConfirmService), this); + Bukkit.getPluginManager().registerEvents(new PlayerHandler(respawnService, eventService, menuFacade), this); + Bukkit.getPluginManager().registerEvents(new ConfirmDropHandler(dropConfirmService, menuFacade), this); Bukkit.getServicesManager().register(NoDropAPI.class, noDropAPI, this, ServicePriority.Normal); @@ -136,12 +147,25 @@ public final class NoDropX extends JavaPlugin { commandManager.getMessageHandler().register("cmd.no.exists", sender -> messages.get("noExists").send(sender)); commandManager.getMessageHandler().register("cmd.wrong.usage", sender -> messages.get("usage").send(sender)); commandManager.getCompletionHandler().register("#materials", input -> itemStackService.allMaterials()); - commandManager.register(new NoDropCommand(messages, noDropAPI, guiFacade, this, itemStackService)); + commandManager.register(new NoDropCommand(messages, noDropAPI, menuFacade, this, itemStackService)); bStatsInit(); printCredits(); checkUpdates(); } + private MenuFacade initMenus() { + CachedMenu personalStorageCachedMenu; + if(getConfig().getString("personalStorageType").equalsIgnoreCase("SINGLE_PAGE")) { + SinglePageGui singlePageGui = new SinglePageGui(messages, personalStorageRepo); + personalStorageCachedMenu = singlePageGui; + Bukkit.getPluginManager().registerEvents(new SinglePageGuiHandler(new SinglePageController(noDropService, + singlePageGui, personalStorageRepo, foliaSupportedUtils), singlePageGui), this); + } else personalStorageCachedMenu = new MFPageGui(messages, personalStorageRepo, noDropService, itemStackService, this); + + Menu confirmMenu = new DropConfirmMFGui(messages, dropConfirmService); + return new MenuFacadeImpl(personalStorageCachedMenu, confirmMenu); + } + private ItemStackService initItemStackService() { ItemStackService result = new ItemStackServiceImpl(); if (Bukkit.getPluginManager().getPlugin("ItemsAdder") != null) { @@ -154,10 +178,10 @@ public final class NoDropX extends JavaPlugin { } private void checkUpdates() { - if(!(getConfig().contains("checkForUpdates") && getConfig().getBoolean("checkForUpdates"))) { + if(!getConfig().getBoolean("checkForUpdates")) { return; } - new UpdateChecker(this, 111485).getVersion(version -> { + new UpdateChecker(this, 111485, foliaSupportedUtils).getVersion(version -> { if (this.getDescription().getVersion().equals(version)) { getLogger().info("There is not a new update available."); } else { @@ -185,15 +209,16 @@ public final class NoDropX extends JavaPlugin { } public void onReload() { - pagesRepo.saveAll(); - capacity.reload(); + personalStorageRepo.saveAll(); + menuFacade.clearAllCache(); + capacityService.reload(); messages.reload(YamlConfiguration.loadConfiguration(new File(getDataFolder(), "messages.yml"))); - cosmeticService.load(YamlConfiguration.loadConfiguration(new File(getDataFolder(), "cosmetics.yml"))); + noDropCosmeticService.load(YamlConfiguration.loadConfiguration(new File(getDataFolder(), "cosmetics.yml"))); } @Override public void onDisable() { - pagesRepo.saveAll(); + personalStorageRepo.saveAll(); } public static NoDropAPI getAPI() { diff --git a/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java b/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java index 16ab20c..6088504 100644 --- a/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java +++ b/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java @@ -2,7 +2,6 @@ package me.redtea.nodropx.api.facade; import lombok.val; import me.redtea.nodropx.api.facade.manipulator.StorageManipulator; -import me.redtea.nodropx.util.MaterialUtils; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.entity.HumanEntity; @@ -78,6 +77,15 @@ public interface NoDropAPI { */ @NotNull StorageManipulator getStorageManipulator(@NotNull UUID playerUniqueId); + /** + * returns the slot numbers that no drop item with this itemStack saves at death + * @param itemStack itemStack to check + * @return numbers of saved slots + * @author redtea + * @since 1.0.3 + */ + @NotNull Collection getCapacitySlots(ItemStack itemStack); + /** * returns the slot numbers that no drop item with this material saves at death * @param material material to check diff --git a/src/main/java/me/redtea/nodropx/api/facade/impl/NoDropXFacade.java b/src/main/java/me/redtea/nodropx/api/facade/impl/NoDropXFacade.java index 2f63c90..cff9c1e 100644 --- a/src/main/java/me/redtea/nodropx/api/facade/impl/NoDropXFacade.java +++ b/src/main/java/me/redtea/nodropx/api/facade/impl/NoDropXFacade.java @@ -5,6 +5,7 @@ import me.redtea.nodropx.api.facade.manipulator.StorageManipulator; import lombok.RequiredArgsConstructor; import me.redtea.nodropx.factory.item.NoDropItemFactory; import me.redtea.nodropx.libs.carcadex.repo.Repo; +import me.redtea.nodropx.service.capasity.CapacityService; import me.redtea.nodropx.service.material.ItemStackService; import me.redtea.nodropx.service.nodrop.NoDropService; import me.redtea.nodropx.service.storage.StorageService; @@ -24,7 +25,7 @@ public class NoDropXFacade implements NoDropAPI { private final NoDropService noDropService; private final NoDropItemFactory itemFactory; private final StorageService storageService; - private final Repo> capacity; + private final CapacityService capacityService; private final ItemStackService itemStackService; @Override @@ -74,9 +75,14 @@ public class NoDropXFacade implements NoDropAPI { }; } + @Override + public @NotNull Collection getCapacitySlots(ItemStack itemStack) { + return capacityService.get(itemStack); + } + @Override public @NotNull Collection getCapacitySlots(Material material) { - return capacity.get(material.name()).orElse(new ArrayList<>()); + return capacityService.get(material); } @Override diff --git a/src/main/java/me/redtea/nodropx/command/NoDropCommand.java b/src/main/java/me/redtea/nodropx/command/NoDropCommand.java index 8dcd168..5c20568 100644 --- a/src/main/java/me/redtea/nodropx/command/NoDropCommand.java +++ b/src/main/java/me/redtea/nodropx/command/NoDropCommand.java @@ -6,7 +6,7 @@ import me.mattstudios.mf.annotations.*; import me.mattstudios.mf.base.CommandBase; import me.redtea.nodropx.NoDropX; import me.redtea.nodropx.api.facade.NoDropAPI; -import me.redtea.nodropx.gui.facade.GuiFacade; +import me.redtea.nodropx.menu.facade.MenuFacade; import me.redtea.nodropx.libs.message.container.Messages; import me.redtea.nodropx.service.material.ItemStackService; import org.bukkit.Bukkit; @@ -27,7 +27,7 @@ import java.util.Date; public class NoDropCommand extends CommandBase { private final Messages messages; private final NoDropAPI noDropAPI; - private final GuiFacade guiFacade; + private final MenuFacade menuFacade; private final NoDropX plugin; private final ItemStackService itemStackService; @@ -68,9 +68,9 @@ public class NoDropCommand extends CommandBase { @Permission("nodropx.giveStorage") @Completion({"#players", "#materials", "#range:1-64"}) public void onGiveStorage(final CommandSender sender, - String playerName, + final String playerName, final String material, - @Optional Integer amount) { + @Optional final Integer amount) { try { val item = noDropAPI.setNoDrop(itemStackService.get(material, amount == null || amount == 0 ? 1 : amount), true); val player = getOfflinePlayer(playerName); @@ -82,11 +82,12 @@ public class NoDropCommand extends CommandBase { messages.get("giveToStorage.success") .replaceAll("%item%", material) .replaceAll("%player%", playerName) - .replaceAll("%amount%", amount == null ? "0" : amount.toString()) + .replaceAll("%amount%", amount == null ? "1" : amount.toString()) .send(sender); } catch (Throwable e) { messages.get("giveToStorage.fail").send(sender); } + } @SubCommand("applyHand") @@ -101,13 +102,14 @@ public class NoDropCommand extends CommandBase { } @SubCommand("gui") + @Alias("storage") @Permission("nodropx.gui") public void onGui(final Player sender) { - guiFacade.openNoDropStorage(sender); + menuFacade.openPersonalStorage(sender); } @Nullable - private OfflinePlayer getOfflinePlayer(String name) { + private OfflinePlayer getOfflinePlayer(final String name) { for(OfflinePlayer player : Bukkit.getOfflinePlayers()) { if(player.getName() != null && player.getName().equalsIgnoreCase(name)) return player; } diff --git a/src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java b/src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java new file mode 100644 index 0000000..ee9c45e --- /dev/null +++ b/src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java @@ -0,0 +1,73 @@ +package me.redtea.nodropx.folia; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import lombok.Getter; +import lombok.SneakyThrows; +import me.redtea.nodropx.service.respawn.RespawnService; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.plugin.Plugin; + +import java.io.FileReader; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; + +//Experimental. Must be refactored in the future. +public class FoliaSupporter { + private RespawnService respawnService; + + @Getter + private static boolean runningOnFolia = false; + + @SneakyThrows + public void run(RespawnService respawnService, Plugin plugin) { + String version = ((JsonObject) new JsonParser().parse(new FileReader("version_history.json"))).get("currentVersion").getAsString(); + if(!version.toLowerCase().contains("folia") && !plugin.getConfig().getBoolean("forceUseFoliaPatches")) { + return; + } + runningOnFolia = true; + plugin.getLogger().info("Found Folia! Applying patches for this..."); + this.respawnService = respawnService; + Bukkit.getPluginManager().registerEvents(new FoliaDeathListener(), plugin); + plugin.getLogger().info("Patches for Folia successfully applied!"); + } + + + /* + temp fix when folia not called respawn event + */ + class FoliaDeathListener implements Listener { + private final Set toRespawn = new CopyOnWriteArraySet<>(); + + public FoliaDeathListener() { + new Thread(() -> { + while (true) { + for(Player player : toRespawn) { + if(!player.isDead()) { + onRespawn(player); + toRespawn.remove(player); + } + } + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + }).start(); + } + + public void onRespawn(Player player) { + respawnService.giveSavedItems(player); + } + + @EventHandler + public void onDeath(PlayerDeathEvent event) { + toRespawn.add(event.getEntity()); + } + } +} diff --git a/src/main/java/me/redtea/nodropx/gui/facade/GuiFacade.java b/src/main/java/me/redtea/nodropx/gui/facade/GuiFacade.java deleted file mode 100644 index 5df3794..0000000 --- a/src/main/java/me/redtea/nodropx/gui/facade/GuiFacade.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.redtea.nodropx.gui.facade; - -import org.bukkit.entity.Player; - -public interface GuiFacade { - void openNoDropStorage(Player player); - void clearCache(Player player); - void clearAllCache(); -} diff --git a/src/main/java/me/redtea/nodropx/gui/facade/impl/GuiFacadeImpl.java b/src/main/java/me/redtea/nodropx/gui/facade/impl/GuiFacadeImpl.java deleted file mode 100644 index 6321b4a..0000000 --- a/src/main/java/me/redtea/nodropx/gui/facade/impl/GuiFacadeImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.redtea.nodropx.gui.facade.impl; - -import lombok.RequiredArgsConstructor; -import me.redtea.nodropx.gui.facade.GuiFacade; -import me.redtea.nodropx.gui.pages.StorageGui; -import org.bukkit.entity.Player; - -@RequiredArgsConstructor -public class GuiFacadeImpl implements GuiFacade { - private final StorageGui storageGui; - - @Override - public void openNoDropStorage(Player player) { - storageGui.open(player); - } - - @Override - public void clearCache(Player player) { - storageGui.clearCache(player); - } - - @Override - public void clearAllCache() { - storageGui.clearAllCache(); - } -} diff --git a/src/main/java/me/redtea/nodropx/libs/message/container/impl/MessagesImpl.java b/src/main/java/me/redtea/nodropx/libs/message/container/impl/MessagesImpl.java index a7a7b51..f99eb6a 100644 --- a/src/main/java/me/redtea/nodropx/libs/message/container/impl/MessagesImpl.java +++ b/src/main/java/me/redtea/nodropx/libs/message/container/impl/MessagesImpl.java @@ -10,10 +10,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; import java.io.File; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; public class MessagesImpl implements Messages { private Map messages; @@ -53,9 +50,10 @@ public class MessagesImpl implements Messages { public Message get(String key) { if(!has(key)) { if(verifier != null) { - Optional def = verifier.fromDefault(key); + Optional def = verifier.fromDefault(key); if(def.isPresent()) { - messages.put(key, factory.message(def.get())); + if(def.get() instanceof List) messages.put(key, factory.message((List) def.get())); + else messages.put(key, factory.message((def.get().toString()))); return messages.get(key); } return NULL_MESSAGE; diff --git a/src/main/java/me/redtea/nodropx/libs/message/model/Message.java b/src/main/java/me/redtea/nodropx/libs/message/model/Message.java index dee72c7..1828c23 100644 --- a/src/main/java/me/redtea/nodropx/libs/message/model/Message.java +++ b/src/main/java/me/redtea/nodropx/libs/message/model/Message.java @@ -1,7 +1,9 @@ package me.redtea.nodropx.libs.message.model; +import me.redtea.nodropx.util.MaterialUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; +import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -60,4 +62,8 @@ public interface Message extends ComponentLike { default Message replaceAll(@NotNull Object from, @NotNull Object to) { return replaceAll(String.valueOf(from), String.valueOf(to)); } + + default Material toMaterial() { + return Material.matchMaterial(asUnparsedString()) == null ? Material.STONE : Material.matchMaterial(asUnparsedString()); + } } diff --git a/src/main/java/me/redtea/nodropx/libs/message/verifier/MessageVerifier.java b/src/main/java/me/redtea/nodropx/libs/message/verifier/MessageVerifier.java index 50fa39b..92c1fa7 100644 --- a/src/main/java/me/redtea/nodropx/libs/message/verifier/MessageVerifier.java +++ b/src/main/java/me/redtea/nodropx/libs/message/verifier/MessageVerifier.java @@ -3,5 +3,5 @@ package me.redtea.nodropx.libs.message.verifier; import java.util.Optional; public interface MessageVerifier { - Optional fromDefault(String key); + Optional fromDefault(String key); } diff --git a/src/main/java/me/redtea/nodropx/libs/message/verifier/impl/FileMessageVerifier.java b/src/main/java/me/redtea/nodropx/libs/message/verifier/impl/FileMessageVerifier.java index a16b241..a021edb 100644 --- a/src/main/java/me/redtea/nodropx/libs/message/verifier/impl/FileMessageVerifier.java +++ b/src/main/java/me/redtea/nodropx/libs/message/verifier/impl/FileMessageVerifier.java @@ -9,6 +9,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.List; import java.util.Optional; public class FileMessageVerifier implements MessageVerifier { @@ -24,8 +25,8 @@ public class FileMessageVerifier implements MessageVerifier { } @Override - public Optional fromDefault(String key) { - Optional o = Optional.ofNullable(defaultSection.getString(key)); + public Optional fromDefault(String key) { + Optional o = Optional.ofNullable(defaultSection.get(key)); o.ifPresent(s -> saveToMain(key, s)); return o; } diff --git a/src/main/java/me/redtea/nodropx/listener/ConfirmDropHandler.java b/src/main/java/me/redtea/nodropx/listener/ConfirmDropHandler.java new file mode 100644 index 0000000..4ea3093 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/listener/ConfirmDropHandler.java @@ -0,0 +1,22 @@ +package me.redtea.nodropx.listener; + +import lombok.RequiredArgsConstructor; +import me.redtea.nodropx.api.event.NoDropItemThrownEvent; +import me.redtea.nodropx.menu.facade.MenuFacade; +import me.redtea.nodropx.service.dropconfirm.DropConfirmService; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +@RequiredArgsConstructor +public class ConfirmDropHandler implements Listener { + private final DropConfirmService confirmService; + private final MenuFacade menuFacade; + + @EventHandler + public void onDrop(NoDropItemThrownEvent event) { + if(!confirmService.isConfirmed(event.getPlayer()) && event.getReason() == NoDropItemThrownEvent.Reason.DROP_BY_PLAYER) { + menuFacade.openConfirmDrop(event.getPlayer()); + event.setCancelled(true); + } else confirmService.resetConfirm(event.getPlayer()); + } +} diff --git a/src/main/java/me/redtea/nodropx/listener/InventoryHandler.java b/src/main/java/me/redtea/nodropx/listener/InventoryHandler.java index acb5d69..bb0e333 100644 --- a/src/main/java/me/redtea/nodropx/listener/InventoryHandler.java +++ b/src/main/java/me/redtea/nodropx/listener/InventoryHandler.java @@ -1,8 +1,12 @@ package me.redtea.nodropx.listener; +import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import me.redtea.nodropx.api.event.NoDropItemThrownEvent; +import me.redtea.nodropx.service.dropconfirm.DropConfirmService; +import me.redtea.nodropx.service.dropconfirm.impl.DropConfirmNull; import me.redtea.nodropx.service.event.EventService; +import me.redtea.nodropx.service.nodrop.NoDropService; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -10,22 +14,32 @@ import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; +import java.util.List; import java.util.Optional; @RequiredArgsConstructor public class InventoryHandler implements Listener { private final EventService eventService; + private final NoDropService noDropService; + private final DropConfirmService dropConfirmService; + @EventHandler public void onMove(InventoryClickEvent event) { - if(event.getAction().equals(InventoryAction.MOVE_TO_OTHER_INVENTORY)) { + if(event.getAction().name().startsWith("DROP") + && (noDropService.isNoDrop(event.getCursor()) || noDropService.isNoDrop(event.getCurrentItem())) + && !(dropConfirmService instanceof DropConfirmNull)) { + event.setCancelled(true); + return; + } + + if(event.getAction().equals(InventoryAction.MOVE_TO_OTHER_INVENTORY) && !event.getInventory().equals(event.getClickedInventory())) { call(event, event.getCurrentItem()); } else if(event.getAction().equals(InventoryAction.PLACE_ALL) || event.getAction().equals(InventoryAction.PLACE_ONE) || event.getAction().equals(InventoryAction.PLACE_SOME)) { call(event, event.getCursor()); } - } private void call(InventoryClickEvent event, ItemStack item) { diff --git a/src/main/java/me/redtea/nodropx/listener/PlayerHandler.java b/src/main/java/me/redtea/nodropx/listener/PlayerHandler.java index e4b5af1..8ad8bfb 100644 --- a/src/main/java/me/redtea/nodropx/listener/PlayerHandler.java +++ b/src/main/java/me/redtea/nodropx/listener/PlayerHandler.java @@ -2,8 +2,9 @@ package me.redtea.nodropx.listener; import lombok.RequiredArgsConstructor; import me.redtea.nodropx.api.event.NoDropItemThrownEvent; -import me.redtea.nodropx.gui.facade.GuiFacade; +import me.redtea.nodropx.menu.facade.MenuFacade; import me.redtea.nodropx.service.event.EventService; +import me.redtea.nodropx.service.nodrop.NoDropService; import me.redtea.nodropx.service.respawn.RespawnService; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -19,9 +20,8 @@ import java.util.Optional; public class PlayerHandler implements Listener { private final RespawnService respawnService; private final EventService eventService; - private final GuiFacade guiFacade; + private final MenuFacade menuFacade; - //TODO check for armor @EventHandler public void onDrop(PlayerDropItemEvent event) { eventService.callThrownEvent( @@ -44,7 +44,7 @@ public class PlayerHandler implements Listener { @EventHandler public void onQuit(PlayerQuitEvent event) { - guiFacade.clearCache(event.getPlayer()); + menuFacade.clearCache(event.getPlayer()); } } diff --git a/src/main/java/me/redtea/nodropx/listener/menu/SinglePageGuiHandler.java b/src/main/java/me/redtea/nodropx/listener/menu/SinglePageGuiHandler.java new file mode 100644 index 0000000..974fd95 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/listener/menu/SinglePageGuiHandler.java @@ -0,0 +1,40 @@ +package me.redtea.nodropx.listener.menu; + +import me.redtea.nodropx.menu.storage.singlepage.SinglePageController; +import me.redtea.nodropx.menu.storage.singlepage.SinglePageGui; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; + +public class SinglePageGuiHandler implements Listener { + private final SinglePageController controller; + private final SinglePageGui gui; + + public SinglePageGuiHandler(SinglePageController controller, SinglePageGui gui) { + this.controller = controller; + this.gui = gui; + + } + + + @EventHandler + public void onClick(InventoryClickEvent event) { + if(gui.isStorageGui(event.getInventory())) { + if(event.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY) controller.onClick(event); + } + if(gui.isStorageGui(event.getClickedInventory()) && event.getWhoClicked() instanceof Player) { + controller.onClick(event); + } + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + if(gui.isStorageGui(event.getInventory()) && event.getPlayer() instanceof Player) { + controller.onClose(event); + } + } + +} diff --git a/src/main/java/me/redtea/nodropx/menu/CachedMenu.java b/src/main/java/me/redtea/nodropx/menu/CachedMenu.java new file mode 100644 index 0000000..0497389 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/menu/CachedMenu.java @@ -0,0 +1,8 @@ +package me.redtea.nodropx.menu; + +import org.bukkit.entity.Player; + +public interface CachedMenu extends Menu { + void clearCache(Player player); + void clearAllCache(); +} diff --git a/src/main/java/me/redtea/nodropx/menu/Menu.java b/src/main/java/me/redtea/nodropx/menu/Menu.java new file mode 100644 index 0000000..67c803e --- /dev/null +++ b/src/main/java/me/redtea/nodropx/menu/Menu.java @@ -0,0 +1,7 @@ +package me.redtea.nodropx.menu; + +import org.bukkit.entity.Player; + +public interface Menu { + void open(Player player); +} diff --git a/src/main/java/me/redtea/nodropx/menu/dropconfirm/DropConfirmMFGui.java b/src/main/java/me/redtea/nodropx/menu/dropconfirm/DropConfirmMFGui.java new file mode 100644 index 0000000..4320186 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/menu/dropconfirm/DropConfirmMFGui.java @@ -0,0 +1,38 @@ +package me.redtea.nodropx.menu.dropconfirm; + +import dev.triumphteam.gui.builder.item.ItemBuilder; +import dev.triumphteam.gui.guis.Gui; +import me.redtea.nodropx.libs.message.container.Messages; +import me.redtea.nodropx.menu.Menu; +import me.redtea.nodropx.service.dropconfirm.DropConfirmService; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +public class DropConfirmMFGui implements Menu { + private final Gui gui; + public DropConfirmMFGui(Messages messages, DropConfirmService dropConfirmService) { + gui = Gui.gui() + .rows(1) + .title(messages.get("gui.confirm.title").asComponent()) + .disableAllInteractions() + .create(); + gui.setItem(1, ItemBuilder.from(messages.get("gui.confirm.yesButton.material").toMaterial()) + .name(messages.get("gui.confirm.yesButton.name").asComponent()) + .lore(messages.get("gui.confirm.yesButton.lore").asComponent()) + .asGuiItem((event -> { + dropConfirmService.confirm((Player) event.getWhoClicked()); + event.getWhoClicked().dropItem(true); + event.getWhoClicked().closeInventory(); + }))); + gui.setItem(7, ItemBuilder.from(messages.get("gui.confirm.noButton.material").toMaterial()) + .name(messages.get("gui.confirm.noButton.name").asComponent()) + .lore(messages.get("gui.confirm.noButton.lore").asComponent()) + .asGuiItem((event -> event.getWhoClicked().closeInventory()))); + } + + @Override + public void open(Player player) { + gui.open(player); + } +} diff --git a/src/main/java/me/redtea/nodropx/menu/facade/MenuFacade.java b/src/main/java/me/redtea/nodropx/menu/facade/MenuFacade.java new file mode 100644 index 0000000..dc7316f --- /dev/null +++ b/src/main/java/me/redtea/nodropx/menu/facade/MenuFacade.java @@ -0,0 +1,12 @@ +package me.redtea.nodropx.menu.facade; + +import me.redtea.nodropx.menu.CachedMenu; +import org.bukkit.entity.Player; + +public interface MenuFacade { + CachedMenu noDropStorage(); + void openPersonalStorage(Player player); + void openConfirmDrop(Player player); + void clearCache(Player player); + void clearAllCache(); +} diff --git a/src/main/java/me/redtea/nodropx/menu/facade/impl/MenuFacadeImpl.java b/src/main/java/me/redtea/nodropx/menu/facade/impl/MenuFacadeImpl.java new file mode 100644 index 0000000..a68c38e --- /dev/null +++ b/src/main/java/me/redtea/nodropx/menu/facade/impl/MenuFacadeImpl.java @@ -0,0 +1,38 @@ +package me.redtea.nodropx.menu.facade.impl; + +import lombok.RequiredArgsConstructor; +import me.redtea.nodropx.menu.CachedMenu; +import me.redtea.nodropx.menu.Menu; +import me.redtea.nodropx.menu.facade.MenuFacade; +import org.bukkit.entity.Player; + +@RequiredArgsConstructor +public class MenuFacadeImpl implements MenuFacade { + private final CachedMenu personalStorageCachedMenu; + private final Menu confirmDropMenu; + + @Override + public CachedMenu noDropStorage() { + return personalStorageCachedMenu; + } + + @Override + public void openPersonalStorage(Player player) { + personalStorageCachedMenu.open(player); + } + + @Override + public void openConfirmDrop(Player player) { + confirmDropMenu.open(player); + } + + @Override + public void clearCache(Player player) { + personalStorageCachedMenu.clearCache(player); + } + + @Override + public void clearAllCache() { + personalStorageCachedMenu.clearAllCache(); + } +} diff --git a/src/main/java/me/redtea/nodropx/gui/pages/StorageGui.java b/src/main/java/me/redtea/nodropx/menu/storage/pages/MFPageGui.java similarity index 76% rename from src/main/java/me/redtea/nodropx/gui/pages/StorageGui.java rename to src/main/java/me/redtea/nodropx/menu/storage/pages/MFPageGui.java index c694ff0..ad00910 100644 --- a/src/main/java/me/redtea/nodropx/gui/pages/StorageGui.java +++ b/src/main/java/me/redtea/nodropx/menu/storage/pages/MFPageGui.java @@ -1,15 +1,16 @@ -package me.redtea.nodropx.gui.pages; +package me.redtea.nodropx.menu.storage.pages; import dev.triumphteam.gui.builder.item.ItemBuilder; import dev.triumphteam.gui.guis.Gui; import dev.triumphteam.gui.guis.GuiItem; import dev.triumphteam.gui.guis.ScrollingGui; import lombok.RequiredArgsConstructor; +import me.redtea.nodropx.menu.CachedMenu; import me.redtea.nodropx.libs.carcadex.repo.MutableRepo; import me.redtea.nodropx.libs.message.container.Messages; import me.redtea.nodropx.service.material.ItemStackService; import me.redtea.nodropx.service.nodrop.NoDropService; -import me.redtea.nodropx.util.MaterialUtils; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryAction; @@ -22,13 +23,14 @@ import java.util.*; import java.util.stream.Collectors; @RequiredArgsConstructor -public class StorageGui { - private final Map cache = new HashMap<>(); +public class MFPageGui implements CachedMenu { private final Messages messages; - private final MutableRepo> pagesRepo; + private final MutableRepo> personalStorageRepo; private final NoDropService noDropService; - private final Plugin plugin; private final ItemStackService itemStackService; + private final Plugin plugin; + + private final Map cache = new HashMap<>(); public void open(Player player) { if(cache.containsKey(player.getUniqueId())) { @@ -37,7 +39,7 @@ public class StorageGui { } ScrollingGui gui = Gui.scrolling() - .title(messages.get("gui.title").asComponent()) + .title(messages.get("gui.personalStorage.title").asComponent()) .rows(6) .pageSize(45) .disableAllInteractions() @@ -46,16 +48,16 @@ public class StorageGui { setButtons(gui); setAction(gui); setOnClose(gui); - for(ItemStack item : pagesRepo.get(player.getUniqueId()).orElse(new ArrayList<>())) { + for(ItemStack item : personalStorageRepo.get(player.getUniqueId()).orElse(new ArrayList<>())) { gui.addItem(ItemBuilder.from(item).asGuiItem()); } - gui.open(player); cache.put(player.getUniqueId(), gui); + gui.open(player); } private void setOnClose(ScrollingGui gui) { - gui.setCloseGuiAction(event -> pagesRepo.update(event.getPlayer().getUniqueId(), gui.getPageItems().stream() + gui.setCloseGuiAction(event -> personalStorageRepo.update(event.getPlayer().getUniqueId(), gui.getPageItems().stream() .map(GuiItem::getItemStack) .collect(Collectors.toList()))); } @@ -110,21 +112,21 @@ public class StorageGui { private void setFrame(ScrollingGui gui) { for(int i = 1; i < 10; ++i) { gui.setItem(6, i, ItemBuilder.from( - itemStackService.get(messages.get("gui.frame.material").asUnparsedString(), 1) - ).name(messages.get("gui.frame.name").asComponent()).asGuiItem(event -> event.setCancelled(true))); + itemStackService.get(messages.get("gui.personalStorage.frame.material").asUnparsedString(), 1) + ).name(messages.get("gui.personalStorage.frame.name").asComponent()).asGuiItem(event -> event.setCancelled(true))); } } private void setButtons(ScrollingGui gui) { gui.setItem(6, 3, ItemBuilder.from( - itemStackService.get(messages.get("gui.prev.material").asUnparsedString(), 1) - ).name(messages.get("gui.prev.name").asComponent()).asGuiItem(event -> { + itemStackService.get(messages.get("gui.personalStorage.prev.material").asUnparsedString(), 1) + ).name(messages.get("gui.personalStorage.prev.name").asComponent()).asGuiItem(event -> { gui.previous(); event.setCancelled(true); })); gui.setItem(6, 7, ItemBuilder.from( - itemStackService.get(messages.get("gui.next.material").asUnparsedString(), 1) - ).name(messages.get("gui.next.name").asComponent()).asGuiItem(event -> { + itemStackService.get(messages.get("gui.personalStorage.next.material").asUnparsedString(), 1) + ).name(messages.get("gui.personalStorage.next.name").asComponent()).asGuiItem(event -> { gui.next(); event.setCancelled(true); })); @@ -135,6 +137,10 @@ public class StorageGui { } public void clearAllCache() { + cache.forEach((k, v) -> { + Player player = Bukkit.getPlayer(k); + if(player != null) v.close(player); + }); cache.clear(); } diff --git a/src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageController.java b/src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageController.java new file mode 100644 index 0000000..9026bb7 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageController.java @@ -0,0 +1,50 @@ +package me.redtea.nodropx.menu.storage.singlepage; + +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import me.redtea.nodropx.libs.carcadex.repo.MutableRepo; +import me.redtea.nodropx.service.nodrop.NoDropService; +import me.redtea.nodropx.util.FoliaSupportedUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +@RequiredArgsConstructor +public class SinglePageController { + private final NoDropService noDropService; + private final SinglePageGui singlePageGui; + private final MutableRepo> personalStorageRepo; + private final FoliaSupportedUtils foliaSupportedUtils; + + private final List clickActions = Lists.newArrayList(InventoryAction.MOVE_TO_OTHER_INVENTORY, InventoryAction.PLACE_ALL, InventoryAction.PLACE_ONE, InventoryAction.PLACE_SOME, + InventoryAction.SWAP_WITH_CURSOR, InventoryAction.NOTHING, InventoryAction.COLLECT_TO_CURSOR, InventoryAction.HOTBAR_MOVE_AND_READD, InventoryAction.UNKNOWN); + + + public void onClick(InventoryClickEvent event) { + if(clickActions.contains(event.getAction()) && !(noDropService.isNoDrop(event.getCurrentItem()))) { + event.setCancelled(true); + } + foliaSupportedUtils.runTask(() -> { + for(ItemStack itemStack : event.getInventory()) { + if (itemStack != null && !noDropService.isNoDrop(itemStack)) { + event.getWhoClicked().getInventory().addItem(itemStack); + event.getInventory().remove(itemStack); + ((Player) event.getWhoClicked()).updateInventory(); + } + } + }); + + } + + public void onClose(InventoryCloseEvent event) { + Player player = (Player) event.getPlayer(); + personalStorageRepo.update(event.getPlayer().getUniqueId(), + Arrays.asList(singlePageGui.getCache().get(player.getUniqueId()).getContents())); + } +} diff --git a/src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageGui.java b/src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageGui.java new file mode 100644 index 0000000..a0ed1fd --- /dev/null +++ b/src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageGui.java @@ -0,0 +1,46 @@ +package me.redtea.nodropx.menu.storage.singlepage; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import me.redtea.nodropx.libs.carcadex.repo.MutableRepo; +import me.redtea.nodropx.libs.message.container.Messages; +import me.redtea.nodropx.menu.CachedMenu; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.*; + +@RequiredArgsConstructor +public class SinglePageGui implements CachedMenu { + private final Messages messages; + private final MutableRepo> personalStorageRepo; + @Getter + private final Map cache = new HashMap<>(); + + @Override + public void open(Player player) { + if(cache.containsKey(player.getUniqueId())) { + player.openInventory(cache.get(player.getUniqueId())); + return; + } + Inventory gui = Bukkit.createInventory(null, 54, messages.get("gui.personalStorage.title").asComponent()); + for(ItemStack item : personalStorageRepo.get(player.getUniqueId()).orElse(new ArrayList<>())) if(item != null) gui.addItem(item); + + cache.put(player.getUniqueId(), gui); + player.openInventory(gui); + } + + public void clearCache(Player player) { + cache.remove(player.getUniqueId()); + } + + public void clearAllCache() { + cache.clear(); + } + + public boolean isStorageGui(Inventory inventory) { + return cache.containsValue(inventory); + } +} diff --git a/src/main/java/me/redtea/nodropx/service/capasity/CapacityService.java b/src/main/java/me/redtea/nodropx/service/capasity/CapacityService.java new file mode 100644 index 0000000..5868657 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/service/capasity/CapacityService.java @@ -0,0 +1,21 @@ +package me.redtea.nodropx.service.capasity; + +import me.redtea.nodropx.libs.carcadex.repo.Repo; +import me.redtea.nodropx.libs.carcadex.repo.impl.yaml.YamlRepo; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.io.File; +import java.util.List; +import java.util.stream.Collectors; + +public interface CapacityService { + + + List get(ItemStack item); + void reload(); + + default List get(Material material) { + return get(new ItemStack(material)); + } +} diff --git a/src/main/java/me/redtea/nodropx/service/capasity/impl/CapacityServiceImpl.java b/src/main/java/me/redtea/nodropx/service/capasity/impl/CapacityServiceImpl.java new file mode 100644 index 0000000..0361fca --- /dev/null +++ b/src/main/java/me/redtea/nodropx/service/capasity/impl/CapacityServiceImpl.java @@ -0,0 +1,52 @@ +package me.redtea.nodropx.service.capasity.impl; + +import me.redtea.nodropx.libs.carcadex.repo.Repo; +import me.redtea.nodropx.libs.carcadex.repo.impl.yaml.YamlRepo; +import me.redtea.nodropx.service.capasity.CapacityService; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + +public class CapacityServiceImpl implements CapacityService { + private final Repo> capacityRepo; + private final Map customModelDataRequired = new HashMap<>(); + public CapacityServiceImpl(Plugin plugin) { + capacityRepo = new YamlRepo<>( + new File(plugin.getDataFolder(), "capacity.yml").toPath(), + plugin, + conf -> conf.getKeys(false).stream().collect(Collectors.toMap( + value -> { + if(value.contains("->")) { + String[] args = value.split("->"); + customModelDataRequired.put(args[0], Integer.parseInt(args[1])); + return args[0]; + } else return value; + }, + conf::getIntegerList)) + ); + } + + @Override + public List get(ItemStack item) { + String key = item.getType().name(); + Optional> result = capacityRepo.get(key); + if(!result.isPresent()) { + return Collections.emptyList(); + } + if(customModelDataRequired.containsKey(key)) { + int cmi = customModelDataRequired.get(key); + if(!item.getItemMeta().hasCustomModelData() || item.getItemMeta().getCustomModelData() != cmi) { + return Collections.emptyList(); + } + } + return result.get(); + } + + @Override + public void reload() { + capacityRepo.reload(); + } +} diff --git a/src/main/java/me/redtea/nodropx/service/dropconfirm/DropConfirmService.java b/src/main/java/me/redtea/nodropx/service/dropconfirm/DropConfirmService.java new file mode 100644 index 0000000..d5def24 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/service/dropconfirm/DropConfirmService.java @@ -0,0 +1,9 @@ +package me.redtea.nodropx.service.dropconfirm; + +import org.bukkit.entity.Player; + +public interface DropConfirmService { + boolean isConfirmed(Player player); + void confirm(Player player); + void resetConfirm(Player player); +} diff --git a/src/main/java/me/redtea/nodropx/service/dropconfirm/impl/DropConfirmNull.java b/src/main/java/me/redtea/nodropx/service/dropconfirm/impl/DropConfirmNull.java new file mode 100644 index 0000000..b52cb0b --- /dev/null +++ b/src/main/java/me/redtea/nodropx/service/dropconfirm/impl/DropConfirmNull.java @@ -0,0 +1,21 @@ +package me.redtea.nodropx.service.dropconfirm.impl; + +import me.redtea.nodropx.service.dropconfirm.DropConfirmService; +import org.bukkit.entity.Player; + +public class DropConfirmNull implements DropConfirmService { + @Override + public boolean isConfirmed(Player player) { + return true; + } + + @Override + public void confirm(Player player) { + + } + + @Override + public void resetConfirm(Player player) { + + } +} diff --git a/src/main/java/me/redtea/nodropx/service/dropconfirm/impl/DropConfirmServiceImpl.java b/src/main/java/me/redtea/nodropx/service/dropconfirm/impl/DropConfirmServiceImpl.java new file mode 100644 index 0000000..aa470b8 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/service/dropconfirm/impl/DropConfirmServiceImpl.java @@ -0,0 +1,27 @@ +package me.redtea.nodropx.service.dropconfirm.impl; + +import me.redtea.nodropx.service.dropconfirm.DropConfirmService; +import org.bukkit.entity.Player; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public class DropConfirmServiceImpl implements DropConfirmService { + private Set confirmed = new HashSet<>(); + @Override + public boolean isConfirmed(Player player) { + return confirmed.contains(player.getUniqueId()); + } + + @Override + public void confirm(Player player) { + confirmed.add(player.getUniqueId()); + } + + @Override + public void resetConfirm(Player player) { + confirmed.remove(player.getUniqueId()); + } + +} diff --git a/src/main/java/me/redtea/nodropx/service/respawn/impl/NullRespawnService.java b/src/main/java/me/redtea/nodropx/service/respawn/impl/NullRespawnService.java new file mode 100644 index 0000000..bf21ef3 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/service/respawn/impl/NullRespawnService.java @@ -0,0 +1,17 @@ +package me.redtea.nodropx.service.respawn.impl; + +import me.redtea.nodropx.service.respawn.RespawnService; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.PlayerDeathEvent; + +public class NullRespawnService implements RespawnService { + @Override + public void giveSavedItems(Player player) { + + } + + @Override + public void saveItemsBeforeDeath(PlayerDeathEvent event) { + + } +} diff --git a/src/main/java/me/redtea/nodropx/service/respawn/impl/RespawnServiceImpl.java b/src/main/java/me/redtea/nodropx/service/respawn/impl/RespawnServiceImpl.java index a3d9353..c91fe94 100644 --- a/src/main/java/me/redtea/nodropx/service/respawn/impl/RespawnServiceImpl.java +++ b/src/main/java/me/redtea/nodropx/service/respawn/impl/RespawnServiceImpl.java @@ -1,9 +1,12 @@ package me.redtea.nodropx.service.respawn.impl; import lombok.AllArgsConstructor; +import lombok.Data; import lombok.RequiredArgsConstructor; +import lombok.ToString; import me.redtea.nodropx.api.event.NoDropItemDropOnDeathEvent; import me.redtea.nodropx.libs.carcadex.repo.Repo; +import me.redtea.nodropx.service.capasity.CapacityService; import me.redtea.nodropx.service.nodrop.NoDropService; import me.redtea.nodropx.service.respawn.RespawnService; import org.bukkit.Bukkit; @@ -12,12 +15,13 @@ import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.inventory.ItemStack; import java.util.*; +import java.util.stream.Collectors; @RequiredArgsConstructor public class RespawnServiceImpl implements RespawnService { private final NoDropService noDropService; private final Map toRespawn = new HashMap<>(); - private final Repo> capacity; + private final CapacityService capacityService; @Override @@ -27,6 +31,7 @@ public class RespawnServiceImpl implements RespawnService { for(Pair pair : pairs) player.getInventory().setItem(pair.slot, pair.item); toRespawn.remove(player.getName()); } + player.updateInventory(); } @Override @@ -60,12 +65,13 @@ public class RespawnServiceImpl implements RespawnService { } @AllArgsConstructor + @ToString static class Pair { int slot; ItemStack item; } private List getProtectedSlots(ItemStack i) { - return capacity.get(i.getType().name()).orElse(new ArrayList<>()); + return capacityService.get(i); } } diff --git a/src/main/java/me/redtea/nodropx/service/storage/impl/StorageServiceImpl.java b/src/main/java/me/redtea/nodropx/service/storage/impl/StorageServiceImpl.java index 956743f..b864e4b 100644 --- a/src/main/java/me/redtea/nodropx/service/storage/impl/StorageServiceImpl.java +++ b/src/main/java/me/redtea/nodropx/service/storage/impl/StorageServiceImpl.java @@ -1,7 +1,7 @@ package me.redtea.nodropx.service.storage.impl; import lombok.RequiredArgsConstructor; -import me.redtea.nodropx.gui.facade.GuiFacade; +import me.redtea.nodropx.menu.facade.MenuFacade; import me.redtea.nodropx.libs.carcadex.repo.MutableRepo; import me.redtea.nodropx.service.nodrop.NoDropService; import me.redtea.nodropx.service.storage.StorageService; @@ -14,17 +14,17 @@ import java.util.UUID; @RequiredArgsConstructor public class StorageServiceImpl implements StorageService { - private final GuiFacade guiFacade; + private final MenuFacade menuFacade; private final MutableRepo> pagesRepo; private final NoDropService noDropService; @Override public void addItem(UUID playerId, ItemStack item) { - List items = pagesRepo.get(playerId).orElse(new ArrayList<>()); + List items = new ArrayList<>(pagesRepo.get(playerId).orElse(new ArrayList<>())); if(!noDropService.isNoDrop(item)) throw new IllegalArgumentException("Item must be no drop!"); items.add(item); pagesRepo.update(playerId, items); - guiFacade.clearCache(Bukkit.getPlayer(playerId)); + menuFacade.clearCache(Bukkit.getPlayer(playerId)); } @Override @@ -33,7 +33,7 @@ public class StorageServiceImpl implements StorageService { if(items == null) return; items.remove(item); pagesRepo.update(playerId, items); - guiFacade.clearCache(Bukkit.getPlayer(playerId)); + menuFacade.clearCache(Bukkit.getPlayer(playerId)); } @Override diff --git a/src/main/java/me/redtea/nodropx/util/ConfigVerifier.java b/src/main/java/me/redtea/nodropx/util/ConfigVerifier.java new file mode 100644 index 0000000..fa78114 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/util/ConfigVerifier.java @@ -0,0 +1,37 @@ +package me.redtea.nodropx.util; + +import org.bukkit.configuration.Configuration; +import org.bukkit.configuration.MemoryConfiguration; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.plugin.Plugin; + +import java.util.HashMap; +import java.util.Map; + +/* + Verify for versions: + - 1.0.2 + - 1.0.3 + */ +public class ConfigVerifier { + public void verifyDefaults(Plugin plugin) { + Map properties = new HashMap(){{ + put("forceUseLegacy", false); + put("forceUseMD5Colors", false); + + //1.0.3 + put("checkForUpdates", true); + put("personalStorageType", "SINGLE_PAGE"); + put("confirmThrowNoDropItem", true); + put("forceUseFoliaPatches", false); + }}; + + plugin.saveDefaultConfig(); + FileConfiguration config = plugin.getConfig(); + for(Map.Entry entry : properties.entrySet()) { + if(!config.contains(entry.getKey(), true)) + plugin.getConfig().set(entry.getKey(), entry.getValue()); + } + plugin.saveConfig(); + } +} diff --git a/src/main/java/me/redtea/nodropx/util/FoliaSupportedUtils.java b/src/main/java/me/redtea/nodropx/util/FoliaSupportedUtils.java new file mode 100644 index 0000000..93c8f25 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/util/FoliaSupportedUtils.java @@ -0,0 +1,18 @@ +package me.redtea.nodropx.util; + +import lombok.RequiredArgsConstructor; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +@RequiredArgsConstructor +public class FoliaSupportedUtils { + private final Plugin plugin; + + public void runTask(Runnable runnable) { + try { + Bukkit.getScheduler().runTask(plugin, runnable); + } catch (UnsupportedOperationException e) { + new Thread(runnable).start(); + } + } +} diff --git a/src/main/java/me/redtea/nodropx/util/MaterialUtils.java b/src/main/java/me/redtea/nodropx/util/MaterialUtils.java index 4f5fc65..aba6f01 100644 --- a/src/main/java/me/redtea/nodropx/util/MaterialUtils.java +++ b/src/main/java/me/redtea/nodropx/util/MaterialUtils.java @@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; public class MaterialUtils { - public void remove(Inventory inventory, Material type, int amount) { + public static void remove(Inventory inventory, Material type, int amount) { if (amount <= 0) return; int size = inventory.getSize(); for (int slot = 0; slot < size; slot++) { diff --git a/src/main/java/me/redtea/nodropx/util/UpdateChecker.java b/src/main/java/me/redtea/nodropx/util/UpdateChecker.java index 53952d8..a296d9c 100644 --- a/src/main/java/me/redtea/nodropx/util/UpdateChecker.java +++ b/src/main/java/me/redtea/nodropx/util/UpdateChecker.java @@ -1,6 +1,5 @@ package me.redtea.nodropx.util; -import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import java.io.IOException; @@ -12,14 +11,19 @@ import java.util.function.Consumer; public class UpdateChecker { private final JavaPlugin plugin; private final int resourceId; + private final FoliaSupportedUtils foliaSupportedUtils; - public UpdateChecker(JavaPlugin plugin, int resourceId) { + + public UpdateChecker(JavaPlugin plugin, int resourceId, FoliaSupportedUtils foliaSupportedUtils) { this.plugin = plugin; this.resourceId = resourceId; + + this.foliaSupportedUtils = foliaSupportedUtils; } + public void getVersion(final Consumer consumer) { - Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { + foliaSupportedUtils.runTask(() -> { try (InputStream is = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId).openStream(); Scanner scann = new Scanner(is)) { if (scann.hasNext()) { consumer.accept(scann.next()); @@ -28,5 +32,7 @@ public class UpdateChecker { plugin.getLogger().info("Unable to check for updates: " + e.getMessage()); } }); + + } } diff --git a/src/main/resources/capacity.yml b/src/main/resources/capacity.yml index 1b2b149..d042d69 100644 --- a/src/main/resources/capacity.yml +++ b/src/main/resources/capacity.yml @@ -1 +1,3 @@ -CHAINMAIL_HELMET: [ 9, 10, 11, 12, 13, 14, 15, 16, 17 ] \ No newline at end of file +CHAINMAIL_HELMET: [ 9, 10, 11, 12, 13, 14, 15, 16, 17 ] +#MATERIAL->CUSTOM_MODEL_DATA +DIAMOND_HELMET->1000: [ 9, 10, 11, 12, 13, 14, 15, 16, 17 ] \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ac87002..08f186f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,3 +1,10 @@ forceUseLegacy: false forceUseMD5Colors: false -checkForUpdates: true \ No newline at end of file +forceUseFoliaPatches: false + +checkForUpdates: true + +confirmThrowNoDropItem: true + +#Can be SINGLE_PAGE or MULTI_PAGES +personalStorageType: SINGLE_PAGE diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ed9c779..71d3686 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,6 +6,7 @@ description: Set no drop status to your items author: itzRedTea authors: [itzRedTea] softdepend: [ItemsAdder] +folia-supported: true permissions: nodropx.give: diff --git a/src/main/resources/text/legacy/messages.yml b/src/main/resources/text/legacy/messages.yml index 1de5e53..abf7639 100644 --- a/src/main/resources/text/legacy/messages.yml +++ b/src/main/resources/text/legacy/messages.yml @@ -17,13 +17,26 @@ noConsole: "&4&l[!] &cOnly players can use it!" noExists: "&4&l[!] &cThis player doesnt exists!" gui: - title: "&lPersonal storage" - frame: - name: "&7" - material: GLASS_PANE - prev: - name: "&cPrevious" - material: ARROW - next: - name: "&cNext" - material: ARROW \ No newline at end of file + confirm: + title: "&lConfirm drop" + yesButton: + name: "&aYES" + lore: + - "&7Confirm throw no drop item" + material: ARROW + noButton: + name: "&cNO" + lore: + - "&7Cancel throw no drop item" + material: ARROW + personalStorage: + title: "&lPersonal storage" + frame: + name: "&7" + material: GLASS_PANE + prev: + name: "&cPrevious" + material: ARROW + next: + name: "&cNext" + material: ARROW \ No newline at end of file diff --git a/src/main/resources/text/md5/cosmetics.yml b/src/main/resources/text/md5/cosmetics.yml index 51bf120..3d2847f 100644 --- a/src/main/resources/text/md5/cosmetics.yml +++ b/src/main/resources/text/md5/cosmetics.yml @@ -1,3 +1,4 @@ #name: "No drop" lore: - - "&7[&a✔&7] Dcf0cNcd41fo fd932dIdd46rMe259obe76cp eec7fiRf192tVf5a6eYfab9mdffcc!!" \ No newline at end of file + - "&7[&a✔&7] Dcf0cNcd41fo fd932dIdd46rMe259obe76cp eec7fiRf192tVf5a6eYfab9mdffcc!!" + diff --git a/src/main/resources/text/md5/messages.yml b/src/main/resources/text/md5/messages.yml index 1de5e53..6628936 100644 --- a/src/main/resources/text/md5/messages.yml +++ b/src/main/resources/text/md5/messages.yml @@ -17,13 +17,26 @@ noConsole: "&4&l[!] &cOnly players can use it!" noExists: "&4&l[!] &cThis player doesnt exists!" gui: - title: "&lPersonal storage" - frame: - name: "&7" - material: GLASS_PANE - prev: - name: "&cPrevious" - material: ARROW - next: - name: "&cNext" - material: ARROW \ No newline at end of file + confirm: + title: "&lConfirm drop" + yesButton: + name: "&aYES" + lore: + - "&7Confirm throw no drop item" + material: GREEN_WOOL + noButton: + name: "&cNO" + lore: + - "&7Cancel throw no drop item" + material: RED_WOOL + personalStorage: + title: "&lPersonal storage" + frame: + name: "&7" + material: GLASS_PANE + prev: + name: "&cPrevious" + material: ARROW + next: + name: "&cNext" + material: ARROW \ No newline at end of file diff --git a/src/main/resources/text/mm/cosmetics.yml b/src/main/resources/text/mm/cosmetics.yml index b9d0365..c59c3ea 100644 --- a/src/main/resources/text/mm/cosmetics.yml +++ b/src/main/resources/text/mm/cosmetics.yml @@ -1,3 +1,3 @@ #name: "No drop" lore: - - "[✔] No drop item!" \ No newline at end of file + - "[✔] No drop item!" diff --git a/src/main/resources/text/mm/messages.yml b/src/main/resources/text/mm/messages.yml index a94ff17..e250a6c 100644 --- a/src/main/resources/text/mm/messages.yml +++ b/src/main/resources/text/mm/messages.yml @@ -17,13 +17,26 @@ noConsole: "[!] Only players can use it!" noExists: "[!] This player doesnt exists!" gui: - title: "Personal storage" - frame: - name: "" - material: GLASS_PANE - prev: - name: "Previous" - material: ARROW - next: - name: "Next" - material: ARROW \ No newline at end of file + confirm: + title: "Confirm throw" + yesButton: + name: "YES" + lore: + - "Confirm throw no drop item" + material: GREEN_WOOL + noButton: + name: "NO" + lore: + - "Cancel throw no drop item" + material: RED_WOOL + personalStorage: + title: "Personal storage" + frame: + name: "" + material: GLASS_PANE + prev: + name: "Previous" + material: ARROW + next: + name: "Next" + material: ARROW \ No newline at end of file