diff --git a/client/scenes/in_world.cpp b/client/scenes/in_world.cpp index 1e45649..43db4eb 100644 --- a/client/scenes/in_world.cpp +++ b/client/scenes/in_world.cpp @@ -243,6 +243,14 @@ void InWorld::HandlePacket(SerialPacket* const argPacket) { HandleRegionContent(static_cast(argPacket)); break; + //character management + case SerialPacketType::CHARACTER_CREATE: + HandleCharacterCreate(static_cast(argPacket)); + break; + case SerialPacketType::CHARACTER_DELETE: + HandleCharacterDelete(static_cast(argPacket)); + break; + //rejection messages case SerialPacketType::REGION_REJECTION: case SerialPacketType::CHARACTER_REJECTION: @@ -377,3 +385,13 @@ void InWorld::UpdateMap() { } } } + +void InWorld::HandleCharacterCreate(CharacterPacket* const argPacket) { + //TODO: HandleCharacterCreate() + std::cout << "HandleCharacterCreate" << std::endl; +} + +void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) { + //TODO: HandleCharacterDelete() + std::cout << "HandleCharacterDelete" << std::endl; +} \ No newline at end of file diff --git a/client/scenes/in_world.hpp b/client/scenes/in_world.hpp index 1c7c58c..5e2ae31 100644 --- a/client/scenes/in_world.hpp +++ b/client/scenes/in_world.hpp @@ -91,6 +91,10 @@ protected: void HandleRegionContent(RegionPacket* const); void UpdateMap(); + //character management + void HandleCharacterCreate(CharacterPacket* const); + void HandleCharacterDelete(CharacterPacket* const); + //indexes int& clientIndex; int& accountIndex; diff --git a/server/server_application.hpp b/server/server_application.hpp index 723899b..ee93dfb 100644 --- a/server/server_application.hpp +++ b/server/server_application.hpp @@ -104,11 +104,7 @@ private: //utility methods void PumpPacket(SerialPacket* const); void PumpPacketProximity(SerialPacket* const, int roomIndex, int x, int y, int radius); - - //utility methods -// void CleanupLostConnection(int index); -// void PumpCharacterUnload(int uid); -// void CopyCharacterToPacket(CharacterPacket* const packet, int characterIndex); + void CopyCharacterToPacket(CharacterPacket* const packet, int characterIndex); //APIs and utilities sqlite3* database = nullptr; diff --git a/server/server_data.cpp b/server/server_data.cpp index 85ba3ae..135dfa2 100644 --- a/server/server_data.cpp +++ b/server/server_data.cpp @@ -92,10 +92,11 @@ void ServerApplication::HandleCharacterCreate(CharacterPacket* const argPacket) return; } - //send this character to the player + //pump this character to all clients CharacterPacket newPacket; + CopyCharacterToPacket(&newPacket, characterIndex); newPacket.type = SerialPacketType::CHARACTER_CREATE; - //TODO: pump character load + PumpPacket(&newPacket); } void ServerApplication::HandleCharacterDelete(CharacterPacket* const argPacket) { @@ -135,7 +136,11 @@ void ServerApplication::HandleCharacterDelete(CharacterPacket* const argPacket) //delete the character characterMgr.Delete(characterIndex); - //TODO: pump character unload + //pump character delete + CharacterPacket newPacket; + newPacket.type = SerialPacketType::CHARACTER_DELETE; + newPacket.characterIndex = characterIndex; + PumpPacket(static_cast(&newPacket)); } void ServerApplication::HandleCharacterLoad(CharacterPacket* const argPacket) { @@ -161,10 +166,11 @@ void ServerApplication::HandleCharacterLoad(CharacterPacket* const argPacket) { return; } - //send this character to the player + //pump this character to all clients CharacterPacket newPacket; + CopyCharacterToPacket(&newPacket, characterIndex); newPacket.type = SerialPacketType::CHARACTER_CREATE; - //TODO: pump character load + PumpPacket(&newPacket); } void ServerApplication::HandleCharacterUnload(CharacterPacket* const argPacket) { @@ -193,5 +199,9 @@ void ServerApplication::HandleCharacterUnload(CharacterPacket* const argPacket) //unload the character characterMgr.Unload(argPacket->characterIndex); - //TODO: pump character unload + //pump character delete + CharacterPacket newPacket; + newPacket.type = SerialPacketType::CHARACTER_DELETE; + newPacket.characterIndex = argPacket->characterIndex; + PumpPacket(static_cast(&newPacket)); } \ No newline at end of file diff --git a/server/server_logic.cpp b/server/server_logic.cpp index 341a46c..9db5034 100644 --- a/server/server_logic.cpp +++ b/server/server_logic.cpp @@ -188,7 +188,13 @@ void ServerApplication::Proc() { //find and unload the characters associated with this account characterMgr.UnloadIf([&](std::pair character) -> bool { if (character.second.GetOwner() == account.first) { -// PumpCharacterUnload(character.first); + //pump character delete + CharacterPacket newPacket; + newPacket.type = SerialPacketType::CHARACTER_DELETE; + newPacket.characterIndex = character.first; + PumpPacket(static_cast(&newPacket)); + + //unload this character return true; } return false; diff --git a/server/server_methods.cpp b/server/server_methods.cpp index 87de59a..610e525 100644 --- a/server/server_methods.cpp +++ b/server/server_methods.cpp @@ -169,32 +169,5 @@ void ServerApplication::CleanupLostConnection(int clientIndex) { std::cout << clientMgr.GetLoadedCount() << " clients and " << accountMgr.GetLoadedCount() << " accounts total" << std::endl; } -//SET: utility/delete -void ServerApplication::PumpCharacterUnload(int uid) { - //delete the client-side character(s) - //NOTE: This is a strange function - CharacterPacket newPacket; - newPacket.type = SerialPacketType::CHARACTER_DELETE; - newPacket.characterIndex = uid; - PumpPacket(static_cast(&newPacket)); -} - -//SET: utility/delete -void ServerApplication::CopyCharacterToPacket(CharacterPacket* const packet, int characterIndex) { - CharacterData* character = characterMgr.Get(characterIndex); - if (!character) { - throw(std::runtime_error("Failed to copy a character to a packet")); - } - - //TODO: keep this up to date when the character changes - packet->characterIndex = characterIndex; - strncpy(packet->handle, character->GetHandle().c_str(), PACKET_STRING_SIZE); - strncpy(packet->avatar, character->GetAvatar().c_str(), PACKET_STRING_SIZE); - packet->accountIndex = character->GetOwner(); - packet->roomIndex = character->GetRoomIndex(); - packet->origin = character->GetOrigin(); - packet->motion = character->GetMotion(); -} - //TODO: remove this terminate comment //*/ \ No newline at end of file diff --git a/server/server_util.cpp b/server/server_util.cpp index 4c8a01b..b0ef563 100644 --- a/server/server_util.cpp +++ b/server/server_util.cpp @@ -51,3 +51,23 @@ void ServerApplication::PumpPacketProximity(SerialPacket* const argPacket, int r //send the packet to that client //NOTE: this is perhaps too complex; I write it if I need it } + +//------------------------- +//common copy methods +//------------------------- + +void ServerApplication::CopyCharacterToPacket(CharacterPacket* const packet, int characterIndex) { + CharacterData* character = characterMgr.Get(characterIndex); + if (!character) { + throw(std::runtime_error("Failed to copy a character to a packet")); + } + + //NOTE: keep this up to date when the character changes + packet->characterIndex = characterIndex; + strncpy(packet->handle, character->GetHandle().c_str(), PACKET_STRING_SIZE); + strncpy(packet->avatar, character->GetAvatar().c_str(), PACKET_STRING_SIZE); + packet->accountIndex = character->GetOwner(); + packet->roomIndex = character->GetRoomIndex(); + packet->origin = character->GetOrigin(); + packet->motion = character->GetMotion(); +} \ No newline at end of file