Skip to content

Commit

Permalink
Add better toggle-sneak
Browse files Browse the repository at this point in the history
  • Loading branch information
Protonull committed Aug 20, 2024
1 parent 04a1f18 commit a6ab54a
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .github/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@

- Hold W/forward (bound to `[` by default).

- Better toggle-sneak (bound to `]` by default). Will automatically deactivate itself if you manually `SHIFT` sneak, or
if you enter water, or start swimming, sprinting, elytra gliding, or creative flying.

- Shows an item's base repair level by default in advanced-tooltips mode.

You may open CivModern's configuration screen in-game with the `R` binding. Or you can modify the config file directly,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import sh.okx.civmodern.common.macro.AttackMacro;
import sh.okx.civmodern.common.macro.HoldKeyMacro;
import sh.okx.civmodern.common.macro.IceRoadMacro;
import sh.okx.civmodern.common.macro.ToggleSneakMacro;
import sh.okx.civmodern.common.radar.Radar;

public abstract class AbstractCivModernMod {
Expand Down Expand Up @@ -54,6 +55,12 @@ public AbstractCivModernMod() {
GLFW.GLFW_KEY_LEFT_BRACKET,
"category.civmodern"
);
protected final KeyMapping holdSneakBinding = new KeyMapping(
"key.civmodern.holdsneak",
Type.KEYSYM,
GLFW.GLFW_KEY_RIGHT_BRACKET,
"category.civmodern"
);
protected final KeyMapping iceRoadBinding = new KeyMapping(
"key.civmodern.ice",
Type.KEYSYM,
Expand All @@ -74,6 +81,7 @@ public final void init() {
registerKeyBinding(this.holdLeftBinding);
registerKeyBinding(this.holdRightBinding);
registerKeyBinding(this.holdForwardBinding);
registerKeyBinding(this.holdSneakBinding);
registerKeyBinding(this.attackBinding);
registerKeyBinding(this.iceRoadBinding);

Expand All @@ -91,6 +99,7 @@ public final void enable() {
this.eventBus.register(new HoldKeyMacro(this.holdLeftBinding, options.keyAttack));
this.eventBus.register(new HoldKeyMacro(this.holdRightBinding, options.keyUse));
this.eventBus.register(new HoldKeyMacro(this.holdForwardBinding, options.keyUp));
this.eventBus.register(new ToggleSneakMacro(this.holdSneakBinding));
this.eventBus.register(new IceRoadMacro(this.iceRoadBinding));
this.eventBus.register(new AttackMacro(this.attackBinding, options.keyAttack));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package sh.okx.civmodern.common.macro;

import com.google.common.eventbus.Subscribe;
import com.mojang.blaze3d.platform.InputConstants;
import java.util.Objects;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.OptionInstance;
import net.minecraft.client.Options;
import net.minecraft.client.player.LocalPlayer;
import org.jetbrains.annotations.NotNull;
import sh.okx.civmodern.common.events.ClientTickEvent;
import sh.okx.civmodern.common.mixins.KeyMappingAccessor;

public class ToggleSneakMacro {
private final KeyMapping macroBinding;
private final KeyMapping sneakBinding;
private final KeyMappingAccessor sneakBindingAccessor;
private final OptionInstance<Boolean> toggleSneak;

public ToggleSneakMacro(
final @NotNull KeyMapping macroBinding
) {
this.macroBinding = Objects.requireNonNull(macroBinding);
final Options options = Minecraft.getInstance().options;
this.sneakBinding = options.keyShift;
this.sneakBindingAccessor = (KeyMappingAccessor) this.sneakBinding;
this.toggleSneak = options.toggleCrouch();
}

@Subscribe
private void onTick(
final @NotNull ClientTickEvent event
) {
final LocalPlayer player = Minecraft.getInstance().player;
if (player == null) {
return;
}

final boolean isSneaking = this.sneakBinding.isDown();

while (this.macroBinding.consumeClick()) {
this.toggleSneak.set(false);
if (isSneaking) {
this.sneakBinding.setDown(false);
continue;
}
this.sneakBinding.setDown(true);
this.toggleSneak.set(true);
}

while (this.sneakBinding.consumeClick()) {
this.toggleSneak.set(false);
}

if (
player.isInWater()
|| player.isSwimming()
|| player.isSprinting()
|| player.isFallFlying() // Elytra gliding
|| player.getAbilities().flying // Creative flying
) {
this.toggleSneak.set(false);
this.sneakBinding.setDown(InputConstants.isKeyDown(
Minecraft.getInstance().getWindow().getWindow(),
this.sneakBindingAccessor.getKey().getValue()
));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package sh.okx.civmodern.common.mixins;

import com.mojang.blaze3d.platform.InputConstants;
import net.minecraft.client.KeyMapping;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

Expand All @@ -11,4 +13,7 @@ public interface KeyMappingAccessor {

@Accessor("clickCount")
void setClickCount(int clickCount);

@Accessor("key")
@NotNull InputConstants.Key getKey();
}
1 change: 1 addition & 0 deletions common/src/main/resources/assets/civmodern/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"key.civmodern.left": "Hold left mouse button",
"key.civmodern.right": "Hold right mouse button",
"key.civmodern.autorun": "Toggle auto-run",
"key.civmodern.holdsneak": "Toggle sneak",
"key.civmodern.ice": "Toggle ice road macro",
"key.civmodern.attack": "Toggle attack macro",
"key.civmodern.config": "Open Civ Modern configuration",
Expand Down

0 comments on commit a6ab54a

Please sign in to comment.