diff --git a/server/rooms/makefile b/server/rooms/makefile index ea66828..4b00d80 100644 --- a/server/rooms/makefile +++ b/server/rooms/makefile @@ -1,5 +1,5 @@ #config -INCLUDES+=. ../../common/map ../../common/utilities +INCLUDES+=. ../server_utilities ../../common/map ../../common/utilities LIBS+= CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) diff --git a/server/rooms/room_manager.cpp b/server/rooms/room_manager.cpp index 4560fe9..bccfd8d 100644 --- a/server/rooms/room_manager.cpp +++ b/server/rooms/room_manager.cpp @@ -29,9 +29,9 @@ //public access methods //------------------------- -int RoomManager::CreateRoom() { - //create the room - RoomData* newRoom = new RoomData(); +int RoomManager::Create() { +/* //create the room + RoomData* newRoom = newRoom->pager.SetLuaState(luaState); //register the room @@ -47,13 +47,21 @@ int RoomManager::CreateRoom() { lua_pop(luaState, 1); //finish the routine - return counter++; +*/ return counter++; } -void RoomManager::UnloadRoom(int uid) { - //find the room - RoomData* room = FindRoom(uid); - if (!room) { +int RoomManager::Load() { + //TODO: RoomManageR::Load() +} + +int RoomManager::Save(int uid) { + //TODO: RoomManageR::Save(uid) +} + +void RoomManager::Unload(int uid) { +/* //find the room + RoomData* room = elementMap.find(uid); + if (room == elementMap.end()) { return; } @@ -69,28 +77,14 @@ void RoomManager::UnloadRoom(int uid) { //free the memory delete room; roomMap.erase(uid); -} +*/} -RoomData* RoomManager::GetRoom(int uid) { - return FindRoom(uid); - //TODO: expand this to auto-create the room -} - -RoomData* RoomManager::FindRoom(int uid) { - std::map::iterator it = roomMap.find(uid); - if (it == roomMap.end()) { - return nullptr; - } - return it->second; -} - -int RoomManager::PushRoom(RoomData* room) { - roomMap[counter++] = room; - return counter; +void RoomManager::Delete(int uid) { + // } void RoomManager::UnloadAll() { - lua_getglobal(luaState, TORTUGA_ROOM_NAME); +/* lua_getglobal(luaState, TORTUGA_ROOM_NAME); for (auto& it : roomMap) { //API hook @@ -103,4 +97,32 @@ void RoomManager::UnloadAll() { lua_pop(luaState, 1); roomMap.clear(); -} \ No newline at end of file +*/} + +void RoomManager::UnloadIf(std::function)> fn) { + std::map::iterator it = elementMap.begin(); + while (it != elementMap.end()) { + if (fn(*it)) { + it = elementMap.erase(it); + } + else { + ++it; + } + } +} + +RoomData* RoomManager::Get(int uid) { + return &elementMap[uid]; +} + +int RoomManager::GetLoadedCount() { + return elementMap.size(); +} + +int RoomManager::GetTotalCount() { + return elementMap.size(); +} + +std::map* RoomManager::GetContainer() { + return &elementMap; +} diff --git a/server/rooms/room_manager.hpp b/server/rooms/room_manager.hpp index 2f13893..7527147 100644 --- a/server/rooms/room_manager.hpp +++ b/server/rooms/room_manager.hpp @@ -23,38 +23,39 @@ #define ROOMMANAGER_HPP_ #include "room_data.hpp" + #include "singleton.hpp" +#include "manager_interface.hpp" #include "lua/lua.hpp" -#include - -class RoomManager : public Singleton { +class RoomManager: public Singleton, public ManagerInterface { public: - //public access methods - int CreateRoom(); - void UnloadRoom(int uid); - - RoomData* GetRoom(int uid); - RoomData* FindRoom(int uid); - int PushRoom(RoomData*); - - void UnloadAll(); - - //accessors and mutators - std::map* GetContainer() { return &roomMap; } - - lua_State* SetLuaState(lua_State* L) { return luaState = L; } - lua_State* GetLuaState() { return luaState; } - -private: - friend Singleton; - RoomManager() = default; ~RoomManager() = default; - std::map roomMap; - lua_State* luaState = nullptr; + //common public methods + int Create() override; + int Load() override; + int Save(int uid) override; + void Unload(int uid) override; + void Delete(int uid) override; + + void UnloadAll() override; + void UnloadIf(std::function)> fn) override; + + //accessors and mutators + RoomData* Get(int uid) override; + int GetLoadedCount() override; + int GetTotalCount() override; + std::map* GetContainer() override; + + //hooks + lua_State* SetLuaState(lua_State* L) { return lua = L; } + lua_State* GetLuaState() { return lua; } + +private: + lua_State* lua = nullptr; int counter = 0; }; diff --git a/server/rooms/room_manager_api.cpp b/server/rooms/room_manager_api.cpp index 02565b9..2c0c516 100644 --- a/server/rooms/room_manager_api.cpp +++ b/server/rooms/room_manager_api.cpp @@ -24,7 +24,7 @@ #include "room_manager.hpp" #include - +/* static int getRoom(lua_State* L) { //find, push and return the room RoomData* room = RoomManager::GetSingleton().GetRoom(lua_tointeger(L, -2)); @@ -46,11 +46,11 @@ static int unloadRoom(lua_State* L) { RoomManager::GetSingleton().UnloadRoom(lua_tointeger(L, -2)); return 0; } - +*/ static const luaL_Reg roomManagerLib[] = { - {"GetRoom",getRoom}, - {"CreateRoom",createRoom}, - {"UnloadRoom",unloadRoom}, +// {"GetRoom",getRoom}, +// {"CreateRoom",createRoom}, +// {"UnloadRoom",unloadRoom}, {nullptr, nullptr} }; diff --git a/server/server_methods.cpp b/server/server_methods.cpp index b211d8f..79f8d46 100644 --- a/server/server_methods.cpp +++ b/server/server_methods.cpp @@ -161,7 +161,7 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) { newPacket.y = argPacket->y; //BUG: possibly related to #35 - newPacket.region = roomMgr.GetRoom(argPacket->roomIndex)->GetPager()->GetRegion(argPacket->x, argPacket->y); + newPacket.region = roomMgr.Get(argPacket->roomIndex)->GetPager()->GetRegion(argPacket->x, argPacket->y); //send the content network.SendTo(argPacket->srcAddress, static_cast(&newPacket)); diff --git a/server/server_utilities/manager_interface.hpp b/server/server_utilities/manager_interface.hpp new file mode 100644 index 0000000..8a5161f --- /dev/null +++ b/server/server_utilities/manager_interface.hpp @@ -0,0 +1,55 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef MANAGERINTERFACE_HPP_ +#define MANAGERINTERFACE_HPP_ + +#include +#include + +template +class ManagerInterface { +public: + //common public methods + virtual int Create(Arguments... parameters) = 0; + virtual int Load(Arguments... parameters) = 0; + virtual int Save(int uid) = 0; + virtual void Unload(int uid) = 0; + virtual void Delete(int uid) = 0; + + virtual void UnloadAll() = 0; + virtual void UnloadIf(std::function)> fn) = 0; + + //accessors & mutators + virtual T* Get(int uid) = 0; + virtual int GetLoadedCount() = 0; + virtual int GetTotalCount() = 0; //can be an alias of GetLoadedCount() + virtual std::map* GetContainer() = 0; + +protected: + ManagerInterface() = default; + ~ManagerInterface() = default; + + //members + std::map elementMap; +}; + +#endif \ No newline at end of file