package me.pascoej.ajario;
import me.pascoej.ajario.node.FoodNode;
import me.pascoej.ajario.node.Node;
import me.pascoej.ajario.node.PlayerNode;
import me.pascoej.ajario.node.VirusNode;
import me.pascoej.ajario.packet.clientbound.*;
import me.pascoej.ajario.packet.serverbound.*;
import me.pascoej.ajario.protocol.PacketListener;
import me.pascoej.ajario.protocol.Session;
import java.net.URI;
/**
* Created by john on 6/14/15.
*/
public class AgarClient implements PacketListener {
private final World world = new World();
private Session session;
private String nickname = "Scotty";
private double offsetX, offsetY;
public AgarClient() {
}
public void connect(URI uri) {
if (session != null && session.isReady()) {
session.close();
world.clearAll();
}
session = new Session(uri);
session.registerPacketListener(this);
session.connect();
}
public String getNickname() {
return nickname;
}
public void enterGame(String name) {
nickname = name;
session.sendPacket(new SetNickname(name));
}
public World getWorld() {
return world;
}
@Override
public void onRecvPacket(ClientBoundPacket agarPacket) {
//System.out.println(agarPacket.getType() + ":" + agarPacket);
switch (agarPacket.packetCType()) {
case UPDATE_NODES:
UpdateNodes updateNodes = (UpdateNodes) agarPacket;
handleUpdateNodes(updateNodes);
break;
case UPDATE_POSITION_SIZE:
UpdatePositionAndSize updatePositionAndSize = (UpdatePositionAndSize) agarPacket;
world.setCenterSize(updatePositionAndSize.getX(), updatePositionAndSize.getY(), updatePositionAndSize.getSize());
break;
case CLEAR_ALL_NODES:
world.clearAll();
break;
case ADD_NODE:
AddNode addNode = (AddNode) agarPacket;
int nodeId = addNode.getNodeId();
PlayerNode node = (PlayerNode) world.getNode(nodeId);
if (node == null) {
node = new PlayerNode(nodeId);
node.setMine();
world.addClientsNode(node);
}
break;
case UPDATE_LEADERBOARD:
UpdateLeaderBoard updateLeaderBoard = (UpdateLeaderBoard) agarPacket;
leaderBoard = updateLeaderBoard.getLeaderboardPositions();
break;
case SET_BORDER:
break;
}
}
private UpdateLeaderBoard.LeaderboardPosition[] leaderBoard = new UpdateLeaderBoard.LeaderboardPosition[0];
public UpdateLeaderBoard.LeaderboardPosition[] getLeaderBoard() {
return leaderBoard;
}
public void setMousePosition(double x, double y) {
double xOffset = x - world.getCenterX();
double yOffset = y - world.getCenterY();
this.offsetX = xOffset;
this.offsetY = yOffset;
//if (xOffset < 25 && yOffset < 25) {
// mag = 0;
// session.sendPacket(new MouseMove(world.getCenterX(), getWorld().getCenterY()));
//}else if (mag == 0){
// mag = 400;
//}
//if (yOffset == 0) {
// if (xOffset == 0) {
// mag = 0;
// }else if (xOffset > 0) {
// direction = 0;
// }else {
// direction = (float) Math.PI;
// }
//}
//float tan = (float) (yOffset/xOffset);
//direction = (float) Math.atan(tan);
//
//System.out.println(direction);
session.sendPacket(new MouseMove(x, y));
}
public void update() {
if (!session.isReady())
return;
//if (mag == 0) {
// return;
//}
//mag += 50;
//if (mag > 1000) {
// mag = 400;
//}
//double x = Math.cos(direction)*mag + world.getCenterX();
//double y = Math.sin(direction)*mag + world.getCenterY();
double x = offsetX + getWorld().getCenterX();
double y = offsetY + getWorld().getCenterY();
session.sendPacket(new MouseMove(x, y));
}
public void split() {
session.sendPacket(new Split());
}
public void ejectMass() {
session.sendPacket(new EjectMass());
}
public void joinGame() {
session.sendPacket(new SetNickname(nickname));
}
public void serverResetPacket() {
session.sendPacket(new ConnectionResetPacket());
}
public boolean isDead() {
return world.getClientNodes().isEmpty();
}
private static final int RECALCULATE_INTERVAL = 50;
private int updatePackets = 0;
private long lastUpdateNodeTime = System.currentTimeMillis();
private double updatePerSecond = 0;
public int getUpdatePerSecond() {
return (int) updatePerSecond;
}
private void handleUpdateNodes(UpdateNodes updateNodes) {
updatePackets += 1;
if (updatePackets >= RECALCULATE_INTERVAL) {
long currentTime = System.currentTimeMillis();
long elapsed = currentTime - lastUpdateNodeTime;
updatePerSecond = (double) updatePackets/((double)elapsed/1000.0);
}
for (UpdateNodes.NodeData nodeData : updateNodes.getNodeDataList()) {
int id = nodeData.getNodeId();
Node node = world.getNode(id);
if (node == null) {
if (nodeData.isVirus()) {
node = new VirusNode(id);
} else if (nodeData.getSize() < 20 && nodeData.getName().equals("")) {
node = new FoodNode(id);
} else {
node = new PlayerNode(id);
}
world.addNode(node);
}
node.updatePositionSize(nodeData.getX(), nodeData.getY(), nodeData.getSize());
if (!nodeData.getName().equals("")) {
if (node instanceof PlayerNode) {
((PlayerNode) node).setName(nodeData.getName());
} else {
System.out.println("VERY WRONG");
}
}
}
for (UpdateNodes.NodeEaten nodeEaten : updateNodes.getNodeEatens()) {
Node eaten = world.getNode(nodeEaten.getEatedId());
if (eaten == null) {
continue;
}
world.removeNode(eaten);
if (eaten instanceof PlayerNode && ((PlayerNode) eaten).isMine()) {
System.out.println("One of our cells got eaten");
if (world.getClientNodes().size() == 0) {
System.out.println("We are dead");
}
}
//System.out.println("removed" + eaten);
}
for (int id : updateNodes.getActiveNodeIds()) {
Node node = world.getNode(id);
if (node != null) {
world.removeNode(node);
//System.out.println("Node disappeared: " + node);
}
}
if (!world.getClientNodes().isEmpty()) {
double totalSize = world.getClientNodes().stream().mapToDouble(Node::getSize).sum();
double left = world.getClientNodes().stream().mapToDouble(Node::getX).min().getAsDouble();
double right = world.getClientNodes().stream().mapToDouble(Node::getX).max().getAsDouble();
double top = world.getClientNodes().stream().mapToDouble(Node::getY).max().getAsDouble();
double bottom = world.getClientNodes().stream().mapToDouble(Node::getY).min().getAsDouble();
double centerX = (right + left) / 2.0;
double centerY = (top + bottom) / 2.0;
world.setCenterSize(centerX, centerY, totalSize);
}
}
}