diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 9b4fb4bb..064db2be 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1954,6 +1954,7 @@ Block chunks properly stride Work on rotating structures Towns spawn a population of characters when they are max-res'd Hitbox synchronization work +LOD emitter service diff --git a/src/main/java/electrosphere/entity/ServerEntityUtils.java b/src/main/java/electrosphere/entity/ServerEntityUtils.java index 45fce6a6..8559aacc 100644 --- a/src/main/java/electrosphere/entity/ServerEntityUtils.java +++ b/src/main/java/electrosphere/entity/ServerEntityUtils.java @@ -176,6 +176,7 @@ public class ServerEntityUtils { if(ServerCharacterData.hasServerCharacterDataTree(entity)){ Globals.serverState.characterService.removeEntity(ServerCharacterData.getServerCharacterData(entity).getCharacterData()); } + Globals.serverState.lodEmitterService.deregisterLODEmitter(entity); // //Stop inventory watching diff --git a/src/main/java/electrosphere/server/ServerState.java b/src/main/java/electrosphere/server/ServerState.java index 47863612..ac4ea7f4 100644 --- a/src/main/java/electrosphere/server/ServerState.java +++ b/src/main/java/electrosphere/server/ServerState.java @@ -11,6 +11,7 @@ import electrosphere.server.datacell.RealmManager; import electrosphere.server.db.DatabaseController; import electrosphere.server.saves.Save; import electrosphere.server.service.CharacterService; +import electrosphere.server.service.LODEmitterService; import electrosphere.server.service.StructureScanningService; import electrosphere.server.simulation.MicroSimulation; @@ -59,6 +60,11 @@ public class ServerState { */ public final StructureScanningService structureScanningService; + /** + * The lod emitter service + */ + public final LODEmitterService lodEmitterService; + /** * behavior tree tracking service */ @@ -85,6 +91,7 @@ public class ServerState { public ServerState(){ this.characterService = (CharacterService)Globals.engineState.serviceManager.registerService(new CharacterService()); this.structureScanningService = (StructureScanningService)Globals.engineState.serviceManager.registerService(new StructureScanningService()); + this.lodEmitterService = (LODEmitterService)Globals.engineState.serviceManager.registerService(new LODEmitterService()); } } diff --git a/src/main/java/electrosphere/server/macro/character/PlayerCharacterCreation.java b/src/main/java/electrosphere/server/macro/character/PlayerCharacterCreation.java index 16cb2feb..0894531f 100644 --- a/src/main/java/electrosphere/server/macro/character/PlayerCharacterCreation.java +++ b/src/main/java/electrosphere/server/macro/character/PlayerCharacterCreation.java @@ -100,6 +100,7 @@ public class PlayerCharacterCreation { static void addPlayerServerBTrees(Entity entity, ServerConnectionHandler serverConnectionHandler){ ServerPlayerViewDirTree.attachServerPlayerViewDirTree(entity); ServerCharacterData.attachServerCharacterData(entity, Globals.serverState.characterService.getCharacter(serverConnectionHandler.getCharacterId())); + Globals.serverState.lodEmitterService.registerLODEmitter(entity); } /** diff --git a/src/main/java/electrosphere/server/service/LODEmitterService.java b/src/main/java/electrosphere/server/service/LODEmitterService.java new file mode 100644 index 00000000..6fba9ef8 --- /dev/null +++ b/src/main/java/electrosphere/server/service/LODEmitterService.java @@ -0,0 +1,66 @@ +package electrosphere.server.service; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; + +import electrosphere.engine.signal.Signal.SignalType; +import electrosphere.engine.signal.SignalServiceImpl; +import electrosphere.entity.Entity; + +/** + * Manages lod emitters + */ +public class LODEmitterService extends SignalServiceImpl { + + /** + * The set of LOD emitters + */ + private List emitters = new LinkedList(); + + /** + * Lock for thread-safeing the service + */ + private ReentrantLock lock = new ReentrantLock(); + + /** + * Creates the LOD emitter service + */ + public LODEmitterService() { + super("LODEmitterService", new SignalType[]{ + }); + } + + /** + * Gets the list of LOD emitters + * @return The list of LOD emitters + */ + public List getEmitters(){ + lock.lock(); + List rVal = Collections.unmodifiableList(this.emitters); + lock.unlock(); + return rVal; + } + + /** + * Registers a LOD emitter + * @param entity The entity + */ + public void registerLODEmitter(Entity entity){ + lock.lock(); + this.emitters.add(entity); + lock.unlock(); + } + + /** + * Deregisters a LOD emitter + * @param entity The entity + */ + public void deregisterLODEmitter(Entity entity){ + lock.lock(); + this.emitters.remove(entity); + lock.unlock(); + } + +}