diff --git a/build.gradle b/build.gradle index 6f10b96..2149fbe 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'me.redtea' -version = '1.0.3c-SNAPSHOT' +version = '1.0.4-HOTFIX' repositories { mavenCentral() @@ -17,6 +17,10 @@ repositories { name = "sonatype" url = "https://oss.sonatype.org/content/groups/public/" } + maven { + name = "sonatype" + url = "https://s01.oss.sonatype.org/content/repositories/snapshots/" + } maven { name = "CodeMC" url = uri("https://repo.codemc.io/repository/maven-public/") @@ -35,8 +39,9 @@ dependencies { 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 "de.tr7zw:item-nbt-api:2.11.3" + // implementation "me.mattstudios.utils:matt-framework:1.4" + implementation("tech.carcadex:kotlinbukkitkit-commands:1.0.0.4-SNAPSHOT") + implementation "de.tr7zw:item-nbt-api:2.12.3" implementation "net.kyori:adventure-api:4.14.0" implementation "net.kyori:adventure-platform-bukkit:4.3.0" implementation files("libs/MiniMessages.jar") @@ -74,7 +79,6 @@ processResources { shadowJar { relocate 'de.tr7zw.changeme.nbtapi', 'me.redtea.nodropx.libs.tr7zw.nbt' relocate 'de.tr7zw.annotations', 'me.redtea.nodropx.libs.tr7zw.annotations' - relocate 'me.mattstudios.mf', 'me.redtea.nodropx.libs.commands' relocate 'dev.triumphteam', 'me.redtea.nodropx.libs.gui' relocate 'org.checkerframework', 'me.redtea.nodropx.libs.message.oskarsmc.libs.checker' relocate 'org.intellij', 'me.redtea.nodropx.libs.intellij' @@ -83,6 +87,6 @@ shadowJar { tasks { runServer { - minecraftVersion("1.16.5") + minecraftVersion("1.12.2") } } \ No newline at end of file diff --git a/src/main/java/me/redtea/nodropx/NoDropX.java b/src/main/java/me/redtea/nodropx/NoDropX.java index 2b90304..45ca653 100644 --- a/src/main/java/me/redtea/nodropx/NoDropX.java +++ b/src/main/java/me/redtea/nodropx/NoDropX.java @@ -1,7 +1,8 @@ package me.redtea.nodropx; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; import lombok.Getter; -import me.mattstudios.mf.base.CommandManager; import me.redtea.nodropx.api.facade.NoDropAPI; import me.redtea.nodropx.api.facade.impl.NoDropXFacade; import me.redtea.nodropx.command.NoDropCommand; @@ -32,6 +33,8 @@ 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.allnodrop.AllNoDropService; +import me.redtea.nodropx.service.allnodrop.impl.AllNoDropServiceImpl; import me.redtea.nodropx.service.capasity.CapacityService; import me.redtea.nodropx.service.capasity.impl.CapacityServiceImpl; import me.redtea.nodropx.service.cosmetic.CosmeticService; @@ -56,13 +59,16 @@ import me.redtea.nodropx.util.FoliaSupportedUtils; import me.redtea.nodropx.util.UpdateChecker; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; 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; +import java.util.Objects; import java.util.UUID; public final class NoDropX extends JavaPlugin { @@ -111,7 +117,8 @@ public final class NoDropX extends JavaPlugin { NoDropItemFactory noDropItemFactory = new NoDropItemFactoryImpl(noDropService); EventService eventService = new EventServiceImpl(noDropService); capacityService = new CapacityServiceImpl(this); - RespawnService respawnService = new RespawnServiceImpl(noDropService, capacityService); + AllNoDropService allNoDropService = new AllNoDropServiceImpl(nbtService); + RespawnService respawnService = new RespawnServiceImpl(noDropService, allNoDropService, capacityService); //EXPERIMENTAL! Folia support! FoliaSupporter foliaSupporter = new FoliaSupporter(); @@ -129,7 +136,9 @@ public final class NoDropX extends JavaPlugin { StorageService storageService = new StorageServiceImpl(menuFacade, personalStorageRepo, noDropService); - NoDropAPI noDropAPI = new NoDropXFacade(noDropService, noDropItemFactory, storageService, capacityService, itemStackService); + + NoDropAPI noDropAPI = new NoDropXFacade(noDropService, noDropItemFactory, storageService, capacityService, + itemStackService, allNoDropService); noDropAPIInstance = noDropAPI; @@ -140,13 +149,26 @@ public final class NoDropX extends JavaPlugin { Bukkit.getServicesManager().register(NoDropAPI.class, noDropAPI, this, ServicePriority.Normal); - CommandManager commandManager = new CommandManager(this); - commandManager.getMessageHandler().register("cmd.no.permission", sender -> messages.get("noPerms").send(sender)); - commandManager.getMessageHandler().register("cmd.no.console", sender -> messages.get("noConsole").send(sender)); - 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, menuFacade, this, itemStackService, dropConfirmService)); + 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)); bStatsInit(); printCredits(); checkUpdates(); @@ -154,7 +176,7 @@ public final class NoDropX extends JavaPlugin { private MenuFacade initMenus() { CachedMenu personalStorageCachedMenu; - if (getConfig().getString("personalStorageType").equalsIgnoreCase("SINGLE_PAGE")) { + 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, @@ -183,10 +205,10 @@ public final class NoDropX extends JavaPlugin { } new UpdateChecker(this, 111485, foliaSupportedUtils).getVersion(version -> { if (this.getDescription().getVersion().equals(version)) { - getLogger().info("There is not a new update available."); + getLogger().info(ChatColor.GREEN + "There is not a new update available."); } else { - getLogger().info("There is a new update available: " + version); - getLogger().info("Download it from https://www.spigotmc.org/resources/nodropx.111485/"); + 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/"); } }); } @@ -200,7 +222,7 @@ public final class NoDropX extends JavaPlugin { private void printCredits() { printCreditLine("&a************************************************************"); - printCreditLine("&a* &eNoDropX version &6" + getDescription().getVersion() + "&7 (uses CarcadeX v. 1.0.7)"); + printCreditLine("&a* &2&lNoDrop&a&lX&e version &6" + getDescription().getVersion() + "&7 (uses KotlinBukkitKIT v. 1.0.4)"); printCreditLine("&a* &eBy &citzRedTea"); printCreditLine("&a* &eDetected bukkit version &6" + Bukkit.getBukkitVersion()); printCreditLine("&a* &esupport HEX colors " + (supportHEX ? "&2YES" : "&4NO")); diff --git a/src/main/java/me/redtea/nodropx/api/event/ChangeNoDropEvent.java b/src/main/java/me/redtea/nodropx/api/event/PlayerChangeNoDropEvent.java similarity index 79% rename from src/main/java/me/redtea/nodropx/api/event/ChangeNoDropEvent.java rename to src/main/java/me/redtea/nodropx/api/event/PlayerChangeNoDropEvent.java index c5c45bc..5f81cef 100644 --- a/src/main/java/me/redtea/nodropx/api/event/ChangeNoDropEvent.java +++ b/src/main/java/me/redtea/nodropx/api/event/PlayerChangeNoDropEvent.java @@ -11,10 +11,10 @@ import org.jetbrains.annotations.NotNull; /** * This event is called when item changes no drop status */ -public class ChangeNoDropEvent extends PlayerEvent implements Cancellable { +public class PlayerChangeNoDropEvent extends PlayerEvent implements Cancellable { private static final HandlerList handlers = new HandlerList(); - @Getter + private final boolean newValue; @Getter @@ -23,7 +23,7 @@ public class ChangeNoDropEvent extends PlayerEvent implements Cancellable { private boolean isCancelled; - public ChangeNoDropEvent(@NotNull Player who, boolean newValue, @NotNull ItemStack item) { + public PlayerChangeNoDropEvent(@NotNull Player who, boolean newValue, @NotNull ItemStack item) { super(who); this.newValue = newValue; this.item = item; @@ -48,4 +48,7 @@ public class ChangeNoDropEvent extends PlayerEvent implements Cancellable { return handlers; } + public boolean getNewValue() { + return newValue; + } } 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 6088504..00adacd 100644 --- a/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java +++ b/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java @@ -144,4 +144,55 @@ public interface NoDropAPI { default @NotNull ItemStack getNoDrop(@NotNull String material) { return getNoDrop(material, 1); } + + /** + * Set AllNoDrop + * @param item the item who's AllNoDrop property are changing + * @param isAllNoDrop will the item save all items in player's inventory from death? + * @author redtea + * @since 1.0.4 + */ + ItemStack setAllNoDrop(@NotNull ItemStack item, boolean isAllNoDrop); + + /** + * Check if item is AllNoDrop + * @param item the item being checked + * @return true if the item save all items in player's inventory from death + * @author redtea + * @since 1.0.4 + */ + boolean isAllNoDrop(@NotNull ItemStack item); + + /** + * Generate new nodropall item by material and amount + * @param material material of item + * @param amount count of item + * @return nodropall item + * @author redtea + * @since 1.0.4 + */ + default ItemStack getAllNoDrop(@NotNull Material material, int amount) { + val item = new ItemStack(material, amount); + setAllNoDrop(item, true); + return item; + } + + /** + * Generate new nodropall item by material and amount + * @param material material of item + * @param amount count of item + * @return nodropall item + * @author redtea + * @since 1.0.4 + */ + + /** + * @see NoDropAPI#getAllNoDrop(Material, int) + */ + ItemStack getAllNoDrop(@NotNull String material, int amount); + + /** + * @see NoDropAPI#getAllNoDrop(Material, int) + */ + void giveAllNoDrop(HumanEntity entity, @NotNull String material, int amount); } 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 cff9c1e..11016f4 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.allnodrop.AllNoDropService; import me.redtea.nodropx.service.capasity.CapacityService; import me.redtea.nodropx.service.material.ItemStackService; import me.redtea.nodropx.service.nodrop.NoDropService; @@ -27,6 +28,7 @@ public class NoDropXFacade implements NoDropAPI { private final StorageService storageService; private final CapacityService capacityService; private final ItemStackService itemStackService; + private final AllNoDropService allNoDropService; @Override public ItemStack setNoDrop(@NotNull ItemStack item, boolean isNoDrop) { @@ -99,4 +101,25 @@ public class NoDropXFacade implements NoDropAPI { public @NotNull ItemStack getNoDrop(@NotNull String material, int amount) { return setNoDrop(itemStackService.get(material, amount), true); } + + @Override + public ItemStack setAllNoDrop(@NotNull ItemStack item, boolean isAllNoDrop) { + allNoDropService.setAllNoDrop(item, isAllNoDrop); + return item; + } + + @Override + public boolean isAllNoDrop(@NotNull ItemStack item) { + return allNoDropService.isAllNoDrop(item); + } + + @Override + public ItemStack getAllNoDrop(@NotNull String material, int amount) { + return setAllNoDrop(itemStackService.get(material, amount), true); + } + + @Override + public void giveAllNoDrop(HumanEntity entity, @NotNull String material, int amount) { + entity.getInventory().addItem(getAllNoDrop(material, amount)); + } } diff --git a/src/main/java/me/redtea/nodropx/command/NoDropCommand.java b/src/main/java/me/redtea/nodropx/command/NoDropCommand.java index 8b5fc31..a4afe59 100644 --- a/src/main/java/me/redtea/nodropx/command/NoDropCommand.java +++ b/src/main/java/me/redtea/nodropx/command/NoDropCommand.java @@ -2,20 +2,22 @@ package me.redtea.nodropx.command; import lombok.RequiredArgsConstructor; import lombok.val; -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.menu.facade.MenuFacade; import me.redtea.nodropx.libs.message.container.Messages; +import me.redtea.nodropx.service.allnodrop.AllNoDropService; import me.redtea.nodropx.service.dropconfirm.DropConfirmService; +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.Nullable; +import tech.carcadex.kotlinbukkitkit.commands.reflection.annotations.*; import java.util.Date; @@ -24,24 +26,26 @@ import java.util.Date; *

/nodrop - usage

*

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

*/ -@Command("nodrop") +@Command(name = "nodrop") @RequiredArgsConstructor -public class NoDropCommand extends CommandBase { +public class NoDropCommand { private final Messages messages; private final NoDropAPI noDropAPI; private final MenuFacade menuFacade; private final NoDropX plugin; private final ItemStackService itemStackService; private final DropConfirmService confirmService; + private final EventService eventService; + private final AllNoDropService allNoDropService; @Default public void onDefault(final CommandSender sender) { messages.get("usage").send(sender); } - @SubCommand("give") - @Permission("nodropx.give") - @Completion({"#players", "#materials", "#range:1-64"}) + @SubCommand(name = "give") + @Permission(perm = "nodropx.give") + @TabComplete(complete = {"#players", "#materials", "#range:1-64"}) public void onGive(final CommandSender sender, final Player player, final String material, @@ -59,17 +63,17 @@ public class NoDropCommand extends CommandBase { } - @SubCommand("reload") - @Permission("nodropx.reload") + @SubCommand(name = "reload") + @Permission(perm = "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("giveStorage") - @Permission("nodropx.giveStorage") - @Completion({"#players", "#materials", "#range:1-64"}) + @SubCommand(name = "giveStorage") + @Permission(perm = "nodropx.giveStorage") + @TabComplete(complete = {"#players", "#materials", "#range:1-64"}) public void onGiveStorage(final CommandSender sender, final String playerName, final String material, @@ -93,8 +97,8 @@ public class NoDropCommand extends CommandBase { } - @SubCommand("ignoreConfirm") - @Permission("nodropx.ignoreConfirm") + @SubCommand(name = "ignoreConfirm") + @Permission(perm = "nodropx.ignoreConfirm") public void onIgnoreConfirm(final CommandSender sender, @Optional Player target) { if(target == null) { if(!(sender instanceof Player)) { @@ -108,8 +112,8 @@ public class NoDropCommand extends CommandBase { } } - @SubCommand("ignoreConfirmTimed") - @Permission("nodropx.ignoreConfirm.timed") + @SubCommand(name = "ignoreConfirmTimed") + @Permission(perm = "nodropx.ignoreConfirm.timed") public void onIgnoreConfirmTimed(final CommandSender sender, Integer sec, @Optional Player target) { if(target == null) { if(!(sender instanceof Player)) { @@ -133,8 +137,8 @@ public class NoDropCommand extends CommandBase { } } - @SubCommand("noIgnoreConfirm") - @Permission("nodropx.noIgnoreConfirm") + @SubCommand(name = "noIgnoreConfirm") + @Permission(perm = "nodropx.noIgnoreConfirm") public void onNoIgnoreConfirm(final CommandSender sender, @Optional Player target) { if(target == null) { if(!(sender instanceof Player)) { @@ -147,20 +151,21 @@ public class NoDropCommand extends CommandBase { confirmService.removeForceConfirm(target); } } - @SubCommand("applyHand") - @Permission("nodropx.applyhand") + @SubCommand(name = "applyHand") + @Permission(perm = "nodropx.applyhand") public void onApplyHand(final Player sender) { try { - noDropAPI.setNoDrop(sender.getInventory().getItemInMainHand(), true); + val event = eventService.callPlayerChangeNoDropEvent(sender, sender.getInventory().getItemInMainHand(), true); + noDropAPI.setNoDrop(sender.getInventory().getItemInMainHand(), event.getNewValue()); messages.get("applyHand.success").send(sender); } catch (Throwable e) { messages.get("applyHand.fail").send(sender); } } - @SubCommand("gui") - @Alias("storage") - @Permission("nodropx.gui") + @SubCommand(name = "gui") + @Aliases(aliases = "storage") + @Permission(perm = "nodropx.gui") public void onGui(final Player sender) { menuFacade.openPersonalStorage(sender); } @@ -172,4 +177,23 @@ public class NoDropCommand extends CommandBase { } return null; } + + @SubCommand(name = "giveallnodrop") + @Permission(perm = "nodropx.giveallnodrop") + @TabComplete(complete = {"#players", "#materials", "#range:1-64"}) + public void onGiveAllNoDrop(final CommandSender sender, + final Player player, + final String material, + @Optional final Integer amount) { + try { + noDropAPI.giveAllNoDrop(player, material, amount == null || amount == 0 ? 1 : amount); + messages.get("give.success") + .replaceAll("%item%", material) + .replaceAll("%player%", player.getName()) + .replaceAll("%amount%", amount == null ? "1" : amount.toString()) + .send(sender); + } catch (Throwable e) { + messages.get("give.fail").send(sender); + } + } } diff --git a/src/main/java/me/redtea/nodropx/service/allnodrop/AllNoDropService.java b/src/main/java/me/redtea/nodropx/service/allnodrop/AllNoDropService.java new file mode 100644 index 0000000..3c2ab92 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/service/allnodrop/AllNoDropService.java @@ -0,0 +1,27 @@ +package me.redtea.nodropx.service.allnodrop; + +import org.bukkit.inventory.ItemStack; + +/** + * Service for checking all no drop items + * @since 1.0.4 + * @author redtea + */ +public interface AllNoDropService { + /** + * Set no drop to item + * @param item the item who's no drop property are changing + * @param isAllNoDrop will the item can drop from inventory on death? + * @author redtea + * @since 1.0.4 + */ + void setAllNoDrop(ItemStack item, boolean isAllNoDrop); + /** + * Check if item is NoDropAll + * @param item the item being checked + * @return true if item is NoDropAll + * @author redtea + * @since 1.0.4 + */ + boolean isAllNoDrop(ItemStack item); +} diff --git a/src/main/java/me/redtea/nodropx/service/allnodrop/impl/AllNoDropServiceImpl.java b/src/main/java/me/redtea/nodropx/service/allnodrop/impl/AllNoDropServiceImpl.java new file mode 100644 index 0000000..3cef491 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/service/allnodrop/impl/AllNoDropServiceImpl.java @@ -0,0 +1,22 @@ +package me.redtea.nodropx.service.allnodrop.impl; + +import lombok.RequiredArgsConstructor; +import me.redtea.nodropx.service.allnodrop.AllNoDropService; +import me.redtea.nodropx.service.nbt.NBTService; +import org.bukkit.inventory.ItemStack; + +@RequiredArgsConstructor +public class AllNoDropServiceImpl implements AllNoDropService { + private final NBTService nbtService; + + @Override + public void setAllNoDrop(ItemStack item, boolean isAllNoDrop) { + nbtService.setBoolTag(item, "isAllNoDrop", isAllNoDrop); + nbtService.setBoolTag(item, "isNoDrop", isAllNoDrop); + } + + @Override + public boolean isAllNoDrop(ItemStack item) { + return nbtService.getBoolTag(item, "isAllNoDrop"); + } +} diff --git a/src/main/java/me/redtea/nodropx/service/event/EventService.java b/src/main/java/me/redtea/nodropx/service/event/EventService.java index 80a83a8..daf546c 100644 --- a/src/main/java/me/redtea/nodropx/service/event/EventService.java +++ b/src/main/java/me/redtea/nodropx/service/event/EventService.java @@ -1,12 +1,16 @@ package me.redtea.nodropx.service.event; import me.redtea.nodropx.api.event.NoDropItemThrownEvent; +import me.redtea.nodropx.api.event.PlayerChangeNoDropEvent; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; import java.util.Optional; public interface EventService { - void callThrownEvent(Player who, ItemStack item, NoDropItemThrownEvent.Reason reason, Optional rootEvent); + PlayerChangeNoDropEvent callPlayerChangeNoDropEvent(Player who, ItemStack item, boolean value); + @Nullable + NoDropItemThrownEvent callThrownEvent(Player who, ItemStack item, NoDropItemThrownEvent.Reason reason, Optional rootEvent); } diff --git a/src/main/java/me/redtea/nodropx/service/event/impl/EventServiceImpl.java b/src/main/java/me/redtea/nodropx/service/event/impl/EventServiceImpl.java index 34bcde9..7e69c48 100644 --- a/src/main/java/me/redtea/nodropx/service/event/impl/EventServiceImpl.java +++ b/src/main/java/me/redtea/nodropx/service/event/impl/EventServiceImpl.java @@ -2,6 +2,7 @@ package me.redtea.nodropx.service.event.impl; import lombok.RequiredArgsConstructor; import me.redtea.nodropx.api.event.NoDropItemThrownEvent; +import me.redtea.nodropx.api.event.PlayerChangeNoDropEvent; import me.redtea.nodropx.service.event.EventService; import me.redtea.nodropx.service.nodrop.NoDropService; import org.bukkit.Bukkit; @@ -16,8 +17,15 @@ public class EventServiceImpl implements EventService { private final NoDropService noDropService; @Override - public void callThrownEvent(Player who, ItemStack item, NoDropItemThrownEvent.Reason reason, Optional rootEvent) { - if(!noDropService.isNoDrop(item)) return; + public PlayerChangeNoDropEvent callPlayerChangeNoDropEvent(Player who, ItemStack item, boolean value) { + PlayerChangeNoDropEvent callingEvent = new PlayerChangeNoDropEvent(who, value, item); + Bukkit.getPluginManager().callEvent(callingEvent); + return callingEvent; + } + + @Override + public NoDropItemThrownEvent callThrownEvent(Player who, ItemStack item, NoDropItemThrownEvent.Reason reason, Optional rootEvent) { + if(!noDropService.isNoDrop(item)) return null; NoDropItemThrownEvent callingEvent = new NoDropItemThrownEvent( who, reason, @@ -25,5 +33,6 @@ public class EventServiceImpl implements EventService { ); Bukkit.getPluginManager().callEvent(callingEvent); rootEvent.ifPresent(cancellable -> cancellable.setCancelled(callingEvent.isCancelled())); + return callingEvent; } } diff --git a/src/main/java/me/redtea/nodropx/service/nbt/NBTService.java b/src/main/java/me/redtea/nodropx/service/nbt/NBTService.java index db94323..774c695 100644 --- a/src/main/java/me/redtea/nodropx/service/nbt/NBTService.java +++ b/src/main/java/me/redtea/nodropx/service/nbt/NBTService.java @@ -9,18 +9,20 @@ public interface NBTService { /** * Sets the NBT tag "isNoDrop", which indicates that the item is no drop * @param item editable item - * @param isNoDrop tag value - * @since 1.0.0 + * @param tag nbt tag + * @param value tag value + * @since 1.0.4 * @author redtea */ - void setNoDropTag(ItemStack item, boolean isNoDrop); + void setBoolTag(ItemStack item, String tag, boolean value); /** * Gets the value of the "isNoDrop" tag, which indicates that the item is no drop * @param item checking item + * @param tag nbt tag * @return tag value - * @since 1.0.0 + * @since 1.0.4 * @author redtea */ - boolean getNoDropTag(ItemStack item); + boolean getBoolTag(ItemStack item, String tag); } diff --git a/src/main/java/me/redtea/nodropx/service/nbt/impl/Tr7zwNBTServiceImpl.java b/src/main/java/me/redtea/nodropx/service/nbt/impl/Tr7zwNBTServiceImpl.java index b37e382..1c04004 100644 --- a/src/main/java/me/redtea/nodropx/service/nbt/impl/Tr7zwNBTServiceImpl.java +++ b/src/main/java/me/redtea/nodropx/service/nbt/impl/Tr7zwNBTServiceImpl.java @@ -6,17 +6,19 @@ import org.bukkit.Material; import org.bukkit.inventory.ItemStack; public class Tr7zwNBTServiceImpl implements NBTService { + + @Override - public void setNoDropTag(ItemStack item, boolean isNoDrop) { + public void setBoolTag(ItemStack item, String tag, boolean value) { NBTItem nbtItem = new NBTItem(item); - nbtItem.setBoolean("isNoDrop", true); + nbtItem.setBoolean(tag, value); nbtItem.applyNBT(item); } @Override - public boolean getNoDropTag(ItemStack item) { + public boolean getBoolTag(ItemStack item, String tag) { if(item == null || item.getType() == Material.AIR) return false; NBTItem nbtItem = new NBTItem(item); - return nbtItem.hasTag("isNoDrop") && nbtItem.getBoolean("isNoDrop"); + return nbtItem.hasTag(tag) && nbtItem.getBoolean(tag); } } diff --git a/src/main/java/me/redtea/nodropx/service/nodrop/impl/NoDropServiceImpl.java b/src/main/java/me/redtea/nodropx/service/nodrop/impl/NoDropServiceImpl.java index 0d1dab0..504fd7e 100644 --- a/src/main/java/me/redtea/nodropx/service/nodrop/impl/NoDropServiceImpl.java +++ b/src/main/java/me/redtea/nodropx/service/nodrop/impl/NoDropServiceImpl.java @@ -13,13 +13,13 @@ public class NoDropServiceImpl implements NoDropService { @Override public void setNoDrop(ItemStack item, boolean isNoDrop) { - nbtService.setNoDropTag(item, isNoDrop); + nbtService.setBoolTag(item, "isNoDrop", true); cosmeticService.applyAll(item); } @Override public boolean isNoDrop(ItemStack item) { if(item == null) return false; - return nbtService.getNoDropTag(item); + return nbtService.getBoolTag(item, "isNoDrop"); } } 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 64ce01f..243a661 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 @@ -6,11 +6,13 @@ 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.allnodrop.AllNoDropService; import me.redtea.nodropx.service.capasity.CapacityService; import me.redtea.nodropx.service.dropconfirm.DropConfirmService; import me.redtea.nodropx.service.nodrop.NoDropService; import me.redtea.nodropx.service.respawn.RespawnService; import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.inventory.ItemStack; @@ -21,6 +23,7 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class RespawnServiceImpl implements RespawnService { private final NoDropService noDropService; + private final AllNoDropService allNoDropService; private final Map toRespawn = new HashMap<>(); private final CapacityService capacityService; @@ -38,9 +41,11 @@ public class RespawnServiceImpl implements RespawnService { public void saveItemsBeforeDeath(PlayerDeathEvent event) { Player player = event.getEntity(); Set noDropSlots = new HashSet<>(); + boolean isHasAllNoDropItem = event.getDrops().stream().anyMatch(allNoDropService::isAllNoDrop); for(int i = 0; i < player.getInventory().getSize(); ++i) { ItemStack item = player.getInventory().getItem(i); - if(!noDropService.isNoDrop(item)) continue; + if(!(noDropService.isNoDrop(item) || isHasAllNoDropItem) || item == null || + item.getType() == Material.AIR) continue; NoDropItemDropOnDeathEvent callingEvent = new NoDropItemDropOnDeathEvent( player, item diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 71d3686..26f79ff 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -11,6 +11,8 @@ folia-supported: true permissions: nodropx.give: description: "Allows give no drop items" + nodropx.giveallnodrop: + description: "Allows give allnodrop items" nodropx.reload: description: "Allows reload the plugin" nodropx.gui: diff --git a/src/main/resources/text/legacy/messages.yml b/src/main/resources/text/legacy/messages.yml index abf7639..f02b038 100644 --- a/src/main/resources/text/legacy/messages.yml +++ b/src/main/resources/text/legacy/messages.yml @@ -1,6 +1,6 @@ usage: - "&7[ &aUsage of command &e/nodrop &7]" - - "&7| &a/give [player] [item] (amount) &e- give no drop item" + - "&7| &a/nodrop give [player] [item] (amount) &e- give no drop item" give: fail: "&4[!] &cFail! Check item type for valid." success: "&2&l[!] &aGived &e%item%&a to &e%player%&a amount &e%amount%&a!" diff --git a/src/main/resources/text/md5/messages.yml b/src/main/resources/text/md5/messages.yml index 6628936..ae7750c 100644 --- a/src/main/resources/text/md5/messages.yml +++ b/src/main/resources/text/md5/messages.yml @@ -1,6 +1,6 @@ usage: - "&7[ &aUsage of command &e/nodrop &7]" - - "&7| &a/give [player] [item] (amount) &e- give no drop item" + - "&7| &a/nodrop give [player] [item] (amount) &e- give no drop item" give: fail: "&4[!] &cFail! Check item type for valid." success: "&2&l[!] &aGived &e%item%&a to &e%player%&a amount &e%amount%&a!" diff --git a/src/main/resources/text/mm/messages.yml b/src/main/resources/text/mm/messages.yml index e250a6c..fe0557e 100644 --- a/src/main/resources/text/mm/messages.yml +++ b/src/main/resources/text/mm/messages.yml @@ -1,6 +1,6 @@ usage: - "[ Usage of command /nodrop ]" - - "| /give [player] [item] (amount) - give no drop item" + - "| /nodrop give [player] [item] (amount) - give no drop item" give: fail: "[!] Fail! Check item type for valid." success: "[!] Gived %item% to %player% amount %amount%!"