character service singleton
Some checks reported errors
studiorailgun/Renderer/pipeline/head Something is wrong with the build of this commit

This commit is contained in:
austin 2025-05-10 16:34:52 -04:00
parent b320bc3e06
commit bc2ecadf64
8 changed files with 33 additions and 26 deletions

View File

@ -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

View File

@ -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

View File

@ -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 ServerProtocolTemplate<CharacterMessag
switch(message.getMessageSubtype()){
case REQUESTCHARACTERLIST: {
Gson gson = new Gson();
List<CharacterDescriptionDTO>characters = CharacterService.getCharacters(connectionHandler.getPlayer().getDBID()).stream().map((Character chara) -> {
List<CharacterDescriptionDTO>characters = 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<CharacterMessag
case REQUESTCREATECHARACTER: {
CreatureTemplate template = Utilities.deserialize(message.getdata(), CreatureTemplate.class);
if(template != null){
Character charaData = CharacterService.createCharacter(template, connectionHandler.getPlayer().getDBID());
Character charaData = Globals.characterService.createCharacter(template, connectionHandler.getPlayer().getDBID());
charaData.setPos(Globals.realmManager.first().getSpawnPoint());
connectionHandler.setCreatureTemplate(Utilities.deserialize(message.getdata(), CreatureTemplate.class));
connectionHandler.setCharacterId(charaData.getId());

View File

@ -13,7 +13,6 @@ import electrosphere.server.datacell.ServerDataCell;
import electrosphere.server.entity.serialization.ContentSerialization;
import electrosphere.server.macro.MacroData;
import electrosphere.server.saves.SaveUtils;
import electrosphere.server.service.CharacterService;
import electrosphere.util.FileUtils;
import electrosphere.util.math.HashUtils;
import electrosphere.server.macro.character.Character;
@ -106,7 +105,7 @@ public class ServerContentManager {
//store all character entities in database
for(Entity entity : entities){
if(ServerCharacterData.hasServerCharacterDataTree(entity)){
CharacterService.saveCharacter(entity);
Globals.characterService.saveCharacter(entity);
}
}
}

View File

@ -17,7 +17,6 @@ import electrosphere.server.macro.spatial.MacroAreaObject;
import electrosphere.server.macro.structure.Structure;
import electrosphere.server.macro.symbolism.Symbol;
import electrosphere.server.macro.town.Town;
import electrosphere.server.service.CharacterService;
import electrosphere.util.FileUtils;
import java.util.Random;
@ -246,7 +245,7 @@ public class MacroData {
LoggerInterface.loggerEngine.WARNING(race.getName());
int numCharsOfRace = 0;
//n*m complexity - yikes! - as long as we're not making a million chars at start this should be _ok_
for(Character chara : CharacterService.getAllCharacters()){
for(Character chara : Globals.characterService.getAllCharacters()){
if(chara.containsKey(CharacterDataStrings.RACE)){
if(Race.getRace(chara).equals(race)){
numCharsOfRace++;
@ -267,7 +266,7 @@ public class MacroData {
*/
public List<Character> getCharacters(Vector3i worldPos){
List<Character> rVal = new LinkedList<Character>();
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;
}

View File

@ -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);

View File

@ -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();
}

View File

@ -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<Integer,Character> loadedCharacterMap = new HashMap<Integer,Character>();
Map<Integer,Character> loadedCharacterMap = new HashMap<Integer,Character>();
/**
* 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<Character> getCharacters(int playerId){
public List<Character> getCharacters(int playerId){
lock.lock();
DatabaseResult result = Globals.dbController.executePreparedQuery("SELECT id, dataVal FROM charaData WHERE playerId=?;",playerId);
List<Character> rVal = new LinkedList<Character>();
@ -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<Character> getAllCharacters(){
public List<Character> getAllCharacters(){
lock.lock();
DatabaseResult result = Globals.dbController.executePreparedQuery("SELECT id, dataVal FROM charaData");
List<Character> rVal = new LinkedList<Character>();