diff --git a/server/room_data.hpp b/server/room_data.hpp index 0787425..c37bbae 100644 --- a/server/room_data.hpp +++ b/server/room_data.hpp @@ -27,11 +27,11 @@ struct RoomData { enum class RoomType { - OVERWORLD, - RUINS, - TOWERS, - FORESTS, - CAVES, + OVERWORLD = 0, + RUINS = 1, + TOWERS = 2, + FORESTS = 3, + CAVE = 4, }; //members diff --git a/server/room_manager.cpp b/server/room_manager.cpp index 3cb43dd..8f60ba4 100644 --- a/server/room_manager.cpp +++ b/server/room_manager.cpp @@ -21,34 +21,52 @@ */ #include "room_manager.hpp" +#include + //------------------------- //public access methods //------------------------- -//TODO +RoomData* RoomManager::CreateRoom(int uid) { + //don't overwrite existing rooms + std::map::iterator it = roomMap.find(uid); + if (it != roomMap.end()) { + throw(std::runtime_error("Cannot overwrite an existing room")); + } + roomMap[uid] = new RoomData(); + //TODO: create room in the API + if (luaState) { + roomMap[uid]->pager.SetLuaState(luaState); + } + return roomMap[uid]; +} -//------------------------- -//accessors and mutators -//------------------------- +RoomData* RoomManager::UnloadRoom(int uid) { + //TODO: unload room in the API + delete roomMap[uid]; + roomMap.erase(uid); +} RoomData* RoomManager::GetRoom(int uid) { - std::map::iterator it = roomMap.find(uid); + RoomData* ptr = FindRoom(uid); + if (ptr) return ptr; + ptr = CreateRoom(uid); + return ptr; +} +RoomData* RoomManager::FindRoom(int uid) { + std::map::iterator it = roomMap.find(uid); if (it == roomMap.end()) { return nullptr; } - - return &it->second; + return it->second; } -std::map* RoomManager::GetContainer() { - return &roomMap; -} - -lua_State* RoomManager::SetLuaState(lua_State* L) { - return luaState = L; -} - -lua_State* RoomManager::GetLuaState() { - return luaState; +RoomData* RoomManager::PushRoom(int uid, RoomData* room) { + //unload existing rooms with this index + std::map::iterator it = roomMap.find(uid); + if (it != roomMap.end()) { + UnloadRoom(uid); + } + roomMap[uid] = room; } diff --git a/server/room_manager.hpp b/server/room_manager.hpp index 655c960..80480f7 100644 --- a/server/room_manager.hpp +++ b/server/room_manager.hpp @@ -36,17 +36,21 @@ public: ~RoomManager() = default; //public access methods - //TODO: Fill this out + RoomData* CreateRoom(int uid); + RoomData* UnloadRoom(int uid); + + RoomData* GetRoom(int uid); + RoomData* FindRoom(int uid); + RoomData* PushRoom(int uid, RoomData*); //accessors and mutators - RoomData* GetRoom(int uid); - std::map* GetContainer(); + std::map* GetContainer() { return &roomMap; } - lua_State* SetLuaState(lua_State*); - lua_State* GetLuaState(); + lua_State* SetLuaState(lua_State* L) { return luaState = L; } + lua_State* GetLuaState() { return luaState; } private: - std::map roomMap; + std::map roomMap; lua_State* luaState = nullptr; }; diff --git a/server/server_application.cpp b/server/server_application.cpp index 372655f..621f129 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -316,7 +316,7 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) { newPacket.region = roomMgr.GetRoom(argPacket->roomIndex)->pager.GetRegion(argPacket->x, argPacket->y); //send the content - network.SendTo(&argPacket->srcAddress, static_cast(argPacket)); + network.SendTo(&argPacket->srcAddress, static_cast(&newPacket)); } //------------------------- diff --git a/todo.txt b/todo.txt index 20fbe42..4feb30b 100644 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,5 @@ +TODO: encapsulate the data structures TODO: Get the rooms working -TODO: update the map API to handle multiple rooms TODO: Rejection packets TODO: Authentication