package me.pascoej.ajario; 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; /** * 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() { 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) { if (node == null) { return false; } if (node.isMine()) { return clientNodes.size() > 1; } for (Node node1 : nodes) { if (node1 == null) { continue; } if (node.getNodeId() != node1.getNodeId() && node1 instanceof PlayerNode && ((PlayerNode) node1).getName() != null && ((PlayerNode) node1).getName().equals(node.getName()) && node.distanceSquared(node1) < 750000) { return true; } } return false; } public void clearAll() { nodes.clear(); nodeById.clear(); clientNodes.clear(); } public void setCenterSize(double x, double y, double size) { this.centerX = x; this.centerY = y; this.totalSize = size; this.scale = Math.pow(Math.min(1.0, 64.0 / totalSize), 0.4); } public static double getWORLD_SIZE() { return WORLD_SIZE; } public Map<Integer, Node> getNodeById() { return nodeById; } public double getCenterX() { return centerX; } public double getCenterY() { return centerY; } public double getTotalSize() { return totalSize; } public double getScale() { return scale; } }