From e7ba097e6aa6587e8dda37e33ede54d0ae809512 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sun, 17 Aug 2014 10:06:29 +1000 Subject: [PATCH] Converted the server's managers to singletons --- server/accounts/account_manager.hpp | 11 +++++--- server/accounts/makefile | 2 +- server/characters/character_manager.hpp | 11 +++++--- server/main.cpp | 6 +++++ server/rooms/makefile | 2 +- server/rooms/room_manager.hpp | 13 ++++----- server/rooms/room_manager_api.cpp | 35 +++++-------------------- server/server_application.cpp | 9 +------ server/server_application.hpp | 6 ++--- todo.txt | 32 ---------------------- 10 files changed, 40 insertions(+), 87 deletions(-) diff --git a/server/accounts/account_manager.hpp b/server/accounts/account_manager.hpp index 7c6cc1f..060f0d7 100644 --- a/server/accounts/account_manager.hpp +++ b/server/accounts/account_manager.hpp @@ -23,16 +23,14 @@ #define ACCOUNTMANAGER_HPP_ #include "account_data.hpp" +#include "singleton.hpp" #include "sqlite3/sqlite3.h" #include -class AccountManager { +class AccountManager : public Singleton { public: - AccountManager() = default; - ~AccountManager() { UnloadAll(); }; - //public access methods int CreateAccount(std::string username, int clientIndex); int LoadAccount(std::string username, int clientIndex); @@ -50,6 +48,11 @@ public: sqlite3* GetDatabase(); private: + friend Singleton; + + AccountManager() = default; + ~AccountManager() { UnloadAll(); }; + std::map accountMap; sqlite3* database = nullptr; }; diff --git a/server/accounts/makefile b/server/accounts/makefile index 8d12afe..f24e1ba 100644 --- a/server/accounts/makefile +++ b/server/accounts/makefile @@ -1,5 +1,5 @@ #config -INCLUDES+=. +INCLUDES+=. ../../common/utilities LIBS+= CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) diff --git a/server/characters/character_manager.hpp b/server/characters/character_manager.hpp index 191fd4c..4f97615 100644 --- a/server/characters/character_manager.hpp +++ b/server/characters/character_manager.hpp @@ -23,17 +23,15 @@ #define CHARACTERMANAGER_HPP_ #include "character_data.hpp" +#include "singleton.hpp" #include "sqlite3/sqlite3.h" #include #include -class CharacterManager { +class CharacterManager : public Singleton { public: - CharacterManager() = default; - ~CharacterManager() { UnloadAll(); }; - //public access methods int CreateCharacter(int owner, std::string handle, std::string avatar); int LoadCharacter(int owner, std::string handle, std::string avatar); @@ -53,6 +51,11 @@ public: sqlite3* GetDatabase(); private: + friend Singleton; + + CharacterManager() = default; + ~CharacterManager() { UnloadAll(); }; + std::map characterMap; sqlite3* database = nullptr; }; diff --git a/server/main.cpp b/server/main.cpp index 71ebb7c..8987d26 100644 --- a/server/main.cpp +++ b/server/main.cpp @@ -33,7 +33,10 @@ using namespace std; int main(int argc, char** argv) { try { //create the singletons + AccountManager::Create(); + CharacterManager::Create(); ConfigUtility::Create(); + RoomManager::Create(); UDPNetworkUtility::Create(); //call the server's routines @@ -47,7 +50,10 @@ int main(int argc, char** argv) { ServerApplication::Delete(); //delete the singletons + AccountManager::Delete(); + CharacterManager::Delete(); ConfigUtility::Delete(); + RoomManager::Delete(); UDPNetworkUtility::Delete(); } catch(exception& e) { diff --git a/server/rooms/makefile b/server/rooms/makefile index f4921ea..ea66828 100644 --- a/server/rooms/makefile +++ b/server/rooms/makefile @@ -1,5 +1,5 @@ #config -INCLUDES+=. ../mapgen ../mapgen/generators ../../common/map +INCLUDES+=. ../../common/map ../../common/utilities LIBS+= CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) diff --git a/server/rooms/room_manager.hpp b/server/rooms/room_manager.hpp index 50a2074..2f13893 100644 --- a/server/rooms/room_manager.hpp +++ b/server/rooms/room_manager.hpp @@ -23,18 +23,14 @@ #define ROOMMANAGER_HPP_ #include "room_data.hpp" +#include "singleton.hpp" #include "lua/lua.hpp" #include -#define ROOM_MANAGER_PSEUDOINDEX "RoomManager" - -class RoomManager { +class RoomManager : public Singleton { public: - RoomManager() = default; - ~RoomManager() = default; - //public access methods int CreateRoom(); void UnloadRoom(int uid); @@ -52,6 +48,11 @@ public: lua_State* GetLuaState() { return luaState; } private: + friend Singleton; + + RoomManager() = default; + ~RoomManager() = default; + std::map roomMap; lua_State* luaState = nullptr; int counter = 0; diff --git a/server/rooms/room_manager_api.cpp b/server/rooms/room_manager_api.cpp index c8f1b5c..02565b9 100644 --- a/server/rooms/room_manager_api.cpp +++ b/server/rooms/room_manager_api.cpp @@ -26,45 +26,24 @@ #include static int getRoom(lua_State* L) { - //get the room manager - lua_pushstring(L, ROOM_MANAGER_PSEUDOINDEX); - lua_gettable(L, LUA_REGISTRYINDEX); - RoomManager* roomMgr = reinterpret_cast(lua_touserdata(L, -1)); - - //push the room and return it - lua_pushlightuserdata(L, reinterpret_cast( roomMgr->GetRoom(lua_tointeger(L, -2)) )); + //find, push and return the room + RoomData* room = RoomManager::GetSingleton().GetRoom(lua_tointeger(L, -2)); + lua_pushlightuserdata(L, reinterpret_cast(room)); return 1; } static int createRoom(lua_State* L) { //TODO: check parameter count for the glue functions - //get the room manager - lua_pushstring(L, ROOM_MANAGER_PSEUDOINDEX); - lua_gettable(L, LUA_REGISTRYINDEX); - RoomManager* roomMgr = reinterpret_cast(lua_touserdata(L, -1)); - - //create the room - int uid = roomMgr->CreateRoom(); - - //TODO: any room parameters - - //return the new room - lua_pushlightuserdata(L, roomMgr->FindRoom(uid)); + //create, find and return the room + int uid = RoomManager::GetSingleton().CreateRoom(); + lua_pushlightuserdata(L, RoomManager::GetSingleton().FindRoom(uid)); return 1; } static int unloadRoom(lua_State* L) { - //get the room manager - lua_pushstring(L, ROOM_MANAGER_PSEUDOINDEX); - lua_gettable(L, LUA_REGISTRYINDEX); - RoomManager* roomMgr = reinterpret_cast(lua_touserdata(L, -1)); - - //TODO: any room parameters - //unload the specified room - roomMgr->UnloadRoom(lua_tointeger(L, -2)); - + RoomManager::GetSingleton().UnloadRoom(lua_tointeger(L, -2)); return 0; } diff --git a/server/server_application.cpp b/server/server_application.cpp index a3ae389..5ba1acd 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -85,14 +85,7 @@ void ServerApplication::Init(int argc, char** argv) { roomMgr.SetLuaState(luaState); - std::cout << "Internal managers set" << std::endl; - - //register the "globals" - lua_pushstring(luaState, ROOM_MANAGER_PSEUDOINDEX); - lua_pushlightuserdata(luaState, &roomMgr); - lua_settable(luaState, LUA_REGISTRYINDEX); - - std::cout << "Internal managers registered with lua" << std::endl; + std::cout << "Internal managers initialized" << std::endl; //------------------------- //Run the startup scripts diff --git a/server/server_application.hpp b/server/server_application.hpp index 17b6e41..2563613 100644 --- a/server/server_application.hpp +++ b/server/server_application.hpp @@ -92,9 +92,9 @@ private: std::map clientMap; //managers - AccountManager accountMgr; - CharacterManager characterMgr; - RoomManager roomMgr; + AccountManager& accountMgr = AccountManager::GetSingleton(); + CharacterManager& characterMgr = CharacterManager::GetSingleton(); + RoomManager& roomMgr = RoomManager::GetSingleton(); //misc bool running = true; diff --git a/todo.txt b/todo.txt index f7a9491..66189df 100644 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,4 @@ TODO: encapsulate the data structures -TODO: The server's managers should be singletons too TODO: Get the rooms working TODO: A proper logging system TODO: Move the statistics into their own SQL table, instead of duplicating the structure a dozen times @@ -10,34 +9,3 @@ TODO: server is slaved to the client TODO: Time delay for requesting region packets TODO: command line parameters overriding config.cfg settings - ---Requirements-- - -The enemies need AI scripts -The scripts need to be able to generate other enemies (frog king). -The characters need a flag to show if they're in a combat instance or not, to signify of they should be unloaded client-side -On each game loop, the server should envoke each combat instance's update function - Each combat instance invokes each enemy's and character's update functions - These update functions increase the ATB guagues - if an ATB guage is full - than the stored command is executed - the players issue their commands during the build up - if there isn't a command ready, then the player is still choosing - for the enemies, the stored commands are driven by scripts, so when the enemies need to attack, their attached scripts are called. - after the commands are called, the ATB is reset to 0. - etc... - ---Enemy API-- - -enemyTables -- The global store of enemy tables. Only accessed by C++ code (unless you want to break something). - -enemy.new(parameters) -- return a new enemy object - -table.logic: the AI logic. If null, do nothing -table.ref: reference to the enemy itself, for use by API functions, set by constructor? - -combat -- the combat API -combat.new(mapIndex, x, y) -- return combat instance's index -combat.pushenemy(c, enemy) -- return the enemy's position -combat.popenemy(c, position) -- -