ProjectZombie/src/projectzombie/input/JoystickCallback.java

271 lines
6.4 KiB
Java
Executable File

package projectzombie.input;
import static projectzombie.input.GameInput.*;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWJoystickCallbackI;
import mainloop.task.IMainloopTask;
import projectzombie.Main;
import projectzombie.input.types.Input;
public class JoystickCallback implements GLFWJoystickCallbackI, IMainloopTask
{
public static final JoystickCallback JOYSTICK_CALLBACK = new JoystickCallback();
private ArrayList<Integer> connections = new ArrayList<Integer>();
@Override
public void invoke(int jid, int event)
{
// Gamepad connect
if(event == GLFW.GLFW_CONNECTED)
{
// Log the event and add the connection
System.out.println("Gamepad "+jid+" connected");
connections.add(jid);
}
// Gamepad disconnect
else if(event == GLFW.GLFW_DISCONNECTED)
{
// Log the event and remove the connection
System.out.println("Gamepad "+jid+" disconnected");
connections.remove((Object) jid);
}
}
public void init()
{
// Loop over all the gamepads
for(int i=0;i<=GLFW.GLFW_JOYSTICK_LAST;i++)
{
// Is this gamepad present; add the gamepad
if(GLFW.glfwJoystickPresent(i)) {
if(GLFW.glfwJoystickIsGamepad(i)) {
System.out.println("Gamepad "+i+" connected");
connections.add(i);
}
}
}
}
@Override
public boolean MainLoopDelay(long millis) {
return millis > Main.tickrate;
}
@Override
public boolean MainLoopRepeat() {
return true;
}
private float combineJoystickAxis(float a, float b)
{
if(b > 0.3 || b < -0.3) a += b;
return a;
}
@Override
public void MainLoopUpdate()
{
// Gamepad properties
float left_x = 0;
float left_y = 0;
float left_trigger = 0;
float right_x = 0;
float right_y = 0;
float right_trigger = 0;
boolean left_stick_button = false;
boolean right_stick_button = false;
boolean button_a = false;
boolean button_b = false;
boolean button_x = false;
boolean button_y = false;
boolean button_start = false;
boolean button_back = false;
boolean button_home = false;
boolean dpad_up = false;
boolean dpad_down = false;
boolean dpad_left = false;
boolean dpad_right = false;
boolean shoulder_left = false;
boolean shoulder_right = false;
int jid2 = 0;
try {
// Loop over all the connected gamepads
for(int jid : connections)
{
// Get all the axes
jid2 = jid;
FloatBuffer axes = GLFW.glfwGetJoystickAxes(jid);
// Store all the axes data
left_x = combineJoystickAxis(left_x, axes.get(0));
left_y = combineJoystickAxis(left_y, axes.get(1));
right_x = combineJoystickAxis(right_x, axes.get(3));
right_y = combineJoystickAxis(right_y, axes.get(4));
left_trigger = combineJoystickAxis(left_trigger, axes.get(2));
right_trigger = combineJoystickAxis(right_trigger, axes.get(5));
// Get all the buttons
ByteBuffer buttons = GLFW.glfwGetJoystickButtons(jid);
// Store all the button data
button_a = buttons.get(0) == 1 || button_a;
button_b = buttons.get(1) == 1 || button_b;
button_x = buttons.get(2) == 1 || button_x;
button_y = buttons.get(3) == 1 || button_y;
shoulder_left = buttons.get(4) == 1 || shoulder_left;
shoulder_right = buttons.get(5) == 1 || shoulder_right;
button_back = buttons.get(6) == 1 || button_back;
button_start = buttons.get(7) == 1 || button_start;
button_home = buttons.get(8) == 1 || button_home;
left_stick_button = buttons.get(9) == 1 || left_stick_button;
right_stick_button = buttons.get(10) == 1 || right_stick_button;
dpad_left = buttons.get(11) == 1 || dpad_left;
dpad_right = buttons.get(12) == 1 || dpad_right;
dpad_up = buttons.get(13) == 1 || dpad_up;
dpad_down = buttons.get(14) == 1 || dpad_down;
}
}
catch(Exception e) {
connections.remove((Object) jid2);
System.err.println("Removed controller "+jid2+" due to "+e.toString());
}
Input input = Main.menu.input;
// Is the left stick moved into a position (movement stick)
if((left_x > 0.3 || left_x < -0.3 || left_y > 0.3 || left_y < -0.3) && !moveUp && !moveDown)
{
// Get the the angle
double angle = Math.toDegrees(Math.atan2(left_y, left_x)) + 90;
input.move(true, angle);
move_last = true;
InputMode.Controller = true;
Main.window.setMouseVisibility(false);
}
// Set the players moving to false
else if(move_last && !moveUp && !moveDown) {
move_last = false;
input.move(false, 0);
}
// Is the right x axis stick moved into a position (camera stick)
if(right_x > 0.3 || right_x < -0.3) {
input.camera(true, right_x);
InputMode.Controller = true;
Main.window.setMouseVisibility(false);
}
// Gun trigger
if(right_trigger > 0.3) {
input.fire(true);
InputMode.Controller = true;
Main.window.setMouseVisibility(false);
}
// Item trigger
if(left_trigger > 0.3) {
InputMode.Controller = true;
Main.window.setMouseVisibility(false);
input.itemAction(true);
}
else {
activateItem_last = false;
}
if(shoulder_left) {
InputMode.Controller = true;
Main.window.setMouseVisibility(false);
if(!hotbar_l) {
hotbar_l = true;
input.hotbarShift(true, -1);
}
}
else if(hotbar_l) {
hotbar_l = false;
}
if(shoulder_right) {
InputMode.Controller = true;
Main.window.setMouseVisibility(false);
if(!hotbar_r) {
hotbar_r = true;
input.hotbarShift(true, 1);
}
}
else if(hotbar_r) {
hotbar_r = false;
}
// Activate button (A Button)
if(button_a) {
InputMode.Controller = true;
Main.window.setMouseVisibility(false);
if(!activate_last) {
input.activate(true);
activate_last = true;
}
}
else if(activate_last) {
activate_last = false;
input.activate(false);
}
// Drop item
if(button_b) {
InputMode.Controller = true;
Main.window.setMouseVisibility(false);
if(!dropItem_last) {
input.itemDrop(true);
dropItem_last = true;
}
}
else if(dropItem_last) {
dropItem_last = false;
}
// Back button
if(button_b) {
if(!backButton_last) {
input.back(true);
backButton_last = true;
}
}
else if(backButton_last) {
backButton_last = false;
}
// Pause the game
if(button_start) {
Main.window.setMouseVisibility(false);
InputMode.Controller = true;
if(!startButton_last) {
startButton_last = true;
input.pause(true);
}
}
else if(startButton_last) {
startButton_last = false;
}
}
}