diff --git a/client/scenes/in_world.cpp b/client/scenes/in_world.cpp index 5873de7..1e45649 100644 --- a/client/scenes/in_world.cpp +++ b/client/scenes/in_world.cpp @@ -73,10 +73,19 @@ InWorld::InWorld(int* const argClientIndex, int* const argAccountIndex): shutDownButton.SetText("Shut Down"); //load the tilesheet - //TODO: add the tilesheet to the map system? + //TODO: add the tilesheet to the map system //TODO: Tile size and tile sheet should be loaded elsewhere tileSheet.Load(config["dir.tilesets"] + "overworld.bmp", 32, 32); + //Send the character data + //TODO: login scene, prompt, etc. + CharacterPacket newPacket; + newPacket.type = SerialPacketType::CHARACTER_LOAD; + strncpy(newPacket.handle, config["client.handle"].c_str(), PACKET_STRING_SIZE); + strncpy(newPacket.avatar, config["client.avatar"].c_str(), PACKET_STRING_SIZE); + newPacket.accountIndex = accountIndex; + network.SendTo(Channels::SERVER, &newPacket); + //debug // } diff --git a/server/server_application.hpp b/server/server_application.hpp index 1f98437..4300c9b 100644 --- a/server/server_application.hpp +++ b/server/server_application.hpp @@ -92,9 +92,10 @@ private: void SaveServerState(); //character management -// void HandleCharacterNew(CharacterPacket* const); -// void HandleCharacterDelete(CharacterPacket* const); -// void HandleCharacterUpdate(CharacterPacket* const); + void HandleCharacterCreate(CharacterPacket* const); + void HandleCharacterDelete(CharacterPacket* const); + void HandleCharacterLoad(CharacterPacket* const); + void HandleCharacterUnload(CharacterPacket* const); //mismanagement // void HandleSynchronize(ClientPacket* const); diff --git a/server/server_logic.cpp b/server/server_logic.cpp index 794cc57..341a46c 100644 --- a/server/server_logic.cpp +++ b/server/server_logic.cpp @@ -274,6 +274,20 @@ void ServerApplication::HandlePacket(SerialPacket* const argPacket) { HandleRegionRequest(static_cast(argPacket)); break; + //character management + case SerialPacketType::CHARACTER_CREATE: + HandleCharacterCreate(static_cast(argPacket)); + break; + case SerialPacketType::CHARACTER_DELETE: + HandleCharacterDelete(static_cast(argPacket)); + break; + case SerialPacketType::CHARACTER_LOAD: + HandleCharacterLoad(static_cast(argPacket)); + break; + case SerialPacketType::CHARACTER_UNLOAD: + HandleCharacterUnload(static_cast(argPacket)); + break; + /* case SerialPacketType::QUERY_CHARACTER_EXISTS: // HandleCharacterStatsRequest(static_cast(argPacket)); @@ -288,20 +302,6 @@ void ServerApplication::HandlePacket(SerialPacket* const argPacket) { // HandleCharacterStatsRequest(static_cast(argPacket)); break; - //character management - case SerialPacketType::CHARACTER_CREATE: -// HandleCharacterNew(static_cast(argPacket)); - break; - case SerialPacketType::CHARACTER_DELETE: -// HandleCharacterDelete(static_cast(argPacket)); - break; - case SerialPacketType::CHARACTER_LOAD: -// HandleCharacterNew(static_cast(argPacket)); - break; - case SerialPacketType::CHARACTER_UNLOAD: -// HandleCharacterDelete(static_cast(argPacket)); - break; - //character movement case SerialPacketType::CHARACTER_SET_ROOM: // HandleCharacterUpdate(static_cast(argPacket)); diff --git a/server/server_methods.cpp b/server/server_methods.cpp index 863b0cf..cae9910 100644 --- a/server/server_methods.cpp +++ b/server/server_methods.cpp @@ -306,45 +306,70 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) { network.SendTo(argPacket->srcAddress, static_cast(&newPacket)); } -/* - //------------------------- //Character Management //------------------------- -//SET: entities -void ServerApplication::HandleCharacterNew(CharacterPacket* const argPacket) { - //NOTE: misnomer, try to load the character first - int characterIndex = characterMgr.Load(argPacket->accountIndex, argPacket->handle, argPacket->avatar); +void ServerApplication::HandleCharacterCreate(CharacterPacket* const argPacket) { + int characterIndex = characterMgr.Create(argPacket->accountIndex, argPacket->handle, argPacket->avatar); - //cannot load or create if (characterIndex < 0) { //build the error message std::ostringstream msg; - if (characterIndex == -1) { - msg << "Character already loaded: "; - } - else if (characterIndex == -2) { - msg << "Character already exists: "; - } - msg << argPacket->handle; + msg << "Character already exists: " << argPacket->handle; - //create, fill and send the packet + //build & send the packet TextPacket newPacket; newPacket.type = SerialPacketType::CHARACTER_REJECTION; - memset(newPacket.name, 0, PACKET_STRING_SIZE); strncpy(newPacket.text, msg.str().c_str(), PACKET_STRING_SIZE); network.SendTo(argPacket->srcAddress, static_cast(&newPacket)); + return; } - //send this new character to all clients + //send this character to the player CharacterPacket newPacket; newPacket.type = SerialPacketType::CHARACTER_CREATE; - CopyCharacterToPacket(&newPacket, characterIndex); - PumpPacket(&newPacket); + //TODO? } +void ServerApplication::HandleCharacterDelete(CharacterPacket* const argPacket) { + //TODO +} + +void ServerApplication::HandleCharacterLoad(CharacterPacket* const argPacket) { + int characterIndex = characterMgr.Load(argPacket->accountIndex, argPacket->handle, argPacket->avatar); + + if (characterIndex < 0) { + //build the error message + std::ostringstream msg; + if (characterIndex == -1) + msg << "Character already loaded: "; + if (characterIndex == -1) + msg << "Character name is taken: "; + msg << argPacket->handle; + + //build & send the packet + TextPacket newPacket; + newPacket.type = SerialPacketType::CHARACTER_REJECTION; + strncpy(newPacket.text, msg.str().c_str(), PACKET_STRING_SIZE); + network.SendTo(argPacket->srcAddress, static_cast(&newPacket)); + + return; + } + + //send this character to the player + CharacterPacket newPacket; + newPacket.type = SerialPacketType::CHARACTER_CREATE; + //TODO? +} + +void ServerApplication::HandleCharacterUnload(CharacterPacket* const argPacket) { + //TODO +} + +/* + //SET: entities void ServerApplication::HandleCharacterDelete(CharacterPacket* const argPacket) { //NOTE: Disconnecting only unloads a character, this explicitly deletes it