mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-20 09:34:19 +00:00
Merge pull request #6744 from Zwelf/pr-fix-teehistorian-mapchange
Fix JoinVer and Join teehistorian chunks missing in some conditions
This commit is contained in:
commit
1f13a693a5
|
@ -329,8 +329,9 @@ public:
|
||||||
virtual void OnSetAuthed(int ClientID, int Level) = 0;
|
virtual void OnSetAuthed(int ClientID, int Level) = 0;
|
||||||
virtual bool PlayerExists(int ClientID) const = 0;
|
virtual bool PlayerExists(int ClientID) const = 0;
|
||||||
|
|
||||||
virtual void OnClientEngineJoin(int ClientID, bool Sixup) = 0;
|
virtual void TeehistorianRecordPlayerJoin(int ClientID, bool Sixup) = 0;
|
||||||
virtual void OnClientEngineDrop(int ClientID, const char *pReason) = 0;
|
virtual void TeehistorianRecordPlayerDrop(int ClientID, const char *pReason) = 0;
|
||||||
|
virtual void TeehistorianRecordPlayerRejoin(int ClientID) = 0;
|
||||||
|
|
||||||
virtual void FillAntibot(CAntibotRoundData *pData) = 0;
|
virtual void FillAntibot(CAntibotRoundData *pData) = 0;
|
||||||
|
|
||||||
|
|
|
@ -1060,6 +1060,10 @@ int CServer::ClientRejoinCallback(int ClientID, void *pUser)
|
||||||
|
|
||||||
pThis->m_aClients[ClientID].Reset();
|
pThis->m_aClients[ClientID].Reset();
|
||||||
|
|
||||||
|
pThis->GameServer()->TeehistorianRecordPlayerRejoin(ClientID);
|
||||||
|
pThis->Antibot()->OnEngineClientDrop(ClientID, "rejoin");
|
||||||
|
pThis->Antibot()->OnEngineClientJoin(ClientID, false);
|
||||||
|
|
||||||
pThis->SendMap(ClientID);
|
pThis->SendMap(ClientID);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1085,6 +1089,9 @@ int CServer::NewClientNoAuthCallback(int ClientID, void *pUser)
|
||||||
pThis->m_aClients[ClientID].m_DDNetVersionSettled = false;
|
pThis->m_aClients[ClientID].m_DDNetVersionSettled = false;
|
||||||
pThis->m_aClients[ClientID].Reset();
|
pThis->m_aClients[ClientID].Reset();
|
||||||
|
|
||||||
|
pThis->GameServer()->TeehistorianRecordPlayerJoin(ClientID, false);
|
||||||
|
pThis->Antibot()->OnEngineClientJoin(ClientID, false);
|
||||||
|
|
||||||
pThis->SendCapabilities(ClientID);
|
pThis->SendCapabilities(ClientID);
|
||||||
pThis->SendMap(ClientID);
|
pThis->SendMap(ClientID);
|
||||||
#if defined(CONF_FAMILY_UNIX)
|
#if defined(CONF_FAMILY_UNIX)
|
||||||
|
@ -1114,7 +1121,7 @@ int CServer::NewClientCallback(int ClientID, void *pUser, bool Sixup)
|
||||||
mem_zero(&pThis->m_aClients[ClientID].m_Addr, sizeof(NETADDR));
|
mem_zero(&pThis->m_aClients[ClientID].m_Addr, sizeof(NETADDR));
|
||||||
pThis->m_aClients[ClientID].Reset();
|
pThis->m_aClients[ClientID].Reset();
|
||||||
|
|
||||||
pThis->GameServer()->OnClientEngineJoin(ClientID, Sixup);
|
pThis->GameServer()->TeehistorianRecordPlayerJoin(ClientID, Sixup);
|
||||||
pThis->Antibot()->OnEngineClientJoin(ClientID, Sixup);
|
pThis->Antibot()->OnEngineClientJoin(ClientID, Sixup);
|
||||||
|
|
||||||
pThis->m_aClients[ClientID].m_Sixup = Sixup;
|
pThis->m_aClients[ClientID].m_Sixup = Sixup;
|
||||||
|
@ -1199,7 +1206,7 @@ int CServer::DelClientCallback(int ClientID, const char *pReason, void *pUser)
|
||||||
pThis->m_aClients[ClientID].m_Sixup = false;
|
pThis->m_aClients[ClientID].m_Sixup = false;
|
||||||
pThis->m_aClients[ClientID].m_RedirectDropTime = 0;
|
pThis->m_aClients[ClientID].m_RedirectDropTime = 0;
|
||||||
|
|
||||||
pThis->GameServer()->OnClientEngineDrop(ClientID, pReason);
|
pThis->GameServer()->TeehistorianRecordPlayerDrop(ClientID, pReason);
|
||||||
pThis->Antibot()->OnEngineClientDrop(ClientID, pReason);
|
pThis->Antibot()->OnEngineClientDrop(ClientID, pReason);
|
||||||
#if defined(CONF_FAMILY_UNIX)
|
#if defined(CONF_FAMILY_UNIX)
|
||||||
pThis->SendConnLoggingCommand(CLOSE_SESSION, pThis->m_NetServer.ClientAddr(ClientID));
|
pThis->SendConnLoggingCommand(CLOSE_SESSION, pThis->m_NetServer.ClientAddr(ClientID));
|
||||||
|
@ -2779,6 +2786,16 @@ int CServer::Run()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
UpdateServerInfo(true);
|
UpdateServerInfo(true);
|
||||||
|
for(int ClientID = 0; ClientID < MAX_CLIENTS; ClientID++)
|
||||||
|
{
|
||||||
|
if(m_aClients[ClientID].m_State != CClient::STATE_CONNECTING)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// When doing a map change, a new Teehistorian file is created. For players that are already
|
||||||
|
// on the server, no PlayerJoin event is produced in Teehistorian from the network engine.
|
||||||
|
// Record PlayerJoin events here to record the Sixup version and player join event.
|
||||||
|
GameServer()->TeehistorianRecordPlayerJoin(ClientID, m_aClients[ClientID].m_Sixup);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,3 +16,4 @@ UUID(TEEHISTORIAN_LOAD_FAILURE, "teehistorian-load-failure@ddnet.tw")
|
||||||
UUID(TEEHISTORIAN_PLAYER_TEAM, "teehistorian-player-team@ddnet.tw")
|
UUID(TEEHISTORIAN_PLAYER_TEAM, "teehistorian-player-team@ddnet.tw")
|
||||||
UUID(TEEHISTORIAN_TEAM_PRACTICE, "teehistorian-team-practice@ddnet.tw")
|
UUID(TEEHISTORIAN_TEAM_PRACTICE, "teehistorian-team-practice@ddnet.tw")
|
||||||
UUID(TEEHISTORIAN_PLAYER_READY, "teehistorian-player-ready@ddnet.tw")
|
UUID(TEEHISTORIAN_PLAYER_READY, "teehistorian-player-ready@ddnet.tw")
|
||||||
|
UUID(TEEHISTORIAN_PLAYER_REJOIN, "teehistorian-rejoinver6@ddnet.org")
|
||||||
|
|
|
@ -1660,7 +1660,7 @@ void CGameContext::OnClientDrop(int ClientID, const char *pReason)
|
||||||
Server()->ExpireServerInfo();
|
Server()->ExpireServerInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameContext::OnClientEngineJoin(int ClientID, bool Sixup)
|
void CGameContext::TeehistorianRecordPlayerJoin(int ClientID, bool Sixup)
|
||||||
{
|
{
|
||||||
if(m_TeeHistorianActive)
|
if(m_TeeHistorianActive)
|
||||||
{
|
{
|
||||||
|
@ -1668,7 +1668,7 @@ void CGameContext::OnClientEngineJoin(int ClientID, bool Sixup)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameContext::OnClientEngineDrop(int ClientID, const char *pReason)
|
void CGameContext::TeehistorianRecordPlayerDrop(int ClientID, const char *pReason)
|
||||||
{
|
{
|
||||||
if(m_TeeHistorianActive)
|
if(m_TeeHistorianActive)
|
||||||
{
|
{
|
||||||
|
@ -1676,6 +1676,14 @@ void CGameContext::OnClientEngineDrop(int ClientID, const char *pReason)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGameContext::TeehistorianRecordPlayerRejoin(int ClientID)
|
||||||
|
{
|
||||||
|
if(m_TeeHistorianActive)
|
||||||
|
{
|
||||||
|
m_TeeHistorian.RecordPlayerRejoin(ClientID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool CGameContext::OnClientDDNetVersionKnown(int ClientID)
|
bool CGameContext::OnClientDDNetVersionKnown(int ClientID)
|
||||||
{
|
{
|
||||||
IServer::CClientInfo Info;
|
IServer::CClientInfo Info;
|
||||||
|
|
|
@ -292,8 +292,9 @@ public:
|
||||||
void OnClientPredictedInput(int ClientID, void *pInput) override;
|
void OnClientPredictedInput(int ClientID, void *pInput) override;
|
||||||
void OnClientPredictedEarlyInput(int ClientID, void *pInput) override;
|
void OnClientPredictedEarlyInput(int ClientID, void *pInput) override;
|
||||||
|
|
||||||
void OnClientEngineJoin(int ClientID, bool Sixup) override;
|
void TeehistorianRecordPlayerJoin(int ClientID, bool Sixup) override;
|
||||||
void OnClientEngineDrop(int ClientID, const char *pReason) override;
|
void TeehistorianRecordPlayerDrop(int ClientID, const char *pReason) override;
|
||||||
|
void TeehistorianRecordPlayerRejoin(int ClientID) override;
|
||||||
|
|
||||||
bool IsClientReady(int ClientID) const override;
|
bool IsClientReady(int ClientID) const override;
|
||||||
bool IsClientPlayer(int ClientID) const override;
|
bool IsClientPlayer(int ClientID) const override;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
static const char TEEHISTORIAN_NAME[] = "teehistorian@ddnet.tw";
|
static const char TEEHISTORIAN_NAME[] = "teehistorian@ddnet.tw";
|
||||||
static const CUuid TEEHISTORIAN_UUID = CalculateUuid(TEEHISTORIAN_NAME);
|
static const CUuid TEEHISTORIAN_UUID = CalculateUuid(TEEHISTORIAN_NAME);
|
||||||
static const char TEEHISTORIAN_VERSION[] = "2";
|
static const char TEEHISTORIAN_VERSION[] = "2";
|
||||||
static const char TEEHISTORIAN_VERSION_MINOR[] = "4";
|
static const char TEEHISTORIAN_VERSION_MINOR[] = "5";
|
||||||
|
|
||||||
#define UUID(id, name) static const CUuid UUID_##id = CalculateUuid(name);
|
#define UUID(id, name) static const CUuid UUID_##id = CalculateUuid(name);
|
||||||
#include <engine/shared/teehistorian_ex_chunks.h>
|
#include <engine/shared/teehistorian_ex_chunks.h>
|
||||||
|
@ -508,6 +508,22 @@ void CTeeHistorian::RecordPlayerJoin(int ClientID, int Protocol)
|
||||||
Write(Buffer.Data(), Buffer.Size());
|
Write(Buffer.Data(), Buffer.Size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CTeeHistorian::RecordPlayerRejoin(int ClientID)
|
||||||
|
{
|
||||||
|
EnsureTickWritten();
|
||||||
|
|
||||||
|
CPacker Buffer;
|
||||||
|
Buffer.Reset();
|
||||||
|
Buffer.AddInt(ClientID);
|
||||||
|
|
||||||
|
if(m_Debug)
|
||||||
|
{
|
||||||
|
dbg_msg("teehistorian", "player_rejoin cid=%d", ClientID);
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteExtra(UUID_TEEHISTORIAN_PLAYER_REJOIN, Buffer.Data(), Buffer.Size());
|
||||||
|
}
|
||||||
|
|
||||||
void CTeeHistorian::RecordPlayerReady(int ClientID)
|
void CTeeHistorian::RecordPlayerReady(int ClientID)
|
||||||
{
|
{
|
||||||
EnsureTickWritten();
|
EnsureTickWritten();
|
||||||
|
|
|
@ -64,6 +64,7 @@ public:
|
||||||
void RecordPlayerInput(int ClientID, uint32_t UniqueClientID, const CNetObj_PlayerInput *pInput);
|
void RecordPlayerInput(int ClientID, uint32_t UniqueClientID, const CNetObj_PlayerInput *pInput);
|
||||||
void RecordPlayerMessage(int ClientID, const void *pMsg, int MsgSize);
|
void RecordPlayerMessage(int ClientID, const void *pMsg, int MsgSize);
|
||||||
void RecordPlayerJoin(int ClientID, int Protocol);
|
void RecordPlayerJoin(int ClientID, int Protocol);
|
||||||
|
void RecordPlayerRejoin(int ClientID);
|
||||||
void RecordPlayerReady(int ClientID);
|
void RecordPlayerReady(int ClientID);
|
||||||
void RecordPlayerDrop(int ClientID, const char *pReason);
|
void RecordPlayerDrop(int ClientID, const char *pReason);
|
||||||
void RecordConsoleCommand(int ClientID, int FlagMask, const char *pCmd, IConsole::IResult *pResult);
|
void RecordConsoleCommand(int ClientID, int FlagMask, const char *pCmd, IConsole::IResult *pResult);
|
||||||
|
|
|
@ -101,7 +101,7 @@ protected:
|
||||||
void Expect(const unsigned char *pOutput, size_t OutputSize)
|
void Expect(const unsigned char *pOutput, size_t OutputSize)
|
||||||
{
|
{
|
||||||
static CUuid TEEHISTORIAN_UUID = CalculateUuid("teehistorian@ddnet.tw");
|
static CUuid TEEHISTORIAN_UUID = CalculateUuid("teehistorian@ddnet.tw");
|
||||||
static const char PREFIX1[] = "{\"comment\":\"teehistorian@ddnet.tw\",\"version\":\"2\",\"version_minor\":\"4\",\"game_uuid\":\"a1eb7182-796e-3b3e-941d-38ca71b2a4a8\",\"server_version\":\"DDNet test\",\"start_time\":\"";
|
static const char PREFIX1[] = "{\"comment\":\"teehistorian@ddnet.tw\",\"version\":\"2\",\"version_minor\":\"5\",\"game_uuid\":\"a1eb7182-796e-3b3e-941d-38ca71b2a4a8\",\"server_version\":\"DDNet test\",\"start_time\":\"";
|
||||||
static const char PREFIX2[] = "\",\"server_name\":\"server name\",\"server_port\":\"8303\",\"game_type\":\"game type\",\"map_name\":\"Kobra 3 Solo\",\"map_size\":\"903514\",\"map_sha256\":\"0123456789012345678901234567890123456789012345678901234567890123\",\"map_crc\":\"eceaf25c\",\"prng_description\":\"test-prng:02468ace\",\"config\":{},\"tuning\":{},\"uuids\":[";
|
static const char PREFIX2[] = "\",\"server_name\":\"server name\",\"server_port\":\"8303\",\"game_type\":\"game type\",\"map_name\":\"Kobra 3 Solo\",\"map_size\":\"903514\",\"map_sha256\":\"0123456789012345678901234567890123456789012345678901234567890123\",\"map_crc\":\"eceaf25c\",\"prng_description\":\"test-prng:02468ace\",\"config\":{},\"tuning\":{},\"uuids\":[";
|
||||||
static const char PREFIX3[] = "]}";
|
static const char PREFIX3[] = "]}";
|
||||||
|
|
||||||
|
@ -708,6 +708,24 @@ TEST_F(TeeHistorian, TeamPractice)
|
||||||
Expect(EXPECTED, sizeof(EXPECTED));
|
Expect(EXPECTED, sizeof(EXPECTED));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(TeeHistorian, PlayerRejoinVer6)
|
||||||
|
{
|
||||||
|
const unsigned char EXPECTED[] = {
|
||||||
|
// EX uuid=c1e921d5-96f5-37bb-8a45-7a06f163d27e datalen=1
|
||||||
|
0x4a,
|
||||||
|
0xc1, 0xe9, 0x21, 0xd5, 0x96, 0xf5, 0x37, 0xbb,
|
||||||
|
0x8a, 0x45, 0x7a, 0x06, 0xf1, 0x63, 0xd2, 0x7e,
|
||||||
|
0x01,
|
||||||
|
// (PLAYER_REJOIN) cid=2
|
||||||
|
0x02,
|
||||||
|
// FINISH
|
||||||
|
0x40};
|
||||||
|
|
||||||
|
m_TH.RecordPlayerRejoin(2);
|
||||||
|
Finish();
|
||||||
|
Expect(EXPECTED, sizeof(EXPECTED));
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(TeeHistorian, PlayerReady)
|
TEST_F(TeeHistorian, PlayerReady)
|
||||||
{
|
{
|
||||||
const unsigned char EXPECTED[] = {
|
const unsigned char EXPECTED[] = {
|
||||||
|
@ -716,7 +734,7 @@ TEST_F(TeeHistorian, PlayerReady)
|
||||||
0x63, 0x85, 0x87, 0xc9, 0x3f, 0x75, 0x38, 0x87,
|
0x63, 0x85, 0x87, 0xc9, 0x3f, 0x75, 0x38, 0x87,
|
||||||
0x91, 0x8e, 0xa3, 0xc2, 0x61, 0x4f, 0xfa, 0xa0,
|
0x91, 0x8e, 0xa3, 0xc2, 0x61, 0x4f, 0xfa, 0xa0,
|
||||||
0x01,
|
0x01,
|
||||||
// (PLAYER_READY) cid=1
|
// (PLAYER_READY) cid=63
|
||||||
0x3f,
|
0x3f,
|
||||||
// FINISH
|
// FINISH
|
||||||
0x40};
|
0x40};
|
||||||
|
|
Loading…
Reference in a new issue