diff --git a/build.gradle b/build.gradle index 1aeab6a..cda0941 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'me.redtea' -version = '1.0.1-SNAPSHOT' +version = '1.0.2-SNAPSHOT' repositories { mavenCentral() @@ -25,19 +25,23 @@ repositories { name = "papermc-repo" url = "https://repo.papermc.io/repository/maven-public/" } + maven { + url 'https://jitpack.io' + } } dependencies { - implementation 'org.jetbrains:annotations:24.0.0' - compileOnly 'org.projectlombok:lombok:1.18.26' + 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 'de.tr7zw:item-nbt-api:2.11.3' + implementation "de.tr7zw:item-nbt-api:2.11.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" } def targetJavaVersion = 8 diff --git a/src/main/java/me/redtea/nodropx/NoDropX.java b/src/main/java/me/redtea/nodropx/NoDropX.java index d5c7e43..5fead9f 100644 --- a/src/main/java/me/redtea/nodropx/NoDropX.java +++ b/src/main/java/me/redtea/nodropx/NoDropX.java @@ -18,14 +18,19 @@ 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.InventoryHandler; import me.redtea.nodropx.listener.PlayerHandler; 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.cosmetic.CosmeticService; import me.redtea.nodropx.service.cosmetic.impl.CosmeticServiceImpl; import me.redtea.nodropx.service.event.EventService; import me.redtea.nodropx.service.event.impl.EventServiceImpl; +import me.redtea.nodropx.service.material.ItemStackService; +import me.redtea.nodropx.service.material.impl.ItemStackServiceImpl; import me.redtea.nodropx.service.nbt.NBTService; import me.redtea.nodropx.service.nbt.impl.Tr7zwNBTServiceImpl; import me.redtea.nodropx.service.nodrop.NoDropService; @@ -60,6 +65,8 @@ public final class NoDropX extends JavaPlugin { private boolean supportHEX; @Getter private boolean supportKyoriLore; + @Getter + private boolean supportItemsAdder; private MutableRepo> pagesRepo; private Repo> capacity; @@ -74,6 +81,7 @@ public final class NoDropX extends JavaPlugin { supportHEX = textContext.isSupportHex(); supportKyoriLore = textContext.isSupportKyori(); 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()); @@ -98,14 +106,17 @@ public final class NoDropX extends JavaPlugin { .schema(new ItemStackListSchema(new File(getDataFolder(), "storage"))) .plugin(this) .build(); + ItemStackService itemStackService = initItemStackService(); GuiFacade guiFacade = new GuiFacadeImpl( - new StorageGui(messages, pagesRepo, noDropService, this) + new StorageGui(messages, pagesRepo, noDropService, this, itemStackService) ); StorageService storageService = new StorageServiceImpl(guiFacade, pagesRepo, noDropService); - NoDropAPI noDropAPI = new NoDropXFacade(noDropService, noDropItemFactory, storageService, capacity); + + + NoDropAPI noDropAPI = new NoDropXFacade(noDropService, noDropItemFactory, storageService, capacity, itemStackService); noDropAPIInstance = noDropAPI; @@ -126,13 +137,23 @@ public final class NoDropX extends JavaPlugin { 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 -> Arrays.stream(Material.values()).map(Enum::name).collect(Collectors.toList())); - commandManager.register(new NoDropCommand(messages, noDropAPI, guiFacade, this)); + commandManager.getCompletionHandler().register("#materials", input -> itemStackService.allMaterials()); + commandManager.register(new NoDropCommand(messages, noDropAPI, guiFacade, this, itemStackService)); bStatsInit(); printCredits(); checkUpdates(); } + 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."); + result.registerProvider(new ItemsAdderProvider()); + } + result.registerProvider(new ItemStackProviderDefault()); + return result; + } private void checkUpdates() { if(!(getConfig().contains("checkForUpdates") && getConfig().getBoolean("checkForUpdates"))) { @@ -143,7 +164,7 @@ public final class NoDropX extends JavaPlugin { getLogger().info("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("Download it from https://www.spigotmc.org/resources/nodropx.111485/"); } }); } 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 276ceae..16ab20c 100644 --- a/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java +++ b/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java @@ -1,5 +1,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; @@ -22,7 +23,7 @@ public interface NoDropAPI { * @author redtea * @since 1.0.0 */ - void setNoDrop(@NotNull ItemStack item, boolean isNoDrop); + ItemStack setNoDrop(@NotNull ItemStack item, boolean isNoDrop); /** * Check if item is no drop item @@ -41,8 +42,20 @@ public interface NoDropAPI { * @author redtea * @since 1.0.0 */ - ItemStack getNoDrop(@NotNull Material material, int amount); + default ItemStack getNoDrop(@NotNull Material material, int amount) { + val item = new ItemStack(material, amount); + setNoDrop(item, true); + return item; + } + /** + * Gives the entity no drop item + * @param entity who will get no drop item + * @param item no drop item + * @author redtea + * @since 1.0.0 + */ + void giveNoDrop(@NotNull HumanEntity entity, @NotNull ItemStack item); /** * Gives the entity no drop item @@ -52,7 +65,9 @@ public interface NoDropAPI { * @author redtea * @since 1.0.0 */ - void giveNoDrop(@NotNull HumanEntity entity, @NotNull Material material, int amount); + default void giveNoDrop(@NotNull HumanEntity entity, @NotNull Material material, int amount) { + giveNoDrop(entity, getNoDrop(material, amount)); + } /** * returns an object for accessing the storage of a player with UUID playerUniqueId @@ -64,7 +79,7 @@ public interface NoDropAPI { @NotNull StorageManipulator getStorageManipulator(@NotNull UUID playerUniqueId); /** - * returns the slot numbers that an no drop item with this material saves at death + * returns the slot numbers that no drop item with this material saves at death * @param material material to check * @return numbers of saved slots * @author redtea @@ -75,9 +90,7 @@ public interface NoDropAPI { /** * @see NoDropAPI#getCapacitySlots(Material) */ - default @NotNull Collection getCapacitySlots(String material) { - return getCapacitySlots(MaterialUtils.getMaterialFromString(material)); - } + @NotNull Collection getCapacitySlots(String material); /** * @see NoDropAPI#getStorageManipulator(UUID) @@ -89,9 +102,7 @@ public interface NoDropAPI { /** * @see NoDropAPI#giveNoDrop(HumanEntity, Material, int) */ - default void giveNoDrop(@NotNull HumanEntity entity, @NotNull String material, int amount) { - giveNoDrop(entity, MaterialUtils.getMaterialFromString(material), amount); - } + void giveNoDrop(@NotNull HumanEntity entity, @NotNull String material, int amount); /** * @see NoDropAPI#giveNoDrop(HumanEntity, Material, int) @@ -110,9 +121,7 @@ public interface NoDropAPI { /** * @see NoDropAPI#getNoDrop(Material, int) */ - default @NotNull ItemStack getNoDrop(@NotNull String material, int amount) { - return getNoDrop(MaterialUtils.getMaterialFromString(material), amount); - } + @NotNull ItemStack getNoDrop(@NotNull String material, int amount); /** * @see NoDropAPI#getNoDrop(Material, int) 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 40811bc..2f63c90 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.material.ItemStackService; import me.redtea.nodropx.service.nodrop.NoDropService; import me.redtea.nodropx.service.storage.StorageService; import org.bukkit.Material; @@ -24,10 +25,12 @@ public class NoDropXFacade implements NoDropAPI { private final NoDropItemFactory itemFactory; private final StorageService storageService; private final Repo> capacity; + private final ItemStackService itemStackService; @Override - public void setNoDrop(@NotNull ItemStack item, boolean isNoDrop) { + public ItemStack setNoDrop(@NotNull ItemStack item, boolean isNoDrop) { noDropService.setNoDrop(item, isNoDrop); + return item; } @Override @@ -41,6 +44,11 @@ public class NoDropXFacade implements NoDropAPI { return itemFactory.createNoDrop(material, amount); } + @Override + public void giveNoDrop(@NotNull HumanEntity entity, @NotNull ItemStack item) { + entity.getInventory().addItem(setNoDrop(item, true)); + } + @Override public void giveNoDrop(@NotNull HumanEntity entity, @NotNull Material material, int amount) { entity.getInventory().addItem(getNoDrop(material, amount)); @@ -70,4 +78,19 @@ public class NoDropXFacade implements NoDropAPI { public @NotNull Collection getCapacitySlots(Material material) { return capacity.get(material.name()).orElse(new ArrayList<>()); } + + @Override + public @NotNull Collection getCapacitySlots(String material) { + return getCapacitySlots(itemStackService.get(material, 1).getType()); + } + + @Override + public void giveNoDrop(@NotNull HumanEntity entity, @NotNull String material, int amount) { + giveNoDrop(entity, itemStackService.get(material, amount)); + } + + @Override + public @NotNull ItemStack getNoDrop(@NotNull String material, int amount) { + return setNoDrop(itemStackService.get(material, amount), true); + } } diff --git a/src/main/java/me/redtea/nodropx/command/NoDropCommand.java b/src/main/java/me/redtea/nodropx/command/NoDropCommand.java index a2cf585..8dcd168 100644 --- a/src/main/java/me/redtea/nodropx/command/NoDropCommand.java +++ b/src/main/java/me/redtea/nodropx/command/NoDropCommand.java @@ -1,14 +1,19 @@ 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.gui.facade.GuiFacade; import me.redtea.nodropx.libs.message.container.Messages; +import me.redtea.nodropx.service.material.ItemStackService; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; import java.util.Date; @@ -24,6 +29,7 @@ public class NoDropCommand extends CommandBase { private final NoDropAPI noDropAPI; private final GuiFacade guiFacade; private final NoDropX plugin; + private final ItemStackService itemStackService; @Default public void onDefault(final CommandSender sender) { @@ -31,18 +37,18 @@ public class NoDropCommand extends CommandBase { } @SubCommand("give") - @Permission("R") + @Permission("nodropx.give") @Completion({"#players", "#materials", "#range:1-64"}) public void onGive(final CommandSender sender, final Player player, final String material, @Optional final Integer amount) { try { - noDropAPI.giveNoDrop(player, material, amount == null ? 1 : amount); + noDropAPI.giveNoDrop(player, material, amount == null || amount == 0 ? 1 : amount); messages.get("give.success") .replaceAll("%item%", material) .replaceAll("%player%", player.getName()) - .replaceAll("%amount%", amount == null ? "0" : amount.toString()) + .replaceAll("%amount%", amount == null ? "1" : amount.toString()) .send(sender); } catch (Throwable e) { messages.get("give.fail").send(sender); @@ -58,9 +64,53 @@ public class NoDropCommand extends CommandBase { messages.get("reload").replaceAll("%time%", String.valueOf(new Date().getTime() - time)).send(sender); } + @SubCommand("giveStorage") + @Permission("nodropx.giveStorage") + @Completion({"#players", "#materials", "#range:1-64"}) + public void onGiveStorage(final CommandSender sender, + String playerName, + final String material, + @Optional Integer amount) { + try { + val item = noDropAPI.setNoDrop(itemStackService.get(material, amount == null || amount == 0 ? 1 : amount), true); + val player = getOfflinePlayer(playerName); + if(player == null) { + messages.get("noExists").send(sender); + return; + } + noDropAPI.getStorageManipulator(player).add(item); + messages.get("giveToStorage.success") + .replaceAll("%item%", material) + .replaceAll("%player%", playerName) + .replaceAll("%amount%", amount == null ? "0" : amount.toString()) + .send(sender); + } catch (Throwable e) { + messages.get("giveToStorage.fail").send(sender); + } + } + + @SubCommand("applyHand") + @Permission("nodropx.applyhand") + public void onApplyHand(final Player sender) { + try { + noDropAPI.setNoDrop(sender.getInventory().getItemInMainHand(), true); + messages.get("applyHand.success").send(sender); + } catch (Throwable e) { + messages.get("applyHand.fail").send(sender); + } + } + @SubCommand("gui") @Permission("nodropx.gui") public void onGui(final Player sender) { guiFacade.openNoDropStorage(sender); } + + @Nullable + private OfflinePlayer getOfflinePlayer(String name) { + for(OfflinePlayer player : Bukkit.getOfflinePlayers()) { + if(player.getName() != null && player.getName().equalsIgnoreCase(name)) return player; + } + return null; + } } diff --git a/src/main/java/me/redtea/nodropx/factory/text/TextContext.java b/src/main/java/me/redtea/nodropx/factory/text/TextContext.java index 7b35c01..607af3b 100644 --- a/src/main/java/me/redtea/nodropx/factory/text/TextContext.java +++ b/src/main/java/me/redtea/nodropx/factory/text/TextContext.java @@ -12,4 +12,5 @@ public class TextContext { private final File cosmetics; private final boolean supportHex; private final boolean supportKyori; + private final String path; } \ No newline at end of file diff --git a/src/main/java/me/redtea/nodropx/factory/text/impl/TextServicesFactoryImpl.java b/src/main/java/me/redtea/nodropx/factory/text/impl/TextServicesFactoryImpl.java index 037f090..f64ee9f 100644 --- a/src/main/java/me/redtea/nodropx/factory/text/impl/TextServicesFactoryImpl.java +++ b/src/main/java/me/redtea/nodropx/factory/text/impl/TextServicesFactoryImpl.java @@ -55,7 +55,7 @@ public class TextServicesFactoryImpl implements TextServicesFactory { cosmeticStrategy = new LoreMD5Cosmetics(); } else cosmeticStrategy = new LoreKyoriCosmetic(); - return new TextContext(cosmeticStrategy, messages, cosmetics, isSupportHEX, isSupportKyoriLore); + return new TextContext(cosmeticStrategy, messages, cosmetics, isSupportHEX, isSupportKyoriLore, "text/" + folder + "/messages.yml"); } diff --git a/src/main/java/me/redtea/nodropx/gui/pages/StorageGui.java b/src/main/java/me/redtea/nodropx/gui/pages/StorageGui.java index 7516f1e..c694ff0 100644 --- a/src/main/java/me/redtea/nodropx/gui/pages/StorageGui.java +++ b/src/main/java/me/redtea/nodropx/gui/pages/StorageGui.java @@ -7,6 +7,7 @@ import dev.triumphteam.gui.guis.ScrollingGui; import lombok.RequiredArgsConstructor; 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.Material; @@ -27,6 +28,7 @@ public class StorageGui { private final MutableRepo> pagesRepo; private final NoDropService noDropService; private final Plugin plugin; + private final ItemStackService itemStackService; public void open(Player player) { if(cache.containsKey(player.getUniqueId())) { @@ -108,20 +110,20 @@ public class StorageGui { private void setFrame(ScrollingGui gui) { for(int i = 1; i < 10; ++i) { gui.setItem(6, i, ItemBuilder.from( - MaterialUtils.getMaterialFromString(messages.get("gui.frame.material").asUnparsedString()) + itemStackService.get(messages.get("gui.frame.material").asUnparsedString(), 1) ).name(messages.get("gui.frame.name").asComponent()).asGuiItem(event -> event.setCancelled(true))); } } private void setButtons(ScrollingGui gui) { gui.setItem(6, 3, ItemBuilder.from( - MaterialUtils.getMaterialFromString(messages.get("gui.prev.material").asUnparsedString()) + itemStackService.get(messages.get("gui.prev.material").asUnparsedString(), 1) ).name(messages.get("gui.prev.name").asComponent()).asGuiItem(event -> { gui.previous(); event.setCancelled(true); })); gui.setItem(6, 7, ItemBuilder.from( - MaterialUtils.getMaterialFromString(messages.get("gui.next.material").asUnparsedString()) + itemStackService.get(messages.get("gui.next.material").asUnparsedString(), 1) ).name(messages.get("gui.next.name").asComponent()).asGuiItem(event -> { gui.next(); event.setCancelled(true); diff --git a/src/main/java/me/redtea/nodropx/libs/message/container/Messages.java b/src/main/java/me/redtea/nodropx/libs/message/container/Messages.java index 3047b52..18f1e4c 100644 --- a/src/main/java/me/redtea/nodropx/libs/message/container/Messages.java +++ b/src/main/java/me/redtea/nodropx/libs/message/container/Messages.java @@ -5,6 +5,7 @@ import me.redtea.nodropx.libs.message.factory.MessageFactory; import me.redtea.nodropx.libs.message.factory.impl.LegacyFactoryImpl; import me.redtea.nodropx.libs.message.model.Message; import me.redtea.nodropx.libs.message.model.impl.NullMessage; +import me.redtea.nodropx.libs.message.verifier.MessageVerifier; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.Plugin; @@ -119,7 +120,11 @@ public interface Messages { /** *

Sets custom message parse factory.

*/ - void factory(MessageFactory messageFactory); + Messages factory(MessageFactory messageFactory); + + Messages init(); + + void setVerifier(MessageVerifier verifier); /** *

Create container using configuration section

@@ -134,7 +139,7 @@ public interface Messages { * @return container with messages */ static Messages of(ConfigurationSection section) { - return new MessagesImpl(section); + return new MessagesImpl(section).init(); } /** @@ -168,7 +173,7 @@ public interface Messages { * @return container with messages */ static Messages of(Plugin plugin) { - return of(plugin, "text/legacy/messages.yml"); + return of(plugin, "messages.yml"); } /** @@ -202,28 +207,24 @@ public interface Messages { * @return container with messages */ static Messages legacy(ConfigurationSection section) { - return asLegacy(of(section)); + return new MessagesImpl(section).factory(new LegacyFactoryImpl()).init(); } /** @see Messages#legacy(ConfigurationSection) */ static Messages legacy(Plugin plugin, String fileName) { - return asLegacy(of(plugin, fileName)); + File file = new File(plugin.getDataFolder(), fileName); + if(!file.exists()) plugin.saveResource(fileName, false); + return new MessagesImpl(file).factory(new LegacyFactoryImpl()).init(); } /** @see Messages#legacy(ConfigurationSection) */ static Messages legacy(Plugin plugin) { - return asLegacy(of(plugin)); + return legacy(plugin, "messages.yml"); } /** @see Messages#legacy(ConfigurationSection) */ static Messages legacy(File file) { - return asLegacy(of(file)); - } - - /** @see Messages#legacy(ConfigurationSection) */ - static Messages asLegacy(Messages messages) { - messages.factory(new LegacyFactoryImpl()); - return messages; + return new MessagesImpl(file).factory(new LegacyFactoryImpl()).init(); } /** 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 0a4c464..a7a7b51 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 @@ -1,5 +1,7 @@ package me.redtea.nodropx.libs.message.container.impl; +import lombok.Setter; +import me.redtea.nodropx.libs.message.verifier.MessageVerifier; import me.redtea.nodropx.libs.message.container.Messages; import me.redtea.nodropx.libs.message.factory.MessageFactory; import me.redtea.nodropx.libs.message.model.Message; @@ -11,6 +13,7 @@ import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.Optional; public class MessagesImpl implements Messages { private Map messages; @@ -19,25 +22,51 @@ public class MessagesImpl implements Messages { private final Message NULL_MESSAGE = factory.nullMessage(); + private ConfigurationSection section; + + @Setter + private MessageVerifier verifier; + public MessagesImpl() { } public MessagesImpl(@NotNull ConfigurationSection section) { - messages = fromConfigurationToMap(section); + this.section = section; + } + public MessagesImpl(@NotNull ConfigurationSection section, MessageVerifier verifier) { + this.section = section; + this.verifier = verifier; } public MessagesImpl(@NotNull File file) { this(YamlConfiguration.loadConfiguration(file)); } + public MessagesImpl(@NotNull File file, MessageVerifier verifier) { + this(YamlConfiguration.loadConfiguration(file)); + this.verifier = verifier; + } + + + @Override public Message get(String key) { - return messages.get(key); + if(!has(key)) { + if(verifier != null) { + Optional def = verifier.fromDefault(key); + if(def.isPresent()) { + messages.put(key, factory.message(def.get())); + return messages.get(key); + } + return NULL_MESSAGE; + } + return NULL_MESSAGE; + } + return messages.get(key) == null ? NULL_MESSAGE : messages.get(key); } @Override public Message put(String key, Message message) { - if(!has(key)) return NULL_MESSAGE; return messages.put(key, message); } @@ -52,8 +81,15 @@ public class MessagesImpl implements Messages { } @Override - public void factory(MessageFactory messageFactory) { + public Messages factory(MessageFactory messageFactory) { this.factory = messageFactory; + return this; + } + + @Override + public Messages init() { + messages = fromConfigurationToMap(section); + return this; } private Map fromConfigurationToMap(@NotNull ConfigurationSection section) { 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 new file mode 100644 index 0000000..50fa39b --- /dev/null +++ b/src/main/java/me/redtea/nodropx/libs/message/verifier/MessageVerifier.java @@ -0,0 +1,7 @@ +package me.redtea.nodropx.libs.message.verifier; + +import java.util.Optional; + +public interface MessageVerifier { + 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 new file mode 100644 index 0000000..a16b241 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/libs/message/verifier/impl/FileMessageVerifier.java @@ -0,0 +1,38 @@ +package me.redtea.nodropx.libs.message.verifier.impl; + +import lombok.SneakyThrows; +import me.redtea.nodropx.libs.message.verifier.MessageVerifier; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Optional; + +public class FileMessageVerifier implements MessageVerifier { + private ConfigurationSection defaultSection; + + private final FileConfiguration toSaveSection; + private final File toSaveFile; + + public FileMessageVerifier(InputStream defaultResource, FileConfiguration toSaveSection, File toSaveFile) { + defaultSection = YamlConfiguration.loadConfiguration(new InputStreamReader(defaultResource)); + this.toSaveSection = toSaveSection; + this.toSaveFile = toSaveFile; + } + + @Override + public Optional fromDefault(String key) { + Optional o = Optional.ofNullable(defaultSection.getString(key)); + o.ifPresent(s -> saveToMain(key, s)); + return o; + } + + @SneakyThrows + public void saveToMain(String path, Object obj) { + toSaveSection.set(path, obj); + toSaveSection.save(toSaveFile); + } +} diff --git a/src/main/java/me/redtea/nodropx/model/materialprovider/ItemStackProvider.java b/src/main/java/me/redtea/nodropx/model/materialprovider/ItemStackProvider.java new file mode 100644 index 0000000..11ab8c0 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/model/materialprovider/ItemStackProvider.java @@ -0,0 +1,10 @@ +package me.redtea.nodropx.model.materialprovider; + +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public interface ItemStackProvider { + ItemStack get(String s); + List allMaterials(); +} diff --git a/src/main/java/me/redtea/nodropx/model/materialprovider/impl/ItemStackProviderDefault.java b/src/main/java/me/redtea/nodropx/model/materialprovider/impl/ItemStackProviderDefault.java new file mode 100644 index 0000000..2c91061 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/model/materialprovider/impl/ItemStackProviderDefault.java @@ -0,0 +1,36 @@ +package me.redtea.nodropx.model.materialprovider.impl; + +import me.redtea.nodropx.model.materialprovider.ItemStackProvider; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class ItemStackProviderDefault implements ItemStackProvider { + @Override + public ItemStack get(String s) { + if(s == null || s.equals("")) return new ItemStack(Material.AIR); + Material material = Material.matchMaterial(s); + if(material != null) return new ItemStack(material); + + String[] spl = s.split(":"); + + if (spl[0].equals("minecraft")) { + material = Material.matchMaterial(spl[1]); + } else { + if(spl.length < 2) { + material = Material.matchMaterial(spl[0]); + } else { + material = Material.matchMaterial(spl[0]+"_"+spl[1]);; + } + } + return new ItemStack(material == null ? Material.AIR : material); + } + + @Override + public List allMaterials() { + return Arrays.stream(Material.values()).map(Enum::name).collect(Collectors.toList()); + } +} 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 new file mode 100644 index 0000000..0196fa7 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/model/materialprovider/impl/ItemsAdderProvider.java @@ -0,0 +1,21 @@ +package me.redtea.nodropx.model.materialprovider.impl; + +import dev.lone.itemsadder.api.CustomStack; +import dev.lone.itemsadder.api.ItemsAdder; +import me.redtea.nodropx.model.materialprovider.ItemStackProvider; +import org.bukkit.inventory.ItemStack; + +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(); + } + + @Override + public List allMaterials() { + return ItemsAdder.getAllItems().stream().map(CustomStack::getNamespacedID).collect(Collectors.toList()); + } +} diff --git a/src/main/java/me/redtea/nodropx/service/material/ItemStackService.java b/src/main/java/me/redtea/nodropx/service/material/ItemStackService.java new file mode 100644 index 0000000..29d77f5 --- /dev/null +++ b/src/main/java/me/redtea/nodropx/service/material/ItemStackService.java @@ -0,0 +1,16 @@ +package me.redtea.nodropx.service.material; + +import me.redtea.nodropx.model.materialprovider.ItemStackProvider; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public interface ItemStackService { + @NotNull + ItemStack get(String s, int amount); + + void registerProvider(ItemStackProvider provider); + + List allMaterials(); +} diff --git a/src/main/java/me/redtea/nodropx/service/material/impl/ItemStackServiceImpl.java b/src/main/java/me/redtea/nodropx/service/material/impl/ItemStackServiceImpl.java new file mode 100644 index 0000000..5d14bbf --- /dev/null +++ b/src/main/java/me/redtea/nodropx/service/material/impl/ItemStackServiceImpl.java @@ -0,0 +1,42 @@ +package me.redtea.nodropx.service.material.impl; + +import lombok.val; +import me.redtea.nodropx.model.materialprovider.ItemStackProvider; +import me.redtea.nodropx.service.material.ItemStackService; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class ItemStackServiceImpl implements ItemStackService { + private final List providers = new ArrayList<>(); + + @Override + public @NotNull ItemStack get(String s, int amount) { + ItemStack result = new ItemStack(Material.AIR); + for(ItemStackProvider provider : providers) { + val i = provider.get(s); + if(i != null && i.getType() != Material.AIR) { + result = i; + break; + } + } + result.setAmount(amount); + return result; + } + + @Override + public void registerProvider(ItemStackProvider provider) { + providers.add(provider); + } + + private List materials = null; + @Override + public List allMaterials() { + if(materials == null) materials = providers.stream().map(ItemStackProvider::allMaterials).flatMap(List::stream).collect(Collectors.toList()); + return materials; + } +} diff --git a/src/main/java/me/redtea/nodropx/util/MaterialUtils.java b/src/main/java/me/redtea/nodropx/util/MaterialUtils.java index 2a15873..4f5fc65 100644 --- a/src/main/java/me/redtea/nodropx/util/MaterialUtils.java +++ b/src/main/java/me/redtea/nodropx/util/MaterialUtils.java @@ -7,27 +7,6 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; public class MaterialUtils { - @NotNull - public static Material getMaterialFromString(String s) { - if(s == null || s.equals("")) return Material.AIR; - Material material = Material.matchMaterial(s); - if(material != null) return material; - - String[] spl = s.split(":"); - - if (spl[0].equals("minecraft")) { - material = Material.matchMaterial(spl[1]); - } else { - if(spl.length < 2) { - material = Material.matchMaterial(spl[0]); - } else { - material = Material.matchMaterial(spl[0]+"_"+spl[1]);; - } - } - - return material == null ? Material.AIR : material; - } - public void remove(Inventory inventory, Material type, int amount) { if (amount <= 0) return; int size = inventory.getSize(); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index dea5558..ed9c779 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,6 +5,7 @@ api-version: '1.13' description: Set no drop status to your items author: itzRedTea authors: [itzRedTea] +softdepend: [ItemsAdder] permissions: nodropx.give: @@ -12,5 +13,9 @@ permissions: nodropx.reload: description: "Allows reload the plugin" nodropx.gui: - escription: "Allows open no drop gui" - default: true \ No newline at end of file + description: "Allows open no drop gui" + default: true + nodropx.giveStorage: + description: "Allows give to storage" + nodropx.applyhand: + description: "Allows apply no drop to item in main hand" \ No newline at end of file diff --git a/src/main/resources/text/legacy/messages.yml b/src/main/resources/text/legacy/messages.yml index edf28a7..1de5e53 100644 --- a/src/main/resources/text/legacy/messages.yml +++ b/src/main/resources/text/legacy/messages.yml @@ -5,6 +5,12 @@ give: fail: "&4[!] &cFail! Check item type for valid." success: "&2&l[!] &aGived &e%item%&a to &e%player%&a amount &e%amount%&a!" reload: "&aPlugin successfully reloaded at %time% ms" +applyHand: + fail: "&4&l[!] &cFailed to apply no drop!" + success: "&2&l[!] &aSuccessfully applied no drop status to your item!" +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!" noPerms: "&4&l[!] &cNo perms for this!" noConsole: "&4&l[!] &cOnly players can use it!" diff --git a/src/main/resources/text/md5/messages.yml b/src/main/resources/text/md5/messages.yml index edf28a7..1de5e53 100644 --- a/src/main/resources/text/md5/messages.yml +++ b/src/main/resources/text/md5/messages.yml @@ -5,6 +5,12 @@ give: fail: "&4[!] &cFail! Check item type for valid." success: "&2&l[!] &aGived &e%item%&a to &e%player%&a amount &e%amount%&a!" reload: "&aPlugin successfully reloaded at %time% ms" +applyHand: + fail: "&4&l[!] &cFailed to apply no drop!" + success: "&2&l[!] &aSuccessfully applied no drop status to your item!" +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!" noPerms: "&4&l[!] &cNo perms for this!" noConsole: "&4&l[!] &cOnly players can use it!" diff --git a/src/main/resources/text/mm/messages.yml b/src/main/resources/text/mm/messages.yml index e7fc57e..a94ff17 100644 --- a/src/main/resources/text/mm/messages.yml +++ b/src/main/resources/text/mm/messages.yml @@ -5,7 +5,12 @@ give: fail: "[!] Fail! Check item type for valid." success: "[!] Gived %item% to %player% amount %amount%!" reload: "Plugin successfully reloaded at %time% ms" - +applyHand: + fail: "[!] Failed to apply no drop!" + success: "[!] Successfully applied no drop status to your item!" +giveToStorage: + fail: "[!] Fail! Check item type for valid." + success: "[!] Gived %item% to %player% amount %amount% to storage!" noPerms: "[!] No perms for this!" noConsole: "[!] Only players can use it!"