mirror of
https://github.com/OpenFusionProject/OpenFusion.git
synced 2024-12-22 19:30:05 +00:00
added heartbeat support
This commit is contained in:
parent
b2325eb308
commit
24d30a05bf
2
Makefile
2
Makefile
@ -5,7 +5,7 @@ CC = clang++ # using GNU C++ compiler
|
||||
WIN_CC = x86_64-w64-mingw32-g++ # using GNU C++ compiler
|
||||
|
||||
# -w suppresses all warnings (the part that's commented out helps me find memory leaks, it ruins performance though!)
|
||||
COMPILER_FLAGS = -std=c++17 -o3 -static #-g3 -fsanitize=address
|
||||
COMPILER_FLAGS = -std=c++17 -o3 -g3 -fsanitize=address
|
||||
WIN_COMPILER_FLAGS = -std=c++17 -o3 -static #-g3 -fsanitize=address
|
||||
|
||||
#LINKER_FLAGS specifies the libraries we're linking against (NONE, this is a single header library.)
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "CNProtocol.hpp"
|
||||
#include "CNStructs.hpp"
|
||||
|
||||
// ========================================================[[ CNSocketEncryption ]]========================================================
|
||||
|
||||
@ -228,8 +229,12 @@ void CNServer::init() {
|
||||
}
|
||||
}
|
||||
|
||||
CNServer::CNServer() {};
|
||||
CNServer::CNServer(uint16_t p): port(p) {}
|
||||
CNServer::CNServer() {
|
||||
lastTimer = getTime();
|
||||
};
|
||||
CNServer::CNServer(uint16_t p): port(p) {
|
||||
lastTimer = getTime();
|
||||
}
|
||||
|
||||
void CNServer::start() {
|
||||
std::cout << "Starting server at *:" << port << std::endl;
|
||||
@ -274,6 +279,11 @@ void CNServer::start() {
|
||||
}
|
||||
}
|
||||
|
||||
if (getTime() - lastTimer > 2000) { // every 2 seconds call the onTimer method
|
||||
onTimer();
|
||||
lastTimer = getTime();
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
Sleep(0);
|
||||
#else
|
||||
@ -302,4 +312,5 @@ void CNServer::kill() {
|
||||
connections.clear();
|
||||
}
|
||||
|
||||
void CNServer::killConnection(CNSocket* cns) {} // stubbed lol
|
||||
void CNServer::killConnection(CNSocket* cns) {} // stubbed lol
|
||||
void CNServer::onTimer() {} // stubbed lol
|
||||
|
@ -124,6 +124,7 @@ public:
|
||||
class CNServer {
|
||||
protected:
|
||||
std::list<CNSocket*> connections;
|
||||
std::mutex activeCrit;
|
||||
|
||||
SOCKET sock;
|
||||
uint16_t port;
|
||||
@ -132,7 +133,7 @@ protected:
|
||||
void init();
|
||||
|
||||
bool active = true;
|
||||
std::mutex activeCrit;
|
||||
long int lastTimer;
|
||||
|
||||
public:
|
||||
PacketHandler pHandler;
|
||||
@ -143,6 +144,7 @@ public:
|
||||
void start();
|
||||
void kill();
|
||||
virtual void killConnection(CNSocket* cns);
|
||||
virtual void onTimer(); // called every 2 seconds
|
||||
};
|
||||
|
||||
#endif
|
@ -29,4 +29,21 @@ void CNShardServer::killConnection(CNSocket* cns) {
|
||||
PlayerManager::removePlayer(cns);
|
||||
|
||||
CNSharedData::erasePlayer(cachedPlr.SerialKey);
|
||||
}
|
||||
|
||||
void CNShardServer::onTimer() {
|
||||
long int currTime = getTime();
|
||||
|
||||
auto cachedPlayers = PlayerManager::players;
|
||||
|
||||
for (auto pair : cachedPlayers) {
|
||||
if (pair.second.lastHeartbeat != 0 && currTime - pair.second.lastHeartbeat > 4000) { // if the client hadn't responded in 4 seconds, its a dead connection so throw it out
|
||||
pair.first->kill();
|
||||
continue;
|
||||
}
|
||||
|
||||
// passed the heartbeat, send another
|
||||
sP_FE2CL_REQ_LIVE_CHECK* data = (sP_FE2CL_REQ_LIVE_CHECK*)xmalloc(sizeof(sP_FE2CL_REQ_LIVE_CHECK));
|
||||
pair.first->sendPacket(new CNPacketData((void*)data, P_FE2CL_REQ_LIVE_CHECK, sizeof(sP_FE2CL_REQ_LIVE_CHECK), pair.first->getFEKey()));
|
||||
}
|
||||
}
|
@ -9,6 +9,7 @@ enum SHARDPACKETID {
|
||||
// client 2 shard
|
||||
P_CL2FE_REQ_PC_ENTER = 318767105,
|
||||
P_CL2FE_REQ_PC_LOADING_COMPLETE = 318767245,
|
||||
P_CL2FE_REP_LIVE_CHECK = 318767221,
|
||||
P_CL2FE_REQ_PC_MOVE = 318767107,
|
||||
P_CL2FE_REQ_PC_STOP = 318767108,
|
||||
P_CL2FE_REQ_PC_JUMP = 318767109,
|
||||
@ -21,6 +22,7 @@ enum SHARDPACKETID {
|
||||
// shard 2 client
|
||||
P_FE2CL_REP_PC_ENTER_SUCC = 822083586,
|
||||
P_FE2CL_REP_PC_LOADING_COMPLETE_SUCC = 822083833,
|
||||
P_FE2CL_REQ_LIVE_CHECK = 822083792,
|
||||
P_FE2CL_PC_NEW = 822083587,
|
||||
P_FE2CL_PC_MOVE = 822083592,
|
||||
P_FE2CL_PC_STOP = 822083593,
|
||||
@ -44,6 +46,7 @@ public:
|
||||
CNShardServer(uint16_t p);
|
||||
|
||||
void killConnection(CNSocket* cns);
|
||||
void onTimer();
|
||||
};
|
||||
|
||||
#endif
|
@ -336,11 +336,14 @@ struct sP_CL2FE_REQ_PC_ENTER {
|
||||
int64_t iEnterSerialKey;
|
||||
};
|
||||
|
||||
|
||||
struct sP_CL2FE_REQ_PC_LOADING_COMPLETE {
|
||||
int32_t iPC_ID;
|
||||
};
|
||||
|
||||
struct sP_CL2FE_REP_LIVE_CHECK {
|
||||
int32_t iTempValue;
|
||||
};
|
||||
|
||||
struct sP_CL2FE_REQ_PC_MOVE {
|
||||
uint64_t iCliTime;
|
||||
int32_t iX;
|
||||
@ -429,6 +432,10 @@ struct sP_FE2CL_REP_PC_LOADING_COMPLETE_SUCC {
|
||||
int32_t iPC_ID;
|
||||
};
|
||||
|
||||
struct sP_FE2CL_REQ_LIVE_CHECK {
|
||||
int32_t iTempValue;
|
||||
};
|
||||
|
||||
// literally just a wrapper for a sPCAppearanceData struct :/
|
||||
struct sP_FE2CL_PC_NEW {
|
||||
sPCAppearanceData PCAppearanceData;
|
||||
|
@ -21,12 +21,14 @@ void PlayerManager::init() {
|
||||
REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_MOVEPLATFORM, PlayerManager::movePlatformPlayer);
|
||||
REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_GOTO, PlayerManager::gotoPlayer);
|
||||
REGISTER_SHARD_PACKET(P_CL2FE_GM_REQ_PC_SET_VALUE, PlayerManager::setSpecialPlayer);
|
||||
REGISTER_SHARD_PACKET(P_CL2FE_REP_LIVE_CHECK, PlayerManager::heartbeatPlayer);
|
||||
}
|
||||
|
||||
void PlayerManager::addPlayer(CNSocket* key, Player plr) {
|
||||
players[key] = PlayerView();
|
||||
players[key].viewable = std::list<CNSocket*>();
|
||||
players[key].plr = plr;
|
||||
players[key].lastHeartbeat = 0;
|
||||
|
||||
std::cout << U16toU8(plr.PCStyle.szFirstName) << U16toU8(plr.PCStyle.szLastName) << " has joined!" << std::endl;
|
||||
std::cout << players.size() << " players" << std::endl;
|
||||
@ -384,4 +386,8 @@ void PlayerManager::setSpecialPlayer(CNSocket* sock, CNPacketData* data) {
|
||||
response->iSetValueType = setData->iSetValueType;
|
||||
|
||||
sock->sendPacket(new CNPacketData((void*)response, P_FE2CL_GM_REP_PC_SET_VALUE, sizeof(sP_FE2CL_GM_REP_PC_SET_VALUE), sock->getFEKey()));
|
||||
}
|
||||
|
||||
void PlayerManager::heartbeatPlayer(CNSocket* sock, CNPacketData* data) {
|
||||
players[sock].lastHeartbeat = getTime();
|
||||
}
|
@ -12,6 +12,7 @@
|
||||
struct PlayerView {
|
||||
std::list<CNSocket*> viewable;
|
||||
Player plr;
|
||||
int long lastHeartbeat;
|
||||
};
|
||||
|
||||
|
||||
@ -33,7 +34,7 @@ namespace PlayerManager {
|
||||
void movePlatformPlayer(CNSocket* sock, CNPacketData* data);
|
||||
void gotoPlayer(CNSocket* sock, CNPacketData* data);
|
||||
void setSpecialPlayer(CNSocket* sock, CNPacketData* data);
|
||||
|
||||
void heartbeatPlayer(CNSocket* sock, CNPacketData* data);
|
||||
}
|
||||
|
||||
#endif
|
@ -30,8 +30,8 @@ int main() {
|
||||
ChatManager::init();
|
||||
|
||||
std::cout << "[INFO] Starting Server Threads..." << std::endl;
|
||||
CNShardServer loginServer(settings::LOGINPORT);
|
||||
CNLoginServer shardServer(settings::SHARDPORT);
|
||||
CNLoginServer loginServer(settings::LOGINPORT);
|
||||
CNShardServer shardServer(settings::SHARDPORT);
|
||||
|
||||
std::thread shardThread(startShard, (CNShardServer*)&shardServer);
|
||||
|
||||
|
@ -8,7 +8,7 @@ bool settings::LOGINRANDCHARACTERS = false;
|
||||
|
||||
int settings::SHARDPORT = 8002;
|
||||
std::string settings::SHARDSERVERIP = "127.0.0.1";
|
||||
int settings::VIEWDISTANCE = 25000;
|
||||
int settings::VIEWDISTANCE = 20000;
|
||||
|
||||
// default spawn point is city hall
|
||||
int settings::SPAWN_X = 179213;
|
||||
|
Loading…
Reference in New Issue
Block a user