diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 4cf46c0c..0e88bcc8 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1705,6 +1705,7 @@ Move all character to database instead of macro data object Major work on CharacterService Move character utils classe to macro data Move CharacterService to service package +Convert character service to singleton diff --git a/src/main/java/electrosphere/engine/Globals.java b/src/main/java/electrosphere/engine/Globals.java index 22493a78..8c95dbf0 100644 --- a/src/main/java/electrosphere/engine/Globals.java +++ b/src/main/java/electrosphere/engine/Globals.java @@ -85,6 +85,7 @@ import electrosphere.server.datacell.RealmManager; import electrosphere.server.db.DatabaseController; import electrosphere.server.entity.poseactor.PoseModel; import electrosphere.server.saves.Save; +import electrosphere.server.service.CharacterService; import electrosphere.server.service.StructureScanningService; import electrosphere.server.simulation.MacroSimulation; import electrosphere.server.simulation.MicroSimulation; @@ -387,11 +388,10 @@ public class Globals { public static ElementService elementService; public static int openInventoriesCount = 0; - //file service + //services public static FileWatcherService fileWatcherService; - - //structure scanning service public static StructureScanningService structureScanningService; + public static CharacterService characterService; //collision world data public static CollisionWorldData commonWorldData; @@ -553,6 +553,7 @@ public class Globals { Globals.mainThreadSignalService = (MainThreadSignalService)serviceManager.registerService(new MainThreadSignalService()); Globals.fileWatcherService = (FileWatcherService)serviceManager.registerService(new FileWatcherService()); Globals.structureScanningService = (StructureScanningService)serviceManager.registerService(new StructureScanningService()); + Globals.characterService = (CharacterService)serviceManager.registerService(new CharacterService()); serviceManager.instantiate(); // //End service manager diff --git a/src/main/java/electrosphere/net/server/protocol/CharacterProtocol.java b/src/main/java/electrosphere/net/server/protocol/CharacterProtocol.java index fa300e4f..c8b4a0ba 100644 --- a/src/main/java/electrosphere/net/server/protocol/CharacterProtocol.java +++ b/src/main/java/electrosphere/net/server/protocol/CharacterProtocol.java @@ -29,7 +29,6 @@ import electrosphere.server.datacell.ServerWorldData; import electrosphere.server.entity.serialization.ContentSerialization; import electrosphere.server.macro.character.Character; import electrosphere.server.macro.character.PlayerCharacterCreation; -import electrosphere.server.service.CharacterService; import electrosphere.util.Utilities; /** @@ -47,7 +46,7 @@ public class CharacterProtocol implements ServerProtocolTemplatecharacters = CharacterService.getCharacters(connectionHandler.getPlayer().getDBID()).stream().map((Character chara) -> { + Listcharacters = Globals.characterService.getCharacters(connectionHandler.getPlayer().getDBID()).stream().map((Character chara) -> { CharacterDescriptionDTO dtoObj = new CharacterDescriptionDTO(); dtoObj.setId(chara.getId() + ""); dtoObj.setTemplate(chara.getCreatureTemplate()); @@ -70,7 +69,7 @@ public class CharacterProtocol implements ServerProtocolTemplate getCharacters(Vector3i worldPos){ List rVal = new LinkedList(); - for(Character character : CharacterService.getAllCharacters()){ + for(Character character : Globals.characterService.getAllCharacters()){ if(ServerWorldData.convertRealToChunkSpace(character.getPos()).equals(worldPos.x, worldPos.y, worldPos.z)){ rVal.add(character); } @@ -291,7 +290,7 @@ public class MacroData { * @return The character if it exists, null otherwise */ public Character getCharacter(int id){ - for(Character character : CharacterService.getAllCharacters()){ + for(Character character : Globals.characterService.getAllCharacters()){ if(character.getId() == id){ return character; } diff --git a/src/main/java/electrosphere/server/macro/character/CharacterUtils.java b/src/main/java/electrosphere/server/macro/character/CharacterUtils.java index 9702c1ba..74daa07e 100644 --- a/src/main/java/electrosphere/server/macro/character/CharacterUtils.java +++ b/src/main/java/electrosphere/server/macro/character/CharacterUtils.java @@ -2,13 +2,13 @@ package electrosphere.server.macro.character; import org.joml.Vector3d; +import electrosphere.engine.Globals; import electrosphere.server.datacell.Realm; import electrosphere.server.macro.character.data.CharacterDataStrings; import electrosphere.server.macro.character.diety.Diety; import electrosphere.server.macro.race.Race; import electrosphere.server.macro.structure.Structure; import electrosphere.server.macro.town.Town; -import electrosphere.server.service.CharacterService; /** * Utility functions for dealing with characters @@ -55,7 +55,7 @@ public class CharacterUtils { * @return The character */ public static Character spawnCharacter(Realm realm, Vector3d position){ - Character rVal = CharacterService.createCharacter(null, 0); + Character rVal = Globals.characterService.createCharacter(null, 0); rVal.setPos(position); Race.setRace(rVal, Race.create("human", "human")); realm.getDataCellManager().evaluateMacroObject(rVal); diff --git a/src/main/java/electrosphere/server/macro/character/PlayerCharacterCreation.java b/src/main/java/electrosphere/server/macro/character/PlayerCharacterCreation.java index 7250a03a..831cd31f 100644 --- a/src/main/java/electrosphere/server/macro/character/PlayerCharacterCreation.java +++ b/src/main/java/electrosphere/server/macro/character/PlayerCharacterCreation.java @@ -15,7 +15,6 @@ import electrosphere.net.server.player.Player; import electrosphere.net.server.protocol.CharacterProtocol; import electrosphere.server.datacell.Realm; import electrosphere.server.datacell.ServerWorldData; -import electrosphere.server.service.CharacterService; /** * Deals with spawning player characters @@ -32,7 +31,7 @@ public class PlayerCharacterCreation { // //get template - Character charaData = CharacterService.getCharacter(connectionHandler.getPlayer().getDBID(), connectionHandler.getCharacterId()); + Character charaData = Globals.characterService.getCharacter(connectionHandler.getPlayer().getDBID(), connectionHandler.getCharacterId()); CreatureTemplate template = charaData.getCreatureTemplate(); if(connectionHandler.getCharacterId() == CharacterProtocol.SPAWN_EXISTING_TEMPLATE){ template = connectionHandler.getCurrentCreatureTemplate(); @@ -91,7 +90,7 @@ public class PlayerCharacterCreation { */ static void addPlayerServerBTrees(Entity entity, ServerConnectionHandler serverConnectionHandler){ ServerPlayerViewDirTree.attachServerPlayerViewDirTree(entity); - ServerCharacterData.attachServerCharacterData(entity, CharacterService.getCharacter(serverConnectionHandler.getPlayer().getDBID(), serverConnectionHandler.getCharacterId())); + ServerCharacterData.attachServerCharacterData(entity, Globals.characterService.getCharacter(serverConnectionHandler.getPlayer().getDBID(), serverConnectionHandler.getCharacterId())); } /** @@ -101,7 +100,7 @@ public class PlayerCharacterCreation { * @return The spawn point for the player */ public static Vector3d solveSpawnPoint(Realm realm, ServerConnectionHandler connectionHandler){ - Vector3d spawnPoint = CharacterService.getCharacter(connectionHandler.getPlayer().getDBID(), connectionHandler.getCharacterId()).getPos(); + Vector3d spawnPoint = Globals.characterService.getCharacter(connectionHandler.getPlayer().getDBID(), connectionHandler.getCharacterId()).getPos(); if(spawnPoint == null){ spawnPoint = realm.getSpawnPoint(); } diff --git a/src/main/java/electrosphere/server/service/CharacterService.java b/src/main/java/electrosphere/server/service/CharacterService.java index 087e2229..31417489 100644 --- a/src/main/java/electrosphere/server/service/CharacterService.java +++ b/src/main/java/electrosphere/server/service/CharacterService.java @@ -9,6 +9,8 @@ import java.util.concurrent.locks.ReentrantLock; import com.google.gson.Gson; import electrosphere.engine.Globals; +import electrosphere.engine.signal.Signal.SignalType; +import electrosphere.engine.signal.SignalServiceImpl; import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; import electrosphere.entity.state.server.ServerCharacterData; @@ -23,24 +25,31 @@ import electrosphere.util.SerializationUtils; /** * Service for interacting with macro-level characters */ -public class CharacterService { +public class CharacterService extends SignalServiceImpl { /** * Map that stores the characters currently loaded into memory */ - static Map loadedCharacterMap = new HashMap(); + Map loadedCharacterMap = new HashMap(); /** * Lock for thread-safe-ing the service */ - static ReentrantLock lock = new ReentrantLock(); + ReentrantLock lock = new ReentrantLock(); + + /** + * Constructor + */ + public CharacterService(){ + super("CharacterService", new SignalType[]{}); + } /** * Creates a character in the database * @param template The creature template for the character * @param playerId The player's id */ - public static Character createCharacter(CreatureTemplate template, int playerId){ + public Character createCharacter(CreatureTemplate template, int playerId){ lock.lock(); Character toStore = new Character(template); DatabaseResult result = Globals.dbController.executePreparedQuery( @@ -65,7 +74,7 @@ public class CharacterService { * @param characterId The character's id * @return The character if it exists, null otherwise */ - public static Character getCharacter(int playerId, int characterId){ + public Character getCharacter(int playerId, int characterId){ lock.lock(); if(loadedCharacterMap.containsKey(characterId)){ Character rVal = loadedCharacterMap.get(characterId); @@ -93,7 +102,7 @@ public class CharacterService { * @param playerId The player's id * @return The list of characters that player has */ - public static List getCharacters(int playerId){ + public List getCharacters(int playerId){ lock.lock(); DatabaseResult result = Globals.dbController.executePreparedQuery("SELECT id, dataVal FROM charaData WHERE playerId=?;",playerId); List rVal = new LinkedList(); @@ -119,7 +128,7 @@ public class CharacterService { * Saves a character from an entity * @param characterEntity The entity */ - public static void saveCharacter(Entity characterEntity){ + public void saveCharacter(Entity characterEntity){ lock.lock(); if(!ServerCharacterData.hasServerCharacterDataTree(characterEntity)){ throw new Error("Trying to save entity hat does not contain character data!"); @@ -145,7 +154,7 @@ public class CharacterService { * Gets all characters * @return The list of all characters */ - public static List getAllCharacters(){ + public List getAllCharacters(){ lock.lock(); DatabaseResult result = Globals.dbController.executePreparedQuery("SELECT id, dataVal FROM charaData"); List rVal = new LinkedList();