Some checks reported errors
		
		
	
	studiorailgun/Renderer/pipeline/head Something is wrong with the build of this commit
				
			
		
			
				
	
	
		
			281 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
package electrosphere.server.datacell;
 | 
						|
 | 
						|
import java.util.HashMap;
 | 
						|
import java.util.HashSet;
 | 
						|
import java.util.Map;
 | 
						|
import java.util.Set;
 | 
						|
import java.util.concurrent.locks.ReentrantLock;
 | 
						|
 | 
						|
import org.joml.Vector3d;
 | 
						|
 | 
						|
import electrosphere.collision.CollisionEngine;
 | 
						|
import electrosphere.collision.CollisionWorldData;
 | 
						|
import electrosphere.collision.hitbox.HitboxManager;
 | 
						|
import electrosphere.engine.Globals;
 | 
						|
import electrosphere.entity.Entity;
 | 
						|
import electrosphere.net.server.player.Player;
 | 
						|
import electrosphere.server.datacell.gridded.GriddedDataCellManager;
 | 
						|
import electrosphere.server.entity.ServerContentManager;
 | 
						|
import electrosphere.server.physics.chemistry.ServerChemistryCollisionCallback;
 | 
						|
import electrosphere.server.physics.collision.ServerHitboxResolutionCallback;
 | 
						|
import electrosphere.server.physics.fluid.simulator.FluidAcceleratedSimulator;
 | 
						|
 | 
						|
/**
 | 
						|
 * Manages all realms for the engine. Should be a singleton
 | 
						|
 */
 | 
						|
