package dev.isxander.controlify.controller; import com.google.gson.Gson; import com.google.gson.JsonElement; import dev.isxander.controlify.bindings.ControllerBindings; import dev.isxander.controlify.controller.gamepad.GamepadController; import dev.isxander.controlify.controller.hid.ControllerHIDService; import dev.isxander.controlify.controller.joystick.SingleJoystickController; import dev.isxander.controlify.debug.DebugProperties; import dev.isxander.controlify.rumble.RumbleCapable; import dev.isxander.controlify.rumble.RumbleManager; import dev.isxander.controlify.rumble.RumbleSource; import org.lwjgl.glfw.GLFW; import java.util.HashMap; import java.util.Map; import java.util.Optional; public interface Controller { String uid(); int joystickId(); ControllerBindings bindings(); S state(); S prevState(); C config(); C defaultConfig(); void resetConfig(); void setConfig(Gson gson, JsonElement json); ControllerType type(); String name(); void updateState(); void clearState(); RumbleManager rumbleManager(); default boolean canBeUsed() { return true; } default void close() { } Map> CONTROLLERS = new HashMap<>(); static Controller createOrGet(int joystickId, ControllerHIDService.ControllerHIDInfo hidInfo) { Optional uid = hidInfo.createControllerUID(); if (uid.isPresent() && CONTROLLERS.containsKey(uid.get())) { return CONTROLLERS.get(uid.get()); } if (GLFW.glfwJoystickIsGamepad(joystickId) && !DebugProperties.FORCE_JOYSTICK) { GamepadController controller = new GamepadController(joystickId, hidInfo); CONTROLLERS.put(controller.uid(), controller); return controller; } SingleJoystickController controller = new SingleJoystickController(joystickId, hidInfo); CONTROLLERS.put(controller.uid(), controller); return controller; } static void remove(Controller controller) { CONTROLLERS.remove(controller.uid(), controller); controller.close(); } Controller DUMMY = new Controller<>() { private final ControllerBindings bindings = new ControllerBindings<>(this); private final RumbleManager rumbleManager = new RumbleManager(new RumbleCapable() { @Override public boolean setRumble(float strongMagnitude, float weakMagnitude, RumbleSource source) { return false; } @Override public boolean canRumble() { return false; } }); private final ControllerConfig config = new ControllerConfig() { @Override public void setDeadzone(int axis, float deadzone) { } @Override public float getDeadzone(int axis) { return 0; } }; @Override public String uid() { return "NONE"; } @Override public int joystickId() { return -1; } @Override public ControllerBindings bindings() { return bindings; } @Override public ControllerConfig config() { return config; } @Override public ControllerConfig defaultConfig() { return config; } @Override public void resetConfig() { } @Override public void setConfig(Gson gson, JsonElement json) { } @Override public ControllerType type() { return ControllerType.UNKNOWN; } @Override public String name() { return "DUMMY"; } @Override public ControllerState state() { return ControllerState.EMPTY; } @Override public ControllerState prevState() { return ControllerState.EMPTY; } @Override public void updateState() { } @Override public void clearState() { } @Override public RumbleManager rumbleManager() { return rumbleManager; } }; }