diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/DistValidate.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/DistValidate.java index d8c00a9c..5f5ddf71 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/DistValidate.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/DistValidate.java @@ -1,14 +1,22 @@ package io.izzel.arclight.common.mod.util; +import io.izzel.arclight.common.mod.ArclightMod; import io.izzel.arclight.i18n.ArclightConfig; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.WorldGenRegion; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class DistValidate { + private static final Marker MARKER = MarkerManager.getMarker("EXT_LOGIC"); + public static boolean isValid(UseOnContext context) { return context != null && isValid(context.getLevel()); } @@ -26,6 +34,17 @@ public class DistValidate { private static boolean isLogicWorld(LevelAccessor level) { var cl = level.getClass(); return cl == ServerLevel.class || cl == WorldGenRegion.class - || ArclightConfig.spec().getCompat().getExtraLogicWorlds().contains(cl.getName()); + || isLogicWorld(cl); + } + + private static final Map, Boolean> SEEN_CLASSES = new ConcurrentHashMap<>(); + + private static boolean isLogicWorld(Class cl) { + return SEEN_CLASSES.computeIfAbsent(cl, c -> { + var name = c.getName(); + var result = ArclightConfig.spec().getCompat().getExtraLogicWorlds().contains(cl.getName()); + ArclightMod.LOGGER.warn(MARKER, "Level class {} treated as logic world: {}", name, result); + return result; + }); } } diff --git a/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java b/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java index dadba0e2..21fd5521 100644 --- a/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java +++ b/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java @@ -3,9 +3,9 @@ package io.izzel.arclight.i18n.conf; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; +import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Set; @ConfigSerializable public class CompatSpec { @@ -16,12 +16,11 @@ public class CompatSpec { @Setting("entity-property-overrides") private Map entities; - // todo Enable this by default in 1.17 @Setting("symlink-world") private boolean symlinkWorld; @Setting("extra-logic-worlds") - private Set extraLogicWorlds; + private List extraLogicWorlds; public Map getMaterials() { return materials; @@ -43,7 +42,7 @@ public class CompatSpec { return symlinkWorld; } - public Set getExtraLogicWorlds() { + public List getExtraLogicWorlds() { return extraLogicWorlds; } } diff --git a/i18n-config/src/main/resources/META-INF/arclight.conf b/i18n-config/src/main/resources/META-INF/arclight.conf index 585685d7..80e51f38 100644 --- a/i18n-config/src/main/resources/META-INF/arclight.conf +++ b/i18n-config/src/main/resources/META-INF/arclight.conf @@ -14,7 +14,9 @@ compatibility { entity-property-overrides { } symlink-world = false - extra-logic-worlds = [] + extra-logic-worlds = [ + "com.example.mod.ExtraLogicWorld" + ] } async-catcher { dump = true diff --git a/i18n-config/src/main/resources/META-INF/i18n/en_us.conf b/i18n-config/src/main/resources/META-INF/i18n/en_us.conf index 7110de39..e9f781ba 100644 --- a/i18n-config/src/main/resources/META-INF/i18n/en_us.conf +++ b/i18n-config/src/main/resources/META-INF/i18n/en_us.conf @@ -111,5 +111,9 @@ comments { " and cause data loss on plugins relying world names" "See https://github.com/IzzelAliz/Arclight/wiki/World-Symlink for more detail" ] + extra-logic-worlds.comment = [ + "Extra worlds running logic" + "If any mods do not function well, try search class names in logs related to [EXT_LOGIC] and add them here" + ] } } diff --git a/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf b/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf index 8b082b23..befd005d 100644 --- a/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf +++ b/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf @@ -111,5 +111,9 @@ comments { "变更此设置会导致模组世界名称变化,可能造成依赖世界名称的插件数据丢失" "参见 https://github.com/IzzelAliz/Arclight/wiki/World-Symlink" ] + extra-logic-worlds.comment = [ + "额外运行逻辑的维度类名" + "如果有模组世界/功能运行不正常,尝试在日志中搜索和 [EXT_LOGIC] 有关的对应类名并添加" + ] } }