diff --git a/bukkit/compatibility/build.gradle.kts b/bukkit/compatibility/build.gradle.kts index df485034a..0e6f5521c 100644 --- a/bukkit/compatibility/build.gradle.kts +++ b/bukkit/compatibility/build.gradle.kts @@ -63,6 +63,8 @@ dependencies { compileOnly("com.github.Zrips:Jobs:v5.2.2.3") // CustomFishing compileOnly("net.momirealms:custom-fishing:2.3.3") + // CustomNameplates + compileOnly("net.momirealms:custom-nameplates:3.0.33") // eco compileOnly("com.willfp:eco:6.70.1") compileOnly("com.willfp:EcoJobs:3.56.1") 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 2e17e977f..f75d58c5b 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 @@ -1,5 +1,6 @@ package net.momirealms.craftengine.bukkit.compatibility; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.compatibility.item.*; import net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld.LegacySlimeFormatStorageAdaptor; @@ -16,6 +17,8 @@ import net.momirealms.craftengine.bukkit.compatibility.quickshop.QuickShopItemEx import net.momirealms.craftengine.bukkit.compatibility.region.WorldGuardRegionCondition; import net.momirealms.craftengine.bukkit.compatibility.skript.SkriptHook; import net.momirealms.craftengine.bukkit.compatibility.slimeworld.SlimeFormatStorageAdaptor; +import net.momirealms.craftengine.bukkit.compatibility.tag.CustomNameplateProviders; +import net.momirealms.craftengine.core.plugin.compatibility.TagResolverProvider; import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionUtils; import net.momirealms.craftengine.bukkit.compatibility.worldedit.WorldEditBlockRegister; import net.momirealms.craftengine.bukkit.font.BukkitFontManager; @@ -29,8 +32,10 @@ import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; import net.momirealms.craftengine.core.plugin.compatibility.ModelProvider; 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.text.minimessage.FormattedLine; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.WorldManager; @@ -43,6 +48,8 @@ public class BukkitCompatibilityManager implements CompatibilityManager { private final BukkitCraftEngine plugin; private final Map modelProviders; private final Map levelerProviders; + private final Map tagResolverProviders; + private TagResolverProvider[] tagResolverProviderArray = null; private boolean hasPlaceholderAPI; public BukkitCompatibilityManager(BukkitCraftEngine plugin) { @@ -52,6 +59,7 @@ public class BukkitCompatibilityManager implements CompatibilityManager { "BetterModel", BetterModelModel::new )); this.levelerProviders = new HashMap<>(); + this.tagResolverProviders = new HashMap<>(); } @Override @@ -146,6 +154,12 @@ public class BukkitCompatibilityManager implements CompatibilityManager { new QuickShopItemExpressionHandler(this.plugin).register(); logHook("QuickShop-Hikari"); } + if (this.isPluginEnabled("CustomNameplates")) { + registerTagResolverProvider(new CustomNameplateProviders.Background()); + registerTagResolverProvider(new CustomNameplateProviders.Nameplate()); + registerTagResolverProvider(new CustomNameplateProviders.Bubble()); + logHook("CustomNameplates"); + } } @Override @@ -158,6 +172,13 @@ public class BukkitCompatibilityManager implements CompatibilityManager { this.levelerProviders.put(plugin, provider); } + @Override + public void registerTagResolverProvider(TagResolverProvider provider) { + this.tagResolverProviders.put(provider.name(), provider); + this.tagResolverProviderArray = this.tagResolverProviders.values().toArray(new TagResolverProvider[0]); + FormattedLine.Companion.resetWithCustomResolvers(new ArrayList<>(this.tagResolverProviders.keySet())); + } + private void logHook(String plugin) { this.plugin.logger().info("[Compatibility] " + plugin + " hooked"); } @@ -326,4 +347,15 @@ public class BukkitCompatibilityManager implements CompatibilityManager { public int getPlayerProtocolVersion(UUID uuid) { return ViaVersionUtils.getPlayerProtocolVersion(uuid); } + + @Override + public TagResolver[] createExternalTagResolvers(Context context) { + if (this.tagResolverProviderArray == null) return null; + int length = this.tagResolverProviderArray.length; + TagResolver[] resolvers = new TagResolver[length]; + for (int i = 0; i < length; i++) { + resolvers[i] = this.tagResolverProviderArray[i].getTagResolver(context); + } + return resolvers; + } } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/BackgroundTag.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/BackgroundTag.java new file mode 100644 index 000000000..7fcdee579 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/BackgroundTag.java @@ -0,0 +1,47 @@ +package net.momirealms.craftengine.bukkit.compatibility.tag; + +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.PlayerContext; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; +import net.momirealms.customnameplates.api.feature.background.Background; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class BackgroundTag implements TagResolver { + private final net.momirealms.craftengine.core.plugin.context.Context context; + + public BackgroundTag(net.momirealms.craftengine.core.plugin.context.Context context) { + this.context = context; + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!this.has(name)) { + return null; + } + String id = arguments.popOr("No background id provided").toString(); + Optional background = CustomNameplatesAPI.getInstance().getBackground(id); + if (background.isEmpty()) { + return null; + } + double left = arguments.popOr("No argument left provided").asDouble().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + double right = arguments.popOr("No argument right provided").asDouble().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + String content = arguments.popOr("No argument content provided").toString(); + String parsed = this.context instanceof PlayerContext playerContext ? CraftEngine.instance().compatibilityManager().parse(playerContext.player(), content) : CraftEngine.instance().compatibilityManager().parse(null, content); + String textWithImage = CustomNameplatesAPI.getInstance().createTextWithImage(parsed, background.get(), (float) left, (float) right); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(textWithImage, this.context.tagResolvers())); + } + + @Override + public boolean has(@NotNull String name) { + return "background".equals(name); + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/BubbleTag.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/BubbleTag.java new file mode 100644 index 000000000..8891d0d55 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/BubbleTag.java @@ -0,0 +1,47 @@ +package net.momirealms.craftengine.bukkit.compatibility.tag; + +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.PlayerContext; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; +import net.momirealms.customnameplates.api.feature.bubble.Bubble; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class BubbleTag implements TagResolver { + private final net.momirealms.craftengine.core.plugin.context.Context context; + + public BubbleTag(net.momirealms.craftengine.core.plugin.context.Context context) { + this.context = context; + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!this.has(name)) { + return null; + } + String id = arguments.popOr("No bubble id provided").toString(); + Optional bubble = CustomNameplatesAPI.getInstance().getBubble(id); + if (bubble.isEmpty()) { + return null; + } + double left = arguments.popOr("No argument left provided").asDouble().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + double right = arguments.popOr("No argument right provided").asDouble().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + String content = arguments.popOr("No argument content provided").toString(); + String parsed = this.context instanceof PlayerContext playerContext ? CraftEngine.instance().compatibilityManager().parse(playerContext.player(), content) : CraftEngine.instance().compatibilityManager().parse(null, content); + String textWithImage = CustomNameplatesAPI.getInstance().createTextWithImage(parsed, bubble.get(), (float) left, (float) right); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(textWithImage, this.context.tagResolvers())); + } + + @Override + public boolean has(@NotNull String name) { + return "bubble".equals(name); + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/CustomNameplateProviders.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/CustomNameplateProviders.java new file mode 100644 index 000000000..5f6aae796 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/CustomNameplateProviders.java @@ -0,0 +1,44 @@ +package net.momirealms.craftengine.bukkit.compatibility.tag; + +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.compatibility.TagResolverProvider; +import net.momirealms.craftengine.core.plugin.context.Context; + +public class CustomNameplateProviders { + + public static class Background implements TagResolverProvider { + @Override + public String name() { + return "background"; + } + + @Override + public TagResolver getTagResolver(Context context) { + return new BackgroundTag(context); + } + } + + public static class Nameplate implements TagResolverProvider { + @Override + public String name() { + return "nameplate"; + } + + @Override + public TagResolver getTagResolver(Context context) { + return new NameplateTag(context); + } + } + + public static class Bubble implements TagResolverProvider { + @Override + public String name() { + return "bubble"; + } + + @Override + public TagResolver getTagResolver(Context context) { + return new BubbleTag(context); + } + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/NameplateTag.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/NameplateTag.java new file mode 100644 index 000000000..58214a7c9 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/NameplateTag.java @@ -0,0 +1,48 @@ +package net.momirealms.craftengine.bukkit.compatibility.tag; + +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.PlayerContext; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; +import net.momirealms.customnameplates.api.feature.background.Background; +import net.momirealms.customnameplates.api.feature.nameplate.Nameplate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class NameplateTag implements TagResolver { + private final net.momirealms.craftengine.core.plugin.context.Context context; + + public NameplateTag(net.momirealms.craftengine.core.plugin.context.Context context) { + this.context = context; + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!this.has(name)) { + return null; + } + String id = arguments.popOr("No nameplate id provided").toString(); + Optional nameplate = CustomNameplatesAPI.getInstance().getNameplate(id); + if (nameplate.isEmpty()) { + return null; + } + double left = arguments.popOr("No argument left provided").asDouble().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + double right = arguments.popOr("No argument right provided").asDouble().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + String content = arguments.popOr("No argument content provided").toString(); + String parsed = this.context instanceof PlayerContext playerContext ? CraftEngine.instance().compatibilityManager().parse(playerContext.player(), content) : CraftEngine.instance().compatibilityManager().parse(null, content); + String textWithImage = CustomNameplatesAPI.getInstance().createTextWithImage(parsed, nameplate.get(), (float) left, (float) right); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(textWithImage, this.context.tagResolvers())); + } + + @Override + public boolean has(@NotNull String name) { + return "nameplate".equals(name); + } +} diff --git a/bukkit/paper-loader/build.gradle.kts b/bukkit/paper-loader/build.gradle.kts index f9e060fe7..6eaa732e1 100644 --- a/bukkit/paper-loader/build.gradle.kts +++ b/bukkit/paper-loader/build.gradle.kts @@ -77,6 +77,9 @@ paper { register("ViaVersion") { required = false } register("QuickShop-Hikari") { required = false } + // external tag + register("CustomNameplates") { required = false } + // external models register("ModelEngine") { required = false } register("BetterModel") { required = false } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java index 9a6729b0a..35c4dfa70 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.bukkit.plugin; import com.google.gson.JsonElement; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; diff --git a/common-files/src/main/resources/translations/de.yml b/common-files/src/main/resources/translations/de.yml index b3e57e754..5ce8d8ef8 100644 --- a/common-files/src/main/resources/translations/de.yml +++ b/common-files/src/main/resources/translations/de.yml @@ -145,7 +145,7 @@ warning.config.recipe.brewing.missing_container: "Problem in Datei Problem in Datei gefunden - Beim Brewing-Recipe '' fehlt das erforderliche 'ingredient'-Argument." warning.config.recipe.result.post_processor.missing_type: "Problem in Datei gefunden - Beim Recipe '' fehlt das erforderliche 'type'-Argument für Result-Post-Processors." warning.config.recipe.result.post_processor.invalid_type: "Problem in Datei gefunden - Das Recipe '' verwendet einen ungültigen Result-Post-Processor-Typ ''." -warning.config.i18n.unknown_locale: "Problem in Datei gefunden - Unbekannte Locale ''." +warning.config.translation.unknown_locale: "Problem in Datei gefunden - Unbekannte Locale ''." warning.config.template.duplicate: "Problem in Datei gefunden - Doppeltes Template ''. Bitte prüfe, ob dieselbe Konfiguration in anderen Dateien vorhanden ist." warning.config.template.invalid: "Problem in Datei gefunden - Die Config '' verwendet ein ungültiges Template ''." warning.config.template.argument.self_increase_int.invalid_range: "Problem in Datei gefunden - Das Template '' verwendet ein 'from' '', das größer ist als 'to' '' im 'self_increase_int'-Argument." diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index a0b91127d..4ce3ef428 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -161,7 +161,7 @@ warning.config.recipe.brewing.missing_container: "Issue found in file Issue found in file - The brewing recipe '' is missing the required 'ingredient' argument." warning.config.recipe.result.post_processor.missing_type: "Issue found in file - The recipe '' is missing the required 'type' argument for result post processors." warning.config.recipe.result.post_processor.invalid_type: "Issue found in file - The recipe '' is using an invalid result post processor type ''." -warning.config.i18n.unknown_locale: "Issue found in file - Unknown locale ''." +warning.config.translation.unknown_locale: "Issue found in file - Unknown locale ''." warning.config.template.duplicate: "Issue found in file - Duplicated template ''. Please check if there is the same configuration in other files." warning.config.template.invalid: "Issue found in file - The config '' is using an invalid template ''." warning.config.template.argument.self_increase_int.invalid_range: "Issue found in file - The template '' is using a 'from' '' larger than 'to' '' in 'self_increase_int' argument." diff --git a/common-files/src/main/resources/translations/es.yml b/common-files/src/main/resources/translations/es.yml index 13b0fe348..0a262c0f3 100644 --- a/common-files/src/main/resources/translations/es.yml +++ b/common-files/src/main/resources/translations/es.yml @@ -98,7 +98,7 @@ warning.config.recipe.smithing_transform.post_processor.missing_type: "P warning.config.recipe.smithing_transform.post_processor.invalid_type: "Problema encontrado en el archivo - La receta de transformación de herrería '' está usando un tipo de postprocesador inválido ''." warning.config.recipe.smithing_transform.post_processor.keep_component.missing_components: "Problema encontrado en el archivo - La receta de transformación de herrería '' carece del argumento requerido 'components' para el postprocesador 'keep_components'." warning.config.recipe.smithing_transform.post_processor.keep_component.missing_tags: "Problema encontrado en el archivo - La receta de transformación de herrería '' carece del argumento requerido 'tags' para el postprocesador 'keep_tags'." -warning.config.i18n.unknown_locale: "Problema encontrado en el archivo - Configuración regional desconocida ''." +warning.config.translation.unknown_locale: "Problema encontrado en el archivo - Configuración regional desconocida ''." warning.config.template.duplicate: "Problema encontrado en el archivo - Plantilla duplicada ''. Verifica si hay la misma configuración en otros archivos." warning.config.template.argument.self_increase_int.invalid_range: "Problema encontrado en el archivo - La plantilla '' está usando un valor 'from' '' mayor que el valor 'to' '' en el argumento 'self_increase_int'." warning.config.template.argument.list.invalid_type: "Problema encontrado en el archivo - La plantilla '' está usando un argumento 'list' que espera una 'List' como argumento, pero el argumento de entrada es de tipo ''." diff --git a/common-files/src/main/resources/translations/ru_ru.yml b/common-files/src/main/resources/translations/ru_ru.yml index 5ae93dfe1..af586317c 100644 --- a/common-files/src/main/resources/translations/ru_ru.yml +++ b/common-files/src/main/resources/translations/ru_ru.yml @@ -134,7 +134,7 @@ warning.config.recipe.smithing_transform.post_processor.missing_type: " warning.config.recipe.smithing_transform.post_processor.invalid_type: "Проблема найдена в файле - Рецепт трансформации кузнечного дела '' использует недопустимый тип постпроцессора ''." warning.config.recipe.smithing_transform.post_processor.keep_component.missing_components: "Проблема найдена в файле - В рецепте трансформации кузнечного дела '' отсутствует необходимый аргумент 'components' для постпроцессоров 'keep_components'." warning.config.recipe.smithing_transform.post_processor.keep_component.missing_tags: "Проблема найдена в файле - В рецепте трансформации кузнечного дела '' отсутствует необходимый аргумент 'tags' для постпроцессоров 'keep_tags'." -warning.config.i18n.unknown_locale: "Проблема найдена в файле - Неизвестный locale ''." +warning.config.translation.unknown_locale: "Проблема найдена в файле - Неизвестный locale ''." warning.config.template.duplicate: "Проблема найдена в файле - Дублированный шаблон ''. Проверьте, есть ли такая же конфигурация в других файлах." warning.config.template.invalid: "Проблема найдена в файле - Конфигурация '' использует недействительный шаблон ''." warning.config.template.argument.self_increase_int.invalid_range: "Проблема найдена в файле - Шаблон '' использует 'from' '' больше, чем 'to' '' в 'self_increase_int' аргументе." diff --git a/common-files/src/main/resources/translations/tr.yml b/common-files/src/main/resources/translations/tr.yml index 8507154a8..94a56309f 100644 --- a/common-files/src/main/resources/translations/tr.yml +++ b/common-files/src/main/resources/translations/tr.yml @@ -97,7 +97,7 @@ warning.config.recipe.smithing_transform.post_processor.missing_type: "< warning.config.recipe.smithing_transform.post_processor.invalid_type: " dosyasında sorun bulundu - '' demircilik dönüşüm tarifi geçersiz bir işlem sonrası işleyici türü '' kullanıyor." warning.config.recipe.smithing_transform.post_processor.keep_component.missing_components: " dosyasında sorun bulundu - '' demircilik dönüşüm tarifi, 'keep_components' işlem sonrası işleyicisi için gerekli 'components' argümanı eksik." warning.config.recipe.smithing_transform.post_processor.keep_component.missing_tags: " dosyasında sorun bulundu - '' demircilik dönüşüm tarifi, 'keep_tags' işlem sonrası işleyicisi için gerekli 'tags' argümanı eksik." -warning.config.i18n.unknown_locale: " dosyasında sorun bulundu - Bilinmeyen yerel ayar ''." +warning.config.translation.unknown_locale: " dosyasında sorun bulundu - Bilinmeyen yerel ayar ''." warning.config.template.duplicate: " dosyasında sorun bulundu - Yinelenen şablon ''. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin." warning.config.template.argument.self_increase_int.invalid_range: " dosyasında sorun bulundu - '' şablonu, 'self_increase_int' argümanında 'to' '' değerinden daha büyük bir 'from' '' değeri kullanıyor." warning.config.template.argument.list.invalid_type: " dosyasında sorun bulundu - '' şablonu, argüman olarak bir 'List' bekleyen bir 'list' argümanı kullanıyor, ancak giriş argümanı bir '' türünde." diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index af5069510..1f0f34940 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -158,7 +158,7 @@ warning.config.recipe.brewing.missing_container: "在文件 发 warning.config.recipe.brewing.missing_ingredient: "在文件 发现问题 - 酿造配方 '' 缺少必需的 'ingredient' 参数" warning.config.recipe.result.post_processor.missing_type: "在文件 发现问题 - 配方 '' 缺少结果后处理器必需的 'type' 参数" warning.config.recipe.result.post_processor.invalid_type: "在文件 发现问题 - 配方 '' 使用了无效结果后处理器类型 ''" -warning.config.i18n.unknown_locale: "在文件 发现问题 - 未知的语言环境 ''" +warning.config.translation.unknown_locale: "在文件 发现问题 - 未知的语言环境 ''" warning.config.template.duplicate: "在文件 发现问题 - 重复的模板 '' 请检查其他文件中是否存在相同配置" warning.config.template.invalid: "在文件 发现问题 - 配置 '' 使用了无效的模板 ''" warning.config.template.argument.self_increase_int.invalid_range: "在文件 发现问题 - 模板 '' 在 'self_increase_int' 参数中使用了一个起始值 '' 大于终止值 ''" 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 22fe8482c..9cb976810 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 @@ -376,7 +376,7 @@ public abstract class AbstractPackManager implements PackManager { // internal plugin.saveResource("resources/internal/pack.yml"); - plugin.saveResource("resources/internal/configuration/i18n.yml"); + plugin.saveResource("resources/internal/configuration/translations.yml"); plugin.saveResource("resources/internal/configuration/fix_client_visual.yml"); plugin.saveResource("resources/internal/configuration/offset_chars.yml"); plugin.saveResource("resources/internal/configuration/gui.yml"); @@ -413,7 +413,7 @@ public abstract class AbstractPackManager implements PackManager { plugin.saveResource("resources/default/configuration/templates.yml"); plugin.saveResource("resources/default/configuration/categories.yml"); plugin.saveResource("resources/default/configuration/emoji.yml"); - plugin.saveResource("resources/default/configuration/i18n.yml"); + plugin.saveResource("resources/default/configuration/translations.yml"); plugin.saveResource("resources/default/configuration/items/cap.yml"); plugin.saveResource("resources/default/configuration/items/flame_elytra.yml"); plugin.saveResource("resources/default/configuration/items/gui_head.yml"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java index 6a8ec531b..72507ab32 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.plugin; import com.google.gson.JsonElement; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.particle.ParticleType; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java index f38d30c1f..0c0c82726 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java @@ -1,7 +1,9 @@ package net.momirealms.craftengine.core.plugin.compatibility; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.entity.furniture.ExternalModel; import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.Context; import java.util.UUID; @@ -15,6 +17,8 @@ public interface CompatibilityManager { void registerLevelerProvider(String plugin, LevelerProvider provider); + void registerTagResolverProvider(TagResolverProvider provider); + void addLevelerExp(Player player, String plugin, String target, double value); int getLevel(Player player, String plugin, String target); @@ -36,4 +40,6 @@ public interface CompatibilityManager { int getPlayerProtocolVersion(UUID uuid); void executeMMSkill(String skill, float power, Player player); + + TagResolver[] createExternalTagResolvers(Context context); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/TagResolverProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/TagResolverProvider.java new file mode 100644 index 000000000..5bd3213b9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/TagResolverProvider.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.plugin.compatibility; + +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.context.Context; + +public interface TagResolverProvider { + + String name(); + + TagResolver getTagResolver(Context context); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java index 910678475..c4e0966b4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java @@ -1,8 +1,11 @@ package net.momirealms.craftengine.core.plugin.context; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.text.minimessage.*; +import net.momirealms.craftengine.core.util.ArrayUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Optional; @@ -32,12 +35,27 @@ public abstract class AbstractCommonContext implements Context { @NotNull public TagResolver[] tagResolvers() { if (this.tagResolvers == null) { - this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new I18NTag(this), new NamedArgumentTag(this), - new PlaceholderTag(this), new ExpressionTag(this), new GlobalVariableTag(this)}; + this.tagResolvers = getTagResolver(); } return this.tagResolvers; } + @Nullable + protected TagResolver[] getTagResolver() { + return ArrayUtils.mergeNoCopy(getExternalTagResolvers(), getInternalTagResolvers()); + } + + @Nullable + protected TagResolver[] getExternalTagResolvers() { + return CraftEngine.instance().compatibilityManager().createExternalTagResolvers(this); + } + + @NotNull + protected TagResolver[] getInternalTagResolvers() { + return new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new I18NTag(this), new NamedArgumentTag(this), + new PlaceholderTag(this), new ExpressionTag(this), new GlobalVariableTag(this)}; + } + @Override public Optional getOptionalParameter(ContextKey parameter) { if (!this.additionalParameterProviders.isEmpty()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/NetworkTextReplaceContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/NetworkTextReplaceContext.java index 459081eea..1b4bdc5d9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/NetworkTextReplaceContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/NetworkTextReplaceContext.java @@ -1,9 +1,7 @@ package net.momirealms.craftengine.core.plugin.context; -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; -import net.momirealms.craftengine.core.plugin.text.minimessage.*; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -22,13 +20,4 @@ public final class NetworkTextReplaceContext extends PlayerOptionalContext imple public Player player() { return super.player; } - - @Override - public TagResolver[] tagResolvers() { - if (this.tagResolvers == null) { - this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new PlaceholderTag(this), new I18NTag(this), - new NamedArgumentTag(this), new ExpressionTag(this), new GlobalVariableTag(this)}; - } - return this.tagResolvers; - } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java index e38a1668d..252b3c2a1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java @@ -1,9 +1,7 @@ package net.momirealms.craftengine.core.plugin.context; -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; -import net.momirealms.craftengine.core.plugin.text.minimessage.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -63,14 +61,4 @@ public class PlayerOptionalContext extends AbstractChainParameterContext impleme public boolean isPlayerPresent() { return this.player != null; } - - @Override - @NotNull - public TagResolver[] tagResolvers() { - if (this.tagResolvers == null) { - this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new PlaceholderTag(this), new I18NTag(this), - new NamedArgumentTag(this), new ExpressionTag(this), new GlobalVariableTag(this)}; - } - return this.tagResolvers; - } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/LangData.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/LangData.java index 977d20e1d..b677d18a5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/LangData.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/LangData.java @@ -77,7 +77,7 @@ public class LangData { @Override public String toString() { - return "I18NData{" + translations + "}"; + return "LangData{" + translations + "}"; } public static void merge(Map target, Map source) { 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 27b38986a..c66cc68c1 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 @@ -276,7 +276,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", }; + public static final String[] CONFIG_SECTION_NAME = new String[] {"translations", "translation", "l10n", "localization", "i18n", "internationalization"}; @Override public int loadingSequence() { @@ -292,7 +292,7 @@ public class TranslationManagerImpl implements TranslationManager { public void parseSection(Pack pack, Path path, String node, net.momirealms.craftengine.core.util.Key id, Map section) { Locale locale = TranslationManager.parseLocale(id.value()); if (locale == null) { - throw new LocalizedResourceConfigException("warning.config.i18n.unknown_locale"); + throw new LocalizedResourceConfigException("warning.config.translation.unknown_locale"); } Map bundle = new HashMap<>(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/FormattedLine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/FormattedLine.java index a5a2b6d20..ef108b5e4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/FormattedLine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/FormattedLine.java @@ -10,6 +10,8 @@ import net.momirealms.craftengine.core.util.AdventureHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + public interface FormattedLine { TagResolver[] CUSTOM_RESOLVERS = new TagResolver[]{ createDummyResolvers("expr"), @@ -22,6 +24,19 @@ public interface FormattedLine { createDummyResolvers("rel_papi") }; + class Companion { + public static TagResolver[] LATEST_RESOLVERS = CUSTOM_RESOLVERS; + + public static void resetWithCustomResolvers(List customResolvers) { + TagResolver[] resolvers = new TagResolver[customResolvers.size() + CUSTOM_RESOLVERS.length]; + System.arraycopy(CUSTOM_RESOLVERS, 0, resolvers, 0, CUSTOM_RESOLVERS.length); + for (int i = 0; i < customResolvers.size(); i++) { + resolvers[CUSTOM_RESOLVERS.length + i] = createDummyResolvers(customResolvers.get(i)); + } + LATEST_RESOLVERS = resolvers; + } + } + Component parse(net.momirealms.craftengine.core.plugin.context.Context context); private static TagResolver createDummyResolvers(String tag) { @@ -39,7 +54,7 @@ public interface FormattedLine { } static FormattedLine create(String line) { - if (line.equals(AdventureHelper.customMiniMessage().stripTags(line, CUSTOM_RESOLVERS))) { + if (line.equals(AdventureHelper.customMiniMessage().stripTags(line, Companion.LATEST_RESOLVERS))) { return new PreParsedLine(AdventureHelper.miniMessage().deserialize(line)); } else { return new DynamicLine(line); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java index 6b9b9c720..513b3853e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java @@ -12,6 +12,7 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.kyori.adventure.text.serializer.json.JSONOptions; import net.kyori.adventure.text.serializer.json.legacyimpl.NBTLegacyHoverEventSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; import net.momirealms.sparrow.nbt.Tag; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java index 5f060ad46..67580021c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java @@ -42,6 +42,26 @@ public class ArrayUtils { return mergedArray; } + @SuppressWarnings("unchecked") + public static T[] mergeNoCopy(T[] array1, T[] array2) { + if (array1 == null && array2 == null) { + return null; + } + if (array1 == null) { + return array2; + } + if (array2 == null) { + return array1; + } + T[] mergedArray = (T[]) Array.newInstance( + array1.getClass().getComponentType(), + array1.length + array2.length + ); + System.arraycopy(array1, 0, mergedArray, 0, array1.length); + System.arraycopy(array2, 0, mergedArray, array1.length, array2.length); + return mergedArray; + } + public static List splitArray(T[] array, int chunkSize) { List result = new ArrayList<>(); for (int i = 0; i < array.length; i += chunkSize) { diff --git a/gradle.properties b/gradle.properties index db50c4b62..a224f33d7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.64.14 +project_version=0.0.64.15 config_version=49 lang_version=35 project_group=net.momirealms