diff --git a/client/in_world.cpp b/client/in_world.cpp index 9779a71..3acad2f 100644 --- a/client/in_world.cpp +++ b/client/in_world.cpp @@ -128,9 +128,9 @@ void InWorld::RenderFrame() { } void InWorld::Render(SDL_Surface* const screen) { - //draw the map - for (auto it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); it++) { - tileSheet.DrawRegionTo(screen, *it, camera.x, camera.y); + //draw the map0 + for (std::list::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); it++) { + tileSheet.DrawRegionTo(screen, &(*it), camera.x, camera.y); } //draw characters @@ -343,6 +343,9 @@ void InWorld::HandleRegionContent(RegionPacket* const argPacket) { //replace existing regions regionPager.UnloadRegion(argPacket->x, argPacket->y); regionPager.PushRegion(argPacket->region); + + //clean up after the serial code + delete argPacket->region; argPacket->region = nullptr; } @@ -431,13 +434,13 @@ void InWorld::UpdateMap() { int yEnd = snapToBase(REGION_HEIGHT, (camera.y+camera.height)/tileSheet.GetTileH()) + REGION_HEIGHT; //prune distant regions - for (auto it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); /* EMPTY */) { + for (std::list::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); /* EMPTY */) { //check if the region is outside off this area - if ((*it)->GetX() < xStart || (*it)->GetX() > xEnd || (*it)->GetY() < yStart || (*it)->GetY() > yEnd) { + if (it->GetX() < xStart || it->GetX() > xEnd || it->GetY() < yStart || it->GetY() > yEnd) { //clunky, but the alternative was time consuming - int tmpX = (*it)->GetX(); - int tmpY = (*it)->GetY(); + int tmpX = it->GetX(); + int tmpY = it->GetY(); ++it; regionPager.UnloadRegion(tmpX, tmpY); diff --git a/client/in_world.hpp b/client/in_world.hpp index 526c72a..156d35e 100644 --- a/client/in_world.hpp +++ b/client/in_world.hpp @@ -23,7 +23,7 @@ #define INWORLD_HPP_ //maps -#include "region_pager.hpp" +#include "region_pager_base.hpp" //networking #include "udp_network_utility.hpp" @@ -110,7 +110,7 @@ protected: TileSheet tileSheet; //map - RegionPager regionPager; + RegionPagerBase regionPager; //UI Button disconnectButton; diff --git a/common/map/region_pager_base.cpp b/common/map/region_pager_base.cpp index a403c65..a8ad76f 100644 --- a/common/map/region_pager_base.cpp +++ b/common/map/region_pager_base.cpp @@ -54,6 +54,11 @@ Region* RegionPagerBase::FindRegion(int x, int y) { return it != regionList.end() ? &(*it) : nullptr; } +Region* RegionPagerBase::PushRegion(Region* const ptr) { + regionList.push_front(*ptr); + return ®ionList.front(); +} + Region* RegionPagerBase::LoadRegion(int x, int y) { //TODO: load the region if possible return nullptr; diff --git a/common/map/region_pager_base.hpp b/common/map/region_pager_base.hpp index 3f7881c..004faa4 100644 --- a/common/map/region_pager_base.hpp +++ b/common/map/region_pager_base.hpp @@ -38,6 +38,7 @@ public: //region manipulation virtual Region* GetRegion(int x, int y); virtual Region* FindRegion(int x, int y); + virtual Region* PushRegion(Region* const); virtual Region* LoadRegion(int x, int y); virtual Region* SaveRegion(int x, int y); diff --git a/server/account_manager.cpp b/server/account_manager.cpp index 2a5a968..c29bd29 100644 --- a/server/account_manager.cpp +++ b/server/account_manager.cpp @@ -36,16 +36,6 @@ static const char* DELETE_USER_ACCOUNT = "DELETE FROM Accounts WHERE uid = ?;"; //Define the public methods //------------------------- -AccountManager::AccountManager() { - // -} - -AccountManager::~AccountManager() { - for (auto& it : accountMap) { - SaveAccount(it.first); - } -} - int AccountManager::CreateAccount(std::string username, int clientIndex) { //create this user account, failing if it exists, leave this account in memory sqlite3_stmt* statement = nullptr; @@ -202,6 +192,13 @@ void AccountManager::DeleteAccount(int uid) { accountMap.erase(uid); } +void AccountManager::UnloadAll() { + for (auto& it : accountMap) { + SaveAccount(it.first); + } + accountMap.clear(); +} + //------------------------- //Define the accessors and mutators //------------------------- @@ -226,4 +223,4 @@ sqlite3* AccountManager::SetDatabase(sqlite3* db) { sqlite3* AccountManager::GetDatabase() { return database; -} \ No newline at end of file +} diff --git a/server/account_manager.hpp b/server/account_manager.hpp index 5bf3841..7c6cc1f 100644 --- a/server/account_manager.hpp +++ b/server/account_manager.hpp @@ -30,8 +30,8 @@ class AccountManager { public: - AccountManager(); - ~AccountManager(); + AccountManager() = default; + ~AccountManager() { UnloadAll(); }; //public access methods int CreateAccount(std::string username, int clientIndex); @@ -40,6 +40,8 @@ public: void UnloadAccount(int uid); void DeleteAccount(int uid); + void UnloadAll(); + //accessors and mutators AccountData* GetAccount(int uid); std::map* GetContainer(); diff --git a/server/character_manager.cpp b/server/character_manager.cpp index 0a1d4d7..21eb99a 100644 --- a/server/character_manager.cpp +++ b/server/character_manager.cpp @@ -58,16 +58,6 @@ static const char* DELETE_CHARACTER = "DELETE FROM Characters WHERE uid = ?;"; //Define the methods //------------------------- -CharacterManager::CharacterManager() { - // -} - -CharacterManager::~CharacterManager() { - for (auto& it : characterMap) { - SaveCharacter(it.first); - } -} - //TODO: default stats as a parameter? This would be good for differing beggining states or multiple classes int CharacterManager::CreateCharacter(int owner, std::string handle, std::string avatar) { //Create the character, failing if it exists @@ -294,6 +284,13 @@ void CharacterManager::UnloadCharacterIf(std::function::iterator)> f); + void UnloadAll(); + //accessors and mutators CharacterData* GetCharacter(int uid); std::map* GetContainer(); diff --git a/server/room_data.hpp b/server/room_data.hpp index c37bbae..cf1b6cb 100644 --- a/server/room_data.hpp +++ b/server/room_data.hpp @@ -23,7 +23,7 @@ #define ROOMDATA_HPP_ //map system -#include "region_pager.hpp" +#include "region_pager_lua.hpp" struct RoomData { enum class RoomType { @@ -35,7 +35,7 @@ struct RoomData { }; //members - RegionPager pager; + RegionPagerLua pager; RoomType type; //TODO: collision map diff --git a/server/server_application.cpp b/server/server_application.cpp index 621f129..12c740f 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -151,6 +151,14 @@ void ServerApplication::Proc() { void ServerApplication::Quit() { std::cout << "Shutting down" << std::endl; + //close the managers + clientMap.clear(); + accountMgr.UnloadAll(); + characterMgr.UnloadAll(); + //TODO: unload combats + //TODO: unload enemies + //TODO: unload rooms + //APIs lua_close(luaState); sqlite3_close_v2(database);