Merge branch 'fun-with-interfaces' into develop
This commit is contained in:
@@ -87,13 +87,13 @@ int AccountManager::Load(std::string username, int clientIndex) {
|
|||||||
int uid = sqlite3_column_int(statement, 0);
|
int uid = sqlite3_column_int(statement, 0);
|
||||||
|
|
||||||
//check to see if this account is already loaded
|
//check to see if this account is already loaded
|
||||||
if (accountMap.find(uid) != accountMap.end()) {
|
if (elementMap.find(uid) != elementMap.end()) {
|
||||||
sqlite3_finalize(statement);
|
sqlite3_finalize(statement);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//extract the data into memory
|
//extract the data into memory
|
||||||
AccountData& newAccount = accountMap[uid];
|
AccountData& newAccount = elementMap[uid];
|
||||||
newAccount.username = reinterpret_cast<const char*>(sqlite3_column_text(statement, 1));
|
newAccount.username = reinterpret_cast<const char*>(sqlite3_column_text(statement, 1));
|
||||||
newAccount.blackListed = sqlite3_column_int(statement, 2);
|
newAccount.blackListed = sqlite3_column_int(statement, 2);
|
||||||
newAccount.whiteListed = sqlite3_column_int(statement, 3);
|
newAccount.whiteListed = sqlite3_column_int(statement, 3);
|
||||||
@@ -121,11 +121,11 @@ int AccountManager::Save(int uid) {
|
|||||||
//DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID.
|
//DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID.
|
||||||
|
|
||||||
//this method fails if this account is not loaded
|
//this method fails if this account is not loaded
|
||||||
if (accountMap.find(uid) == accountMap.end()) {
|
if (elementMap.find(uid) == elementMap.end()) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
AccountData& account = accountMap[uid];
|
AccountData& account = elementMap[uid];
|
||||||
sqlite3_stmt* statement = nullptr;
|
sqlite3_stmt* statement = nullptr;
|
||||||
|
|
||||||
//prep
|
//prep
|
||||||
@@ -163,7 +163,7 @@ void AccountManager::Unload(int uid) {
|
|||||||
//save this user account, and then unload it
|
//save this user account, and then unload it
|
||||||
//NOTE: the associated characters are unloaded externally
|
//NOTE: the associated characters are unloaded externally
|
||||||
Save(uid);
|
Save(uid);
|
||||||
accountMap.erase(uid);
|
elementMap.erase(uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AccountManager::Delete(int uid) {
|
void AccountManager::Delete(int uid) {
|
||||||
@@ -190,25 +190,27 @@ void AccountManager::Delete(int uid) {
|
|||||||
|
|
||||||
//finish the routine
|
//finish the routine
|
||||||
sqlite3_finalize(statement);
|
sqlite3_finalize(statement);
|
||||||
accountMap.erase(uid);
|
elementMap.erase(uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AccountManager::UnloadAll() {
|
void AccountManager::UnloadAll() {
|
||||||
for (auto& it : accountMap) {
|
for (auto& it : elementMap) {
|
||||||
Save(it.first);
|
Save(it.first);
|
||||||
}
|
}
|
||||||
accountMap.clear();
|
elementMap.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AccountManager::UnloadIf(std::function<bool(std::pair<int, AccountData>)> fn) {
|
void AccountManager::UnloadIf(std::function<bool(std::pair<const int, AccountData>)> fn) {
|
||||||
//replicate std::remove_if, using custom code
|
//replicate std::remove_if, using custom code
|
||||||
for (std::map<int, AccountData>::iterator it = accountMap.begin(); it != accountMap.end(); /* empty */) {
|
std::map<int, AccountData>::iterator it = elementMap.begin();
|
||||||
|
while (it != elementMap.end()) {
|
||||||
if (fn(*it)) {
|
if (fn(*it)) {
|
||||||
Save(it->first);
|
Save(it->first);
|
||||||
it = accountMap.erase(it);
|
it = elementMap.erase(it);
|
||||||
continue;
|
}
|
||||||
|
else {
|
||||||
|
++it;
|
||||||
}
|
}
|
||||||
++it;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,9 +220,9 @@ void AccountManager::UnloadIf(std::function<bool(std::pair<int, AccountData>)> f
|
|||||||
|
|
||||||
AccountData* AccountManager::Get(int uid) {
|
AccountData* AccountManager::Get(int uid) {
|
||||||
//TODO: could this load an account first?
|
//TODO: could this load an account first?
|
||||||
std::map<int, AccountData>::iterator it = accountMap.find(uid);
|
std::map<int, AccountData>::iterator it = elementMap.find(uid);
|
||||||
|
|
||||||
if (it == accountMap.end()) {
|
if (it == elementMap.end()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,7 +230,7 @@ AccountData* AccountManager::Get(int uid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int AccountManager::GetLoadedCount() {
|
int AccountManager::GetLoadedCount() {
|
||||||
return accountMap.size();
|
return elementMap.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
int AccountManager::GetTotalCount() {
|
int AccountManager::GetTotalCount() {
|
||||||
@@ -250,7 +252,7 @@ int AccountManager::GetTotalCount() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::map<int, AccountData>* AccountManager::GetContainer() {
|
std::map<int, AccountData>* AccountManager::GetContainer() {
|
||||||
return &accountMap;
|
return &elementMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlite3* AccountManager::SetDatabase(sqlite3* db) {
|
sqlite3* AccountManager::SetDatabase(sqlite3* db) {
|
||||||
|
|||||||
@@ -24,29 +24,33 @@
|
|||||||
|
|
||||||
#include "account_data.hpp"
|
#include "account_data.hpp"
|
||||||
#include "singleton.hpp"
|
#include "singleton.hpp"
|
||||||
|
#include "manager_interface.hpp"
|
||||||
|
|
||||||
#include "sqlite3/sqlite3.h"
|
#include "sqlite3/sqlite3.h"
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
class AccountManager : public Singleton<AccountManager> {
|
class AccountManager:
|
||||||
|
public Singleton<AccountManager>,
|
||||||
|
public ManagerInterface<AccountData, std::string, int>
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
//public access methods
|
//common public methods
|
||||||
int Create(std::string username, int clientIndex);
|
int Create(std::string username, int clientIndex) override;
|
||||||
int Load(std::string username, int clientIndex);
|
int Load(std::string username, int clientIndex) override;
|
||||||
int Save(int uid);
|
int Save(int uid) override;
|
||||||
void Unload(int uid);
|
void Unload(int uid) override;
|
||||||
void Delete(int uid);
|
void Delete(int uid) override;
|
||||||
|
|
||||||
void UnloadAll();
|
void UnloadAll() override;
|
||||||
void UnloadIf(std::function<bool(std::pair<int, AccountData>)> fn);
|
void UnloadIf(std::function<bool(std::pair<const int, AccountData>)> fn) override;
|
||||||
|
|
||||||
//accessors and mutators
|
//accessors and mutators
|
||||||
AccountData* Get(int uid);
|
AccountData* Get(int uid) override;
|
||||||
int GetLoadedCount();
|
int GetLoadedCount() override;
|
||||||
int GetTotalCount();
|
int GetTotalCount() override;
|
||||||
std::map<int, AccountData>* GetContainer();
|
std::map<int, AccountData>* GetContainer() override;
|
||||||
|
|
||||||
sqlite3* SetDatabase(sqlite3* db);
|
sqlite3* SetDatabase(sqlite3* db);
|
||||||
sqlite3* GetDatabase();
|
sqlite3* GetDatabase();
|
||||||
@@ -57,7 +61,6 @@ private:
|
|||||||
AccountManager() = default;
|
AccountManager() = default;
|
||||||
~AccountManager() = default;
|
~AccountManager() = default;
|
||||||
|
|
||||||
std::map<int, AccountData> accountMap;
|
|
||||||
sqlite3* database = nullptr;
|
sqlite3* database = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. ../../common/utilities
|
INCLUDES+=. ../server_utilities ../../common/utilities
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ int CharacterManager::Load(int owner, std::string handle, std::string avatar) {
|
|||||||
int uid = sqlite3_column_int(statement, 0);
|
int uid = sqlite3_column_int(statement, 0);
|
||||||
|
|
||||||
//check to see if this character is already loaded
|
//check to see if this character is already loaded
|
||||||
if (characterMap.find(uid) != characterMap.end()) {
|
if (elementMap.find(uid) != elementMap.end()) {
|
||||||
sqlite3_finalize(statement);
|
sqlite3_finalize(statement);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -110,7 +110,7 @@ int CharacterManager::Load(int owner, std::string handle, std::string avatar) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//extract the data into memory
|
//extract the data into memory
|
||||||
CharacterData& newChar = characterMap[uid];
|
CharacterData& newChar = elementMap[uid];
|
||||||
|
|
||||||
//metadata
|
//metadata
|
||||||
newChar.owner = owner;
|
newChar.owner = owner;
|
||||||
@@ -145,11 +145,11 @@ int CharacterManager::Save(int uid) {
|
|||||||
//DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID.
|
//DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID.
|
||||||
|
|
||||||
//this method fails if this character is not loaded
|
//this method fails if this character is not loaded
|
||||||
if (characterMap.find(uid) == characterMap.end()) {
|
if (elementMap.find(uid) == elementMap.end()) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
CharacterData& character = characterMap[uid];
|
CharacterData& character = elementMap[uid];
|
||||||
sqlite3_stmt* statement = nullptr;
|
sqlite3_stmt* statement = nullptr;
|
||||||
|
|
||||||
//prep
|
//prep
|
||||||
@@ -187,7 +187,7 @@ int CharacterManager::Save(int uid) {
|
|||||||
void CharacterManager::Unload(int uid) {
|
void CharacterManager::Unload(int uid) {
|
||||||
//save this character, then unload it
|
//save this character, then unload it
|
||||||
Save(uid);
|
Save(uid);
|
||||||
characterMap.erase(uid);
|
elementMap.erase(uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CharacterManager::Delete(int uid) {
|
void CharacterManager::Delete(int uid) {
|
||||||
@@ -213,25 +213,26 @@ void CharacterManager::Delete(int uid) {
|
|||||||
|
|
||||||
//finish the routine
|
//finish the routine
|
||||||
sqlite3_finalize(statement);
|
sqlite3_finalize(statement);
|
||||||
characterMap.erase(uid);
|
elementMap.erase(uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CharacterManager::UnloadAll() {
|
void CharacterManager::UnloadAll() {
|
||||||
for (auto& it : characterMap) {
|
for (auto& it : elementMap) {
|
||||||
Save(it.first);
|
Save(it.first);
|
||||||
}
|
}
|
||||||
characterMap.clear();
|
elementMap.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CharacterManager::UnloadIf(std::function<bool(std::pair<int, CharacterData>)> fn) {
|
void CharacterManager::UnloadIf(std::function<bool(std::pair<const int, CharacterData>)> fn) {
|
||||||
//replicate std::remove_if, using custom code
|
std::map<int, CharacterData>::iterator it = elementMap.begin();
|
||||||
for (std::map<int, CharacterData>::iterator it = characterMap.begin(); it != characterMap.end(); /* empty */) {
|
while (it != elementMap.end()) {
|
||||||
if (fn(*it)) {
|
if (fn(*it)) {
|
||||||
Save(it->first);
|
Save(it->first);
|
||||||
it = characterMap.erase(it);
|
it = elementMap.erase(it);
|
||||||
continue;
|
}
|
||||||
|
else {
|
||||||
|
++it;
|
||||||
}
|
}
|
||||||
++it;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,9 +241,9 @@ void CharacterManager::UnloadIf(std::function<bool(std::pair<int, CharacterData>
|
|||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
CharacterData* CharacterManager::Get(int uid) {
|
CharacterData* CharacterManager::Get(int uid) {
|
||||||
std::map<int, CharacterData>::iterator it = characterMap.find(uid);
|
std::map<int, CharacterData>::iterator it = elementMap.find(uid);
|
||||||
|
|
||||||
if (it == characterMap.end()) {
|
if (it == elementMap.end()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,7 +251,7 @@ CharacterData* CharacterManager::Get(int uid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int CharacterManager::GetLoadedCount() {
|
int CharacterManager::GetLoadedCount() {
|
||||||
return characterMap.size();
|
return elementMap.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
int CharacterManager::GetTotalCount() {
|
int CharacterManager::GetTotalCount() {
|
||||||
@@ -272,7 +273,7 @@ int CharacterManager::GetTotalCount() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::map<int, CharacterData>* CharacterManager::GetContainer() {
|
std::map<int, CharacterData>* CharacterManager::GetContainer() {
|
||||||
return &characterMap;
|
return &elementMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlite3* CharacterManager::SetDatabase(sqlite3* db) {
|
sqlite3* CharacterManager::SetDatabase(sqlite3* db) {
|
||||||
|
|||||||
@@ -24,29 +24,33 @@
|
|||||||
|
|
||||||
#include "character_data.hpp"
|
#include "character_data.hpp"
|
||||||
#include "singleton.hpp"
|
#include "singleton.hpp"
|
||||||
|
#include "manager_interface.hpp"
|
||||||
|
|
||||||
#include "sqlite3/sqlite3.h"
|
#include "sqlite3/sqlite3.h"
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
class CharacterManager : public Singleton<CharacterManager> {
|
class CharacterManager:
|
||||||
|
public Singleton<CharacterManager>,
|
||||||
|
public ManagerInterface<CharacterData, int, std::string, std::string>
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
//public access methods
|
//common public methods
|
||||||
int Create(int owner, std::string handle, std::string avatar);
|
int Create(int owner, std::string handle, std::string avatar) override;
|
||||||
int Load(int owner, std::string handle, std::string avatar);
|
int Load(int owner, std::string handle, std::string avatar) override;
|
||||||
int Save(int uid);
|
int Save(int uid) override;
|
||||||
void Unload(int uid);
|
void Unload(int uid) override;
|
||||||
void Delete(int uid);
|
void Delete(int uid) override;
|
||||||
|
|
||||||
void UnloadAll();
|
void UnloadAll() override;
|
||||||
void UnloadIf(std::function<bool(std::pair<int, CharacterData>)> fn);
|
void UnloadIf(std::function<bool(std::pair<const int, CharacterData>)> fn) override;
|
||||||
|
|
||||||
//accessors and mutators
|
//accessors and mutators
|
||||||
CharacterData* Get(int uid);
|
CharacterData* Get(int uid) override;
|
||||||
int GetLoadedCount();
|
int GetLoadedCount() override;
|
||||||
int GetTotalCount();
|
int GetTotalCount() override;
|
||||||
std::map<int, CharacterData>* GetContainer();
|
std::map<int, CharacterData>* GetContainer() override;
|
||||||
|
|
||||||
sqlite3* SetDatabase(sqlite3* db);
|
sqlite3* SetDatabase(sqlite3* db);
|
||||||
sqlite3* GetDatabase();
|
sqlite3* GetDatabase();
|
||||||
@@ -57,7 +61,6 @@ private:
|
|||||||
CharacterManager() = default;
|
CharacterManager() = default;
|
||||||
~CharacterManager() = default;
|
~CharacterManager() = default;
|
||||||
|
|
||||||
std::map<int, CharacterData> characterMap;
|
|
||||||
sqlite3* database = nullptr;
|
sqlite3* database = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. ../../common/gameplay ../../common/utilities
|
INCLUDES+=. ../server_utilities ../../common/gameplay ../../common/utilities
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. ../../common/map ../../common/utilities
|
INCLUDES+=. ../server_utilities ../../common/map ../../common/utilities
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
|
|||||||
@@ -29,21 +29,36 @@ static int getPager(lua_State* L) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int create(lua_State* L) {
|
static int setRoomName(lua_State* L) {
|
||||||
//EMPTY
|
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
|
||||||
//NOTE: This can be used to set defaults for the pager
|
room->SetRoomName(lua_tostring(L, 2));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int unload(lua_State* L) {
|
static int getRoomName(lua_State* L) {
|
||||||
//EMPTY
|
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
|
||||||
|
lua_pushstring(L, room->GetRoomName().c_str());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int setTilesetName(lua_State* L) {
|
||||||
|
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
|
||||||
|
room->SetTilesetName(lua_tostring(L, 2));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int getTilesetName(lua_State* L) {
|
||||||
|
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
|
||||||
|
lua_pushstring(L, room->GetTilesetName().c_str());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static const luaL_Reg roomLib[] = {
|
static const luaL_Reg roomLib[] = {
|
||||||
{"GetPager",getPager},
|
{"GetPager",getPager},
|
||||||
{"Create", create},
|
{"SetRoomName", setRoomName},
|
||||||
{"Unload", unload},
|
{"GetRoomName", getRoomName},
|
||||||
|
{"SetTileset", setTilesetName},
|
||||||
|
{"GetTileset", getTilesetName},
|
||||||
{nullptr, nullptr}
|
{nullptr, nullptr}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ public:
|
|||||||
//accessors and mutators
|
//accessors and mutators
|
||||||
RegionPagerLua* GetPager() { return &pager; }
|
RegionPagerLua* GetPager() { return &pager; }
|
||||||
|
|
||||||
|
std::string SetRoomName(std::string s) { return roomName = s; }
|
||||||
|
std::string GetRoomName() { return roomName; }
|
||||||
|
|
||||||
std::string SetTilesetName(std::string s) { return tilesetName = s; }
|
std::string SetTilesetName(std::string s) { return tilesetName = s; }
|
||||||
std::string GetTilesetName() { return tilesetName; }
|
std::string GetTilesetName() { return tilesetName; }
|
||||||
|
|
||||||
@@ -43,7 +46,10 @@ private:
|
|||||||
|
|
||||||
//members
|
//members
|
||||||
RegionPagerLua pager;
|
RegionPagerLua pager;
|
||||||
|
std::string roomName;
|
||||||
std::string tilesetName;
|
std::string tilesetName;
|
||||||
|
//TODO: pass the room name & tileset name to the clients
|
||||||
|
//TODO: lua references i.e. create, unload, etc.
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -29,78 +29,76 @@
|
|||||||
//public access methods
|
//public access methods
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
int RoomManager::CreateRoom() {
|
int RoomManager::Create() {
|
||||||
//create the room
|
//create the room
|
||||||
RoomData* newRoom = new RoomData();
|
RoomData* newRoom = &elementMap[counter]; //implicitly constructs the element
|
||||||
newRoom->pager.SetLuaState(luaState);
|
newRoom->pager.SetLuaState(lua);
|
||||||
|
|
||||||
//register the room
|
|
||||||
roomMap[counter] = newRoom;
|
|
||||||
|
|
||||||
//API hook
|
|
||||||
lua_getglobal(luaState, TORTUGA_ROOM_NAME);
|
|
||||||
lua_getfield(luaState, -1, "Create");
|
|
||||||
lua_pushlightuserdata(luaState, newRoom);
|
|
||||||
if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
|
||||||
}
|
|
||||||
lua_pop(luaState, 1);
|
|
||||||
|
|
||||||
//finish the routine
|
//finish the routine
|
||||||
return counter++;
|
return counter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RoomManager::UnloadRoom(int uid) {
|
int RoomManager::Load() {
|
||||||
|
//TODO: RoomManager::Load()
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RoomManager::Save(int uid) {
|
||||||
|
//TODO: RoomManager::Save(uid)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RoomManager::Unload(int uid) {
|
||||||
//find the room
|
//find the room
|
||||||
RoomData* room = FindRoom(uid);
|
std::map<int, RoomData>::iterator it = elementMap.find(uid);
|
||||||
if (!room) {
|
if (it == elementMap.end()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//API hook
|
|
||||||
lua_getglobal(luaState, TORTUGA_ROOM_NAME);
|
|
||||||
lua_getfield(luaState, -1, "Unload");
|
|
||||||
lua_pushlightuserdata(luaState, room);
|
|
||||||
if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
|
||||||
}
|
|
||||||
lua_pop(luaState, 1);
|
|
||||||
|
|
||||||
//free the memory
|
//free the memory
|
||||||
delete room;
|
elementMap.erase(uid);
|
||||||
roomMap.erase(uid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RoomData* RoomManager::GetRoom(int uid) {
|
void RoomManager::Delete(int uid) {
|
||||||
return FindRoom(uid);
|
//TODO: RoomManager::Delete(int uid)
|
||||||
//TODO: expand this to auto-create the room
|
//NOTE: aliased to RoomManager::Unload(int uid)
|
||||||
}
|
Unload(uid);
|
||||||
|
|
||||||
RoomData* RoomManager::FindRoom(int uid) {
|
|
||||||
std::map<int, RoomData*>::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::UnloadAll() {
|
void RoomManager::UnloadAll() {
|
||||||
lua_getglobal(luaState, TORTUGA_ROOM_NAME);
|
elementMap.clear();
|
||||||
|
}
|
||||||
|
|
||||||
for (auto& it : roomMap) {
|
void RoomManager::UnloadIf(std::function<bool(std::pair<const int,RoomData>)> fn) {
|
||||||
//API hook
|
std::map<int, RoomData>::iterator it = elementMap.begin();
|
||||||
lua_getfield(luaState, -1, "Unload");
|
while (it != elementMap.end()) {
|
||||||
lua_pushlightuserdata(luaState, it.second);
|
if (fn(*it)) {
|
||||||
if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) {
|
it = elementMap.erase(it);
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
}
|
||||||
|
else {
|
||||||
|
++it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
lua_pop(luaState, 1);
|
RoomData* RoomManager::Get(int uid) {
|
||||||
roomMap.clear();
|
std::map<int, RoomData>::iterator it = elementMap.find(uid);
|
||||||
}
|
|
||||||
|
if (it == elementMap.end()) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RoomManager::GetLoadedCount() {
|
||||||
|
return elementMap.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
int RoomManager::GetTotalCount() {
|
||||||
|
return elementMap.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<int, RoomData>* RoomManager::GetContainer() {
|
||||||
|
return &elementMap;
|
||||||
|
}
|
||||||
|
|||||||
@@ -24,28 +24,34 @@
|
|||||||
|
|
||||||
#include "room_data.hpp"
|
#include "room_data.hpp"
|
||||||
#include "singleton.hpp"
|
#include "singleton.hpp"
|
||||||
|
#include "manager_interface.hpp"
|
||||||
|
|
||||||
#include "lua/lua.hpp"
|
#include "lua/lua.hpp"
|
||||||
|
|
||||||
#include <map>
|
class RoomManager:
|
||||||
|
public Singleton<RoomManager>,
|
||||||
class RoomManager : public Singleton<RoomManager> {
|
public ManagerInterface<RoomData>
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
//public access methods
|
//common public methods
|
||||||
int CreateRoom();
|
int Create() override;
|
||||||
void UnloadRoom(int uid);
|
int Load() override;
|
||||||
|
int Save(int uid) override;
|
||||||
|
void Unload(int uid) override;
|
||||||
|
void Delete(int uid) override;
|
||||||
|
|
||||||
RoomData* GetRoom(int uid);
|
void UnloadAll() override;
|
||||||
RoomData* FindRoom(int uid);
|
void UnloadIf(std::function<bool(std::pair<const int,RoomData>)> fn) override;
|
||||||
int PushRoom(RoomData*);
|
|
||||||
|
|
||||||
void UnloadAll();
|
|
||||||
|
|
||||||
//accessors and mutators
|
//accessors and mutators
|
||||||
std::map<int, RoomData*>* GetContainer() { return &roomMap; }
|
RoomData* Get(int uid) override;
|
||||||
|
int GetLoadedCount() override;
|
||||||
|
int GetTotalCount() override;
|
||||||
|
std::map<int, RoomData>* GetContainer() override;
|
||||||
|
|
||||||
lua_State* SetLuaState(lua_State* L) { return luaState = L; }
|
//hooks
|
||||||
lua_State* GetLuaState() { return luaState; }
|
lua_State* SetLuaState(lua_State* L) { return lua = L; }
|
||||||
|
lua_State* GetLuaState() { return lua; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend Singleton<RoomManager>;
|
friend Singleton<RoomManager>;
|
||||||
@@ -53,8 +59,7 @@ private:
|
|||||||
RoomManager() = default;
|
RoomManager() = default;
|
||||||
~RoomManager() = default;
|
~RoomManager() = default;
|
||||||
|
|
||||||
std::map<int, RoomData*> roomMap;
|
lua_State* lua = nullptr;
|
||||||
lua_State* luaState = nullptr;
|
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -23,34 +23,34 @@
|
|||||||
|
|
||||||
#include "room_manager.hpp"
|
#include "room_manager.hpp"
|
||||||
|
|
||||||
#include <string>
|
int createRoom(lua_State* L) {
|
||||||
|
//create & get the room
|
||||||
|
RoomManager& roomMgr = RoomManager::GetSingleton();
|
||||||
|
int uid = roomMgr.Create();
|
||||||
|
RoomData* room = roomMgr.Get(uid);
|
||||||
|
|
||||||
static int getRoom(lua_State* L) {
|
//setup the room
|
||||||
//find, push and return the room
|
//TODO: room parameters only set via lua, fix this
|
||||||
RoomData* room = RoomManager::GetSingleton().GetRoom(lua_tointeger(L, -2));
|
room->SetRoomName(lua_tostring(L, 1));
|
||||||
lua_pushlightuserdata(L, reinterpret_cast<void*>(room));
|
room->SetTilesetName(lua_tostring(L, 2));
|
||||||
return 1;
|
|
||||||
|
//return room, uid
|
||||||
|
lua_pushlightuserdata(L, static_cast<void*>(room));
|
||||||
|
lua_pushinteger(L, uid);
|
||||||
|
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int createRoom(lua_State* L) {
|
int unloadRoom(lua_State* L) {
|
||||||
//TODO: check parameter count for the glue functions
|
//TODO: check authorization for room deletion
|
||||||
|
RoomManager& roomMgr = RoomManager::GetSingleton();
|
||||||
//create, find and return the room
|
roomMgr.Unload(lua_tointeger(L, 1));
|
||||||
int uid = RoomManager::GetSingleton().CreateRoom();
|
|
||||||
lua_pushlightuserdata(L, RoomManager::GetSingleton().FindRoom(uid));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int unloadRoom(lua_State* L) {
|
|
||||||
//unload the specified room
|
|
||||||
RoomManager::GetSingleton().UnloadRoom(lua_tointeger(L, -2));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const luaL_Reg roomManagerLib[] = {
|
static const luaL_Reg roomManagerLib[] = {
|
||||||
{"GetRoom",getRoom},
|
{"CreateRoom", createRoom},
|
||||||
{"CreateRoom",createRoom},
|
{"UnloadRoom", unloadRoom},
|
||||||
{"UnloadRoom",unloadRoom},
|
|
||||||
{nullptr, nullptr}
|
{nullptr, nullptr}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) {
|
|||||||
newPacket.y = argPacket->y;
|
newPacket.y = argPacket->y;
|
||||||
|
|
||||||
//BUG: possibly related to #35
|
//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
|
//send the content
|
||||||
network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
|
network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
|
||||||
|
|||||||
@@ -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 <functional>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
template<typename T, typename... Arguments>
|
||||||
|
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<bool(std::pair<const int, T>)> 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<int, T>* GetContainer() = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ManagerInterface() = default;
|
||||||
|
~ManagerInterface() = default;
|
||||||
|
|
||||||
|
//members
|
||||||
|
std::map<int, T> elementMap;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user