From 54f32cf7d7935165238e341ca60f5e69a3ef1977 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Fri, 3 Dec 2021 17:41:17 +0800 Subject: [PATCH] New option: extra logic worlds Mods like "create" make use of level wrappers to implement functions which breaks Arclight. By default, Arclight prevents these levels(side from ServerLevel and WorldGenRegion) firing Bukkit events. If any mods extends these two classes and use them not as a wrapper, users need add class names to this option. --- .../common/mod/util/DistValidate.java | 21 ++++++++++++++++++- .../izzel/arclight/i18n/conf/CompatSpec.java | 7 +++---- .../src/main/resources/META-INF/arclight.conf | 4 +++- .../main/resources/META-INF/i18n/en_us.conf | 4 ++++ .../main/resources/META-INF/i18n/zh_cn.conf | 4 ++++ 5 files changed, 34 insertions(+), 6 deletions(-) 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] 有关的对应类名并添加" + ] } }