diff --git a/.gitignore b/.gitignore
index ec61117..fd2ad84 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,4 +21,6 @@ gradle-app.setting
.classpath
run
-.idea
\ No newline at end of file
+.idea
+.gradle
+build
\ No newline at end of file
diff --git a/README.md b/README.md
index f96b6e0..58feefa 100644
--- a/README.md
+++ b/README.md
@@ -1,25 +1,2 @@
-
-
-
# NoDropX
-**Give no drop items!**
-
-The plugin will allow you to create items that will not drop out of your inventory at death!
-
-Give an no drop item: `/nodrop give [player] [item] (count)`
-Check all plugin commands: https://github.com/iRedTea/NoDropX/wiki/Commands
-Plugin wiki: https://github.com/iRedTea/NoDropX/wiki
-SpigotMC resource: https://www.spigotmc.org/resources/nodropx.111485/
-
-**Features**
-- Supports HEX Colors (MiniMessages and MD5 ChatColor)
-- Supports all versions from 1.12.2 to 1.20.1 (Spigot/Paper)
-- No drop items storage: `/nodrop gui`
-- Fully customization
-- Items that protect other slots from death
-- Developer API
-- Mods support (tested on Arclight 1.16.5)
-- ItemsAdder support
-
-
-This plugin uses CarcadeX library
+Give no drop items!
diff --git a/build.gradle b/build.gradle
index 7933d76..0e0859a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ plugins {
}
group = 'me.redtea'
-version = '1.0.2b-SNAPSHOT-HOTFIX'
+version = '1.0.3-SNAPSHOT'
repositories {
mavenCentral()
@@ -42,6 +42,7 @@ dependencies {
implementation files("libs/MiniMessages.jar")
implementation "dev.triumphteam:triumph-gui:3.1.2"
compileOnly "com.github.LoneDev6:API-ItemsAdder:3.5.0b"
+ compileOnly files("libs/nodropxforgebridge-1.4.jar")
}
def targetJavaVersion = 8
diff --git a/libs/nodropxforgebridge-1.1.jar b/libs/nodropxforgebridge-1.1.jar
deleted file mode 100644
index c7ed856..0000000
Binary files a/libs/nodropxforgebridge-1.1.jar and /dev/null differ
diff --git a/libs/nodropxforgebridge-1.4.jar b/libs/nodropxforgebridge-1.4.jar
new file mode 100644
index 0000000..eb9c462
Binary files /dev/null and b/libs/nodropxforgebridge-1.4.jar differ
diff --git a/src/main/java/me/redtea/nodropx/NoDropX.java b/src/main/java/me/redtea/nodropx/NoDropX.java
index 75112c2..5382a57 100644
--- a/src/main/java/me/redtea/nodropx/NoDropX.java
+++ b/src/main/java/me/redtea/nodropx/NoDropX.java
@@ -10,23 +10,35 @@ import me.redtea.nodropx.factory.item.impl.NoDropItemFactoryImpl;
import me.redtea.nodropx.factory.text.TextContext;
import me.redtea.nodropx.factory.text.TextServicesFactory;
import me.redtea.nodropx.factory.text.impl.TextServicesFactoryImpl;
-import me.redtea.nodropx.gui.facade.GuiFacade;
-import me.redtea.nodropx.gui.facade.impl.GuiFacadeImpl;
-import me.redtea.nodropx.gui.pages.StorageGui;
+import me.redtea.nodropx.folia.FoliaSupporter;
import me.redtea.nodropx.libs.bstats.Metrics;
import me.redtea.nodropx.libs.carcadex.repo.MutableRepo;
import me.redtea.nodropx.libs.carcadex.repo.Repo;
-import me.redtea.nodropx.libs.carcadex.repo.impl.yaml.YamlRepo;
import me.redtea.nodropx.libs.message.container.Messages;
import me.redtea.nodropx.libs.message.verifier.impl.FileMessageVerifier;
+import me.redtea.nodropx.listener.ConfirmDropHandler;
import me.redtea.nodropx.listener.InventoryHandler;
import me.redtea.nodropx.listener.PlayerHandler;
+import me.redtea.nodropx.listener.menu.SinglePageGuiHandler;
+import me.redtea.nodropx.menu.CachedMenu;
+import me.redtea.nodropx.menu.Menu;
+import me.redtea.nodropx.menu.dropconfirm.DropConfirmMFGui;
+import me.redtea.nodropx.menu.facade.MenuFacade;
+import me.redtea.nodropx.menu.facade.impl.MenuFacadeImpl;
+import me.redtea.nodropx.menu.storage.pages.MFPageGui;
+import me.redtea.nodropx.menu.storage.singlepage.SinglePageController;
+import me.redtea.nodropx.menu.storage.singlepage.SinglePageGui;
import me.redtea.nodropx.model.cosmetic.impl.DisplayNameCosmetic;
import me.redtea.nodropx.model.materialprovider.impl.ItemStackProviderDefault;
import me.redtea.nodropx.model.materialprovider.impl.ItemsAdderProvider;
import me.redtea.nodropx.schema.ItemStackListSchema;
+import me.redtea.nodropx.service.capasity.CapacityService;
+import me.redtea.nodropx.service.capasity.impl.CapacityServiceImpl;
import me.redtea.nodropx.service.cosmetic.CosmeticService;
import me.redtea.nodropx.service.cosmetic.impl.CosmeticServiceImpl;
+import me.redtea.nodropx.service.dropconfirm.DropConfirmService;
+import me.redtea.nodropx.service.dropconfirm.impl.DropConfirmNull;
+import me.redtea.nodropx.service.dropconfirm.impl.DropConfirmServiceImpl;
import me.redtea.nodropx.service.event.EventService;
import me.redtea.nodropx.service.event.impl.EventServiceImpl;
import me.redtea.nodropx.service.material.ItemStackService;
@@ -39,6 +51,8 @@ import me.redtea.nodropx.service.respawn.RespawnService;
import me.redtea.nodropx.service.respawn.impl.RespawnServiceImpl;
import me.redtea.nodropx.service.storage.StorageService;
import me.redtea.nodropx.service.storage.impl.StorageServiceImpl;
+import me.redtea.nodropx.util.ConfigVerifier;
+import me.redtea.nodropx.util.FoliaSupportedUtils;
import me.redtea.nodropx.util.UpdateChecker;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@@ -50,29 +64,34 @@ import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.util.List;
import java.util.UUID;
-import java.util.stream.Collectors;
public final class NoDropX extends JavaPlugin {
private static NoDropAPI noDropAPIInstance;
@Getter
private static NoDropX instance;
-
+ @Getter
private Messages messages;
- private CosmeticService cosmeticService;
+ private CosmeticService noDropCosmeticService;
@Getter
private boolean supportHEX;
@Getter
private boolean supportKyoriLore;
@Getter
private boolean supportItemsAdder;
- private MutableRepo> pagesRepo;
- private Repo> capacity;
-
+ private MutableRepo> personalStorageRepo;
+ private CapacityService capacityService;
+ private MenuFacade menuFacade;
+ private NoDropService noDropService;
+ private ItemStackService itemStackService;
+ private DropConfirmService dropConfirmService;
+ private FoliaSupportedUtils foliaSupportedUtils;
@Override
public void onEnable() {
instance = this;
- saveDefaultConfig();
+ new ConfigVerifier().verifyDefaults(this);
+
+ foliaSupportedUtils = new FoliaSupportedUtils(this);
TextServicesFactory textServicesFactory = new TextServicesFactoryImpl();
TextContext textContext = textServicesFactory.create(this);
@@ -81,51 +100,43 @@ public final class NoDropX extends JavaPlugin {
messages = supportKyoriLore ? Messages.of(textContext.getMessages()) : Messages.legacy(textContext.getMessages());
messages.setVerifier(new FileMessageVerifier(getResource(textContext.getPath()), YamlConfiguration.loadConfiguration(textContext.getMessages()), textContext.getMessages()));
- cosmeticService = new CosmeticServiceImpl();
- cosmeticService.add(new DisplayNameCosmetic());
- cosmeticService.add(textContext.getLoreStrategy());
- cosmeticService.load(YamlConfiguration.loadConfiguration(textContext.getCosmetics()));
-
- capacity = new YamlRepo<>(
- new File(getDataFolder(), "capacity.yml").toPath(),
- this,
- conf -> conf.getKeys(false).stream().collect(Collectors.toMap(
- value -> value,
- conf::getIntegerList))
- );
+ noDropCosmeticService = new CosmeticServiceImpl();
+ noDropCosmeticService.add(new DisplayNameCosmetic());
+ noDropCosmeticService.add(textContext.getLoreStrategy());
+ noDropCosmeticService.load(YamlConfiguration.loadConfiguration(textContext.getCosmetics()));
NBTService nbtService = new Tr7zwNBTServiceImpl();
- NoDropService noDropService = new NoDropServiceImpl(nbtService, cosmeticService);
+ noDropService = new NoDropServiceImpl(nbtService, noDropCosmeticService);
NoDropItemFactory noDropItemFactory = new NoDropItemFactoryImpl(noDropService);
EventService eventService = new EventServiceImpl(noDropService);
- RespawnService respawnService = new RespawnServiceImpl(noDropService, capacity);
- pagesRepo = Repo.>builder()
+ capacityService = new CapacityServiceImpl(this);
+ RespawnService respawnService = new RespawnServiceImpl(noDropService, capacityService);
+
+ //EXPERIMENTAL! Folia support!
+ FoliaSupporter foliaSupporter = new FoliaSupporter();
+ foliaSupporter.run(respawnService, this);
+
+ personalStorageRepo = Repo.>builder()
.autoSave(1000 * 60 * 15L)
.schema(new ItemStackListSchema(new File(getDataFolder(), "storage")))
.plugin(this)
.build();
- ItemStackService itemStackService = initItemStackService();
+ itemStackService = initItemStackService();
+ dropConfirmService = getConfig().getBoolean("confirmThrowNoDropItem") ? new DropConfirmServiceImpl() : new DropConfirmNull();
- GuiFacade guiFacade = new GuiFacadeImpl(
- new StorageGui(messages, pagesRepo, noDropService, this, itemStackService)
- );
- StorageService storageService = new StorageServiceImpl(guiFacade, pagesRepo, noDropService);
+ menuFacade = initMenus();
+ StorageService storageService = new StorageServiceImpl(menuFacade, personalStorageRepo, noDropService);
- NoDropAPI noDropAPI = new NoDropXFacade(noDropService, noDropItemFactory, storageService, capacity, itemStackService);
+ NoDropAPI noDropAPI = new NoDropXFacade(noDropService, noDropItemFactory, storageService, capacityService, itemStackService);
noDropAPIInstance = noDropAPI;
- Bukkit.getPluginManager().registerEvents(
- new InventoryHandler(eventService),
- this
- );
- Bukkit.getPluginManager().registerEvents(
- new PlayerHandler(respawnService, eventService, guiFacade),
- this
- );
+ Bukkit.getPluginManager().registerEvents(new InventoryHandler(eventService, noDropService, dropConfirmService), this);
+ Bukkit.getPluginManager().registerEvents(new PlayerHandler(respawnService, eventService, menuFacade), this);
+ Bukkit.getPluginManager().registerEvents(new ConfirmDropHandler(dropConfirmService, menuFacade), this);
Bukkit.getServicesManager().register(NoDropAPI.class,
noDropAPI, this, ServicePriority.Normal);
@@ -136,12 +147,25 @@ public final class NoDropX extends JavaPlugin {
commandManager.getMessageHandler().register("cmd.no.exists", sender -> messages.get("noExists").send(sender));
commandManager.getMessageHandler().register("cmd.wrong.usage", sender -> messages.get("usage").send(sender));
commandManager.getCompletionHandler().register("#materials", input -> itemStackService.allMaterials());
- commandManager.register(new NoDropCommand(messages, noDropAPI, guiFacade, this, itemStackService));
+ commandManager.register(new NoDropCommand(messages, noDropAPI, menuFacade, this, itemStackService));
bStatsInit();
printCredits();
checkUpdates();
}
+ private MenuFacade initMenus() {
+ CachedMenu personalStorageCachedMenu;
+ if(getConfig().getString("personalStorageType").equalsIgnoreCase("SINGLE_PAGE")) {
+ SinglePageGui singlePageGui = new SinglePageGui(messages, personalStorageRepo);
+ personalStorageCachedMenu = singlePageGui;
+ Bukkit.getPluginManager().registerEvents(new SinglePageGuiHandler(new SinglePageController(noDropService,
+ singlePageGui, personalStorageRepo, foliaSupportedUtils), singlePageGui), this);
+ } else personalStorageCachedMenu = new MFPageGui(messages, personalStorageRepo, noDropService, itemStackService, this);
+
+ Menu confirmMenu = new DropConfirmMFGui(messages, dropConfirmService);
+ return new MenuFacadeImpl(personalStorageCachedMenu, confirmMenu);
+ }
+
private ItemStackService initItemStackService() {
ItemStackService result = new ItemStackServiceImpl();
if (Bukkit.getPluginManager().getPlugin("ItemsAdder") != null) {
@@ -154,10 +178,10 @@ public final class NoDropX extends JavaPlugin {
}
private void checkUpdates() {
- if(!(getConfig().contains("checkForUpdates") && getConfig().getBoolean("checkForUpdates"))) {
+ if(!getConfig().getBoolean("checkForUpdates")) {
return;
}
- new UpdateChecker(this, 111485).getVersion(version -> {
+ new UpdateChecker(this, 111485, foliaSupportedUtils).getVersion(version -> {
if (this.getDescription().getVersion().equals(version)) {
getLogger().info("There is not a new update available.");
} else {
@@ -185,15 +209,16 @@ public final class NoDropX extends JavaPlugin {
}
public void onReload() {
- pagesRepo.saveAll();
- capacity.reload();
+ personalStorageRepo.saveAll();
+ menuFacade.clearAllCache();
+ capacityService.reload();
messages.reload(YamlConfiguration.loadConfiguration(new File(getDataFolder(), "messages.yml")));
- cosmeticService.load(YamlConfiguration.loadConfiguration(new File(getDataFolder(), "cosmetics.yml")));
+ noDropCosmeticService.load(YamlConfiguration.loadConfiguration(new File(getDataFolder(), "cosmetics.yml")));
}
@Override
public void onDisable() {
- pagesRepo.saveAll();
+ personalStorageRepo.saveAll();
}
public static NoDropAPI getAPI() {
diff --git a/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java b/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java
index 16ab20c..6088504 100644
--- a/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java
+++ b/src/main/java/me/redtea/nodropx/api/facade/NoDropAPI.java
@@ -2,7 +2,6 @@ package me.redtea.nodropx.api.facade;
import lombok.val;
import me.redtea.nodropx.api.facade.manipulator.StorageManipulator;
-import me.redtea.nodropx.util.MaterialUtils;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.HumanEntity;
@@ -78,6 +77,15 @@ public interface NoDropAPI {
*/
@NotNull StorageManipulator getStorageManipulator(@NotNull UUID playerUniqueId);
+ /**
+ * returns the slot numbers that no drop item with this itemStack saves at death
+ * @param itemStack itemStack to check
+ * @return numbers of saved slots
+ * @author redtea
+ * @since 1.0.3
+ */
+ @NotNull Collection getCapacitySlots(ItemStack itemStack);
+
/**
* returns the slot numbers that no drop item with this material saves at death
* @param material material to check
diff --git a/src/main/java/me/redtea/nodropx/api/facade/impl/NoDropXFacade.java b/src/main/java/me/redtea/nodropx/api/facade/impl/NoDropXFacade.java
index 2f63c90..cff9c1e 100644
--- a/src/main/java/me/redtea/nodropx/api/facade/impl/NoDropXFacade.java
+++ b/src/main/java/me/redtea/nodropx/api/facade/impl/NoDropXFacade.java
@@ -5,6 +5,7 @@ import me.redtea.nodropx.api.facade.manipulator.StorageManipulator;
import lombok.RequiredArgsConstructor;
import me.redtea.nodropx.factory.item.NoDropItemFactory;
import me.redtea.nodropx.libs.carcadex.repo.Repo;
+import me.redtea.nodropx.service.capasity.CapacityService;
import me.redtea.nodropx.service.material.ItemStackService;
import me.redtea.nodropx.service.nodrop.NoDropService;
import me.redtea.nodropx.service.storage.StorageService;
@@ -24,7 +25,7 @@ public class NoDropXFacade implements NoDropAPI {
private final NoDropService noDropService;
private final NoDropItemFactory itemFactory;
private final StorageService storageService;
- private final Repo> capacity;
+ private final CapacityService capacityService;
private final ItemStackService itemStackService;
@Override
@@ -74,9 +75,14 @@ public class NoDropXFacade implements NoDropAPI {
};
}
+ @Override
+ public @NotNull Collection getCapacitySlots(ItemStack itemStack) {
+ return capacityService.get(itemStack);
+ }
+
@Override
public @NotNull Collection getCapacitySlots(Material material) {
- return capacity.get(material.name()).orElse(new ArrayList<>());
+ return capacityService.get(material);
}
@Override
diff --git a/src/main/java/me/redtea/nodropx/command/NoDropCommand.java b/src/main/java/me/redtea/nodropx/command/NoDropCommand.java
index 8dcd168..5c20568 100644
--- a/src/main/java/me/redtea/nodropx/command/NoDropCommand.java
+++ b/src/main/java/me/redtea/nodropx/command/NoDropCommand.java
@@ -6,7 +6,7 @@ import me.mattstudios.mf.annotations.*;
import me.mattstudios.mf.base.CommandBase;
import me.redtea.nodropx.NoDropX;
import me.redtea.nodropx.api.facade.NoDropAPI;
-import me.redtea.nodropx.gui.facade.GuiFacade;
+import me.redtea.nodropx.menu.facade.MenuFacade;
import me.redtea.nodropx.libs.message.container.Messages;
import me.redtea.nodropx.service.material.ItemStackService;
import org.bukkit.Bukkit;
@@ -27,7 +27,7 @@ import java.util.Date;
public class NoDropCommand extends CommandBase {
private final Messages messages;
private final NoDropAPI noDropAPI;
- private final GuiFacade guiFacade;
+ private final MenuFacade menuFacade;
private final NoDropX plugin;
private final ItemStackService itemStackService;
@@ -68,9 +68,9 @@ public class NoDropCommand extends CommandBase {
@Permission("nodropx.giveStorage")
@Completion({"#players", "#materials", "#range:1-64"})
public void onGiveStorage(final CommandSender sender,
- String playerName,
+ final String playerName,
final String material,
- @Optional Integer amount) {
+ @Optional final Integer amount) {
try {
val item = noDropAPI.setNoDrop(itemStackService.get(material, amount == null || amount == 0 ? 1 : amount), true);
val player = getOfflinePlayer(playerName);
@@ -82,11 +82,12 @@ public class NoDropCommand extends CommandBase {
messages.get("giveToStorage.success")
.replaceAll("%item%", material)
.replaceAll("%player%", playerName)
- .replaceAll("%amount%", amount == null ? "0" : amount.toString())
+ .replaceAll("%amount%", amount == null ? "1" : amount.toString())
.send(sender);
} catch (Throwable e) {
messages.get("giveToStorage.fail").send(sender);
}
+
}
@SubCommand("applyHand")
@@ -101,13 +102,14 @@ public class NoDropCommand extends CommandBase {
}
@SubCommand("gui")
+ @Alias("storage")
@Permission("nodropx.gui")
public void onGui(final Player sender) {
- guiFacade.openNoDropStorage(sender);
+ menuFacade.openPersonalStorage(sender);
}
@Nullable
- private OfflinePlayer getOfflinePlayer(String name) {
+ private OfflinePlayer getOfflinePlayer(final String name) {
for(OfflinePlayer player : Bukkit.getOfflinePlayers()) {
if(player.getName() != null && player.getName().equalsIgnoreCase(name)) return player;
}
diff --git a/src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java b/src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java
new file mode 100644
index 0000000..ee9c45e
--- /dev/null
+++ b/src/main/java/me/redtea/nodropx/folia/FoliaSupporter.java
@@ -0,0 +1,73 @@
+package me.redtea.nodropx.folia;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import lombok.Getter;
+import lombok.SneakyThrows;
+import me.redtea.nodropx.service.respawn.RespawnService;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.PlayerDeathEvent;
+import org.bukkit.plugin.Plugin;
+
+import java.io.FileReader;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+//Experimental. Must be refactored in the future.
+public class FoliaSupporter {
+ private RespawnService respawnService;
+
+ @Getter
+ private static boolean runningOnFolia = false;
+
+ @SneakyThrows
+ public void run(RespawnService respawnService, Plugin plugin) {
+ String version = ((JsonObject) new JsonParser().parse(new FileReader("version_history.json"))).get("currentVersion").getAsString();
+ if(!version.toLowerCase().contains("folia") && !plugin.getConfig().getBoolean("forceUseFoliaPatches")) {
+ return;
+ }
+ runningOnFolia = true;
+ plugin.getLogger().info("Found Folia! Applying patches for this...");
+ this.respawnService = respawnService;
+ Bukkit.getPluginManager().registerEvents(new FoliaDeathListener(), plugin);
+ plugin.getLogger().info("Patches for Folia successfully applied!");
+ }
+
+
+ /*
+ temp fix when folia not called respawn event
+ */
+ class FoliaDeathListener implements Listener {
+ private final Set toRespawn = new CopyOnWriteArraySet<>();
+
+ public FoliaDeathListener() {
+ new Thread(() -> {
+ while (true) {
+ for(Player player : toRespawn) {
+ if(!player.isDead()) {
+ onRespawn(player);
+ toRespawn.remove(player);
+ }
+ }
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }).start();
+ }
+
+ public void onRespawn(Player player) {
+ respawnService.giveSavedItems(player);
+ }
+
+ @EventHandler
+ public void onDeath(PlayerDeathEvent event) {
+ toRespawn.add(event.getEntity());
+ }
+ }
+}
diff --git a/src/main/java/me/redtea/nodropx/gui/facade/GuiFacade.java b/src/main/java/me/redtea/nodropx/gui/facade/GuiFacade.java
deleted file mode 100644
index 5df3794..0000000
--- a/src/main/java/me/redtea/nodropx/gui/facade/GuiFacade.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package me.redtea.nodropx.gui.facade;
-
-import org.bukkit.entity.Player;
-
-public interface GuiFacade {
- void openNoDropStorage(Player player);
- void clearCache(Player player);
- void clearAllCache();
-}
diff --git a/src/main/java/me/redtea/nodropx/gui/facade/impl/GuiFacadeImpl.java b/src/main/java/me/redtea/nodropx/gui/facade/impl/GuiFacadeImpl.java
deleted file mode 100644
index 6321b4a..0000000
--- a/src/main/java/me/redtea/nodropx/gui/facade/impl/GuiFacadeImpl.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package me.redtea.nodropx.gui.facade.impl;
-
-import lombok.RequiredArgsConstructor;
-import me.redtea.nodropx.gui.facade.GuiFacade;
-import me.redtea.nodropx.gui.pages.StorageGui;
-import org.bukkit.entity.Player;
-
-@RequiredArgsConstructor
-public class GuiFacadeImpl implements GuiFacade {
- private final StorageGui storageGui;
-
- @Override
- public void openNoDropStorage(Player player) {
- storageGui.open(player);
- }
-
- @Override
- public void clearCache(Player player) {
- storageGui.clearCache(player);
- }
-
- @Override
- public void clearAllCache() {
- storageGui.clearAllCache();
- }
-}
diff --git a/src/main/java/me/redtea/nodropx/libs/message/container/impl/MessagesImpl.java b/src/main/java/me/redtea/nodropx/libs/message/container/impl/MessagesImpl.java
index a7a7b51..f99eb6a 100644
--- a/src/main/java/me/redtea/nodropx/libs/message/container/impl/MessagesImpl.java
+++ b/src/main/java/me/redtea/nodropx/libs/message/container/impl/MessagesImpl.java
@@ -10,10 +10,7 @@ import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull;
import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
public class MessagesImpl implements Messages {
private Map messages;
@@ -53,9 +50,10 @@ public class MessagesImpl implements Messages {
public Message get(String key) {
if(!has(key)) {
if(verifier != null) {
- Optional def = verifier.fromDefault(key);
+ Optional