Skip to content

Commit 3877b47

Browse files
committed
Commit first to start to fix some errro
1 parent 71cca62 commit 3877b47

File tree

7 files changed

+153
-5
lines changed

7 files changed

+153
-5
lines changed

build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ dependencies {
4949
implementation include('com.electronwill.night-config:core:3.6.6')
5050
implementation include('com.electronwill.night-config:toml:3.6.6')
5151
implementation include('com.electronwill.night-config:json:3.6.6')
52-
modApi("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_version}") {
53-
exclude(group: "net.fabricmc.fabric-api")
54-
}
52+
modImplementation("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_version}")
53+
//modImplementation "me.shedaniel.cloth:cloth-config-fabric:${project.cloth_version}"
54+
//include "me.shedaniel.cloth:cloth-config-fabric:${project.cloth_version}"
5555
}
5656

5757
processResources {

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ deps.modmenu=13.0.3
2121
deps.cicada=0.13.0+1.21.4
2222
deps.cardinal-components-api=6.3.1
2323
modmenu_version=13.0.3
24-
cloth_version=18.0.145
24+
cloth_version=17.0.144

src/client/java/com/junnio/anticonfig/AnticonfigClient.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import com.junnio.anticonfig.config.ConfigSync;
44
import com.junnio.anticonfig.config.ModConfig;
5+
import me.shedaniel.clothconfig2.gui.ClothConfigScreen;
56
import net.fabricmc.api.ClientModInitializer;
67
import net.fabricmc.fabric.api.client.networking.v1.ClientLoginNetworking;
8+
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
79
import net.minecraft.network.PacketByteBuf;
810
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
911
import org.slf4j.Logger;
@@ -14,7 +16,7 @@
1416
import java.util.concurrent.CompletableFuture;
1517

1618
public class AnticonfigClient implements ClientModInitializer {
17-
private static final Logger LOGGER = LoggerFactory.getLogger("anticonfig");
19+
private static final Logger LOGGER = LoggerFactory.getLogger("ClientModInitializer");
1820

1921
@Override
2022
public void onInitializeClient() {
@@ -49,5 +51,13 @@ public void onInitializeClient() {
4951

5052
return CompletableFuture.completedFuture(response);
5153
});
54+
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
55+
if (screen instanceof ClothConfigScreen) {
56+
ScreenEvents.remove(screen).register((closedScreen) -> {
57+
System.out.println("Cloth Config screen closed!");
58+
ConfigScreenHandler.onConfigScreenClose();
59+
});
60+
}
61+
});
5262
}
5363
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.junnio.anticonfig;
2+
3+
import com.junnio.anticonfig.config.ConfigSync;
4+
import com.junnio.anticonfig.config.ModConfig;
5+
import com.junnio.anticonfig.net.ConfigScreenSync;
6+
import com.junnio.anticonfig.net.ConfigSyncPayload;
7+
import me.shedaniel.clothconfig2.api.ConfigScreen;
8+
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
9+
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
10+
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
11+
import net.minecraft.network.PacketByteBuf;
12+
13+
import java.util.HashMap;
14+
import java.util.Map;
15+
16+
public class ConfigScreenHandler {
17+
public static void init() {
18+
// Register the payload type on client side
19+
PayloadTypeRegistry.playC2S().register(ConfigSyncPayload.ID, ConfigSyncPayload.CODEC);
20+
}
21+
22+
public static void onConfigScreenClose() {
23+
// Create config map
24+
Map<String, String> configsToSync = new HashMap<>();
25+
ModConfig config = ModConfig.getInstance();
26+
27+
// Gather current config states
28+
for (String filename : config.getConfigFilesToCheck()) {
29+
String content = ConfigSync.getConfigContent(filename);
30+
if (content != null) {
31+
configsToSync.put(filename, content);
32+
}
33+
}
34+
35+
// Create and send payload
36+
ConfigSyncPayload payload = new ConfigSyncPayload(configsToSync);
37+
ClientPlayNetworking.send(payload);
38+
}
39+
}

src/main/java/com/junnio/anticonfig/Anticonfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.junnio.anticonfig.config.ConfigSync;
44
import com.junnio.anticonfig.config.ModConfig;
5+
import com.junnio.anticonfig.net.ConfigScreenSync;
56
import com.junnio.anticonfig.net.NetworkManager;
67
import net.fabricmc.api.ModInitializer;
78
import net.minecraft.util.Identifier;
@@ -17,6 +18,7 @@ public void onInitialize() {
1718
ModConfig.load();
1819
NetworkManager.init();
1920
ConfigSync.registerConfigsFromModConfig();
21+
ConfigScreenSync.initServer();
2022
}
2123

