9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-26 02:19:23 +00:00

feat(client-mod): 添加模组配置菜单功能

This commit is contained in:
jhqwqmc
2025-03-24 16:39:12 +08:00
parent d05c0fe689
commit 19f49073a7
10 changed files with 150 additions and 9 deletions

View File

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

View File

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

View File

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

View File

@@ -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<Block> 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)) {

View File

@@ -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<Identifier, Integer> map = YamlUtils.loadMappingsAndAdditionalBlocks();
System.out.println("Loaded " + map.size() + " additional real blocks.");
for (Map.Entry<Identifier, Integer> 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<String, Object>();
data.put("enable-network", ModConfig.enableNetwork);
try (Writer writer = Files.newBufferedWriter(CONFIG_PATH)) {
yaml.dump(data, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

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

View File

@@ -0,0 +1,6 @@
{
"title.craftengine.config": "CraftEngine设置",
"category.craftengine.general": "通用",
"option.craftengine.enable_network": "启用服务器内自定义方块",
"tooltip.craftengine.enable_network": "需要重新进入服务器即可生效"
}

View File

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