From 50bb40d701c27bd028dec924b64972d2223cca24 Mon Sep 17 00:00:00 2001 From: Denis Istratov Date: Thu, 6 Nov 2025 02:05:22 +0300 Subject: [PATCH] v1.1.0 - 1.21 support, itemsadder fix 1.21.X support, update messages.yml, replace kotlin libs to java libs, itemsadder material search fix, documented (no) ignoreConfirm command, onDrag handle in singlepage gui, colorful name fix in singlepage --- build.gradle | 29 ++-- src/main/java/me/redtea/nodropx/NoDropX.java | 126 +++++++++++++----- .../redtea/nodropx/command/NoDropCommand.java | 77 ++++++----- .../redtea/nodropx/folia/FoliaSupporter.java | 10 +- .../listener/menu/SinglePageGuiHandler.java | 8 ++ .../menu/facade/impl/NullMenuFacadeImpl.java | 47 +++++++ .../singlepage/SinglePageController.java | 28 ++-- .../storage/singlepage/SinglePageGui.java | 8 +- .../impl/ItemsAdderProvider.java | 8 +- .../respawn/impl/RespawnServiceImpl.java | 1 + src/main/resources/config.yml | 3 +- src/main/resources/text/legacy/messages.yml | 10 ++ src/main/resources/text/md5/messages.yml | 10 ++ src/main/resources/text/mm/messages.yml | 10 ++ 14 files changed, 279 insertions(+), 96 deletions(-) create mode 100644 src/main/java/me/redtea/nodropx/menu/facade/impl/NullMenuFacadeImpl.java diff --git a/build.gradle b/build.gradle index ee3cf05..c6adce2 100644 --- a/build.gradle +++ b/build.gradle @@ -2,11 +2,10 @@ plugins { id 'java' id("com.github.johnrengelman.shadow") version "7.0.0" id("xyz.jpenilla.run-paper") version "2.1.0" - id 'org.jetbrains.kotlin.jvm' version '1.9.23' } group = 'me.redtea' -version = '1.0.5-HOTFIX' +version = '1.1.0-STABLE' repositories { mavenCentral() @@ -33,22 +32,25 @@ repositories { maven { url 'https://jitpack.io' } + maven { + url = "https://repo.triumphteam.dev/snapshots/" + } } dependencies { - runtimeOnly("org.jetbrains.kotlin:kotlin-reflect:1.9.23") implementation "org.jetbrains:annotations:24.0.0" compileOnly "org.projectlombok:lombok:1.18.26" annotationProcessor 'org.projectlombok:lombok:1.18.26' compileOnly "com.destroystokyo.paper:paper-api:1.16.5-R0.1-SNAPSHOT" - // implementation "me.mattstudios.utils:matt-framework:1.4" - implementation "tech.carcadex:kotlinbukkitkit-commands:1.0.0.4b-SNAPSHOT" - implementation "de.tr7zw:item-nbt-api:2.12.3" + // implementation "tech.carcadex:kotlinbukkitkit-commands:1.0.0.4b-SNAPSHOT" + implementation "de.tr7zw:item-nbt-api:2.15.3" implementation "net.kyori:adventure-api:4.14.0" implementation "net.kyori:adventure-platform-bukkit:4.3.0" implementation files("libs/MiniMessages.jar") - implementation "dev.triumphteam:triumph-gui:3.1.2" - compileOnly "com.github.LoneDev6:API-ItemsAdder:3.5.0b" + implementation "dev.triumphteam:triumph-gui:3.1.13" + implementation "dev.triumphteam:triumph-cmd-bukkit:2.0.0-BETA-4" + + compileOnly "com.github.LoneDev6:API-ItemsAdder:3.6.1" compileOnly files("libs/nodropxforgebridge-1.4.jar") } @@ -68,11 +70,7 @@ tasks.withType(JavaCompile).configureEach { } } -compileKotlin { - kotlinOptions { - jvmTarget=1.8 - } -} + processResources { def props = [version: version] @@ -85,9 +83,8 @@ processResources { shadowJar { - relocate 'de.tr7zw.changeme.nbtapi', 'me.redtea.nodropx.libs.tr7zw.nbt' - relocate 'de.tr7zw.annotations', 'me.redtea.nodropx.libs.tr7zw.annotations' - relocate 'dev.triumphteam', 'me.redtea.nodropx.libs.gui' + relocate 'de.tr7zw', 'me.redtea.nodropx.libs.tr7zw' + relocate 'dev.triumphteam', 'me.redtea.nodropx.libs.triumphteam' relocate 'org.checkerframework', 'me.redtea.nodropx.libs.message.oskarsmc.libs.checker' relocate 'org.intellij', 'me.redtea.nodropx.libs.intellij' relocate 'org.jetbrains', 'me.redtea.nodropx.libs.jetbrains'} diff --git a/src/main/java/me/redtea/nodropx/NoDropX.java b/src/main/java/me/redtea/nodropx/NoDropX.java index 45ca653..0bc64c9 100644 --- a/src/main/java/me/redtea/nodropx/NoDropX.java +++ b/src/main/java/me/redtea/nodropx/NoDropX.java @@ -1,7 +1,10 @@ package me.redtea.nodropx; -import kotlin.Unit; -import kotlin.jvm.functions.Function1; +import dev.triumphteam.cmd.bukkit.BukkitCommandManager; +import dev.triumphteam.cmd.core.argument.keyed.Argument; +import dev.triumphteam.cmd.core.argument.keyed.ArgumentKey; +import dev.triumphteam.cmd.core.message.MessageKey; +import dev.triumphteam.cmd.core.suggestion.SuggestionKey; import lombok.Getter; import me.redtea.nodropx.api.facade.NoDropAPI; import me.redtea.nodropx.api.facade.impl.NoDropXFacade; @@ -26,6 +29,7 @@ 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.facade.impl.NullMenuFacadeImpl; import me.redtea.nodropx.menu.storage.pages.MFPageGui; import me.redtea.nodropx.menu.storage.singlepage.SinglePageController; import me.redtea.nodropx.menu.storage.singlepage.SinglePageGui; @@ -59,12 +63,13 @@ import me.redtea.nodropx.util.FoliaSupportedUtils; import me.redtea.nodropx.util.UpdateChecker; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.ServicePriority; import org.bukkit.plugin.java.JavaPlugin; -import tech.carcadex.kotlinbukkitkit.commands.manager.CommandManager; import java.io.File; import java.util.List; @@ -149,25 +154,65 @@ public final class NoDropX extends JavaPlugin { Bukkit.getServicesManager().register(NoDropAPI.class, noDropAPI, this, ServicePriority.Normal); - CommandManager commandManager = CommandManager.get(this); - commandManager.message("#no-perm", sender -> { - messages.get("noPerms").send(sender); - return Unit.INSTANCE; +// CommandManager commandManager = CommandManager.get(this); +// commandManager.message("#no-perm", sender -> { +// messages.get("noPerms").send(sender); +// return Unit.INSTANCE; +// }); +// commandManager.message("#for-players-only", sender -> { +// messages.get("noConsole").send(sender); +// return Unit.INSTANCE; +// }); +// commandManager.message("#no-such-player", sender -> { +// messages.get("noExists").send(sender); +// return Unit.INSTANCE; +// }); +// commandManager.message("#no-such-player", sender -> { +// messages.get("usage").send(sender); +// return Unit.INSTANCE; +// }); +// commandManager.tabComplete("#materials", input -> itemStackService.allMaterials()); +// commandManager.register(new NoDropCommand(messages, noDropAPI, menuFacade, this, +// itemStackService, dropConfirmService, eventService, allNoDropService)); + final BukkitCommandManager commandManager = BukkitCommandManager.create(this, builder -> { + }); - commandManager.message("#for-players-only", sender -> { - messages.get("noConsole").send(sender); - return Unit.INSTANCE; - }); - commandManager.message("#no-such-player", sender -> { - messages.get("noExists").send(sender); - return Unit.INSTANCE; - }); - commandManager.message("#no-such-player", sender -> { + + commandManager.registerNamedArguments( + ArgumentKey.of("query-parameters"), + Argument.forBoolean().name("rev").longName("reversed").build(), + Argument.forInt().name("r").longName("radius").suggestion(SuggestionKey.of("radius")).build(), + Argument.forString().name("since").build(), + Argument.forString().name("before").build(), + Argument.forString().name("cause").build(), + Argument.forString().name("at").build(), + Argument.forType(Material.class).name("material").build(), + Argument.forString().name("bounds").build(), + Argument.forType(Material.class).name("ma").build(), + Argument.listOf(String.class).name("a").build(), + Argument.listOf(Material.class).name("m").build(), + Argument.listOf(Player.class).name("p").build() + ); + + commandManager.registerStaticSuggestion(SuggestionKey.of("allmaterials"), itemStackService.allMaterials()); + + + + commandManager.registerMessage(MessageKey.TOO_MANY_ARGUMENTS, (sender, context) -> { messages.get("usage").send(sender); - return Unit.INSTANCE; }); - commandManager.tabComplete("#materials", input -> itemStackService.allMaterials()); - commandManager.register(new NoDropCommand(messages, noDropAPI, menuFacade, this, + commandManager.registerMessage(MessageKey.UNKNOWN_COMMAND, (sender, context) -> { + messages.get("usage").send(sender); + }); + commandManager.registerMessage(MessageKey.NOT_ENOUGH_ARGUMENTS, (sender, context) -> { + messages.get("usage").send(sender); + }); + commandManager.registerMessage(MessageKey.INVALID_ARGUMENT, (sender, context) -> { + messages.get("error").send(sender); + }); + + + commandManager.registerCommand(new NoDropCommand(messages, noDropAPI, menuFacade, this, itemStackService, dropConfirmService, eventService, allNoDropService)); bStatsInit(); printCredits(); @@ -175,24 +220,32 @@ public final class NoDropX extends JavaPlugin { } private MenuFacade initMenus() { - CachedMenu personalStorageCachedMenu; - if (Objects.requireNonNull(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); + try { + CachedMenu personalStorageCachedMenu; + if (Objects.requireNonNull(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, this); - return new MenuFacadeImpl(personalStorageCachedMenu, confirmMenu); + Menu confirmMenu = new DropConfirmMFGui(messages, dropConfirmService, this); + return new MenuFacadeImpl(personalStorageCachedMenu, confirmMenu); + } catch (Exception e) { + Bukkit.getLogger().severe(e.getMessage()); + e.printStackTrace(); + printConsoleLine("&4Can not use menus on this server!"); + } + + return new NullMenuFacadeImpl(); } private ItemStackService initItemStackService() { ItemStackService result = new ItemStackServiceImpl(); if (Bukkit.getPluginManager().getPlugin("ItemsAdder") != null) { supportItemsAdder = true; - getLogger().info(ChatColor.GREEN + "ItemsAdder found! Registering a CustomStack provider for it."); + printConsoleLine("ItemsAdder found! Registering a CustomStack provider for it."); result.registerProvider(new ItemsAdderProvider()); } result.registerProvider(new ItemStackProviderDefault()); @@ -205,10 +258,10 @@ public final class NoDropX extends JavaPlugin { } new UpdateChecker(this, 111485, foliaSupportedUtils).getVersion(version -> { if (this.getDescription().getVersion().equals(version)) { - getLogger().info(ChatColor.GREEN + "There is not a new update available."); + printConsoleLine("There is not a new update available."); } else { - getLogger().info(ChatColor.YELLOW + "There is a new update available: " + ChatColor.GOLD + version); - getLogger().info(ChatColor.YELLOW + "Download it from " + ChatColor.GOLD + "https://www.spigotmc.org/resources/nodropx.111485/"); + printConsoleLine("&eThere is a new update available: " + ChatColor.GOLD + version); + printConsoleLine("&eDownload it from " + ChatColor.GOLD + "https://www.spigotmc.org/resources/nodropx.111485/"); } }); } @@ -222,7 +275,7 @@ public final class NoDropX extends JavaPlugin { private void printCredits() { printCreditLine("&a************************************************************"); - printCreditLine("&a* &2&lNoDrop&a&lX&e version &6" + getDescription().getVersion() + "&7 (uses KotlinBukkitKIT v. 1.0.4)"); + printCreditLine("&a* &2&lNoDrop&a&lX&e version &6" + getDescription().getVersion()); printCreditLine("&a* &eBy &citzRedTea"); printCreditLine("&a* &eDetected bukkit version &6" + Bukkit.getBukkitVersion()); printCreditLine("&a* &esupport HEX colors " + (supportHEX ? "&2YES" : "&4NO")); @@ -230,6 +283,11 @@ public final class NoDropX extends JavaPlugin { printCreditLine("&a************************************************************"); } + private void printConsoleLine(String s) { + Bukkit.getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', + "&e[&2&lNoDrop&a&lX&e] &f" + s)); + } + private void printCreditLine(String s) { Bukkit.getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', s)); } diff --git a/src/main/java/me/redtea/nodropx/command/NoDropCommand.java b/src/main/java/me/redtea/nodropx/command/NoDropCommand.java index 37b682c..f685b44 100644 --- a/src/main/java/me/redtea/nodropx/command/NoDropCommand.java +++ b/src/main/java/me/redtea/nodropx/command/NoDropCommand.java @@ -1,5 +1,11 @@ package me.redtea.nodropx.command; +import dev.triumphteam.cmd.bukkit.annotation.Permission; +import dev.triumphteam.cmd.core.annotations.Command; +import dev.triumphteam.cmd.core.annotations.NamedArguments; +import dev.triumphteam.cmd.core.annotations.Optional; +import dev.triumphteam.cmd.core.annotations.Suggestion; +import dev.triumphteam.cmd.core.suggestion.SuggestionContext; import lombok.RequiredArgsConstructor; import lombok.val; import me.redtea.nodropx.NoDropX; @@ -12,20 +18,22 @@ import me.redtea.nodropx.service.event.EventService; import me.redtea.nodropx.service.material.ItemStackService; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import tech.carcadex.kotlinbukkitkit.commands.reflection.annotations.*; import java.util.Date; +import java.util.List; /** * Main command of plugin *

/nodrop - usage

*

/nodrop give [Player] [Material] [Amount (optional)]

*/ -@Command(name = "nodrop") +@Command("nodrop") @RequiredArgsConstructor public class NoDropCommand { private final Messages messages; @@ -37,17 +45,20 @@ public class NoDropCommand { private final EventService eventService; private final AllNoDropService allNoDropService; - @Default + @Command public void onDefault(final CommandSender sender) { messages.get("usage").send(sender); } - @SubCommand(name = "give") - @Permission(perm = "nodropx.give") - @TabComplete(complete = {"#players", "#materials", "#range:1-64"}) + + + @Command("give") + @Permission("nodropx.give") + @NamedArguments("query-parameters") + //@TabComplete(complete = {"#players", "#materials", "#range:1-64"}) public void onGive(final CommandSender sender, final Player player, - final String material, + @Suggestion("allmaterials") final String material, @Optional final Integer amount) { try { noDropAPI.giveNoDrop(player, material, amount == null || amount == 0 ? 1 : amount); @@ -57,22 +68,24 @@ public class NoDropCommand { .replaceAll("%amount%", amount == null ? "1" : amount.toString()) .send(sender); } catch (Throwable e) { + e.printStackTrace(); messages.get("give.fail").send(sender); } } - @SubCommand(name = "reload") - @Permission(perm = "nodropx.reload") + @Command("reload") + @Permission("nodropx.reload") public void onReload(final CommandSender sender) { long time = new Date().getTime(); plugin.onReload(); messages.get("reload").replaceAll("%time%", String.valueOf(new Date().getTime() - time)).send(sender); } - @SubCommand(name = "giveStorage") - @Permission(perm = "nodropx.giveStorage") - @TabComplete(complete = {"#players", "#materials", "#range:1-64"}) + @Command("givestorage") + @Permission("nodropx.giveStorage") + @NamedArguments("query-parameters") + //@TabComplete(complete = {"#players", "#materials", "#range:1-64"}) public void onGiveStorage(final CommandSender sender, final String playerName, final String material, @@ -96,14 +109,14 @@ public class NoDropCommand { } - @SubCommand(name = "ignoreConfirm") - @Permission(perm = "nodropx.ignoreConfirm") + @Command("ignoreconfirm") + @Permission("nodropx.ignoreConfirm") public void onIgnoreConfirm(final CommandSender sender, @Optional Player target) { if(target == null) { if(!(sender instanceof Player)) { - sender.sendMessage("player only"); - return; + messages.get("error").send(sender); } else { + messages.get("ignoreConfirm.on").send(sender); confirmService.forceConfirm((Player) sender); } } else { @@ -111,17 +124,17 @@ public class NoDropCommand { } } - @SubCommand(name = "ignoreConfirmTimed") - @Permission(perm = "nodropx.ignoreConfirm.timed") + @Command("ignoreconfirmtimed") + @Permission("nodropx.ignoreConfirm.timed") public void onIgnoreConfirmTimed(final CommandSender sender, Integer sec, @Optional Player target) { if(target == null) { if(!(sender instanceof Player)) { - sender.sendMessage("player only"); - return; + messages.get("error").send(sender); } else { confirmService.forceConfirm((Player) sender); try { Bukkit.getScheduler().runTaskLater(plugin,() -> confirmService.removeForceConfirm((Player) sender),20L*sec); + messages.get("ignoreConfirm.on").send(sender); } catch (UnsupportedOperationException e) { sender.sendMessage(ChatColor.RED + "This operation didn't supports on your environment"); } @@ -136,22 +149,22 @@ public class NoDropCommand { } } - @SubCommand(name = "noIgnoreConfirm") - @Permission(perm = "nodropx.noIgnoreConfirm") + @Command("noignoreconfirm") + @Permission("nodropx.noIgnoreConfirm") public void onNoIgnoreConfirm(final CommandSender sender, @Optional Player target) { if(target == null) { if(!(sender instanceof Player)) { - sender.sendMessage("player only"); - return; + messages.get("error").send(sender); } else { confirmService.removeForceConfirm((Player) sender); + messages.get("ignoreConfirm.off").send(sender); } } else { confirmService.removeForceConfirm(target); } } - @SubCommand(name = "applyHand") - @Permission(perm = "nodropx.applyhand") + @Command("applyhand") + @Permission("nodropx.applyhand") public void onApplyHand(final Player sender) { try { val event = eventService.callPlayerChangeNoDropEvent(sender, sender.getInventory().getItemInMainHand(), true); @@ -162,9 +175,8 @@ public class NoDropCommand { } } - @SubCommand(name = "gui") - @Aliases(aliases = "storage") - @Permission(perm = "nodropx.gui") + @Command(value = "gui", alias = "storage") + @Permission("nodropx.gui") public void onGui(final Player sender) { menuFacade.openPersonalStorage(sender); } @@ -177,9 +189,10 @@ public class NoDropCommand { return null; } - @SubCommand(name = "giveallnodrop") - @Permission(perm = "nodropx.giveallnodrop") - @TabComplete(complete = {"#players", "#materials", "#range:1-64"}) + @Command("giveallnodrop") + @Permission("nodropx.giveallnodrop") + @NamedArguments("query-parameters") + // @TabComplete(complete = {"#players", "#materials", "#range:1-64"}) public void onGiveAllNoDrop(final CommandSender sender, final Player player, final String material, diff --git a/src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java b/src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java index b360294..558f489 100644 --- a/src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java +++ b/src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java @@ -26,8 +26,14 @@ public class FoliaSupporter { @SneakyThrows public void run(RespawnService respawnService, Plugin plugin) { try { + boolean isFolia = false; + try { + Class.forName("io.papermc.paper.threadedregions.RegionizedServer"); + isFolia = true; + } catch (ClassNotFoundException ignored) {} String version = ((JsonObject) new JsonParser().parse(new FileReader("version_history.json"))).get("currentVersion").getAsString(); - if(!version.toLowerCase().contains("folia") && !plugin.getConfig().getBoolean("forceUseFoliaPatches")) { + if(!isFolia && !version.toLowerCase().contains("folia") && !plugin.getConfig().getBoolean("forceUseFoliaPatches") + && !(Bukkit.getName().toLowerCase().contains("folia"))) { return; } runningOnFolia = true; @@ -56,7 +62,7 @@ public class FoliaSupporter { } } try { - Thread.sleep(1000); + Thread.sleep(500); } catch (InterruptedException e) { throw new RuntimeException(e); } diff --git a/src/main/java/me/redtea/nodropx/listener/menu/SinglePageGuiHandler.java b/src/main/java/me/redtea/nodropx/listener/menu/SinglePageGuiHandler.java index 974fd95..bdfc576 100644 --- a/src/main/java/me/redtea/nodropx/listener/menu/SinglePageGuiHandler.java +++ b/src/main/java/me/redtea/nodropx/listener/menu/SinglePageGuiHandler.java @@ -8,6 +8,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryDragEvent; public class SinglePageGuiHandler implements Listener { private final SinglePageController controller; @@ -19,6 +20,13 @@ public class SinglePageGuiHandler implements Listener { } + @EventHandler + public void onDrag(InventoryDragEvent event) { + if(gui.isStorageGui(event.getInventory())) { + controller.onDrag(event); + } + } + @EventHandler public void onClick(InventoryClickEvent event) { diff --git a/src/main/java/me/redtea/nodropx/menu/facade/impl/NullMenuFacadeImpl.java b/src/main/java/me/redtea/nodropx/menu/facade/impl/NullMenuFacadeImpl.java new file mode 100644 index 0000000..86d76eb --- /dev/null +++ b/src/main/java/me/redtea/nodropx/menu/facade/impl/NullMenuFacadeImpl.java @@ -0,0 +1,47 @@ +package me.redtea.nodropx.menu.facade.impl; + +import me.redtea.nodropx.menu.CachedMenu; +import me.redtea.nodropx.menu.facade.MenuFacade; +import org.bukkit.entity.Player; + +public class NullMenuFacadeImpl implements MenuFacade { + @Override + public CachedMenu noDropStorage() { + return new CachedMenu() { + @Override + public void clearCache(Player player) { + + } + + @Override + public void clearAllCache() { + + } + + @Override + public void open(Player player) { + + } + }; + } + + @Override + public void openPersonalStorage(Player player) { + + } + + @Override + public void openConfirmDrop(Player player) { + + } + + @Override + public void clearCache(Player player) { + + } + + @Override + public void clearAllCache() { + + } +} 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 index 9026bb7..5f33d93 100644 --- a/src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageController.java +++ b/src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageController.java @@ -5,10 +5,10 @@ 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.HumanEntity; 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.event.inventory.*; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import java.util.Arrays; @@ -30,16 +30,28 @@ public class SinglePageController { if(clickActions.contains(event.getAction()) && !(noDropService.isNoDrop(event.getCurrentItem()))) { event.setCancelled(true); } + foliaCheck(event.getInventory(), event.getWhoClicked(), event); + + } + + public void onDrag(InventoryDragEvent event) { + if((event.getNewItems().entrySet().stream().anyMatch(it -> !noDropService.isNoDrop(it.getValue())))) { + event.setCancelled(true); + } + foliaCheck(event.getInventory(), event.getWhoClicked(), event); + + } + + private void foliaCheck(Inventory inventory, HumanEntity whoClicked, InventoryEvent event) { foliaSupportedUtils.runTask(() -> { - for(ItemStack itemStack : event.getInventory()) { + for(ItemStack itemStack : inventory) { if (itemStack != null && !noDropService.isNoDrop(itemStack)) { - event.getWhoClicked().getInventory().addItem(itemStack); - event.getInventory().remove(itemStack); - ((Player) event.getWhoClicked()).updateInventory(); + whoClicked.getInventory().addItem(itemStack); + inventory.remove(itemStack); + ((Player) whoClicked).updateInventory(); } } }); - } public void onClose(InventoryCloseEvent event) { 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 index b7b3cfb..e577647 100644 --- a/src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageGui.java +++ b/src/main/java/me/redtea/nodropx/menu/storage/singlepage/SinglePageGui.java @@ -26,7 +26,13 @@ public class SinglePageGui implements CachedMenu { player.openInventory(cache.get(player.getUniqueId())); return; } - Inventory gui = Bukkit.createInventory(null, 54, MD5ColorUtils.translateHexColorCodes(messages.get("gui.personalStorage.title").asUnparsedString())); + Inventory gui; + try { + gui = Bukkit.createInventory(null, 54, messages.get("gui.personalStorage.title").asComponent()); + } + catch (Throwable e) { + gui = Bukkit.createInventory(null, 54, MD5ColorUtils.translateHexColorCodes(messages.get("gui.personalStorage.title").asUnparsedString())); + } for(ItemStack item : personalStorageRepo.get(player.getUniqueId()).orElse(new ArrayList<>())) if(item != null) gui.addItem(item); cache.put(player.getUniqueId(), gui); diff --git a/src/main/java/me/redtea/nodropx/model/materialprovider/impl/ItemsAdderProvider.java b/src/main/java/me/redtea/nodropx/model/materialprovider/impl/ItemsAdderProvider.java index 0196fa7..639b89e 100644 --- a/src/main/java/me/redtea/nodropx/model/materialprovider/impl/ItemsAdderProvider.java +++ b/src/main/java/me/redtea/nodropx/model/materialprovider/impl/ItemsAdderProvider.java @@ -5,17 +5,21 @@ import dev.lone.itemsadder.api.ItemsAdder; import me.redtea.nodropx.model.materialprovider.ItemStackProvider; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; public class ItemsAdderProvider implements ItemStackProvider { @Override public ItemStack get(String s) { - return CustomStack.getInstance(s).getItemStack(); + CustomStack stack = CustomStack.getInstance(s); + return (stack != null) ? stack.getItemStack() : null; } @Override public List allMaterials() { - return ItemsAdder.getAllItems().stream().map(CustomStack::getNamespacedID).collect(Collectors.toList()); + if((ItemsAdder.getAllItems() == null) || ItemsAdder.getAllItems().isEmpty()) return Collections.emptyList(); + return ItemsAdder.getAllItems().stream().map(CustomStack::getNamespacedID).filter(s -> !s.startsWith("_iainternal")).collect(Collectors.toList()); } } 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 243a661..7c5c35f 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 @@ -34,6 +34,7 @@ public class RespawnServiceImpl implements RespawnService { Pair[] pairs = toRespawn.get(player.getName()); for(Pair pair : pairs) player.getInventory().setItem(pair.slot, pair.item); toRespawn.remove(player.getName()); + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 57240af..866d3a2 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,3 +1,5 @@ +# Dev's discord tag - itzredtea + forceUseLegacy: false forceUseMD5Colors: false forceUseFoliaPatches: false @@ -8,6 +10,5 @@ checkForUpdates: true # Use it on your own risk confirmThrowNoDropItem: false -#Single did not supports minimessages! #Can be SINGLE_PAGE or MULTI_PAGES (Use MULTI_PAGES on your own risk) personalStorageType: SINGLE_PAGE diff --git a/src/main/resources/text/legacy/messages.yml b/src/main/resources/text/legacy/messages.yml index f02b038..caec5c9 100644 --- a/src/main/resources/text/legacy/messages.yml +++ b/src/main/resources/text/legacy/messages.yml @@ -1,6 +1,12 @@ usage: - "&7[ &aUsage of command &e/nodrop &7]" - "&7| &a/nodrop give [player] [item] (amount) &e- give no drop item" + - "&7| &a/nodrop storage &e- open no drop items storage" + - "&7| &a/nodrop giveStorage [player] [material] (amount) &e- Gives nodrop item to the player's personal storage" + - "&7| &a/nodrop giveallnodrop [player] [material] (amount) &e- Gives allnodrop item to player" + - "&7| &a/nodrop ignoreconfirm &e- Ignore confirm gui (only if confirm enabled)" + - "&7| &a/nodrop ignoreconfirmtimed [seconds] &e- Timed ignore confirm gui (only if confirm enabled)" + - "&7| &a/nodrop noIgnoreConfirm &e- Drop ignore confirm setting (only if confirm enabled)" give: fail: "&4[!] &cFail! Check item type for valid." success: "&2&l[!] &aGived &e%item%&a to &e%player%&a amount &e%amount%&a!" @@ -11,10 +17,14 @@ applyHand: giveToStorage: fail: "&4[!] &cFail! Check item type for valid." success: "&2&l[!] &aGived &e%item%&a to &e%player%&a amount &e%amount%&a to storage!" +ignoreConfirm: + on: "&2&l[!] &aNow you are ignore confirm menu!" + off: "&2&l[!] &aNow you are not ignore confirm menu!" noPerms: "&4&l[!] &cNo perms for this!" noConsole: "&4&l[!] &cOnly players can use it!" noExists: "&4&l[!] &cThis player doesnt exists!" +error: "&4&l[!] &cAn error occurred during the execution of the command!" gui: confirm: diff --git a/src/main/resources/text/md5/messages.yml b/src/main/resources/text/md5/messages.yml index ae7750c..6df9088 100644 --- a/src/main/resources/text/md5/messages.yml +++ b/src/main/resources/text/md5/messages.yml @@ -1,6 +1,12 @@ usage: - "&7[ &aUsage of command &e/nodrop &7]" - "&7| &a/nodrop give [player] [item] (amount) &e- give no drop item" + - "&7| &a/nodrop storage &e- open no drop items storage" + - "&7| &a/nodrop giveStorage [player] [material] (amount) &e- Gives nodrop item to the player's personal storage" + - "&7| &a/nodrop giveAllNoDrop [player] [material] (amount) &e- Gives allnodrop item to player" + - "&7| &a/nodrop ignoreConfirm &e- Ignore confirm gui (only if confirm enabled)" + - "&7| &a/nodrop ignoreConfirmTimed [seconds] &e- Timed ignore confirm gui (only if confirm enabled)" + - "&7| &a/nodrop noIgnoreConfirm &e- Drop ignore confirm setting (only if confirm enabled)" give: fail: "&4[!] &cFail! Check item type for valid." success: "&2&l[!] &aGived &e%item%&a to &e%player%&a amount &e%amount%&a!" @@ -11,10 +17,14 @@ applyHand: giveToStorage: fail: "&4[!] &cFail! Check item type for valid." success: "&2&l[!] &aGived &e%item%&a to &e%player%&a amount &e%amount%&a to storage!" +ignoreConfirm: + on: "&2&l[!] &aNow you are ignore confirm menu!" + off: "&2&l[!] &aNow you are not ignore confirm menu!" noPerms: "&4&l[!] &cNo perms for this!" noConsole: "&4&l[!] &cOnly players can use it!" noExists: "&4&l[!] &cThis player doesnt exists!" +error: "&4&l[!] &cAn error occurred during the execution of the command!" gui: confirm: diff --git a/src/main/resources/text/mm/messages.yml b/src/main/resources/text/mm/messages.yml index fe0557e..dbdf4b0 100644 --- a/src/main/resources/text/mm/messages.yml +++ b/src/main/resources/text/mm/messages.yml @@ -1,6 +1,12 @@ usage: - "[ Usage of command /nodrop ]" - "| /nodrop give [player] [item] (amount) - give no drop item" + - "| /nodrop storage - open no drop items storage" + - "| /nodrop giveStorage [player] [material] (amount) - Gives nodrop item to the player's personal storage" + - "| /nodrop giveallnodrop [player] [material] (amount) - Gives allnodrop item to player" + - "| /nodrop ignoreConfirm - Ignore confirm gui (only if confirm enabled)" + - "| /nodrop ignoreConfirmTimed [seconds] - Timed ignore confirm gui (only if confirm enabled)" + - "| /nodrop noIgnoreConfirm - Drop ignore confirm setting (only if confirm enabled)" give: fail: "[!] Fail! Check item type for valid." success: "[!] Gived %item% to %player% amount %amount%!" @@ -11,10 +17,14 @@ applyHand: giveToStorage: fail: "[!] Fail! Check item type for valid." success: "[!] Gived %item% to %player% amount %amount% to storage!" +ignoreConfirm: + on: "[!] Now you are ignore confirm menu!" + off: "[!] Now you are not ignore confirm menu!" noPerms: "[!] No perms for this!" noConsole: "[!] Only players can use it!" noExists: "[!] This player doesnt exists!" +error: "[!] An error occurred during the execution of the command!" gui: confirm: