From 8e50be24d4dabd9408de5fb0f20d62a9a377b4e2 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Wed, 31 Dec 2014 04:52:10 +1100 Subject: [PATCH] Updated room system and room API, more to come There's a lot of verbosity in the scripts, so it might be beneficial to redice that at some point. --- rsc/scripts/setup_server.lua | 12 +++++--- server/rooms/room_api.cpp | 15 +++++----- server/rooms/room_data.cpp | 8 +++--- server/rooms/room_data.hpp | 10 ++++--- server/rooms/room_manager.cpp | 36 ++++++++++++----------- server/rooms/room_manager.hpp | 9 +++--- server/rooms/room_manager_api.cpp | 48 +++++++++++++++++++++++++++---- todo.txt | 1 + 8 files changed, 93 insertions(+), 46 deletions(-) diff --git a/rsc/scripts/setup_server.lua b/rsc/scripts/setup_server.lua index e07af12..364c061 100644 --- a/rsc/scripts/setup_server.lua +++ b/rsc/scripts/setup_server.lua @@ -1,5 +1,6 @@ print("Lua script check") +mapSystem = require "map_system" mapMaker = require "map_maker" mapSaver = require "map_saver" roomSystem = require "room_system" @@ -12,10 +13,13 @@ local function dumpTable(t) end end -dumpTable(waypointSystem) - --NOTE: room 0 is the first that the client asks for, therefore it must exist -local overworld, uid = roomSystem.RoomManager.CreateRoom("overworld") -roomSystem.Room.Initialize(overworld, "overworld.bmp", mapSaver.Load, mapSaver.Save, mapMaker.debugIsland, mapSaver.Save) +local overworld, uid = roomSystem.RoomManager.CreateRoom("overworld", "overworld.bmp") + +--NOTE: This is horrible; room initialization is important +mapSystem.RegionPager.SetOnLoad(roomSystem.Room.GetPager(overworld), mapSaver.Load) +mapSystem.RegionPager.SetOnSave(roomSystem.Room.GetPager(overworld), mapSaver.Save) +mapSystem.RegionPager.SetOnCreate(roomSystem.Room.GetPager(overworld), mapMaker.debugIsland) +mapSystem.RegionPager.SetOnUnload(roomSystem.Room.GetPager(overworld), mapSaver.Save) print("Finished the lua script") diff --git a/server/rooms/room_api.cpp b/server/rooms/room_api.cpp index b40d123..b6606f8 100644 --- a/server/rooms/room_api.cpp +++ b/server/rooms/room_api.cpp @@ -25,25 +25,25 @@ static int setRoomName(lua_State* L) { RoomData* room = reinterpret_cast(lua_touserdata(L, 1)); - room->SetRoomName(lua_tostring(L, 2)); + room->SetName(lua_tostring(L, 2)); return 0; } static int getRoomName(lua_State* L) { RoomData* room = reinterpret_cast(lua_touserdata(L, 1)); - lua_pushstring(L, room->GetRoomName().c_str()); + lua_pushstring(L, room->GetName().c_str()); return 1; } static int setTilesetName(lua_State* L) { RoomData* room = reinterpret_cast(lua_touserdata(L, 1)); - room->SetTilesetName(lua_tostring(L, 2)); + room->SetTileset(lua_tostring(L, 2)); return 0; } static int getTilesetName(lua_State* L) { RoomData* room = reinterpret_cast(lua_touserdata(L, 1)); - lua_pushstring(L, room->GetTilesetName().c_str()); + lua_pushstring(L, room->GetTileset().c_str()); return 1; } @@ -56,7 +56,8 @@ static int getPager(lua_State* L) { static int initialize(lua_State* L) { //set the members of the given room RoomData* room = static_cast(lua_touserdata(L, 1)); - room->SetRoomName(lua_tostring(L, 2)); + room->SetName(lua_tostring(L, 2)); + room->SetTileset(lua_tostring(L, 3)); //set the refs of these parameters (backwards, since it pops from the top of the stack) room->GetPager()->SetUnloadReference(luaL_ref(L, LUA_REGISTRYINDEX)); @@ -70,8 +71,8 @@ static int initialize(lua_State* L) { static const luaL_Reg roomLib[] = { {"GetPager",getPager}, - {"SetRoomName", setRoomName}, - {"GetRoomName", getRoomName}, + {"SetName", setRoomName}, + {"GetName", getRoomName}, {"SetTileset", setTilesetName}, {"GetTileset", getTilesetName}, {"Initialize", initialize}, diff --git a/server/rooms/room_data.cpp b/server/rooms/room_data.cpp index 5b7ec8f..8919564 100644 --- a/server/rooms/room_data.cpp +++ b/server/rooms/room_data.cpp @@ -21,19 +21,19 @@ */ #include "room_data.hpp" -std::string RoomData::SetRoomName(std::string s) { +std::string RoomData::SetName(std::string s) { return roomName = s; } -std::string RoomData::GetRoomName() { +std::string RoomData::GetName() { return roomName; } -std::string RoomData::SetTilesetName(std::string s) { +std::string RoomData::SetTileset(std::string s) { return tilesetName = s; } -std::string RoomData::GetTilesetName() { +std::string RoomData::GetTileset() { return tilesetName; } diff --git a/server/rooms/room_data.hpp b/server/rooms/room_data.hpp index c3668fc..eb977d2 100644 --- a/server/rooms/room_data.hpp +++ b/server/rooms/room_data.hpp @@ -40,15 +40,17 @@ public: ~RoomData() = default; //accessors and mutators - std::string SetRoomName(std::string s); - std::string GetRoomName(); + std::string SetName(std::string); + std::string GetName(); - std::string SetTilesetName(std::string s); - std::string GetTilesetName(); + std::string SetTileset(std::string); + std::string GetTileset(); RegionPagerLua* GetPager(); std::list* GetEntityList(); + //TODO: triggers for unload, save, per-second, player enter, player exit, etc. + private: friend class RoomManager; diff --git a/server/rooms/room_manager.cpp b/server/rooms/room_manager.cpp index 2d190c9..4ce2dff 100644 --- a/server/rooms/room_manager.cpp +++ b/server/rooms/room_manager.cpp @@ -29,27 +29,18 @@ //public access methods //------------------------- -int RoomManager::Create(std::string roomName) { +int RoomManager::Create(std::string roomName, std::string tileset) { //create the room RoomData* newRoom = &elementMap[counter]; //implicitly constructs the element - newRoom->SetRoomName(roomName); + newRoom->SetName(roomName); + newRoom->SetTileset(tileset); + newRoom->pager.SetLuaState(lua); //finish the routine return counter++; } -void RoomManager::Unload(int uid) { - //find the room - std::map::iterator it = elementMap.find(uid); - if (it == elementMap.end()) { - return; - } - - //free the memory - elementMap.erase(uid); -} - void RoomManager::UnloadAll() { elementMap.clear(); } @@ -76,14 +67,27 @@ RoomData* RoomManager::Get(int uid) { return &it->second; } -int RoomManager::GetLoadedCount() { - return elementMap.size(); +RoomData* RoomManager::Get(std::string name) { + for (std::map::iterator it = elementMap.begin(); it != elementMap.end(); ++it) { + if (it->second.GetName() == name) { + return &it->second; + } + } + return nullptr; } -int RoomManager::GetTotalCount() { +int RoomManager::GetLoadedCount() { return elementMap.size(); } std::map* RoomManager::GetContainer() { return &elementMap; } + +lua_State* RoomManager::SetLuaState(lua_State* L) { + return lua = L; +} + +lua_State* RoomManager::GetLuaState() { + return lua; +} diff --git a/server/rooms/room_manager.hpp b/server/rooms/room_manager.hpp index 2371d5e..9f9f37c 100644 --- a/server/rooms/room_manager.hpp +++ b/server/rooms/room_manager.hpp @@ -37,21 +37,20 @@ class RoomManager: public Singleton { public: //common public methods - int Create(std::string); - void Unload(int uid); + int Create(std::string name, std::string tileset); void UnloadAll(); void UnloadIf(std::function)> fn); //accessors and mutators RoomData* Get(int uid); + RoomData* Get(std::string name); int GetLoadedCount(); - int GetTotalCount(); std::map* GetContainer(); //hooks - lua_State* SetLuaState(lua_State* L) { return lua = L; } - lua_State* GetLuaState() { return lua; } + lua_State* SetLuaState(lua_State* L); + lua_State* GetLuaState(); private: friend Singleton; diff --git a/server/rooms/room_manager_api.cpp b/server/rooms/room_manager_api.cpp index 0a22f46..1eade08 100644 --- a/server/rooms/room_manager_api.cpp +++ b/server/rooms/room_manager_api.cpp @@ -24,31 +24,67 @@ #include "room_manager.hpp" int createRoom(lua_State* L) { - //create & get the room RoomManager& roomMgr = RoomManager::GetSingleton(); - int uid = roomMgr.Create(lua_tostring(L, 1)); + int uid = roomMgr.Create(lua_tostring(L, 1), lua_tostring(L, 2)); RoomData* room = roomMgr.Get(uid); + //TODO: initialization parameters here? + //return room, uid lua_pushlightuserdata(L, static_cast(room)); - lua_pushinteger(L, uid); + lua_pushinteger(L, uid); //for debugging, mostly return 2; } int unloadRoom(lua_State* L) { - //TODO: check authorization for room deletion RoomManager& roomMgr = RoomManager::GetSingleton(); - roomMgr.Unload(lua_tointeger(L, 1)); + + switch(lua_type(L, 1)) { + case LUA_TNUMBER: { + //number + int uid = lua_tointeger(L, 1); + roomMgr.UnloadIf([uid](std::pair it){ + return it.first == uid; + }); + } + break; + case LUA_TSTRING: { + //name + std::string name = lua_tostring(L, 1); + roomMgr.UnloadIf([name](std::pair it){ + return it.second.GetName() == name; + }); + } + break; + case LUA_TLIGHTUSERDATA: { + //the room itself + std::string name = static_cast(lua_touserdata(L, 1))->GetName(); + roomMgr.UnloadIf([name](std::pair it){ + return it.second.GetName() == name; + }); + } + break; + } return 0; } int getRoom(lua_State* L) { //TODO: integer vs name for getRoom() RoomManager& roomMgr = RoomManager::GetSingleton(); + RoomData* room = nullptr; - RoomData* room = roomMgr.Get(lua_tointeger(L, 1)); + switch(lua_type(L, 1)) { + case LUA_TNUMBER: + //number + room = roomMgr.Get(lua_tointeger(L, 1)); + break; + case LUA_TSTRING: + //name + room = roomMgr.Get(lua_tostring(L, 1)); + break; + } if (room) { lua_pushlightuserdata(L, static_cast(room)); diff --git a/todo.txt b/todo.txt index c543542..655f6e5 100644 --- a/todo.txt +++ b/todo.txt @@ -10,6 +10,7 @@ TODO: Account passwords (list) * ... * salts & hashes +TODO: Pagers giving their region counts in the API TODO: Waypoints, with positions and trigger zones (collision areas) for doors, monster spawns, etc. TODO: Fix shoddy movement TODO: Periodic mass server saves