Skip to content

Commit

Permalink
Fixed the wrong button for the game menu. And modded mappings support.
Browse files Browse the repository at this point in the history
  • Loading branch information
XyperCode committed Aug 27, 2024
1 parent 15a42a3 commit 9bf4e4b
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 13 deletions.
4 changes: 2 additions & 2 deletions common/src/main/java/io/github/ultreon/controllerx/Icon.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ public enum Icon {
LeftShoulder(112, 304),
RightShoulder(128, 304),

XboxGuide(64, 304),
XboxMenu(80, 304),
XboxMenu(64, 304),
XboxGuide(80, 304),

Dpad(0, 32),
DpadUp(16, 32),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package io.github.ultreon.controllerx.impl;

import com.google.common.base.Predicates;
import io.github.ultreon.controllerx.ControllerX;
import io.github.ultreon.controllerx.GameApi;
import io.github.ultreon.controllerx.api.ControllerAction;
import io.github.ultreon.controllerx.api.ControllerContext;
import io.github.ultreon.controllerx.api.ControllerMapping;
import io.github.ultreon.controllerx.api.ControllerMapping.Side;
import io.github.ultreon.controllerx.input.ControllerBoolean;
import io.github.ultreon.controllerx.input.ControllerInput;
import io.github.ultreon.controllerx.input.ControllerVec2;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.player.LocalPlayer;
Expand All @@ -19,7 +22,7 @@
import net.minecraft.world.phys.HitResult;
import org.jetbrains.annotations.NotNull;

import java.util.Objects;
import java.util.*;
import java.util.function.Predicate;

public class InGameControllerContext extends ControllerContext {
Expand All @@ -42,6 +45,8 @@ public class InGameControllerContext extends ControllerContext {
public final ControllerMapping<?> itemRight;
public final ControllerMapping<?> attack;

private final Map<KeyMapping, ControllerMapping<?>> moddedKeyMappings = new HashMap<>();

protected InGameControllerContext(ResourceLocation id) {
super(id);

Expand All @@ -62,14 +67,43 @@ protected InGameControllerContext(ResourceLocation id) {
this.swapHands = mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.X), Side.RIGHT, Component.translatable("controllerx.action.inGame.swapHands"), "swap_hands", (mc) -> checkPlayer(mc, player -> !(player.getMainHandItem().isEmpty() && player.getOffhandItem().isEmpty()))));
this.lookPlayer = mappings.register(new ControllerMapping<>(new ControllerAction.Joystick(ControllerVec2.RightStick), Side.LEFT, Component.translatable("controllerx.action.inGame.lookPlayer"), "look_player"));
this.movePlayer = mappings.register(new ControllerMapping<>(new ControllerAction.Joystick(ControllerVec2.LeftStick), Side.LEFT, Component.translatable("controllerx.action.inGame.movePlayer"), "move_player"));
this.gameMenu = mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.Back), Side.RIGHT, Component.translatable("controllerx.action.inGame.openGameMenu"), "open_game_menu"));
this.gameMenu = mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.Start), Side.RIGHT, Component.translatable("controllerx.action.inGame.openGameMenu"), "open_game_menu"));
this.pickItem = mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.DpadUp), Side.LEFT, Component.translatable("controllerx.action.inGame.pickItem"), false, "pick_item", (mc) -> checkPlayer(mc, (player) -> player.getMainHandItem().isEmpty() && (mc.crosshairPickEntity != null || player.pick(player.getPickRadius(), Minecraft.getInstance().getDeltaFrameTime(), false).getType() != HitResult.Type.MISS))));
this.drop = mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.DpadDown), Side.LEFT, Component.translatable("controllerx.action.inGame.dropItem"), "drop_item", (mc) -> checkPlayer(mc, (player) -> !player.getMainHandItem().isEmpty())));
this.playerList = mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.DpadLeft), Side.LEFT, Component.translatable("controllerx.action.inGame.showPlayerList"), false, "show_player_list"));
this.chat = mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.DpadRight), Side.LEFT, Component.translatable("controllerx.action.inGame.openChat"), false, "open_chat"));
this.itemLeft = mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.LeftShoulder), Side.LEFT, Component.translatable("controllerx.action.inGame.selectLeft"), false, "select_left"));
this.itemRight = mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.RightShoulder), Side.LEFT, Component.translatable("controllerx.action.inGame.selectRight"), false, "select_right"));
this.attack = mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.RightTrigger), ControllerMapping.Side.RIGHT, Component.translatable("controllerx.action.inGame.attack"), "attack", (mc) -> isTargetingBlock(mc) || isTargetingEntity(mc)));

final Set<KeyMapping> illegalKeyMappings = Set.of(
Minecraft.getInstance().options.keyLeft,
Minecraft.getInstance().options.keyRight,
Minecraft.getInstance().options.keyUp,
Minecraft.getInstance().options.keyDown,
Minecraft.getInstance().options.keyJump,
Minecraft.getInstance().options.keySprint,
Minecraft.getInstance().options.keyUse,
Minecraft.getInstance().options.keyAttack,
Minecraft.getInstance().options.keySwapOffhand,
Minecraft.getInstance().options.keyDrop,
Minecraft.getInstance().options.keyChat,
Minecraft.getInstance().options.keyPlayerList,
Minecraft.getInstance().options.keyPickItem,
Minecraft.getInstance().options.keyInventory
);

