[coat-bridge] Implement first version of Tweed Coat bridge

This commit is contained in:
2025-10-31 14:07:38 +01:00
parent f514894c9c
commit 7c625e6cca
27 changed files with 1118 additions and 2 deletions

View File

@@ -0,0 +1,89 @@
package de.siphalor.tweed5.coat.bridge.testmod;
import de.siphalor.amecs.api.PriorityKeyBinding;
import de.siphalor.coat.screen.ConfigScreen;
import de.siphalor.tweed5.coat.bridge.api.ConfigScreenCreateParams;
import de.siphalor.tweed5.coat.bridge.api.TweedCoatBridgeExtension;
import de.siphalor.tweed5.coat.bridge.api.TweedCoatMappers;
import de.siphalor.tweed5.core.api.container.ConfigContainer;
import de.siphalor.tweed5.data.hjson.HjsonSerde;
import de.siphalor.tweed5.data.hjson.HjsonWriter;
import de.siphalor.tweed5.fabric.helper.api.FabricConfigContainerHelper;
import de.siphalor.tweed5.weaver.pojo.impl.weaving.TweedPojoWeaverBootstrapper;
import lombok.extern.apachecommons.CommonsLog;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.network.chat.Component;
import java.util.Arrays;
@CommonsLog
public class TweedCoatBridgeTestMod implements ClientModInitializer {
public static final String MOD_ID = "tweed5_coat_bridge_testmod";
private static final TweedCoatBridgeTestModConfig DEFAULT_CONFIG_VALUE = new TweedCoatBridgeTestModConfig();
private ConfigContainer<TweedCoatBridgeTestModConfig> configContainer;
private TweedCoatBridgeExtension configCoatBridgeExtension;
private FabricConfigContainerHelper<TweedCoatBridgeTestModConfig> configContainerHelper;
private TweedCoatBridgeTestModConfig config;
@Override
public void onInitializeClient() {
configContainer = TweedPojoWeaverBootstrapper.create(TweedCoatBridgeTestModConfig.class).weave();
configCoatBridgeExtension = configContainer.extension(TweedCoatBridgeExtension.class)
.orElseThrow(() -> new IllegalStateException("TweedCoatBridgeExtension not found"));
Arrays.asList(
TweedCoatMappers.compoundCategoryMapper(),
TweedCoatMappers.stringTextMapper(),
TweedCoatMappers.integerTextMapper()
).forEach(configCoatBridgeExtension::addMapper);
configContainer.initialize();
configContainerHelper = FabricConfigContainerHelper.create(
configContainer,
new HjsonSerde(new HjsonWriter.Options()),
MOD_ID
);
config = configContainerHelper.loadAndUpdateInConfigDirectory(() -> DEFAULT_CONFIG_VALUE);
KeyBindingHelper.registerKeyBinding(new ScreenKeyBinding(MOD_ID + ".config", 84, KeyMapping.Category.MISC));
log.info("current config");
}
private class ScreenKeyBinding extends KeyMapping implements PriorityKeyBinding {
public ScreenKeyBinding(String name, int key, Category category) {
super(name, key, category);
}
@Override
public boolean onPressedPriority() {
if (!(Minecraft.getInstance().screen instanceof TitleScreen)) {
return false;
}
ConfigScreen configScreen = configCoatBridgeExtension.createConfigScreen(
ConfigScreenCreateParams.<TweedCoatBridgeTestModConfig>builder()
.translationKeyPrefix(MOD_ID + ".config")
.title(Component.translatable(MOD_ID + ".title"))
.rootEntry(configContainer.rootEntry())
.currentValue(config)
.defaultValue(DEFAULT_CONFIG_VALUE)
.saveHandler(value -> {
config = value;
log.info("Updated config: " + config);
configContainerHelper.writeConfigInConfigDirectory(config);
})
.build()
);
Minecraft.getInstance().setScreen(configScreen);
return true;
}
}
}

View File

@@ -0,0 +1,54 @@
package de.siphalor.tweed5.coat.bridge.testmod;
import de.siphalor.tweed5.attributesextension.api.AttributesExtension;
import de.siphalor.tweed5.coat.bridge.api.TweedCoatAttributes;
import de.siphalor.tweed5.coat.bridge.api.TweedCoatBridgeExtension;
import de.siphalor.tweed5.data.extension.api.ReadWriteExtension;
import de.siphalor.tweed5.defaultextensions.validation.api.ValidationExtension;
import de.siphalor.tweed5.weaver.pojo.api.annotation.CompoundWeaving;
import de.siphalor.tweed5.weaver.pojo.api.annotation.DefaultWeavingExtensions;
import de.siphalor.tweed5.weaver.pojo.api.annotation.PojoWeaving;
import de.siphalor.tweed5.weaver.pojo.api.annotation.PojoWeavingExtension;
import de.siphalor.tweed5.weaver.pojoext.attributes.api.Attribute;
import de.siphalor.tweed5.weaver.pojoext.attributes.api.AttributesPojoWeavingProcessor;
import de.siphalor.tweed5.weaver.pojoext.serde.api.auto.AutoReadWritePojoWeavingProcessor;
import de.siphalor.tweed5.weaver.pojoext.serde.api.auto.DefaultReadWriteMappings;
import de.siphalor.tweed5.weaver.pojoext.validation.api.Validator;
import de.siphalor.tweed5.weaver.pojoext.validation.api.ValidatorsPojoWeavingProcessor;
import de.siphalor.tweed5.weaver.pojoext.validation.api.validators.WeavableNumberRangeValidator;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@PojoWeaving(extensions = {
ReadWriteExtension.class,
TweedCoatBridgeExtension.class,
ValidationExtension.class,
AttributesExtension.class,
})
@PojoWeavingExtension(AutoReadWritePojoWeavingProcessor.class)
@PojoWeavingExtension(ValidatorsPojoWeavingProcessor.class)
@PojoWeavingExtension(AttributesPojoWeavingProcessor.class)
@DefaultWeavingExtensions
@DefaultReadWriteMappings
@CompoundWeaving(namingFormat = "kebab_case")
@Data
public class TweedCoatBridgeTestModConfig {
private String test = "hello world";
private int someInteger = 123;
@Validator(value = WeavableNumberRangeValidator.class, config = "-10=..=10")
private int integerInRange = -5;
@Attribute(key = TweedCoatAttributes.BACKGROUND_TEXTURE, values = "textures/block/green_terracotta.png")
private Greeting serverGreeting = new Greeting("Hello server!", "Server");
@Attribute(key = TweedCoatAttributes.BACKGROUND_TEXTURE, values = "textures/block/red_terracotta.png")
private Greeting clientGreeting = new Greeting("Hello client!", "Client");
@NoArgsConstructor
@AllArgsConstructor
@CompoundWeaving
public static class Greeting {
public String greeting;
public String greeter;
}
}

View File

@@ -0,0 +1,8 @@
{
"tweed5_coat_bridge_testmod.title": "Test Mod",
"tweed5_coat_bridge_testmod.config": "Test Mod config",
"tweed5_coat_bridge_testmod.config.test": "Test entry",
"tweed5_coat_bridge_testmod.config.test.description": "Just a simple string entry",
"tweed5_coat_bridge_testmod.config.some-integer": "Some integer",
"tweed5_coat_bridge_testmod.config.integer-in-range": "Integer in range"
}

View File

@@ -0,0 +1,10 @@
{
"schemaVersion": 1,
"id": "tweed5_coat_bridge_testmod",
"version": "0.1.0",
"entrypoints": {
"client": [
"de.siphalor.tweed5.coat.bridge.testmod.TweedCoatBridgeTestMod"
]
}
}