diff --git a/client-mod/build.gradle.kts b/client-mod/build.gradle.kts index 9f6bcae72..2eab55f43 100644 --- a/client-mod/build.gradle.kts +++ b/client-mod/build.gradle.kts @@ -8,6 +8,8 @@ group = property("project_group")!! val project_version: String by project val latest_minecraft_version: String by project val loader_version: String by project +var modmenu_version = property("modmenu_version") +var cloth_version = property("cloth_version") base { archivesName.set("craft-engine-fabric-mod") @@ -50,11 +52,18 @@ loom { } } +repositories { + maven("https://maven.shedaniel.me/") + maven("https://maven.terraformersmc.com/releases/") +} + dependencies { minecraft("com.mojang:minecraft:${property("latest_minecraft_version")}") mappings("net.fabricmc:yarn:${property("yarn_mappings")}:v2") modImplementation("net.fabricmc:fabric-loader:${property("loader_version")}") modImplementation("net.fabricmc.fabric-api:fabric-api:${property("fabric_version")}") + modApi("me.shedaniel.cloth:cloth-config-fabric:${property("cloth_version")}") + modApi("com.terraformersmc:modmenu:${property("modmenu_version")}") add("shadow", "org.yaml:snakeyaml:2.4") } @@ -69,7 +78,9 @@ tasks.processResources { expand( "version" to project_version, "minecraft_version" to latest_minecraft_version, - "loader_version" to loader_version + "loader_version" to loader_version, + "modmenu_version" to modmenu_version, + "cloth_version" to cloth_version ) } } diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java index b7abd9401..f52a736a5 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java @@ -2,13 +2,21 @@ package net.momirealms.craftEngineFabricMod.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.render.RenderLayer; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; +import net.momirealms.craftEngineFabricMod.client.config.ModConfig; import net.momirealms.craftEngineFabricMod.client.network.CraftEnginePayload; import net.momirealms.craftEngineFabricMod.client.util.BlockUtils; +import net.momirealms.craftEngineFabricMod.util.YamlUtils; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Map; public class CraftEngineFabricModClient implements ClientModInitializer { public static final String MOD_ID = "craftengine"; @@ -16,7 +24,6 @@ public class CraftEngineFabricModClient implements ClientModInitializer { @Override public void onInitializeClient() { PayloadTypeRegistry.playS2C().register(CraftEnginePayload.ID, CraftEnginePayload.CODEC); - ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> {}); Registries.BLOCK.forEach(block -> { Identifier id = Registries.BLOCK.getId(block); if (id.getNamespace().equals(CraftEngineFabricModClient.MOD_ID)) { @@ -26,5 +33,12 @@ public class CraftEngineFabricModClient implements ClientModInitializer { } } }); + ClientTickEvents.START_CLIENT_TICK.register(client -> { + if (!ModConfig.enableNetwork) { + ClientPlayNetworking.unregisterGlobalReceiver(CraftEnginePayload.ID.id()); + return; + } + ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> {}); + }); } } diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModConfig.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModConfig.java new file mode 100644 index 000000000..3e4342517 --- /dev/null +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModConfig.java @@ -0,0 +1,35 @@ +package net.momirealms.craftEngineFabricMod.client.config; + +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigCategory; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class ModConfig { + public static boolean enableNetwork = true; + + public static Screen getConfigScreen(Screen parent) { + ConfigBuilder builder = ConfigBuilder.create() + .setParentScreen(parent) + .setTitle(Text.translatable("title.craftengine.config")); + + ConfigCategory general = builder.getOrCreateCategory(Text.translatable("category.craftengine.general")); + ConfigEntryBuilder entryBuilder = builder.entryBuilder(); + + general.addEntry(entryBuilder.startBooleanToggle( + Text.translatable("option.craftengine.enable_network") + .formatted(Formatting.WHITE), + enableNetwork) + .setDefaultValue(true) + .setSaveConsumer(newValue -> enableNetwork = newValue) + .setTooltip( + Text.translatable("tooltip.craftengine.enable_network") + .formatted(Formatting.GRAY) + ) + .build()); + + return builder.build(); + } +} diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModMenuIntegration.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModMenuIntegration.java new file mode 100644 index 000000000..730b58a45 --- /dev/null +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModMenuIntegration.java @@ -0,0 +1,11 @@ +package net.momirealms.craftEngineFabricMod.client.config; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; + +public class ModMenuIntegration implements ModMenuApi { + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return ModConfig::getConfigScreen; + } +} diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java similarity index 96% rename from client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java rename to client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java index 3d0e664a7..6b3eb2805 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java @@ -21,7 +21,7 @@ import java.util.LinkedHashMap; import java.util.Map; public class YamlUtils { - private static final String CONFIG_DIR = "config/craft-engine-fabric-mod/"; + public static final String CONFIG_DIR = "config/craft-engine-fabric-mod/"; private static final Yaml yaml = new Yaml(); private static final RegistryWrapper registryWrapper = BuiltinRegistries.createWrapperLookup().getOrThrow(RegistryKeys.BLOCK); @@ -31,6 +31,10 @@ public class YamlUtils { } } + public static void saveConfig(Map config, Path filePath) throws IOException { + Files.writeString(filePath, yaml.dump(config)); + } + public static void ensureConfigFile(String fileName) throws IOException { Path configDir = Path.of(CONFIG_DIR); if (!Files.exists(configDir)) { diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java index ad91ee19d..937c3116b 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java @@ -1,25 +1,37 @@ package net.momirealms.craftEngineFabricMod; import net.fabricmc.api.ModInitializer; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.BlockState; import net.minecraft.util.Identifier; +import net.momirealms.craftEngineFabricMod.client.config.ModConfig; import net.momirealms.craftEngineFabricMod.util.BlockUtils; import net.momirealms.craftEngineFabricMod.util.LoggerFilter; import net.momirealms.craftEngineFabricMod.util.RegisterBlocks; import net.momirealms.craftEngineFabricMod.util.YamlUtils; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; import java.io.IOException; +import java.io.InputStream; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Map; public class CraftEngineFabricMod implements ModInitializer { + private static final Path CONFIG_PATH = FabricLoader.getInstance().getConfigDir().resolve("craft-engine-fabric-mod/config.yml"); public static final String MOD_ID = "craftengine"; @Override public void onInitialize() { + loadConfig(); + Runtime.getRuntime().addShutdownHook(new Thread(this::saveConfig)); LoggerFilter.filter(); try { YamlUtils.ensureConfigFile("additional-real-blocks.yml"); YamlUtils.ensureConfigFile("mappings.yml"); + YamlUtils.ensureConfigFile("config.yml"); Map map = YamlUtils.loadMappingsAndAdditionalBlocks(); System.out.println("Loaded " + map.size() + " additional real blocks."); for (Map.Entry entry : map.entrySet()) { @@ -37,4 +49,35 @@ public class CraftEngineFabricMod implements ModInitializer { e.printStackTrace(); } } + + @SuppressWarnings("unchecked") + private void loadConfig() { + if (!Files.exists(CONFIG_PATH)) { + saveConfig(); + return; + } + + try (InputStream inputStream = Files.newInputStream(CONFIG_PATH)) { + Yaml yaml = new Yaml(); + var config = yaml.loadAs(inputStream, java.util.Map.class); + ModConfig.enableNetwork = (Boolean) config.getOrDefault("enable-network", true); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void saveConfig() { + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + Yaml yaml = new Yaml(options); + + var data = new java.util.HashMap(); + data.put("enable-network", ModConfig.enableNetwork); + + try (Writer writer = Files.newBufferedWriter(CONFIG_PATH)) { + yaml.dump(data, writer); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json new file mode 100644 index 000000000..fccc82ec9 --- /dev/null +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json @@ -0,0 +1,6 @@ +{ + "title.craftengine.config": "CraftEngine Settings", + "category.craftengine.general": "General", + "option.craftengine.enable_network": "Enable custom blocks in server", + "tooltip.craftengine.enable_network": "You need to re-enter the server to take effect" +} \ No newline at end of file diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json new file mode 100644 index 000000000..ff5183d31 --- /dev/null +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json @@ -0,0 +1,6 @@ +{ + "title.craftengine.config": "CraftEngine设置", + "category.craftengine.general": "通用", + "option.craftengine.enable_network": "启用服务器内自定义方块", + "tooltip.craftengine.enable_network": "需要重新进入服务器即可生效" +} \ No newline at end of file diff --git a/client-mod/src/main/resources/fabric.mod.json b/client-mod/src/main/resources/fabric.mod.json index e018bd02a..646ff1fc5 100644 --- a/client-mod/src/main/resources/fabric.mod.json +++ b/client-mod/src/main/resources/fabric.mod.json @@ -3,10 +3,16 @@ "id": "craft-engine-fabric-mod", "version": "${version}", - "name": "craft-engine-fabric-mod", - "description": "", - "authors": [], - "contact": {}, + "name": "CraftEngine Fabric Mod", + "description": "CraftEngine Fabric Mod", + "authors": [ + "jhqwqmc" + ], + "contact": { + "name": "CraftEngine", + "homepage": "https://github.com/Xiao-MoMi/craft-engine", + "issues": "https://github.com/Xiao-MoMi/craft-engine/issues" + }, "license": "GPL-3.0", "icon": "assets/craft-engine-fabric-mod/icon.png", @@ -14,12 +20,15 @@ "environment": "client", "entrypoints": { "client": ["net.momirealms.craftEngineFabricMod.client.CraftEngineFabricModClient"], - "main": ["net.momirealms.craftEngineFabricMod.CraftEngineFabricMod"] + "main": ["net.momirealms.craftEngineFabricMod.CraftEngineFabricMod"], + "modmenu": ["net.momirealms.craftEngineFabricMod.client.config.ModMenuIntegration"] }, "depends": { "fabricloader": ">=${loader_version}", "fabric": "*", - "minecraft": "${minecraft_version}" + "minecraft": "${minecraft_version}", + "modmenu": ">=${modmenu_version}", + "cloth-config": ">=${cloth_version}" } } diff --git a/gradle.properties b/gradle.properties index f4ca831c9..283ccaa6d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -51,6 +51,8 @@ anti_grief_version=0.13 fabric_version=0.119.2+1.21.4 yarn_mappings=1.21.4+build.8 loader_version=0.16.10 +modmenu_version=13.0.3 +cloth_version=17.0.144 org.gradle.jvmargs=-Xmx1G # Proxy settings