From adfadd5eb74e3f3b7ea6ea03049e5089bce92c83 Mon Sep 17 00:00:00 2001 From: lcy0x1 Date: Sun, 2 Mar 2025 15:44:45 +0800 Subject: [PATCH] config fix --- build.gradle | 2 +- gradle.properties | 4 +- .../xkmc/l2core/init/reg/ench/EnchVal.java | 9 +++- .../l2core/serial/config/BaseConfigType.java | 8 +++ .../serial/config/ConfigDataProvider.java | 1 + .../serial/config/MergedConfigType.java | 28 +++++++++- .../config/PacketHandlerWithConfig.java | 15 ++++-- .../config/RegistrateNestedProvider.java | 53 +++++++++++++++++++ src/main/java/dev/xkmc/l2core/util/Proxy.java | 7 ++- .../dev/xkmc/l2core/util/ServerProxy.java | 11 ++++ 10 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 src/main/java/dev/xkmc/l2core/serial/config/RegistrateNestedProvider.java diff --git a/build.gradle b/build.gradle index ac532a7..558064f 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ plugins { } version = mod_version -group = 'dev.kxmc' +group = 'dev.xkmc' repositories { mavenLocal() diff --git a/gradle.properties b/gradle.properties index f1fa1f0..271658f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ neogradle.subsystems.parchment.mappingsVersion=2024.06.02 minecraft_version=1.21.1 minecraft_version_range=[1.21.1,1.22) -neo_version=21.1.61 +neo_version=21.1.93 neo_version_range=[21.1.4,) loader_version_range=[2,) @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=l2core mod_name=L2Core mod_license=LGPL-2.1 -mod_version=3.0.8+3 +mod_version=3.0.8+8 mod_group_id=dev.xkmc mod_authors=lcy0x1 mod_description=Core Library mod for all L2 mods diff --git a/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchVal.java b/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchVal.java index 20a27df..61ce1a2 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchVal.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchVal.java @@ -33,7 +33,12 @@ public interface EnchVal { ResourceKey id(); @DataGenOnly - Holder datagenDirect(RegistrateProvider pvd); + Holder datagenDirect(); + + @DataGenOnly + default Holder datagenDirect(RegistrateProvider pvd) { + return datagenDirect(); + } default Optional> safeHolder() { return Optional.ofNullable(CommonHooks.resolveLookup(Registries.ENCHANTMENT)).flatMap(e -> e.get(id())); @@ -55,7 +60,7 @@ public interface EnchVal { Lazy builder(); @Override - default Holder datagenDirect(RegistrateProvider pvd) { + default Holder datagenDirect() { var val = builder().get().cache; if (val == null) throw new IllegalStateException("Enchantment is not built yet"); return new DataGenHolder<>(id(), val); diff --git a/src/main/java/dev/xkmc/l2core/serial/config/BaseConfigType.java b/src/main/java/dev/xkmc/l2core/serial/config/BaseConfigType.java index 4e56d5f..28fa912 100644 --- a/src/main/java/dev/xkmc/l2core/serial/config/BaseConfigType.java +++ b/src/main/java/dev/xkmc/l2core/serial/config/BaseConfigType.java @@ -12,6 +12,7 @@ public class BaseConfigType { public final PacketHandlerWithConfig parent; final Map configs = new HashMap<>(); + final Map clientConfigs = new HashMap<>(); protected BaseConfigType(PacketHandlerWithConfig parent, String id, Class cls) { this.parent = parent; @@ -26,4 +27,11 @@ public class BaseConfigType { public void afterReload() { } + public void clientBeforeReload() { + clientConfigs.clear(); + } + + public void clientAfterReload() { + } + } diff --git a/src/main/java/dev/xkmc/l2core/serial/config/ConfigDataProvider.java b/src/main/java/dev/xkmc/l2core/serial/config/ConfigDataProvider.java index 83a6f1d..af304d3 100644 --- a/src/main/java/dev/xkmc/l2core/serial/config/ConfigDataProvider.java +++ b/src/main/java/dev/xkmc/l2core/serial/config/ConfigDataProvider.java @@ -1,6 +1,7 @@ package dev.xkmc.l2core.serial.config; import com.google.gson.JsonElement; +import com.tterrag.registrate.providers.ProviderType; import dev.xkmc.l2serial.serialization.codec.JsonCodec; import net.minecraft.core.HolderLookup; import net.minecraft.data.CachedOutput; diff --git a/src/main/java/dev/xkmc/l2core/serial/config/MergedConfigType.java b/src/main/java/dev/xkmc/l2core/serial/config/MergedConfigType.java index a8b19c1..0ca4e03 100644 --- a/src/main/java/dev/xkmc/l2core/serial/config/MergedConfigType.java +++ b/src/main/java/dev/xkmc/l2core/serial/config/MergedConfigType.java @@ -1,16 +1,23 @@ package dev.xkmc.l2core.serial.config; +import dev.xkmc.l2core.util.ServerProxy; import net.minecraft.resources.ResourceLocation; public class MergedConfigType extends BaseConfigType { - private T result; + private T result, clientResult; MergedConfigType(PacketHandlerWithConfig parent, String id, Class cls) { super(parent, id, cls); } T load() { + if (ServerProxy.isOnClient()) + return loadClient(); + return loadServer(); + } + + T loadServer() { if (result != null) { return result; } @@ -19,11 +26,28 @@ public class MergedConfigType extends BaseConfigType { return result; } + T loadClient() { + if (clientResult != null) { + return clientResult; + } + clientResult = new ConfigMerger<>(cls).apply(clientConfigs.values()); + clientResult.id = ResourceLocation.fromNamespaceAndPath(parent.modid, id); + return clientResult; + } + @Override public void afterReload() { result = null; if (cls.isAnnotationPresent(ConfigLoadOnStart.class)) { - load(); + loadServer(); + } + } + + @Override + public void clientAfterReload() { + clientResult = null; + if (cls.isAnnotationPresent(ConfigLoadOnStart.class)) { + loadClient(); } } diff --git a/src/main/java/dev/xkmc/l2core/serial/config/PacketHandlerWithConfig.java b/src/main/java/dev/xkmc/l2core/serial/config/PacketHandlerWithConfig.java index ee74045..db844fb 100644 --- a/src/main/java/dev/xkmc/l2core/serial/config/PacketHandlerWithConfig.java +++ b/src/main/java/dev/xkmc/l2core/serial/config/PacketHandlerWithConfig.java @@ -114,25 +114,30 @@ public class PacketHandlerWithConfig extends PacketHandler { private void addJson(BaseConfigType type, ResourceLocation k, JsonElement v) { T config = new JsonCodec(getRegistryLookup()).from(v, type.cls, null); if (config != null) { - addConfig(type, k, config); + addServerConfig(type, k, config); } } - private void addConfig(BaseConfigType type, ResourceLocation k, T config) { + private void addServerConfig(BaseConfigType type, ResourceLocation k, T config) { config.id = k; type.configs.put(k, config); configs.add(new ConfigInstance(type.id, k, config)); } + private void addClientConfig(BaseConfigType type, ResourceLocation k, T config) { + config.id = k; + type.clientConfigs.put(k, config); + } + /** * Called on client side only */ public void apply(ArrayList list) { - listener_before.forEach(Runnable::run); + types.values().forEach(BaseConfigType::clientBeforeReload); for (var e : list) { - addConfig(types.get(e.name), e.id(), Wrappers.cast(e.config)); + addClientConfig(types.get(e.name), e.id(), Wrappers.cast(e.config)); } - listener_after.forEach(Runnable::run); + types.values().forEach(BaseConfigType::clientAfterReload); } } diff --git a/src/main/java/dev/xkmc/l2core/serial/config/RegistrateNestedProvider.java b/src/main/java/dev/xkmc/l2core/serial/config/RegistrateNestedProvider.java new file mode 100644 index 0000000..52dd754 --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/serial/config/RegistrateNestedProvider.java @@ -0,0 +1,53 @@ +package dev.xkmc.l2core.serial.config; + +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.providers.ProviderType; +import com.tterrag.registrate.providers.RegistrateProvider; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; +import net.neoforged.fml.LogicalSide; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.BiFunction; + +public class RegistrateNestedProvider implements RegistrateProvider { + + public static final ProviderType TYPE = ProviderType.registerProvider("l2_custom", RegistrateNestedProvider::new); + + private final List list = new ArrayList<>(); + private final AbstractRegistrate reg; + private final DataGenerator gen; + private final CompletableFuture pvd; + + public RegistrateNestedProvider(ProviderType.Context ctx) { + this.reg = ctx.parent(); + this.gen = ctx.event().getGenerator(); + this.pvd = ctx.provider(); + } + + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } + + public RegistrateNestedProvider add(BiFunction, DataProvider> factory) { + list.add(factory.apply(gen, pvd)); + return this; + } + + @Override + public CompletableFuture run(CachedOutput cachedOutput) { + reg.genData(TYPE, this); + return CompletableFuture.allOf(list.stream().map(e -> e.run(cachedOutput)).toArray(CompletableFuture[]::new)); + } + + @Override + public String getName() { + return "Custom Registrate Provider"; + } + +} diff --git a/src/main/java/dev/xkmc/l2core/util/Proxy.java b/src/main/java/dev/xkmc/l2core/util/Proxy.java index 038e0ce..5a6aefe 100644 --- a/src/main/java/dev/xkmc/l2core/util/Proxy.java +++ b/src/main/java/dev/xkmc/l2core/util/Proxy.java @@ -1,13 +1,12 @@ package dev.xkmc.l2core.util; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.core.RegistryAccess; import net.minecraft.server.MinecraftServer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.server.ServerLifecycleHooks; @@ -36,6 +35,7 @@ public class Proxy { return null; } + @Deprecated public static Optional getServer() { return Optional.ofNullable(ServerLifecycleHooks.getCurrentServer()); } @@ -45,4 +45,7 @@ public class Proxy { return Minecraft.getInstance().player; } + static boolean isOnClient() { + return getServer().isEmpty() || RenderSystem.isOnRenderThread(); + } } diff --git a/src/main/java/dev/xkmc/l2core/util/ServerProxy.java b/src/main/java/dev/xkmc/l2core/util/ServerProxy.java index 7b018e9..30ac7af 100644 --- a/src/main/java/dev/xkmc/l2core/util/ServerProxy.java +++ b/src/main/java/dev/xkmc/l2core/util/ServerProxy.java @@ -1,12 +1,14 @@ package dev.xkmc.l2core.util; import net.minecraft.core.RegistryAccess; +import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.server.ServerLifecycleHooks; import javax.annotation.Nullable; +import java.util.Optional; public class ServerProxy { @@ -25,4 +27,13 @@ public class ServerProxy { return null; } + public static Optional getServer() { + return Optional.ofNullable(ServerLifecycleHooks.getCurrentServer()); + } + + public static boolean isOnClient() { + if (FMLEnvironment.dist == Dist.DEDICATED_SERVER) return false; + return Proxy.isOnClient(); + } + }