config fix

This commit is contained in:
lcy0x1
2025-03-02 15:44:45 +08:00
parent a56299bf56
commit adfadd5eb7
10 changed files with 124 additions and 14 deletions

View File

@@ -7,7 +7,7 @@ plugins {
}
version = mod_version
group = 'dev.kxmc'
group = 'dev.xkmc'
repositories {
mavenLocal()

View File

@@ -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

View File

@@ -33,7 +33,12 @@ public interface EnchVal {
ResourceKey<Enchantment> id();
@DataGenOnly
Holder<Enchantment> datagenDirect(RegistrateProvider pvd);
Holder<Enchantment> datagenDirect();
@DataGenOnly
default Holder<Enchantment> datagenDirect(RegistrateProvider pvd) {
return datagenDirect();
}
default Optional<Holder<Enchantment>> safeHolder() {
return Optional.ofNullable(CommonHooks.resolveLookup(Registries.ENCHANTMENT)).flatMap(e -> e.get(id()));
@@ -55,7 +60,7 @@ public interface EnchVal {
Lazy<Builder> builder();
@Override
default Holder<Enchantment> datagenDirect(RegistrateProvider pvd) {
default Holder<Enchantment> datagenDirect() {
var val = builder().get().cache;
if (val == null) throw new IllegalStateException("Enchantment is not built yet");
return new DataGenHolder<>(id(), val);

View File

@@ -12,6 +12,7 @@ public class BaseConfigType<T extends BaseConfig> {
public final PacketHandlerWithConfig parent;
final Map<ResourceLocation, T> configs = new HashMap<>();
final Map<ResourceLocation, T> clientConfigs = new HashMap<>();
protected BaseConfigType(PacketHandlerWithConfig parent, String id, Class<T> cls) {
this.parent = parent;
@@ -26,4 +27,11 @@ public class BaseConfigType<T extends BaseConfig> {
public void afterReload() {
}
public void clientBeforeReload() {
clientConfigs.clear();
}
public void clientAfterReload() {
}
}

View File

@@ -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;

View File

@@ -1,16 +1,23 @@
package dev.xkmc.l2core.serial.config;
import dev.xkmc.l2core.util.ServerProxy;
import net.minecraft.resources.ResourceLocation;
public class MergedConfigType<T extends BaseConfig> extends BaseConfigType<T> {
private T result;
private T result, clientResult;
MergedConfigType(PacketHandlerWithConfig parent, String id, Class<T> 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<T extends BaseConfig> extends BaseConfigType<T> {
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();
}
}

View File

@@ -114,25 +114,30 @@ public class PacketHandlerWithConfig extends PacketHandler {
private <T extends BaseConfig> void addJson(BaseConfigType<T> 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 <T extends BaseConfig> void addConfig(BaseConfigType<T> type, ResourceLocation k, T config) {
private <T extends BaseConfig> void addServerConfig(BaseConfigType<T> type, ResourceLocation k, T config) {
config.id = k;
type.configs.put(k, config);
configs.add(new ConfigInstance(type.id, k, config));
}
private <T extends BaseConfig> void addClientConfig(BaseConfigType<T> type, ResourceLocation k, T config) {
config.id = k;
type.clientConfigs.put(k, config);
}
/**
* Called on client side only
*/
public void apply(ArrayList<ConfigInstance> 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);
}
}

View File

@@ -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<RegistrateNestedProvider> TYPE = ProviderType.registerProvider("l2_custom", RegistrateNestedProvider::new);
private final List<DataProvider> list = new ArrayList<>();
private final AbstractRegistrate<?> reg;
private final DataGenerator gen;
private final CompletableFuture<HolderLookup.Provider> pvd;
public RegistrateNestedProvider(ProviderType.Context<RegistrateNestedProvider> 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<DataGenerator, CompletableFuture<HolderLookup.Provider>, 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";
}
}

View File

@@ -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<MinecraftServer> 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();
}
}

View File

@@ -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<MinecraftServer> getServer() {
return Optional.ofNullable(ServerLifecycleHooks.getCurrentServer());
}
public static boolean isOnClient() {
if (FMLEnvironment.dist == Dist.DEDICATED_SERVER) return false;
return Proxy.isOnClient();
}
}