forked from Clones/Controlify
joystick support
This commit is contained in:
@ -1,91 +0,0 @@
|
||||
package dev.isxander.controlify.bindings;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.ControllerState;
|
||||
import dev.isxander.controlify.gui.ButtonRenderer;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
|
||||
public enum Bind implements IBind {
|
||||
A_BUTTON(state -> state.buttons().a(), "a_button"),
|
||||
B_BUTTON(state -> state.buttons().b(), "b_button"),
|
||||
X_BUTTON(state -> state.buttons().x(), "x_button"),
|
||||
Y_BUTTON(state -> state.buttons().y(), "y_button"),
|
||||
LEFT_BUMPER(state -> state.buttons().leftBumper(), "left_bumper"),
|
||||
RIGHT_BUMPER(state -> state.buttons().rightBumper(), "right_bumper"),
|
||||
LEFT_STICK_PRESS(state -> state.buttons().leftStick(), "left_stick_press"),
|
||||
RIGHT_STICK_PRESS(state -> state.buttons().rightStick(), "right_stick_press"),
|
||||
START(state -> state.buttons().start(), "start"),
|
||||
BACK(state -> state.buttons().back(), "back"),
|
||||
GUIDE(state -> state.buttons().guide(), "guide"), // the middle button
|
||||
DPAD_UP(state -> state.buttons().dpadUp(), "dpad_up"),
|
||||
DPAD_DOWN(state -> state.buttons().dpadDown(), "dpad_down"),
|
||||
DPAD_LEFT(state -> state.buttons().dpadLeft(), "dpad_left"),
|
||||
DPAD_RIGHT(state -> state.buttons().dpadRight(), "dpad_right"),
|
||||
LEFT_TRIGGER((state, controller) -> state.axes().leftTrigger(), "left_trigger"),
|
||||
RIGHT_TRIGGER((state, controller) -> state.axes().rightTrigger(), "right_trigger"),
|
||||
LEFT_STICK_FORWARD((state, controller) -> -Math.min(0, state.axes().leftStickY()), "left_stick_up"),
|
||||
LEFT_STICK_BACKWARD((state, controller) -> Math.max(0, state.axes().leftStickY()), "left_stick_down"),
|
||||
LEFT_STICK_LEFT((state, controller) -> -Math.min(0, state.axes().leftStickX()), "left_stick_left"),
|
||||
LEFT_STICK_RIGHT((state, controller) -> Math.max(0, state.axes().leftStickX()), "left_stick_right"),
|
||||
RIGHT_STICK_FORWARD((state, controller) -> -Math.min(0, state.axes().rightStickY()), "right_stick_up"),
|
||||
RIGHT_STICK_BACKWARD((state, controller) -> Math.max(0, state.axes().rightStickY()), "right_stick_down"),
|
||||
RIGHT_STICK_LEFT((state, controller) -> -Math.min(0, state.axes().rightStickX()), "right_stick_left"),
|
||||
RIGHT_STICK_RIGHT((state, controller) -> Math.max(0, state.axes().rightStickX()), "right_stick_right"),
|
||||
NONE((state, controller) -> 0f, "none");
|
||||
|
||||
private final BiFunction<ControllerState, Controller, Float> state;
|
||||
private final String identifier;
|
||||
|
||||
Bind(BiFunction<ControllerState, Controller, Float> state, String identifier) {
|
||||
this.state = state;
|
||||
this.identifier = identifier;
|
||||
}
|
||||
|
||||
Bind(Function<ControllerState, Boolean> state, String identifier) {
|
||||
this((state1, controller) -> state.apply(state1) ? 1f : 0f, identifier);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float state(ControllerState state, Controller controller) {
|
||||
return this.state.apply(state, controller);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(PoseStack matrices, int x, int centerY, Controller controller) {
|
||||
if (this != NONE)
|
||||
ButtonRenderer.drawButton(this, controller, matrices, x, centerY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ButtonRenderer.DrawSize drawSize() {
|
||||
if (this == NONE) return new ButtonRenderer.DrawSize(0, 0);
|
||||
|
||||
return new ButtonRenderer.DrawSize(22, 22);
|
||||
}
|
||||
|
||||
public String identifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
public ResourceLocation textureLocation(Controller controller) {
|
||||
return new ResourceLocation("controlify", "textures/gui/buttons/" + controller.config().theme.id() + "/" + identifier + ".png");
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonElement toJson() {
|
||||
return new JsonPrimitive(identifier);
|
||||
}
|
||||
|
||||
public static Bind fromIdentifier(String identifier) {
|
||||
for (Bind bind : values()) {
|
||||
if (bind.identifier.equals(identifier)) return bind;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,8 +1,9 @@
|
||||
package dev.isxander.controlify.bindings;
|
||||
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.ControllerState;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface BindingSupplier {
|
||||
ControllerBinding get(Controller controller);
|
||||
public interface BindingSupplier<T extends ControllerState> {
|
||||
ControllerBinding<T> get(Controller<T, ?> controller);
|
||||
}
|
||||
|
@ -1,78 +0,0 @@
|
||||
package dev.isxander.controlify.bindings;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.ControllerState;
|
||||
import dev.isxander.controlify.gui.ButtonRenderer;
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class CompoundBind implements IBind {
|
||||
private final Set<Bind> binds;
|
||||
|
||||
CompoundBind(Bind... binds) {
|
||||
this.binds = new LinkedHashSet<>(Arrays.asList(binds));
|
||||
if (this.binds.contains(Bind.NONE)) throw new IllegalArgumentException("Cannot have NONE in a compound bind!");
|
||||
}
|
||||
|
||||
public Set<Bind> binds() {
|
||||
return ImmutableSet.copyOf(binds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float state(ControllerState state, Controller controller) {
|
||||
return held(state, controller) ? 1f : 0f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean held(ControllerState state, Controller controller) {
|
||||
return binds.stream().allMatch(bind -> bind.held(state, controller));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(PoseStack matrices, int x, int centerY, Controller controller) {
|
||||
var font = Minecraft.getInstance().font;
|
||||
|
||||
var iterator = binds.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
var bind = iterator.next();
|
||||
|
||||
bind.draw(matrices, x, centerY, controller);
|
||||
x += bind.drawSize().width();
|
||||
|
||||
if (iterator.hasNext()) {
|
||||
font.drawShadow(matrices, "+", x + 1, centerY - font.lineHeight / 2f, 0xFFFFFF);
|
||||
x += font.width("+") + 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ButtonRenderer.DrawSize drawSize() {
|
||||
return new ButtonRenderer.DrawSize(
|
||||
binds.stream().map(IBind::drawSize).mapToInt(ButtonRenderer.DrawSize::width).sum() + (binds.size() - 1) * (2 + Minecraft.getInstance().font.width("+")),
|
||||
binds.stream().map(IBind::drawSize).mapToInt(ButtonRenderer.DrawSize::height).max().orElse(0)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonElement toJson() {
|
||||
var list = new JsonArray();
|
||||
for (IBind bind : binds) {
|
||||
list.add(bind.toJson());
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
return obj instanceof CompoundBind compoundBind && compoundBind.binds.equals(binds)
|
||||
|| obj instanceof Bind bind && Set.of(bind).equals(binds);
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@ package dev.isxander.controlify.bindings;
|
||||
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.ControllerState;
|
||||
import dev.isxander.controlify.controller.gamepad.GamepadController;
|
||||
import net.minecraft.client.KeyMapping;
|
||||
import net.minecraft.locale.Language;
|
||||
import net.minecraft.network.chat.Component;
|
||||
@ -13,17 +14,17 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.BooleanSupplier;
|
||||
|
||||
public class ControllerBinding {
|
||||
private final Controller controller;
|
||||
private IBind bind;
|
||||
private final IBind defaultBind;
|
||||
public class ControllerBinding<T extends ControllerState> {
|
||||
private final Controller<T, ?> controller;
|
||||
private IBind<T> bind;
|
||||
private final IBind<T> defaultBind;
|
||||
private final ResourceLocation id;
|
||||
private final Component name, description;
|
||||
private final KeyMappingOverride override;
|
||||
|
||||
private static final Map<Controller, Set<Bind>> pressedBinds = new HashMap<>();
|
||||
private static final Map<Controller<?, ?>, Set<IBind<?>>> pressedBinds = new HashMap<>();
|
||||
|
||||
public ControllerBinding(Controller controller, IBind defaultBind, ResourceLocation id, KeyMapping override, BooleanSupplier toggleOverride) {
|
||||
public ControllerBinding(Controller<T, ?> controller, IBind<T> defaultBind, ResourceLocation id, KeyMapping override, BooleanSupplier toggleOverride) {
|
||||
this.controller = controller;
|
||||
this.bind = this.defaultBind = defaultBind;
|
||||
this.id = id;
|
||||
@ -33,22 +34,38 @@ public class ControllerBinding {
|
||||
this.override = override != null ? new KeyMappingOverride(override, toggleOverride) : null;
|
||||
}
|
||||
|
||||
public ControllerBinding(Controller controller, IBind defaultBind, ResourceLocation id) {
|
||||
public ControllerBinding(Controller<T, ?> controller, IBind<T> defaultBind, ResourceLocation id) {
|
||||
this(controller, defaultBind, id, null, () -> false);
|
||||
}
|
||||
|
||||
public ControllerBinding(Controller<T, ?> controller, GamepadBind defaultBind, ResourceLocation id, KeyMapping override, BooleanSupplier toggleOverride) {
|
||||
this(controller, controller instanceof GamepadController ? (IBind<T>) defaultBind : new EmptyBind<>(), id, override, toggleOverride);
|
||||
}
|
||||
|
||||
public ControllerBinding(Controller<T, ?> controller, GamepadBind defaultBind, ResourceLocation id) {
|
||||
this(controller, defaultBind, id, null, () -> false);
|
||||
}
|
||||
|
||||
public float state() {
|
||||
return bind.state(controller.state(), controller);
|
||||
return bind.state(controller.state());
|
||||
}
|
||||
|
||||
public float prevState() {
|
||||
return bind.state(controller.prevState());
|
||||
}
|
||||
|
||||
public boolean held() {
|
||||
return bind.held(controller.state(), controller);
|
||||
}
|
||||
|
||||
public boolean prevHeld() {
|
||||
return bind.held(controller.prevState(), controller);
|
||||
}
|
||||
|
||||
public boolean justPressed() {
|
||||
if (hasBindPressed(this)) return false;
|
||||
|
||||
if (held() && !bind.held(controller.prevState(), controller)) {
|
||||
if (held() && !prevHeld()) {
|
||||
addPressedBind(this);
|
||||
return true;
|
||||
} else {
|
||||
@ -59,7 +76,7 @@ public class ControllerBinding {
|
||||
public boolean justReleased() {
|
||||
if (hasBindPressed(this)) return false;
|
||||
|
||||
if (!held() && bind.held(controller.prevState(), controller)) {
|
||||
if (!held() && prevHeld()) {
|
||||
addPressedBind(this);
|
||||
return true;
|
||||
} else {
|
||||
@ -67,15 +84,15 @@ public class ControllerBinding {
|
||||
}
|
||||
}
|
||||
|
||||
public IBind currentBind() {
|
||||
public IBind<T> currentBind() {
|
||||
return bind;
|
||||
}
|
||||
|
||||
public void setCurrentBind(IBind bind) {
|
||||
public void setCurrentBind(IBind<T> bind) {
|
||||
this.bind = bind;
|
||||
}
|
||||
|
||||
public IBind defaultBind() {
|
||||
public IBind<T> defaultBind() {
|
||||
return defaultBind;
|
||||
}
|
||||
|
||||
@ -97,27 +114,23 @@ public class ControllerBinding {
|
||||
|
||||
// FIXME: very hack solution please remove me
|
||||
|
||||
public static void clearPressedBinds(Controller controller) {
|
||||
public static void clearPressedBinds(Controller<?, ?> controller) {
|
||||
if (pressedBinds.containsKey(controller)) {
|
||||
pressedBinds.get(controller).clear();
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean hasBindPressed(ControllerBinding binding) {
|
||||
private static boolean hasBindPressed(ControllerBinding<?> binding) {
|
||||
var pressed = pressedBinds.getOrDefault(binding.controller, Set.of());
|
||||
return pressed.containsAll(getBinds(binding.bind));
|
||||
}
|
||||
|
||||
private static void addPressedBind(ControllerBinding binding) {
|
||||
private static void addPressedBind(ControllerBinding<?> binding) {
|
||||
pressedBinds.computeIfAbsent(binding.controller, c -> new HashSet<>()).addAll(getBinds(binding.bind));
|
||||
}
|
||||
|
||||
private static Set<Bind> getBinds(IBind bind) {
|
||||
if (bind instanceof CompoundBind compoundBind) {
|
||||
return compoundBind.binds();
|
||||
} else {
|
||||
return Set.of((Bind) bind);
|
||||
}
|
||||
private static Set<IBind<?>> getBinds(IBind<?> bind) {
|
||||
return Set.of(bind);
|
||||
}
|
||||
|
||||
public record KeyMappingOverride(KeyMapping keyMapping, BooleanSupplier toggleable) {
|
||||
|
@ -4,6 +4,7 @@ import com.google.gson.JsonObject;
|
||||
import dev.isxander.controlify.Controlify;
|
||||
import dev.isxander.controlify.InputMode;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.ControllerState;
|
||||
import dev.isxander.controlify.event.ControlifyEvents;
|
||||
import dev.isxander.controlify.mixins.feature.bind.KeyMappingAccessor;
|
||||
import net.minecraft.client.KeyMapping;
|
||||
@ -12,9 +13,10 @@ import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class ControllerBindings {
|
||||
public final ControllerBinding
|
||||
public class ControllerBindings<T extends ControllerState> {
|
||||
public final ControllerBinding<T>
|
||||
WALK_FORWARD, WALK_BACKWARD, WALK_LEFT, WALK_RIGHT,
|
||||
LOOK_UP, LOOK_DOWN, LOOK_LEFT, LOOK_RIGHT,
|
||||
JUMP, SNEAK,
|
||||
ATTACK, USE,
|
||||
SPRINT,
|
||||
@ -27,51 +29,71 @@ public class ControllerBindings {
|
||||
OPEN_CHAT,
|
||||
GUI_PRESS, GUI_BACK,
|
||||
GUI_NEXT_TAB, GUI_PREV_TAB,
|
||||
VMOUSE_LCLICK, VMOUSE_RCLICK, VMOUSE_SHIFT_CLICK, VMOUSE_SCROLL_UP, VMOUSE_SCROLL_DOWN, VMOUSE_ESCAPE, VMOUSE_SHIFT, VMOUSE_TOGGLE,
|
||||
PICK_BLOCK,
|
||||
TOGGLE_HUD_VISIBILITY,
|
||||
SHOW_PLAYER_LIST;
|
||||
SHOW_PLAYER_LIST,
|
||||
VMOUSE_MOVE_UP, VMOUSE_MOVE_DOWN, VMOUSE_MOVE_LEFT, VMOUSE_MOVE_RIGHT,
|
||||
VMOUSE_LCLICK, VMOUSE_RCLICK, VMOUSE_SHIFT_CLICK,
|
||||
VMOUSE_SCROLL_UP, VMOUSE_SCROLL_DOWN,
|
||||
VMOUSE_ESCAPE, VMOUSE_SHIFT,
|
||||
VMOUSE_TOGGLE,
|
||||
GUI_NAVI_UP, GUI_NAVI_DOWN, GUI_NAVI_LEFT, GUI_NAVI_RIGHT,
|
||||
YACL_CYCLE_OPT_FORWARD, YACL_CYCLE_OPT_BACKWARD;
|
||||
|
||||
private final Map<ResourceLocation, ControllerBinding> registry = new LinkedHashMap<>();
|
||||
private final Map<ResourceLocation, ControllerBinding<T>> registry = new LinkedHashMap<>();
|
||||
|
||||
private final Controller controller;
|
||||
private final Controller<T, ?> controller;
|
||||
|
||||
public ControllerBindings(Controller controller) {
|
||||
public ControllerBindings(Controller<T, ?> controller) {
|
||||
this.controller = controller;
|
||||
var options = Minecraft.getInstance().options;
|
||||
|
||||
register(WALK_FORWARD = new ControllerBinding(controller, Bind.LEFT_STICK_FORWARD, new ResourceLocation("controlify", "walk_forward")));
|
||||
register(WALK_BACKWARD = new ControllerBinding(controller, Bind.LEFT_STICK_BACKWARD, new ResourceLocation("controlify", "walk_backward")));
|
||||
register(WALK_LEFT = new ControllerBinding(controller, Bind.LEFT_STICK_LEFT, new ResourceLocation("controlify", "strafe_left")));
|
||||
register(WALK_RIGHT = new ControllerBinding(controller, Bind.LEFT_STICK_RIGHT, new ResourceLocation("controlify", "strafe_right")));
|
||||
register(JUMP = new ControllerBinding(controller, Bind.A_BUTTON, new ResourceLocation("controlify", "jump"), options.keyJump, () -> false));
|
||||
register(SNEAK = new ControllerBinding(controller, Bind.RIGHT_STICK_PRESS, new ResourceLocation("controlify", "sneak"), options.keyShift, () -> controller.config().toggleSneak));
|
||||
register(ATTACK = new ControllerBinding(controller, Bind.RIGHT_TRIGGER, new ResourceLocation("controlify", "attack"), options.keyAttack, () -> false));
|
||||
register(USE = new ControllerBinding(controller, Bind.LEFT_TRIGGER, new ResourceLocation("controlify", "use"), options.keyUse, () -> false));
|
||||
register(SPRINT = new ControllerBinding(controller, Bind.LEFT_STICK_PRESS, new ResourceLocation("controlify", "sprint"), options.keySprint, () -> controller.config().toggleSprint));
|
||||
register(DROP = new ControllerBinding(controller, Bind.DPAD_DOWN, new ResourceLocation("controlify", "drop"), options.keyDrop, () -> false));
|
||||
register(NEXT_SLOT = new ControllerBinding(controller, Bind.RIGHT_BUMPER, new ResourceLocation("controlify", "next_slot")));
|
||||
register(PREV_SLOT = new ControllerBinding(controller, Bind.LEFT_BUMPER, new ResourceLocation("controlify", "prev_slot")));
|
||||
register(PAUSE = new ControllerBinding(controller, Bind.START, new ResourceLocation("controlify", "pause")));
|
||||
register(INVENTORY = new ControllerBinding(controller, Bind.Y_BUTTON, new ResourceLocation("controlify", "inventory"), options.keyInventory, () -> false));
|
||||
register(CHANGE_PERSPECTIVE = new ControllerBinding(controller, Bind.BACK, new ResourceLocation("controlify", "change_perspective"), options.keyTogglePerspective, () -> false));
|
||||
register(SWAP_HANDS = new ControllerBinding(controller, Bind.X_BUTTON, new ResourceLocation("controlify", "swap_hands"), options.keySwapOffhand, () -> false));
|
||||
register(OPEN_CHAT = new ControllerBinding(controller, Bind.DPAD_UP, new ResourceLocation("controlify", "open_chat"), options.keyChat, () -> false));
|
||||
register(GUI_PRESS = new ControllerBinding(controller, Bind.A_BUTTON, new ResourceLocation("controlify", "gui_press")));
|
||||
register(GUI_BACK = new ControllerBinding(controller, Bind.B_BUTTON, new ResourceLocation("controlify", "gui_back")));
|
||||
register(GUI_NEXT_TAB = new ControllerBinding(controller, Bind.RIGHT_BUMPER, new ResourceLocation("controlify", "gui_next_tab")));
|
||||
register(GUI_PREV_TAB = new ControllerBinding(controller, Bind.LEFT_BUMPER, new ResourceLocation("controlify", "gui_prev_tab")));
|
||||
register(PICK_BLOCK = new ControllerBinding(controller, Bind.DPAD_LEFT, new ResourceLocation("controlify", "pick_block"), options.keyPickItem, () -> false));
|
||||
register(TOGGLE_HUD_VISIBILITY = new ControllerBinding(controller, Bind.NONE, new ResourceLocation("controlify", "toggle_hud_visibility")));
|
||||
register(SHOW_PLAYER_LIST = new ControllerBinding(controller, Bind.DPAD_RIGHT, new ResourceLocation("controlify", "show_player_list"), options.keyPlayerList, () -> false));
|
||||
register(VMOUSE_LCLICK = new ControllerBinding(controller, Bind.A_BUTTON, new ResourceLocation("controlify", "vmouse_lclick")));
|
||||
register(VMOUSE_RCLICK = new ControllerBinding(controller, Bind.X_BUTTON, new ResourceLocation("controlify", "vmouse_rclick")));
|
||||
register(VMOUSE_SHIFT_CLICK = new ControllerBinding(controller, Bind.Y_BUTTON, new ResourceLocation("controlify", "vmouse_shift_click")));
|
||||
register(VMOUSE_SCROLL_UP = new ControllerBinding(controller, Bind.RIGHT_STICK_FORWARD, new ResourceLocation("controlify", "vmouse_scroll_up")));
|
||||
register(VMOUSE_SCROLL_DOWN = new ControllerBinding(controller, Bind.RIGHT_STICK_BACKWARD, new ResourceLocation("controlify", "vmouse_scroll_down")));
|
||||
register(VMOUSE_ESCAPE = new ControllerBinding(controller, Bind.B_BUTTON, new ResourceLocation("controlify", "vmouse_escape")));
|
||||
register(VMOUSE_SHIFT = new ControllerBinding(controller, Bind.LEFT_STICK_PRESS, new ResourceLocation("controlify", "vmouse_shift")));
|
||||
register(VMOUSE_TOGGLE = new ControllerBinding(controller, Bind.BACK, new ResourceLocation("controlify", "vmouse_toggle")));
|
||||
register(WALK_FORWARD = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_FORWARD, new ResourceLocation("controlify", "walk_forward")));
|
||||
register(WALK_BACKWARD = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_BACKWARD, new ResourceLocation("controlify", "walk_backward")));
|
||||
register(WALK_LEFT = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_LEFT, new ResourceLocation("controlify", "strafe_left")));
|
||||
register(WALK_RIGHT = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_RIGHT, new ResourceLocation("controlify", "strafe_right")));
|
||||
register(LOOK_UP = new ControllerBinding<>(controller, GamepadBind.RIGHT_STICK_FORWARD, new ResourceLocation("controlify", "look_up")));
|
||||
register(LOOK_DOWN = new ControllerBinding<>(controller, GamepadBind.RIGHT_STICK_BACKWARD, new ResourceLocation("controlify", "look_down")));
|
||||
register(LOOK_LEFT = new ControllerBinding<>(controller, GamepadBind.RIGHT_STICK_LEFT, new ResourceLocation("controlify", "look_left")));
|
||||
register(LOOK_RIGHT = new ControllerBinding<>(controller, GamepadBind.RIGHT_STICK_RIGHT, new ResourceLocation("controlify", "look_right")));
|
||||
register(JUMP = new ControllerBinding<>(controller, GamepadBind.A_BUTTON, new ResourceLocation("controlify", "jump"), options.keyJump, () -> false));
|
||||
register(SNEAK = new ControllerBinding<>(controller, GamepadBind.RIGHT_STICK_PRESS, new ResourceLocation("controlify", "sneak"), options.keyShift, () -> controller.config().toggleSneak));
|
||||
register(ATTACK = new ControllerBinding<>(controller, GamepadBind.RIGHT_TRIGGER, new ResourceLocation("controlify", "attack"), options.keyAttack, () -> false));
|
||||
register(USE = new ControllerBinding<>(controller, GamepadBind.LEFT_TRIGGER, new ResourceLocation("controlify", "use"), options.keyUse, () -> false));
|
||||
register(SPRINT = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_PRESS, new ResourceLocation("controlify", "sprint"), options.keySprint, () -> controller.config().toggleSprint));
|
||||
register(DROP = new ControllerBinding<>(controller, GamepadBind.DPAD_DOWN, new ResourceLocation("controlify", "drop"), options.keyDrop, () -> false));
|
||||
register(NEXT_SLOT = new ControllerBinding<>(controller, GamepadBind.RIGHT_BUMPER, new ResourceLocation("controlify", "next_slot")));
|
||||
register(PREV_SLOT = new ControllerBinding<>(controller, GamepadBind.LEFT_BUMPER, new ResourceLocation("controlify", "prev_slot")));
|
||||
register(PAUSE = new ControllerBinding<>(controller, GamepadBind.START, new ResourceLocation("controlify", "pause")));
|
||||
register(INVENTORY = new ControllerBinding<>(controller, GamepadBind.Y_BUTTON, new ResourceLocation("controlify", "inventory"), options.keyInventory, () -> false));
|
||||
register(CHANGE_PERSPECTIVE = new ControllerBinding<>(controller, GamepadBind.BACK, new ResourceLocation("controlify", "change_perspective"), options.keyTogglePerspective, () -> false));
|
||||
register(SWAP_HANDS = new ControllerBinding<>(controller, GamepadBind.X_BUTTON, new ResourceLocation("controlify", "swap_hands"), options.keySwapOffhand, () -> false));
|
||||
register(OPEN_CHAT = new ControllerBinding<>(controller, GamepadBind.DPAD_UP, new ResourceLocation("controlify", "open_chat"), options.keyChat, () -> false));
|
||||
register(GUI_PRESS = new ControllerBinding<>(controller, GamepadBind.A_BUTTON, new ResourceLocation("controlify", "gui_press")));
|
||||
register(GUI_BACK = new ControllerBinding<>(controller, GamepadBind.B_BUTTON, new ResourceLocation("controlify", "gui_back")));
|
||||
register(GUI_NEXT_TAB = new ControllerBinding<>(controller, GamepadBind.RIGHT_BUMPER, new ResourceLocation("controlify", "gui_next_tab")));
|
||||
register(GUI_PREV_TAB = new ControllerBinding<>(controller, GamepadBind.LEFT_BUMPER, new ResourceLocation("controlify", "gui_prev_tab")));
|
||||
register(PICK_BLOCK = new ControllerBinding<>(controller, GamepadBind.DPAD_LEFT, new ResourceLocation("controlify", "pick_block"), options.keyPickItem, () -> false));
|
||||
register(TOGGLE_HUD_VISIBILITY = new ControllerBinding<>(controller, new EmptyBind<>(), new ResourceLocation("controlify", "toggle_hud_visibility")));
|
||||
register(SHOW_PLAYER_LIST = new ControllerBinding<>(controller, GamepadBind.DPAD_RIGHT, new ResourceLocation("controlify", "show_player_list"), options.keyPlayerList, () -> false));
|
||||
register(VMOUSE_MOVE_UP = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_FORWARD, new ResourceLocation("controlify", "vmouse_move_up")));
|
||||
register(VMOUSE_MOVE_DOWN = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_BACKWARD, new ResourceLocation("controlify", "vmouse_move_down")));
|
||||
register(VMOUSE_MOVE_LEFT = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_LEFT, new ResourceLocation("controlify", "vmouse_move_left")));
|
||||
register(VMOUSE_MOVE_RIGHT = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_RIGHT, new ResourceLocation("controlify", "vmouse_move_right")));
|
||||
register(VMOUSE_LCLICK = new ControllerBinding<>(controller, GamepadBind.A_BUTTON, new ResourceLocation("controlify", "vmouse_lclick")));
|
||||
register(VMOUSE_RCLICK = new ControllerBinding<>(controller, GamepadBind.X_BUTTON, new ResourceLocation("controlify", "vmouse_rclick")));
|
||||
register(VMOUSE_SHIFT_CLICK = new ControllerBinding<>(controller, GamepadBind.Y_BUTTON, new ResourceLocation("controlify", "vmouse_shift_click")));
|
||||
register(VMOUSE_SCROLL_UP = new ControllerBinding<>(controller, GamepadBind.RIGHT_STICK_FORWARD, new ResourceLocation("controlify", "vmouse_scroll_up")));
|
||||
register(VMOUSE_SCROLL_DOWN = new ControllerBinding<>(controller, GamepadBind.RIGHT_STICK_BACKWARD, new ResourceLocation("controlify", "vmouse_scroll_down")));
|
||||
register(VMOUSE_ESCAPE = new ControllerBinding<>(controller, GamepadBind.B_BUTTON, new ResourceLocation("controlify", "vmouse_escape")));
|
||||
register(VMOUSE_SHIFT = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_PRESS, new ResourceLocation("controlify", "vmouse_shift")));
|
||||
register(VMOUSE_TOGGLE = new ControllerBinding<>(controller, GamepadBind.BACK, new ResourceLocation("controlify", "vmouse_toggle")));
|
||||
register(GUI_NAVI_UP = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_FORWARD, new ResourceLocation("controlify", "gui_navi_up")));
|
||||
register(GUI_NAVI_DOWN = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_BACKWARD, new ResourceLocation("controlify", "gui_navi_down")));
|
||||
register(GUI_NAVI_LEFT = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_LEFT, new ResourceLocation("controlify", "gui_navi_left")));
|
||||
register(GUI_NAVI_RIGHT = new ControllerBinding<>(controller, GamepadBind.LEFT_STICK_RIGHT, new ResourceLocation("controlify", "gui_navi_right")));
|
||||
register(YACL_CYCLE_OPT_FORWARD = new ControllerBinding<>(controller, GamepadBind.RIGHT_STICK_RIGHT, new ResourceLocation("controlify", "yacl_cycle_opt_forward")));
|
||||
register(YACL_CYCLE_OPT_BACKWARD = new ControllerBinding<>(controller, GamepadBind.RIGHT_STICK_LEFT, new ResourceLocation("controlify", "yacl_cycle_opt_backward")));
|
||||
|
||||
ControlifyEvents.CONTROLLER_BIND_REGISTRY.invoker().onRegisterControllerBinds(this, controller);
|
||||
|
||||
@ -79,16 +101,16 @@ public class ControllerBindings {
|
||||
ControlifyEvents.INPUT_MODE_CHANGED.register(mode -> KeyMapping.releaseAll());
|
||||
}
|
||||
|
||||
public BindingSupplier register(ControllerBinding binding) {
|
||||
public BindingSupplier<T> register(ControllerBinding<T> binding) {
|
||||
registry.put(binding.id(), binding);
|
||||
return controller -> controller.bindings().get(binding.id());
|
||||
}
|
||||
|
||||
public ControllerBinding get(ResourceLocation id) {
|
||||
public ControllerBinding<T> get(ResourceLocation id) {
|
||||
return registry.get(id);
|
||||
}
|
||||
|
||||
public Map<ResourceLocation, ControllerBinding> registry() {
|
||||
public Map<ResourceLocation, ControllerBinding<T>> registry() {
|
||||
return Collections.unmodifiableMap(registry);
|
||||
}
|
||||
|
||||
@ -102,13 +124,13 @@ public class ControllerBindings {
|
||||
|
||||
public void fromJson(JsonObject json) {
|
||||
for (var binding : registry().values()) {
|
||||
var bind = json.get(binding.id().toString());
|
||||
var bind = json.get(binding.id().toString()).getAsJsonObject();
|
||||
if (bind == null) continue;
|
||||
binding.setCurrentBind(IBind.fromJson(bind));
|
||||
binding.setCurrentBind(IBind.fromJson(bind, controller));
|
||||
}
|
||||
}
|
||||
|
||||
public void onControllerUpdate(Controller controller) {
|
||||
public void onControllerUpdate(Controller<?, ?> controller) {
|
||||
if (controller != this.controller) return;
|
||||
|
||||
imitateVanillaClick();
|
||||
|
@ -0,0 +1,38 @@
|
||||
package dev.isxander.controlify.bindings;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.ControllerState;
|
||||
import dev.isxander.controlify.gui.DrawSize;
|
||||
|
||||
public class EmptyBind<T extends ControllerState> implements IBind<T> {
|
||||
public static final String BIND_ID = "empty";
|
||||
|
||||
@Override
|
||||
public float state(T state) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(PoseStack matrices, int x, int centerY, Controller<T, ?> controller) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public DrawSize drawSize() {
|
||||
return new DrawSize(0, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject toJson() {
|
||||
JsonObject object = new JsonObject();
|
||||
object.addProperty("type", BIND_ID);
|
||||
return object;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
return obj instanceof EmptyBind;
|
||||
}
|
||||
}
|
110
src/main/java/dev/isxander/controlify/bindings/GamepadBind.java
Normal file
110
src/main/java/dev/isxander/controlify/bindings/GamepadBind.java
Normal file
@ -0,0 +1,110 @@
|
||||
package dev.isxander.controlify.bindings;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.gamepad.GamepadConfig;
|
||||
import dev.isxander.controlify.controller.gamepad.BuiltinGamepadTheme;
|
||||
import dev.isxander.controlify.controller.gamepad.GamepadState;
|
||||
import dev.isxander.controlify.gui.DrawSize;
|
||||
import net.minecraft.client.gui.GuiComponent;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
public enum GamepadBind implements IBind<GamepadState> {
|
||||
A_BUTTON(state -> state.gamepadButtons().a(), "a_button"),
|
||||
B_BUTTON(state -> state.gamepadButtons().b(), "b_button"),
|
||||
X_BUTTON(state -> state.gamepadButtons().x(), "x_button"),
|
||||
Y_BUTTON(state -> state.gamepadButtons().y(), "y_button"),
|
||||
LEFT_BUMPER(state -> state.gamepadButtons().leftBumper(), "left_bumper"),
|
||||
RIGHT_BUMPER(state -> state.gamepadButtons().rightBumper(), "right_bumper"),
|
||||
LEFT_STICK_PRESS(state -> state.gamepadButtons().leftStick(), "left_stick_press"),
|
||||
RIGHT_STICK_PRESS(state -> state.gamepadButtons().rightStick(), "right_stick_press"),
|
||||
START(state -> state.gamepadButtons().start(), "start"),
|
||||
BACK(state -> state.gamepadButtons().back(), "back"),
|
||||
GUIDE(state -> state.gamepadButtons().guide(), "guide"), // the middle button
|
||||
DPAD_UP(state -> state.gamepadButtons().dpadUp(), "dpad_up"),
|
||||
DPAD_DOWN(state -> state.gamepadButtons().dpadDown(), "dpad_down"),
|
||||
DPAD_LEFT(state -> state.gamepadButtons().dpadLeft(), "dpad_left"),
|
||||
DPAD_RIGHT(state -> state.gamepadButtons().dpadRight(), "dpad_right"),
|
||||
LEFT_TRIGGER(state -> state.gamepadAxes().leftTrigger(), "left_trigger", true),
|
||||
RIGHT_TRIGGER(state -> state.gamepadAxes().rightTrigger(), "right_trigger", true),
|
||||
LEFT_STICK_FORWARD(state -> -Math.min(0, state.gamepadAxes().leftStickY()), "left_stick_up", true),
|
||||
LEFT_STICK_BACKWARD(state -> Math.max(0, state.gamepadAxes().leftStickY()), "left_stick_down", true),
|
||||
LEFT_STICK_LEFT(state -> -Math.min(0, state.gamepadAxes().leftStickX()), "left_stick_left", true),
|
||||
LEFT_STICK_RIGHT(state -> Math.max(0, state.gamepadAxes().leftStickX()), "left_stick_right", true),
|
||||
RIGHT_STICK_FORWARD(state -> -Math.min(0, state.gamepadAxes().rightStickY()), "right_stick_up", true),
|
||||
RIGHT_STICK_BACKWARD(state -> Math.max(0, state.gamepadAxes().rightStickY()), "right_stick_down", true),
|
||||
RIGHT_STICK_LEFT(state -> -Math.min(0, state.gamepadAxes().rightStickX()), "right_stick_left", true),
|
||||
RIGHT_STICK_RIGHT(state -> Math.max(0, state.gamepadAxes().rightStickX()), "right_stick_right", true);
|
||||
|
||||
public static final String BIND_ID = "gamepad";
|
||||
|
||||
private final Function<GamepadState, Float> state;
|
||||
private final String identifier;
|
||||
private final Map<BuiltinGamepadTheme, ResourceLocation> textureLocations;
|
||||
|
||||
GamepadBind(Function<GamepadState, Float> state, String identifier, boolean jvmIsBad) {
|
||||
this.state = state;
|
||||
this.identifier = identifier;
|
||||
|
||||
this.textureLocations = new HashMap<>();
|
||||
for (BuiltinGamepadTheme theme : BuiltinGamepadTheme.values()) {
|
||||
if (theme == BuiltinGamepadTheme.DEFAULT) continue;
|
||||
textureLocations.put(theme, new ResourceLocation("controlify", "textures/gui/gamepad_buttons/" + theme.id() + "/" + identifier + ".png"));
|
||||
}
|
||||
}
|
||||
|
||||
GamepadBind(Function<GamepadState, Boolean> state, String identifier) {
|
||||
this(state1 -> state.apply(state1) ? 1f : 0f, identifier, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float state(GamepadState state) {
|
||||
return this.state.apply(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(PoseStack matrices, int x, int centerY, Controller<GamepadState, ?> controller) {
|
||||
ResourceLocation texture;
|
||||
if (((GamepadConfig)controller.config()).theme == BuiltinGamepadTheme.DEFAULT) {
|
||||
texture = new ResourceLocation("controlify", "textures/gui/gamepad_buttons/" + controller.type().identifier() + "/" + identifier + ".png");
|
||||
} else {
|
||||
texture = textureLocations.get(((GamepadConfig)controller.config()).theme);
|
||||
}
|
||||
|
||||
RenderSystem.setShaderTexture(0, texture);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
|
||||
GuiComponent.blit(matrices, x, centerY - 22 / 2, 0, 0, 22, 22, 22, 22);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DrawSize drawSize() {
|
||||
return new DrawSize(22, 22);
|
||||
}
|
||||
|
||||
public String identifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject toJson() {
|
||||
JsonObject object = new JsonObject();
|
||||
object.addProperty("type", BIND_ID);
|
||||
object.addProperty("bind", identifier);
|
||||
return object;
|
||||
}
|
||||
|
||||
public static GamepadBind fromJson(JsonObject object) {
|
||||
String name = object.get("bind").getAsString();
|
||||
for (GamepadBind bind : values()) {
|
||||
if (bind.identifier.equals(name)) return bind;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,38 +1,45 @@
|
||||
package dev.isxander.controlify.bindings;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.ControllerState;
|
||||
import dev.isxander.controlify.gui.ButtonRenderer;
|
||||
import dev.isxander.controlify.Controlify;
|
||||
import dev.isxander.controlify.controller.*;
|
||||
import dev.isxander.controlify.controller.gamepad.GamepadController;
|
||||
import dev.isxander.controlify.controller.joystick.JoystickController;
|
||||
import dev.isxander.controlify.gui.DrawSize;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface IBind {
|
||||
float state(ControllerState state, Controller controller);
|
||||
default boolean held(ControllerState state, Controller controller) {
|
||||
return state(state, controller) > controller.config().buttonActivationThreshold;
|
||||
public interface IBind<S extends ControllerState> {
|
||||
float state(S state);
|
||||
default boolean held(S state, Controller<S, ?> controller) {
|
||||
return state(state) > controller.config().buttonActivationThreshold;
|
||||
}
|
||||
|
||||
void draw(PoseStack matrices, int x, int centerY, Controller controller);
|
||||
ButtonRenderer.DrawSize drawSize();
|
||||
void draw(PoseStack matrices, int x, int centerY, Controller<S, ?> controller);
|
||||
DrawSize drawSize();
|
||||
|
||||
JsonElement toJson();
|
||||
JsonObject toJson();
|
||||
|
||||
static IBind fromJson(JsonElement json) {
|
||||
if (json.isJsonArray()) {
|
||||
return new CompoundBind(json.getAsJsonArray().asList().stream().map(element -> Bind.fromIdentifier(element.getAsString())).toArray(Bind[]::new));
|
||||
} else {
|
||||
return Bind.fromIdentifier(json.getAsString());
|
||||
@SuppressWarnings("unchecked")
|
||||
static <T extends ControllerState> IBind<T> fromJson(JsonObject json, Controller<T, ?> controller) {
|
||||
var type = json.get("type").getAsString();
|
||||
if (type.equals(EmptyBind.BIND_ID))
|
||||
return new EmptyBind<>();
|
||||
|
||||
if (controller instanceof GamepadController && type.equals(GamepadBind.BIND_ID)) {
|
||||
return (IBind<T>) GamepadBind.fromJson(json);
|
||||
} else if (controller instanceof JoystickController joystick) {
|
||||
return (IBind<T>) switch (type) {
|
||||
case JoystickButtonBind.BIND_ID -> JoystickButtonBind.fromJson(json, joystick);
|
||||
case JoystickHatBind.BIND_ID -> JoystickHatBind.fromJson(json, joystick);
|
||||
case JoystickAxisBind.BIND_ID -> JoystickAxisBind.fromJson(json, joystick);
|
||||
default -> {
|
||||
Controlify.LOGGER.error("Unknown bind type: " + type);
|
||||
yield new EmptyBind<>();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
static IBind create(Collection<Bind> binds) {
|
||||
if (binds.size() == 1) return binds.stream().findAny().orElseThrow();
|
||||
return new CompoundBind(binds.toArray(new Bind[0]));
|
||||
}
|
||||
static IBind create(Bind... binds) {
|
||||
if (binds.length == 1) return binds[0];
|
||||
return new CompoundBind(binds);
|
||||
Controlify.LOGGER.error("Could not parse bind for controller: " + controller.name());
|
||||
return new EmptyBind<>();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,88 @@
|
||||
package dev.isxander.controlify.bindings;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.joystick.JoystickController;
|
||||
import dev.isxander.controlify.controller.joystick.JoystickState;
|
||||
import dev.isxander.controlify.gui.DrawSize;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class JoystickAxisBind implements IBind<JoystickState> {
|
||||
public static final String BIND_ID = "joystick_axis";
|
||||
|
||||
private final JoystickController joystick;
|
||||
private final int axisIndex;
|
||||
private final AxisDirection direction;
|
||||
|
||||
public JoystickAxisBind(JoystickController joystick, int axisIndex, AxisDirection direction) {
|
||||
this.joystick = joystick;
|
||||
this.axisIndex = axisIndex;
|
||||
this.direction = direction;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float state(JoystickState state) {
|
||||
var rawState = state.axes().get(axisIndex);
|
||||
return switch (direction) {
|
||||
case POSITIVE -> Math.max(0, rawState);
|
||||
case NEGATIVE -> -Math.min(0, rawState);
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(PoseStack matrices, int x, int centerY, Controller<JoystickState, ?> controller) {
|
||||
var font = Minecraft.getInstance().font;
|
||||
font.drawShadow(matrices, getTempButtonName(), x + 1.5f, centerY - font.lineHeight / 2f, 0xFFFFFF);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DrawSize drawSize() {
|
||||
var font = Minecraft.getInstance().font;
|
||||
return new DrawSize(font.width(getTempButtonName()) + 3, font.lineHeight);
|
||||
}
|
||||
|
||||
private Component getTempButtonName() {
|
||||
var axis = joystick.mapping().axis(axisIndex);
|
||||
return Component.empty()
|
||||
.append(axis.name())
|
||||
.append(" ")
|
||||
.append(axis.getDirectionName(axisIndex, direction));
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject toJson() {
|
||||
JsonObject object = new JsonObject();
|
||||
object.addProperty("type", BIND_ID);
|
||||
object.addProperty("axis", axisIndex);
|
||||
object.addProperty("direction", direction.name());
|
||||
return object;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
JoystickAxisBind that = (JoystickAxisBind) o;
|
||||
return axisIndex == that.axisIndex && direction == that.direction;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(axisIndex, direction);
|
||||
}
|
||||
|
||||
public static JoystickAxisBind fromJson(JsonObject object, JoystickController joystick) {
|
||||
var axisIndex = object.get("axis").getAsInt();
|
||||
var direction = AxisDirection.valueOf(object.get("direction").getAsString());
|
||||
return new JoystickAxisBind(joystick, axisIndex, direction);
|
||||
}
|
||||
|
||||
public enum AxisDirection {
|
||||
POSITIVE,
|
||||
NEGATIVE
|
||||
}
|
||||
}
|
@ -0,0 +1,72 @@
|
||||
package dev.isxander.controlify.bindings;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.joystick.JoystickController;
|
||||
import dev.isxander.controlify.controller.joystick.JoystickState;
|
||||
import dev.isxander.controlify.gui.DrawSize;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class JoystickButtonBind implements IBind<JoystickState> {
|
||||
public static final String BIND_ID = "joystick_button";
|
||||
|
||||
private final JoystickController joystick;
|
||||
private final int buttonIndex;
|
||||
|
||||
public JoystickButtonBind(JoystickController joystick, int buttonIndex) {
|
||||
this.joystick = joystick;
|
||||
this.buttonIndex = buttonIndex;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float state(JoystickState state) {
|
||||
return state.buttons().get(buttonIndex) ? 1 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(PoseStack matrices, int x, int centerY, Controller<JoystickState, ?> controller) {
|
||||
var font = Minecraft.getInstance().font;
|
||||
|
||||
font.drawShadow(matrices, getTempButtonName(), x + 1.5f, centerY - font.lineHeight / 2f, 0xFFFFFF);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DrawSize drawSize() {
|
||||
var font = Minecraft.getInstance().font;
|
||||
return new DrawSize(font.width(getTempButtonName()) + 3, font.lineHeight);
|
||||
}
|
||||
|
||||
private Component getTempButtonName() {
|
||||
return joystick.mapping().button(buttonIndex).name();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject toJson() {
|
||||
JsonObject object = new JsonObject();
|
||||
object.addProperty("type", BIND_ID);
|
||||
object.addProperty("button", buttonIndex);
|
||||
return object;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
JoystickButtonBind that = (JoystickButtonBind) o;
|
||||
return buttonIndex == that.buttonIndex && joystick.uid().equals(that.joystick.uid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(buttonIndex, joystick.uid());
|
||||
}
|
||||
|
||||
public static JoystickButtonBind fromJson(JsonObject object, JoystickController joystick) {
|
||||
var buttonIndex = object.get("button").getAsInt();
|
||||
return new JoystickButtonBind(joystick, buttonIndex);
|
||||
}
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
package dev.isxander.controlify.bindings;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.joystick.JoystickController;
|
||||
import dev.isxander.controlify.controller.joystick.JoystickState;
|
||||
import dev.isxander.controlify.gui.DrawSize;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class JoystickHatBind implements IBind<JoystickState> {
|
||||
public static final String BIND_ID = "joystick_hat";
|
||||
|
||||
private final JoystickController joystick;
|
||||
private final int hatIndex;
|
||||
private final JoystickState.HatState hatState;
|
||||
|
||||
public JoystickHatBind(JoystickController joystick, int hatIndex, JoystickState.HatState hatState) {
|
||||
this.joystick = joystick;
|
||||
this.hatIndex = hatIndex;
|
||||
this.hatState = hatState;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float state(JoystickState state) {
|
||||
return state.hats().get(hatIndex) == hatState ? 1 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(PoseStack matrices, int x, int centerY, Controller<JoystickState, ?> controller) {
|
||||
var font = Minecraft.getInstance().font;
|
||||
font.drawShadow(matrices, getTempButtonName(), x + 1.5f, centerY - font.lineHeight / 2f, 0xFFFFFF);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DrawSize drawSize() {
|
||||
var font = Minecraft.getInstance().font;
|
||||
return new DrawSize(font.width(getTempButtonName()) + 3, font.lineHeight);
|
||||
}
|
||||
|
||||
private Component getTempButtonName() {
|
||||
return Component.empty()
|
||||
.append(joystick.mapping().hat(hatIndex).name())
|
||||
.append(" ")
|
||||
.append(hatState.getDisplayName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject toJson() {
|
||||
JsonObject object = new JsonObject();
|
||||
object.addProperty("type", BIND_ID);
|
||||
object.addProperty("hat", hatIndex);
|
||||
object.addProperty("state", hatState.name());
|
||||
return object;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
JoystickHatBind that = (JoystickHatBind) o;
|
||||
return hatIndex == that.hatIndex && hatState == that.hatState && joystick.uid().equals(that.joystick.uid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(hatIndex, hatState, joystick.uid());
|
||||
}
|
||||
|
||||
public static JoystickHatBind fromJson(JsonObject object, JoystickController joystick) {
|
||||
var hatIndex = object.get("hat").getAsInt();
|
||||
var hatState = JoystickState.HatState.valueOf(object.get("state").getAsString());
|
||||
return new JoystickHatBind(joystick, hatIndex, hatState);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user