// Path: src/main/java/me/pascoej/ajario/node/Node.java
// public class Node {
//     private final int nodeId;
//     private final NodeType nodeType;
//     private long lastUpdate;
//     private short x, y, size;
//     double vX, vY;
// 
//     Node(int nodeId, NodeType nodeType) {
//         this.nodeId = nodeId;
//         this.nodeType = nodeType;
//     }
// 
//     List<Double> errors = new ArrayList<>();
// 
//     public void updatePositionSize(short x, short y, short size) {
//         long currentTime = System.currentTimeMillis();
//         this.x = x;
//         this.y = y;
//         this.size = size;
//         lastUpdate = currentTime;
//     }
// 
//     public NodeType getNodeType() {
//         return nodeType;
//     }
// 
//     public int getNodeId() {
//         return nodeId;
//     }
// 
//     public double getLastUpdate() {
//         return lastUpdate;
//     }
// 
//     public short getX() {
//         return x;
//     }
// 
//     public short getY() {
//         return y;
//     }
// 
//     public short getSize() {
//         return size;
//     }
// 
//     public double distanceSquared(Node node1) {
//         double xDiff = node1.getX() - this.getX();
//         double yDiff = node1.getY() - this.getY();
//         return (xDiff * xDiff) + (yDiff * yDiff);
//     }
// }
// 
// Path: src/main/java/me/pascoej/ajario/node/PlayerNode.java
// public class PlayerNode extends Node {
//     private String name;
//     private boolean mine;
// 
//     public PlayerNode(int nodeId) {
//         super(nodeId, NodeType.PLAYER);
//     }
// 
//     public String getName() {
//         if (name == null) {
//             return "";
//         }
//         return name;
//     }
// 
//     public boolean isMine() {
//         return mine;
//     }
// 
//     public void setMine() {
//         this.mine = true;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// }


import me.pascoej.ajario.node.Node;
import me.pascoej.ajario.node.PlayerNode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
package me.pascoej.ajario;



/**
 * Created by john on 6/14/15.
 */
public class World {
    private static final double WORLD_SIZE = 11180.339887498949;
    private final Map<Integer, Node> nodeById = new HashMap<>();
    private final List<Node> nodes = new CopyOnWriteArrayList<>();
    private final List<Node> clientNodes = new CopyOnWriteArrayList<>();
    private double centerX = WORLD_SIZE / 2;
    private double centerY = WORLD_SIZE / 2;
    private double totalSize = 0;
    private double scale = 1;

    public synchronized void addNode(Node node) {
        int id = node.getNodeId();
        if (nodeById.containsKey(id)) {
            removeNode(id);
        }
        nodeById.put(node.getNodeId(), node);
        nodes.add(node);
    }

    public void addClientsNode(Node node) {
        addNode(node);
        clientNodes.add(node);
    }

// Path: src/main/java/me/pascoej/ajario/node/Node.java
// public class Node {
//     private final int nodeId;
//     private final NodeType nodeType;
//     private long lastUpdate;
//     private short x, y, size;
//     double vX, vY;
// 
//     Node(int nodeId, NodeType nodeType) {
//         this.nodeId = nodeId;
//         this.nodeType = nodeType;
//     }
// 
//     List<Double> errors = new ArrayList<>();
// 
//     public void updatePositionSize(short x, short y, short size) {
//         long currentTime = System.currentTimeMillis();
//         this.x = x;
//         this.y = y;
//         this.size = size;
//         lastUpdate = currentTime;
//     }
// 
//     public NodeType getNodeType() {
//         return nodeType;
//     }
// 
//     public int getNodeId() {
//         return nodeId;
//     }
// 
//     public double getLastUpdate() {
//         return lastUpdate;
//     }
// 
//     public short getX() {
//         return x;
//     }
// 
//     public short getY() {
//         return y;
//     }
// 
//     public short getSize() {
//         return size;
//     }
// 
//     public double distanceSquared(Node node1) {
//         double xDiff = node1.getX() - this.getX();
//         double yDiff = node1.getY() - this.getY();
//         return (xDiff * xDiff) + (yDiff * yDiff);
//     }
// }
// 
// Path: src/main/java/me/pascoej/ajario/node/PlayerNode.java
// public class PlayerNode extends Node {
//     private String name;
//     private boolean mine;
// 
//     public PlayerNode(int nodeId) {
//         super(nodeId, NodeType.PLAYER);
//     }
// 
//     public String getName() {
//         if (name == null) {
//             return "";
//         }
//         return name;
//     }
// 
//     public boolean isMine() {
//         return mine;
//     }
// 
//     public void setMine() {
//         this.mine = true;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// }


// Path: src/main/java/me/pascoej/ajario/World.java
import me.pascoej.ajario.node.Node;
import me.pascoej.ajario.node.PlayerNode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;

package me.pascoej.ajario;



/**
 * Created by john on 6/14/15.
 */
public class World {
    private static final double WORLD_SIZE = 11180.339887498949;
    private final Map<Integer, Node> nodeById = new HashMap<>();
    private final List<Node> nodes = new CopyOnWriteArrayList<>();
    private final List<Node> clientNodes = new CopyOnWriteArrayList<>();
    private double centerX = WORLD_SIZE / 2;
    private double centerY = WORLD_SIZE / 2;
    private double totalSize = 0;
    private double scale = 1;

    public synchronized void addNode(Node node) {
        int id = node.getNodeId();
        if (nodeById.containsKey(id)) {
            removeNode(id);
        }
        nodeById.put(node.getNodeId(), node);
        nodes.add(node);
    }

    public void addClientsNode(Node node) {
        addNode(node);
        clientNodes.add(node);
    }

    public List<Node> getNodes() {