for (KeyMapping keyMapping : KeyMapping.ALL.values()) {
if (ControllerInput.getAction(Minecraft.getInstance(), keyMapping, this) != null) continue;
if (illegalKeyMappings.contains(keyMapping)) continue;
this.moddedKeyMappings.put(keyMapping, mappings.register(new ControllerMapping<>(new ControllerAction.Button(ControllerBoolean.Unknown), Side.RIGHT, Component.translatable(keyMapping.getName()), false, "minecraft." + keyMapping.getName(), (mc) -> isTargetingBlock(mc) || isTargetingEntity(mc))));
}

ControllerInput.moddedMappingsLoaded = true;
}

public Map<KeyMapping, ControllerMapping<?>> getMappings() {
return Collections.unmodifiableMap(moddedKeyMappings);
}

private boolean checkPlayer(Minecraft mc, Predicate<Player> predicate) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,9 +283,9 @@ public Icon getIcon() {
case DpadX -> Icon.DpadLeftRight;
case DpadY -> Icon.DpadUpDown;
case DpadUsed -> Icon.Dpad;
case Start -> Icon.Start;
case Start -> Icon.XboxGuide;
case Back -> Icon.XboxMenu;
case Guide -> Icon.XboxGuide;
case Guide -> Icon.Start;
case LeftStickDown -> Icon.LeftJoyStickDown;
case LeftStickUp -> Icon.LeftJoyStickUp;
case LeftStickLeft -> Icon.LeftJoyStickLeft;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import io.github.ultreon.controllerx.*;
import io.github.ultreon.controllerx.api.ControllerAction;
import io.github.ultreon.controllerx.api.ControllerContext;
import io.github.ultreon.controllerx.api.ControllerMapping;
import io.github.ultreon.controllerx.gui.ControllerInputHandler;
import io.github.ultreon.controllerx.gui.ControllerToast;
import io.github.ultreon.controllerx.gui.widget.ItemSlot;
Expand Down Expand Up @@ -46,6 +47,7 @@

@SuppressWarnings("MagicConstant")
public class ControllerInput extends Input {
@ApiStatus.Internal public static boolean moddedMappingsLoaded = false;
private final Vector2f leftStick = new Vector2f();
private final Vector2f rightStick = new Vector2f();

Expand All @@ -59,7 +61,6 @@ public class ControllerInput extends Input {
private KeyboardLayout layout;
private String virtualKeyboardValue = "";
private boolean virtualKeyboardOpen;
private float destroyDelay = 0;
private boolean screenWasOpen;
private InterceptCallback interceptCallback;
private InterceptInvalidation interceptInvalidation = new InterceptInvalidation() {
Expand All @@ -73,8 +74,6 @@ public boolean isStillValid() {
return false;
}
};
private float inputCooldown = 0F;
private ControllerAction<?> lastAction;

public ControllerInput(ControllerX mod) {
this.mod = mod;
Expand Down Expand Up @@ -555,7 +554,6 @@ public boolean shouldClick(Minecraft mc, KeyMapping mapping) {
if (ControllerContext.get() instanceof InGameControllerContext context) {
ControllerAction<?> action = getAction(mc, mapping, context);
if (action != null) {
this.lastAction = action;
return action.isJustPressed();
}
}
Expand All @@ -566,7 +564,6 @@ public boolean shouldRelease(Minecraft mc, KeyMapping mapping) {
if (ControllerContext.get() instanceof InGameControllerContext context) {
ControllerAction<?> action = getAction(mc, mapping, context);
if (action != null) {
this.lastAction = action;
return action.isJustReleased();
}
}
Expand All @@ -582,7 +579,7 @@ public boolean isDown(Minecraft mc, KeyMapping mapping) {
return false;
}

private static @Nullable ControllerAction<?> getAction(Minecraft mc, KeyMapping mapping, InGameControllerContext context) {
public static @Nullable ControllerAction<?> getAction(Minecraft mc, KeyMapping mapping, InGameControllerContext context) {
if (mapping == mc.options.keyPickItem) return context.pickItem.getAction();
if (mapping == mc.options.keyDrop) return context.drop.getAction();
if (mapping == mc.options.keyPlayerList) return context.playerList.getAction();
Expand All @@ -593,6 +590,12 @@ public boolean isDown(Minecraft mc, KeyMapping mapping) {
if (mapping == mc.options.keySprint) return context.run.getAction();
if (mapping == mc.options.keyUse) return context.use.getAction();
if (mapping == mc.options.keyAttack) return context.attack.getAction();

// Modded mappings
ControllerMapping<?> controllerMapping = context.getMappings().get(mapping);
if (ControllerInput.moddedMappingsLoaded && controllerMapping != null)
return controllerMapping.getAction();

return null;
}

Expand Down
3 changes: 2 additions & 1 deletion common/src/main/resources/controllerx.accesswidener
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ accessible field net/minecraft/client/gui/components/AbstractSelectionList x1 I
accessible field net/minecraft/client/gui/components/AbstractSelectionList y1 I
accessible field net/minecraft/client/KeyMapping key Lcom/mojang/blaze3d/platform/InputConstants$Key;
accessible method net/minecraft/client/Minecraft startAttack ()Z
accessible method net/minecraft/client/Minecraft continueAttack (Z)V
accessible method net/minecraft/client/Minecraft continueAttack (Z)V
accessible field net/minecraft/client/KeyMapping ALL Ljava/util/Map;

0 comments on commit 9bf4e4b

Please sign in to comment.