public class RealmManager {
 | 
						|
 | 
						|
    /**
 | 
						|
     * All realms in this manager
 | 
						|
     */
 | 
						|
    Set<Realm> realms = new HashSet<Realm>();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Map of entities to the realm the entity is in
 | 
						|
     */
 | 
						|
    Map<Entity,Realm> entityToRealmMap = new HashMap<Entity,Realm>();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Map of player to the realm the player is in
 | 
						|
     */
 | 
						|
    Map<Player,Realm> playerToRealmMap = new HashMap<Player,Realm>();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Lock for thread-safing the manager
 | 
						|
     */
 | 
						|
    ReentrantLock lock = new ReentrantLock();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Constructor
 | 
						|
     */
 | 
						|
    public RealmManager(){
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * Creates a realm
 | 
						|
     * @return The realm
 | 
						|
     */
 | 
						|
    public Realm createRealm(){
 | 
						|
        //create chemistry engine
 | 
						|
        CollisionEngine chemistryEngine = new CollisionEngine();
 | 
						|
        chemistryEngine.setCollisionResolutionCallback(new ServerChemistryCollisionCallback());
 | 
						|
        return new Realm(
 | 
						|
            new ServerWorldData(),
 | 
						|
            new CollisionEngine(),
 | 
						|
            chemistryEngine,
 | 
						|
            new HitboxManager(new ServerHitboxResolutionCallback()),
 | 
						|
            ServerContentManager.createServerContentManager(false, null),
 | 
						|
            null
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Creates a realm that uses a gridded layout (ie an array of cells in 3d space)
 | 
						|
     * @return The realm
 | 
						|
     */
 | 
						|
    public Realm createGriddedRealm(ServerWorldData serverWorldData, ServerContentManager serverContentManager){
 | 
						|
        //create collision engine
 | 
						|
        CollisionEngine collisionEngine = new CollisionEngine();
 | 
						|
        collisionEngine.setCollisionWorldData(new CollisionWorldData(serverWorldData));
 | 
						|
        //create chemistry engine
 | 
						|
        CollisionEngine chemistryEngine = new CollisionEngine();
 | 
						|
        chemistryEngine.setCollisionWorldData(new CollisionWorldData(serverWorldData));
 | 
						|
        chemistryEngine.setCollisionResolutionCallback(new ServerChemistryCollisionCallback());
 | 
						|
        //create realm
 | 
						|
        Realm realm = new Realm(
 | 
						|
            serverWorldData,
 | 
						|
            collisionEngine,
 | 
						|
            chemistryEngine,
 | 
						|
            new HitboxManager(new ServerHitboxResolutionCallback()),
 | 
						|
            serverContentManager,
 | 
						|
            serverContentManager.getMacroData()
 | 
						|
        );
 | 
						|
        //create function classes
 | 
						|
        GriddedDataCellManager griddedDataCellManager = new GriddedDataCellManager(realm);
 | 
						|
        //add function classes to realm
 | 
						|
        realm.setDataCellManager(griddedDataCellManager);
 | 
						|
        realm.setPathfindingManager(griddedDataCellManager);
 | 
						|
        //register within the manager
 | 
						|
        realms.add(realm);
 | 
						|
        return realm;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Creates a viewport realm
 | 
						|
     * @return The viewport realm
 | 
						|
     */
 | 
						|
    public Realm createViewportRealm(Vector3d minPoint, Vector3d maxPoint){
 | 
						|
        //create the server world data
 | 
						|
        ServerWorldData serverWorldData = ServerWorldData.createFixedWorldData(minPoint, maxPoint);
 | 
						|
 | 
						|
        //create collision engine
 | 
						|
        CollisionEngine collisionEngine = new CollisionEngine();
 | 
						|
        collisionEngine.setCollisionWorldData(new CollisionWorldData(serverWorldData));
 | 
						|
 | 
						|
        //create chemistry engine
 | 
						|
        CollisionEngine chemistryEngine = new CollisionEngine();
 | 
						|
        chemistryEngine.setCollisionWorldData(new CollisionWorldData(serverWorldData));
 | 
						|
        chemistryEngine.setCollisionResolutionCallback(new ServerChemistryCollisionCallback());
 | 
						|
 | 
						|
        //create realm
 | 
						|
        Realm realm = new Realm(
 | 
						|
            serverWorldData,
 | 
						|
            collisionEngine,
 | 
						|
            chemistryEngine,
 | 
						|
            new HitboxManager(new ServerHitboxResolutionCallback()),
 | 
						|
            ServerContentManager.createServerContentManager(false, null),
 | 
						|
            null
 | 
						|
        );
 | 
						|
 | 
						|
        //add function classes to realm
 | 
						|
        realm.setDataCellManager(ViewportDataCellManager.create(realm));
 | 
						|
 | 
						|
        //register
 | 
						|
        realms.add(realm);
 | 
						|
 | 
						|
        return realm;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Maps an entity to a realm
 | 
						|
     * @param entity The entity
 | 
						|
     * @param realm The realm
 | 
						|
     */
 | 
						|
    public void mapEntityToRealm(Entity entity, Realm realm){
 | 
						|
        lock.lock();
 | 
						|
        entityToRealmMap.put(entity, realm);
 | 
						|
        lock.unlock();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Removes the entity from tracking in this realm manager
 | 
						|
     * @param entity The entity to remove
 | 
						|
     */
 | 
						|
    public void removeEntity(Entity entity){
 | 
						|
        lock.lock();
 | 
						|
        entityToRealmMap.remove(entity);
 | 
						|
        lock.unlock();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the realm an entity is inside of
 | 
						|
     * @param entity The entity
 | 
						|
     * @return The realm, or null if the entity is not inside a realm
 | 
						|
     */
 | 
						|
    public Realm getEntityRealm(Entity entity){
 | 
						|
        lock.lock();
 | 
						|
        Realm rVal = entityToRealmMap.get(entity);
 | 
						|
        lock.unlock();
 | 
						|
        return rVal;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the set containing all realms in the manager
 | 
						|
     * @return The set containing all realms in the manager
 | 
						|
     */
 | 
						|
    public Set<Realm> getRealms(){
 | 
						|
        lock.lock();
 | 
						|
        Set<Realm> rVal = new HashSet<Realm>(realms);
 | 
						|
        lock.unlock();
 | 
						|
        return rVal;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * Simulates all realms in this manager
 | 
						|
     */
 | 
						|
    public void simulate(){
 | 
						|
        Globals.profiler.beginCpuSample("RealmManager.simulate");
 | 
						|
        Set<Realm> realms = this.getRealms();
 | 
						|
        for(Realm realm : realms){
 | 
						|
            realm.simulate();
 | 
						|
        }
 | 
						|
        Globals.profiler.endCpuSample();
 | 
						|
    }
 | 
						|
 | 
						|
    //TODO: !!URGENT!! come up with some mechanism to enforce this actually being called every time a player is added to a server data cell
 | 
						|
    /**
 | 
						|
     * Adds a player to a realm
 | 
						|
     * @param player The player
 | 
						|
     * @param realm The realm
 | 
						|
     */
 | 
						|
    public void setPlayerRealm(Player player, Realm realm){
 | 
						|
        lock.lock();
 | 
						|
        playerToRealmMap.put(player, realm);
 | 
						|
        lock.unlock();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the realm of a given player
 | 
						|
     * @param player The player
 | 
						|
     * @return The realm
 | 
						|
     */
 | 
						|
    public Realm getPlayerRealm(Player player){
 | 
						|
        lock.lock();
 | 
						|
        Realm rVal = playerToRealmMap.get(player);
 | 
						|
        lock.unlock();
 | 
						|
        return rVal;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Saves all cells in all realms in the realm manager
 | 
						|
     * @param saveName The name of the save
 | 
						|
     */
 | 
						|
    public void save(String saveName){
 | 
						|
        Set<Realm> realms = this.getRealms();
 | 
						|
        for(Realm realm : realms){
 | 
						|
            realm.save(saveName);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the first realm in the manager
 | 
						|
     * @return The first realm in the manager
 | 
						|
     */
 | 
						|
    public Realm first(){
 | 
						|
        if(realms.size() == 0){
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
        return realms.iterator().next();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Resets the realm manager
 | 
						|
     */
 | 
						|
    public void reset(){
 | 
						|
        for(Realm realm : this.realms){
 | 
						|
            if(realm.getServerWorldData() != null && realm.getServerWorldData().getServerTerrainManager() != null){
 | 
						|
                realm.getServerWorldData().getServerTerrainManager().closeThreads();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        for(Realm realm : this.realms){
 | 
						|
            if(
 | 
						|
                realm.getServerWorldData() != null &&
 | 
						|
                realm.getServerWorldData().getServerFluidManager() != null &&
 | 
						|
                realm.getServerWorldData().getServerFluidManager().getSimulator() != null &&
 | 
						|
                realm.getServerWorldData().getServerFluidManager().getSimulator() instanceof FluidAcceleratedSimulator
 | 
						|
            ){
 | 
						|
                FluidAcceleratedSimulator.cleanup();
 | 
						|
            }
 | 
						|
            if(realm.getServerWorldData() != null && realm.getServerWorldData().getServerTerrainManager() != null){
 | 
						|
                realm.getServerWorldData().getServerTerrainManager().closeThreads();
 | 
						|
            }
 | 
						|
            if(realm.getServerWorldData() != null && realm.getServerWorldData().getServerBlockManager() != null){
 | 
						|
                realm.getServerWorldData().getServerBlockManager().closeThreads();
 | 
						|
            }
 | 
						|
            if(realm.getDataCellManager() != null){
 | 
						|
                realm.getDataCellManager().halt();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        this.realms.clear();
 | 
						|
        lock.lock();
 | 
						|
        this.entityToRealmMap.clear();
 | 
						|
        this.playerToRealmMap.clear();
 | 
						|
        lock.unlock();
 | 
						|
    }
 | 
						|
 | 
						|
    
 | 
						|
}
 |