mirror of
https://github.com/chylex/Better-Controls.git
synced 2025-05-02 02:34:04 +02:00
Refactor mixins
This commit is contained in:
parent
aa499bead5
commit
9da758937e
src/main
java/chylex/bettercontrols
Mixins.java
input
mixin
AccessKeyMappingFields.javaAccessToggleKeyMappingFields.javaHookClientPlayerFOV.javaHookClientPlayerInputTick.javaHookClientPlayerTick.javaHookClientPlayerVerticalFlightSpeed.javaHookControlsScreen.javaHookLoadGameOptions.javaHookPlayerHorizontalFlightSpeed.javaHookStickyKeyBindingState.javaHookToggleOptionButtons.java
player
resources
42
src/main/java/chylex/bettercontrols/Mixins.java
Normal file
42
src/main/java/chylex/bettercontrols/Mixins.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package chylex.bettercontrols;
|
||||||
|
|
||||||
|
import chylex.bettercontrols.mixin.AccessCameraFields;
|
||||||
|
import chylex.bettercontrols.mixin.AccessClientPlayerFields;
|
||||||
|
import chylex.bettercontrols.mixin.AccessKeyMappingFields;
|
||||||
|
import chylex.bettercontrols.mixin.AccessPlayerFields;
|
||||||
|
import chylex.bettercontrols.mixin.AccessToggleKeyMappingFields;
|
||||||
|
import net.minecraft.client.Camera;
|
||||||
|
import net.minecraft.client.KeyMapping;
|
||||||
|
import net.minecraft.client.ToggleKeyMapping;
|
||||||
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
|
||||||
|
@SuppressWarnings("CastToIncompatibleInterface")
|
||||||
|
public final class Mixins {
|
||||||
|
private Mixins() {}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T> T me(Object object) {
|
||||||
|
return (T) object;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AccessCameraFields cameraFields(Camera camera) {
|
||||||
|
return (AccessCameraFields) camera;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AccessClientPlayerFields clientPlayerFields(LocalPlayer localPlayer) {
|
||||||
|
return (AccessClientPlayerFields) localPlayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AccessKeyMappingFields keyMappingFields(KeyMapping keyMapping) {
|
||||||
|
return (AccessKeyMappingFields) keyMapping;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AccessPlayerFields playerFields(Player player) {
|
||||||
|
return (AccessPlayerFields) player;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AccessToggleKeyMappingFields toggleKeyMappingFields(ToggleKeyMapping toggleKeyMapping) {
|
||||||
|
return (AccessToggleKeyMappingFields) toggleKeyMapping;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
package chylex.bettercontrols.input;
|
package chylex.bettercontrols.input;
|
||||||
|
|
||||||
import chylex.bettercontrols.mixin.AccessKeyBindingFields;
|
import chylex.bettercontrols.Mixins;
|
||||||
import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
|
import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
|
||||||
import net.minecraft.client.KeyMapping;
|
import net.minecraft.client.KeyMapping;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -31,6 +31,6 @@ public final class ToggleTrackerForStickyKey extends ToggleTracker {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isResetKeyPressed() {
|
protected boolean isResetKeyPressed() {
|
||||||
return ((AccessKeyBindingFields)bindingReset).isPressedField();
|
return Mixins.keyMappingFields(bindingReset).isPressedField();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,8 @@ import org.spongepowered.asm.mixin.gen.Accessor;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Mixin(KeyMapping.class)
|
@Mixin(KeyMapping.class)
|
||||||
public interface AccessKeyBindingFields {
|
@SuppressWarnings("StaticMethodOnlyUsedInOneClass")
|
||||||
|
public interface AccessKeyMappingFields {
|
||||||
@Accessor("CATEGORY_SORT_ORDER")
|
@Accessor("CATEGORY_SORT_ORDER")
|
||||||
static Map<String, Integer> getCategoryOrderMap() {
|
static Map<String, Integer> getCategoryOrderMap() {
|
||||||
throw new AssertionError();
|
throw new AssertionError();
|
@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.gen.Accessor;
|
|||||||
import java.util.function.BooleanSupplier;
|
import java.util.function.BooleanSupplier;
|
||||||
|
|
||||||
@Mixin(ToggleKeyMapping.class)
|
@Mixin(ToggleKeyMapping.class)
|
||||||
public interface AccessStickyKeyBindingStateGetter {
|
public interface AccessToggleKeyMappingFields {
|
||||||
@Accessor
|
@Accessor
|
||||||
BooleanSupplier getNeedsToggle();
|
BooleanSupplier getNeedsToggle();
|
||||||
|
|
@ -1,5 +1,6 @@
|
|||||||
package chylex.bettercontrols.mixin;
|
package chylex.bettercontrols.mixin;
|
||||||
|
|
||||||
|
import chylex.bettercontrols.Mixins;
|
||||||
import chylex.bettercontrols.player.PlayerTicker;
|
import chylex.bettercontrols.player.PlayerTicker;
|
||||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||||
import net.minecraft.client.player.AbstractClientPlayer;
|
import net.minecraft.client.player.AbstractClientPlayer;
|
||||||
@ -14,9 +15,9 @@ public abstract class HookClientPlayerFOV {
|
|||||||
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getWalkingSpeed()F")
|
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getWalkingSpeed()F")
|
||||||
)
|
)
|
||||||
private float overrideWalkingSpeed(float walkingSpeed) {
|
private float overrideWalkingSpeed(float walkingSpeed) {
|
||||||
AbstractClientPlayer me = (AbstractClientPlayer)(Object)this;
|
AbstractClientPlayer me = Mixins.me(this);
|
||||||
|
|
||||||
if (me instanceof LocalPlayer localPlayer && PlayerTicker.get(localPlayer).shouldResetFOV(localPlayer)) {
|
if (me instanceof LocalPlayer localPlayer && PlayerTicker.shouldResetFOV(localPlayer)) {
|
||||||
return 0F;
|
return 0F;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
|
import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
|
||||||
|
|
||||||
@Mixin(KeyboardInput.class)
|
@Mixin(KeyboardInput.class)
|
||||||
@SuppressWarnings({ "MethodMayBeStatic", "UnreachableCode" })
|
@SuppressWarnings("MethodMayBeStatic")
|
||||||
public abstract class HookClientPlayerInputTick {
|
public abstract class HookClientPlayerInputTick {
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "tick",
|
method = "tick",
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package chylex.bettercontrols.mixin;
|
package chylex.bettercontrols.mixin;
|
||||||
|
|
||||||
|
import chylex.bettercontrols.Mixins;
|
||||||
import chylex.bettercontrols.player.PlayerTicker;
|
import chylex.bettercontrols.player.PlayerTicker;
|
||||||
import com.mojang.authlib.GameProfile;
|
import com.mojang.authlib.GameProfile;
|
||||||
import net.minecraft.client.multiplayer.ClientLevel;
|
import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
@ -12,7 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
|
import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
|
||||||
|
|
||||||
@Mixin(LocalPlayer.class)
|
@Mixin(LocalPlayer.class)
|
||||||
@SuppressWarnings("UnreachableCode")
|
|
||||||
public abstract class HookClientPlayerTick extends AbstractClientPlayer {
|
public abstract class HookClientPlayerTick extends AbstractClientPlayer {
|
||||||
protected HookClientPlayerTick(ClientLevel world, GameProfile profile) {
|
protected HookClientPlayerTick(ClientLevel world, GameProfile profile) {
|
||||||
super(world, profile);
|
super(world, profile);
|
||||||
@ -20,22 +20,19 @@ public abstract class HookClientPlayerTick extends AbstractClientPlayer {
|
|||||||
|
|
||||||
@Inject(method = "aiStep()V", at = @At("HEAD"))
|
@Inject(method = "aiStep()V", at = @At("HEAD"))
|
||||||
private void atHead(CallbackInfo info) {
|
private void atHead(CallbackInfo info) {
|
||||||
@SuppressWarnings("ConstantConditions")
|
LocalPlayer player = Mixins.me(this);
|
||||||
LocalPlayer player = (LocalPlayer)(Object)this;
|
|
||||||
PlayerTicker.get(player).atHead(player);
|
PlayerTicker.get(player).atHead(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "aiStep()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/ClientInput;tick()V", ordinal = 0, shift = AFTER))
|
@Inject(method = "aiStep()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/ClientInput;tick()V", ordinal = 0, shift = AFTER))
|
||||||
private void afterInputTick(CallbackInfo info) {
|
private void afterInputTick(CallbackInfo info) {
|
||||||
@SuppressWarnings("ConstantConditions")
|
LocalPlayer player = Mixins.me(this);
|
||||||
LocalPlayer player = (LocalPlayer)(Object)this;
|
|
||||||
PlayerTicker.get(player).afterInputTick(player);
|
PlayerTicker.get(player).afterInputTick(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "aiStep()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/AbstractClientPlayer;aiStep()V", ordinal = 0, shift = AFTER))
|
@Inject(method = "aiStep()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/AbstractClientPlayer;aiStep()V", ordinal = 0, shift = AFTER))
|
||||||
private void afterSuperCall(CallbackInfo info) {
|
private void afterSuperCall(CallbackInfo info) {
|
||||||
@SuppressWarnings("ConstantConditions")
|
LocalPlayer player = Mixins.me(this);
|
||||||
LocalPlayer player = (LocalPlayer)(Object)this;
|
|
||||||
PlayerTicker.get(player).afterSuperCall(player);
|
PlayerTicker.get(player).afterSuperCall(player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package chylex.bettercontrols.mixin;
|
package chylex.bettercontrols.mixin;
|
||||||
|
|
||||||
|
import chylex.bettercontrols.Mixins;
|
||||||
import chylex.bettercontrols.player.FlightHelper;
|
import chylex.bettercontrols.player.FlightHelper;
|
||||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
@ -11,7 +12,6 @@ import org.spongepowered.asm.mixin.injection.At;
|
|||||||
import org.spongepowered.asm.mixin.injection.Slice;
|
import org.spongepowered.asm.mixin.injection.Slice;
|
||||||
|
|
||||||
@Mixin(LocalPlayer.class)
|
@Mixin(LocalPlayer.class)
|
||||||
@SuppressWarnings({ "SameReturnValue", "UnreachableCode" })
|
|
||||||
public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
|
public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
|
||||||
protected HookClientPlayerVerticalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) {
|
protected HookClientPlayerVerticalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) {
|
||||||
super(type, world);
|
super(type, world);
|
||||||
@ -26,8 +26,7 @@ public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
private float modifyVerticalFlightSpeed(float flyingSpeed) {
|
private float modifyVerticalFlightSpeed(float flyingSpeed) {
|
||||||
@SuppressWarnings("ConstantConditions")
|
LocalPlayer me = Mixins.me(this);
|
||||||
LocalPlayer me = (LocalPlayer)(Object)this;
|
|
||||||
return flyingSpeed * FlightHelper.getVerticalSpeedMultiplier(me);
|
return flyingSpeed * FlightHelper.getVerticalSpeedMultiplier(me);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package chylex.bettercontrols.mixin;
|
package chylex.bettercontrols.mixin;
|
||||||
|
|
||||||
|
import chylex.bettercontrols.Mixins;
|
||||||
import chylex.bettercontrols.gui.BetterControlsScreen;
|
import chylex.bettercontrols.gui.BetterControlsScreen;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.Options;
|
import net.minecraft.client.Options;
|
||||||
@ -17,7 +18,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Mixin(ControlsScreen.class)
|
@Mixin(ControlsScreen.class)
|
||||||
@SuppressWarnings("UnreachableCode")
|
|
||||||
public abstract class HookControlsScreen extends OptionsSubScreen {
|
public abstract class HookControlsScreen extends OptionsSubScreen {
|
||||||
public HookControlsScreen(Screen parentScreen, Options options, Component title) {
|
public HookControlsScreen(Screen parentScreen, Options options, Component title) {
|
||||||
super(parentScreen, options, title);
|
super(parentScreen, options, title);
|
||||||
@ -26,8 +26,7 @@ public abstract class HookControlsScreen extends OptionsSubScreen {
|
|||||||
@Inject(method = "addOptions", at = @At("RETURN"))
|
@Inject(method = "addOptions", at = @At("RETURN"))
|
||||||
public void afterAddOptions(CallbackInfo ci) {
|
public void afterAddOptions(CallbackInfo ci) {
|
||||||
if (list != null) {
|
if (list != null) {
|
||||||
@SuppressWarnings("ConstantConditions")
|
ControlsScreen screen = Mixins.me(this);
|
||||||
ControlsScreen screen = (ControlsScreen)(Object)this;
|
|
||||||
MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("...");
|
MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("...");
|
||||||
list.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build()));
|
list.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build()));
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,6 @@ public abstract class HookLoadGameOptions {
|
|||||||
|
|
||||||
hasLoaded = true;
|
hasLoaded = true;
|
||||||
keyMappings = ArrayUtils.addAll(keyMappings, config.getAllKeyBindings());
|
keyMappings = ArrayUtils.addAll(keyMappings, config.getAllKeyBindings());
|
||||||
AccessKeyBindingFields.getCategoryOrderMap().put(KeyBindingWithModifier.CATEGORY, Integer.valueOf(Integer.MAX_VALUE));
|
AccessKeyMappingFields.getCategoryOrderMap().put(KeyBindingWithModifier.CATEGORY, Integer.valueOf(Integer.MAX_VALUE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package chylex.bettercontrols.mixin;
|
package chylex.bettercontrols.mixin;
|
||||||
|
|
||||||
|
import chylex.bettercontrols.Mixins;
|
||||||
import chylex.bettercontrols.player.FlightHelper;
|
import chylex.bettercontrols.player.FlightHelper;
|
||||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||||
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
|
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
|
||||||
@ -13,7 +14,6 @@ import org.spongepowered.asm.mixin.injection.At;
|
|||||||
import org.spongepowered.asm.mixin.injection.Slice;
|
import org.spongepowered.asm.mixin.injection.Slice;
|
||||||
|
|
||||||
@Mixin(Player.class)
|
@Mixin(Player.class)
|
||||||
@SuppressWarnings({ "SameReturnValue", "UnreachableCode" })
|
|
||||||
public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
|
public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
|
||||||
protected HookPlayerHorizontalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) {
|
protected HookPlayerHorizontalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) {
|
||||||
super(type, world);
|
super(type, world);
|
||||||
@ -29,8 +29,7 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
private boolean disableVanillaSprintBoost(boolean isSprinting) {
|
private boolean disableVanillaSprintBoost(boolean isSprinting) {
|
||||||
@SuppressWarnings("ConstantConditions")
|
Player me = Mixins.me(this);
|
||||||
Player me = (Player)(Object)this;
|
|
||||||
|
|
||||||
if (me instanceof LocalPlayer localPlayer && FlightHelper.isFlyingCreativeOrSpectator(localPlayer)) {
|
if (me instanceof LocalPlayer localPlayer && FlightHelper.isFlyingCreativeOrSpectator(localPlayer)) {
|
||||||
return false;
|
return false;
|
||||||
@ -42,8 +41,7 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
|
|||||||
|
|
||||||
@ModifyReturnValue(method = "getFlyingSpeed", at = @At("RETURN"))
|
@ModifyReturnValue(method = "getFlyingSpeed", at = @At("RETURN"))
|
||||||
private float modifyHorizontalFlyingSpeed(float flyingSpeed) {
|
private float modifyHorizontalFlyingSpeed(float flyingSpeed) {
|
||||||
@SuppressWarnings("ConstantConditions")
|
Player me = Mixins.me(this);
|
||||||
Player me = (Player)(Object)this;
|
|
||||||
|
|
||||||
if (me instanceof LocalPlayer localPlayer && localPlayer.getAbilities().flying) {
|
if (me instanceof LocalPlayer localPlayer && localPlayer.getAbilities().flying) {
|
||||||
return flyingSpeed * FlightHelper.getHorizontalSpeedMultiplier(localPlayer);
|
return flyingSpeed * FlightHelper.getHorizontalSpeedMultiplier(localPlayer);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package chylex.bettercontrols.mixin;
|
package chylex.bettercontrols.mixin;
|
||||||
|
|
||||||
|
import chylex.bettercontrols.Mixins;
|
||||||
import chylex.bettercontrols.input.ToggleTrackerForStickyKey;
|
import chylex.bettercontrols.input.ToggleTrackerForStickyKey;
|
||||||
import net.minecraft.client.KeyMapping;
|
import net.minecraft.client.KeyMapping;
|
||||||
import net.minecraft.client.ToggleKeyMapping;
|
import net.minecraft.client.ToggleKeyMapping;
|
||||||
@ -24,7 +25,7 @@ public abstract class HookStickyKeyBindingState extends KeyMapping {
|
|||||||
@Inject(method = "setDown", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "setDown", at = @At("HEAD"), cancellable = true)
|
||||||
public void setPressed(boolean pressed, CallbackInfo info) {
|
public void setPressed(boolean pressed, CallbackInfo info) {
|
||||||
if (ToggleTrackerForStickyKey.isOverrideEnabled(this)) {
|
if (ToggleTrackerForStickyKey.isOverrideEnabled(this)) {
|
||||||
((AccessKeyBindingFields)this).setPressedField(pressed);
|
Mixins.keyMappingFields(this).setPressedField(pressed);
|
||||||
info.cancel();
|
info.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package chylex.bettercontrols.mixin;
|
package chylex.bettercontrols.mixin;
|
||||||
|
|
||||||
|
import chylex.bettercontrols.Mixins;
|
||||||
import net.minecraft.client.OptionInstance;
|
import net.minecraft.client.OptionInstance;
|
||||||
import net.minecraft.client.Options;
|
import net.minecraft.client.Options;
|
||||||
import net.minecraft.client.gui.components.AbstractWidget;
|
import net.minecraft.client.gui.components.AbstractWidget;
|
||||||
@ -10,12 +11,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@Mixin(OptionInstance.class)
|
@Mixin(OptionInstance.class)
|
||||||
@SuppressWarnings("UnreachableCode")
|
|
||||||
public abstract class HookToggleOptionButtons {
|
public abstract class HookToggleOptionButtons {
|
||||||
@Inject(method = "createButton(Lnet/minecraft/client/Options;IIILjava/util/function/Consumer;)Lnet/minecraft/client/gui/components/AbstractWidget;", at = @At("RETURN"))
|
@Inject(method = "createButton(Lnet/minecraft/client/Options;IIILjava/util/function/Consumer;)Lnet/minecraft/client/gui/components/AbstractWidget;", at = @At("RETURN"))
|
||||||
private <T> void disableToggleOptions(Options options, int x, int y, int width, Consumer<T> callback, CallbackInfoReturnable<AbstractWidget> cir) {
|
private <T> void disableToggleOptions(Options options, int x, int y, int width, Consumer<T> callback, CallbackInfoReturnable<AbstractWidget> cir) {
|
||||||
@SuppressWarnings("ConstantConditions")
|
OptionInstance<?> me = Mixins.me(this);
|
||||||
OptionInstance<?> me = (OptionInstance<?>)(Object)this;
|
|
||||||
|
|
||||||
if (me == options.toggleCrouch() || me == options.toggleSprint()) {
|
if (me == options.toggleCrouch() || me == options.toggleSprint()) {
|
||||||
cir.getReturnValue().active = false;
|
cir.getReturnValue().active = false;
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
package chylex.bettercontrols.player;
|
package chylex.bettercontrols.player;
|
||||||
|
|
||||||
import chylex.bettercontrols.BetterControlsCommon;
|
|
||||||
import chylex.bettercontrols.config.BetterControlsConfig;
|
|
||||||
import net.minecraft.client.KeyMapping;
|
import net.minecraft.client.KeyMapping;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
|
import static chylex.bettercontrols.BetterControlsCommon.getConfig;
|
||||||
|
|
||||||
public final class FlightHelper {
|
public final class FlightHelper {
|
||||||
private FlightHelper() {}
|
private FlightHelper() {}
|
||||||
@ -15,12 +14,8 @@ public final class FlightHelper {
|
|||||||
return KEY_SPRINT.isDown();
|
return KEY_SPRINT.isDown();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BetterControlsConfig cfg() {
|
|
||||||
return BetterControlsCommon.getConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean shouldStartGliding(boolean isHoldingJump) {
|
public static boolean shouldStartGliding(boolean isHoldingJump) {
|
||||||
return cfg().keyStartGlide.isDown() || (cfg().doubleTapJumpToGlide && isHoldingJump);
|
return getConfig().keyStartGlide.isDown() || (getConfig().doubleTapJumpToGlide && isHoldingJump);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isFlyingCreativeOrSpectator(LocalPlayer player) {
|
public static boolean isFlyingCreativeOrSpectator(LocalPlayer player) {
|
||||||
@ -28,15 +23,15 @@ public final class FlightHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static boolean shouldFlyOnGround(LocalPlayer player) {
|
static boolean shouldFlyOnGround(LocalPlayer player) {
|
||||||
return cfg().flyOnGroundInCreative && player.isCreative() && player.getAbilities().flying;
|
return getConfig().flyOnGroundInCreative && player.isCreative() && player.getAbilities().flying;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float getHorizontalSpeedMultiplier(LocalPlayer player) {
|
public static float getHorizontalSpeedMultiplier(LocalPlayer player) {
|
||||||
if (player.isCreative()) {
|
if (player.isCreative()) {
|
||||||
return isSprinting() ? cfg().flightHorizontalSpeedMpCreativeSprinting : cfg().flightHorizontalSpeedMpCreativeDefault;
|
return isSprinting() ? getConfig().flightHorizontalSpeedMpCreativeSprinting : getConfig().flightHorizontalSpeedMpCreativeDefault;
|
||||||
}
|
}
|
||||||
else if (player.isSpectator()) {
|
else if (player.isSpectator()) {
|
||||||
return isSprinting() ? cfg().flightHorizontalSpeedMpSpectatorSprinting : cfg().flightHorizontalSpeedMpSpectatorDefault;
|
return isSprinting() ? getConfig().flightHorizontalSpeedMpSpectatorSprinting : getConfig().flightHorizontalSpeedMpSpectatorDefault;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return 1F;
|
return 1F;
|
||||||
@ -45,10 +40,10 @@ public final class FlightHelper {
|
|||||||
|
|
||||||
public static float getVerticalSpeedMultiplier(LocalPlayer player) {
|
public static float getVerticalSpeedMultiplier(LocalPlayer player) {
|
||||||
if (player.isCreative()) {
|
if (player.isCreative()) {
|
||||||
return isSprinting() ? cfg().flightVerticalSpeedMpCreativeSprinting : cfg().flightVerticalSpeedMpCreativeDefault;
|
return isSprinting() ? getConfig().flightVerticalSpeedMpCreativeSprinting : getConfig().flightVerticalSpeedMpCreativeDefault;
|
||||||
}
|
}
|
||||||
else if (player.isSpectator()) {
|
else if (player.isSpectator()) {
|
||||||
return isSprinting() ? cfg().flightVerticalSpeedMpSpectatorSprinting : cfg().flightVerticalSpeedMpSpectatorDefault;
|
return isSprinting() ? getConfig().flightVerticalSpeedMpSpectatorSprinting : getConfig().flightVerticalSpeedMpSpectatorDefault;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return 1F;
|
return 1F;
|
||||||
|
@ -1,30 +1,28 @@
|
|||||||
package chylex.bettercontrols.player;
|
package chylex.bettercontrols.player;
|
||||||
|
|
||||||
import chylex.bettercontrols.BetterControlsCommon;
|
import chylex.bettercontrols.Mixins;
|
||||||
import chylex.bettercontrols.config.BetterControlsConfig;
|
|
||||||
import chylex.bettercontrols.gui.BetterControlsScreen;
|
import chylex.bettercontrols.gui.BetterControlsScreen;
|
||||||
import chylex.bettercontrols.input.SprintMode;
|
import chylex.bettercontrols.input.SprintMode;
|
||||||
import chylex.bettercontrols.input.ToggleTracker;
|
import chylex.bettercontrols.input.ToggleTracker;
|
||||||
import chylex.bettercontrols.input.ToggleTrackerForStickyKey;
|
import chylex.bettercontrols.input.ToggleTrackerForStickyKey;
|
||||||
import chylex.bettercontrols.mixin.AccessCameraFields;
|
import chylex.bettercontrols.mixin.AccessToggleKeyMappingFields;
|
||||||
import chylex.bettercontrols.mixin.AccessClientPlayerFields;
|
|
||||||
import chylex.bettercontrols.mixin.AccessPlayerFields;
|
|
||||||
import chylex.bettercontrols.mixin.AccessStickyKeyBindingStateGetter;
|
|
||||||
import net.minecraft.client.Camera;
|
import net.minecraft.client.Camera;
|
||||||
import net.minecraft.client.KeyMapping;
|
import net.minecraft.client.KeyMapping;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.Options;
|
import net.minecraft.client.Options;
|
||||||
|
import net.minecraft.client.ToggleKeyMapping;
|
||||||
import net.minecraft.client.player.ClientInput;
|
import net.minecraft.client.player.ClientInput;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
import net.minecraft.world.entity.player.Input;
|
import net.minecraft.world.entity.player.Input;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.function.BooleanSupplier;
|
import java.util.function.BooleanSupplier;
|
||||||
|
import static chylex.bettercontrols.BetterControlsCommon.getConfig;
|
||||||
|
|
||||||
public final class PlayerTicker {
|
public final class PlayerTicker {
|
||||||
private static final Minecraft MINECRAFT = Minecraft.getInstance();
|
private static final Minecraft MINECRAFT = Minecraft.getInstance();
|
||||||
private static final Options OPTIONS = MINECRAFT.options;
|
private static final Options OPTIONS = MINECRAFT.options;
|
||||||
|
|
||||||
private static final KeyMapping KEY_SPRINT = OPTIONS.keySprint;
|
private static final ToggleKeyMapping KEY_SPRINT = (ToggleKeyMapping) OPTIONS.keySprint;
|
||||||
private static final KeyMapping KEY_SNEAK = OPTIONS.keyShift;
|
private static final KeyMapping KEY_SNEAK = OPTIONS.keyShift;
|
||||||
private static final KeyMapping KEY_FORWARD = OPTIONS.keyUp;
|
private static final KeyMapping KEY_FORWARD = OPTIONS.keyUp;
|
||||||
private static final KeyMapping KEY_JUMP = OPTIONS.keyJump;
|
private static final KeyMapping KEY_JUMP = OPTIONS.keyJump;
|
||||||
@ -39,10 +37,6 @@ public final class PlayerTicker {
|
|||||||
return ticker;
|
return ticker;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BetterControlsConfig cfg() {
|
|
||||||
return BetterControlsCommon.getConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
private final WeakReference<LocalPlayer> ref;
|
private final WeakReference<LocalPlayer> ref;
|
||||||
|
|
||||||
private PlayerTicker(LocalPlayer player) {
|
private PlayerTicker(LocalPlayer player) {
|
||||||
@ -52,10 +46,10 @@ public final class PlayerTicker {
|
|||||||
|
|
||||||
// Logic
|
// Logic
|
||||||
|
|
||||||
private final ToggleTracker toggleSprint = new ToggleTrackerForStickyKey(cfg().keyToggleSprint, KEY_SPRINT, OPTIONS.toggleSprint()::set);
|
private final ToggleTracker toggleSprint = new ToggleTrackerForStickyKey(getConfig().keyToggleSprint, KEY_SPRINT, OPTIONS.toggleSprint()::set);
|
||||||
private final ToggleTracker toggleSneak = new ToggleTrackerForStickyKey(cfg().keyToggleSneak, KEY_SNEAK, OPTIONS.toggleCrouch()::set);
|
private final ToggleTracker toggleSneak = new ToggleTrackerForStickyKey(getConfig().keyToggleSneak, KEY_SNEAK, OPTIONS.toggleCrouch()::set);
|
||||||
private final ToggleTracker toggleWalkForward = new ToggleTracker(cfg().keyToggleWalkForward, KEY_FORWARD);
|
private final ToggleTracker toggleWalkForward = new ToggleTracker(getConfig().keyToggleWalkForward, KEY_FORWARD);
|
||||||
private final ToggleTracker toggleJump = new ToggleTracker(cfg().keyToggleJump, KEY_JUMP);
|
private final ToggleTracker toggleJump = new ToggleTracker(getConfig().keyToggleJump, KEY_JUMP);
|
||||||
|
|
||||||
private boolean waitingForSprintKeyRelease = false;
|
private boolean waitingForSprintKeyRelease = false;
|
||||||
private boolean stopSprintingAfterReleasingSprintKey = false;
|
private boolean stopSprintingAfterReleasingSprintKey = false;
|
||||||
@ -69,7 +63,7 @@ public final class PlayerTicker {
|
|||||||
private int temporaryFlyOnGroundTimer = 0;
|
private int temporaryFlyOnGroundTimer = 0;
|
||||||
|
|
||||||
private void setup() {
|
private void setup() {
|
||||||
AccessStickyKeyBindingStateGetter sprint = (AccessStickyKeyBindingStateGetter)KEY_SPRINT;
|
AccessToggleKeyMappingFields sprint = Mixins.toggleKeyMappingFields(KEY_SPRINT);
|
||||||
BooleanSupplier getter = sprint.getNeedsToggle();
|
BooleanSupplier getter = sprint.getNeedsToggle();
|
||||||
|
|
||||||
if (getter instanceof SprintPressGetter g) {
|
if (getter instanceof SprintPressGetter g) {
|
||||||
@ -84,15 +78,15 @@ public final class PlayerTicker {
|
|||||||
player.setOnGround(false);
|
player.setOnGround(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cfg().doubleTapForwardToSprint) {
|
if (!getConfig().doubleTapForwardToSprint) {
|
||||||
((AccessClientPlayerFields)player).setSprintTriggerTime(0);
|
Mixins.clientPlayerFields(player).setSprintTriggerTime(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cfg().doubleTapJumpToToggleFlight) {
|
if (!getConfig().doubleTapJumpToToggleFlight) {
|
||||||
((AccessPlayerFields)player).setJumpTriggerTime(0);
|
Mixins.playerFields(player).setJumpTriggerTime(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SprintMode sprintMode = cfg().sprintMode;
|
SprintMode sprintMode = getConfig().sprintMode;
|
||||||
boolean wasSprintToggled = Boolean.TRUE.equals(OPTIONS.toggleSprint().get());
|
boolean wasSprintToggled = Boolean.TRUE.equals(OPTIONS.toggleSprint().get());
|
||||||
boolean isSprintToggled = toggleSprint.tick();
|
boolean isSprintToggled = toggleSprint.tick();
|
||||||
|
|
||||||
@ -170,7 +164,7 @@ public final class PlayerTicker {
|
|||||||
player.input.makeJump();
|
player.input.makeJump();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg().resumeSprintingAfterHittingObstacle) {
|
if (getConfig().resumeSprintingAfterHittingObstacle) {
|
||||||
if (wasHittingObstacle != player.horizontalCollision) {
|
if (wasHittingObstacle != player.horizontalCollision) {
|
||||||
if (!wasHittingObstacle) {
|
if (!wasHittingObstacle) {
|
||||||
wasSprintingBeforeHittingObstacle = player.isSprinting() || KEY_SPRINT.isDown();
|
wasSprintingBeforeHittingObstacle = player.isSprinting() || KEY_SPRINT.isDown();
|
||||||
@ -229,7 +223,7 @@ public final class PlayerTicker {
|
|||||||
holdingSneakWhileTouchingGround = false;
|
holdingSneakWhileTouchingGround = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FlightHelper.isFlyingCreativeOrSpectator(player) && cfg().disableFlightInertia) {
|
if (FlightHelper.isFlyingCreativeOrSpectator(player) && getConfig().disableFlightInertia) {
|
||||||
ClientInput input = player.input;
|
ClientInput input = player.input;
|
||||||
|
|
||||||
if (input.forwardImpulse == 0F && input.leftImpulse == 0F) {
|
if (input.forwardImpulse == 0F && input.leftImpulse == 0F) {
|
||||||
@ -242,7 +236,7 @@ public final class PlayerTicker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (player.isCreative()) {
|
if (player.isCreative()) {
|
||||||
if (cfg().keyToggleFlight.consumeClick()) {
|
if (getConfig().keyToggleFlight.consumeClick()) {
|
||||||
boolean isFlying = !player.getAbilities().flying;
|
boolean isFlying = !player.getAbilities().flying;
|
||||||
|
|
||||||
player.getAbilities().flying = isFlying;
|
player.getAbilities().flying = isFlying;
|
||||||
@ -267,27 +261,27 @@ public final class PlayerTicker {
|
|||||||
temporaryFlyOnGroundTimer = 0;
|
temporaryFlyOnGroundTimer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cfg().sneakingMovesCameraSmoothly) {
|
if (!getConfig().sneakingMovesCameraSmoothly) {
|
||||||
Camera camera = MINECRAFT.gameRenderer.getMainCamera();
|
Camera camera = MINECRAFT.gameRenderer.getMainCamera();
|
||||||
|
|
||||||
if (camera.getEntity() == player) {
|
if (camera.getEntity() == player) {
|
||||||
((AccessCameraFields)camera).setEyeHeight(player.getEyeHeight());
|
Mixins.cameraFields(camera).setEyeHeight(player.getEyeHeight());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg().keyResetAllToggles.consumeClick()) {
|
if (getConfig().keyResetAllToggles.consumeClick()) {
|
||||||
toggleSprint.reset();
|
toggleSprint.reset();
|
||||||
toggleSneak.reset();
|
toggleSneak.reset();
|
||||||
toggleWalkForward.reset();
|
toggleWalkForward.reset();
|
||||||
toggleJump.reset();
|
toggleJump.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg().keyOpenMenu.isDown()) {
|
if (getConfig().keyOpenMenu.isDown()) {
|
||||||
MINECRAFT.setScreen(new BetterControlsScreen(null));
|
MINECRAFT.setScreen(new BetterControlsScreen(null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean shouldResetFOV(LocalPlayer player) {
|
public static boolean shouldResetFOV(LocalPlayer player) {
|
||||||
return cfg().disableChangingFovWhileFlying && FlightHelper.isFlyingCreativeOrSpectator(player);
|
return getConfig().disableChangingFovWhileFlying && FlightHelper.isFlyingCreativeOrSpectator(player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,9 @@
|
|||||||
"client": [
|
"client": [
|
||||||
"AccessCameraFields",
|
"AccessCameraFields",
|
||||||
"AccessClientPlayerFields",
|
"AccessClientPlayerFields",
|
||||||
"AccessKeyBindingFields",
|
"AccessKeyMappingFields",
|
||||||
"AccessPlayerFields",
|
"AccessPlayerFields",
|
||||||
"AccessStickyKeyBindingStateGetter",
|
"AccessToggleKeyMappingFields",
|
||||||
"HookClientPlayerFOV",
|
"HookClientPlayerFOV",
|
||||||
"HookClientPlayerInputTick",
|
"HookClientPlayerInputTick",
|
||||||
"HookClientPlayerTick",
|
"HookClientPlayerTick",
|
||||||
|
Loading…
Reference in New Issue
Block a user