Просмотр исходного кода

Implement toggle keys for walking forward & jumping

chylex 4 лет назад
Родитель
Сommit
b32bebe33d

+ 4 - 0
src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java

@@ -21,6 +21,8 @@ public final class BetterControlsConfig{
 	public float flightSpeedMpSpectatorDefault = 1F;
 	public float flightSpeedMpSpectatorSprinting = 2F;
 	
+	public final KeyBindingWithModifier keyToggleWalkForward = new KeyBindingWithModifier("key.bettercontrols.toggle_forward");
+	public final KeyBindingWithModifier keyToggleJump = new KeyBindingWithModifier("key.bettercontrols.toggle_jump");
 	public final KeyBindingWithModifier keyOpenMenu = new KeyBindingWithModifier("key.bettercontrols.open_menu");
 	
 	BetterControlsConfig(){}
@@ -32,6 +34,8 @@ public final class BetterControlsConfig{
 	
 	public KeyBinding[] getAllKeyBindings(){
 		return new KeyBinding[]{
+			keyToggleWalkForward,
+			keyToggleJump,
 			keyOpenMenu
 		};
 	}

+ 4 - 0
src/main/java/chylex/bettercontrols/config/ConfigSerializer.java

@@ -41,6 +41,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
 		Json.setFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault);
 		Json.setFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting);
 		
+		Json.writeKeyBinding(obj, "Misc.KeyToggleWalkForward", cfg.keyToggleWalkForward);
+		Json.writeKeyBinding(obj, "Misc.KeyToggleJump", cfg.keyToggleJump);
 		Json.writeKeyBinding(obj, "Misc.KeyOpenMenu", cfg.keyOpenMenu);
 		
 		return obj;
@@ -62,6 +64,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
 		cfg.flightSpeedMpSpectatorDefault = Json.getFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault);
 		cfg.flightSpeedMpSpectatorSprinting = Json.getFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting);
 		
+		Json.readKeyBinding(obj, "Misc.KeyToggleWalkForward", cfg.keyToggleWalkForward);
+		Json.readKeyBinding(obj, "Misc.KeyToggleJump", cfg.keyToggleJump);
 		Json.readKeyBinding(obj, "Misc.KeyOpenMenu", cfg.keyOpenMenu);
 		
 		return cfg;

+ 8 - 0
src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java

@@ -113,6 +113,14 @@ public class BetterControlsScreen extends GameOptionsScreen{
 	private int generateMiscellaneousOptions(int y, final List<Element> elements){
 		final BetterControlsConfig cfg = BetterControlsMod.config;
 		
+		generateKeyBindingWithModifierOption(y, elements, Text.of("Toggle Walk Forwards"), cfg.keyToggleWalkForward);
+		
+		y += ROW_HEIGHT;
+		
+		generateKeyBindingWithModifierOption(y, elements, Text.of("Toggle Jump"), cfg.keyToggleJump);
+		
+		y += ROW_HEIGHT * 4 / 3;
+		
 		generateKeyBindingWithModifierOption(y, elements, Text.of("Open Better Controls Menu"), cfg.keyOpenMenu);
 		
 		y += ROW_HEIGHT;

+ 23 - 0
src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java

@@ -0,0 +1,23 @@
+package chylex.bettercontrols.mixin;
+import chylex.bettercontrols.player.PlayerTicker;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.input.KeyboardInput;
+import net.minecraft.client.network.ClientPlayerEntity;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
+
+@Mixin(KeyboardInput.class)
+public abstract class HookClientPlayerInputTick{
+	@Inject(method = "tick(Z)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/input/KeyboardInput;pressingForward:Z", ordinal = 0, shift = AFTER))
+	private void afterInputTick(final CallbackInfo info){
+		final KeyboardInput input = (KeyboardInput)(Object)this;
+		final ClientPlayerEntity player = MinecraftClient.getInstance().player;
+		
+		if (player != null){
+			PlayerTicker.get(player).afterInputAssignsPressingForward(input);
+		}
+	}
+}

+ 15 - 0
src/main/java/chylex/bettercontrols/player/PlayerTicker.java

@@ -2,9 +2,11 @@ package chylex.bettercontrols.player;
 import chylex.bettercontrols.BetterControlsMod;
 import chylex.bettercontrols.config.BetterControlsConfig;
 import chylex.bettercontrols.gui.BetterControlsScreen;
+import chylex.bettercontrols.input.ToggleTracker;
 import chylex.bettercontrols.mixin.AccessCameraFields;
 import chylex.bettercontrols.mixin.AccessClientPlayerFields;
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.input.KeyboardInput;
 import net.minecraft.client.network.ClientPlayerEntity;
 import java.lang.ref.WeakReference;
 
@@ -35,6 +37,9 @@ public final class PlayerTicker{
 	
 	// Logic
 	
+	private final ToggleTracker toggleWalkForward = new ToggleTracker(cfg().keyToggleWalkForward, mc().options.keyForward);
+	private final ToggleTracker toggleJump = new ToggleTracker(cfg().keyToggleJump, mc().options.keyJump);
+	
 	private boolean wasHittingObstacle = false;
 	private boolean wasSprintingBeforeHittingObstacle = false;
 	
@@ -51,7 +56,17 @@ public final class PlayerTicker{
 		}
 	}
 	
+	public void afterInputAssignsPressingForward(final KeyboardInput input){
+		if (mc().currentScreen == null){
+			input.pressingForward |= toggleWalkForward.tick();
+		}
+	}
+	
 	public void afterInputTick(final ClientPlayerEntity player){
+		if (mc().currentScreen == null && !player.abilities.flying){
+			player.input.jumping |= toggleJump.tick();
+		}
+		
 		final float flightSpeed = FlightHelper.getFlightSpeed(player);
 		
 		if (flightSpeed > 0F){

+ 2 - 0
src/main/resources/assets/bettercontrols/lang/en_us.json

@@ -1,4 +1,6 @@
 {
   "key.categories.bettercontrols": "Better Controls",
+  "key.bettercontrols.toggle_forward": "Toggle Walk Forwards",
+  "key.bettercontrols.toggle_jump": "Toggle Jump",
   "key.bettercontrols.open_menu": "Open Menu"
 }

+ 1 - 0
src/main/resources/mixins.json

@@ -8,6 +8,7 @@
     "AccessClientPlayerFields",
     "AccessKeyBindingFields",
     "AccessScreenButtons",
+    "HookClientPlayerInputTick",
     "HookClientPlayerTick",
     "HookLoadGameOptions",
     "HookOpenScreen",