diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java index 325159bdc..28d614af0 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java @@ -37,6 +37,7 @@ import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.condition.AlwaysFalseCondition; import net.momirealms.craftengine.core.plugin.context.event.EventConditions; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.plugin.text.minimessage.FormattedLine; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; @@ -181,7 +182,7 @@ public class BukkitCompatibilityManager implements CompatibilityManager { } private void logHook(String plugin) { - this.plugin.logger().info("[Compatibility] " + plugin + " hooked"); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.compatibility", plugin)); } @Override @@ -252,8 +253,8 @@ public class BukkitCompatibilityManager implements CompatibilityManager { if (VersionHelper.isOrAbove1_20_3()) { this.plugin.logger().severe(""); if (Locale.getDefault() == Locale.SIMPLIFIED_CHINESE) { - this.plugin.logger().severe("[Compatibility] 插件需要更新 FastAsyncWorldEdit 到 2.13.0 或更高版本,以获得更好的兼容性。(当前版本: " + version + ")"); - this.plugin.logger().severe("[Compatibility] 请前往 https://ci.athion.net/job/FastAsyncWorldEdit/ 下载最新版本"); + this.plugin.logger().severe("[兼容性] 插件需要更新 FastAsyncWorldEdit 到 2.13.0 或更高版本,以获得更好的兼容性。(当前版本: " + version + ")"); + this.plugin.logger().severe("[兼容性] 请前往 https://ci.athion.net/job/FastAsyncWorldEdit/ 下载最新版本"); } else { this.plugin.logger().severe("[Compatibility] Update FastAsyncWorldEdit to v2.13.0+ for better compatibility (Current: " + version + ")"); this.plugin.logger().severe("[Compatibility] Download latest version: https://ci.athion.net/job/FastAsyncWorldEdit/"); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/advancement/BukkitAdvancementManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/advancement/BukkitAdvancementManager.java index 9a5f8acc3..5d98d2130 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/advancement/BukkitAdvancementManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/advancement/BukkitAdvancementManager.java @@ -119,6 +119,11 @@ public final class BukkitAdvancementManager extends AbstractAdvancementManager { return LoadingSequence.ADVANCEMENT; } + @Override + public int count() { + return 0; + } + @Override public void parseSection(Pack pack, Path path, String node, Key id, Map section) { if (advancements.containsKey(id)) { 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 ff12e6dcc..5b0f5cacc 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 @@ -7,13 +7,11 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityTypes; -import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.EntityUtils; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxConfig; -import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.sound.SoundData; import net.momirealms.craftengine.core.util.Key; @@ -33,7 +31,6 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; -import java.util.function.Consumer; public class BukkitFurnitureManager extends AbstractFurnitureManager { public static final NamespacedKey FURNITURE_KEY = KeyUtils.toNamespacedKey(FurnitureManager.FURNITURE_KEY); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitbox.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitbox.java index db6c0b865..ac88d288d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitbox.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitbox.java @@ -17,7 +17,10 @@ import net.momirealms.craftengine.core.world.WorldPosition; import org.joml.Quaternionf; import org.joml.Vector3f; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; import java.util.function.Consumer; import java.util.function.Supplier; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java index d38e58a24..7836a0812 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java @@ -93,6 +93,7 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme public class VanillaLootParser extends IdSectionConfigParser { public static final String[] CONFIG_SECTION_NAME = new String[] {"vanilla-loots", "vanilla-loot"}; + private int count; @Override public int loadingSequence() { @@ -104,6 +105,16 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme return CONFIG_SECTION_NAME; } + @Override + public int count() { + return this.count; + } + + @Override + public void preProcess() { + this.count = 0; + } + @Override public void parseSection(Pack pack, Path path, String node, Key id, Map section) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(section.get("type"), "warning.config.vanilla_loot.missing_type"); @@ -147,6 +158,7 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme } } } + this.count++; } } } 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 4b7aa72cc..fc961ac8d 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 @@ -14,6 +14,8 @@ import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.obfuscation.ObfA; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.plugin.locale.TranslationManagerImpl; import net.momirealms.craftengine.core.util.Base64Utils; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Bukkit; @@ -94,7 +96,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { return; } if (!Config.sendPackOnUpload()) return; - CraftEngine.instance().logger().info("Completed uploading resource pack"); + CraftEngine.instance().logger().info(TranslationManager.instance().translateLog("info.resource_pack.upload")); for (BukkitServerPlayer player : this.plugin.networkManager().onlineUsers()) { sendResourcePack(player); } diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index 2377b162b..9e9be8c07 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -38,6 +38,20 @@ argument.parse.failure.aggregate.missing: "Missing component ''Invalid component '': " argument.parse.failure.either: "Could not resolve or from ''" argument.parse.failure.namedtextcolor: "'' is not a named text color" +info.pack.load: "Loaded pack: . Default namespace: " +info.resource.load: "Loaded in ms ()" +info.resource_pack.start: "Generating resource pack..." +info.resource_pack.generate: "Generated resource pack in ms" +info.resource_pack.validate: "Validated resource pack in ms" +info.resource_pack.optimize: "Optimized resource pack in ms" +info.resource_pack.optimize.json: "> Optimizing json files..." +info.resource_pack.optimize.texture: "> Optimizing textures..." +info.resource_pack.optimize.result: "□ Before/After/Ratio: KB/ KB/%" +info.resource_pack.create: "Created resource pack zip in ms" +info.resource_pack.upload: "Completed uploading resource pack" +info.host.self.netty_server: "Netty HTTP server started on port: " +info.host.cache.load: "[] Loaded cached resource pack metadata" +info.compatibility: "[Compatibility] hooked" command.reload.config.success: "Configs reloaded in ms. (Async: ms | Sync: ms)" command.reload.config.failure: "Config reload failed. Check console logs." command.reload.pack.success: "Resource pack reloaded in ms." diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index 06d51777c..54850c5f5 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -38,6 +38,20 @@ argument.parse.failure.aggregate.missing: "缺少组件 ''" argument.parse.failure.aggregate.failure: "无效的组件 '': " argument.parse.failure.either: "无法从 '' 解析 " argument.parse.failure.namedtextcolor: "'' 不是颜色代码" +info.pack.load: "已加载包: . 默认命名空间: " +info.resource.load: "加载 耗时 ms ()" +info.resource_pack.start: "正在开始生成资源包..." +info.resource_pack.generate: "生成资源包耗时 ms" +info.resource_pack.validate: "验证资源包耗时 ms" +info.resource_pack.optimize: "优化资源包耗时 ms" +info.resource_pack.optimize.json: "> 正在优化json文件..." +info.resource_pack.optimize.texture: "> 正在优化贴图文件..." +info.resource_pack.optimize.result: "□ 优化前/优化后/比例: KB/ KB/%" +info.resource_pack.create: "创建资源包文件耗时 ms" +info.resource_pack.upload: "资源包上传完成" +info.host.self.netty_server: "Netty HTTP 服务已在端口 开启" +info.host.cache.load: "[] 已加载缓存的资源包元数据" +info.compatibility: "[兼容性] 已挂钩 " command.reload.config.success: "重新加载配置完成. 耗时 毫秒 (异步: ms | 同步: ms)" command.reload.config.failure: "重新加载配置失败, 请检查控制台日志" command.reload.pack.success: "资源包重新加载完成. 耗时 毫秒" diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java index 5707d7b2f..9f620cd82 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java @@ -261,6 +261,7 @@ public abstract class AbstractBlockManager extends AbstractModelGenerator implem public class BlockStateMappingParser extends SectionConfigParser { public static final String[] CONFIG_SECTION_NAME = new String[]{"block-state-mappings", "block-state-mapping"}; + private int count; @Override public String[] sectionId() { @@ -272,6 +273,16 @@ public abstract class AbstractBlockManager extends AbstractModelGenerator implem return LoadingSequence.BLOCK_STATE_MAPPING; } + @Override + public int count() { + return this.count; + } + + @Override + public void preProcess() { + this.count = 0; + } + @Override public void parseSection(Pack pack, Path path, Map section) throws LocalizedException { ExceptionCollector exceptionCollector = new ExceptionCollector<>(); @@ -302,6 +313,7 @@ public abstract class AbstractBlockManager extends AbstractModelGenerator implem List blockStateWrappers = AbstractBlockManager.this.blockStateArranger.computeIfAbsent(blockOwnerId, k -> new ArrayList<>()); blockStateWrappers.add(beforeState); AbstractBlockManager.this.autoVisualBlockStateCandidates[beforeState.registryId()] = createVisualBlockCandidate(beforeState); + this.count++; } exceptionCollector.throwIfPresent(); } @@ -331,6 +343,11 @@ public abstract class AbstractBlockManager extends AbstractModelGenerator implem this.visualBlockStateAllocator = new VisualBlockStateAllocator(AbstractBlockManager.this.plugin.dataFolderPath().resolve("cache").resolve("visual-block-states.json"), candidates, AbstractBlockManager.this::createVanillaBlockState); } + @Override + public int count() { + return AbstractBlockManager.this.byId.size(); + } + public void addPendingConfigSection(PendingConfigSection section) { this.pendingConfigSections.add(section); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java index e056dfc73..98a5fb890 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.entity.furniture; import net.momirealms.craftengine.core.entity.furniture.element.FurnitureElementConfig; import net.momirealms.craftengine.core.entity.furniture.element.FurnitureElementConfigs; -import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBox; import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxConfig; import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxTypes; import net.momirealms.craftengine.core.loot.LootTable; @@ -109,6 +108,11 @@ public abstract class AbstractFurnitureManager implements FurnitureManager { return LoadingSequence.FURNITURE; } + @Override + public int count() { + return AbstractFurnitureManager.this.byId.size(); + } + @Override public void parseSection(Pack pack, Path path, String node, Key id, Map section) { if (AbstractFurnitureManager.this.byId.containsKey(id)) { 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 df9e4fdff..cfa52da0b 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 @@ -442,9 +442,14 @@ public abstract class AbstractFontManager implements FontManager { return LoadingSequence.EMOJI; } + @Override + public int count() { + return AbstractFontManager.this.emojis.size(); + } + @Override public void parseSection(Pack pack, Path path, String node, Key id, Map section) { - if (emojis.containsKey(id)) { + if (AbstractFontManager.this.emojis.containsKey(id)) { throw new LocalizedResourceConfigException("warning.config.emoji.duplicate"); } String permission = (String) section.get("permission"); @@ -510,6 +515,11 @@ public abstract class AbstractFontManager implements FontManager { return LoadingSequence.IMAGE; } + @Override + public int count() { + return AbstractFontManager.this.images.size(); + } + @Override public void postProcess() { for (Map.Entry entry : this.idAllocators.entrySet()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index d6defc9b4..3104b4e53 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -351,6 +351,11 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl .toList(); registerArmorTrimPattern(trims); } + + @Override + public int count() { + return AbstractItemManager.this.equipments.size(); + } } public void addOrMergeEquipment(ComponentBasedEquipment equipment) { @@ -368,6 +373,11 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl public static final String[] CONFIG_SECTION_NAME = new String[] {"items", "item"}; private final Map idAllocators = new HashMap<>(); + @Override + public int count() { + return AbstractItemManager.this.customItemsById.size(); + } + private boolean isModernFormatRequired() { return Config.packMaxVersion().isAtOrAbove(MinecraftVersions.V1_21_4); } 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 93d1ea157..657906f95 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 @@ -134,6 +134,11 @@ public abstract class AbstractRecipeManager implements RecipeManager { return CONFIG_SECTION_NAME; } + @Override + public int count() { + return Math.max(0, AbstractRecipeManager.this.byId.size() - AbstractRecipeManager.this.dataPackRecipes.size()); + } + @Override public void parseSection(Pack pack, Path path, String node, Key id, Map section) { if (!Config.enableRecipeSystem()) return; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java index 87730aa0e..965772071 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java @@ -19,7 +19,10 @@ import net.momirealms.craftengine.core.util.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; 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 1aa740527..ab9ffd4e5 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 @@ -31,10 +31,7 @@ import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigParser; import net.momirealms.craftengine.core.plugin.config.SectionConfigParser; import net.momirealms.craftengine.core.plugin.config.StringKeyConstructor; -import net.momirealms.craftengine.core.plugin.locale.LangData; -import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.plugin.locale.*; import net.momirealms.craftengine.core.plugin.logger.Debugger; import net.momirealms.craftengine.core.sound.AbstractSoundManager; import net.momirealms.craftengine.core.sound.SoundEvent; @@ -407,7 +404,7 @@ public abstract class AbstractPackManager implements PackManager { } Pack pack = new Pack(path, new PackMeta(author, description, version, namespace), enable); this.loadedPacks.put(path.getFileName().toString(), pack); - this.plugin.logger().info("Loaded pack: " + pack.folder().getFileName() + ". Default namespace: " + namespace); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.pack.load", pack.folder().getFileName().toString(), namespace)); } } } catch (IOException e) { @@ -695,7 +692,12 @@ public abstract class AbstractPackManager implements PackManager { parser.loadAll(); parser.postProcess(); long t2 = System.nanoTime(); - this.plugin.logger().info("Loaded " + parser.sectionId()[0] + " in " + String.format("%.2f", ((t2 - t1) / 1_000_000.0)) + " ms"); + int count = parser.count(); + if (parser.silentIfNotExists() && count == 0) { + continue; + } + this.plugin.logger().info(TranslationManager.instance().translateLog("info.resource.load", + parser.sectionId()[0], String.format("%.2f", ((t2 - t1) / 1_000_000.0)), String.valueOf(count))); } } @@ -720,7 +722,7 @@ public abstract class AbstractPackManager implements PackManager { @Override public void generateResourcePack() throws IOException { - this.plugin.logger().info("Generating resource pack..."); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.resource_pack.start")); long time1 = System.currentTimeMillis(); // Create cache data @@ -768,17 +770,17 @@ public abstract class AbstractPackManager implements PackManager { this.removeAllShaders(generatedPackPath); } long time2 = System.currentTimeMillis(); - this.plugin.logger().info("Generated resource pack in " + (time2 - time1) + "ms"); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.resource_pack.generate", String.valueOf(time2 - time1))); if (Config.validateResourcePack()) { this.validateResourcePack(generatedPackPath); } long time3 = System.currentTimeMillis(); - this.plugin.logger().info("Validated resource pack in " + (time3 - time2) + "ms"); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.resource_pack.validate", String.valueOf(time3 - time2))); if (Config.optimizeResourcePack()) { this.optimizeResourcePack(generatedPackPath); } long time4 = System.currentTimeMillis(); - this.plugin.logger().info("Optimized resource pack in " + (time4 - time3) + "ms"); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.resource_pack.optimize", String.valueOf(time4 - time3))); Path finalPath = resourcePackPath(); Files.createDirectories(finalPath.getParent()); try { @@ -787,7 +789,7 @@ public abstract class AbstractPackManager implements PackManager { this.plugin.logger().severe("Error zipping resource pack", e); } long time5 = System.currentTimeMillis(); - this.plugin.logger().info("Created resource pack zip file in " + (time5 - time4) + "ms"); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.resource_pack.create", String.valueOf(time5 - time4))); this.generationEventDispatcher.accept(generatedPackPath, finalPath); } } @@ -1042,7 +1044,7 @@ public abstract class AbstractPackManager implements PackManager { } if (Config.optimizeJson()) { - this.plugin.logger().info("> Optimizing json files..."); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.resource_pack.optimize.json")); AtomicLong previousBytes = new AtomicLong(0L); AtomicLong afterBytes = new AtomicLong(0L); List> futures = new ArrayList<>(); @@ -1109,11 +1111,11 @@ public abstract class AbstractPackManager implements PackManager { long originalSize = previousBytes.get(); long optimizedSize = afterBytes.get(); double compressionRatio = ((double) optimizedSize / originalSize) * 100; - this.plugin.logger().info("□ Before/After/Ratio: " + formatSize(originalSize) + "/" + formatSize(optimizedSize) + "/" + String.format("%.2f%%", compressionRatio)); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.resource_pack.optimize.result", formatSize(originalSize), formatSize(optimizedSize), String.format("%.2f%%", compressionRatio))); } if (Config.optimizeTexture()) { - this.plugin.logger().info("> Optimizing textures..."); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.resource_pack.optimize.texture")); AtomicLong previousBytes = new AtomicLong(0L); AtomicLong afterBytes = new AtomicLong(0L); List> futures = new ArrayList<>(); @@ -1155,7 +1157,7 @@ public abstract class AbstractPackManager implements PackManager { long originalSize = previousBytes.get(); long optimizedSize = afterBytes.get(); double compressionRatio = ((double) optimizedSize / originalSize) * 100; - this.plugin.logger().info("□ Before/After/Ratio: " + formatSize(originalSize) + "/" + formatSize(optimizedSize) + "/" + String.format("%.2f%%", compressionRatio)); + this.plugin.logger().info(TranslationManager.instance().translateLog("info.resource_pack.optimize.result", formatSize(originalSize), formatSize(optimizedSize), String.format("%.2f%%", compressionRatio))); } } @@ -1170,7 +1172,7 @@ public abstract class AbstractPackManager implements PackManager { " ".repeat(Math.max(0, emptyLength)) + "]"; return String.format( - "%s %d/%d (%.1f%%) | Time: %ss", + "%s %d/%d (%.1f%%) | %ss", progressBar, current, total, @@ -2854,6 +2856,11 @@ public abstract class AbstractPackManager implements PackManager { this.excludeJson.clear(); } + @Override + public int count() { + return this.excludeJson.size() + this.excludeTexture.size(); + } + public Set excludeTexture() { return excludeTexture; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java index 674fbf908..8b36730a6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java @@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.*; import org.jetbrains.annotations.Nullable; @@ -85,7 +86,7 @@ public class AlistHost implements ResourcePackHost { new TypeToken>(){}.getType() ); this.cachedSha1 = cache.get("sha1"); - CraftEngine.instance().logger().info("[Alist] Loaded cached resource pack metadata"); + CraftEngine.instance().logger().info(TranslationManager.instance().translateLog("info.host.cache.load", "Alist")); } catch (Exception e) { CraftEngine.instance().logger().warn("[Alist] Failed to load cache " + cachePath, e); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java index beab2350a..98b65751b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java @@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.*; import java.io.IOException; @@ -58,7 +59,7 @@ public class DropboxHost implements ResourcePackHost { this.refreshToken = getString(cache, "refresh_token"); this.accessToken = getString(cache, "access_token"); this.expiresAt = getLong(cache, "expires_at"); - CraftEngine.instance().logger().info("[Dropbox] Loaded cached resource pack info"); + CraftEngine.instance().logger().info(TranslationManager.instance().translateLog("info.host.cache.load", "Dropbox")); } catch (Exception e) { CraftEngine.instance().logger().warn("[Dropbox] Failed to load cache " + cachePath, e); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/GitLabHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/GitLabHost.java index b94adf1f1..d2e4fd58b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/GitLabHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/GitLabHost.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.*; import java.io.IOException; @@ -58,7 +59,7 @@ public class GitLabHost implements ResourcePackHost { if (uuidString != null && !uuidString.isEmpty()) { this.uuid = UUID.fromString(uuidString); } - CraftEngine.instance().logger().info("[GitLab] Loaded cached resource pack info"); + CraftEngine.instance().logger().info(TranslationManager.instance().translateLog("info.host.cache.load", "GitLab")); } catch (Exception e) { CraftEngine.instance().logger().warn( "[GitLab] Failed to read cache file: " + cachePath, e); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java index 22a0dfc37..89db7002d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java @@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; @@ -70,7 +71,7 @@ public class LobFileHost implements ResourcePackHost { if (uuidString != null && !uuidString.isEmpty()) { this.uuid = UUID.fromString(uuidString); } - CraftEngine.instance().logger().info("[LobFile] Loaded cached resource pack info"); + CraftEngine.instance().logger().info(TranslationManager.instance().translateLog("info.host.cache.load", "LobFile")); } catch (Exception e) { CraftEngine.instance().logger().warn( "[LobFile] Failed to read cache file: " + e.getMessage()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java index a15fa632f..3fb95aa92 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java @@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.*; import java.io.FileNotFoundException; @@ -76,7 +77,7 @@ public class OneDriveHost implements ResourcePackHost { this.sha1 = cache.get("sha1"); this.fileId = cache.get("file-id"); - CraftEngine.instance().logger().info("[OneDrive] Loaded cached resource pack info"); + CraftEngine.instance().logger().info(TranslationManager.instance().translateLog("info.host.cache.load", "OneDrive")); } catch (Exception e) { CraftEngine.instance().logger().warn( "[OneDrive] Failed to load cache" + cachePath, e); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java index 39961f3aa..29563b49c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java @@ -21,6 +21,7 @@ import io.netty.util.CharsetUtil; import io.netty.util.concurrent.GlobalEventExecutor; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import org.jetbrains.annotations.Nullable; import java.io.ByteArrayInputStream; @@ -166,7 +167,7 @@ public class SelfHostHttpServer { }); try { serverChannel = b.bind(port).sync().channel(); - CraftEngine.instance().logger().info("Netty HTTP server started on port: " + port); + CraftEngine.instance().logger().info(TranslationManager.instance().translateLog("info.host.self.netty_server", String.valueOf(port))); } catch (InterruptedException e) { CraftEngine.instance().logger().warn("Failed to start Netty server", e); Thread.currentThread().interrupt(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigParser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigParser.java index 5fc06c91e..915fb7cc7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigParser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigParser.java @@ -25,4 +25,12 @@ public interface ConfigParser extends Comparable { void loadAll(); void clear(); + + default int count() { + return -1; + } + + default boolean silentIfNotExists() { + return true; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java index 3b0502db5..cfe45b6ca 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java @@ -51,6 +51,11 @@ public class TemplateManagerImpl implements TemplateManager { return LoadingSequence.TEMPLATE; } + @Override + public int count() { + return TemplateManagerImpl.this.templates.size(); + } + @Override public void parseObject(Pack pack, Path path, String node, Key id, Object obj) { if (TemplateManagerImpl.this.templates.containsKey(id)) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/GlobalVariableManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/GlobalVariableManager.java index 078a8c600..42af0daa5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/GlobalVariableManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/GlobalVariableManager.java @@ -49,6 +49,11 @@ public class GlobalVariableManager implements Manageable { return CONFIG_SECTION_NAME; } + @Override + public int count() { + return GlobalVariableManager.this.globalVariables.size(); + } + @Override public void parseObject(Pack pack, Path path, String node, Key id, Object object) throws LocalizedException { if (object != null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java index b4d6d30f4..27baae5e7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java @@ -109,6 +109,11 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { return LoadingSequence.CATEGORY; } + @Override + public int count() { + return ItemBrowserManagerImpl.this.byId.size(); + } + @Override public void parseSection(Pack pack, Path path, String node, Key id, Map section) { String name = section.getOrDefault("name", id).toString(); 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 89fa4edea..8f9909250 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 @@ -4,13 +4,12 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.translation.Translator; import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigParser; +import net.momirealms.craftengine.core.plugin.text.minimessage.IndexedArgumentTag; +import net.momirealms.craftengine.core.util.AdventureHelper; import org.incendo.cloud.suggestion.Suggestion; import org.jetbrains.annotations.Nullable; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; public interface TranslationManager extends Manageable { @@ -74,6 +73,15 @@ public interface TranslationManager extends Manageable { } } + default String translateLog(String id, String... arguments) { + String translation = miniMessageTranslation(id); + if (translation == null) { + return id; + } + Component deserialize = AdventureHelper.customMiniMessage().deserialize(translation, new IndexedArgumentTag(Arrays.stream(arguments).map(Component::text).toList())); + return AdventureHelper.plainTextContent(deserialize); + } + Set translationKeys(); void log(String id, String... args); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java index 44cd01d8c..e193d837b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java @@ -277,6 +277,7 @@ public class TranslationManagerImpl implements TranslationManager { public class TranslationParser extends IdSectionConfigParser { public static final String[] CONFIG_SECTION_NAME = new String[] {"translations", "translation", "l10n", "localization", "i18n", "internationalization"}; + private int count; @Override public int loadingSequence() { @@ -288,6 +289,16 @@ public class TranslationManagerImpl implements TranslationManager { return CONFIG_SECTION_NAME; } + @Override + public int count() { + return this.count; + } + + @Override + public void preProcess() { + this.count = 0; + } + @Override public void parseSection(Pack pack, Path path, String node, net.momirealms.craftengine.core.util.Key id, Map section) { Locale locale = TranslationManager.parseLocale(id.value()); @@ -300,6 +311,7 @@ public class TranslationManagerImpl implements TranslationManager { String key = entry.getKey(); bundle.put(key, entry.getValue().toString()); TranslationManagerImpl.this.translationKeys.add(key); + this.count++; } TranslationManagerImpl.this.registry.registerAll(locale, bundle); @@ -313,6 +325,7 @@ public class TranslationManagerImpl implements TranslationManager { Component deserialize = AdventureHelper.miniMessage().deserialize(AdventureHelper.legacyToMiniMessage(s), ShiftTag.INSTANCE, ImageTag.INSTANCE); return AdventureHelper.getLegacy().serialize(deserialize); }; + private int count; @Override public int loadingSequence() { @@ -324,6 +337,16 @@ public class TranslationManagerImpl implements TranslationManager { return CONFIG_SECTION_NAME; } + @Override + public int count() { + return this.count; + } + + @Override + public void preProcess() { + this.count = 0; + } + @Override public void parseSection(Pack pack, Path path, String node, net.momirealms.craftengine.core.util.Key id, Map section) { String langId = id.value().toLowerCase(Locale.ENGLISH); @@ -333,6 +356,7 @@ public class TranslationManagerImpl implements TranslationManager { entry -> this.langProcessor.apply(String.valueOf(entry.getValue())) )); TranslationManagerImpl.this.addClientTranslation(langId, sectionData); + this.count += sectionData.size(); } } 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 0972a6eed..1a31d0140 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 @@ -97,6 +97,11 @@ public abstract class AbstractSoundManager implements SoundManager { return CONFIG_SECTION_NAME; } + @Override + public int count() { + return AbstractSoundManager.this.songs.size(); + } + @Override public void parseSection(Pack pack, Path path, String node, Key id, Map section) { if (AbstractSoundManager.this.songs.containsKey(id)) { @@ -124,6 +129,11 @@ public abstract class AbstractSoundManager implements SoundManager { return CONFIG_SECTION_NAME; } + @Override + public int count() { + return AbstractSoundManager.this.byId.size(); + } + @Override public void parseSection(Pack pack, Path path, String node, Key id, Map section) { if (AbstractSoundManager.this.byId.containsKey(id)) { diff --git a/gradle.properties b/gradle.properties index 5e2c657b8..255046cbe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings project_version=0.0.65.16 config_version=60 -lang_version=41 +lang_version=43 project_group=net.momirealms latest_supported_version=1.21.10