Compare commits

..
16 Commits
Author SHA1 Message Date
big-duckie da2ffa19ff Add actions support.
release / build (21) (push) Successful in 12m1s
2025-01-01 14:27:06 -07:00
big-duckie 412ab2c1d0 Fix up some issues. 2025-01-01 14:25:39 -07:00
frqnny 8b2f1db5e9 let's see if this fixes things? 2024-06-17 14:19:40 -04:00
Draylar 5f19348fdc 1.20.1 update without Omega Config GUI 2023-07-01 16:30:59 -05:00
Draylar 505d3e70f8 1.19.2 update with maven publishing and README polishing 2023-03-01 21:16:38 -06:00
DraylarandGitHub 239ec7c3bc 1.2.3 version bump 2022-01-18 11:14:38 -06:00
DraylarandGitHub 0f0abe558e Merge pull request #12 from Luligabi1/1.18
Better config screen title
2022-01-18 11:14:04 -06:00
Luligabi1 5bdce25e29 OmegaConfigGui's generated config screen now has a TranslatableText for its title rather than a LiteralText.q 2021-12-28 15:07:41 -03:00
frqnny 9d7aa7581d Automated fabric mod json version
Closes #11
2021-12-28 10:58:42 -05:00
Draylar 8611edb92c update README 2021-12-20 18:38:58 -06:00
Draylar 58c420d35f add null check for modid when registering modmenu screens 2021-12-20 17:52:54 -06:00
Draylar 270db37dba fix omega config class loading too early in static block, make modmenu dep transitive 2021-12-20 17:41:14 -06:00
Draylar 2968111445 Move ModMenu dependency to the GUI module 2021-12-20 17:20:50 -06:00
Draylar 136cfe6a9a fix classloading for mod menu by moving registration methods to OmegaConfigGui class, fix versioning 2021-12-20 17:16:02 -06:00
Draylar 3f7c461689 Add mod icons, finish GUI support through Cloth Config Lite 2021-12-20 16:40:03 -06:00
Draylar 36ce7bc924 🦀 proguard is dead, clean up build.gradle 2021-12-20 15:23:52 -06:00
34 changed files with 254 additions and 757 deletions
+43
View File
@@ -0,0 +1,43 @@
name: release
on:
push:
tags:
- "*"
env:
VERSION: "${{github.ref_name}}"
jobs:
build:
strategy:
matrix:
java: [
21, # Current Java LTS
]
runs-on: ubuntu-22.04
steps:
- name: checkout repository
uses: actions/checkout@v4
- name: validate gradle wrapper
uses: gradle/wrapper-validation-action@v2
- name: setup jdk ${{ matrix.java }}
uses: actions/setup-java@v4
with:
java-version: ${{ matrix.java }}
distribution: "temurin"
- name: make gradle wrapper executable
run: chmod +x ./gradlew
- name: build
run: ./gradlew build
- name: publish maven
continue-on-error: true
env:
MAVEN_TOKEN: "${{secrets.MAVEN_TOKEN}}"
run: ./gradlew publish
- name: publish release
uses: akkuman/gitea-release-action@v1
with:
files: |-
build/libs/**
token: "${{secrets.GITHUB_TOKEN}}"
+74 -7
View File
@@ -1,15 +1,15 @@
# ΩConfig
<h1 align="center">Omega Config Ω </h1>
<p align="center">A configuration library by <a href="https://github.com/Draylar">Draylar</a></p>
---
*The last config library you will ever use.*
ΩConfig is a hyper-minimal config library based on [Auto Config](https://github.com/shedaniel/AutoConfig). It aims to
achieve the following goals:
- Be lightweight (<10 KB) for JIJ usage
- Be lightweight (<25 KB) for JIJ usage
- Exceedingly simple design & API for developers
- Intuition and usability for players
- Bonus annotations for advanced config options (syncing values)
The following is an example of a simple ΩConfig setup:
@@ -19,6 +19,10 @@ public class TestConfig implements Config {
@Comment(value = "Hello!")
boolean value = false;
@Syncing
@Comment(value = "This value will sync to the client!")
boolean syncableValue = false;
@Override
public String getFileName() {
return "test-config";
@@ -39,6 +43,66 @@ public class MyModInitializer {
}
```
Looking for a simple config screen? Talk about easy!
```java
public class ClientInitializer implements ClientModInitializer {
@Override
public void onInitializeClient() {
// Make sure you implement getModid in your config class!
OmegaConfigGui.registerConfigScreen(MainInitializer.CONFIG);
}
}
```
---
### Pulling Omega Config into Development
To use Omega Config, you will have to add it to your build.gradle file.
What you pull in depends on whether you want GUI functionality. For basic config files using the base module (~20KB),
you can use the following gradle declarations:
```groovy
repositories {
maven { url 'https://maven.draylar.dev/releases' }
}
// 1.19.2 version: 1.3.0+1.19.2
dependencies {
modImplementation include("dev.draylar.omega-config:omega-config-base:${project.omega_config_version}")
}
```
Easy - you now have a bundled configuration library. Use the examples in the first section to implement your config.
If you want to add GUI functionality (most likely Mod Menu support), you can pull in the GUI module (~25 KB):
```groovy
repositories {
...
// Needed to retrieve Cloth Config Lite for Omega Config in development environments.
maven {
name = "Shedaniel's Maven"
url = "https://maven.shedaniel.me/"
}
// Optional dependency for Mod Menu - recommended for viewing your screen in development
maven {
name = "TerraformersMC"
url = "https://maven.terraformersmc.com/releases/"
}
}
dependencies {
... (including the base declarations)
modImplementation include("dev.draylar.omega-config:omega-config-gui:${project.omega_config_version}")
modRuntimeOnly ("com.terraformersmc:modmenu:${project.modmenu_version}") // 3.0.1 for 1.18.1
}
```
---
### Extra API Utilities
@@ -48,12 +112,15 @@ public class MyModInitializer {
**save()** - *saves a modified configuration instance to disk*
```java
MyModInitializer.CONFIG.value=false;
MyModInitializer.CONFIG.save(); // writes the new value to disk
MyModInitializer.CONFIG.value = false;
MyModInitializer.CONFIG.save(); // writes the new value to disk
```
`@Syncing` - *configuration options marked with this annotation will automatically sync to the client when they join a server.*
---
### License
ΩConfig is available under Public Domain. You are encouraged to utilize the code in this repository in any way you wish.
ΩConfig is available under MIT. Omega Config will bundle the MIT license inside the jar you pull as a dependency, which means you can distribute it as a bundled dependency without any additional steps.
+78 -205
View File
@@ -1,190 +1,105 @@
import java.nio.charset.StandardCharsets
// this build.gradle is tweaked from CCA: https://github.com/OnyxStudios/Cardinal-Components-API/blob/master/build.gradle
buildscript {
repositories {
mavenLocal()
google()
}
dependencies {
classpath 'com.guardsquare:proguard-gradle:7.1.0-beta4'
}
}
plugins {
id "fabric-loom" version "0.10-SNAPSHOT"
id "maven-publish"
id "java-library"
id 'fabric-loom' version '1.8-SNAPSHOT'
id 'maven-publish'
}
group = "draylar"
archivesBaseName = "omega-config"
if (System.getenv("VERSION")) {
project.mod_version = System.getenv("VERSION")
}
subprojects {
apply plugin: 'fabric-loom'
apply plugin: 'maven-publish'
apply plugin: 'java-library'
version = "${project.mod_version}"
group = "dev.draylar"
archivesBaseName = project.name
group = "draylar.${project.group}"
// import utility functions
apply from: "https://raw.githubusercontent.com/NerdHubMC/Gradle-Scripts/master/scripts/utilities.gradle"
repositories {
mavenCentral()
}
compileJava {
options.encoding = StandardCharsets.UTF_8.name()
}
if (JavaVersion.current().isJava8Compatible()) {
allprojects {
tasks.withType(Javadoc) {
options.addStringOption("Xdoclint:none", "-quiet")
}
}
}
jar {
from "LICENSE.md"
from "LICENSE"
manifest.mainAttributes(
"Implementation-Title": project.archivesBaseName,
"Implementation-Version": mod_version,
"Maven-Artifact": "${project.group}:${project.name}:${mod_version}".toLowerCase(Locale.ROOT),
"Built-On-Minecraft": "${project.minecraft_version}",
"Built-On-Java": "${System.getProperty("java.vm.version")} (${System.getProperty("java.vm.vendor")})"
)
}
task sourcesJar(type: Jar, dependsOn: classes) {
from sourceSets.main.allSource
classifier = "sources"
}
task javadocJar(type: Jar, dependsOn: javadoc) {
from javadoc.destinationDir
classifier = "javadoc"
}
tasks.build.dependsOn javadocJar
publishing {
publications {
mavenJava(MavenPublication) {
artifact(remapJar) {
builtBy remapJar
}
artifact(sourcesJar) {
builtBy remapSourcesJar
}
artifact(file("${project.buildDir}/libs/${archivesBaseName}-${project.mod_version}-min.jar")) {
builtBy(remapJar)
classifier = 'min'
}
pom.withXml {
def depsNode = asNode().appendNode("dependencies")
subprojects.each {
def depNode = depsNode.appendNode("dependency")
depNode.appendNode("groupId", it.group)
depNode.appendNode("artifactId", it.name)
depNode.appendNode("version", it.version)
depNode.appendNode("scope", "compile")
}
}
}
}
}
tasks.publish.dependsOn build //stupid fix for maven/loom not publishing the main artifact
task('proguard', type: proguard.gradle.ProGuardTask) {
configuration './proguard.conf'
verbose
injars project.buildDir.toString() + '/libs/' + archivesBaseName + "-" + project.mod_version + ".jar"
outjars project.buildDir.toString() + '/libs/' + archivesBaseName + "-" + project.mod_version + "-min.jar"
printmapping 'out.map'
keepparameternames
renamesourcefileattribute 'SourceFile'
keepattributes 'Signature,Exceptions,InnerClasses,PermittedSubclasses,EnclosingMethod,Deprecated,SourceFile,LineNumberTable'
keepattributes '*Annotation*'
keep 'public class * { \
public protected *; \
}'
keepclassmembernames 'class * { \
java.lang.Class class$(java.lang.String); \
java.lang.Class class$(java.lang.String, boolean); \
}'
keepclassmembers 'class draylar.omegaconfig.mixin.* {\
<fields>;\
<init>();\
<methods>;\
}'
}
remapJar.finalizedBy proguard
base {
archivesName = "omega-config"
}
allprojects {
apply plugin: "fabric-loom"
sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17
version = project.mod_version
sourceCompatibility = targetCompatibility = JavaVersion.VERSION_16
version = System.getenv("TRAVIS_TAG") ?: project.mod_version
repositories {
maven {
name = "FabricMC"
url = "https://maven.fabricmc.net"
}
maven { url = "https://maven.terraformersmc.com/releases/" }
}
repositories {}
dependencies {
//to change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
modRuntimeOnly "com.terraformersmc:modmenu:${project.modmenu_version}"
modCompileOnly "com.terraformersmc:modmenu:${project.modmenu_version}"
}
}
jar {
from(rootProject.file("LICENSE.md")) {
rename { "LICENSE_${project.archivesBaseName.replace('-', '_')}" }
}
}
afterEvaluate {
processResources {
// this will ensure that this task is redone when there"s a change
inputs.property "version", mod_version
inputs.property "version", project.version
// replace stuff in fabric.mod.json, nothing else
from(sourceSets.main.resources.srcDirs) {
include "fabric.mod.json"
filesMatching("fabric.mod.json") {
expand "version": project.version
}
}
// add mod metadata
expand "version": mod_version
tasks.withType(JavaCompile).configureEach {
it.options.release = 17
javadoc.options.addStringOption('Xdoclint:none', '-quiet')
}
jar {
from(rootProject.file("LICENSE")) {
rename { "LICENSE_${project.archivesBaseName.replace('-', '_')}" }
}
}
}
subprojects {
apply plugin: 'fabric-loom'
apply plugin: 'maven-publish'
archivesBaseName = project.name
group = "dev.draylar.${project.group}"
// Only publish for submodules (not the root project) - add standard jar, + sources & development jar
publishing {
publications {
create("mavenJava", MavenPublication) {
artifactId = project.archives_base_name
version = "${project.mod_version}+${project.minecraft_version}"
from components.java
}
}
// copy everything else, that"s not the fabric.mod.json
from(sourceSets.main.resources.srcDirs) {
exclude "fabric.mod.json"
repositories {
// Add repositories to publish to here.
// Notice: This block does NOT have the same function as the block in the top level.
// The repositories here will be used for publishing your artifact, not for
// retrieving dependencies.
maven {
name = "Gitea"
url = uri("https://git.bigduckie.dev/api/packages/big-duckie/maven")
credentials(HttpHeaderCredentials) {
name = "Authorization"
value = "token ${System.getenv("MAVEN_TOKEN")}"
}
authentication {
header(HttpHeaderAuthentication)
}
}
}
}
// Add sources & javadoc artifacts
java {
withSourcesJar()
withJavadocJar()
}
}
// Main project depends on the base & gui module for testing
dependencies {
implementation project(path: ":omega-config-base", configuration: "namedElements")
afterEvaluate {
testmodImplementation sourceSets.main.output
}
}
sourceSets {
@@ -192,51 +107,9 @@ sourceSets {
compileClasspath += main.compileClasspath
runtimeClasspath += main.runtimeClasspath
}
test {
compileClasspath += main.compileClasspath
runtimeClasspath += main.runtimeClasspath
}
}
task licenseFormatAll
subprojects { p -> licenseFormatAll.dependsOn("${p.path}:licenseFormat") }
subprojects.each { remapJar.dependsOn("${it.path}:remapJar") }
repositories {
maven {
name = "JitPack"
url = "https://jitpack.io"
}
}
dependencies {
implementation project(path: ":omega-config-base", configuration: "namedElements")
implementation project(path: ":omega-config-gui", configuration: "namedElements")
modRuntimeOnly "com.terraformersmc:modmenu:${project.modmenu_version}"
modCompileOnly "com.terraformersmc:modmenu:${project.modmenu_version}"
afterEvaluate {
testmodImplementation sourceSets.main.output
}
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
pom.withXml {
def depsNode = asNode().appendNode("dependencies")
subprojects.each {
def depNode = depsNode.appendNode("dependency")
depNode.appendNode("groupId", it.group)
depNode.appendNode("artifactId", it.name)
depNode.appendNode("version", it.version)
depNode.appendNode("scope", "compile")
}
}
}
}
}
tasks.publish.dependsOn build //stupid fix for maven/loom not publishing the main artifact
+12 -9
View File
@@ -1,16 +1,19 @@
# Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx2G
org.gradle.jvmargs=-Xmx1G
org.gradle.parallel=true
# Fabric Properties
# check these on https://fabricmc.net/versions.html
minecraft_version=1.18.1
yarn_mappings=1.18.1+build.2
loader_version=0.12.11
minecraft_version=1.20.1
yarn_mappings=1.20.1+build.10
loader_version=0.16.7
#Fabric api
fabric_version=0.44.0+1.18
# Mod Properties
mod_version=1.1.0
maven_group=draylar
mod_version=1.4.1
maven_group=dev.bigduckie
archives_base_name=omega-config
modmenu_version=3.0.0
# Dependencies
fabric_version=0.92.2+1.20.1
modmenu_version=7.1.0
+3 -1
View File
@@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-4
View File
@@ -1,4 +0,0 @@
before_install:
- wget https://github.com/sormuras/bach/raw/master/install-jdk.sh
- source install-jdk.sh --feature 17
- jshell --version
-3
View File
@@ -1,3 +0,0 @@
-ignorewarnings
-keep class net.fabricmc.api.** { *; }
@@ -6,6 +6,7 @@ import draylar.omegaconfig.api.Comment;
import draylar.omegaconfig.api.Config;
import draylar.omegaconfig.gson.SyncableExclusionStrategy;
import io.netty.buffer.Unpooled;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.fabricmc.loader.api.FabricLoader;
@@ -30,15 +31,16 @@ import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class OmegaConfig {
public class OmegaConfig implements ModInitializer {
public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
public static final Identifier CONFIG_SYNC_PACKET = new Identifier("omegaconfig", "sync");
public static final Gson SYNC_ONLY_GSON = new GsonBuilder().addSerializationExclusionStrategy(new SyncableExclusionStrategy()).setPrettyPrinting().create();
private static final Logger LOGGER = LogManager.getLogger();
public static final Logger LOGGER = LogManager.getLogger();
private static final List<Config> REGISTERED_CONFIGURATIONS = new ArrayList<>();
static {
@Override
public void onInitialize() {
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> server.execute(() -> {
PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer());
@@ -94,8 +96,9 @@ public class OmegaConfig {
}
return config;
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException exception) {
exception.printStackTrace();
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException |
InvocationTargetException e) {
e.printStackTrace();
throw new RuntimeException("No valid constructor found for: " + configClass.getName());
}
}
@@ -162,7 +165,7 @@ public class OmegaConfig {
}
}
private static List<Class<?>> flatten(Class<?>[] array) {
public static List<Class<?>> flatten(Class<?>[] array) {
List<Class<?>> list = new ArrayList<>();
for (Class<?> clazz : array) {
@@ -177,10 +180,8 @@ public class OmegaConfig {
Class<?>[] classes = aClass.getDeclaredClasses();
if (classes.length != 0) {
for (Class<?> clazz : classes) {
populateRecursively(list, clazz);
}
for (Class<?> clazz : classes) {
populateRecursively(list, clazz);
}
}
@@ -8,6 +8,7 @@ import net.fabricmc.fabric.api.util.NbtType;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.RunArgs;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
@@ -36,7 +37,7 @@ public class ClientMixin {
client.execute(() -> {
if (tag != null && tag.contains("Configurations")) {
NbtList list = tag.getList("Configurations", NbtType.COMPOUND);
NbtList list = tag.getList("Configurations", NbtElement.COMPOUND_TYPE);
list.forEach(compound -> {
NbtCompound syncedConfiguration = (NbtCompound) compound;
String name = syncedConfiguration.getString("ConfigName");
Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

@@ -1,18 +1,24 @@
{
"schemaVersion": 1,
"id": "omega-config",
"version": "1.1.0",
"version": "${version}",
"name": "OmegaConfig",
"description": "The last config solution you will ever use.",
"authors": [
"Draylar",
"Frqnny"
"Frqnny",
"Big Duckie"
],
"entrypoints": {
"main": [
"draylar.omegaconfig.OmegaConfig"
]
},
"contact": {
"homepage": "https://github.com/Draylar/omega-config",
"sources": "https://github.com/Draylar/omega-config",
"issues": "https://github.com/Draylar/omega-config/issues"
},
"homepage": "https://github.com/Draylar/omega-config",
"sources": "https://github.com/Draylar/omega-config",
"issues": "https://github.com/Draylar/omega-config/issues"
},
"license": "MIT",
"environment": "*",
"mixins": [
@@ -23,9 +29,11 @@
"fabric": "*",
"minecraft": "*"
},
"custom": {
"modmenu": {
"badges": [ "library" ]
}
"custom": {
"modmenu": {
"badges": [
"library"
]
}
}
}
-3
View File
@@ -1,3 +0,0 @@
dependencies {
implementation project(":omega-config-base")
}
-3
View File
@@ -1,3 +0,0 @@
-ignorewarnings
-keep class net.fabricmc.api.** { *; }
@@ -1,24 +0,0 @@
package draylar.omegaconfiggui;
import draylar.omegaconfig.api.Config;
import draylar.omegaconfiggui.api.screen.ModMenuHelper;
import draylar.omegaconfiggui.api.screen.OmegaConfigScreen;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader;
@Environment(EnvType.CLIENT)
public class OmegaConfigGui {
/**
* Registers a ModMenu configuration screen for the given {@link Config} instance.
*
* @param config registered config to create a ModMenu screen for
* @param <T> config type
*/
public static <T extends Config> void registerConfigScreen(T config) {
if (FabricLoader.getInstance().isModLoaded("modmenu")) {
ModMenuHelper.injectScreen(config, parent -> new OmegaConfigScreen<>(config, parent));
}
}
}
@@ -1,21 +0,0 @@
package draylar.omegaconfiggui.api.screen;
import com.google.common.collect.ImmutableMap;
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import draylar.omegaconfig.api.Config;
import draylar.omegaconfiggui.mixin.ModMenuAccessor;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@Environment(EnvType.CLIENT)
public class ModMenuHelper {
public static <T extends Config> void injectScreen(T config, OmegaConfigScreenSupplier<T> factory) {
// they will suspect nothing
ModMenuAccessor.setConfigScreenFactories(
new ImmutableMap.Builder<String, ConfigScreenFactory<?>>()
.putAll(ModMenuAccessor.getConfigScreenFactories())
.put(config.getModid(), factory::get)
.build());
}
}
@@ -1,142 +0,0 @@
package draylar.omegaconfiggui.api.screen;
import com.mojang.blaze3d.systems.RenderSystem;
import draylar.omegaconfig.api.Config;
import draylar.omegaconfiggui.api.screen.widget.LabelWidget;
import draylar.omegaconfiggui.api.screen.widget.TypeWidgets;
import draylar.omegaconfiggui.api.screen.widget.WidgetSupplier;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.LiteralText;
import net.minecraft.util.Pair;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class OmegaConfigScreen<T extends Config> extends Screen {
private static final List<Class<?>> validClasses = Arrays.asList(Double.class, String.class, Boolean.class);
private final T config;
private final Screen parent;
private final Map<Field, Pair<WidgetSupplier<Object, ClickableWidget>, ClickableWidget>> fieldWidgets = new HashMap<>();
public OmegaConfigScreen(T config, Screen parent) {
super(new LiteralText(""));
this.config = config;
this.parent = parent;
}
@Override
public void init() {
super.init();
try {
// add label & button for each config entry
// TODO: SUB-CLASS SUPPORT
List<Field> collect = Arrays.stream(config.getClass().getDeclaredFields()).filter(field -> validClasses.contains(TypeWidgets.unbox(field.getType()))).collect(Collectors.toList());
int over = 0;
for (Field field : collect) {
Class<?> unbox = TypeWidgets.unbox(field.getType());
// label
addDrawable(new LabelWidget(150, 15 + height / 6 + 20 * over, new LiteralText(field.getName())));
// get value
field.setAccessible(true);
Object value = field.get(config);
// button / interact
ClickableWidget button;
WidgetSupplier<Object, ClickableWidget> widgetSupplier = (WidgetSupplier<Object, ClickableWidget>) TypeWidgets.get(unbox);
if (widgetSupplier != null) {
button = widgetSupplier.create(this, 250, 5 + height / 6 + 25 * over, 100, 20, new LiteralText(field.getName()), value);
} else {
button = new TextFieldWidget(client.textRenderer, 250, 5 + height / 6 + 25 * over, 100, 20, new LiteralText(field.getName()));
}
fieldWidgets.put(field, new Pair<>(widgetSupplier, button));
addSelectableChild(button);
over++;
}
} catch (Exception e) {
e.printStackTrace();
}
// save and exit
ButtonWidget exit = new ButtonWidget(width - 60, height - 30, 50, 20, new LiteralText("Exit"), widget -> onClose());
ButtonWidget save = new ButtonWidget(10, height - 30, 50, 20, new LiteralText("Save"), widget -> {
fieldWidgets.forEach((field, pair) -> {
try {
field.set(config, pair.getLeft().get(pair.getRight()));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
});
config.save();
});
addSelectableChild(save);
addSelectableChild(exit);
}
@Override
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
renderBackground(matrices);
//TODO make this work. for Drawables (children) it works in parent method
/*
for (ClickableWidget button : this.) {
button.render(matrices, mouseX, mouseY, delta);
}
for (Element element : this.children) {
if (element instanceof Drawable && !buttons.contains(element)) {
((Drawable) element).render(matrices, mouseX, mouseY, delta);
}
}
*/
}
@Override
public void onClose() {
client.setScreen(parent);
}
@Override
public void renderBackground(MatrixStack matrices) {
// TODO: option for transparent BG
// this.fillGradient(matrices, 0, 0, this.width, this.height, -1072689136, -804253680);
renderCustomBackgroundTexture(0, 64, 64, 64, 0, 0, this.height, this.width);
renderCustomBackgroundTexture(0, 32, 32, 32, 0, this.height / 8, this.height / 8 * 6, this.width);
textRenderer.draw(matrices, config.getName(), width / 2f - textRenderer.getWidth(config.getName()) / 2f, 10, 0xffffff);
}
public void renderCustomBackgroundTexture(int vOffset, int r, int g, int b, int x, int y, int height, int width) {
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferBuilder = tessellator.getBuffer();
this.client.getTextureManager().bindTexture(OPTIONS_BACKGROUND_TEXTURE);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR);
bufferBuilder.vertex(x, height + y, 0.0D).texture(0.0F, (float) height / 32.0F + (float) vOffset).color(r, g, b, 255).next();
bufferBuilder.vertex(width + x, height + y, 0.0D).texture((float) width / 32.0F, (float) height / 32.0F + (float) vOffset).color(r, g, b, 255).next();
bufferBuilder.vertex(width + x, y, 0.0D).texture((float) width / 32.0F, (float) vOffset).color(r, g, b, 255).next();
bufferBuilder.vertex(x, y, 0.0D).texture(0.0F, (float) vOffset).color(r, g, b, 255).next();
tessellator.draw();
}
}
@@ -1,8 +0,0 @@
package draylar.omegaconfiggui.api.screen;
import draylar.omegaconfig.api.Config;
import net.minecraft.client.gui.screen.Screen;
public interface OmegaConfigScreenSupplier<T extends Config> {
OmegaConfigScreen<T> get(Screen parent);
}
@@ -1,30 +0,0 @@
package draylar.omegaconfiggui.api.screen.widget;
import draylar.omegaconfiggui.mixin.ClickableWidgetInvoker;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.text.Text;
public class BaseTextFieldWidget extends TextFieldWidget {
protected final Screen parent;
public BaseTextFieldWidget(Screen parent, TextRenderer textRenderer, int x, int y, int width, int height, Text text) {
super(textRenderer, x, y, width, height, text);
this.parent = parent;
}
@Override
public void setTextFieldFocused(boolean focused) {
// unfocus all others
parent.children().forEach(element -> {
if (element instanceof ClickableWidget) {
((ClickableWidgetInvoker) element).callSetFocused(false);
}
});
super.setFocused(focused);
}
}
@@ -1,25 +0,0 @@
package draylar.omegaconfiggui.api.screen.widget;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.Text;
public class DoubleFieldWidget extends BaseTextFieldWidget {
public DoubleFieldWidget(Screen parent, TextRenderer textRenderer, int x, int y, int width, int height, Text text) {
super(parent, textRenderer, x, y, width, height, text);
}
@Override
public void write(String string) {
try {
if (!string.equals(".") || getText().contains(".")) {
Double.parseDouble(string);
}
super.write(string);
} catch (NumberFormatException ignored) {
}
}
}
@@ -1,26 +0,0 @@
package draylar.omegaconfiggui.api.screen.widget;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.Drawable;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.gui.Element;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text;
public class LabelWidget extends DrawableHelper implements Drawable, Element {
private final int x;
private final int y;
private final Text message;
public LabelWidget(int x, int y, Text message) {
this.x = x;
this.y = y;
this.message = message;
}
@Override
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
drawTextWithShadow(matrices, MinecraftClient.getInstance().textRenderer, message, x, y, 0xffffff);
}
}
@@ -1,45 +0,0 @@
package draylar.omegaconfiggui.api.screen.widget;
import draylar.omegaconfiggui.api.screen.widget.supplier.BooleanWidgetSupplier;
import draylar.omegaconfiggui.api.screen.widget.supplier.DoubleWidgetSupplier;
import draylar.omegaconfiggui.api.screen.widget.supplier.StringWidgetSupplier;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
public class TypeWidgets {
public static final Map<Class<?>, WidgetSupplier<?, ?>> CLASS_WIDGETS = new HashMap<>();
public static final Map<Class<?>, Class<?>> PRIMITIVE_TO_BOXED = new HashMap<>();
static {
CLASS_WIDGETS.put(Double.class, new DoubleWidgetSupplier());
CLASS_WIDGETS.put(Boolean.class, new BooleanWidgetSupplier());
CLASS_WIDGETS.put(String.class, new StringWidgetSupplier());
// primitive -> boxed
PRIMITIVE_TO_BOXED.put(boolean.class, Boolean.class);
PRIMITIVE_TO_BOXED.put(byte.class, Byte.class);
PRIMITIVE_TO_BOXED.put(char.class, Character.class);
PRIMITIVE_TO_BOXED.put(double.class, Double.class);
PRIMITIVE_TO_BOXED.put(float.class, Float.class);
PRIMITIVE_TO_BOXED.put(int.class, Integer.class);
PRIMITIVE_TO_BOXED.put(long.class, Long.class);
PRIMITIVE_TO_BOXED.put(short.class, Short.class);
PRIMITIVE_TO_BOXED.put(void.class, Void.class);
}
private TypeWidgets() {
// NO-OP
}
@Nullable
public static <T> WidgetSupplier<T, ?> get(Class<T> typeClass) {
return (WidgetSupplier<T, ?>) CLASS_WIDGETS.get(unbox(typeClass));
}
public static Class<?> unbox(Class<?> c) {
return PRIMITIVE_TO_BOXED.getOrDefault(c, c);
}
}
@@ -1,11 +0,0 @@
package draylar.omegaconfiggui.api.screen.widget;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.text.LiteralText;
public interface WidgetSupplier<T, A extends ClickableWidget> {
ClickableWidget create(Screen parent, int x, int y, int width, int height, LiteralText prompt, T value);
T get(A widget);
}
@@ -1,19 +0,0 @@
package draylar.omegaconfiggui.api.screen.widget.supplier;
import draylar.omegaconfiggui.api.screen.widget.WidgetSupplier;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.CheckboxWidget;
import net.minecraft.text.LiteralText;
public class BooleanWidgetSupplier implements WidgetSupplier<Boolean, CheckboxWidget> {
@Override
public CheckboxWidget create(Screen parent, int x, int y, int width, int height, LiteralText prompt, Boolean value) {
return new CheckboxWidget(x, y, 20, 20, new LiteralText(""), value);
}
@Override
public Boolean get(CheckboxWidget widget) {
return widget.isChecked();
}
}
@@ -1,35 +0,0 @@
package draylar.omegaconfiggui.api.screen.widget.supplier;
import draylar.omegaconfiggui.api.screen.widget.DoubleFieldWidget;
import draylar.omegaconfiggui.api.screen.widget.WidgetSupplier;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.LiteralText;
public class DoubleWidgetSupplier implements WidgetSupplier<Double, DoubleFieldWidget> {
@Override
public DoubleFieldWidget create(Screen parent, int x, int y, int width, int height, LiteralText prompt, Double value) {
LiteralText text = new LiteralText(String.valueOf(value));
DoubleFieldWidget widget = new DoubleFieldWidget(parent, MinecraftClient.getInstance().textRenderer, x, y, width, height, text);
widget.setText(text.asString());
return widget;
}
@Override
public Double get(DoubleFieldWidget widget) {
String message = widget.getText();
// if it is just a . or empty, return 0
if (message.equals(".") || message.isEmpty()) {
return 0.0;
}
// trim potential trailing .
if (message.indexOf(".") == message.length()) {
message = message.substring(0, message.length() - 1);
}
return Double.parseDouble(message);
}
}
@@ -1,24 +0,0 @@
package draylar.omegaconfiggui.api.screen.widget.supplier;
import draylar.omegaconfiggui.api.screen.widget.BaseTextFieldWidget;
import draylar.omegaconfiggui.api.screen.widget.WidgetSupplier;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.text.LiteralText;
public class StringWidgetSupplier implements WidgetSupplier<String, TextFieldWidget> {
@Override
public TextFieldWidget create(Screen parent, int x, int y, int width, int height, LiteralText prompt, String value) {
LiteralText text = new LiteralText(value);
TextFieldWidget textField = new BaseTextFieldWidget(parent, MinecraftClient.getInstance().textRenderer, x, y, width, height, text);
textField.setText(value);
return textField;
}
@Override
public String get(TextFieldWidget widget) {
return widget.getText();
}
}
@@ -1,11 +0,0 @@
package draylar.omegaconfiggui.mixin;
import net.minecraft.client.gui.widget.ClickableWidget;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(ClickableWidget.class)
public interface ClickableWidgetInvoker {
@Invoker
void callSetFocused(boolean focused);
}
@@ -1,20 +0,0 @@
package draylar.omegaconfiggui.mixin;
import com.google.common.collect.ImmutableMap;
import com.terraformersmc.modmenu.ModMenu;
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(ModMenu.class)
public interface ModMenuAccessor {
@Accessor
static ImmutableMap<String, ConfigScreenFactory<?>> getConfigScreenFactories() {
throw new UnsupportedOperationException();
}
@Accessor
static void setConfigScreenFactories(ImmutableMap<String, ConfigScreenFactory<?>> configScreenFactories) {
throw new UnsupportedOperationException();
}
}
@@ -1,30 +0,0 @@
{
"schemaVersion": 1,
"id": "omega-config-gui",
"version": "${version}",
"name": "OmegaConfigGui",
"description": "GUI support for Omega Config.",
"authors": [
"Draylar"
],
"contact": {
"homepage": "https://github.com/Draylar/omega-config",
"sources": "https://github.com/Draylar/omega-config",
"issues": "https://github.com/Draylar/omega-config/issues"
},
"license": "MIT",
"environment": "*",
"mixins": [
"omega-config-gui.mixins.json"
],
"depends": {
"fabricloader": "*",
"fabric": "*",
"minecraft": "*"
},
"custom": {
"modmenu": {
"badges": [ "library" ]
}
}
}
@@ -1,15 +0,0 @@
{
"required": true,
"minVersion": "0.8",
"package": "draylar.omegaconfiggui.mixin",
"compatibilityLevel": "JAVA_16",
"mixins": [
"ClickableWidgetInvoker",
"ModMenuAccessor"
],
"client": [
],
"injectors": {
"defaultRequire": 1
}
}
-3
View File
@@ -1,3 +0,0 @@
-ignorewarnings
-keep class net.fabricmc.api.** { *; }
+1 -2
View File
@@ -1,10 +1,10 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
mavenCentral()
gradlePluginPortal()
}
}
@@ -12,4 +12,3 @@ pluginManagement {
rootProject.name = 'omega-config'
include 'omega-config-base'
include 'omega-config-gui'
@@ -1,20 +1,19 @@
package draylar.omegatest;
import draylar.omegaconfiggui.OmegaConfigGui;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.LiteralText;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.text.Text;
public class OmegaTestClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
OmegaConfigGui.registerConfigScreen(OmegaTestMain.CONFIG);
HudRenderCallback.EVENT.register((stack, delta) -> {
MinecraftClient.getInstance().textRenderer.draw(stack, new LiteralText(String.valueOf(OmegaTestMain.CONFIG.v)), 15, 15, 0xffffff);
MinecraftClient.getInstance().textRenderer.draw(stack, new LiteralText(String.valueOf(OmegaTestMain.CONFIG.doubleTest)), 15, 30, 0xffffff);
HudRenderCallback.EVENT.register((context, delta) -> {
TextRenderer tr = MinecraftClient.getInstance().textRenderer;
context.drawText(tr, Text.literal(String.valueOf(OmegaTestMain.CONFIG.v)), 15, 15, 0xffffff, true);
context.drawText(tr, Text.literal(String.valueOf(OmegaTestMain.CONFIG.doubleTest)), 15, 25, 0xffffff, true);
});
}
}
@@ -8,7 +8,7 @@ import java.util.HashMap;
import java.util.Map;
//taken straight out of Mo' Structures
//taken straight out of Mo Structures
public class StructuresConfigTest implements Config {
@Comment("""
@@ -0,0 +1,3 @@
{
"config.omega-config-test.test-config": "Omega Config - Test Config"
}