// 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;
    public void addClientsNode(Node node) {
        addNode(node);
        clientNodes.add(node);
    }

    public List<Node> getNodes() {
        return nodes;
    }

    public List<Node> getClientNodes() {
        return clientNodes;
    }

    public Node getNode(int id) {
        return nodeById.get(id);
    }

    public void removeNode(int id) {
        Node node = nodeById.get(id);
        removeNode(node);
    }

    public void removeNode(Node node) {
        nodes.remove(node);
        nodeById.remove(node.getNodeId());
        if (clientNodes.contains(node)) {
            clientNodes.remove(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;

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

    public List<Node> getNodes() {
        return nodes;
    }

    public List<Node> getClientNodes() {
        return clientNodes;
    }

    public Node getNode(int id) {
        return nodeById.get(id);
    }

    public void removeNode(int id) {
        Node node = nodeById.get(id);
        removeNode(node);
    }

    public void removeNode(Node node) {
        nodes.remove(node);
        nodeById.remove(node.getNodeId());
        if (clientNodes.contains(node)) {
            clientNodes.remove(node);
        }
    }

    public boolean isSplit(PlayerNode node) {