From db40f198be26e659f31364b104e165b74ac43012 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Tue, 30 Sep 2014 02:01:56 +1000 Subject: [PATCH] Moved heartbeat code to ServerApplication::CheckClientConnections() --- rsc/scripts/map_saver.lua | 0 rsc/scripts/setup_room.lua | 0 rsc/scripts/setup_server.lua | 3 ++- server/rooms/room_data.hpp | 6 ++++++ server/server_application.hpp | 1 + server/server_logic.cpp | 17 +---------------- server/server_methods.cpp | 19 +++++++++++++++++++ 7 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 rsc/scripts/map_saver.lua create mode 100644 rsc/scripts/setup_room.lua diff --git a/rsc/scripts/map_saver.lua b/rsc/scripts/map_saver.lua new file mode 100644 index 0000000..e69de29 diff --git a/rsc/scripts/setup_room.lua b/rsc/scripts/setup_room.lua new file mode 100644 index 0000000..e69de29 diff --git a/rsc/scripts/setup_server.lua b/rsc/scripts/setup_server.lua index 7190910..78a9b32 100644 --- a/rsc/scripts/setup_server.lua +++ b/rsc/scripts/setup_server.lua @@ -1,10 +1,11 @@ print("Lua script check") mapMaker = require "map_maker" +mapSaver = require "map_saver" --BUG: #35 The server fails without at least one room --TODO: Create rooms with names? -newRoom = RoomManager.CreateRoom() +newRoom = RoomManager.CreateRoom("overworld", "overworld.bmp") pager = Room.GetPager(newRoom) RegionPager.SetOnCreate(pager, mapMaker.debugIsland) diff --git a/server/rooms/room_data.hpp b/server/rooms/room_data.hpp index 539a56e..1ced1be 100644 --- a/server/rooms/room_data.hpp +++ b/server/rooms/room_data.hpp @@ -25,6 +25,8 @@ //map system #include "region_pager_lua.hpp" +#include + class RoomData { public: RoomData() = default; @@ -33,11 +35,15 @@ public: //accessors and mutators RegionPagerLua* GetPager() { return &pager; } + std::string SetTilesetName(std::string s) { return tilesetName = s; } + std::string GetTilesetName() { return tilesetName; } + private: friend class RoomManager; //members RegionPagerLua pager; + std::string tilesetName; }; #endif diff --git a/server/server_application.hpp b/server/server_application.hpp index 3337588..8e1b200 100644 --- a/server/server_application.hpp +++ b/server/server_application.hpp @@ -80,6 +80,7 @@ private: void HandleSynchronize(ClientPacket* const); //utility methods + void CheckClientConnections(); //TODO: a function that only sends to characters in a certain proximity void CleanupLostConnection(int index); void PumpPacket(SerialPacket* const); diff --git a/server/server_logic.cpp b/server/server_logic.cpp index 6e45929..08aa8c1 100644 --- a/server/server_logic.cpp +++ b/server/server_logic.cpp @@ -168,23 +168,8 @@ void ServerApplication::Proc() { //update the internals //... - //TODO: This could be checked only every few seconds //Check connections - for (auto& it : clientMap) { - if (std::chrono::steady_clock::now() - it.second.GetLastBeat() > std::chrono::seconds(3)) { - ServerPacket newPacket; - newPacket.type = SerialPacketType::PING; - network.SendTo(it.second.GetAddress(), &newPacket); - it.second.IncrementAttempts(); - } - - if (it.second.GetAttempts() > 2) { - CleanupLostConnection(it.first); - - //all iterators are invalid, so we can't continue - break; - } - } + CheckClientConnections(); //give the computer a break SDL_Delay(10); diff --git a/server/server_methods.cpp b/server/server_methods.cpp index bf77776..5501d15 100644 --- a/server/server_methods.cpp +++ b/server/server_methods.cpp @@ -21,6 +21,7 @@ */ #include "server_application.hpp" +#include #include //------------------------- @@ -159,6 +160,7 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) { newPacket.x = argPacket->x; newPacket.y = argPacket->y; + //BUG: possibly related to #35 newPacket.region = roomMgr.GetRoom(argPacket->roomIndex)->GetPager()->GetRegion(argPacket->x, argPacket->y); //send the content @@ -280,6 +282,23 @@ void ServerApplication::HandleSynchronize(ClientPacket* const argPacket) { //utility methods //------------------------- +void ServerApplication::CheckClientConnections() { + for (auto& it : clientMap) { + if (std::chrono::steady_clock::now() - it.second.GetLastBeat() > std::chrono::seconds(3)) { + ServerPacket newPacket; + newPacket.type = SerialPacketType::PING; + network.SendTo(it.second.GetAddress(), &newPacket); + it.second.IncrementAttempts(); + } + + if (it.second.GetAttempts() > 2) { + CleanupLostConnection(it.first); + //all iterators are invalid, so we can't continue + break; + } + } +} + void ServerApplication::CleanupLostConnection(int clientIndex) { //NOTE: This assumes each player has only one account and character at a time //TODO: handle multiple characters (bots, etc.)