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:
parent
482daeba3f
commit
ed5e73956f
src/main
java/chylex/bettercontrols
config
gui
mixin
player
resources
@ -9,6 +9,8 @@ public final class BetterControlsConfig{
|
||||
|
||||
private Path path;
|
||||
|
||||
public boolean doubleTapForwardToSprint = true;
|
||||
|
||||
BetterControlsConfig(){}
|
||||
|
||||
private BetterControlsConfig setPath(final Path path){
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
41
src/main/java/chylex/bettercontrols/player/PlayerTicker.java
Normal file
41
src/main/java/chylex/bettercontrols/player/PlayerTicker.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -4,8 +4,10 @@
|
||||
"package": "chylex.bettercontrols.mixin",
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"mixins": [
|
||||
"AccessClientPlayerFields",
|
||||
"AccessKeyBindingFields",
|
||||
"AccessScreenButtons",
|
||||
"HookClientPlayerTick",
|
||||
"HookLoadGameOptions",
|
||||
"HookOpenScreen",
|
||||
"HookStickyKeyBindingState"
|
||||
|
Loading…
Reference in New Issue
Block a user