From 0e0bc5535730adcaffc551cd18aac52170b42f1b Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 4 Apr 2025 19:00:46 +0800 Subject: [PATCH] refactor structure --- .../craftengine/bukkit/BukkitBootstrap.java | 6 +- .../api/event/CraftEngineReloadEvent.java | 1 - .../bukkit/block/BlockEventListener.java | 8 +- .../bukkit/block/BukkitBlockManager.java | 13 +- .../furniture/BukkitFurnitureManager.java | 6 +- .../bukkit/font/BukkitFontManager.java | 8 +- .../bukkit/item/BukkitItemManager.java | 10 +- .../item/recipe/BukkitRecipeManager.java | 6 +- .../item/recipe/CrafterEventListener.java | 4 +- .../item/recipe/RecipeEventListener.java | 18 +- .../bukkit/pack/BukkitPackManager.java | 52 ++-- .../bukkit/plugin/BukkitCraftEngine.java | 91 +++---- .../plugin/injector/BukkitInjector.java | 6 +- .../plugin/network/BukkitNetworkManager.java | 135 +++++----- .../plugin/network/PacketConsumers.java | 12 +- .../bukkit/util/InteractUtils.java | 6 +- .../util/NoteBlockChainUpdateUtils.java | 4 +- .../bukkit/world/BukkitCEWorld.java | 4 +- .../bukkit/world/BukkitWorldManager.java | 10 +- .../craftengine/core/block/BlockManager.java | 7 +- .../entity/furniture/FurnitureManager.java | 4 +- .../core/font/AbstractFontManager.java | 2 +- .../craftengine/core/font/FontManager.java | 4 +- .../craftengine/core/item/ItemManager.java | 4 +- .../item/modifier/DisplayNameModifier.java | 4 +- .../core/item/modifier/ItemNameModifier.java | 4 +- .../core/item/modifier/LoreModifier.java | 4 +- .../item/recipe/AbstractRecipeManager.java | 4 +- .../core/item/recipe/RecipeManager.java | 6 +- .../core/loot/VanillaLootManager.java | 4 +- .../core/pack/AbstractPackManager.java | 45 ++-- .../craftengine/core/pack/PackManager.java | 4 +- .../core/pack/host/ResourcePackHost.java | 6 +- .../core/pack/obfuscation/ObfF.java | 2 +- .../craftengine/core/plugin/CraftEngine.java | 243 ++++++++++-------- .../{Reloadable.java => Manageable.java} | 21 +- .../craftengine/core/plugin/Plugin.java | 10 +- .../command/AbstractCommandManager.java | 4 +- .../{ConfigManager.java => Config.java} | 15 +- .../config/template/TemplateManager.java | 5 +- .../core/plugin/gui/GuiManager.java | 4 +- .../gui/category/ItemBrowserManager.java | 8 +- .../plugin/locale/TranslationManager.java | 4 +- .../core/plugin/network/NetworkManager.java | 18 +- .../core/sound/AbstractSoundManager.java | 2 +- .../craftengine/core/sound/SoundManager.java | 4 +- .../craftengine/core/world/WorldManager.java | 4 +- 47 files changed, 446 insertions(+), 400 deletions(-) rename core/src/main/java/net/momirealms/craftengine/core/plugin/{Reloadable.java => Manageable.java} (51%) rename core/src/main/java/net/momirealms/craftengine/core/plugin/config/{ConfigManager.java => Config.java} (98%) diff --git a/bukkit/loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java b/bukkit/loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java index 27c93a874..3e73cf8ea 100644 --- a/bukkit/loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java +++ b/bukkit/loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java @@ -12,16 +12,16 @@ public class BukkitBootstrap extends JavaPlugin { @Override public void onLoad() { - this.plugin.load(); + this.plugin.onPluginLoad(); } @Override public void onEnable() { - this.plugin.enable(); + this.plugin.onPluginEnable(); } @Override public void onDisable() { - this.plugin.disable(); + this.plugin.onPluginDisable(); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CraftEngineReloadEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CraftEngineReloadEvent.java index e56d98aa1..58d5dea02 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CraftEngineReloadEvent.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CraftEngineReloadEvent.java @@ -10,7 +10,6 @@ public class CraftEngineReloadEvent extends Event { private final BukkitCraftEngine plugin; public CraftEngineReloadEvent(BukkitCraftEngine plugin) { - super(true); this.plugin = plugin; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index 353cd94a8..239bc3e61 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -14,7 +14,7 @@ import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemKeys; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.loot.parameter.LootParameters; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.BlockPos; @@ -60,7 +60,7 @@ public class BlockEventListener implements Listener { player.swingHand(event.getHand()); } // send sound if the placed block's sounds are removed - if (ConfigManager.enableSoundSystem()) { + if (Config.enableSoundSystem()) { Block block = event.getBlock(); Object blockState = BlockStateUtils.blockDataToBlockState(block.getBlockData()); Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); @@ -171,7 +171,7 @@ public class BlockEventListener implements Listener { }); } // sound system - if (ConfigManager.enableSoundSystem()) { + if (Config.enableSoundSystem()) { Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); if (this.manager.isBlockSoundRemoved(ownerBlock)) { try { @@ -243,7 +243,7 @@ public class BlockEventListener implements Listener { if (!BlockStateUtils.isVanillaBlock(stateId)) { ImmutableBlockState state = manager.getImmutableBlockStateUnsafe(stateId); player.playSound(playerLocation, state.sounds().stepSound().id().toString(), SoundCategory.BLOCKS, state.sounds().stepSound().volume(), state.sounds().stepSound().pitch()); - } else if (ConfigManager.enableSoundSystem()) { + } else if (Config.enableSoundSystem()) { Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); if (manager.isBlockSoundRemoved(ownerBlock)) { try { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java index 071cade69..95bfdcf33 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -23,7 +23,7 @@ import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.registry.BuiltInRegistries; @@ -251,8 +251,7 @@ public class BukkitBlockManager extends AbstractBlockManager { return Collections.unmodifiableCollection(this.cachedSuggestions); } - @Override - public void initSuggestions() { + private void initSuggestions() { this.cachedSuggestions.clear(); this.namespacesInUse.clear(); Set states = new HashSet<>(); @@ -269,7 +268,7 @@ public class BukkitBlockManager extends AbstractBlockManager { } public Set namespacesInUse() { - return Collections.unmodifiableSet(namespacesInUse); + return Collections.unmodifiableSet(this.namespacesInUse); } public ImmutableMap> blockAppearanceArranger() { @@ -501,7 +500,7 @@ public class BukkitBlockManager extends AbstractBlockManager { byId.put(id, block); // generate mod assets - if (ConfigManager.generateModAssets()) { + if (Config.generateModAssets()) { for (ImmutableBlockState state : block.variantProvider().states()) { Key realBlockId = BlockStateUtils.getBlockOwnerIdFromState(state.customBlockState()); modBlockStates.put(realBlockId, tempVanillaBlockStateModels.get(state.vanillaBlockState().registryId())); @@ -650,7 +649,7 @@ public class BukkitBlockManager extends AbstractBlockManager { private void loadMappingsAndAdditionalBlocks() { this.plugin.logger().info("Loading mappings.yml."); File mappingFile = new File(plugin.dataFolderFile(), "mappings.yml"); - YamlDocument mappings = ConfigManager.instance().loadOrCreateYamlData("mappings.yml"); + YamlDocument mappings = Config.instance().loadOrCreateYamlData("mappings.yml"); Map blockStateMappings = loadBlockStateMappings(mappings); this.validateBlockStateMappings(mappingFile, blockStateMappings); Map stateMap = new HashMap<>(); @@ -663,7 +662,7 @@ public class BukkitBlockManager extends AbstractBlockManager { this.blockAppearanceMapper = ImmutableMap.copyOf(appearanceMapper); this.blockAppearanceArranger = ImmutableMap.copyOf(appearanceArranger); this.plugin.logger().info("Freed " + this.blockAppearanceMapper.size() + " block state appearances."); - YamlDocument additionalYaml = ConfigManager.instance().loadOrCreateYamlData("additional-real-blocks.yml"); + YamlDocument additionalYaml = Config.instance().loadOrCreateYamlData("additional-real-blocks.yml"); this.registeredRealBlockSlots = this.buildRegisteredRealBlockSlots(blockTypeCounter, additionalYaml); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index 8d1d3f857..f34fe39e8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -12,7 +12,7 @@ import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.sound.SoundData; @@ -305,8 +305,8 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { return; } // Remove the entity if it's not a valid furniture - if (ConfigManager.removeInvalidFurniture()) { - if (ConfigManager.furnitureToRemove().isEmpty() || ConfigManager.furnitureToRemove().contains(id)) { + if (Config.removeInvalidFurniture()) { + if (Config.furnitureToRemove().isEmpty() || Config.furnitureToRemove().contains(id)) { entity.remove(); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java index 3f8056e54..0cb61bde3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java @@ -6,7 +6,7 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.font.AbstractFontManager; import net.momirealms.craftengine.core.font.FontManager; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.CharacterUtils; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -48,20 +48,20 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @SuppressWarnings("UnstableApiUsage") public void onChat(AsyncChatDecorateEvent event) { - if (!ConfigManager.filterChat()) return; + if (!Config.filterChat()) return; this.processChatEvent(event); } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @SuppressWarnings("UnstableApiUsage") public void onChatCommand(AsyncChatCommandDecorateEvent event) { - if (!ConfigManager.filterChat()) return; + if (!Config.filterChat()) return; this.processChatEvent(event); } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onCommand(PlayerCommandPreprocessEvent event) { - if (!ConfigManager.filterCommand()) return; + if (!Config.filterCommand()) return; if (!this.isDefaultFontInUse()) return; if (event.getPlayer().hasPermission(FontManager.BYPASS_COMMAND)) { return; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index f5097fb49..ee8bdb884 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -26,7 +26,7 @@ import net.momirealms.craftengine.core.pack.model.*; import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration; import net.momirealms.craftengine.core.pack.model.select.ChargeTypeSelectProperty; import net.momirealms.craftengine.core.pack.model.select.TrimMaterialSelectProperty; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.registry.BuiltInRegistries; @@ -352,12 +352,12 @@ public class BukkitItemManager extends AbstractItemManager { prepareModelGeneration(generation); } - if (ConfigManager.packMaxVersion() > 21.39f) { + if (Config.packMaxVersion() > 21.39f) { TreeMap map = modernOverrides.computeIfAbsent(materialId, k -> new TreeMap<>()); map.put(customModelData, model); } - if (ConfigManager.packMinVersion() < 21.39f) { + if (Config.packMinVersion() < 21.39f) { List legacyOverridesModels = new ArrayList<>(); processModelRecursively(model, new LinkedHashMap<>(), legacyOverridesModels, materialId, customModelData); TreeSet lom = legacyOverrides.computeIfAbsent(materialId, k -> new TreeSet<>()); @@ -372,11 +372,11 @@ public class BukkitItemManager extends AbstractItemManager { prepareModelGeneration(generation); } - if (ConfigManager.packMaxVersion() > 21.39f) { + if (Config.packMaxVersion() > 21.39f) { modernItemModels1_21_4.put(itemModelKey, model); } - if (ConfigManager.packMaxVersion() > 21.19f && ConfigManager.packMinVersion() < 21.39f) { + if (Config.packMaxVersion() > 21.19f && Config.packMinVersion() < 21.39f) { List legacyOverridesModels = new ArrayList<>(); processModelRecursively(model, new LinkedHashMap<>(), legacyOverridesModels, materialId, 0); if (!legacyOverridesModels.isEmpty()) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java index fc0fe0577..ca09ce9e0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java @@ -16,7 +16,7 @@ import net.momirealms.craftengine.core.item.recipe.Recipe; import net.momirealms.craftengine.core.item.recipe.*; import net.momirealms.craftengine.core.item.recipe.vanilla.*; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.HeptaFunction; @@ -284,7 +284,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager { @Override public void load() { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; if (VersionHelper.isVersionNewerThan1_21_2()) { try { this.stolenFeatureFlagSet = Reflections.field$RecipeManager$featureflagset.get(nmsRecipeManager); @@ -422,7 +422,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager { } @Override - public void runSyncTasks() { + public void runDelayedSyncTasks() { try { // run delayed tasks for (Runnable r : this.delayedTasksOnMainThread) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java index 8d51b8b04..2b2b9d383 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java @@ -9,7 +9,7 @@ import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; import net.momirealms.craftengine.core.item.recipe.Recipe; import net.momirealms.craftengine.core.item.recipe.RecipeTypes; import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; @@ -39,7 +39,7 @@ public class CrafterEventListener implements Listener { @EventHandler public void onCrafting(CrafterCraftEvent event) { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; CraftingRecipe recipe = event.getRecipe(); if (!(event.getBlock().getState() instanceof Crafter crafter)) { return; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index de3dc7564..fbbeb9100 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -17,7 +17,7 @@ import net.momirealms.craftengine.core.item.recipe.*; import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; import net.momirealms.craftengine.core.item.recipe.input.SmithingInput; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.AdventureHelper; @@ -261,7 +261,7 @@ public class RecipeEventListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) public void onFurnaceInventoryOpen(InventoryOpenEvent event) { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; if (!(event.getInventory() instanceof FurnaceInventory furnaceInventory)) { return; } @@ -277,7 +277,7 @@ public class RecipeEventListener implements Listener { // for 1.20.1-1.21.1 @EventHandler(ignoreCancelled = true) public void onBlockIgnite(BlockIgniteEvent event) { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; if (VersionHelper.isVersionNewerThan1_21_2()) return; Block block = event.getBlock(); Material material = block.getType(); @@ -295,7 +295,7 @@ public class RecipeEventListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) public void onPlaceBlock(BlockPlaceEvent event) { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; Block block = event.getBlock(); Material material = block.getType(); if (material == Material.FURNACE || material == Material.BLAST_FURNACE || material == Material.SMOKER) { @@ -322,7 +322,7 @@ public class RecipeEventListener implements Listener { // for 1.21.2+ @EventHandler(ignoreCancelled = true) public void onPutItemOnCampfire(PlayerInteractEvent event) { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; if (!VersionHelper.isVersionNewerThan1_21_2()) return; if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; Block clicked = event.getClickedBlock(); @@ -373,7 +373,7 @@ public class RecipeEventListener implements Listener { @SuppressWarnings("UnstableApiUsage") @EventHandler(ignoreCancelled = true) public void onCampfireCook(CampfireStartEvent event) { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; if (!VersionHelper.isVersionNewerThan1_21_2()) return; CampfireRecipe recipe = event.getRecipe(); Key recipeId = new Key(recipe.getKey().namespace(), recipe.getKey().value()); @@ -404,7 +404,7 @@ public class RecipeEventListener implements Listener { // for 1.21.2+ @EventHandler(ignoreCancelled = true) public void onCampfireCook(BlockCookEvent event) { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; if (!VersionHelper.isVersionNewerThan1_21_2()) return; Material type = event.getBlock().getType(); if (type != Material.CAMPFIRE && type != Material.SOUL_CAMPFIRE) return; @@ -743,7 +743,7 @@ public class RecipeEventListener implements Listener { @EventHandler(ignoreCancelled = true) public void onCraftingRecipe(PrepareItemCraftEvent event) { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; org.bukkit.inventory.Recipe recipe = event.getRecipe(); if (recipe == null) return; @@ -836,7 +836,7 @@ public class RecipeEventListener implements Listener { @EventHandler(ignoreCancelled = true) public void onSmithingTransform(PrepareSmithingEvent event) { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; SmithingInventory inventory = event.getInventory(); if (!(inventory.getRecipe() instanceof SmithingTransformRecipe recipe)) return; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java index 7901587e6..6a875cb5a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java @@ -11,7 +11,7 @@ import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.pack.AbstractPackManager; import net.momirealms.craftengine.core.pack.host.HostMode; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.network.ConnectionState; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import net.momirealms.craftengine.core.util.VersionHelper; @@ -52,7 +52,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { @EventHandler(priority = EventPriority.LOW) public void onPlayerJoin(PlayerJoinEvent event) { // for 1.20.1 servers, not recommended to use - if (ConfigManager.sendPackOnJoin() && !VersionHelper.isVersionNewerThan1_20_2()) { + if (Config.sendPackOnJoin() && !VersionHelper.isVersionNewerThan1_20_2()) { this.sendResourcePack(plugin.networkManager().getUser(event.getPlayer()), null); } } @@ -60,7 +60,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { @EventHandler(priority = EventPriority.LOW) public void onResourcePackStatus(PlayerResourcePackStatusEvent event) { // for 1.20.1 servers, not recommended to use - if (ConfigManager.sendPackOnJoin() && ConfigManager.kickOnDeclined() && !VersionHelper.isVersionNewerThan1_20_2()) { + if (Config.sendPackOnJoin() && Config.kickOnDeclined() && !VersionHelper.isVersionNewerThan1_20_2()) { if (event.getStatus() == PlayerResourcePackStatusEvent.Status.DECLINED || event.getStatus() == PlayerResourcePackStatusEvent.Status.FAILED_DOWNLOAD) { event.getPlayer().kick(); } @@ -73,34 +73,34 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { // update server properties if (VersionHelper.isVersionNewerThan1_20_2()) { - if (ConfigManager.hostMode() == HostMode.SELF_HOST) { + if (Config.hostMode() == HostMode.SELF_HOST) { if (Files.exists(resourcePackPath())) { - updateResourcePackSettings(super.packUUID, ResourcePackHost.instance().url(), super.packHash, ConfigManager.kickOnDeclined(), ConfigManager.resourcePackPrompt()); + updateResourcePackSettings(super.packUUID, ResourcePackHost.instance().url(), super.packHash, Config.kickOnDeclined(), Config.resourcePackPrompt()); } - } else if (ConfigManager.hostMode() == HostMode.EXTERNAL_HOST) { - updateResourcePackSettings(ConfigManager.externalPackUUID(), ConfigManager.externalPackUrl(), ConfigManager.externalPackSha1(), ConfigManager.kickOnDeclined(), ConfigManager.resourcePackPrompt()); + } else if (Config.hostMode() == HostMode.EXTERNAL_HOST) { + updateResourcePackSettings(Config.externalPackUUID(), Config.externalPackUrl(), Config.externalPackSha1(), Config.kickOnDeclined(), Config.resourcePackPrompt()); } } - if (ConfigManager.sendPackOnReload()) { + if (Config.sendPackOnReload()) { if (this.previousHostMode == HostMode.SELF_HOST) { this.previousHostUUID = super.packUUID; } // unload packs if user changed to none host - if (ConfigManager.hostMode() == HostMode.NONE && this.previousHostMode != HostMode.NONE) { + if (Config.hostMode() == HostMode.NONE && this.previousHostMode != HostMode.NONE) { unloadResourcePackForOnlinePlayers(this.previousHostUUID); } // load new external resource pack on reload - if (ConfigManager.hostMode() == HostMode.EXTERNAL_HOST) { + if (Config.hostMode() == HostMode.EXTERNAL_HOST) { if (this.previousHostMode == HostMode.NONE) { updateResourcePackForOnlinePlayers(null); } else { updateResourcePackForOnlinePlayers(this.previousHostUUID); } // record previous host uuid here - this.previousHostUUID = ConfigManager.externalPackUUID(); + this.previousHostUUID = Config.externalPackUUID(); } - if (ConfigManager.hostMode() == HostMode.SELF_HOST && this.previousHostMode != HostMode.SELF_HOST) { + if (Config.hostMode() == HostMode.SELF_HOST && this.previousHostMode != HostMode.SELF_HOST) { if (ReloadCommand.RELOAD_PACK_FLAG) { ReloadCommand.RELOAD_PACK_FLAG = false; if (this.previousHostMode == HostMode.NONE) { @@ -111,7 +111,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { } } } - this.previousHostMode = ConfigManager.hostMode(); + this.previousHostMode = Config.hostMode(); } @Override @@ -134,12 +134,12 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { super.generateResourcePack(); // update server properties if (VersionHelper.isVersionNewerThan1_20_2()) { - if (ConfigManager.hostMode() == HostMode.SELF_HOST) { - updateResourcePackSettings(super.packUUID, ResourcePackHost.instance().url(), super.packHash, ConfigManager.kickOnDeclined(), ConfigManager.resourcePackPrompt()); + if (Config.hostMode() == HostMode.SELF_HOST) { + updateResourcePackSettings(super.packUUID, ResourcePackHost.instance().url(), super.packHash, Config.kickOnDeclined(), Config.resourcePackPrompt()); } } // resend packs - if (ConfigManager.hostMode() == HostMode.SELF_HOST && ConfigManager.sendPackOnReload()) { + if (Config.hostMode() == HostMode.SELF_HOST && Config.sendPackOnReload()) { updateResourcePackForOnlinePlayers(this.previousHostUUID); } } @@ -162,7 +162,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { } private void updateResourcePackSettings(UUID uuid, String url, String sha1, boolean required, Component prompt) { - if (!ConfigManager.sendPackOnJoin()) { + if (!Config.sendPackOnJoin()) { resetResourcePackSettings(); return; } @@ -182,36 +182,36 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { } public void sendResourcePack(NetWorkUser user, @Nullable UUID previousPack) { - if (ConfigManager.hostMode() == HostMode.NONE) return; + if (Config.hostMode() == HostMode.NONE) return; String url; String sha1; UUID uuid; - if (ConfigManager.hostMode() == HostMode.SELF_HOST) { + if (Config.hostMode() == HostMode.SELF_HOST) { url = ResourcePackHost.instance().url(); sha1 = super.packHash; uuid = super.packUUID; if (!Files.exists(resourcePackPath())) return; } else { - url = ConfigManager.externalPackUrl(); - sha1 = ConfigManager.externalPackSha1(); - uuid = ConfigManager.externalPackUUID(); + url = Config.externalPackUrl(); + sha1 = Config.externalPackSha1(); + uuid = Config.externalPackUUID(); if (uuid.equals(previousPack)) return; } - Object packPrompt = ComponentUtils.adventureToMinecraft(ConfigManager.resourcePackPrompt()); + Object packPrompt = ComponentUtils.adventureToMinecraft(Config.resourcePackPrompt()); try { Object packPacket; if (VersionHelper.isVersionNewerThan1_20_5()) { packPacket = Reflections.constructor$ClientboundResourcePackPushPacket.newInstance( - uuid, url, sha1, ConfigManager.kickOnDeclined(), Optional.of(packPrompt) + uuid, url, sha1, Config.kickOnDeclined(), Optional.of(packPrompt) ); } else if (VersionHelper.isVersionNewerThan1_20_3()) { packPacket = Reflections.constructor$ClientboundResourcePackPushPacket.newInstance( - uuid, url, sha1, ConfigManager.kickOnDeclined(), packPrompt + uuid, url, sha1, Config.kickOnDeclined(), packPrompt ); } else { packPacket = Reflections.constructor$ClientboundResourcePackPushPacket.newInstance( - url + uuid, sha1, ConfigManager.kickOnDeclined(), packPrompt + url + uuid, sha1, Config.kickOnDeclined(), packPrompt ); } if (user.decoderState() == ConnectionState.PLAY) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index e42e271d5..891850e23 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -29,7 +29,7 @@ import net.momirealms.craftengine.core.item.ItemManager; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.classpath.ReflectionClassPathAppender; import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.dependency.Dependencies; import net.momirealms.craftengine.core.plugin.dependency.Dependency; import net.momirealms.craftengine.core.plugin.gui.category.ItemBrowserManagerImpl; @@ -65,17 +65,20 @@ public class BukkitCraftEngine extends CraftEngine { private boolean hasPlaceholderAPI; public BukkitCraftEngine(JavaPlugin bootstrap) { - VersionHelper.init(serverVersion()); + super((p) -> { + CraftEngineReloadEvent event = new CraftEngineReloadEvent((BukkitCraftEngine) p); + EventUtils.fireAndForget(event); + }); instance = this; this.bootstrap = bootstrap; super.classPathAppender = new ReflectionClassPathAppender(this); super.scheduler = new BukkitSchedulerAdapter(this); super.logger = new JavaPluginLogger(bootstrap.getLogger()); + // find mod class if present Class modClass = ReflectionUtils.getClazz(MOD_CLASS); if (modClass != null) { Field isSuccessfullyRegistered = ReflectionUtils.getDeclaredField(modClass, "isSuccessfullyRegistered"); try { - assert isSuccessfullyRegistered != null; requiresRestart = !(boolean) isSuccessfullyRegistered.get(null); hasMod = true; } catch (Exception ignore) { @@ -84,13 +87,11 @@ public class BukkitCraftEngine extends CraftEngine { } @Override - public void load() { - super.load(); + public void onPluginLoad() { + super.onPluginLoad(); Reflections.init(); BukkitInjector.init(); super.networkManager = new BukkitNetworkManager(this); - super.networkManager.init(); - // load mappings and inject blocks super.blockManager = new BukkitBlockManager(this); super.furnitureManager = new BukkitFurnitureManager(this); this.successfullyLoaded = true; @@ -105,8 +106,8 @@ public class BukkitCraftEngine extends CraftEngine { } @Override - public void enable() { - if (successfullyEnabled) { + public void onPluginEnable() { + if (this.successfullyEnabled) { logger().severe(" "); logger().severe(" "); logger().severe(" "); @@ -154,8 +155,37 @@ public class BukkitCraftEngine extends CraftEngine { super.worldManager = new BukkitWorldManager(this); super.soundManager = new BukkitSoundManager(this); super.vanillaLootManager = new BukkitVanillaLootManager(this); - this.fontManager = new BukkitFontManager(this); - super.enable(); + super.fontManager = new BukkitFontManager(this); + super.onPluginEnable(); + // compatibility + // register expansion + if (this.isPluginEnabled("PlaceholderAPI")) { + PlaceholderAPIUtils.registerExpansions(this); + this.hasPlaceholderAPI = true; + } + } + + @Override + public void onPluginDisable() { + super.onPluginDisable(); + if (this.tickTask != null) this.tickTask.cancel(); + if (!Bukkit.getServer().isStopping()) { + logger().severe(" "); + logger().severe(" "); + logger().severe(" "); + logger().severe("Please do not disable plugins at runtime."); + logger().severe(" "); + logger().severe(" "); + logger().severe(" "); + Bukkit.getServer().shutdown(); + } + } + + @Override + public void platformDelayedEnable() { + if (Config.metrics()) { + new Metrics(this.bootstrap(), 24333); + } // tick task if (VersionHelper.isFolia()) { this.tickTask = this.scheduler().sync().runRepeating(() -> { @@ -172,45 +202,6 @@ public class BukkitCraftEngine extends CraftEngine { } }, 1, 1); } - - // compatibility - // register expansion - if (this.isPluginEnabled("PlaceholderAPI")) { - PlaceholderAPIUtils.registerExpansions(this); - this.hasPlaceholderAPI = true; - } - } - - @Override - public void disable() { - super.disable(); - if (this.tickTask != null) this.tickTask.cancel(); - if (!Bukkit.getServer().isStopping()) { - logger().severe(" "); - logger().severe(" "); - logger().severe(" "); - logger().severe("Please do not disable plugins at runtime."); - logger().severe(" "); - logger().severe(" "); - logger().severe(" "); - Bukkit.getServer().shutdown(); - } - } - - @Override - public void reload() { - super.reload(); - scheduler.async().execute(() -> { - CraftEngineReloadEvent event = new CraftEngineReloadEvent(this); - EventUtils.fireAndForget(event); - }); - } - - @Override - public void delayedEnable() { - if (ConfigManager.metrics()) { - new Metrics(this.bootstrap(), 24333); - } } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index 74794df67..def463fba 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -32,7 +32,7 @@ import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; import net.momirealms.craftengine.core.item.recipe.RecipeTypes; import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; @@ -623,14 +623,14 @@ public class BukkitInjector { CESection section = holder.ceSection(); if (BlockStateUtils.isVanillaBlock(stateId)) { section.setBlockState(x, y, z, EmptyBlock.INSTANCE.defaultState()); - if (ConfigManager.enableLightSystem() && ConfigManager.forceUpdateLight()) { + if (Config.enableLightSystem() && Config.forceUpdateLight()) { updateLightIfChanged(holder, previousState, newState, null, y, z, x); } } else { ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); section.setBlockState(x, y, z, immutableBlockState); if (!immutableBlockState.isEmpty()) { - if (ConfigManager.enableLightSystem()) { + if (Config.enableLightSystem()) { updateLightIfChanged(holder, previousState, newState, immutableBlockState.vanillaBlockState().handle(), y, z, x); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index e095aba81..5f556e1ab 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -37,20 +37,21 @@ import java.util.function.BiConsumer; public class BukkitNetworkManager implements NetworkManager, Listener, PluginMessageListener { private static BukkitNetworkManager instance; - private static final Map, TriConsumer> nmsPacketFunctions = new HashMap<>(); - private static final Map> byteBufPacketFunctions = new HashMap<>(); + private static final Map, TriConsumer> NMS_PACKET_HANDLERS = new HashMap<>(); + private static final Map> BYTE_BUFFER_PACKET_HANDLERS = new HashMap<>(); private static void registerNMSPacketConsumer(final TriConsumer function, @Nullable Class packet) { if (packet == null) return; - nmsPacketFunctions.put(packet, function); + NMS_PACKET_HANDLERS.put(packet, function); } private static void registerByteBufPacketConsumer(final BiConsumer function, int id) { - byteBufPacketFunctions.put(id, function); + BYTE_BUFFER_PACKET_HANDLERS.put(id, function); } private final BiConsumer> packetsConsumer; - private final BiConsumer delayedPacketConsumer; + private final BiConsumer> immediatePacketsConsumer; + private final BiConsumer packetConsumer; private final BiConsumer immediatePacketConsumer; private final BukkitCraftEngine plugin; @@ -67,35 +68,22 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes private static final String PACKET_ENCODER = "craftengine_encoder"; private static final String PACKET_DECODER = "craftengine_decoder"; - private boolean active; - private boolean init; private static boolean hasModelEngine; - public static boolean hasModelEngine() { - return hasModelEngine; - } - public BukkitNetworkManager(BukkitCraftEngine plugin) { + instance = this; + hasModelEngine = Bukkit.getPluginManager().getPlugin("ModelEngine") != null; this.plugin = plugin; - if (VersionHelper.isVersionNewerThan1_21_5()) { - this.packetIds = new PacketIds1_21_5(); - } else if (VersionHelper.isVersionNewerThan1_21_2()) { - this.packetIds = new PacketIds1_21_2(); - } else if (VersionHelper.isVersionNewerThan1_20_5()) { - this.packetIds = new PacketIds1_20_5(); - } else if (VersionHelper.isVersionNewerThan1_20_3()) { - this.packetIds = new PacketIds1_20_3(); - } else if (VersionHelper.isVersionNewerThan1_20_2()) { - this.packetIds = new PacketIds1_20_2(); - } else { - this.packetIds = new PacketIds1_20(); - } - this.registerConsumers(); + // set up packet id + this.packetIds = setupPacketIds(); + // register packet handlers + this.registerPacketHandlers(); + // set up packet senders + this.packetConsumer = FastNMS.INSTANCE::sendPacket; this.packetsConsumer = ((serverPlayer, packets) -> { Object bundle = FastNMS.INSTANCE.constructor$ClientboundBundlePacket(packets); - FastNMS.INSTANCE.sendPacket(serverPlayer, bundle); + packetConsumer.accept(serverPlayer, bundle); }); - this.delayedPacketConsumer = FastNMS.INSTANCE::sendPacket; this.immediatePacketConsumer = (serverPlayer, packet) -> { try { Reflections.method$Connection$sendPacketImmediate.invoke(FastNMS.INSTANCE.field$Player$connection$connection(serverPlayer), packet, null, true); @@ -103,12 +91,47 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes plugin.logger().warn("Failed to invoke send packet", e); } }; - this.active = true; - hasModelEngine = Bukkit.getPluginManager().getPlugin("ModelEngine") != null; - instance = this; + this.immediatePacketsConsumer = (serverPlayer, packets) -> { + Object bundle = FastNMS.INSTANCE.constructor$ClientboundBundlePacket(packets); + this.immediatePacketConsumer.accept(serverPlayer, bundle); + }; + // set up mod channel + this.plugin.bootstrap().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.bootstrap(), MOD_CHANNEL, this); + this.plugin.bootstrap().getServer().getMessenger().registerOutgoingPluginChannel(this.plugin.bootstrap(), MOD_CHANNEL); + // Inject server channel + try { + Object server = Reflections.method$MinecraftServer$getServer.invoke(null); + Object serverConnection = Reflections.field$MinecraftServer$connection.get(server); + @SuppressWarnings("unchecked") + List channels = (List) Reflections.field$ServerConnectionListener$channels.get(serverConnection); + ListMonitor monitor = new ListMonitor<>(channels, (future) -> { + Channel channel = future.channel(); + injectServerChannel(channel); + this.injectedChannels.add(channel); + }, (object) -> {}); + Reflections.field$ServerConnectionListener$channels.set(serverConnection, monitor); + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to init server connection", e); + } } - private void registerConsumers() { + private PacketIds setupPacketIds() { + if (VersionHelper.isVersionNewerThan1_21_5()) { + return new PacketIds1_21_5(); + } else if (VersionHelper.isVersionNewerThan1_21_2()) { + return new PacketIds1_21_2(); + } else if (VersionHelper.isVersionNewerThan1_20_5()) { + return new PacketIds1_20_5(); + } else if (VersionHelper.isVersionNewerThan1_20_3()) { + return new PacketIds1_20_3(); + } else if (VersionHelper.isVersionNewerThan1_20_2()) { + return new PacketIds1_20_2(); + } else { + return new PacketIds1_20(); + } + } + + private void registerPacketHandlers() { registerNMSPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, Reflections.clazz$ClientboundLevelChunkWithLightPacket); registerNMSPacketConsumer(PacketConsumers.PLAYER_ACTION, Reflections.clazz$ServerboundPlayerActionPacket); registerNMSPacketConsumer(PacketConsumers.SWING_HAND, Reflections.clazz$ServerboundSwingPacket); @@ -150,7 +173,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } } - @EventHandler + @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); Channel channel = getChannel(player); @@ -170,40 +193,17 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes return this.onlineUserArray; } - @Override // 保留仅注册入频道用 + @Override public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, byte @NotNull [] message) {} @Override public void init() { - if (init) return; - try { - this.plugin.bootstrap().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.bootstrap(), MOD_CHANNEL, this); - this.plugin.bootstrap().getServer().getMessenger().registerOutgoingPluginChannel(this.plugin.bootstrap(), MOD_CHANNEL); - Object server = Reflections.method$MinecraftServer$getServer.invoke(null); - Object serverConnection = Reflections.field$MinecraftServer$connection.get(server); - @SuppressWarnings("unchecked") - List channels = (List) Reflections.field$ServerConnectionListener$channels.get(serverConnection); - ListMonitor monitor = new ListMonitor<>(channels, (future) -> { - if (!this.active) return; - Channel channel = future.channel(); - injectServerChannel(channel); - this.injectedChannels.add(channel); - }, (object) -> {}); - Reflections.field$ServerConnectionListener$channels.set(serverConnection, monitor); - this.init = true; - } catch (ReflectiveOperationException e) { - this.plugin.logger().warn("Failed to init server connection", e); - } - } - - @Override - public void enable() { Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); } @Override - public void shutdown() { + public void disable() { HandlerList.unregisterAll(this); for (Channel channel : injectedChannels) { uninjectServerChannel(channel); @@ -212,7 +212,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes handleDisconnection(getChannel(player)); } injectedChannels.clear(); - active = false; } @Override @@ -259,16 +258,26 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } } + @Override public void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately) { if (immediately) { this.immediatePacketConsumer.accept(player.serverPlayer(), packet); } else { - this.delayedPacketConsumer.accept(player.serverPlayer(), packet); + this.packetConsumer.accept(player.serverPlayer(), packet); } } - public void sendPackets(@NotNull NetWorkUser player, List packet) { - this.packetsConsumer.accept(player.serverPlayer(), packet); + @Override + public void sendPackets(@NotNull NetWorkUser player, List packet, boolean immediately) { + if (immediately) { + this.immediatePacketsConsumer.accept(player.serverPlayer(), packet); + } else { + this.packetsConsumer.accept(player.serverPlayer(), packet); + } + } + + public static boolean hasModelEngine() { + return hasModelEngine; } public void receivePacket(@NotNull NetWorkUser player, Object packet) { @@ -543,13 +552,13 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } protected void handleNMSPacket(NetWorkUser user, NMSPacketEvent event, Object packet) { - Optional.ofNullable(nmsPacketFunctions.get(packet.getClass())) + Optional.ofNullable(NMS_PACKET_HANDLERS.get(packet.getClass())) .ifPresent(function -> function.accept(user, event, packet)); } protected void handleByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) { int packetID = event.packetID(); - Optional.ofNullable(byteBufPacketFunctions.get(packetID)) + Optional.ofNullable(BYTE_BUFFER_PACKET_HANDLERS.get(packetID)) .ifPresent(function -> function.accept(user, event)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index b4d9ff905..8893933f0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -20,7 +20,7 @@ import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.font.FontManager; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.network.ConnectionState; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import net.momirealms.craftengine.core.plugin.network.NetworkManager; @@ -300,7 +300,7 @@ public class PacketConsumers { int stateId = BlockStateUtils.blockStateToId(blockState); // not a custom block if (BlockStateUtils.isVanillaBlock(stateId)) { - if (ConfigManager.enableSoundSystem()) { + if (Config.enableSoundSystem()) { Object blockOwner = Reflections.field$StateHolder$owner.get(blockState); if (BukkitBlockManager.instance().isBlockSoundRemoved(blockOwner)) { player.startMiningBlock(world, pos, blockState, false, null); @@ -626,7 +626,7 @@ public class PacketConsumers { if (furniture != null) { user.furnitureView().computeIfAbsent(furniture.baseEntityId(), k -> new ArrayList<>()).addAll(furniture.fakeEntityIds()); user.sendPacket(furniture.spawnPacket((Player) user.platformPlayer()), false); - if (ConfigManager.hideBaseEntity() && !furniture.hasExternalModel()) { + if (Config.hideBaseEntity() && !furniture.hasExternalModel()) { event.setCancelled(true); } } @@ -774,7 +774,7 @@ public class PacketConsumers { // we handle it on packet level to prevent it from being captured by plugins public static final TriConsumer RENAME_ITEM = (user, event, packet) -> { try { - if (!ConfigManager.filterAnvil()) return; + if (!Config.filterAnvil()) return; String message = (String) Reflections.field$ServerboundRenameItemPacket$name.get(packet); if (message != null && !message.isEmpty()) { FontManager manager = CraftEngine.instance().imageManager(); @@ -799,7 +799,7 @@ public class PacketConsumers { // we handle it on packet level to prevent it from being captured by plugins public static final TriConsumer SIGN_UPDATE = (user, event, packet) -> { try { - if (!ConfigManager.filterSign()) return; + if (!Config.filterSign()) return; String[] lines = (String[]) Reflections.field$ServerboundSignUpdatePacket$lines.get(packet); FontManager manager = CraftEngine.instance().imageManager(); if (!manager.isDefaultFontInUse()) return; @@ -826,7 +826,7 @@ public class PacketConsumers { @SuppressWarnings("unchecked") public static final TriConsumer EDIT_BOOK = (user, event, packet) -> { try { - if (!ConfigManager.filterBook()) return; + if (!Config.filterBook()) return; FontManager manager = CraftEngine.instance().imageManager(); if (!manager.isDefaultFontInUse()) return; // check bypass diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java index eeed1b749..ac0bf989c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java @@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; import net.momirealms.craftengine.core.item.recipe.RecipeTypes; import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Direction; @@ -77,14 +77,14 @@ public class InteractUtils { return false; }); register(BlockKeys.SOUL_CAMPFIRE, (player, item, blockState, result) -> { - if (!ConfigManager.enableRecipeSystem()) return false; + if (!Config.enableRecipeSystem()) return false; Optional> optional = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(item.id()); return optional.filter(keyReference -> BukkitRecipeManager.instance().recipeByInput(RecipeTypes.CAMPFIRE_COOKING, new SingleItemInput<>(new OptimizedIDItem<>( keyReference, item.getItem() ))) != null).isPresent(); }); register(BlockKeys.CAMPFIRE, (player, item, blockState, result) -> { - if (!ConfigManager.enableRecipeSystem()) return false; + if (!Config.enableRecipeSystem()) return false; Optional> optional = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(item.id()); return optional.filter(keyReference -> BukkitRecipeManager.instance().recipeByInput(RecipeTypes.CAMPFIRE_COOKING, new SingleItemInput<>(new OptimizedIDItem<>( keyReference, item.getItem() diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java index 5127e9916..78ed33dc9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java @@ -1,14 +1,14 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.bukkit.nms.FastNMS; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; public class NoteBlockChainUpdateUtils { private NoteBlockChainUpdateUtils() {} public static void noteBlockChainUpdate(Object level, Object chunkSource, Object direction, Object blockPos, int times) throws ReflectiveOperationException { - if (times >= ConfigManager.maxChainUpdate()) return; + if (times >= Config.maxChainUpdate()) return; Object relativePos = Reflections.method$BlockPos$relative.invoke(blockPos, direction); Object state = FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, relativePos); if (BlockStateUtils.isClientSideNoteBlock(state)) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java index 73ca854da..b9070e694 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.bukkit.world; import net.momirealms.craftengine.bukkit.util.LightUtils; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.SectionPosUtils; import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.World; @@ -20,7 +20,7 @@ public class BukkitCEWorld extends CEWorld { @Override public void tick() { - if (ConfigManager.enableLightSystem()) { + if (Config.enableLightSystem()) { LightUtils.updateChunkLight((org.bukkit.World) world.platformWorld(), SectionPosUtils.toMap(super.updatedSectionPositions, world.worldHeight().getMinSection() - 1, world.worldHeight().getMaxSection() + 1)); super.updatedSectionPositions.clear(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java index 2125528ce..98bb2aec9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java @@ -7,7 +7,7 @@ import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.block.ImmutableBlockState; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.CEWorld; @@ -265,7 +265,7 @@ public class BukkitWorldManager implements WorldManager, Listener { plugin.logger().warn("Failed to write chunk tag at " + chunk.getX() + " " + chunk.getZ(), e); return; } finally { - if (ConfigManager.restoreVanillaBlocks()) { + if (Config.restoreVanillaBlocks()) { CESection[] ceSections = ceChunk.sections(); Object worldServer = FastNMS.INSTANCE.field$CraftChunk$worldServer(chunk); Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); @@ -313,7 +313,7 @@ public class BukkitWorldManager implements WorldManager, Listener { for (int i = 0; i < ceSections.length; i++) { CESection ceSection = ceSections[i]; Object section = sections[i]; - if (ConfigManager.syncCustomBlocks()) { + if (Config.syncCustomBlocks()) { Object statesContainer = FastNMS.INSTANCE.field$LevelChunkSection$states(section); Object data = Reflections.varHandle$PalettedContainer$data.get(statesContainer); Object palette = Reflections.field$PalettedContainer$Data$palette.get(data); @@ -362,7 +362,7 @@ public class BukkitWorldManager implements WorldManager, Listener { } } } - if (ConfigManager.restoreCustomBlocks()) { + if (Config.restoreCustomBlocks()) { if (!ceSection.statesContainer().isEmpty()) { for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { @@ -378,7 +378,7 @@ public class BukkitWorldManager implements WorldManager, Listener { } BukkitInjector.injectLevelChunkSection(section, ceSection, ceWorld, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); } - if (ConfigManager.enableRecipeSystem()) { + if (Config.enableRecipeSystem()) { @SuppressWarnings("unchecked") Map blockEntities = (Map) FastNMS.INSTANCE.field$ChunkAccess$blockEntities(levelChunk); for (Object blockEntity : blockEntities.values()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockManager.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockManager.java index 7b5d27868..d21392cea 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockManager.java @@ -1,10 +1,9 @@ package net.momirealms.craftengine.core.block; import com.google.gson.JsonElement; -import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration; import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.util.Key; import org.incendo.cloud.suggestion.Suggestion; @@ -13,7 +12,7 @@ import java.util.Collection; import java.util.Map; import java.util.Optional; -public interface BlockManager extends Reloadable, ModelGenerator { +public interface BlockManager extends Manageable, ModelGenerator { ConfigSectionParser parser(); @@ -30,6 +29,4 @@ public interface BlockManager extends Reloadable, ModelGenerator { Collection cachedSuggestions(); Map soundMapper(); - - void initSuggestions(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java index 0985250f6..d2692164d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.entity.furniture; import net.momirealms.craftengine.core.entity.Entity; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.Vec3d; @@ -12,7 +12,7 @@ import javax.annotation.Nullable; import java.util.Collection; import java.util.Optional; -public interface FurnitureManager extends Reloadable { +public interface FurnitureManager extends Manageable { String FURNITURE_ADMIN_NODE = "craftengine.furniture.admin"; ConfigSectionParser parser(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index 988dc9228..7d4239f5c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -34,7 +34,7 @@ public abstract class AbstractFontManager implements FontManager { @Override public void load() { - this.offsetFont = Optional.ofNullable(plugin.configManager().settings().getSection("offset-characters")) + this.offsetFont = Optional.ofNullable(plugin.config().settings().getSection("offset-characters")) .map(OffsetFont::new) .orElse(null); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java index 345f63f29..004f8595d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.font; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.util.CharacterUtils; import net.momirealms.craftengine.core.util.FormatUtils; @@ -9,7 +9,7 @@ import net.momirealms.craftengine.core.util.Key; import java.util.Collection; import java.util.Optional; -public interface FontManager extends Reloadable { +public interface FontManager extends Manageable { Key DEFAULT_FONT = Key.of("minecraft:default"); String BYPASS_BOOK = "craftengine.filter.bypass.book"; String BYPASS_SIGN = "craftengine.filter.bypass.sign"; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java index 5362e6d3a..7b6ed87a1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -6,7 +6,7 @@ import net.momirealms.craftengine.core.pack.LegacyOverridesModel; import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; import net.momirealms.craftengine.core.pack.model.ItemModel; import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; @@ -15,7 +15,7 @@ import org.incendo.cloud.suggestion.Suggestion; import javax.annotation.Nullable; import java.util.*; -public interface ItemManager extends Reloadable, ModelGenerator { +public interface ItemManager extends Manageable, ModelGenerator { ConfigSectionParser parser(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java index e73503bbb..b0c1a95cd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java @@ -2,14 +2,14 @@ package net.momirealms.craftengine.core.item.modifier; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.AdventureHelper; public class DisplayNameModifier implements ItemModifier { private final String argument; public DisplayNameModifier(String argument) { - this.argument = ConfigManager.nonItalic() ? "" + argument : argument; + this.argument = Config.nonItalic() ? "" + argument : argument; } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java index 9a860fe3c..624941d51 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java @@ -2,14 +2,14 @@ package net.momirealms.craftengine.core.item.modifier; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.AdventureHelper; public class ItemNameModifier implements ItemModifier { private final String argument; public ItemNameModifier(String argument) { - this.argument = ConfigManager.nonItalic() ? "" + argument : argument; + this.argument = Config.nonItalic() ? "" + argument : argument; } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java index 066b2ae10..7d8e5d1ae 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java @@ -2,7 +2,7 @@ package net.momirealms.craftengine.core.item.modifier; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.AdventureHelper; import java.util.List; @@ -11,7 +11,7 @@ public class LoreModifier implements ItemModifier { private final List argument; public LoreModifier(List argument) { - this.argument = ConfigManager.nonItalic() ? argument.stream().map(it -> "" + it).toList() : argument; + this.argument = Config.nonItalic() ? argument.stream().map(it -> "" + it).toList() : argument; } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeManager.java index 627900416..069a4c03f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeManager.java @@ -8,7 +8,7 @@ import net.momirealms.craftengine.core.item.recipe.vanilla.reader.VanillaRecipeR import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.registry.Holder; @@ -155,7 +155,7 @@ public abstract class AbstractRecipeManager implements RecipeManager { @Override public void parseSection(Pack pack, Path path, Key id, Map section) { - if (!ConfigManager.enableRecipeSystem()) return; + if (!Config.enableRecipeSystem()) return; if (AbstractRecipeManager.this.byId.containsKey(id)) { TranslationManager.instance().log("warning.config.recipe.duplicated", path.toString(), id.toString()); return; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeManager.java index 3573ec789..eb59f67ed 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeManager.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.item.recipe; import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.Nullable; @@ -9,7 +9,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Optional; -public interface RecipeManager extends Reloadable { +public interface RecipeManager extends Manageable { ConfigSectionParser parser(); @@ -30,6 +30,4 @@ public interface RecipeManager extends Reloadable { @Nullable Recipe recipeByInput(Key type, RecipeInput input, @Nullable Key lastRecipe); - - void runSyncTasks(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/VanillaLootManager.java b/core/src/main/java/net/momirealms/craftengine/core/loot/VanillaLootManager.java index 5e301e286..c4fabdf8d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/VanillaLootManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/VanillaLootManager.java @@ -1,12 +1,12 @@ package net.momirealms.craftengine.core.loot; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.util.Key; import java.util.Optional; -public interface VanillaLootManager extends Reloadable { +public interface VanillaLootManager extends Manageable { ConfigSectionParser parser(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 5b4a60db3..a342a60d0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -15,10 +15,9 @@ import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration; import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator; import net.momirealms.craftengine.core.pack.obfuscation.ObfA; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.config.StringKeyConstructor; -import net.momirealms.craftengine.core.plugin.config.template.TemplateManager; import net.momirealms.craftengine.core.plugin.locale.I18NData; import net.momirealms.craftengine.core.sound.AbstractSoundManager; import net.momirealms.craftengine.core.sound.SoundEvent; @@ -140,10 +139,10 @@ public abstract class AbstractPackManager implements PackManager { this.loadPacks(); this.loadConfigs(); this.calculateHash(); - if (ConfigManager.hostMode() == HostMode.SELF_HOST) { - Path path = ConfigManager.hostResourcePackPath().startsWith(".") ? plugin.dataFolderPath().resolve(ConfigManager.hostResourcePackPath()) : Path.of(ConfigManager.hostResourcePackPath()); - ResourcePackHost.instance().enable(ConfigManager.hostIP(), ConfigManager.hostPort(), path); - ResourcePackHost.instance().setRateLimit(ConfigManager.requestRate(), ConfigManager.requestInterval(), TimeUnit.SECONDS); + if (Config.hostMode() == HostMode.SELF_HOST) { + Path path = Config.hostResourcePackPath().startsWith(".") ? plugin.dataFolderPath().resolve(Config.hostResourcePackPath()) : Path.of(Config.hostResourcePackPath()); + ResourcePackHost.instance().enable(Config.hostIP(), Config.hostPort(), path); + ResourcePackHost.instance().setRateLimit(Config.requestRate(), Config.requestInterval(), TimeUnit.SECONDS); } else { ResourcePackHost.instance().disable(); } @@ -206,7 +205,7 @@ public abstract class AbstractPackManager implements PackManager { } public Path selfHostPackPath() { - return ConfigManager.hostResourcePackPath().startsWith(".") ? plugin.dataFolderPath().resolve(ConfigManager.hostResourcePackPath()) : Path.of(ConfigManager.hostResourcePackPath()); + return Config.hostResourcePackPath().startsWith(".") ? plugin.dataFolderPath().resolve(Config.hostResourcePackPath()) : Path.of(Config.hostResourcePackPath()); } private void loadPacks() { @@ -229,7 +228,7 @@ public abstract class AbstractPackManager implements PackManager { String version = null; String author = null; if (Files.exists(metaFile) && Files.isRegularFile(metaFile)) { - YamlDocument metaYML = ConfigManager.instance().loadYamlData(metaFile.toFile()); + YamlDocument metaYML = Config.instance().loadYamlData(metaFile.toFile()); namespace = metaYML.getString("namespace", namespace); description = metaYML.getString("description"); version = metaYML.getString("version"); @@ -466,7 +465,7 @@ public abstract class AbstractPackManager implements PackManager { try { List folders = new ArrayList<>(); folders.addAll(loadedPacks().stream().map(Pack::resourcePackFolder).toList()); - folders.addAll(ConfigManager.foldersToMerge().stream().map(it -> plugin.dataFolderPath().getParent().resolve(it)).filter(Files::exists).toList()); + folders.addAll(Config.foldersToMerge().stream().map(it -> plugin.dataFolderPath().getParent().resolve(it)).filter(Files::exists).toList()); List>> duplicated = mergeFolder(folders, generatedPackPath); if (!duplicated.isEmpty()) { @@ -528,7 +527,7 @@ public abstract class AbstractPackManager implements PackManager { private void generateEquipments(Path generatedPackPath) { for (EquipmentGeneration generator : this.plugin.itemManager().equipmentsToGenerate()) { EquipmentData equipmentData = generator.modernData(); - if (equipmentData != null && ConfigManager.packMaxVersion() >= 21.4f) { + if (equipmentData != null && Config.packMaxVersion() >= 21.4f) { Path equipmentPath = generatedPackPath .resolve("assets") .resolve(equipmentData.assetId().namespace()) @@ -561,7 +560,7 @@ public abstract class AbstractPackManager implements PackManager { this.plugin.logger().severe("Error writing equipment file", e); } } - if (equipmentData != null && ConfigManager.packMaxVersion() >= 21.2f && ConfigManager.packMinVersion() < 21.4f) { + if (equipmentData != null && Config.packMaxVersion() >= 21.2f && Config.packMinVersion() < 21.4f) { Path equipmentPath = generatedPackPath .resolve("assets") .resolve(equipmentData.assetId().namespace()) @@ -663,7 +662,7 @@ public abstract class AbstractPackManager implements PackManager { } private void generateOverrideSounds(Path generatedPackPath) { - if (!ConfigManager.enableSoundSystem()) return; + if (!Config.enableSoundSystem()) return; Path soundPath = generatedPackPath .resolve("assets") @@ -753,7 +752,7 @@ public abstract class AbstractPackManager implements PackManager { private void generateBlockOverrides(Path generatedPackPath) { File blockStatesFile = new File(plugin.dataFolderFile(), "blockstates.yml"); if (!blockStatesFile.exists()) plugin.saveResource("blockstates.yml"); - YamlDocument preset = ConfigManager.instance().loadYamlData(blockStatesFile); + YamlDocument preset = Config.instance().loadYamlData(blockStatesFile); for (Map.Entry> entry : plugin.blockManager().blockOverrides().entrySet()) { Key key = entry.getKey(); Path overridedBlockPath = generatedPackPath @@ -788,7 +787,7 @@ public abstract class AbstractPackManager implements PackManager { } } - if (!ConfigManager.generateModAssets()) return; + if (!Config.generateModAssets()) return; for (Map.Entry entry : plugin.blockManager().modBlockStates().entrySet()) { Key key = entry.getKey(); Path overridedBlockPath = generatedPackPath @@ -815,8 +814,8 @@ public abstract class AbstractPackManager implements PackManager { } private void generateModernItemModels1_21_2(Path generatedPackPath) { - if (ConfigManager.packMaxVersion() < 21.19f) return; - if (ConfigManager.packMinVersion() > 21.39f) return; + if (Config.packMaxVersion() < 21.19f) return; + if (Config.packMinVersion() > 21.39f) return; boolean has = false; for (Map.Entry> entry : plugin.itemManager().modernItemModels1_21_2().entrySet()) { @@ -868,13 +867,13 @@ public abstract class AbstractPackManager implements PackManager { } } - if (ConfigManager.packMinVersion() < 21.19f && has) { - plugin.logger().warn("You are using item-model component for models which requires 1.21.2+. But the min supported version is " + "1." + ConfigManager.packMinVersion()); + if (Config.packMinVersion() < 21.19f && has) { + plugin.logger().warn("You are using item-model component for models which requires 1.21.2+. But the min supported version is " + "1." + Config.packMinVersion()); } } private void generateModernItemModels1_21_4(Path generatedPackPath) { - if (ConfigManager.packMaxVersion() < 21.39f) return; + if (Config.packMaxVersion() < 21.39f) return; for (Map.Entry entry : plugin.itemManager().modernItemModels1_21_4().entrySet()) { Key key = entry.getKey(); Path itemPath = generatedPackPath @@ -907,7 +906,7 @@ public abstract class AbstractPackManager implements PackManager { } private void generateModernItemOverrides(Path generatedPackPath) { - if (ConfigManager.packMaxVersion() < 21.39f) return; + if (Config.packMaxVersion() < 21.39f) return; for (Map.Entry> entry : plugin.itemManager().modernItemOverrides().entrySet()) { Key key = entry.getKey(); Path overridedItemPath = generatedPackPath @@ -967,7 +966,7 @@ public abstract class AbstractPackManager implements PackManager { } private void generateLegacyItemOverrides(Path generatedPackPath) { - if (ConfigManager.packMinVersion() > 21.39f) return; + if (Config.packMinVersion() > 21.39f) return; for (Map.Entry> entry : plugin.itemManager().legacyItemOverrides().entrySet()) { Key key = entry.getKey(); Path overridedItemPath = generatedPackPath @@ -1064,7 +1063,7 @@ public abstract class AbstractPackManager implements PackManager { } } - if (ConfigManager.resourcePack$overrideUniform()) { + if (Config.resourcePack$overrideUniform()) { Path fontPath = generatedPackPath.resolve("assets") .resolve("minecraft") .resolve("font") @@ -1115,7 +1114,7 @@ public abstract class AbstractPackManager implements PackManager { Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING); conflicts.add(file); } else { - for (ConditionalResolution resolution : ConfigManager.resolutions()) { + for (ConditionalResolution resolution : Config.resolutions()) { if (resolution.matcher().test(relative)) { resolution.resolution().run(targetPath, file); return FileVisitResult.CONTINUE; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java index d80d2d540..6af2ca8a7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java @@ -1,13 +1,13 @@ package net.momirealms.craftengine.core.pack; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import org.jetbrains.annotations.NotNull; import java.nio.file.Path; import java.util.Collection; -public interface PackManager extends Reloadable { +public interface PackManager extends Manageable { @NotNull Collection loadedPacks(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java index 48dd33894..be9052f45 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java @@ -4,7 +4,7 @@ import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import java.io.IOException; import java.io.OutputStream; @@ -26,7 +26,7 @@ public class ResourcePackHost { private long rateLimitInterval = 1000; public String url() { - return ConfigManager.hostProtocol() + "://" + ip + ":" + port + "/"; + return Config.hostProtocol() + "://" + ip + ":" + port + "/"; } public void enable(String ip, int port, Path resourcePackPath) { @@ -77,7 +77,7 @@ public class ResourcePackHost { private class ResourcePackHandler implements HttpHandler { @Override public void handle(HttpExchange exchange) throws IOException { - if (ConfigManager.denyNonMinecraftRequest()) { + if (Config.denyNonMinecraftRequest()) { String userAgent = exchange.getRequestHeaders().getFirst("User-Agent"); if (userAgent == null || !userAgent.startsWith("Minecraft Java/")) { CraftEngine.instance().debug(() -> "Blocked non-Minecraft Java client. User-Agent: " + userAgent); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfF.java b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfF.java index 803b735f6..c66880467 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfF.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfF.java @@ -101,7 +101,7 @@ public final class ObfF { } private static Section 九转大肠() { - return CraftEngine.instance().configManager().settings() + return CraftEngine.instance().config().settings() .getSection("resource-pack.protection"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index e6c8b01f5..290acc357 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -11,7 +11,7 @@ import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.template.TemplateManager; import net.momirealms.craftengine.core.plugin.config.template.TemplateManagerImpl; import net.momirealms.craftengine.core.plugin.dependency.Dependencies; @@ -29,13 +29,14 @@ import net.momirealms.craftengine.core.plugin.logger.filter.LogFilter; import net.momirealms.craftengine.core.plugin.network.NetworkManager; import net.momirealms.craftengine.core.plugin.scheduler.SchedulerAdapter; import net.momirealms.craftengine.core.sound.SoundManager; +import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.WorldManager; import org.apache.logging.log4j.LogManager; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.function.BiConsumer; +import java.util.concurrent.Executor; import java.util.function.Consumer; import java.util.function.Supplier; @@ -43,13 +44,15 @@ public abstract class CraftEngine implements Plugin { public static final String MOD_CLASS = "net.momirealms.craftengine.mod.CraftEnginePlugin"; public static final String NAMESPACE = "craftengine"; private static CraftEngine instance; + protected PluginLogger logger; + protected Consumer> debugger = (s) -> {}; + protected Config config; + protected ClassPathAppender classPathAppender; protected DependencyManager dependencyManager; protected SchedulerAdapter scheduler; protected NetworkManager networkManager; - protected ClassPathAppender classPathAppender; protected FontManager fontManager; protected PackManager packManager; - protected ConfigManager configManager; protected ItemManager itemManager; protected RecipeManager recipeManager; protected BlockManager blockManager; @@ -64,8 +67,7 @@ public abstract class CraftEngine implements Plugin { protected SoundManager soundManager; protected VanillaLootManager vanillaLootManager; - protected PluginLogger logger; - protected Consumer> debugger = (s) -> {}; + private final Consumer reloadEventDispatcher; private boolean isReloading; private String buildByBit = "%%__BUILTBYBIT__%%"; @@ -74,8 +76,10 @@ public abstract class CraftEngine implements Plugin { private String user = "%%__USER__%%"; private String username = "%%__USERNAME__%%"; - protected CraftEngine() { + protected CraftEngine(Consumer reloadEventDispatcher) { instance = this; + this.reloadEventDispatcher = reloadEventDispatcher; + VersionHelper.init(serverVersion()); } public static CraftEngine instance() { @@ -85,8 +89,7 @@ public abstract class CraftEngine implements Plugin { return instance; } - @Override - public void load() { + public void onPluginLoad() { ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addFilter(new LogFilter()); ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addFilter(new DisconnectLogFilter()); this.dependencyManager = new DependencyManagerImpl(this); @@ -95,88 +98,119 @@ public abstract class CraftEngine implements Plugin { dependenciesToLoad.addAll(platformDependencies()); this.dependencyManager.loadDependencies(dependenciesToLoad); this.translationManager = new TranslationManagerImpl(this); - this.configManager = new ConfigManager(this); + this.config = new Config(this); } - @Override - public void reload() { - reload((a, b) -> {}); - } + public record ReloadResult(boolean success, long asyncTime, long syncTime) { - public void reload(BiConsumer time) { - if (this.isReloading) return; - long time1 = System.currentTimeMillis(); - this.isReloading = true; - this.configManager.reload(); - // reset debugger - if (ConfigManager.debug()) { - this.debugger = (s) -> logger.info("[Debug] " + s.get()); - } else { - this.debugger = (s) -> {}; + static ReloadResult failure() { + return new ReloadResult(false, -1L, -1L); + } + + static ReloadResult success(long asyncTime, long syncTime) { + return new ReloadResult(true, asyncTime, syncTime); } - this.translationManager.reload(); - this.templateManager.reload(); - this.furnitureManager.reload(); - this.fontManager.reload(); - this.itemManager.reload(); - this.soundManager.reload(); - this.recipeManager.reload(); - this.itemBrowserManager.reload(); - this.blockManager.reload(); - this.worldManager.reload(); - this.vanillaLootManager.reload(); - // load configs here - this.packManager.reload(); - // load at last - this.guiManager.reload(); - // delayed load - this.translationManager.delayedLoad(); - this.blockManager.delayedLoad(); - this.furnitureManager.delayedLoad(); - this.itemBrowserManager.delayedLoad(); - this.soundManager.delayedLoad(); - this.fontManager.delayedLoad(); - this.recipeManager.delayedLoad(); - long time2 = System.currentTimeMillis(); - scheduler().sync().run(() -> { - try { - this.recipeManager.runSyncTasks(); - long time3 = System.currentTimeMillis(); - time.accept(time2 - time1, time3 - time2); - } finally { - this.isReloading = false; - } - }); } - @Override - public void enable() { - this.networkManager.enable(); + public CompletableFuture reloadPlugin(Executor asyncExecutor, Executor syncExecutor, boolean reloadRecipe) { + CompletableFuture future = new CompletableFuture<>(); + asyncExecutor.execute(() -> { + if (this.isReloading) { + future.complete(ReloadResult.failure()); + return; + } + this.isReloading = true; + long time1 = System.currentTimeMillis(); + // firstly reload main config + this.config.load(); + // reset debugger + this.debugger = Config.debug() ? (s) -> logger.info("[Debug] " + s.get()) : (s) -> {}; + // now we reload the translations + this.translationManager.reload(); + // clear the outdated cache by reloading the managers + this.templateManager.reload(); + this.furnitureManager.reload(); + this.fontManager.reload(); + this.itemManager.reload(); + this.soundManager.reload(); + this.itemBrowserManager.reload(); + this.blockManager.reload(); + this.worldManager.reload(); + this.vanillaLootManager.reload(); + this.guiManager.reload(); + if (reloadRecipe) { + this.recipeManager.reload(); + } + // now we load resources + this.packManager.reload(); + // handle some special client lang for instance block_name + this.translationManager.delayedLoad(); + // init suggestions and packet mapper + this.blockManager.delayedLoad(); + // init suggestions + this.furnitureManager.delayedLoad(); + // sort the categories + this.itemBrowserManager.delayedLoad(); + // collect illegal characters from minecraft:default font + this.fontManager.delayedLoad(); + if (reloadRecipe) { + // convert data pack recipes + this.recipeManager.delayedLoad(); + } + long time2 = System.currentTimeMillis(); + long asyncTime = time2 - time1; + syncExecutor.execute(() -> { + try { + // register songs + this.soundManager.runDelayedSyncTasks(); + // register recipes + this.recipeManager.runDelayedSyncTasks(); + long time3 = System.currentTimeMillis(); + long syncTime = time3 - time2; + this.reloadEventDispatcher.accept(this); + future.complete(ReloadResult.success(asyncTime, syncTime)); + } finally { + this.isReloading = false; + } + }); + }); + return future; + } + + public void onPluginEnable() { + this.networkManager.init(); this.templateManager = new TemplateManagerImpl(); this.itemBrowserManager = new ItemBrowserManagerImpl(this); this.commandManager.registerDefaultFeatures(); - // delay the reload so other plugins can register some parsers + // delay the reload so other plugins can register some custom parsers this.scheduler.sync().runDelayed(() -> { - this.registerParsers(); + this.registerDefaultParsers(); + // hook external item plugins this.itemManager.delayedInit(); - this.reload(); + // hook worldedit + this.blockManager.delayedInit(); + // register listeners and tasks this.guiManager.delayedInit(); this.recipeManager.delayedInit(); - this.blockManager.delayedInit(); - this.worldManager.delayedInit(); this.packManager.delayedInit(); - this.furnitureManager.delayedInit(); this.fontManager.delayedInit(); this.vanillaLootManager.delayedInit(); - this.delayedEnable(); + // reload the plugin + try { + this.reloadPlugin(Runnable::run, Runnable::run, true); + } catch (Exception e) { + this.logger.warn("Failed to reload plugin on enable stage", e); + } + // must be after reloading because this process loads furniture + this.worldManager.delayedInit(); + this.furnitureManager.delayedInit(); + // set up some platform extra tasks + this.platformDelayedEnable(); }); } - @Override - public void disable() { - if (this.senderFactory != null) this.senderFactory.close(); - if (this.commandManager != null) this.commandManager.unregisterFeatures(); - if (this.networkManager != null) this.networkManager.shutdown(); + public void onPluginDisable() { + if (this.networkManager != null) this.networkManager.disable(); if (this.fontManager != null) this.fontManager.disable(); if (this.packManager != null) this.packManager.disable(); if (this.itemManager != null) this.itemManager.disable(); @@ -189,12 +223,15 @@ public abstract class CraftEngine implements Plugin { if (this.guiManager != null) this.guiManager.disable(); if (this.soundManager != null) this.soundManager.disable(); if (this.vanillaLootManager != null) this.vanillaLootManager.disable(); + if (this.translationManager != null) this.translationManager.disable(); if (this.scheduler != null) this.scheduler.shutdownScheduler(); if (this.scheduler != null) this.scheduler.shutdownExecutor(); + if (this.commandManager != null) this.commandManager.unregisterFeatures(); + if (this.senderFactory != null) this.senderFactory.close(); ResourcePackHost.instance().disable(); } - protected void registerParsers() { + protected void registerDefaultParsers() { // register template parser this.packManager.registerConfigSectionParser(this.templateManager.parser()); // register font parser @@ -217,7 +254,7 @@ public abstract class CraftEngine implements Plugin { this.packManager.registerConfigSectionParser(this.vanillaLootManager.parser()); } - protected abstract void delayedEnable(); + protected abstract void platformDelayedEnable(); protected abstract List platformDependencies(); @@ -242,11 +279,6 @@ public abstract class CraftEngine implements Plugin { ); } - @Override - public DependencyManager dependencyManager() { - return dependencyManager; - } - @SuppressWarnings("unchecked") @Override public SchedulerAdapter scheduler() { @@ -258,6 +290,33 @@ public abstract class CraftEngine implements Plugin { return classPathAppender; } + @Override + public Config config() { + return config; + } + + @Override + public PluginLogger logger() { + return logger; + } + + @Override + public void debug(Supplier message) { + debugger.accept(message); + } + + @Override + public boolean isReloading() { + return isReloading; + } + + public abstract boolean hasPlaceholderAPI(); + + @Override + public DependencyManager dependencyManager() { + return dependencyManager; + } + @SuppressWarnings("unchecked") @Override public ItemManager itemManager() { @@ -279,16 +338,6 @@ public abstract class CraftEngine implements Plugin { return fontManager; } - @Override - public ConfigManager configManager() { - return configManager; - } - - @Override - public PluginLogger logger() { - return logger; - } - @Override public TranslationManager translationManager() { return translationManager; @@ -315,9 +364,10 @@ public abstract class CraftEngine implements Plugin { return (RecipeManager) recipeManager; } + @SuppressWarnings("unchecked") @Override - public SenderFactory senderFactory() { - return senderFactory; + public

SenderFactory senderFactory() { + return (SenderFactory) senderFactory; } @Override @@ -344,15 +394,4 @@ public abstract class CraftEngine implements Plugin { public VanillaLootManager vanillaLootManager() { return vanillaLootManager; } - - @Override - public void debug(Supplier message) { - debugger.accept(message); - } - - public boolean isReloading() { - return isReloading; - } - - public abstract boolean hasPlaceholderAPI(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Reloadable.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Manageable.java similarity index 51% rename from core/src/main/java/net/momirealms/craftengine/core/plugin/Reloadable.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/Manageable.java index a589ffbb1..d8ae4d046 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Reloadable.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Manageable.java @@ -1,28 +1,39 @@ package net.momirealms.craftengine.core.plugin; -public interface Reloadable { +public interface Manageable { + // on plugin enable + default void init() { + } + + // after all plugins enabled + default void delayedInit() { + } + + // async reload default void reload() { unload(); load(); } - default void enable() { - } - + // async unload default void unload() { } + // async load default void load() { } + // on plugin disable default void disable() { unload(); } + // after all modules reloaded default void delayedLoad() { } - default void delayedInit() { + // delayed tasks on main thread + default void runDelayedSyncTasks() { } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java index 4f158bacf..d34729e3d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java @@ -10,7 +10,7 @@ import net.momirealms.craftengine.core.loot.VanillaLootManager; import net.momirealms.craftengine.core.pack.PackManager; import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.template.TemplateManager; import net.momirealms.craftengine.core.plugin.dependency.DependencyManager; import net.momirealms.craftengine.core.plugin.gui.GuiManager; @@ -27,7 +27,7 @@ import java.io.InputStream; import java.nio.file.Path; import java.util.function.Supplier; -public interface Plugin extends Reloadable { +public interface Plugin { InputStream resourceStream(String filePath); @@ -39,6 +39,8 @@ public interface Plugin extends Reloadable { Path dataFolderPath(); + boolean isReloading(); + DependencyManager dependencyManager(); SchedulerAdapter scheduler(); @@ -57,7 +59,7 @@ public interface Plugin extends Reloadable { FontManager imageManager(); - ConfigManager configManager(); + Config config(); TranslationManager translationManager(); @@ -69,7 +71,7 @@ public interface Plugin extends Reloadable { RecipeManager recipeManager(); - SenderFactory senderFactory(); +

SenderFactory senderFactory(); WorldManager worldManager(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandManager.java index 99292096b..f894ff78f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandManager.java @@ -12,7 +12,7 @@ import net.kyori.adventure.text.ComponentLike; import net.kyori.adventure.text.TranslatableComponent; import net.momirealms.craftengine.core.plugin.Plugin; import net.momirealms.craftengine.core.plugin.command.sender.Sender; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.locale.CraftEngineCaptionFormatter; import net.momirealms.craftengine.core.plugin.locale.CraftEngineCaptionProvider; import net.momirealms.craftengine.core.util.ArrayUtils; @@ -126,7 +126,7 @@ public abstract class AbstractCommandManager implements CraftEngineCommandMan @Override public void registerDefaultFeatures() { - YamlDocument document = ConfigManager.instance().loadYamlConfig(commandsFile, + YamlDocument document = Config.instance().loadYamlConfig(commandsFile, GeneralSettings.DEFAULT, LoaderSettings .builder() diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java similarity index 98% rename from core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigManager.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index 46586334c..e0bb910ba 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -14,7 +14,6 @@ import net.momirealms.craftengine.core.pack.conflict.resolution.ConditionalResol import net.momirealms.craftengine.core.pack.host.HostMode; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.PluginProperties; -import net.momirealms.craftengine.core.plugin.Reloadable; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.plugin.logger.filter.DisconnectLogFilter; import net.momirealms.craftengine.core.util.AdventureHelper; @@ -32,8 +31,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; -public class ConfigManager implements Reloadable { - private static ConfigManager instance; +public class Config { + private static Config instance; protected final CraftEngine plugin; private final Path configFilePath; private final String configVersion; @@ -116,14 +115,13 @@ public class ConfigManager implements Reloadable { protected boolean image$illegal_characters_filter$sign; protected boolean image$illegal_characters_filter$book; - public ConfigManager(CraftEngine plugin) { + public Config(CraftEngine plugin) { this.plugin = plugin; this.configVersion = PluginProperties.getValue("config"); this.configFilePath = this.plugin.dataFolderPath().resolve("config.yml"); instance = this; } - @Override public void load() { if (Files.exists(this.configFilePath)) { this.config = this.loadYamlData(this.configFilePath.toFile()); @@ -170,11 +168,6 @@ public class ConfigManager implements Reloadable { } } - @Override - public void unload() { - Reloadable.super.unload(); - } - private void loadSettings() { YamlDocument config = settings(); plugin.translationManager().forcedLocale(TranslationManager.parseLocale(config.getString("forced-locale", ""))); @@ -610,7 +603,7 @@ public class ConfigManager implements Reloadable { return config; } - public static ConfigManager instance() { + public static Config instance() { return instance; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java index 8b44c1a99..b6b2b00be 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.plugin.config.template; import net.momirealms.craftengine.core.pack.Pack; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.util.Key; @@ -9,7 +9,7 @@ import java.nio.file.Path; import java.util.Map; import java.util.regex.Pattern; -public interface TemplateManager extends Reloadable { +public interface TemplateManager extends Manageable { Pattern ARGUMENT_PATTERN = Pattern.compile("\\{[^{}]+}"); String LEFT_BRACKET = "{"; String RIGHT_BRACKET = "}"; @@ -22,5 +22,4 @@ public interface TemplateManager extends Reloadable { void addTemplate(Pack pack, Path path, Key id, Object obj); Map applyTemplates(Map input); - } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiManager.java index 4e2287eb5..8c4e25cb1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiManager.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.plugin.gui; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; -public interface GuiManager extends Reloadable { +public interface GuiManager extends Manageable { Inventory createInventory(Gui gui, int size); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java index 112abbb25..e9de45dab 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java @@ -3,8 +3,8 @@ package net.momirealms.craftengine.core.plugin.gui.category; import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.recipe.Recipe; -import net.momirealms.craftengine.core.plugin.Reloadable; -import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.Manageable; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.gui.Gui; import net.momirealms.craftengine.core.util.Key; @@ -15,7 +15,7 @@ import java.util.TreeSet; import static java.util.Objects.requireNonNull; -public interface ItemBrowserManager extends Reloadable { +public interface ItemBrowserManager extends Manageable { int MAX_RECIPE_DEPTH = 16; String GET_ITEM_PERMISSION = "craftengine.browser.get_item"; @@ -71,7 +71,7 @@ public interface ItemBrowserManager extends Reloadable { public static Key SOUND_CLICK_BUTTON; public static void load() { - Section section = ConfigManager.instance().settings().getSection("gui.browser"); + Section section = Config.instance().settings().getSection("gui.browser"); if (section == null) return; BROWSER_TITLE = getOrThrow(section, "main.title"); BROWSER_NEXT_PAGE_AVAILABLE = Key.of(getOrThrow(section, "main.page-navigation.next.available")); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManager.java index 90671d485..f8bab04f3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManager.java @@ -2,7 +2,7 @@ package net.momirealms.craftengine.core.plugin.locale; import net.kyori.adventure.text.Component; import net.kyori.adventure.translation.Translator; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import org.jetbrains.annotations.Nullable; @@ -12,7 +12,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -public interface TranslationManager extends Reloadable { +public interface TranslationManager extends Manageable { Set ALL_LANG = Set.of( "af_za", "ar_sa", "ast_es", "az_az", "ba_ru", "bar", "be_by", "be_latn", "bg_bg", "br_fr", "brb", "bs_ba", "ca_es", "cs_cz", "cy_gb", "da_dk", diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java index 31e6f79e8..9c79a0b4a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java @@ -2,8 +2,12 @@ package net.momirealms.craftengine.core.plugin.network; import io.netty.channel.Channel; import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.Manageable; +import org.jetbrains.annotations.NotNull; -public interface NetworkManager { +import java.util.List; + +public interface NetworkManager extends Manageable { String MOD_CHANNEL = "craftengine:payload"; void setUser(Channel channel, NetWorkUser user); @@ -16,9 +20,15 @@ public interface NetworkManager { NetWorkUser[] onlineUsers(); - void init(); + default void sendPacket(@NotNull NetWorkUser player, Object packet) { + sendPacket(player, packet, false); + } - void enable(); + void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately); - void shutdown(); + default void sendPackets(@NotNull NetWorkUser player, List packet) { + sendPacket(player, packet, false); + } + + void sendPackets(@NotNull NetWorkUser player, List packet, boolean immediately); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java index 88621064b..951040f2f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java @@ -40,7 +40,7 @@ public abstract class AbstractSoundManager implements SoundManager { } @Override - public void delayedLoad() { + public void runDelayedSyncTasks() { if (!VersionHelper.isVersionNewerThan1_21()) return; this.registerSongs(this.songs); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java index 97c81ff31..367785592 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java @@ -1,12 +1,12 @@ package net.momirealms.craftengine.core.sound; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.util.Key; import java.util.Map; -public interface SoundManager extends Reloadable { +public interface SoundManager extends Manageable { ConfigSectionParser[] parsers(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/WorldManager.java b/core/src/main/java/net/momirealms/craftengine/core/world/WorldManager.java index 5cfef4fd5..5c83b592b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/WorldManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/WorldManager.java @@ -1,13 +1,13 @@ package net.momirealms.craftengine.core.world; -import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.world.chunk.storage.StorageAdaptor; import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage; import org.jetbrains.annotations.NotNull; import java.util.UUID; -public interface WorldManager extends Reloadable { +public interface WorldManager extends Manageable { void setStorageAdaptor(@NotNull StorageAdaptor storageAdaptor);