2224
public static Identifier id(String path) {
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.junnio.anticonfig.net;
2+
3+
import com.electronwill.nightconfig.core.file.FileConfig;
4+
import com.electronwill.nightconfig.json.JsonFormat;
5+
import com.electronwill.nightconfig.toml.TomlFormat;
6+
import com.junnio.anticonfig.config.ModConfig;
7+
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
8+
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
9+
import net.fabricmc.loader.api.FabricLoader;
10+
import net.minecraft.text.Text;
11+
12+
import java.nio.file.Files;
13+
import java.nio.file.Path;
14+
import java.util.HashMap;
15+
import java.util.Map;
16+
17+
import static net.fabricmc.fabric.impl.networking.NetworkingImpl.LOGGER;
18+
19+
public class ConfigScreenSync {
20+
public static void initServer() {
21+
// Register the payload type
22+
PayloadTypeRegistry.playC2S().register(ConfigSyncPayload.ID, ConfigSyncPayload.CODEC);
23+
24+
// Register the receiver
25+
ServerPlayNetworking.registerGlobalReceiver(ConfigSyncPayload.ID, (payload, context) -> {
26+
context.server().execute(() -> {
27+
boolean mismatch = false;
28+
StringBuilder mismatched = new StringBuilder();
29+
Map<String, String> serverConfigs = new HashMap<>();
30+
ModConfig config = ModConfig.getInstance();
31+
Path configDir = FabricLoader.getInstance().getConfigDir();
32+
33+
for (String filename : config.getConfigFilesToCheck()) {
34+
Path configPath = configDir.resolve(filename);
35+
if (Files.exists(configPath)) {
36+
FileConfig fileConfig;
37+
if (filename.endsWith(".json")) {
38+
fileConfig = FileConfig.of(configPath, JsonFormat.minimalInstance());
39+
} else if (filename.endsWith(".toml")) {
40+
fileConfig = FileConfig.of(configPath, TomlFormat.instance());
41+
} else {
42+
LOGGER.warn("Unsupported config format for file: {}", filename);
43+
continue;
44+
}
45+
fileConfig.load();
46+
serverConfigs.put(filename, fileConfig.valueMap().toString());
47+
}
48+
}
49+
50+
if (mismatch) {
51+
String files = mismatched.substring(0, mismatched.length() - 2);
52+
context.player().sendMessage(Text.literal("§cConfig mismatch detected! Some settings will not take effect."));
53+
}
54+
});
55+
});
56+
}
57+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.junnio.anticonfig.net;
2+
3+
import com.mojang.serialization.Codec;
4+
import com.mojang.serialization.codecs.RecordCodecBuilder;
5+
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
6+
import net.minecraft.network.PacketByteBuf;
7+
import net.minecraft.network.RegistryByteBuf;
8+
import net.minecraft.network.codec.PacketCodec;
9+
import net.minecraft.network.codec.PacketCodecs;
10+
import net.minecraft.network.packet.CustomPayload;
11+
import net.minecraft.util.Identifier;
12+
13+
import java.util.ArrayList;
14+
import java.util.HashMap;
15+
import java.util.List;
16+
import java.util.Map;
17+
18+
public record ConfigSyncPayload(Map<String, String> configs) implements CustomPayload {
19+
public static final CustomPayload.Id<ConfigSyncPayload> ID =
20+
new CustomPayload.Id<>(Identifier.of("anticonfig", "config_sync"));
21+
private static final PacketCodec<RegistryByteBuf, List<String>> CONFIG_FILES_CODEC =
22+
PacketCodecs.collection(ArrayList::new, PacketCodecs.STRING);
23+
24+
// Then handle the map of config contents
25+
private static final PacketCodec<RegistryByteBuf, Map<String, String>> CONFIG_MAP_CODEC =
26+
PacketCodecs.map(
27+
HashMap::new,
28+
PacketCodecs.STRING, // filename
29+
PacketCodecs.STRING // content
30+
);
31+
32+
// Final codec that handles the complete payload
33+
public static final PacketCodec<RegistryByteBuf, ConfigSyncPayload> CODEC = CONFIG_MAP_CODEC
34+
.xmap(ConfigSyncPayload::new, ConfigSyncPayload::configs);
35+
36+
@Override
37+
public CustomPayload.Id<?> getId() {
38+
return ID;
39+
}
40+
}

0 commit comments

Comments
 (0)