package electrosphere.game.server.datacell; import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; import electrosphere.game.collision.CommonWorldData; import electrosphere.game.server.world.ServerWorldData; import electrosphere.logger.LoggerInterface; import electrosphere.main.Globals; import electrosphere.net.parser.net.message.NetworkMessage; import electrosphere.net.server.Player; import java.util.LinkedList; import java.util.List; import org.joml.Vector3d; import org.joml.Vector3f; /** * * @author satellite */ public class DataCellManager { List loadedDataCells = new LinkedList(); ServerDataCell[][] dataCells; int discreteWorldSize; List playerList = new LinkedList(); public DataCellManager(ServerWorldData data) { discreteWorldSize = data.getWorldSizeDiscrete(); dataCells = new ServerDataCell[discreteWorldSize][discreteWorldSize]; } public void addPlayer(Player player){ playerList.add(player); int playerSimulationRadius = player.getSimulationRadius(); int oldX = player.getWorldX(); int oldY = player.getWorldY(); for(int x = oldX - playerSimulationRadius; x < oldX + playerSimulationRadius + 1; x++){ for(int y = oldY - playerSimulationRadius; y < oldY + playerSimulationRadius + 1; y++){ if( x >= 0 && x < discreteWorldSize && y >= 0 && y < discreteWorldSize ){ LoggerInterface.loggerEngine.DEBUG("DataCellManager: Add player to " + x + " " + y); if(dataCells[x][y] != null){ dataCells[x][y].addPlayer(player); } else { //create data cell dataCells[x][y] = ServerDataCell.loadCellAtWorldCoord(x, y); //add player dataCells[x][y].addPlayer(player); } } } } } public void movePlayer(Player player, int newX, int newY){ int playerSimulationRadius = player.getSimulationRadius(); int oldX = player.getWorldX(); int oldY = player.getWorldY(); player.setWorldX(newX); player.setWorldY(newY); // System.out.println("=======" + "SET" + newX + " " + newY + " FROM " + oldX + " " + oldY + "========"); // int removals = 0; // int additions = 0; for(int x = oldX - playerSimulationRadius; x < oldX + playerSimulationRadius + 1; x++){ for(int y = oldY - playerSimulationRadius; y < oldY + playerSimulationRadius + 1; y++){ if( x >= 0 && x < discreteWorldSize && y >= 0 && y < discreteWorldSize && (x < newX - playerSimulationRadius || x > newX + playerSimulationRadius || y < newY - playerSimulationRadius || y > newY + playerSimulationRadius) ){ if(dataCells[x][y] != null){ if(dataCells[x][y].containsPlayer(player)){ // removals++; dataCells[x][y].removePlayer(player); } } } } } for(int x = newX - playerSimulationRadius; x < newX + playerSimulationRadius + 1; x++){ for(int y = newY - playerSimulationRadius; y < newY + playerSimulationRadius + 1; y++){ if( x >= 0 && x < discreteWorldSize && y >= 0 && y < discreteWorldSize && (x < oldX - playerSimulationRadius || x > oldX + playerSimulationRadius || y < oldY - playerSimulationRadius || y > oldY + playerSimulationRadius) ){ // System.out.println("Add player to " + x + " " + y); if(dataCells[x][y] != null){ dataCells[x][y].addPlayer(player); } else { //create data cell dataCells[x][y] = ServerDataCell.loadCellAtWorldCoord(x, y); //add player dataCells[x][y].addPlayer(player); } // additions++; } else { // System.out.println(x + "\t" + (oldX - playerSimulationRadius) + "\t" + (oldX + playerSimulationRadius)); // System.out.println(y + "\t" + (oldY - playerSimulationRadius) + "\t" + (oldY + playerSimulationRadius)); } } } // System.out.println("removals: " + removals + "\tadditions: " + additions); } public void removePlayer(Player player){ throw new UnsupportedOperationException("Removing players from the data cell manager isn't supported -- DataCellManager -- removePlayer(Player player)"); } public boolean updatePlayerPositions(){ boolean playerChangedChunk = false; for(Player player : playerList){ Entity playerEntity = player.getPlayerEntity(); if(playerEntity != null){ Vector3d position = EntityUtils.getPosition(playerEntity); int currentWorldX = Globals.serverWorldData.convertRealToChunkSpace(position.x); int currentWorldY = Globals.serverWorldData.convertRealToChunkSpace(position.z); if(currentWorldX != player.getWorldX() || currentWorldY != player.getWorldY()){ movePlayer(player,currentWorldX,currentWorldY); playerChangedChunk = true; } } } return playerChangedChunk; } public void sendNetworkMessageToChunk(NetworkMessage message, int worldX, int worldY){ if( //in bounds of array worldX >= 0 && worldX < dataCells.length && worldY >= 0 && worldY < dataCells[0].length && //isn't null dataCells[worldX][worldY] != null ){ dataCells[worldX][worldY].broadcastNetworkMessage(message); } } public void unloadPlayerlessChunks(){ } }