package com.jenjinstudios.demo.client.ui;
import com.jenjinstudios.core.io.Message;
import com.jenjinstudios.core.io.MessageRegistry;
import com.jenjinstudios.world.Actor;
import com.jenjinstudios.world.client.WorldClient;
import com.jenjinstudios.world.math.Angle;
import javafx.event.EventHandler;
import javafx.scene.input.KeyEvent;
import static com.jenjinstudios.demo.client.ui.PlayerKeyFlags.isFireKey;
import static com.jenjinstudios.demo.client.ui.PlayerKeyFlags.isMovementKey;
import static com.jenjinstudios.world.math.Angle.*;
/**
* @author Caleb Brinkman
*/
public class PlayerControlKeyHandler implements EventHandler<KeyEvent>
{
private final WorldClient worldClient;
private final Actor clientPlayer;
private final PlayerKeyFlags flags;
public PlayerControlKeyHandler(WorldClient worldClient) {
this.worldClient = worldClient;
this.clientPlayer = worldClient.getPlayer();
this.flags = new PlayerKeyFlags();
}
@Override
public void handle(KeyEvent keyEvent) {
if (isMovementKey(keyEvent))
{
flags.setKeyFlags(keyEvent);
setNewAngle();
} else if (isFireKey(keyEvent))
{
sendFireRequest();
}
keyEvent.consume();
}
protected Angle getMoveAngle(Angle angle) {
if (flags.upKey())
{
double absAngle;
if (flags.rightKey())
{
absAngle = flags.leftKey() ? BACK_LEFT : FRONT_LEFT;
} else
{
absAngle = flags.leftKey() ? BACK_LEFT : LEFT;
}
angle = new Angle(absAngle, FRONT);
} else if (flags.downKey())
{
double absAngle;
if (flags.leftKey())
{
absAngle = BACK_RIGHT;
} else
{
absAngle = (flags.rightKey() ? FRONT_RIGHT : RIGHT);
}
angle = new Angle(absAngle, FRONT);
} else if (flags.leftKey())
{
angle = new Angle(BACK, FRONT);
} else if (flags.rightKey())
{
angle = new Angle(FRONT, FRONT);
}
return angle;
}
private void sendFireRequest() {
Message message = MessageRegistry.getInstance().createMessage("FireRequest");
worldClient.getMessageIO().queueOutgoingMessage(message);
}
private void setNewAngle() {
Angle angle = clientPlayer.getAngle().asIdle();
angle = getMoveAngle(angle);
clientPlayer.setAngle(angle);
}
}