diff --git a/gradle.properties b/gradle.properties index e0e3b33..a4e6f12 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,5 +15,5 @@ archives_base_name = lambdacontrols # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api fabric_version=0.32.0+1.16 -spruceui_version=2.1.3-1.16 +spruceui_version=2.1.4-1.16 modmenu_version=1.16.8 diff --git a/src/main/java/dev/lambdaurora/lambdacontrols/client/LambdaControlsConfig.java b/src/main/java/dev/lambdaurora/lambdacontrols/client/LambdaControlsConfig.java index 26faef5..d4b0dd8 100644 --- a/src/main/java/dev/lambdaurora/lambdacontrols/client/LambdaControlsConfig.java +++ b/src/main/java/dev/lambdaurora/lambdacontrols/client/LambdaControlsConfig.java @@ -40,6 +40,7 @@ public class LambdaControlsConfig { private static final boolean DEFAULT_HUD_ENABLE = true; private static final HudSide DEFAULT_HUD_SIDE = HudSide.LEFT; // Gameplay + private static final boolean DEFAULT_ANALOG_MOVEMENT = true; private static final boolean DEFAULT_FAST_BLOCK_INTERACTION = true; private static final boolean DEFAULT_FLY_DRIFTING = false; private static final boolean DEFAULT_FLY_VERTICAL_DRIFTING = true; @@ -63,6 +64,7 @@ public class LambdaControlsConfig { private ControlsMode controlsMode; private ControllerType controllerType; // Gameplay. + private boolean analogMovement; private boolean shouldRenderReacharoundOutline; private int[] reacharoundOutlineColor; // Controller settings @@ -92,6 +94,7 @@ public class LambdaControlsConfig { this.hudEnable = this.config.getOrElse("hud.enable", DEFAULT_HUD_ENABLE); this.hudSide = HudSide.byId(this.config.getOrElse("hud.side", DEFAULT_HUD_SIDE.getName())).orElse(DEFAULT_HUD_SIDE); // Gameplay + this.analogMovement = this.config.getOrElse("gameplay.analog_movement", DEFAULT_ANALOG_MOVEMENT); LambdaControlsFeature.FAST_BLOCK_PLACING.setEnabled(this.config.getOrElse("gameplay.fast_block_placing", DEFAULT_FAST_BLOCK_INTERACTION)); LambdaControlsFeature.HORIZONTAL_REACHAROUND.setEnabled(this.config.getOrElse("gameplay.reacharound.horizontal", DEFAULT_HORIZONTAL_REACHAROUND)); LambdaControlsFeature.VERTICAL_REACHAROUND.setEnabled(this.config.getOrElse("gameplay.reacharound.vertical", DEFAULT_VERTICAL_REACHAROUND)); @@ -170,6 +173,7 @@ public class LambdaControlsConfig { this.setAutoSwitchMode(DEFAULT_AUTO_SWITCH_MODE); this.setDebug(DEFAULT_DEBUG); // Gameplay + this.setAnalogMovement(DEFAULT_ANALOG_MOVEMENT); this.setFastBlockPlacing(DEFAULT_FAST_BLOCK_INTERACTION); this.setFlyDrifting(DEFAULT_FLY_DRIFTING); this.setFlyVerticalDrifting(DEFAULT_FLY_VERTICAL_DRIFTING); @@ -293,6 +297,22 @@ public class LambdaControlsConfig { Gameplay settings */ + /** + * Gets whether analog movement is enabled. + * @return {@code true} if analog movement is enabled, else {@code false} + */ + public boolean hasAnalogMovement() { + return this.analogMovement; + } + + /** + * Sets whether analog movement is enabled. + * @param analogMovement {@code true} if analog movement is enabled, else {@code false} + */ + public void setAnalogMovement(boolean analogMovement) { + this.config.set("gameplay.analog_movement", this.analogMovement = analogMovement); + } + /** * Gets whether fast block placing is enabled or not. * diff --git a/src/main/java/dev/lambdaurora/lambdacontrols/client/LambdaInput.java b/src/main/java/dev/lambdaurora/lambdacontrols/client/LambdaInput.java index 15bf3c0..1ebe914 100644 --- a/src/main/java/dev/lambdaurora/lambdacontrols/client/LambdaInput.java +++ b/src/main/java/dev/lambdaurora/lambdacontrols/client/LambdaInput.java @@ -69,7 +69,7 @@ import static org.lwjgl.glfw.GLFW.*; * Represents the LambdaControls' input handler. * * @author LambdAurora - * @version 1.4.3 + * @version 1.6.0 * @since 1.0.0 */ public class LambdaInput { diff --git a/src/main/java/dev/lambdaurora/lambdacontrols/client/controller/MovementHandler.java b/src/main/java/dev/lambdaurora/lambdacontrols/client/controller/MovementHandler.java index 77222b9..141e130 100644 --- a/src/main/java/dev/lambdaurora/lambdacontrols/client/controller/MovementHandler.java +++ b/src/main/java/dev/lambdaurora/lambdacontrols/client/controller/MovementHandler.java @@ -10,6 +10,7 @@ package dev.lambdaurora.lambdacontrols.client.controller; import dev.lambdaurora.lambdacontrols.client.ButtonState; +import dev.lambdaurora.lambdacontrols.client.LambdaControlsClient; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import org.jetbrains.annotations.NotNull; @@ -18,7 +19,7 @@ import org.jetbrains.annotations.NotNull; * Represents the movement handler. * * @author LambdAurora - * @version 1.4.0 + * @version 1.6.0 * @since 1.4.0 */ public final class MovementHandler implements PressAction { @@ -67,7 +68,9 @@ public final class MovementHandler implements PressAction { this.shouldOverrideMovement = direction != 0; - value = (float) Math.pow(value, 2); + if (LambdaControlsClient.get().config.hasAnalogMovement()) { + value = (float) Math.pow(value, 2); + } else value = 1.f; if (button == ButtonBinding.FORWARD || button == ButtonBinding.BACK) { // Handle forward movement. diff --git a/src/main/java/dev/lambdaurora/lambdacontrols/client/gui/LambdaControlsSettingsScreen.java b/src/main/java/dev/lambdaurora/lambdacontrols/client/gui/LambdaControlsSettingsScreen.java index cea600c..7b129f1 100644 --- a/src/main/java/dev/lambdaurora/lambdacontrols/client/gui/LambdaControlsSettingsScreen.java +++ b/src/main/java/dev/lambdaurora/lambdacontrols/client/gui/LambdaControlsSettingsScreen.java @@ -52,25 +52,26 @@ public class LambdaControlsSettingsScreen extends SpruceScreen { private final SpruceOption mouseSpeedOption; private final SpruceOption resetOption; // Gameplay options + private final SpruceOption analogMovementOption; private final SpruceOption autoJumpOption; private final SpruceOption fastBlockPlacingOption; private final SpruceOption frontBlockPlacingOption; private final SpruceOption verticalReacharoundOption; private final SpruceOption flyDriftingOption; private final SpruceOption flyVerticalDriftingOption; + // Appearance options + private final SpruceOption controllerTypeOption; + private final SpruceOption virtualMouseSkinOption; + private final SpruceOption hudEnableOption; + private final SpruceOption hudSideOption; // Controller options private final SpruceOption controllerOption; private final SpruceOption secondControllerOption; - private final SpruceOption controllerTypeOption; private final SpruceOption deadZoneOption; private final SpruceOption invertsRightXAxis; private final SpruceOption invertsRightYAxis; private final SpruceOption unfocusedInputOption; private final SpruceOption virtualMouseOption; - private final SpruceOption virtualMouseSkinOption; - // Hud options - private final SpruceOption hudEnableOption; - private final SpruceOption hudSideOption; private final MutableText controllerMappingsUrlText = new LiteralText("(") .append(new LiteralText(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD)) .append("),"); @@ -91,8 +92,8 @@ public class LambdaControlsSettingsScreen extends SpruceScreen { } }, option -> option.getDisplayText(new TranslatableText(this.mod.config.getControlsMode().getTranslationKey())), new TranslatableText("lambdacontrols.tooltip.controls_mode")); - this.autoSwitchModeOption = new SpruceBooleanOption("lambdacontrols.menu.auto_switch_mode", this.mod.config::hasAutoSwitchMode, - this.mod.config::setAutoSwitchMode, new TranslatableText("lambdacontrols.tooltip.auto_switch_mode"), true); + this.autoSwitchModeOption = new SpruceToggleBooleanOption("lambdacontrols.menu.auto_switch_mode", this.mod.config::hasAutoSwitchMode, + this.mod.config::setAutoSwitchMode, new TranslatableText("lambdacontrols.tooltip.auto_switch_mode")); this.rotationSpeedOption = new SpruceDoubleOption("lambdacontrols.menu.rotation_speed", 0.0, 100.0, 0.5F, this.mod.config::getRotationSpeed, newValue -> { synchronized (this.mod.config) { @@ -113,6 +114,9 @@ public class LambdaControlsSettingsScreen extends SpruceScreen { this.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight()); }); // Gameplay options + this.analogMovementOption = new SpruceToggleBooleanOption("lambdacontrols.menu.analog_movement", + this.mod.config::hasAnalogMovement, this.mod.config::setAnalogMovement, + new TranslatableText("lambdacontrols.tooltip.analog_movement")); this.autoJumpOption = new SpruceToggleBooleanOption("options.autoJump", () -> this.client.options.autoJump, newValue -> this.client.options.autoJump = newValue, @@ -127,6 +131,21 @@ public class LambdaControlsSettingsScreen extends SpruceScreen { this.mod.config::setFlyDrifting, new TranslatableText("lambdacontrols.tooltip.fly_drifting")); this.flyVerticalDriftingOption = new SpruceToggleBooleanOption("lambdacontrols.menu.fly_drifting_vertical", this.mod.config::hasFlyVerticalDrifting, this.mod.config::setFlyVerticalDrifting, new TranslatableText("lambdacontrols.tooltip.fly_drifting_vertical")); + // Appearance options + this.controllerTypeOption = new SpruceCyclingOption("lambdacontrols.menu.controller_type", + amount -> this.mod.config.setControllerType(this.mod.config.getControllerType().next()), + option -> option.getDisplayText(this.mod.config.getControllerType().getTranslatedText()), + new TranslatableText("lambdacontrols.tooltip.controller_type")); + this.virtualMouseSkinOption = new SpruceCyclingOption("lambdacontrols.menu.virtual_mouse.skin", + amount -> this.mod.config.setVirtualMouseSkin(this.mod.config.getVirtualMouseSkin().next()), + option -> option.getDisplayText(this.mod.config.getVirtualMouseSkin().getTranslatedText()), + null); + this.hudEnableOption = new SpruceToggleBooleanOption("lambdacontrols.menu.hud_enable", this.mod.config::isHudEnabled, + this.mod::setHudEnabled, new TranslatableText("lambdacontrols.tooltip.hud_enable")); + this.hudSideOption = new SpruceCyclingOption("lambdacontrols.menu.hud_side", + amount -> this.mod.config.setHudSide(this.mod.config.getHudSide().next()), + option -> option.getDisplayText(this.mod.config.getHudSide().getTranslatedText()), + new TranslatableText("lambdacontrols.tooltip.hud_side")); // Controller options this.controllerOption = new SpruceCyclingOption("lambdacontrols.menu.controller", amount -> { int id = this.mod.config.getController().getId(); @@ -160,10 +179,6 @@ public class LambdaControlsSettingsScreen extends SpruceScreen { return option.getDisplayText(new LiteralText(controllerName)); }).orElse(option.getDisplayText(SpruceTexts.OPTIONS_OFF.shallowCopy().formatted(Formatting.RED))), new TranslatableText("lambdacontrols.tooltip.controller2")); - this.controllerTypeOption = new SpruceCyclingOption("lambdacontrols.menu.controller_type", - amount -> this.mod.config.setControllerType(this.mod.config.getControllerType().next()), - option -> option.getDisplayText(this.mod.config.getControllerType().getTranslatedText()), - new TranslatableText("lambdacontrols.tooltip.controller_type")); this.deadZoneOption = new SpruceDoubleOption("lambdacontrols.menu.dead_zone", 0.05, 1.0, 0.05F, this.mod.config::getDeadZone, newValue -> { synchronized (this.mod.config) { @@ -173,33 +188,22 @@ public class LambdaControlsSettingsScreen extends SpruceScreen { String value = String.valueOf(option.get()); return option.getDisplayText(new LiteralText(value.substring(0, Math.min(value.length(), 5)))); }, new TranslatableText("lambdacontrols.tooltip.dead_zone")); - this.invertsRightXAxis = new SpruceBooleanOption("lambdacontrols.menu.invert_right_x_axis", this.mod.config::doesInvertRightXAxis, + this.invertsRightXAxis = new SpruceToggleBooleanOption("lambdacontrols.menu.invert_right_x_axis", this.mod.config::doesInvertRightXAxis, newValue -> { synchronized (this.mod.config) { this.mod.config.setInvertRightXAxis(newValue); } - }, null, true); - this.invertsRightYAxis = new SpruceBooleanOption("lambdacontrols.menu.invert_right_y_axis", this.mod.config::doesInvertRightYAxis, + }, null); + this.invertsRightYAxis = new SpruceToggleBooleanOption("lambdacontrols.menu.invert_right_y_axis", this.mod.config::doesInvertRightYAxis, newValue -> { synchronized (this.mod.config) { this.mod.config.setInvertRightYAxis(newValue); } - }, null, true); - this.unfocusedInputOption = new SpruceBooleanOption("lambdacontrols.menu.unfocused_input", this.mod.config::hasUnfocusedInput, - this.mod.config::setUnfocusedInput, new TranslatableText("lambdacontrols.tooltip.unfocused_input"), true); - this.virtualMouseOption = new SpruceBooleanOption("lambdacontrols.menu.virtual_mouse", this.mod.config::hasVirtualMouse, - this.mod.config::setVirtualMouse, new TranslatableText("lambdacontrols.tooltip.virtual_mouse"), true); - this.virtualMouseSkinOption = new SpruceCyclingOption("lambdacontrols.menu.virtual_mouse.skin", - amount -> this.mod.config.setVirtualMouseSkin(this.mod.config.getVirtualMouseSkin().next()), - option -> option.getDisplayText(this.mod.config.getVirtualMouseSkin().getTranslatedText()), - null); - // HUD options - this.hudEnableOption = new SpruceBooleanOption("lambdacontrols.menu.hud_enable", this.mod.config::isHudEnabled, - this.mod::setHudEnabled, new TranslatableText("lambdacontrols.tooltip.hud_enable"), true); - this.hudSideOption = new SpruceCyclingOption("lambdacontrols.menu.hud_side", - amount -> this.mod.config.setHudSide(this.mod.config.getHudSide().next()), - option -> option.getDisplayText(this.mod.config.getHudSide().getTranslatedText()), - new TranslatableText("lambdacontrols.tooltip.hud_side")); + }, null); + this.unfocusedInputOption = new SpruceToggleBooleanOption("lambdacontrols.menu.unfocused_input", this.mod.config::hasUnfocusedInput, + this.mod.config::setUnfocusedInput, new TranslatableText("lambdacontrols.tooltip.unfocused_input")); + this.virtualMouseOption = new SpruceToggleBooleanOption("lambdacontrols.menu.virtual_mouse", this.mod.config::hasVirtualMouse, + this.mod.config::setVirtualMouse, new TranslatableText("lambdacontrols.tooltip.virtual_mouse")); } @Override @@ -221,57 +225,6 @@ public class LambdaControlsSettingsScreen extends SpruceScreen { @Override protected void init() { super.init(); - /*int buttonHeight = 20; - SpruceButtonWidget controlsModeBtn = new SpruceButtonWidget(Position.of(this.width / 2 - 155, 18), this.hideControls ? 310 : 150, buttonHeight, - new TranslatableText("lambdacontrols.menu.controls_mode").append(": ").append(new TranslatableText(this.mod.config.getControlsMode().getTranslationKey())), - btn -> { - ControlsMode next = this.mod.config.getControlsMode().next(); - btn.setMessage(new TranslatableText("lambdacontrols.menu.controls_mode").append(": ").append(new TranslatableText(next.getTranslationKey()))); - this.mod.config.setControlsMode(next); - this.mod.config.save(); - - if (this.client.player != null) { - ClientSidePacketRegistry.INSTANCE.sendToServer(LambdaControls.CONTROLS_MODE_CHANNEL, this.mod.makeControlsModeBuffer(next)); - } - }); - controlsModeBtn.setTooltip(new TranslatableText("lambdacontrols.tooltip.controls_mode")); - this.addChild(controlsModeBtn); - if (!this.hideControls) - this.addButton(new ButtonWidget(this.width / 2 - 155 + 160, 18, 150, buttonHeight, new TranslatableText("options.controls"), - btn -> { - if (this.mod.config.getControlsMode() == ControlsMode.CONTROLLER) - this.client.openScreen(new ControllerControlsScreen(this, true)); - else - this.client.openScreen(new ControlsOptionsScreen(this, this.client.options)); - })); - - this.list = new SpruceOptionListWidget(Position.of(this, 0, 43), this.width, this.height - 29 - this.getTextHeight() - 43); - // General options - this.list.addSingleOptionEntry(new SpruceSeparatorOption("lambdacontrols.menu.title.general", true, null)); - this.list.addOptionEntry(this.rotationSpeedOption, this.mouseSpeedOption); - this.list.addSingleOptionEntry(this.autoSwitchModeOption); - // Gameplay options - this.list.addSingleOptionEntry(new SpruceSeparatorOption("lambdacontrols.menu.title.gameplay", true, null)); - //this.list.addOptionEntry(this.autoJumpOption, this.fastBlockPlacingOption); - this.list.addOptionEntry(this.frontBlockPlacingOption, this.verticalReacharoundOption); - this.list.addSingleOptionEntry(this.flyDriftingOption); - this.list.addSingleOptionEntry(this.flyVerticalDriftingOption); - //this.list.addOptionEntry(Option.SNEAK_TOGGLED, Option.SPRINT_TOGGLED); - // Controller options - this.list.addSingleOptionEntry(new SpruceSeparatorOption("lambdacontrols.menu.title.controller", true, null)); - this.list.addSingleOptionEntry(this.controllerOption); - this.list.addSingleOptionEntry(this.secondControllerOption); - this.list.addOptionEntry(this.controllerTypeOption, this.deadZoneOption); - this.list.addOptionEntry(this.invertsRightXAxis, this.invertsRightYAxis); - this.list.addOptionEntry(this.unfocusedInputOption, this.virtualMouseOption); - this.list.addSingleOptionEntry(this.virtualMouseSkinOption); - this.list.addSingleOptionEntry(ReloadControllerMappingsOption.newOption(null)); - this.list.addSingleOptionEntry(SpruceSimpleActionOption.of("lambdacontrols.menu.mappings.open_input_str", - btn -> this.client.openScreen(new MappingsStringInputScreen(this)))); - // HUD options - this.list.addSingleOptionEntry(new SpruceSeparatorOption("lambdacontrols.menu.title.hud", true, null)); - this.list.addOptionEntry(this.hudEnableOption, this.hudSideOption); - this.addChild(this.list);*/ this.buildTabs(); @@ -309,11 +262,15 @@ public class LambdaControlsSettingsScreen extends SpruceScreen { SpruceOptionListWidget list = new SpruceOptionListWidget(Position.origin(), width, height); list.addSingleOptionEntry(this.inputModeOption); list.addSingleOptionEntry(this.autoSwitchModeOption); + list.addSingleOptionEntry(this.rotationSpeedOption); + list.addSingleOptionEntry(this.mouseSpeedOption); + list.addSingleOptionEntry(this.virtualMouseOption); return list; } public SpruceOptionListWidget buildGameplayTab(int width, int height) { SpruceOptionListWidget list = new SpruceOptionListWidget(Position.origin(), width, height); + list.addSingleOptionEntry(this.analogMovementOption); list.addSingleOptionEntry(this.fastBlockPlacingOption); list.addSingleOptionEntry(this.frontBlockPlacingOption); list.addSingleOptionEntry(this.verticalReacharoundOption); @@ -326,6 +283,7 @@ public class LambdaControlsSettingsScreen extends SpruceScreen { public SpruceOptionListWidget buildVisualTab(int width, int height) { SpruceOptionListWidget list = new SpruceOptionListWidget(Position.origin(), width, height); list.addSingleOptionEntry(this.controllerTypeOption); + list.addSingleOptionEntry(this.virtualMouseSkinOption); list.addSingleOptionEntry(new SpruceSeparatorOption("lambdacontrols.menu.title.hud", true, null)); list.addSingleOptionEntry(this.hudEnableOption); list.addSingleOptionEntry(this.hudSideOption); @@ -364,6 +322,7 @@ public class LambdaControlsSettingsScreen extends SpruceScreen { SpruceOptionListWidget list = new SpruceOptionListWidget(Position.origin(), width, listHeight); list.addSingleOptionEntry(this.controllerOption); list.addSingleOptionEntry(this.secondControllerOption); + list.addSingleOptionEntry(this.unfocusedInputOption); root.addChild(list); root.addChild(labels); diff --git a/src/main/java/dev/lambdaurora/lambdacontrols/client/gui/widget/ControlsListWidget.java b/src/main/java/dev/lambdaurora/lambdacontrols/client/gui/widget/ControlsListWidget.java index 8f840c6..3451557 100644 --- a/src/main/java/dev/lambdaurora/lambdacontrols/client/gui/widget/ControlsListWidget.java +++ b/src/main/java/dev/lambdaurora/lambdacontrols/client/gui/widget/ControlsListWidget.java @@ -223,55 +223,6 @@ public class ControlsListWidget extends SpruceEntryListWidget ").formatted(Formatting.WHITE); - text.append(this.editButton.getMessage().copy().formatted(Formatting.YELLOW)); - this.editButton.setMessage(text.append(new LiteralText(" <").formatted(Formatting.WHITE))); - } else if (!this.binding.isNotBound() && InputManager.hasDuplicatedBindings(this.binding)) { - MutableText text = this.editButton.getMessage().copy(); - this.editButton.setMessage(text.formatted(Formatting.RED)); - } else if (this.binding.isNotBound()) { - MutableText text = this.editButton.getMessage().copy(); - this.editButton.setMessage(text.formatted(Formatting.GOLD)); - } - - this.editButton.render(matrices, mouseX, mouseY, delta); - }*/ - - /*public boolean mouseClicked(double mouseX, double mouseY, int button) { - boolean focused = gui.focusedBinding == this.binding; - if (this.editButton.mouseClicked(mouseX, mouseY, button)) - return true; - else - return focused ? this.unboundButton.mouseClicked(mouseX, mouseY, button) : this.resetButton.mouseClicked(mouseX, mouseY, button); - } - - public boolean mouseReleased(double mouseX, double mouseY, int button) { - return this.editButton.mouseReleased(mouseX, mouseY, button) || this.resetButton.mouseReleased(mouseX, mouseY, button) - || this.unboundButton.mouseReleased(mouseX, mouseY, button); - }*/ - /* Rendering */ @Override @@ -311,10 +262,11 @@ public class ControlsListWidget extends SpruceEntryListWidget