1
0
mirror of https://github.com/chylex/Better-Controls.git synced 2025-04-09 15:15:51 +02:00

Implement option to disable double tapping to sprint

This commit is contained in:
chylex 2020-10-17 14:27:28 +02:00
parent 482daeba3f
commit ed5e73956f
7 changed files with 113 additions and 0 deletions

View File

@ -9,6 +9,8 @@ public final class BetterControlsConfig{
private Path path;
public boolean doubleTapForwardToSprint = true;
BetterControlsConfig(){}
private BetterControlsConfig setPath(final Path path){

View File

@ -30,6 +30,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
public JsonElement serialize(final BetterControlsConfig cfg, final Type typeOfSrc, final JsonSerializationContext context){
final JsonObject obj = new JsonObject();
Json.setBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint);
return obj;
}
@ -38,6 +40,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
final BetterControlsConfig cfg = new BetterControlsConfig();
final JsonObject obj = json.getAsJsonObject();
cfg.doubleTapForwardToSprint = Json.getBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint);
return cfg;
}

View File

@ -1,6 +1,9 @@
package chylex.bettercontrols.gui;
import chylex.bettercontrols.BetterControlsMod;
import chylex.bettercontrols.config.BetterControlsConfig;
import chylex.bettercontrols.gui.elements.BooleanValueWidget;
import chylex.bettercontrols.gui.elements.KeyBindingWidget;
import chylex.bettercontrols.gui.elements.TextWidget;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.screen.Screen;
@ -11,9 +14,14 @@ import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import org.lwjgl.glfw.GLFW;
import java.util.ArrayList;
import java.util.List;
import static chylex.bettercontrols.gui.OptionListWidget.COL2_W;
import static chylex.bettercontrols.gui.OptionListWidget.ROW_WIDTH;
import static chylex.bettercontrols.gui.OptionListWidget.col2;
import static chylex.bettercontrols.gui.elements.TextWidget.CENTER;
public class BetterControlsScreen extends GameOptionsScreen{
public static final LiteralText TITLE = new LiteralText("Better Controls");
@ -23,6 +31,26 @@ public class BetterControlsScreen extends GameOptionsScreen{
private static final int TITLE_MARGIN_TOP = 3;
private static final int ROW_HEIGHT = 22;
// Options
private int generateSprintingOptions(int y, final List<Element> elements){
final BetterControlsConfig cfg = BetterControlsMod.config;
generateLeftSideText(y, elements, Text.of("Double Tap 'Walk Forwards' To Sprint"));
elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.doubleTapForwardToSprint, value -> cfg.doubleTapForwardToSprint = value));
y += ROW_HEIGHT;
return y;
}
// Helpers
private static void generateLeftSideText(final int y, final List<Element> elements, final Text text){
elements.add(new TextWidget(col2(0), y, COL2_W - TEXT_PADDING_RIGHT, text));
}
// Instance
private OptionListWidget optionsWidget;
private KeyBindingWidget editingKeyBinding;
private final List<KeyBindingWidget> allKeyBindings = new ArrayList<>();
@ -38,6 +66,9 @@ public class BetterControlsScreen extends GameOptionsScreen{
final List<Element> elements = new ArrayList<>();
int y = 0;
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Sprinting"), CENTER));
y = generateSprintingOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
addButton(new ButtonWidget(width / 2 - 99, height - 29, 200, 20, ScreenTexts.DONE, btn -> client.openScreen(parent)));
addChild(optionsWidget = new OptionListWidget(21, height - 32, width, height, elements, y - TITLE_MARGIN_TOP + BOTTOM_PADDING));
}

View File

@ -0,0 +1,10 @@
package chylex.bettercontrols.mixin;
import net.minecraft.client.network.ClientPlayerEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(ClientPlayerEntity.class)
public interface AccessClientPlayerFields{
@Accessor
void setTicksLeftToDoubleTapSprint(int value);
}

View File

@ -0,0 +1,23 @@
package chylex.bettercontrols.mixin;
import chylex.bettercontrols.player.PlayerTicker;
import com.mojang.authlib.GameProfile;
import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.world.ClientWorld;
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;
@Mixin(ClientPlayerEntity.class)
public abstract class HookClientPlayerTick extends AbstractClientPlayerEntity{
protected HookClientPlayerTick(final ClientWorld world, final GameProfile profile){
super(world, profile);
}
@Inject(method = "tickMovement()V", at = @At("HEAD"))
private void atHead(final CallbackInfo info){
final ClientPlayerEntity player = (ClientPlayerEntity)(Object)this;
PlayerTicker.get(player).atHead(player);
}
}

View File

@ -0,0 +1,41 @@
package chylex.bettercontrols.player;
import chylex.bettercontrols.BetterControlsMod;
import chylex.bettercontrols.config.BetterControlsConfig;
import chylex.bettercontrols.mixin.AccessClientPlayerFields;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import java.lang.ref.WeakReference;
public final class PlayerTicker{
private static PlayerTicker ticker = new PlayerTicker(null);
public static PlayerTicker get(final ClientPlayerEntity player){
if (ticker.ref.get() != player){
ticker = new PlayerTicker(player);
}
return ticker;
}
private static MinecraftClient mc(){
return MinecraftClient.getInstance();
}
private static BetterControlsConfig cfg(){
return BetterControlsMod.config;
}
private final WeakReference<ClientPlayerEntity> ref;
private PlayerTicker(final ClientPlayerEntity player){
this.ref = new WeakReference<>(player);
}
// Logic
public void atHead(final ClientPlayerEntity player){
if (!cfg().doubleTapForwardToSprint){
((AccessClientPlayerFields)player).setTicksLeftToDoubleTapSprint(0);
}
}
}

View File

@ -4,8 +4,10 @@
"package": "chylex.bettercontrols.mixin",
"compatibilityLevel": "JAVA_8",
"mixins": [
"AccessClientPlayerFields",
"AccessKeyBindingFields",
"AccessScreenButtons",
"HookClientPlayerTick",
"HookLoadGameOptions",
"HookOpenScreen",
"HookStickyKeyBindingState"