mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-26 10:29:20 +00:00
feat(client-mod): 添加模组配置菜单功能
This commit is contained in:
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) -> {});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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)) {
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"title.craftengine.config": "CraftEngine设置",
|
||||
"category.craftengine.general": "通用",
|
||||
"option.craftengine.enable_network": "启用服务器内自定义方块",
|
||||
"tooltip.craftengine.enable_network": "需要重新进入服务器即可生效"
|
||||
}
|
||||
@@ -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}"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user