Heartbeats

This commit is contained in:
momo5502 2015-12-30 00:13:12 +01:00
parent 1d81fd35be
commit 7798f1e20e
5 changed files with 80 additions and 9 deletions

View File

@ -3,6 +3,7 @@
namespace Components
{
Dvar::Var Dedicated::Dedi;
std::vector<Dedicated::Callback> Dedicated::FrameCallbacks;
bool Dedicated::IsDedicated()
{
@ -97,6 +98,37 @@ namespace Components
}
}
void Dedicated::Heartbeat()
{
int masterPort = Dvar::Var("masterPort").Get<int>();
const char* masterServerName = Dvar::Var("masterServerName").Get<const char*>();
Network::Address master(Utils::VA("%s:%u", masterServerName, masterPort));
Logger::Print("Sending heartbeat to master: %s:%u\n", masterServerName, masterPort);
Network::Send(master, Utils::VA("heartbeat %s\n", "IW4"));
}
void Dedicated::OnFrame(Dedicated::Callback callback)
{
Dedicated::FrameCallbacks.push_back(callback);
}
void Dedicated::FrameStub()
{
for (auto callback : Dedicated::FrameCallbacks)
{
callback();
}
__asm
{
mov eax, 5A8E80h
call eax
}
}
Dedicated::Dedicated()
{
Dedicated::Dedi = Dvar::Register<int>("dedicated", 0, 0, 2, Game::dvar_flag::DVAR_FLAG_SERVERINFO | Game::dvar_flag::DVAR_FLAG_WRITEPROTECTED, "Start as dedicated");
@ -159,12 +191,12 @@ namespace Components
// Map rotation
Utils::Hook::Set(0x4152E8, Dedicated::MapRotate);
// Dedicated frame handler
Utils::Hook(0x4B0F81, Dedicated::FrameStub, HOOK_CALL).Install()->Quick();
// isHost script call return 0
Utils::Hook::Set<DWORD>(0x5DEC04, 0);
// map_rotate func
//*(DWORD*)0x4152E8 = (DWORD)SV_MapRotate_f;
// sv_network_fps max 1000, and uncheat
Utils::Hook::Set<BYTE>(0x4D3C67, 0); // ?
Utils::Hook::Set<DWORD>(0x4D3C69, 1000);
@ -180,6 +212,23 @@ namespace Components
// stop saving a config_mp.cfg
Utils::Hook::Set<BYTE>(0x60B240, 0xC3);
// Heartbeats
Dedicated::OnFrame([] ()
{
static int LastHeartbeat = 0;
if (Dvar::Var("sv_maxclients").Get<int>() > 0 && !LastHeartbeat || (Game::Com_Milliseconds() - LastHeartbeat) > 120 * 1000)
{
LastHeartbeat = Game::Com_Milliseconds();
Dedicated::Heartbeat();
}
});
}
}
Dedicated::~Dedicated()
{
Dedicated::FrameCallbacks.clear();
}
}

View File

@ -3,16 +3,24 @@ namespace Components
class Dedicated : public Component
{
public:
typedef void(*Callback)();
Dedicated();
~Dedicated();
const char* GetName() { return "Dedicated"; };
static bool IsDedicated();
static void Heartbeat();
static void OnFrame(Callback callback);
private:
static Dvar::Var Dedi;
static std::vector<Callback> FrameCallbacks;
static void MapRotate();
static void FrameStub();
static void InitDedicatedServer();
};
}

View File

@ -475,6 +475,8 @@ namespace Components
Menus::Menus()
{
if (Dedicated::IsDedicated()) return;
AssetHandler::OnFind(Game::XAssetType::ASSET_TYPE_MENUFILE, Menus::MenuFileLoad);
//Utils::Hook(0x63FE80, Menus::MenuFileLoad, HOOK_JUMP).Install()->Quick();

View File

@ -140,7 +140,14 @@ namespace Components
{
int clientCount = 0;
for (int i = 0; i < *Game::svs_numclients; i++)
int maxClients = *Game::svs_numclients;
if (!maxClients)
{
maxClients = Dvar::Var("sv_maxclients").Get<int>();
}
for (int i = 0; i < maxClients; i++)
{
if (Game::svs_clients[i].state >= 3)
{
@ -157,7 +164,9 @@ namespace Components
info.Set("fs_game", Dvar::Var("fs_game").Get<const char*>());
info.Set("xuid", Utils::VA("%llX", Steam::SteamUser()->GetSteamID().Bits));
info.Set("clients", Utils::VA("%i", clientCount));
info.Set("sv_maxclients", Utils::VA("%i", *Game::svs_numclients));
info.Set("sv_maxclients", Utils::VA("%i", maxClients));
info.Set("protocol", Utils::VA("%i", PROTOCOL));
info.Set("checksum", Utils::VA("%d", Game::Com_Milliseconds()));
// Set matchtype
// 0 - No match, connecting not possible
@ -177,7 +186,7 @@ namespace Components
info.Set("matchtype", "0");
}
Network::Send(address, Utils::VA("infoResponse\n%s\n", info.Build().data()));
Network::Send(address, Utils::VA("infoResponse\n\\%s\n", info.Build().data()));
});
Network::Handle("infoResponse", [] (Network::Address address, std::string data)

View File

@ -84,7 +84,7 @@ namespace Components
Logger::Print("Sending serverlist request to master: %s:%u\n", masterServerName, masterPort);
Network::Send(ServerList::RefreshContainer.Host, "getservers IW4 145 full empty");
Network::Send(ServerList::RefreshContainer.Host, Utils::VA("getservers IW4 %i full empty", PROTOCOL));
//Network::Send(ServerList::RefreshContainer.Host, "getservers 0 full empty\n");
}
@ -129,7 +129,10 @@ namespace Components
}
}
ServerList::OnlineList.push_back(server);
if (server.MatchType)
{
ServerList::OnlineList.push_back(server);
}
ServerList::RefreshContainer.Servers.erase(i);