package com.austinv11.peripheralsplusplus.event.handler;
import com.austinv11.peripheralsplusplus.network.RobotEventPacket;
import com.austinv11.peripheralsplusplus.reference.Config;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.lang.reflect.Field;
import java.util.concurrent.CopyOnWriteArrayList;
public class RobotHandler {
private Robot robot;
public static CopyOnWriteArrayList<RobotOperation> operationList = new CopyOnWriteArrayList<RobotOperation>();
public RobotHandler() {
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
}
@SubscribeEvent
public void onClientTick(TickEvent.ClientTickEvent event) {
doOperations();
}
private void doOperations() {
for (RobotOperation operation : operationList) {
if (operation.isFinished()) {
operation.onFinish(robot);
operationList.remove(operation);
} else
operation.tick(robot);
}
}
public static abstract class RobotOperation {
private int ticker;
private int maxTick;
public RobotOperation() {
maxTick = ticker = Math.round((float)(Config.secondsBeforeReversal * 20));
}
public boolean isFinished() {
return ticker == 0;
}
public void tick(Robot robot) {
if (maxTick == ticker)
operate(robot);
if (ticker != 0)
ticker--;
}
public abstract void onFinish(Robot robot);
public abstract void operate(Robot robot);
}
public static class KeyBoardOperation extends RobotOperation {
public RobotEventPacket.PressType pressType;
public String key;
public KeyBoardOperation() {
super();
}
@Override
public void onFinish(Robot robot) {
if (pressType == RobotEventPacket.PressType.PRESS)
try {
robot.keyRelease(getKeyField().getInt(null));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public void operate(Robot robot) {
try {
robot.keyPress(getKeyField().getInt(null));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public Field getKeyField() {
try {
return KeyEvent.class.getField("VK_"+key.toUpperCase());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return null; //This shouldn't be reached
}
}
public static class MouseClickOperation extends RobotOperation {
public RobotEventPacket.PressType pressType;
public int button;
public MouseClickOperation() {
super();
}
@Override
public void onFinish(Robot robot) {
if (pressType == RobotEventPacket.PressType.PRESS)
robot.mouseRelease(button);
}
@Override
public void operate(Robot robot) {
robot.mousePress(button);
}
}
public static class MouseMoveOperation extends RobotOperation {
public int x,y;
public MouseMoveOperation() {
super();
}
@Override
public void onFinish(Robot robot) {
}
@Override
public void operate(Robot robot) {
robot.mouseMove(x, y);
}
}
}