From 314406c203736113a2dec56ade1fbbd2ff17de3c Mon Sep 17 00:00:00 2001 From: shavit Date: Tue, 16 Jan 2018 12:04:44 +0200 Subject: [PATCH] Record entity flags and movetypes in replays. (#579) --- addons/sourcemod/scripting/shavit-replay.sp | 46 +++++++++++++++++---- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-replay.sp b/addons/sourcemod/scripting/shavit-replay.sp index c26d9f73..80a51cea 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -31,8 +31,8 @@ #define REPLAY_FORMAT_V2 "{SHAVITREPLAYFORMAT}{V2}" #define REPLAY_FORMAT_FINAL "{SHAVITREPLAYFORMAT}{FINAL}" -#define REPLAY_FORMAT_SUBVERSION 0x01 // for compatibility, if i ever update this code again -#define CELLS_PER_FRAME 6 // origin[3], angles[2], buttons +#define REPLAY_FORMAT_SUBVERSION 0x02 +#define CELLS_PER_FRAME 8 // origin[3], angles[2], buttons, flags, movetype // #define DEBUG @@ -71,7 +71,7 @@ int gI_ReplayBotClient[STYLE_LIMIT]; ArrayList gA_Frames[STYLE_LIMIT][TRACKS_SIZE]; float gF_StartTick[STYLE_LIMIT]; ReplayStatus gRS_ReplayStatus[STYLE_LIMIT]; -any gA_FrameCache[STYLE_LIMIT][TRACKS_SIZE][3]; // int frame_count, float time, bool new_format +any gA_FrameCache[STYLE_LIMIT][TRACKS_SIZE][4]; // int frame_count, float time, bool new_format, int replay_version char gS_ReplayNames[STYLE_LIMIT][TRACKS_SIZE][MAX_NAME_LENGTH]; bool gB_ForciblyStopped = false; @@ -818,8 +818,7 @@ bool LoadReplay(int style, int track, const char[] path) if(StrEqual(sExplodedHeader[1], REPLAY_FORMAT_FINAL)) // hopefully, the last of them { - // uncomment if ever needed - // int iSubVersion = StringToInt(sExplodedHeader[0]); + gA_FrameCache[style][track][3] = StringToInt(sExplodedHeader[0]); int iTemp = 0; fFile.ReadInt32(iTemp); @@ -850,11 +849,19 @@ bool LoadReplay(int style, int track, const char[] path) gH_SQL.Query(SQL_GetUserName_Callback, sQuery, pack, DBPrio_High); } - any[] aReplayData = new any[CELLS_PER_FRAME]; + int cells = 8; + + // backwards compatibility + if(gA_FrameCache[style][track][3] == 0x01) + { + cells = 6; + } + + any[] aReplayData = new any[cells]; for(int i = 0; i < gA_FrameCache[style][track][0]; i++) { - if(fFile.Read(aReplayData, CELLS_PER_FRAME, 4) >= 0) + if(fFile.Read(aReplayData, cells, 4) >= 0) { gA_Frames[style][track].Set(i, view_as(aReplayData[0]), 0); gA_Frames[style][track].Set(i, view_as(aReplayData[1]), 1); @@ -862,6 +869,12 @@ bool LoadReplay(int style, int track, const char[] path) gA_Frames[style][track].Set(i, view_as(aReplayData[3]), 3); gA_Frames[style][track].Set(i, view_as(aReplayData[4]), 4); gA_Frames[style][track].Set(i, view_as(aReplayData[5]), 5); + + if(gA_FrameCache[style][track][3] >= 0x02) + { + gA_Frames[style][track].Set(i, view_as(aReplayData[6]), 6); + gA_Frames[style][track].Set(i, view_as(aReplayData[7]), 7); + } } } @@ -1452,6 +1465,23 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 buttons = gA_Frames[style][track].Get(gI_ReplayTick[style], 5); + if(gA_FrameCache[style][track][3] >= 0x02) + { + SetEntityFlags(client, gA_Frames[style][track].Get(gI_ReplayTick[style], 6)); + + MoveType mt = gA_Frames[style][track].Get(gI_ReplayTick[style], 7); + + if(mt == MOVETYPE_WALK || mt == MOVETYPE_LADDER) + { + SetEntityMoveType(client, mt); + } + + else + { + SetEntityMoveType(client, MOVETYPE_NOCLIP); + } + } + float vecVelocity[3]; MakeVectorFromPoints(vecCurrentPosition, vecPosition, vecVelocity); ScaleVector(vecVelocity, gF_Tickrate); @@ -1495,6 +1525,8 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 gA_PlayerFrames[client].Set(gI_PlayerFrames[client], angles[1], 4); gA_PlayerFrames[client].Set(gI_PlayerFrames[client], buttons, 5); + gA_PlayerFrames[client].Set(gI_PlayerFrames[client], GetEntityFlags(client), 6); + gA_PlayerFrames[client].Set(gI_PlayerFrames[client], GetEntityMoveType(client), 7); gI_PlayerFrames[client]++; }