diff --git a/api/src/main/java/net/momirealms/customcrops/api/BukkitCustomCropsPlugin.java b/api/src/main/java/net/momirealms/customcrops/api/BukkitCustomCropsPlugin.java index 20fea65..476d798 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/BukkitCustomCropsPlugin.java +++ b/api/src/main/java/net/momirealms/customcrops/api/BukkitCustomCropsPlugin.java @@ -229,6 +229,16 @@ public abstract class BukkitCustomCropsPlugin implements CustomCropsPlugin { return (RequirementManager) instance.requirementManagers.get(type); } + /** + * Retrieves the config manager + * + * @return the config manager + */ + @Override + public ConfigManager getConfigManager() { + return configManager; + } + /** * Logs a debug message. * diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/BuiltInBlockMechanics.java b/api/src/main/java/net/momirealms/customcrops/api/core/BuiltInBlockMechanics.java index 98e56d7..5108611 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/BuiltInBlockMechanics.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/BuiltInBlockMechanics.java @@ -91,6 +91,6 @@ public class BuiltInBlockMechanics { * @return the CustomCropsBlock */ public CustomCropsBlock mechanic() { - return Objects.requireNonNull(Registries.BLOCK.get(key)); + return Objects.requireNonNull(InternalRegistries.BLOCK.get(key)); } } diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/BuiltInItemMechanics.java b/api/src/main/java/net/momirealms/customcrops/api/core/BuiltInItemMechanics.java index 97bef08..29d9ee8 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/BuiltInItemMechanics.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/BuiltInItemMechanics.java @@ -66,6 +66,6 @@ public class BuiltInItemMechanics { * @return the CustomCropsItem */ public CustomCropsItem mechanic() { - return Registries.ITEM.get(key); + return InternalRegistries.ITEM.get(key); } } diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/ConfigManager.java b/api/src/main/java/net/momirealms/customcrops/api/core/ConfigManager.java index eaa480c..5598718 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/ConfigManager.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/ConfigManager.java @@ -400,7 +400,7 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable { if (section.getBoolean("enable")) { for (Map.Entry entry : section.getStringRouteMappedValues(false).entrySet()) { if (entry.getValue() instanceof Section innerSection) { - FertilizerType type = Registries.FERTILIZER_TYPE.get(entry.getKey().replace("-", "_")); + FertilizerType type = InternalRegistries.FERTILIZER_TYPE.get(entry.getKey().replace("-", "_")); if (type != null) { map.put(type, Pair.of( Preconditions.checkNotNull(innerSection.getString("dry"), entry.getKey() + ".dry should not be null"), diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/InternalRegistries.java b/api/src/main/java/net/momirealms/customcrops/api/core/InternalRegistries.java new file mode 100644 index 0000000..83cfe5c --- /dev/null +++ b/api/src/main/java/net/momirealms/customcrops/api/core/InternalRegistries.java @@ -0,0 +1,16 @@ +package net.momirealms.customcrops.api.core; + +import net.momirealms.customcrops.api.core.block.CustomCropsBlock; +import net.momirealms.customcrops.api.core.item.CustomCropsItem; +import net.momirealms.customcrops.api.core.mechanic.fertilizer.FertilizerType; +import net.momirealms.customcrops.common.annotation.DoNotUse; +import net.momirealms.customcrops.common.util.Key; + +@DoNotUse(message = "Internal use only. Avoid using this class directly.") +@Deprecated(since = "3.6", forRemoval = false) +public class InternalRegistries { + + public static final WriteableRegistry BLOCK = new MappedRegistry<>(Key.key("mechanic", "block")); + public static final WriteableRegistry ITEM = new MappedRegistry<>(Key.key("mechanic", "item")); + public static final WriteableRegistry FERTILIZER_TYPE = new ClearableMappedRegistry<>(Key.key("mechanic", "fertilizer_type")); +} diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/Registries.java b/api/src/main/java/net/momirealms/customcrops/api/core/Registries.java index ee6f0b2..95cef2b 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/Registries.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/Registries.java @@ -21,11 +21,9 @@ import net.momirealms.customcrops.api.core.block.CustomCropsBlock; import net.momirealms.customcrops.api.core.item.CustomCropsItem; import net.momirealms.customcrops.api.core.mechanic.crop.CropConfig; import net.momirealms.customcrops.api.core.mechanic.fertilizer.FertilizerConfig; -import net.momirealms.customcrops.api.core.mechanic.fertilizer.FertilizerType; import net.momirealms.customcrops.api.core.mechanic.pot.PotConfig; import net.momirealms.customcrops.api.core.mechanic.sprinkler.SprinklerConfig; import net.momirealms.customcrops.api.core.mechanic.wateringcan.WateringCanConfig; -import net.momirealms.customcrops.common.annotation.DoNotUse; import net.momirealms.customcrops.common.util.Key; import org.jetbrains.annotations.ApiStatus; @@ -34,15 +32,7 @@ import java.util.List; @ApiStatus.Internal public class Registries { - @DoNotUse - public static final WriteableRegistry BLOCK = new MappedRegistry<>(Key.key("mechanic", "block")); - @DoNotUse - public static final WriteableRegistry ITEM = new MappedRegistry<>(Key.key("mechanic", "item")); - @DoNotUse - public static final WriteableRegistry FERTILIZER_TYPE = new ClearableMappedRegistry<>(Key.key("mechanic", "fertilizer_type")); - @DoNotUse public static final ClearableRegistry BLOCKS = new ClearableMappedRegistry<>(Key.key("internal", "blocks")); - @DoNotUse public static final ClearableRegistry ITEMS = new ClearableMappedRegistry<>(Key.key("internal", "items")); public static final ClearableRegistry SPRINKLER = new ClearableMappedRegistry<>(Key.key("config", "sprinkler")); diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/SimpleRegistryAccess.java b/api/src/main/java/net/momirealms/customcrops/api/core/SimpleRegistryAccess.java index 4031df8..c013476 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/SimpleRegistryAccess.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/SimpleRegistryAccess.java @@ -22,6 +22,7 @@ import net.momirealms.customcrops.api.core.item.CustomCropsItem; import net.momirealms.customcrops.api.core.mechanic.fertilizer.FertilizerType; import net.momirealms.customcrops.common.util.Key; +@SuppressWarnings("deprecation") public class SimpleRegistryAccess implements RegistryAccess { private boolean frozen; @@ -45,33 +46,33 @@ public class SimpleRegistryAccess implements RegistryAccess { @Override public void registerBlockMechanic(CustomCropsBlock block) { if (frozen) throw new RuntimeException("Registries are frozen"); - Registries.BLOCK.register(block.type(), block); + InternalRegistries.BLOCK.register(block.type(), block); } @Override public void registerItemMechanic(CustomCropsItem item) { if (frozen) throw new RuntimeException("Registries are frozen"); - Registries.ITEM.register(item.type(), item); + InternalRegistries.ITEM.register(item.type(), item); } @Override public void registerFertilizerType(FertilizerType type) { if (frozen) throw new RuntimeException("Registries are frozen"); - Registries.FERTILIZER_TYPE.register(type.id(), type); + InternalRegistries.FERTILIZER_TYPE.register(type.id(), type); } @Override public Registry getBlockRegistry() { - return Registries.BLOCK; + return InternalRegistries.BLOCK; } @Override public Registry getItemRegistry() { - return Registries.ITEM; + return InternalRegistries.ITEM; } @Override public Registry getFertilizerTypeRegistry() { - return Registries.FERTILIZER_TYPE; + return InternalRegistries.FERTILIZER_TYPE; } } diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/block/CropBlock.java b/api/src/main/java/net/momirealms/customcrops/api/core/block/CropBlock.java index 400ac53..28e0d35 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/block/CropBlock.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/block/CropBlock.java @@ -45,7 +45,6 @@ import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; -import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import java.util.List; diff --git a/common/src/main/java/net/momirealms/customcrops/common/annotation/DoNotUse.java b/common/src/main/java/net/momirealms/customcrops/common/annotation/DoNotUse.java index 4af0862..ae0992d 100644 --- a/common/src/main/java/net/momirealms/customcrops/common/annotation/DoNotUse.java +++ b/common/src/main/java/net/momirealms/customcrops/common/annotation/DoNotUse.java @@ -17,12 +17,13 @@ package net.momirealms.customcrops.common.annotation; -import org.jetbrains.annotations.ApiStatus; - import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -@ApiStatus.Internal -@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) public @interface DoNotUse { + String message() default "This class is internal and should not be used."; } diff --git a/compatibility-asp-r1/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/asp_r1/SlimeWorldAdaptorR1.java b/compatibility-asp-r1/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/asp_r1/SlimeWorldAdaptorR1.java index e329a76..16d16cb 100644 --- a/compatibility-asp-r1/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/asp_r1/SlimeWorldAdaptorR1.java +++ b/compatibility-asp-r1/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/asp_r1/SlimeWorldAdaptorR1.java @@ -20,7 +20,7 @@ package net.momirealms.customcrops.bukkit.integration.adaptor.asp_r1; import com.flowpowered.nbt.*; import com.infernalsuite.aswm.api.world.SlimeWorld; import net.momirealms.customcrops.api.BukkitCustomCropsPlugin; -import net.momirealms.customcrops.api.core.Registries; +import net.momirealms.customcrops.api.core.InternalRegistries; import net.momirealms.customcrops.api.core.block.CustomCropsBlock; import net.momirealms.customcrops.api.core.world.*; import net.momirealms.customcrops.api.core.world.adaptor.AbstractWorldAdaptor; @@ -224,7 +224,7 @@ public class SlimeWorldAdaptorR1 extends AbstractWorldAdaptor { CompoundMap block = blockTag.getValue(); CompoundMap data = (CompoundMap) block.get("data").getValue(); Key key = keyFunction.apply((String) block.get("type").getValue()); - CustomCropsBlock customBlock = Registries.BLOCK.get(key); + CustomCropsBlock customBlock = InternalRegistries.BLOCK.get(key); if (customBlock == null) { BukkitCustomCropsPlugin.getInstance().getInstance().getPluginLogger().warn("[" + world.worldName() + "] Unrecognized custom block " + key + " has been removed from chunk " + ChunkPos.of(x, z)); continue; diff --git a/plugin/src/main/java/net/momirealms/customcrops/bukkit/BukkitCustomCropsPluginImpl.java b/plugin/src/main/java/net/momirealms/customcrops/bukkit/BukkitCustomCropsPluginImpl.java index 1b8451e..42b1617 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/bukkit/BukkitCustomCropsPluginImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/bukkit/BukkitCustomCropsPluginImpl.java @@ -44,7 +44,6 @@ import net.momirealms.customcrops.bukkit.requirement.PlayerRequirementManager; import net.momirealms.customcrops.bukkit.scheduler.BukkitSchedulerAdapter; import net.momirealms.customcrops.bukkit.sender.BukkitSenderFactory; import net.momirealms.customcrops.bukkit.world.BukkitWorldManager; -import net.momirealms.customcrops.common.config.ConfigLoader; import net.momirealms.customcrops.common.dependency.Dependency; import net.momirealms.customcrops.common.dependency.DependencyManagerImpl; import net.momirealms.customcrops.common.helper.VersionHelper; @@ -122,11 +121,6 @@ public class BukkitCustomCropsPluginImpl extends BukkitCustomCropsPlugin { return getBoostrap().getDataFolder().toPath().toAbsolutePath(); } - @Override - public ConfigLoader getConfigManager() { - return configManager; - } - @Override public String getServerVersion() { return Bukkit.getServer().getBukkitVersion().split("-")[0]; @@ -177,7 +171,6 @@ public class BukkitCustomCropsPluginImpl extends BukkitCustomCropsPlugin { boolean downloadFromPolymart = polymart.equals("1"); boolean downloadFromBBB = buildByBit.equals("true"); - ((SimpleRegistryAccess) registryAccess).freeze(); this.reload(); if (ConfigManager.metrics()) new Metrics((JavaPlugin) getBoostrap(), 16593); if (ConfigManager.checkUpdate()) { @@ -197,18 +190,21 @@ public class BukkitCustomCropsPluginImpl extends BukkitCustomCropsPlugin { } }); } + // delayed init task if (VersionHelper.isFolia()) { Bukkit.getGlobalRegionScheduler().run(getBoostrap(), (scheduledTask) -> { ((SimpleRegistryAccess) registryAccess).freeze(); logger.info("Registry access has been frozen"); ((BukkitItemManager) itemManager).setAntiGriefLib(AntiGriefLib.builder((JavaPlugin) getBoostrap()).silentLogs(true).ignoreOP(true).build()); + EventUtils.fireAndForget(new CustomCropsReloadEvent(this)); }); } else { Bukkit.getScheduler().runTask(getBoostrap(), () -> { ((SimpleRegistryAccess) registryAccess).freeze(); logger.info("Registry access has been frozen"); ((BukkitItemManager) itemManager).setAntiGriefLib(AntiGriefLib.builder((JavaPlugin) getBoostrap()).silentLogs(false).ignoreOP(true).build()); + EventUtils.fireAndForget(new CustomCropsReloadEvent(this)); }); } } diff --git a/plugin/src/main/java/net/momirealms/customcrops/bukkit/command/feature/ForceTickCommand.java b/plugin/src/main/java/net/momirealms/customcrops/bukkit/command/feature/ForceTickCommand.java index 6e43ac5..af658e8 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/bukkit/command/feature/ForceTickCommand.java +++ b/plugin/src/main/java/net/momirealms/customcrops/bukkit/command/feature/ForceTickCommand.java @@ -19,7 +19,7 @@ package net.momirealms.customcrops.bukkit.command.feature; import net.kyori.adventure.text.Component; import net.momirealms.customcrops.api.BukkitCustomCropsPlugin; -import net.momirealms.customcrops.api.core.Registries; +import net.momirealms.customcrops.api.core.InternalRegistries; import net.momirealms.customcrops.api.core.block.CustomCropsBlock; import net.momirealms.customcrops.api.core.world.*; import net.momirealms.customcrops.bukkit.command.BukkitCommandFeature; @@ -59,10 +59,10 @@ public class ForceTickCommand extends BukkitCommandFeature { .required("type", NamespacedKeyParser.namespacedKeyComponent().suggestionProvider(new SuggestionProvider<>() { @Override public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { - int all = Registries.BLOCK.size(); + int all = InternalRegistries.BLOCK.size(); ArrayList blocks = new ArrayList<>(); for (int i = 0; i < all; i++) { - blocks.add(Registries.BLOCK.byId(i)); + blocks.add(InternalRegistries.BLOCK.byId(i)); } return CompletableFuture.completedFuture( blocks.stream().map(block -> Suggestion.suggestion(block.type().asString())).toList() @@ -76,7 +76,7 @@ public class ForceTickCommand extends BukkitCommandFeature { NamespacedKey type = context.get("type"); Mode mode = context.get("mode"); Key key = Key.key(type.asString()); - CustomCropsBlock customCropsBlock = Registries.BLOCK.get(key); + CustomCropsBlock customCropsBlock = InternalRegistries.BLOCK.get(key); if (customCropsBlock == null) { handleFeedback(context.sender(), MessageConstants.COMMAND_FORCE_TICK_FAILURE_TYPE, Component.text(key.asString())); return; diff --git a/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/ConfigType.java b/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/ConfigType.java index a4d75dc..71194c0 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/ConfigType.java +++ b/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/ConfigType.java @@ -24,7 +24,7 @@ import net.momirealms.customcrops.api.action.ActionManager; import net.momirealms.customcrops.api.core.ConfigManager; import net.momirealms.customcrops.api.core.CustomForm; import net.momirealms.customcrops.api.core.ExistenceForm; -import net.momirealms.customcrops.api.core.Registries; +import net.momirealms.customcrops.api.core.InternalRegistries; import net.momirealms.customcrops.api.core.mechanic.crop.CropConfig; import net.momirealms.customcrops.api.core.mechanic.crop.CropStageConfig; import net.momirealms.customcrops.api.core.mechanic.fertilizer.FertilizerConfig; @@ -94,7 +94,7 @@ public class ConfigType { "fertilizers", (manager, id, section) -> { String typeName = Preconditions.checkNotNull(section.getString("type"), "Fertilizer type can't be null").toLowerCase(Locale.ENGLISH); - FertilizerType type = Registries.FERTILIZER_TYPE.get(typeName); + FertilizerType type = InternalRegistries.FERTILIZER_TYPE.get(typeName); if (type == null) { BukkitCustomCropsPlugin.getInstance().getPluginLogger().warn("Fertilizer type " + typeName + " not found"); return false; diff --git a/plugin/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/BukkitWorldAdaptor.java b/plugin/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/BukkitWorldAdaptor.java index b555d9d..ce1a682 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/BukkitWorldAdaptor.java +++ b/plugin/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/BukkitWorldAdaptor.java @@ -23,7 +23,7 @@ import com.flowpowered.nbt.stream.NBTInputStream; import com.flowpowered.nbt.stream.NBTOutputStream; import net.momirealms.customcrops.api.BukkitCustomCropsPlugin; import net.momirealms.customcrops.api.core.ConfigManager; -import net.momirealms.customcrops.api.core.Registries; +import net.momirealms.customcrops.api.core.InternalRegistries; import net.momirealms.customcrops.api.core.block.CustomCropsBlock; import net.momirealms.customcrops.api.core.world.*; import net.momirealms.customcrops.api.core.world.adaptor.AbstractWorldAdaptor; @@ -415,7 +415,7 @@ public class BukkitWorldAdaptor extends AbstractWorldAdaptor { CompoundMap block = readCompound(blockData).getValue(); Key key = keyFunction.apply((String) block.get("type").getValue()); CompoundMap data = (CompoundMap) block.get("data").getValue(); - CustomCropsBlock customBlock = Registries.BLOCK.get(key); + CustomCropsBlock customBlock = InternalRegistries.BLOCK.get(key); if (customBlock == null) { BukkitCustomCropsPlugin.getInstance().getInstance().getPluginLogger().warn("[" + world.worldName() + "] Unrecognized custom block " + key + " has been removed from chunk " + ChunkPos.of(x, z)); continue; diff --git a/plugin/src/main/resources/contents/crops/default.yml b/plugin/src/main/resources/contents/crops/default.yml index ea49971..1f69aa9 100644 --- a/plugin/src/main/resources/contents/crops/default.yml +++ b/plugin/src/main/resources/contents/crops/default.yml @@ -228,12 +228,12 @@ tomato: point: 1 conditions: season_condition: - type: suitable_season + type: suitable-season value: - Spring - Autumn water_condition: - type: water_more_than + type: water-more-than value: 0 # Conditions that may cause the crop to die death-conditions: @@ -243,7 +243,7 @@ tomato: conditions: '&&': condition_1: - type: water_less_than + type: water-less-than value: 1 condition_2: type: random @@ -253,14 +253,14 @@ tomato: model: {0}crop_stage_death conditions: condition_1: - type: unsuitable_season + type: unsuitable-season value: - Winter crow_attack: # Crop removal due to crow attack conditions: condition_1: - type: crow_attack + type: crow-attack value: chance: 0.005 fly-model: {0}crow_fly