1
0
forked from Clones/Controlify

virtual mouse + singleplayer screen compat + 22w05a

This commit is contained in:
isXander
2023-02-02 21:36:44 +00:00
parent 57fcd0c0dc
commit 09628defc4
34 changed files with 697 additions and 111 deletions

View File

@ -1,6 +1,7 @@
package dev.isxander.controlify.config;
import com.google.gson.*;
import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.controller.Controller;
import dev.isxander.controlify.controller.ControllerConfig;
import net.fabricmc.loader.api.FabricLoader;
@ -19,20 +20,23 @@ public class ControlifyConfig {
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
private static JsonObject config = new JsonObject();
private JsonObject controllerData = new JsonObject();
private GlobalSettings globalSettings = new GlobalSettings();
public void save() {
Controlify.LOGGER.info("Saving Controlify config...");
public static void save() {
try {
generateConfig();
Files.deleteIfExists(CONFIG_PATH);
Files.writeString(CONFIG_PATH, GSON.toJson(config), StandardOpenOption.CREATE_NEW, StandardOpenOption.TRUNCATE_EXISTING);
Files.writeString(CONFIG_PATH, GSON.toJson(generateConfig()), StandardOpenOption.CREATE_NEW, StandardOpenOption.TRUNCATE_EXISTING);
} catch (IOException e) {
throw new IllegalStateException("Failed to save config!", e);
}
}
public static void load() {
public void load() {
Controlify.LOGGER.info("Loading Controlify config...");
if (!Files.exists(CONFIG_PATH)) {
save();
return;
@ -45,19 +49,26 @@ public class ControlifyConfig {
}
}
private static void generateConfig() {
JsonObject configCopy = config.deepCopy(); // we use the old config, so we don't lose disconnected controller data
private JsonObject generateConfig() {
JsonObject config = new JsonObject();
JsonObject newControllerData = controllerData.deepCopy(); // we use the old config, so we don't lose disconnected controller data
for (var controller : Controller.CONTROLLERS.values()) {
// `add` replaces if already existing
// TODO: find a better way to identify controllers, GUID will report the same for multiple controllers of the same model
configCopy.add(controller.guid(), generateControllerConfig(controller));
newControllerData.add(controller.guid(), generateControllerConfig(controller));
}
config = configCopy;
controllerData = newControllerData;
config.add("controllers", controllerData);
config.add("global", GSON.toJsonTree(globalSettings));
return config;
}
private static JsonObject generateControllerConfig(Controller controller) {
private JsonObject generateControllerConfig(Controller controller) {
JsonObject object = new JsonObject();
object.add("config", GSON.toJsonTree(controller.config()));
@ -66,17 +77,27 @@ public class ControlifyConfig {
return object;
}
private static void applyConfig(JsonObject object) {
for (var controller : Controller.CONTROLLERS.values()) {
var settings = object.getAsJsonObject(controller.guid());
if (settings != null) {
applyControllerConfig(controller, settings);
private void applyConfig(JsonObject object) {
globalSettings = GSON.fromJson(object.getAsJsonObject("global"), GlobalSettings.class);
if (globalSettings == null) globalSettings = new GlobalSettings();
JsonObject controllers = object.getAsJsonObject("controllers");
if (controllers != null) {
for (var controller : Controller.CONTROLLERS.values()) {
var settings = controllers.getAsJsonObject(controller.guid());
if (settings != null) {
applyControllerConfig(controller, settings);
}
}
}
}
private static void applyControllerConfig(Controller controller, JsonObject object) {
controller.config().overwrite(GSON.fromJson(object.getAsJsonObject("config"), ControllerConfig.class));
private void applyControllerConfig(Controller controller, JsonObject object) {
controller.setConfig(GSON.fromJson(object.getAsJsonObject("config"), ControllerConfig.class));
controller.bindings().fromJson(object.getAsJsonObject("bindings"));
}
public GlobalSettings globalSettings() {
return globalSettings;
}
}

View File

@ -0,0 +1,13 @@
package dev.isxander.controlify.config;
import com.google.common.collect.Lists;
import java.util.List;
public class GlobalSettings {
public static final GlobalSettings DEFAULT = new GlobalSettings();
public List<String> virtualMouseScreens = Lists.newArrayList(
);
}

View File

@ -1,23 +1,46 @@
package dev.isxander.controlify.config.gui;
import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.bindings.Bind;
import dev.isxander.controlify.config.ControlifyConfig;
import dev.isxander.controlify.config.GlobalSettings;
import dev.isxander.controlify.controller.Controller;
import dev.isxander.controlify.controller.ControllerConfig;
import dev.isxander.yacl.api.ConfigCategory;
import dev.isxander.yacl.api.Option;
import dev.isxander.yacl.api.OptionGroup;
import dev.isxander.yacl.api.YetAnotherConfigLib;
import dev.isxander.yacl.api.*;
import dev.isxander.yacl.gui.controllers.cycling.CyclingListController;
import dev.isxander.yacl.gui.controllers.slider.FloatSliderController;
import dev.isxander.yacl.gui.controllers.slider.IntegerSliderController;
import dev.isxander.yacl.gui.controllers.string.StringController;
import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.locale.Language;
import net.minecraft.network.chat.Component;
public class YACLHelper {
public static Screen generateConfigScreen(Screen parent) {
var controlify = Controlify.instance();
var yacl = YetAnotherConfigLib.createBuilder()
.title(Component.literal("Controlify"))
.save(ControlifyConfig::save);
.save(() -> controlify.config().save());
var globalCategory = ConfigCategory.createBuilder()
.name(Component.translatable("controlify.gui.category.global"))
.option(Option.createBuilder(Controller.class)
.name(Component.translatable("controlify.gui.current_controller"))
.tooltip(Component.translatable("controlify.gui.current_controller.tooltip"))
.binding(Controlify.instance().currentController(), () -> Controlify.instance().currentController(), v -> Controlify.instance().setCurrentController(v))
.controller(opt -> new CyclingListController<>(opt, Controller.CONTROLLERS.values().stream().filter(Controller::connected).toList(), c -> Component.literal(c.name())))
.instant(true)
.build())
.option(ListOption.createBuilder(String.class)
.name(Component.translatable("controlify.gui.vmouse_screens"))
.tooltip(Component.translatable("controlify.gui.vmouse_screens.tooltip"))
.binding(GlobalSettings.DEFAULT.virtualMouseScreens, () -> controlify.config().globalSettings().virtualMouseScreens, v -> controlify.config().globalSettings().virtualMouseScreens = v)
.controller(StringController::new)
.initial(Language.getInstance().getOrDefault("controlify.gui.vmouse_screens.placeholder"))
.build());
yacl.category(globalCategory.build());
for (var controller : Controller.CONTROLLERS.values()) {
var category = ConfigCategory.createBuilder();
@ -42,19 +65,25 @@ public class YACLHelper {
.binding(def.verticalLookSensitivity, () -> config.verticalLookSensitivity, v -> config.verticalLookSensitivity = v)
.controller(opt -> new FloatSliderController(opt, 0.1f, 2f, 0.05f, v -> Component.literal(String.format("%.0f%%", v*100))))
.build())
.option(Option.createBuilder(int.class)
.name(Component.translatable("controlify.gui.screen_repeat_navi_delay"))
.tooltip(Component.translatable("controlify.gui.screen_repeat_navi_delay.tooltip"))
.binding(def.screenRepeatNavigationDelay, () -> config.screenRepeatNavigationDelay, v -> config.screenRepeatNavigationDelay = v)
.controller(opt -> new IntegerSliderController(opt, 1, 20, 1, v -> Component.translatable("controlify.gui.format.ticks", v)))
.build())
.option(Option.createBuilder(float.class)
.name(Component.translatable("controlify.gui.left_stick_deadzone"))
.tooltip(Component.translatable("controlify.gui.left_stick_deadzone.tooltip"))
.tooltip(Component.translatable("controlify.gui.stickdrift_warning").withStyle(ChatFormatting.RED))
.binding(def.leftStickDeadzone, () -> config.leftStickDeadzone, v -> config.leftStickDeadzone = v)
.controller(opt -> new FloatSliderController(opt, 0, 1, 0.02f, v -> Component.literal(String.format("%.0f%%", v*100))))
.controller(opt -> new FloatSliderController(opt, 0, 1, 0.01f, v -> Component.literal(String.format("%.0f%%", v*100))))
.build())
.option(Option.createBuilder(float.class)
.name(Component.translatable("controlify.gui.right_stick_deadzone"))
.tooltip(Component.translatable("controlify.gui.right_stick_deadzone.tooltip"))
.tooltip(Component.translatable("controlify.gui.stickdrift_warning").withStyle(ChatFormatting.RED))
.binding(def.rightStickDeadzone, () -> config.rightStickDeadzone, v -> config.rightStickDeadzone = v)
.controller(opt -> new FloatSliderController(opt, 0, 1, 0.02f, v -> Component.literal(String.format("%.0f%%", v*100))))
.controller(opt -> new FloatSliderController(opt, 0, 1, 0.01f, v -> Component.literal(String.format("%.0f%%", v*100))))
.build())
.option(Option.createBuilder(float.class)
.name(Component.translatable("controlify.gui.left_trigger_threshold"))