package dev.isxander.controlify.bindings; import com.google.gson.JsonObject; import dev.isxander.controlify.controller.*; import dev.isxander.controlify.controller.gamepad.GamepadController; import dev.isxander.controlify.controller.joystick.SingleJoystickController; import dev.isxander.controlify.gui.DrawSize; import net.minecraft.client.gui.GuiGraphics; public interface IBind { float state(S state); default boolean held(S state) { return state(state) > controller().config().buttonActivationThreshold; } void draw(GuiGraphics graphics, int x, int centerY); DrawSize drawSize(); JsonObject toJson(); Controller controller(); @SuppressWarnings("unchecked") static IBind fromJson(JsonObject json, Controller controller) { var type = json.get("type").getAsString(); if (type.equals(EmptyBind.BIND_ID)) return new EmptyBind<>(); if (controller instanceof GamepadController gamepad && type.equals(GamepadBinds.BIND_ID)) { return GamepadBinds.fromJson(json).map(bind -> (IBind) bind.forGamepad(gamepad)).orElse(new EmptyBind<>()); } else if (controller instanceof SingleJoystickController joystick) { return (IBind) 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 -> throw new IllegalStateException("Unknown bind type for joystick: " + type); }; } throw new IllegalStateException("Unknown controller type: " + controller.getClass().getName()); } }