diff --git a/api/src/main/java/net/momirealms/customfishing/api/BukkitCustomFishingPlugin.java b/api/src/main/java/net/momirealms/customfishing/api/BukkitCustomFishingPlugin.java index 30101fc6..7c1042ba 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/BukkitCustomFishingPlugin.java +++ b/api/src/main/java/net/momirealms/customfishing/api/BukkitCustomFishingPlugin.java @@ -75,7 +75,6 @@ public abstract class BukkitCustomFishingPlugin implements CustomFishingPlugin, protected BagManager bagManager; protected DependencyManager dependencyManager; protected TranslationManager translationManager; - protected boolean initialized = false; public BukkitCustomFishingPlugin(Plugin boostrap) { if (!boostrap.getName().equals("CustomFishing")) { @@ -86,7 +85,7 @@ public abstract class BukkitCustomFishingPlugin implements CustomFishingPlugin, } public static BukkitCustomFishingPlugin getInstance() { - if (instance == null || !instance.initialized) { + if (instance == null) { throw new IllegalArgumentException("Plugin not initialized"); } return instance; diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/BaitConfigParser.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/BaitConfigParser.java index f8e2459b..496a1714 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/BaitConfigParser.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/BaitConfigParser.java @@ -4,9 +4,11 @@ import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.customfishing.api.mechanic.config.function.*; import net.momirealms.customfishing.api.mechanic.context.Context; import net.momirealms.customfishing.api.mechanic.effect.EffectModifier; +import net.momirealms.customfishing.api.mechanic.effect.LootBaseEffect; import net.momirealms.customfishing.api.mechanic.event.EventCarrier; import net.momirealms.customfishing.api.mechanic.item.CustomFishingItem; import net.momirealms.customfishing.api.mechanic.item.ItemType; +import net.momirealms.customfishing.api.mechanic.loot.Loot; import net.momirealms.customfishing.common.config.node.Node; import net.momirealms.customfishing.common.item.Item; import org.bukkit.entity.Player; @@ -25,10 +27,13 @@ public class BaitConfigParser { private final List, Context>>> tagConsumers = new ArrayList<>(); private final List> eventBuilderConsumers = new ArrayList<>(); private final List> effectBuilderConsumers = new ArrayList<>(); + private final List> baseEffectBuilderConsumers = new ArrayList<>(); + private final List> lootBuilderConsumers = new ArrayList<>(); public BaitConfigParser(String id, Section section, Map> functionMap) { this.id = id; this.material = section.getString("material"); + if (!section.contains("tag")) section.set("tag", true); analyze(section, functionMap); } @@ -41,6 +46,16 @@ public class BaitConfigParser { ConfigParserFunction function = node.nodeValue(); if (function != null) { switch (function.type()) { + case BASE_EFFECT -> { + BaseEffectParserFunction baseEffectParserFunction = (BaseEffectParserFunction) function; + Consumer consumer = baseEffectParserFunction.accept(entry.getValue()); + baseEffectBuilderConsumers.add(consumer); + } + case LOOT -> { + LootParserFunction lootParserFunction = (LootParserFunction) function; + Consumer consumer = lootParserFunction.accept(entry.getValue()); + lootBuilderConsumers.add(consumer); + } case ITEM -> { ItemParserFunction propertyFunction = (ItemParserFunction) function; BiConsumer, Context> result = propertyFunction.accept(entry.getValue()); @@ -91,4 +106,22 @@ public class BaitConfigParser { } return builder.build(); } + + private LootBaseEffect getBaseEffect() { + LootBaseEffect.Builder builder = LootBaseEffect.builder(); + for (Consumer consumer : baseEffectBuilderConsumers) { + consumer.accept(builder); + } + return builder.build(); + } + + public Loot getLoot() { + Loot.Builder builder = Loot.builder() + .id(id) + .lootBaseEffect(getBaseEffect()); + for (Consumer consumer : lootBuilderConsumers) { + consumer.accept(builder); + } + return builder.build(); + } } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigType.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigType.java index d0a5813e..256f6b63 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigType.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigType.java @@ -3,6 +3,7 @@ package net.momirealms.customfishing.api.mechanic.config; import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.api.mechanic.config.function.ConfigParserFunction; +import net.momirealms.customfishing.api.mechanic.item.ItemType; import net.momirealms.customfishing.common.config.node.Node; import org.apache.logging.log4j.util.TriConsumer; @@ -13,6 +14,7 @@ public class ConfigType { public static final ConfigType ITEM = of( "item", (id, section, functions) -> { + ItemType.register(id, ItemType.LOOT); ItemConfigParser config = new ItemConfigParser(id, section, functions); BukkitCustomFishingPlugin.getInstance().getItemManager().registerItem(config.getItem()); BukkitCustomFishingPlugin.getInstance().getLootManager().registerLoot(config.getLoot()); @@ -43,8 +45,10 @@ public class ConfigType { public static final ConfigType ROD = of( "rod", (id, section, functions) -> { + ItemType.register(id, ItemType.ROD); RodConfigParser config = new RodConfigParser(id, section, functions); BukkitCustomFishingPlugin.getInstance().getItemManager().registerItem(config.getItem()); + BukkitCustomFishingPlugin.getInstance().getLootManager().registerLoot(config.getLoot()); BukkitCustomFishingPlugin.getInstance().getEffectManager().registerEffectModifier(config.getEffectModifier()); BukkitCustomFishingPlugin.getInstance().getEventManager().registerEventCarrier(config.getEventCarrier()); } @@ -53,8 +57,10 @@ public class ConfigType { public static final ConfigType BAIT = of( "bait", (id, section, functions) -> { + ItemType.register(id, ItemType.BAIT); BaitConfigParser config = new BaitConfigParser(id, section, functions); BukkitCustomFishingPlugin.getInstance().getItemManager().registerItem(config.getItem()); + BukkitCustomFishingPlugin.getInstance().getLootManager().registerLoot(config.getLoot()); BukkitCustomFishingPlugin.getInstance().getEffectManager().registerEffectModifier(config.getEffectModifier()); BukkitCustomFishingPlugin.getInstance().getEventManager().registerEventCarrier(config.getEventCarrier()); } @@ -63,8 +69,10 @@ public class ConfigType { public static final ConfigType HOOK = of( "hook", (id, section, functions) -> { + ItemType.register(id, ItemType.HOOK); HookConfigParser config = new HookConfigParser(id, section, functions); BukkitCustomFishingPlugin.getInstance().getItemManager().registerItem(config.getItem()); + BukkitCustomFishingPlugin.getInstance().getLootManager().registerLoot(config.getLoot()); BukkitCustomFishingPlugin.getInstance().getEffectManager().registerEffectModifier(config.getEffectModifier()); BukkitCustomFishingPlugin.getInstance().getEventManager().registerEventCarrier(config.getEventCarrier()); BukkitCustomFishingPlugin.getInstance().getHookManager().registerHook(config.getHook()); @@ -74,8 +82,10 @@ public class ConfigType { public static final ConfigType UTIL = of( "util", (id, section, functions) -> { + ItemType.register(id, ItemType.UTIL); UtilConfigParser config = new UtilConfigParser(id, section, functions); BukkitCustomFishingPlugin.getInstance().getItemManager().registerItem(config.getItem()); + BukkitCustomFishingPlugin.getInstance().getLootManager().registerLoot(config.getLoot()); BukkitCustomFishingPlugin.getInstance().getEffectManager().registerEffectModifier(config.getEffectModifier()); BukkitCustomFishingPlugin.getInstance().getEventManager().registerEventCarrier(config.getEventCarrier()); } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/HookConfigParser.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/HookConfigParser.java index dd7dfe60..5706d65c 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/HookConfigParser.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/HookConfigParser.java @@ -4,10 +4,12 @@ import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.customfishing.api.mechanic.config.function.*; import net.momirealms.customfishing.api.mechanic.context.Context; import net.momirealms.customfishing.api.mechanic.effect.EffectModifier; +import net.momirealms.customfishing.api.mechanic.effect.LootBaseEffect; import net.momirealms.customfishing.api.mechanic.event.EventCarrier; import net.momirealms.customfishing.api.mechanic.hook.HookConfig; import net.momirealms.customfishing.api.mechanic.item.CustomFishingItem; import net.momirealms.customfishing.api.mechanic.item.ItemType; +import net.momirealms.customfishing.api.mechanic.loot.Loot; import net.momirealms.customfishing.common.config.node.Node; import net.momirealms.customfishing.common.item.Item; import org.bukkit.entity.Player; @@ -27,10 +29,13 @@ public class HookConfigParser { private final List> eventBuilderConsumers = new ArrayList<>(); private final List> hookBuilderConsumers = new ArrayList<>(); private final List> effectBuilderConsumers = new ArrayList<>(); + private final List> baseEffectBuilderConsumers = new ArrayList<>(); + private final List> lootBuilderConsumers = new ArrayList<>(); public HookConfigParser(String id, Section section, Map> functionMap) { this.id = id; this.material = section.getString("material"); + if (!section.contains("tag")) section.set("tag", true); analyze(section, functionMap); } @@ -43,6 +48,16 @@ public class HookConfigParser { ConfigParserFunction function = node.nodeValue(); if (function != null) { switch (function.type()) { + case BASE_EFFECT -> { + BaseEffectParserFunction baseEffectParserFunction = (BaseEffectParserFunction) function; + Consumer consumer = baseEffectParserFunction.accept(entry.getValue()); + baseEffectBuilderConsumers.add(consumer); + } + case LOOT -> { + LootParserFunction lootParserFunction = (LootParserFunction) function; + Consumer consumer = lootParserFunction.accept(entry.getValue()); + lootBuilderConsumers.add(consumer); + } case ITEM -> { ItemParserFunction propertyFunction = (ItemParserFunction) function; BiConsumer, Context> result = propertyFunction.accept(entry.getValue()); @@ -105,4 +120,22 @@ public class HookConfigParser { } return builder.build(); } + + private LootBaseEffect getBaseEffect() { + LootBaseEffect.Builder builder = LootBaseEffect.builder(); + for (Consumer consumer : baseEffectBuilderConsumers) { + consumer.accept(builder); + } + return builder.build(); + } + + public Loot getLoot() { + Loot.Builder builder = Loot.builder() + .id(id) + .lootBaseEffect(getBaseEffect()); + for (Consumer consumer : lootBuilderConsumers) { + consumer.accept(builder); + } + return builder.build(); + } } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ItemConfigParser.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ItemConfigParser.java index a44518a9..67975c1b 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ItemConfigParser.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ItemConfigParser.java @@ -31,6 +31,7 @@ public class ItemConfigParser { public ItemConfigParser(String id, Section section, Map> functionMap) { this.id = id; this.material = section.getString("material"); + if (!section.contains("tag")) section.set("tag", true); analyze(section, functionMap); } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/RodConfigParser.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/RodConfigParser.java index 09cfa87e..3e35afbe 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/RodConfigParser.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/RodConfigParser.java @@ -4,9 +4,11 @@ import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.customfishing.api.mechanic.config.function.*; import net.momirealms.customfishing.api.mechanic.context.Context; import net.momirealms.customfishing.api.mechanic.effect.EffectModifier; +import net.momirealms.customfishing.api.mechanic.effect.LootBaseEffect; import net.momirealms.customfishing.api.mechanic.event.EventCarrier; import net.momirealms.customfishing.api.mechanic.item.CustomFishingItem; import net.momirealms.customfishing.api.mechanic.item.ItemType; +import net.momirealms.customfishing.api.mechanic.loot.Loot; import net.momirealms.customfishing.common.config.node.Node; import net.momirealms.customfishing.common.item.Item; import org.bukkit.Material; @@ -26,10 +28,13 @@ public class RodConfigParser { private final List, Context>>> tagConsumers = new ArrayList<>(); private final List> eventBuilderConsumers = new ArrayList<>(); private final List> effectBuilderConsumers = new ArrayList<>(); + private final List> baseEffectBuilderConsumers = new ArrayList<>(); + private final List> lootBuilderConsumers = new ArrayList<>(); public RodConfigParser(String id, Section section, Map> functionMap) { this.id = id; this.material = section.contains("material") ? section.getString("material") : Material.FISHING_ROD.name(); + if (!section.contains("tag")) section.set("tag", true); analyze(section, functionMap); } @@ -42,6 +47,16 @@ public class RodConfigParser { ConfigParserFunction function = node.nodeValue(); if (function != null) { switch (function.type()) { + case BASE_EFFECT -> { + BaseEffectParserFunction baseEffectParserFunction = (BaseEffectParserFunction) function; + Consumer consumer = baseEffectParserFunction.accept(entry.getValue()); + baseEffectBuilderConsumers.add(consumer); + } + case LOOT -> { + LootParserFunction lootParserFunction = (LootParserFunction) function; + Consumer consumer = lootParserFunction.accept(entry.getValue()); + lootBuilderConsumers.add(consumer); + } case ITEM -> { ItemParserFunction propertyFunction = (ItemParserFunction) function; BiConsumer, Context> result = propertyFunction.accept(entry.getValue()); @@ -92,4 +107,22 @@ public class RodConfigParser { } return builder.build(); } + + private LootBaseEffect getBaseEffect() { + LootBaseEffect.Builder builder = LootBaseEffect.builder(); + for (Consumer consumer : baseEffectBuilderConsumers) { + consumer.accept(builder); + } + return builder.build(); + } + + public Loot getLoot() { + Loot.Builder builder = Loot.builder() + .id(id) + .lootBaseEffect(getBaseEffect()); + for (Consumer consumer : lootBuilderConsumers) { + consumer.accept(builder); + } + return builder.build(); + } } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/UtilConfigParser.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/UtilConfigParser.java index 8c7492ad..2dba7e1f 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/UtilConfigParser.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/UtilConfigParser.java @@ -4,9 +4,11 @@ import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.customfishing.api.mechanic.config.function.*; import net.momirealms.customfishing.api.mechanic.context.Context; import net.momirealms.customfishing.api.mechanic.effect.EffectModifier; +import net.momirealms.customfishing.api.mechanic.effect.LootBaseEffect; import net.momirealms.customfishing.api.mechanic.event.EventCarrier; import net.momirealms.customfishing.api.mechanic.item.CustomFishingItem; import net.momirealms.customfishing.api.mechanic.item.ItemType; +import net.momirealms.customfishing.api.mechanic.loot.Loot; import net.momirealms.customfishing.common.config.node.Node; import net.momirealms.customfishing.common.item.Item; import org.bukkit.entity.Player; @@ -25,10 +27,13 @@ public class UtilConfigParser { private final List, Context>>> tagConsumers = new ArrayList<>(); private final List> eventBuilderConsumers = new ArrayList<>(); private final List> effectBuilderConsumers = new ArrayList<>(); + private final List> baseEffectBuilderConsumers = new ArrayList<>(); + private final List> lootBuilderConsumers = new ArrayList<>(); public UtilConfigParser(String id, Section section, Map> functionMap) { this.id = id; this.material = section.getString("material"); + if (!section.contains("tag")) section.set("tag", true); analyze(section, functionMap); } @@ -41,6 +46,16 @@ public class UtilConfigParser { ConfigParserFunction function = node.nodeValue(); if (function != null) { switch (function.type()) { + case BASE_EFFECT -> { + BaseEffectParserFunction baseEffectParserFunction = (BaseEffectParserFunction) function; + Consumer consumer = baseEffectParserFunction.accept(entry.getValue()); + baseEffectBuilderConsumers.add(consumer); + } + case LOOT -> { + LootParserFunction lootParserFunction = (LootParserFunction) function; + Consumer consumer = lootParserFunction.accept(entry.getValue()); + lootBuilderConsumers.add(consumer); + } case ITEM -> { ItemParserFunction propertyFunction = (ItemParserFunction) function; BiConsumer, Context> result = propertyFunction.accept(entry.getValue()); @@ -91,4 +106,22 @@ public class UtilConfigParser { } return builder.build(); } + + private LootBaseEffect getBaseEffect() { + LootBaseEffect.Builder builder = LootBaseEffect.builder(); + for (Consumer consumer : baseEffectBuilderConsumers) { + consumer.accept(builder); + } + return builder.build(); + } + + public Loot getLoot() { + Loot.Builder builder = Loot.builder() + .id(id) + .lootBaseEffect(getBaseEffect()); + for (Consumer consumer : lootBuilderConsumers) { + consumer.accept(builder); + } + return builder.build(); + } } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/game/AbstractGamingPlayer.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/game/AbstractGamingPlayer.java index 46e94f02..ef0db7be 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/game/AbstractGamingPlayer.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/game/AbstractGamingPlayer.java @@ -19,7 +19,6 @@ package net.momirealms.customfishing.api.mechanic.game; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.api.mechanic.effect.Effect; -import net.momirealms.customfishing.api.mechanic.fishing.FishingManager; import net.momirealms.customfishing.common.plugin.scheduler.SchedulerTask; import org.bukkit.Material; import org.bukkit.entity.FishHook; diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/item/ItemManager.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/item/ItemManager.java index 9a135de1..a5053b35 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/item/ItemManager.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/item/ItemManager.java @@ -29,14 +29,16 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; + public interface ItemManager extends Reloadable { boolean registerItem(@NotNull CustomFishingItem item); @Nullable - ItemStack buildInternal(@NotNull Context context, @NotNull String id); + ItemStack buildInternal(@NotNull Context context, @NotNull String id) throws NullPointerException; - ItemStack build(@NotNull Context context, CustomFishingItem item); + ItemStack build(@NotNull Context context, @NotNull CustomFishingItem item); @Nullable ItemStack buildAny(@NotNull Context context, @NotNull String id); @@ -47,10 +49,18 @@ public interface ItemManager extends Reloadable { @Nullable String getCustomFishingItemID(@NotNull ItemStack itemStack); + @Nullable + ItemType getItemType(@NotNull ItemStack itemStack); + + @Nullable + ItemType getItemType(@NotNull String id); + @Nullable Item dropItemLoot(@NotNull Context context); ItemFactory getFactory(); ItemProvider[] getItemProviders(); + + Collection getItemIDs(); } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/item/ItemType.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/item/ItemType.java index c5b08878..1934ab6f 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/item/ItemType.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/item/ItemType.java @@ -1,9 +1,15 @@ package net.momirealms.customfishing.api.mechanic.item; +import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; import java.util.Objects; public class ItemType { + private static final HashMap types = new HashMap<>(); + public static final ItemType LOOT = of("loot"); public static final ItemType ROD = of("rod"); public static final ItemType UTIL = of("util"); @@ -24,6 +30,25 @@ public class ItemType { return new ItemType(type); } + public static void register(String id, ItemType type) { + ItemType previous = types.put(id, type); + if (previous != null) { + BukkitCustomFishingPlugin.getInstance().getPluginLogger().warn( + "Attempted to register item type " + id + " twice, this is not a safe behavior. [" + + type.getType() + "," + previous.getType() + "]" + ); + } + } + + @Nullable + public static ItemType getTypeByID(String id) { + return types.get(id); + } + + public static void reset() { + types.clear(); + } + @Override public boolean equals(Object object) { if (this == object) return true; @@ -32,6 +57,7 @@ public class ItemType { return Objects.equals(type, itemType.type); } + @Override public int hashCode() { return Objects.hashCode(type); diff --git a/api/src/main/java/net/momirealms/customfishing/api/storage/user/UserDataImpl.java b/api/src/main/java/net/momirealms/customfishing/api/storage/user/UserDataImpl.java index fbf0b74a..da9eda18 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/storage/user/UserDataImpl.java +++ b/api/src/main/java/net/momirealms/customfishing/api/storage/user/UserDataImpl.java @@ -137,6 +137,7 @@ public class UserDataImpl implements UserData { @Override public PlayerData toPlayerData() { return PlayerData.builder() + .uuid(uuid) .bag(new InventoryData(InventoryUtils.stacksToBase64(holder.getInventory().getStorageContents()), holder.getInventory().getSize())) .earnings(earningData) .statistics(new StatisticData(statistics.amountMap(), statistics.sizeMap())) diff --git a/common/src/main/java/net/momirealms/customfishing/common/dependency/Dependency.java b/common/src/main/java/net/momirealms/customfishing/common/dependency/Dependency.java index fed83925..137593b6 100644 --- a/common/src/main/java/net/momirealms/customfishing/common/dependency/Dependency.java +++ b/common/src/main/java/net/momirealms/customfishing/common/dependency/Dependency.java @@ -121,6 +121,13 @@ public enum Dependency { Relocation.of("examination", "net{}kyori{}examination"), Relocation.of("geantyref", "io{}leangen{}geantyref") ), + GEANTY_REF( + "io{}leangen{}geantyref", + "geantyref", + "maven", + "geantyref", + Relocation.of("geantyref", "io{}leangen{}geantyref") + ), BOOSTED_YAML( "dev{}dejvokep", "boosted-yaml", @@ -216,13 +223,6 @@ public enum Dependency { return Dependency.BSTATS_BASE.getVersion(); } }, - GEANTY_REF( - "io{}leangen{}geantyref", - "geantyref", - "maven", - "geantyref", - Relocation.of("geantyref", "io{}leangen{}geantyref") - ), GSON( "com.google.code.gson", "gson", diff --git a/common/src/main/java/net/momirealms/customfishing/common/dependency/DependencyRepository.java b/common/src/main/java/net/momirealms/customfishing/common/dependency/DependencyRepository.java index 5a3c20b0..ac51e65e 100644 --- a/common/src/main/java/net/momirealms/customfishing/common/dependency/DependencyRepository.java +++ b/common/src/main/java/net/momirealms/customfishing/common/dependency/DependencyRepository.java @@ -33,7 +33,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; /** * Represents a repository which contains {@link Dependency}s. @@ -47,8 +46,8 @@ public enum DependencyRepository { @Override protected URLConnection openConnection(Dependency dependency) throws IOException { URLConnection connection = super.openConnection(dependency); - connection.setConnectTimeout((int) TimeUnit.SECONDS.toMillis(5)); - connection.setReadTimeout((int) TimeUnit.SECONDS.toMillis(5)); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); return connection; } }, diff --git a/common/src/main/java/net/momirealms/customfishing/common/locale/TranslationManager.java b/common/src/main/java/net/momirealms/customfishing/common/locale/TranslationManager.java index cec8c36f..ad7ac762 100644 --- a/common/src/main/java/net/momirealms/customfishing/common/locale/TranslationManager.java +++ b/common/src/main/java/net/momirealms/customfishing/common/locale/TranslationManager.java @@ -20,7 +20,7 @@ import java.util.stream.Stream; public class TranslationManager { public static final Locale DEFAULT_LOCALE = Locale.ENGLISH; - private static final List locales = List.of("en", "zh_cn"); + private static final List locales = List.of("en"); private final CustomFishingPlugin plugin; private final Set installed = ConcurrentHashMap.newKeySet(); diff --git a/common/src/main/resources/library-version.properties b/common/src/main/resources/library-version.properties index c9c67931..e16b196c 100644 --- a/common/src/main/resources/library-version.properties +++ b/common/src/main/resources/library-version.properties @@ -20,4 +20,5 @@ bstats-base=${bstats_version} geantyref=${geantyref_version} gson=${gson_version} caffeine=${caffeine_version} -jedis=${jedis_version} \ No newline at end of file +jedis=${jedis_version} +exp4j=${exp4j_version} \ No newline at end of file diff --git a/compatibility/src/main/java/net/momirealms/customfishing/bukkit/integration/item/CustomFishingItemProvider.java b/compatibility/src/main/java/net/momirealms/customfishing/bukkit/integration/item/CustomFishingItemProvider.java index b1421a76..6a86e2cc 100644 --- a/compatibility/src/main/java/net/momirealms/customfishing/bukkit/integration/item/CustomFishingItemProvider.java +++ b/compatibility/src/main/java/net/momirealms/customfishing/bukkit/integration/item/CustomFishingItemProvider.java @@ -20,7 +20,6 @@ package net.momirealms.customfishing.bukkit.integration.item; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.api.integration.ItemProvider; import net.momirealms.customfishing.api.mechanic.context.Context; -import net.momirealms.customfishing.common.util.Key; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/BukkitCustomFishingPluginImpl.java b/core/src/main/java/net/momirealms/customfishing/bukkit/BukkitCustomFishingPluginImpl.java index d5211b30..7bb5669a 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/BukkitCustomFishingPluginImpl.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/BukkitCustomFishingPluginImpl.java @@ -2,11 +2,13 @@ package net.momirealms.customfishing.bukkit; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.api.mechanic.config.ConfigManager; +import net.momirealms.customfishing.api.mechanic.item.ItemType; import net.momirealms.customfishing.api.mechanic.misc.cooldown.CoolDownManager; import net.momirealms.customfishing.api.mechanic.misc.placeholder.BukkitPlaceholderManager; import net.momirealms.customfishing.bukkit.action.BukkitActionManager; import net.momirealms.customfishing.bukkit.bag.BukkitBagManager; import net.momirealms.customfishing.bukkit.block.BukkitBlockManager; +import net.momirealms.customfishing.bukkit.command.BukkitCommandManager; import net.momirealms.customfishing.bukkit.competition.BukkitCompetitionManager; import net.momirealms.customfishing.bukkit.config.BukkitConfigManager; import net.momirealms.customfishing.bukkit.effect.BukkitEffectManager; @@ -19,6 +21,7 @@ import net.momirealms.customfishing.bukkit.item.BukkitItemManager; import net.momirealms.customfishing.bukkit.loot.BukkitLootManager; import net.momirealms.customfishing.bukkit.market.BukkitMarketManager; import net.momirealms.customfishing.bukkit.requirement.BukkitRequirementManager; +import net.momirealms.customfishing.bukkit.scheduler.BukkitSchedulerAdapter; import net.momirealms.customfishing.bukkit.sender.BukkitSenderFactory; import net.momirealms.customfishing.bukkit.statistic.BukkitStatisticsManager; import net.momirealms.customfishing.bukkit.storage.BukkitStorageManager; @@ -43,13 +46,41 @@ public class BukkitCustomFishingPluginImpl extends BukkitCustomFishingPlugin { private final ClassPathAppender classPathAppender; private final PluginLogger logger; - private final ChatCatcherManager chatCatcherManager; + private ChatCatcherManager chatCatcherManager; + private BukkitCommandManager commandManager; public BukkitCustomFishingPluginImpl(Plugin boostrap) { super(boostrap); VersionHelper.init(getServerVersion()); + this.scheduler = new BukkitSchedulerAdapter(this); this.classPathAppender = new ReflectionClassPathAppender(this); this.logger = new JavaPluginLogger(getBoostrap().getLogger()); + this.dependencyManager = new DependencyManagerImpl(this); + } + + @Override + public void load() { + this.dependencyManager.loadDependencies( + List.of( + Dependency.BOOSTED_YAML, + Dependency.BSTATS_BASE, Dependency.BSTATS_BUKKIT, + Dependency.CAFFEINE, + Dependency.GEANTY_REF, + Dependency.CLOUD_CORE, Dependency.CLOUD_SERVICES, Dependency.CLOUD_BUKKIT, Dependency.CLOUD_PAPER, Dependency.CLOUD_BRIGADIER, Dependency.CLOUD_MINECRAFT_EXTRAS, + Dependency.GSON, + Dependency.COMMONS_POOL_2, + Dependency.JEDIS, + Dependency.EXP4J, + Dependency.MYSQL_DRIVER, Dependency.MARIADB_DRIVER, + Dependency.SQLITE_DRIVER, + Dependency.H2_DRIVER, + Dependency.MONGODB_DRIVER_CORE, Dependency.MONGODB_DRIVER_SYNC, Dependency.MONGODB_DRIVER_BSON, + Dependency.HIKARI_CP) + ); + } + + @Override + public void enable() { this.eventManager = new BukkitEventManager(this); this.configManager = new BukkitConfigManager(this); this.requirementManager = new BukkitRequirementManager(this); @@ -69,41 +100,11 @@ public class BukkitCustomFishingPluginImpl extends BukkitCustomFishingPlugin { this.effectManager = new BukkitEffectManager(this); this.hookManager = new BukkitHookManager(this); this.bagManager = new BukkitBagManager(this); - this.dependencyManager = new DependencyManagerImpl(this); this.translationManager = new TranslationManager(this); this.chatCatcherManager = new ChatCatcherManager(this); - } + this.commandManager = new BukkitCommandManager(this); + this.commandManager.registerDefaultFeatures(); - @Override - public void load() { - this.dependencyManager.loadDependencies( - List.of(Dependency.BOOSTED_YAML, - Dependency.BSTATS_BASE, - Dependency.BSTATS_BUKKIT, - Dependency.CAFFEINE, - Dependency.CLOUD_CORE, - Dependency.CLOUD_SERVICES, - Dependency.CLOUD_BUKKIT, - Dependency.CLOUD_PAPER, - Dependency.CLOUD_BRIGADIER, - Dependency.CLOUD_MINECRAFT_EXTRAS, - Dependency.GSON, - Dependency.COMMONS_POOL_2, - Dependency.JEDIS, - Dependency.EXP4J, - Dependency.MYSQL_DRIVER, - Dependency.MARIADB_DRIVER, - Dependency.SQLITE_DRIVER, - Dependency.H2_DRIVER, - Dependency.MONGODB_DRIVER_CORE, - Dependency.MONGODB_DRIVER_SYNC, - Dependency.MONGODB_DRIVER_BSON, - Dependency.HIKARI_CP) - ); - } - - @Override - public void enable() { this.reload(); if (ConfigManager.metrics()) new Metrics((JavaPlugin) getBoostrap(), 16648); if (ConfigManager.checkUpdate()) { @@ -112,12 +113,13 @@ public class BukkitCustomFishingPluginImpl extends BukkitCustomFishingPlugin { else this.getPluginLogger().warn("Update is available: https://polymart.org/resource/2723"); }); } + this.integrationManager.load(); - this.initialized = true; } @Override public void reload() { + ItemType.reset(); this.eventManager.reload(); this.configManager.reload(); this.requirementManager.reload(); @@ -148,7 +150,6 @@ public class BukkitCustomFishingPluginImpl extends BukkitCustomFishingPlugin { this.itemManager.disable(); this.competitionManager.disable(); this.marketManager.disable(); - this.storageManager.disable(); this.lootManager.disable(); this.coolDownManager.disable(); this.entityManager.disable(); @@ -158,7 +159,8 @@ public class BukkitCustomFishingPluginImpl extends BukkitCustomFishingPlugin { this.hookManager.disable(); this.bagManager.disable(); this.integrationManager.disable(); - this.initialized = false; + this.storageManager.disable(); + this.commandManager.unregisterFeatures(); } @Override diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/command/BukkitCommandManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/command/BukkitCommandManager.java index a3c53825..59010132 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/command/BukkitCommandManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/command/BukkitCommandManager.java @@ -2,31 +2,47 @@ package net.momirealms.customfishing.bukkit.command; import net.kyori.adventure.util.Index; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; +import net.momirealms.customfishing.bukkit.command.feature.GetItemCommand; +import net.momirealms.customfishing.bukkit.command.feature.GiveItemCommand; import net.momirealms.customfishing.bukkit.command.feature.ReloadCommand; +import net.momirealms.customfishing.bukkit.command.feature.SellFishCommand; import net.momirealms.customfishing.common.command.AbstractCommandManager; import net.momirealms.customfishing.common.command.CommandFeature; import net.momirealms.customfishing.common.sender.Sender; import org.bukkit.command.CommandSender; import org.incendo.cloud.SenderMapper; +import org.incendo.cloud.bukkit.CloudBukkitCapabilities; import org.incendo.cloud.execution.ExecutionCoordinator; -import org.incendo.cloud.paper.PaperCommandManager; +import org.incendo.cloud.paper.LegacyPaperCommandManager; +import org.incendo.cloud.setting.ManagerSetting; import java.util.List; public class BukkitCommandManager extends AbstractCommandManager { private final List> FEATURES = List.of( - new ReloadCommand(this) + new ReloadCommand(this), + new SellFishCommand(this), + new GetItemCommand(this), + new GiveItemCommand(this) ); private final Index> INDEX = Index.create(CommandFeature::getFeatureID, FEATURES); public BukkitCommandManager(BukkitCustomFishingPlugin plugin) { - super(plugin, new PaperCommandManager<>( + super(plugin, new LegacyPaperCommandManager<>( plugin.getBoostrap(), ExecutionCoordinator.simpleCoordinator(), SenderMapper.identity() )); + final LegacyPaperCommandManager manager = (LegacyPaperCommandManager) getCommandManager(); + manager.settings().set(ManagerSetting.ALLOW_UNSAFE_REGISTRATION, true); + if (manager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { + manager.registerBrigadier(); + manager.brigadierManager().setNativeNumberSuggestions(true); + } else if (manager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { + manager.registerAsynchronousCompletions(); + } } @Override diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/GetItemCommand.java b/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/GetItemCommand.java new file mode 100644 index 00000000..3c7e8d44 --- /dev/null +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/GetItemCommand.java @@ -0,0 +1,74 @@ +package net.momirealms.customfishing.bukkit.command.feature; + +import net.kyori.adventure.text.Component; +import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; +import net.momirealms.customfishing.api.mechanic.context.Context; +import net.momirealms.customfishing.api.mechanic.context.ContextKeys; +import net.momirealms.customfishing.bukkit.command.BukkitCommandFeature; +import net.momirealms.customfishing.bukkit.util.PlayerUtils; +import net.momirealms.customfishing.common.command.CustomFishingCommandManager; +import net.momirealms.customfishing.common.locale.MessageConstants; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.IntegerParser; +import org.incendo.cloud.parser.standard.StringParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.concurrent.CompletableFuture; + +@SuppressWarnings("DuplicatedCode") +public class GetItemCommand extends BukkitCommandFeature { + + public GetItemCommand(CustomFishingCommandManager commandManager) { + super(commandManager); + } + + @Override + public Command.Builder assembleCommand(CommandManager manager, Command.Builder builder) { + return builder + .senderType(Player.class) + .required("id", StringParser.stringComponent().suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(BukkitCustomFishingPlugin.getInstance().getItemManager().getItemIDs().stream().map(Suggestion::suggestion).toList()); + } + })) + .optional("amount", IntegerParser.integerParser(1, 6400)) + .flag(manager.flagBuilder("silent").withAliases("s").build()) + .handler(context -> { + final int amount = context.getOrDefault("amount", 1); + final String id = context.get("id"); + final Player player = context.sender(); + try { + ItemStack itemStack = BukkitCustomFishingPlugin.getInstance().getItemManager().buildInternal(Context.player(player).arg(ContextKeys.ID, id), id); + if (itemStack == null) { + throw new RuntimeException("Unrecognized item id: " + id); + } + int amountToGive = amount; + int maxStack = itemStack.getType().getMaxStackSize(); + while (amountToGive > 0) { + int perStackSize = Math.min(maxStack, amountToGive); + amountToGive -= perStackSize; + ItemStack more = itemStack.clone(); + more.setAmount(perStackSize); + PlayerUtils.dropItem(player, more, false, true, false); + } + handleFeedback(context, MessageConstants.COMMAND_ITEM_GET_SUCCESS, Component.text(amount), Component.text(id)); + } catch (NullPointerException e) { + handleFeedback(context, MessageConstants.COMMAND_ITEM_FAILURE_NOT_EXIST, Component.text(id)); + } + }); + } + + @Override + public String getFeatureID() { + return "getitem"; + } +} diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/GiveItemCommand.java b/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/GiveItemCommand.java new file mode 100644 index 00000000..2a6c46f6 --- /dev/null +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/GiveItemCommand.java @@ -0,0 +1,77 @@ +package net.momirealms.customfishing.bukkit.command.feature; + +import net.kyori.adventure.text.Component; +import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; +import net.momirealms.customfishing.api.mechanic.context.Context; +import net.momirealms.customfishing.api.mechanic.context.ContextKeys; +import net.momirealms.customfishing.bukkit.command.BukkitCommandFeature; +import net.momirealms.customfishing.bukkit.util.PlayerUtils; +import net.momirealms.customfishing.common.command.CustomFishingCommandManager; +import net.momirealms.customfishing.common.locale.MessageConstants; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.bukkit.data.MultiplePlayerSelector; +import org.incendo.cloud.bukkit.parser.PlayerParser; +import org.incendo.cloud.bukkit.parser.selector.MultiplePlayerSelectorParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.IntegerParser; +import org.incendo.cloud.parser.standard.StringParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.concurrent.CompletableFuture; + +@SuppressWarnings("DuplicatedCode") +public class GiveItemCommand extends BukkitCommandFeature { + + public GiveItemCommand(CustomFishingCommandManager commandManager) { + super(commandManager); + } + + @Override + public Command.Builder assembleCommand(CommandManager manager, Command.Builder builder) { + return builder + .required("player", PlayerParser.playerParser()) + .required("id", StringParser.stringComponent().suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(BukkitCustomFishingPlugin.getInstance().getItemManager().getItemIDs().stream().map(Suggestion::suggestion).toList()); + } + })) + .optional("amount", IntegerParser.integerParser(1, 6400)) + .flag(manager.flagBuilder("silent").withAliases("s").build()) + .handler(context -> { + final Player player = context.get("player"); + final int amount = context.getOrDefault("amount", 1); + final String id = context.get("id"); + try { + ItemStack itemStack = BukkitCustomFishingPlugin.getInstance().getItemManager().buildInternal(Context.player(player).arg(ContextKeys.ID, id), id); + if (itemStack == null) { + throw new RuntimeException("Unrecognized item id: " + id); + } + int amountToGive = amount; + int maxStack = itemStack.getType().getMaxStackSize(); + while (amountToGive > 0) { + int perStackSize = Math.min(maxStack, amountToGive); + amountToGive -= perStackSize; + ItemStack more = itemStack.clone(); + more.setAmount(perStackSize); + PlayerUtils.dropItem(player, more, false, true, false); + } + handleFeedback(context, MessageConstants.COMMAND_ITEM_GIVE_SUCCESS, Component.text(player.getName()), Component.text(amount), Component.text(id)); + } catch (NullPointerException e) { + handleFeedback(context, MessageConstants.COMMAND_ITEM_FAILURE_NOT_EXIST, Component.text(id)); + } + }); + } + + @Override + public String getFeatureID() { + return "giveitem"; + } +} diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/ReloadCommand.java b/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/ReloadCommand.java index 412684f0..3aff0e9e 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/ReloadCommand.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/ReloadCommand.java @@ -1,5 +1,6 @@ package net.momirealms.customfishing.bukkit.command.feature; +import net.kyori.adventure.text.Component; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.bukkit.command.BukkitCommandFeature; import net.momirealms.customfishing.common.command.CustomFishingCommandManager; @@ -17,10 +18,11 @@ public class ReloadCommand extends BukkitCommandFeature { @Override public Command.Builder assembleCommand(CommandManager manager, Command.Builder builder) { return builder - .flag(manager.flagBuilder("silent")) + .flag(manager.flagBuilder("silent").withAliases("s")) .handler(context -> { + long time1 = System.currentTimeMillis(); BukkitCustomFishingPlugin.getInstance().reload(); - handleFeedback(context.sender(), MessageConstants.COMMAND_RELOAD_SUCCESS); + handleFeedback(context, MessageConstants.COMMAND_RELOAD_SUCCESS, Component.text(System.currentTimeMillis() - time1)); }); } diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/SellFishCommand.java b/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/SellFishCommand.java new file mode 100644 index 00000000..019d28ef --- /dev/null +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/SellFishCommand.java @@ -0,0 +1,28 @@ +package net.momirealms.customfishing.bukkit.command.feature; + +import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; +import net.momirealms.customfishing.bukkit.command.BukkitCommandFeature; +import net.momirealms.customfishing.common.command.CustomFishingCommandManager; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.incendo.cloud.Command; +import org.incendo.cloud.CommandManager; + +public class SellFishCommand extends BukkitCommandFeature { + + public SellFishCommand(CustomFishingCommandManager commandManager) { + super(commandManager); + } + + @Override + public Command.Builder assembleCommand(CommandManager manager, Command.Builder builder) { + return builder + .senderType(Player.class) + .handler(context -> BukkitCustomFishingPlugin.getInstance().getMarketManager().openMarketGUI(context.sender())); + } + + @Override + public String getFeatureID() { + return "sellfish"; + } +} diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java index 7a37a23b..c44ca20a 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java @@ -61,7 +61,7 @@ public class BukkitConfigManager extends ConfigManager { if (subFile.isDirectory()) { fileDeque.push(subFile); } else if (subFile.isFile() && subFile.getName().endsWith(".yml")) { - YamlDocument document = plugin.getConfigManager().loadData(file); + YamlDocument document = plugin.getConfigManager().loadData(subFile); for (Map.Entry entry : document.getStringRouteMappedValues(false).entrySet()) { if (entry.getValue() instanceof Section section) { type.parse(entry.getKey(), section, formatFunctions); @@ -79,7 +79,7 @@ public class BukkitConfigManager extends ConfigManager { return (item, context) -> item.customModelData((int) mathValue.evaluate(context)); }, 5000, "custom-model-data"); this.registerItemParser(arg -> { - TextValue textValue = TextValue.auto((String) arg); + TextValue textValue = TextValue.auto("" + arg); return (item, context) -> { item.displayName(AdventureHelper.miniMessageToJson(textValue.render(context))); }; @@ -88,7 +88,7 @@ public class BukkitConfigManager extends ConfigManager { List list = ListUtils.toList(arg); List> lore = new ArrayList<>(); for (String text : list) { - lore.add(TextValue.auto(text)); + lore.add(TextValue.auto("" + text)); } return (item, context) -> { item.lore(lore.stream() @@ -101,7 +101,6 @@ public class BukkitConfigManager extends ConfigManager { return (item, context) -> { if (!enable) return; item.setTag(context.arg(ContextKeys.ID), "CustomFishing", "id"); - item.setTag(context.arg(ContextKeys.TYPE), "CustomFishing", "type"); }; }, 2_000, "tag"); this.registerItemParser(arg -> { @@ -119,8 +118,8 @@ public class BukkitConfigManager extends ConfigManager { }, 1_000, "size"); this.registerItemParser(arg -> { Section section = (Section) arg; - MathValue base = MathValue.auto(section.get("base")); - MathValue bonus = MathValue.auto(section.get("bonus")); + MathValue base = MathValue.auto(section.get("base", "0")); + MathValue bonus = MathValue.auto(section.get("bonus", "0")); return (item, context) -> { double basePrice = base.evaluate(context); double bonusPrice = bonus.evaluate(context); @@ -325,12 +324,12 @@ public class BukkitConfigManager extends ConfigManager { return builder -> builder.entityID(entity); }, "entity"); this.registerEntityParser(object -> { - String entity = (String) object; - return builder -> builder.entityID(entity); + MathValue mathValue = MathValue.auto(object); + return builder -> builder.horizontalVector(mathValue); }, "velocity", "horizontal"); this.registerEntityParser(object -> { - String entity = (String) object; - return builder -> builder.entityID(entity); + MathValue mathValue = MathValue.auto(object); + return builder -> builder.verticalVector(mathValue); }, "velocity", "vertical"); this.registerEntityParser(object -> { Section section = (Section) object; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/icon/property/item/PreventGrabItem.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/icon/property/item/PreventGrabItem.java index 83a1214e..691a8476 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/icon/property/item/PreventGrabItem.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/icon/property/item/PreventGrabItem.java @@ -20,7 +20,6 @@ package net.momirealms.customfishing.bukkit.gui.icon.property.item; import net.kyori.adventure.text.Component; import net.momirealms.customfishing.bukkit.adventure.ShadedAdventureComponentWrapper; import net.momirealms.customfishing.bukkit.gui.SectionPage; -import net.momirealms.customfishing.common.helper.AdventureHelper; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/icon/property/item/RandomDurabilityItem.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/icon/property/item/RandomDurabilityItem.java index 5302687a..6f3c9550 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/icon/property/item/RandomDurabilityItem.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/icon/property/item/RandomDurabilityItem.java @@ -20,7 +20,6 @@ package net.momirealms.customfishing.bukkit.gui.icon.property.item; import net.kyori.adventure.text.Component; import net.momirealms.customfishing.bukkit.adventure.ShadedAdventureComponentWrapper; import net.momirealms.customfishing.bukkit.gui.SectionPage; -import net.momirealms.customfishing.common.helper.AdventureHelper; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/AbstractSectionEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/AbstractSectionEditor.java index 128ba1d5..39d999f9 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/AbstractSectionEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/AbstractSectionEditor.java @@ -19,7 +19,6 @@ package net.momirealms.customfishing.bukkit.gui.page.item; import dev.dejvokep.boostedyaml.block.implementation.Section; import net.kyori.adventure.text.Component; -import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.bukkit.adventure.ShadedAdventureComponentWrapper; import net.momirealms.customfishing.bukkit.gui.SectionPage; import net.momirealms.customfishing.bukkit.gui.icon.BackGroundItem; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/BaitEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/BaitEditor.java index cf0a2d3b..2e5b0832 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/BaitEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/BaitEditor.java @@ -19,7 +19,6 @@ package net.momirealms.customfishing.bukkit.gui.page.item; import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.customfishing.bukkit.gui.icon.property.item.*; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import xyz.xenondevs.invui.item.Item; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/HookEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/HookEditor.java index cef9ef19..05994374 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/HookEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/HookEditor.java @@ -19,7 +19,6 @@ package net.momirealms.customfishing.bukkit.gui.page.item; import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.customfishing.bukkit.gui.icon.property.item.*; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import xyz.xenondevs.invui.item.Item; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/ItemSelector.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/ItemSelector.java index 7a61f3a3..a7931fa9 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/ItemSelector.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/ItemSelector.java @@ -17,7 +17,6 @@ package net.momirealms.customfishing.bukkit.gui.page.item; -import com.saicone.rtag.RtagItem; import dev.dejvokep.boostedyaml.YamlDocument; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.bukkit.adventure.ShadedAdventureComponentWrapper; @@ -27,16 +26,13 @@ import net.momirealms.customfishing.bukkit.gui.icon.BackToFolderItem; import net.momirealms.customfishing.bukkit.gui.icon.NextPageItem; import net.momirealms.customfishing.bukkit.gui.icon.PreviousPageItem; import net.momirealms.customfishing.common.helper.AdventureHelper; -import net.momirealms.customfishing.common.helper.VersionHelper; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import xyz.xenondevs.invui.gui.Gui; import xyz.xenondevs.invui.gui.PagedGui; @@ -48,7 +44,6 @@ import xyz.xenondevs.invui.item.impl.AbstractItem; import xyz.xenondevs.invui.item.impl.SimpleItem; import xyz.xenondevs.invui.window.AnvilWindow; -import javax.swing.*; import java.io.File; import java.io.IOException; import java.util.ArrayList; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/RodEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/RodEditor.java index 4f7bc442..8dadda5b 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/RodEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/RodEditor.java @@ -19,7 +19,6 @@ package net.momirealms.customfishing.bukkit.gui.page.item; import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.customfishing.bukkit.gui.icon.property.item.*; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import xyz.xenondevs.invui.item.Item; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/SectionEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/SectionEditor.java index c4e00da6..c2267385 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/SectionEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/item/SectionEditor.java @@ -20,7 +20,6 @@ package net.momirealms.customfishing.bukkit.gui.page.item; import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.customfishing.bukkit.gui.icon.property.item.*; import net.momirealms.customfishing.bukkit.gui.icon.property.loot.*; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import xyz.xenondevs.invui.item.Item; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/AmountEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/AmountEditor.java index 56aca27c..04b15e2b 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/AmountEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/AmountEditor.java @@ -24,7 +24,6 @@ import net.momirealms.customfishing.bukkit.gui.icon.BackGroundItem; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/CustomModelDataEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/CustomModelDataEditor.java index e1707933..a5e61a77 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/CustomModelDataEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/CustomModelDataEditor.java @@ -18,15 +18,12 @@ package net.momirealms.customfishing.bukkit.gui.page.property; import dev.dejvokep.boostedyaml.block.implementation.Section; -import net.kyori.adventure.text.Component; -import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.bukkit.adventure.ShadedAdventureComponentWrapper; import net.momirealms.customfishing.bukkit.gui.SectionPage; import net.momirealms.customfishing.bukkit.gui.icon.BackGroundItem; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/DisplayNameEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/DisplayNameEditor.java index e10e65da..8452129b 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/DisplayNameEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/DisplayNameEditor.java @@ -26,7 +26,6 @@ import net.momirealms.customfishing.common.helper.AdventureHelper; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/DurabilityEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/DurabilityEditor.java index afa58c9b..30dfd988 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/DurabilityEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/DurabilityEditor.java @@ -25,7 +25,6 @@ import net.momirealms.customfishing.bukkit.gui.icon.BackGroundItem; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/ItemFlagEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/ItemFlagEditor.java index f83ad4cd..061d5338 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/ItemFlagEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/ItemFlagEditor.java @@ -18,7 +18,6 @@ package net.momirealms.customfishing.bukkit.gui.page.property; import dev.dejvokep.boostedyaml.block.implementation.Section; -import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.bukkit.adventure.ShadedAdventureComponentWrapper; import net.momirealms.customfishing.bukkit.gui.SectionPage; import net.momirealms.customfishing.bukkit.gui.icon.BackGroundItem; @@ -26,7 +25,6 @@ import net.momirealms.customfishing.common.helper.AdventureHelper; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/LoreEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/LoreEditor.java index a5375843..61846ef9 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/LoreEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/LoreEditor.java @@ -25,7 +25,6 @@ import net.momirealms.customfishing.common.helper.AdventureHelper; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/MaterialEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/MaterialEditor.java index d8ca96f3..059fdec0 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/MaterialEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/MaterialEditor.java @@ -25,7 +25,6 @@ import net.momirealms.customfishing.bukkit.gui.icon.BackGroundItem; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/NickEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/NickEditor.java index 72bf0a24..6172deb7 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/NickEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/NickEditor.java @@ -26,7 +26,6 @@ import net.momirealms.customfishing.common.helper.AdventureHelper; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/PriceEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/PriceEditor.java index 933547f0..9ce24735 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/PriceEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/PriceEditor.java @@ -25,7 +25,6 @@ import net.momirealms.customfishing.bukkit.gui.icon.BackGroundItem; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/ScoreEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/ScoreEditor.java index ce5c734f..fe147b8b 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/ScoreEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/ScoreEditor.java @@ -25,7 +25,6 @@ import net.momirealms.customfishing.bukkit.gui.icon.BackGroundItem; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/SizeEditor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/SizeEditor.java index 376b33e2..4d8df950 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/SizeEditor.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/gui/page/property/SizeEditor.java @@ -25,7 +25,6 @@ import net.momirealms.customfishing.common.helper.AdventureHelper; import net.momirealms.customfishing.common.locale.MessageConstants; import net.momirealms.customfishing.common.locale.TranslationManager; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/item/BukkitItemManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/item/BukkitItemManager.java index e4ad2675..ff13deae 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/item/BukkitItemManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/item/BukkitItemManager.java @@ -9,6 +9,7 @@ import net.momirealms.customfishing.api.mechanic.context.Context; import net.momirealms.customfishing.api.mechanic.context.ContextKeys; import net.momirealms.customfishing.api.mechanic.item.CustomFishingItem; import net.momirealms.customfishing.api.mechanic.item.ItemManager; +import net.momirealms.customfishing.api.mechanic.item.ItemType; import net.momirealms.customfishing.bukkit.util.ItemUtils; import net.momirealms.customfishing.bukkit.util.LocationUtils; import net.momirealms.customfishing.common.item.Item; @@ -33,10 +34,7 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; @@ -97,13 +95,13 @@ public class BukkitItemManager implements ItemManager, Listener { @NotNull @Override - public ItemStack build(@NotNull Context context, CustomFishingItem item) { + public ItemStack build(@NotNull Context context, @NotNull CustomFishingItem item) { ItemStack itemStack = getOriginalStack(context.getHolder(), item.material()); Item wrappedItemStack = factory.wrap(itemStack); for (BiConsumer, Context> consumer : item.tagConsumers()) { consumer.accept(wrappedItemStack, context); } - return wrappedItemStack.getItem(); + return wrappedItemStack.load(); } @Override @@ -130,6 +128,18 @@ public class BukkitItemManager implements ItemManager, Listener { return (String) factory.wrap(itemStack).getTag("CustomFishing", "id").orElse(null); } + @Nullable + @Override + public ItemType getItemType(@NotNull ItemStack itemStack) { + return ItemType.getTypeByID(getCustomFishingItemID(itemStack)); + } + + @Nullable + @Override + public ItemType getItemType(@NotNull String id) { + return ItemType.getTypeByID(id); + } + @Nullable @Override @SuppressWarnings("all") @@ -316,4 +326,9 @@ public class BukkitItemManager implements ItemManager, Listener { public ItemProvider[] getItemProviders() { return itemProviders.values().toArray(new ItemProvider[0]); } + + @Override + public Collection getItemIDs() { + return items.keySet(); + } } diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/market/BukkitMarketManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/market/BukkitMarketManager.java index 9c02fe88..14644e8d 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/market/BukkitMarketManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/market/BukkitMarketManager.java @@ -200,7 +200,6 @@ public class BukkitMarketManager implements MarketManager, Listener { */ @Override public void openMarketGUI(Player player) { - if (!enable) return; Optional optionalUserData = plugin.getStorageManager().getOnlineUser(player.getUniqueId()); if (optionalUserData.isEmpty()) { plugin.getPluginLogger().warn("Player " + player.getName() + "'s market data is not loaded yet."); diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/scheduler/BukkitSchedulerAdapter.java b/core/src/main/java/net/momirealms/customfishing/bukkit/scheduler/BukkitSchedulerAdapter.java index 73032d73..a78cb4c7 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/scheduler/BukkitSchedulerAdapter.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/scheduler/BukkitSchedulerAdapter.java @@ -26,6 +26,9 @@ package net.momirealms.customfishing.bukkit.scheduler; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; +import net.momirealms.customfishing.bukkit.scheduler.impl.BukkitExecutor; +import net.momirealms.customfishing.bukkit.scheduler.impl.FoliaExecutor; +import net.momirealms.customfishing.common.helper.VersionHelper; import net.momirealms.customfishing.common.plugin.scheduler.AbstractJavaScheduler; import net.momirealms.customfishing.common.plugin.scheduler.RegionExecutor; import org.bukkit.Location; @@ -33,9 +36,13 @@ import org.bukkit.Location; public class BukkitSchedulerAdapter extends AbstractJavaScheduler { protected RegionExecutor sync; - public BukkitSchedulerAdapter(BukkitCustomFishingPlugin plugin, RegionExecutor executor) { + public BukkitSchedulerAdapter(BukkitCustomFishingPlugin plugin) { super(plugin); - this.sync = executor; + if (VersionHelper.isFolia()) { + this.sync = new FoliaExecutor(plugin.getBoostrap()); + } else { + this.sync = new BukkitExecutor(plugin.getBoostrap()); + } } @Override diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/scheduler/impl/BukkitExecutor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/scheduler/impl/BukkitExecutor.java new file mode 100644 index 00000000..1aff4b85 --- /dev/null +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/scheduler/impl/BukkitExecutor.java @@ -0,0 +1,56 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.momirealms.customfishing.bukkit.scheduler.impl; + +import net.momirealms.customfishing.common.plugin.scheduler.RegionExecutor; +import net.momirealms.customfishing.common.plugin.scheduler.SchedulerTask; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.plugin.Plugin; + +public class BukkitExecutor implements RegionExecutor { + + private final Plugin plugin; + + public BukkitExecutor(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public void run(Runnable r, Location l) { + Bukkit.getScheduler().runTask(plugin, r); + } + + @Override + public SchedulerTask runLater(Runnable r, long delayTicks, Location l) { + return Bukkit.getScheduler().runTaskLater(plugin, r, delayTicks)::cancel; + } + + @Override + public SchedulerTask runRepeating(Runnable r, long delayTicks, long period, Location l) { + return Bukkit.getScheduler().runTaskTimer(plugin, r, delayTicks, period)::cancel; + } +} diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/scheduler/impl/FoliaExecutor.java b/core/src/main/java/net/momirealms/customfishing/bukkit/scheduler/impl/FoliaExecutor.java new file mode 100644 index 00000000..6a6804a4 --- /dev/null +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/scheduler/impl/FoliaExecutor.java @@ -0,0 +1,66 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.momirealms.customfishing.bukkit.scheduler.impl; + +import net.momirealms.customfishing.common.plugin.scheduler.RegionExecutor; +import net.momirealms.customfishing.common.plugin.scheduler.SchedulerTask; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.plugin.Plugin; + +import java.util.Optional; + +public class FoliaExecutor implements RegionExecutor { + + private final Plugin plugin; + + public FoliaExecutor(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public void run(Runnable r, Location l) { + Optional.ofNullable(l).ifPresentOrElse(loc -> Bukkit.getRegionScheduler().execute(plugin, loc, r), () -> Bukkit.getGlobalRegionScheduler().execute(plugin, r)); + } + + @Override + public SchedulerTask runLater(Runnable r, long delayTicks, Location l) { + if (l == null) { + return Bukkit.getGlobalRegionScheduler().runDelayed(plugin, scheduledTask -> r.run(), delayTicks)::cancel; + } else { + return Bukkit.getRegionScheduler().runDelayed(plugin, l, scheduledTask -> r.run(), delayTicks)::cancel; + } + } + + @Override + public SchedulerTask runRepeating(Runnable r, long delayTicks, long period, Location l) { + if (l == null) { + return Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, scheduledTask -> r.run(), delayTicks, period)::cancel; + } else { + return Bukkit.getRegionScheduler().runAtFixedRate(plugin, l, scheduledTask -> r.run(), delayTicks, period)::cancel; + } + } +} diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/storage/method/database/sql/H2Provider.java b/core/src/main/java/net/momirealms/customfishing/bukkit/storage/method/database/sql/H2Provider.java index b64a711a..316e29cf 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/storage/method/database/sql/H2Provider.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/storage/method/database/sql/H2Provider.java @@ -21,6 +21,7 @@ import dev.dejvokep.boostedyaml.YamlDocument; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.api.storage.StorageType; import net.momirealms.customfishing.common.dependency.Dependency; +import org.h2.jdbcx.JdbcConnectionPool; import java.io.File; import java.lang.reflect.Method; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/totem/BukkitTotemManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/totem/BukkitTotemManager.java index 4dd86d5f..29e68349 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/totem/BukkitTotemManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/totem/BukkitTotemManager.java @@ -17,38 +17,8 @@ package net.momirealms.customfishing.bukkit.totem; -import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; -import net.momirealms.customfishing.api.mechanic.totem.TotemConfig; import net.momirealms.customfishing.api.mechanic.totem.TotemManager; -import net.momirealms.customfishing.api.mechanic.totem.TotemModel; -import net.momirealms.customfishing.api.mechanic.totem.block.TotemBlock; -import net.momirealms.customfishing.api.mechanic.totem.block.property.AxisImpl; -import net.momirealms.customfishing.api.mechanic.totem.block.property.FaceImpl; -import net.momirealms.customfishing.api.mechanic.totem.block.property.HalfImpl; -import net.momirealms.customfishing.api.mechanic.totem.block.property.TotemBlockProperty; -import net.momirealms.customfishing.api.mechanic.totem.block.type.TypeCondition; -import net.momirealms.customfishing.api.util.SimpleLocation; -import net.momirealms.customfishing.bukkit.totem.particle.DustParticleSetting; -import net.momirealms.customfishing.bukkit.totem.particle.ParticleSetting; -import net.momirealms.customfishing.common.plugin.scheduler.SchedulerTask; -import net.momirealms.customfishing.common.util.Pair; -import org.bukkit.*; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.data.Bisected; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.event.Event; -import org.bukkit.event.EventHandler; -import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.EquipmentSlot; - -import java.io.File; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; public class BukkitTotemManager implements TotemManager, Listener { diff --git a/core/src/main/resources/commands.yml b/core/src/main/resources/commands.yml index 54bdb897..3888797d 100644 --- a/core/src/main/resources/commands.yml +++ b/core/src/main/resources/commands.yml @@ -8,13 +8,27 @@ config-version: "${config_version}" # reload: enable: true - permission: customfishing.reload + permission: customfishing.command.reload usage: - /customfishing reload - /cfishing reload sellfish: enable: true - permission: customfishing.sellfish + permission: customfishing.command.sellfish usage: - - /sellfish \ No newline at end of file + - /sellfish + +getitem: + enable: true + permission: customfishing.command.getitem + usage: + - /customfishing items get + - /cfishing items get + +giveitem: + enable: true + permission: customfishing.command.giveitem + usage: + - /customfishing items give + - /cfishing items give \ No newline at end of file diff --git a/core/src/main/resources/market.yml b/core/src/main/resources/market.yml index ed01c5b2..c658b6cb 100644 --- a/core/src/main/resources/market.yml +++ b/core/src/main/resources/market.yml @@ -1,7 +1,5 @@ config-version: '${config_version}' -enable: true - # Container title title: 'Fish Market' diff --git a/core/src/main/resources/translations/en.yml b/core/src/main/resources/translations/en.yml index d1c52065..876ce41b 100644 --- a/core/src/main/resources/translations/en.yml +++ b/core/src/main/resources/translations/en.yml @@ -3,21 +3,21 @@ config-version: "31" command.prefix: "[CustomFishing] " command.reload.success: "Reloaded. Took ms." -command.item.failure.not_exist: "Item not exists" -command.item.give.success: "Successfully given player x ." -command.item.get.success: "Successfully got x ." +command.item.failure.not_exist: "Item [] not exists." +command.item.give.success: "Successfully given x ." +command.item.get.success: "Successfully got x ." command.fish_finder.possible_loots: "Possible loots here: " command.fish_finder.no_loot: "No loot available" command.fish_finder.split_char: ", " -command.competition.failure.not_exist: "Competition does not exist." -command.competition.failure.no_competition: "There's no competition ongoing." -command.competition.stop.success: "Stopped the current competition." -command.competition.end.success: "Ended the current competition." -command.bag.edit.failure.unsafe: "Cannot edit a player's fishing bag if they"re active on another linked server." -command.bag.edit.failure.never_played: 'The player hasn\'t joined the server before. Can't modify a nonexistent player"s fishing bag." -command.bag.open.success: "Successfully opened the fishing bag for " -command.data.failure.not_load: 'Data hasn't loaded. Please re-enter the server. If issues persist, reach out to the server admin." -command.market.open.success: "Successfully opened the market gui for " +command.competition.failure.not_exist: "Competition does not exist." +command.competition.failure.no_competition: "There's no competition ongoing." +command.competition.stop.success: "Stopped the current competition." +command.competition.end.success: "Ended the current competition." +command.bag.edit.failure.unsafe: "Cannot edit a player's fishing bag if they're active on another linked server." +command.bag.edit.failure.never_played: "The player hasn't joined the server before. Can't modify a nonexistent player's fishing bag." +command.bag.open.success: "Successfully opened the fishing bag for " +command.data.failure.not_load: "Data hasn't been loaded. Please re-enter the server. If issues persist, reach out to the server admin." +command.market.open.success: "Successfully opened the market gui for " competition.no_score: "No Score" competition.no_player: "No Player" competition.no_rank: "No Rank" @@ -41,14 +41,14 @@ gui.invalid_number: "● Invalid number" gui.illegal_format: "● Illegal format" gui.scroll_up: "● Scroll up" gui.scroll_down: "● Scroll down" -gui.cannot_scroll_up: "You"ve reached the top" -gui.cannot_scroll_down: "You can"t scroll further down" +gui.cannot_scroll_up: "You've reached the top" +gui.cannot_scroll_down: "You can't scroll further down" gui.next_page: "● Next Page" gui.goto_next_page: "Go to page / " gui.cannot_goto_next_page: "There are no more pages" gui.previous_page: "● Previous page" gui.goto_previous_page: "Go to page / " -gui.cannot_goto_previous_page: "You can"t go further back" +gui.cannot_goto_previous_page: "You can't go further back" gui.back_to_parent_page: "<#FF8C00>Back to parent page" gui.back_to_parent_folder: "<#FF8C00>Back to parent folder" gui.current_value: "Current value: " diff --git a/gradle.properties b/gradle.properties index 572a1933..4a5193eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,16 +14,16 @@ asm_version=9.7 asm_commons_version=9.7 jar_relocator_version=1.7 h2_driver_version=2.2.224 -sqlite_driver_version=3.45.3.0 +sqlite_driver_version=3.46.0.0 adventure_bundle_version=4.17.0 adventure_platform_version=4.3.2 sparrow_heart_version=0.16 -cloud_core_version=2.0.0-rc.1 -cloud_brigadier_version=2.0.0-beta.7 -cloud_services_version=2.0.0-rc.1 -cloud_bukkit_version=2.0.0-beta.7 -cloud_paper_version=2.0.0-beta.7 -cloud_minecraft_extras_version=2.0.0-beta.7 +cloud_core_version=2.0.0-rc.2 +cloud_services_version=2.0.0-rc.2 +cloud_brigadier_version=2.0.0-beta.8 +cloud_bukkit_version=2.0.0-beta.8 +cloud_paper_version=2.0.0-beta.8 +cloud_minecraft_extras_version=2.0.0-beta.8 boosted_yaml_version=1.3.4 byte_buddy_version=1.14.14 mojang_brigadier_version=1.0.18