Add support for Sodium GUI sliders

This commit is contained in:
JFronny 2020-10-15 19:42:24 +02:00
parent dd6879da5c
commit 80c466b114
7 changed files with 146 additions and 3 deletions

View File

@ -10,11 +10,17 @@ archivesBaseName = project.archives_base_name
version = project.mod_version
group = project.maven_group
repositories {
maven { url 'https://jitpack.io' }
}
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 'com.github.jellysquid3:sodium-fabric:mc1.16.3-0.1.0'
}
processResources {

View File

@ -6,6 +6,6 @@ minecraft_version=1.16.3
yarn_mappings=1.16.3+build.27
loader_version=0.10.0+build.208
# Mod Properties
mod_version=1.0
mod_version=1.1
maven_group=io.gitlab.jfronny
archives_base_name=Slyde

View File

@ -0,0 +1,51 @@
package io.gitlab.jfronny.slyde;
import net.fabricmc.loader.api.FabricLoader;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;
public class Cfg {
public boolean sodiumCompat = true;
public boolean forceSodiumCompat = false;
private static Cfg conf = null;
public static Cfg get() {
if (conf == null)
load();
return conf;
}
private static void load() {
Properties p = new Properties();
conf = new Cfg();
Path c = FabricLoader.getInstance().getConfigDir().resolve("slyde.cfg");
try (InputStream s = Files.newInputStream(c)) {
p.load(s);
} catch (IOException e) {
e.printStackTrace();
}
conf.sodiumCompat = getBool(p, "sodiumCompat", conf.sodiumCompat);
conf.forceSodiumCompat = getBool(p, "forceSodiumCompat", conf.forceSodiumCompat);
try {
p.store(Files.newOutputStream(c), "Slyde config");
} catch (IOException e) {
e.printStackTrace();
}
}
private static boolean getBool(Properties p, String name, boolean def) {
Object o = p.get(name);
if (o instanceof Boolean)
return (Boolean) o;
if (o instanceof String)
return Boolean.parseBoolean((String) o);
p.put(name, Boolean.toString(def));
return def;
}
}

View File

@ -0,0 +1,51 @@
package io.gitlab.jfronny.slyde;
import io.gitlab.jfronny.slyde.mixin.SodiumSliderControlMixin;
import net.fabricmc.loader.api.FabricLoader;
import org.objectweb.asm.tree.ClassNode;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
import java.util.List;
import java.util.Objects;
import java.util.Set;
public class Plugin implements IMixinConfigPlugin {
@Override
public void onLoad(String mixinPackage) {
}
@Override
public String getRefMapperConfig() {
return null;
}
@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
if ("io.gitlab.jfronny.slyde.mixin.SodiumSliderControlMixin".equals(mixinClassName))
return Cfg.get().forceSodiumCompat || (Cfg.get().sodiumCompat && FabricLoader.getInstance().isModLoaded("sodium"));
else
return true;
}
@Override
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
}
@Override
public List<String> getMixins() {
return null;
}
@Override
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
@Override
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
}

View File

@ -1,5 +1,6 @@
package io.gitlab.jfronny.slyde.client;
import io.gitlab.jfronny.slyde.Cfg;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@ -8,6 +9,6 @@ import net.fabricmc.api.Environment;
public class SlydeClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
Cfg.get();
}
}

View File

@ -0,0 +1,32 @@
package io.gitlab.jfronny.slyde.mixin;
import me.jellysquid.mods.sodium.client.gui.options.Option;
import me.jellysquid.mods.sodium.client.gui.options.control.ControlElement;
import me.jellysquid.mods.sodium.client.util.Dim2i;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
@Mixin(targets = "me.jellysquid.mods.sodium.client.gui.options.control.SliderControl$Button")
public abstract class SodiumSliderControlMixin extends ControlElement<Integer> {
@Shadow(remap = false) private double thumbPosition;
public SodiumSliderControlMixin(Option<Integer> option, Dim2i dim) {
super(option, dim);
}
@Shadow(remap = false) public abstract int getIntValue();
/**
* @author JFronny
* @reason Removing the MathHelper.clamp call would be a pain any other way
*/
@Overwrite(remap = false)
private void setValue(double d) {
this.thumbPosition = d;
int value = this.getIntValue();
if (this.option.getValue() != value) {
this.option.setValue(value);
}
}
}

View File

@ -3,11 +3,13 @@
"minVersion": "0.8",
"package": "io.gitlab.jfronny.slyde.mixin",
"compatibilityLevel": "JAVA_8",
"plugin": "io.gitlab.jfronny.slyde.Plugin",
"mixins": [
],
"client": [
"DoubleOptionMixin",
"SliderWidgetMixin",
"DoubleOptionMixin"
"SodiumSliderControlMixin"
],
"injectors": {
"defaultRequire": 1