fix replay bug (#906)

Speculatory fix for "replay bug"
This commit is contained in:
Nairda 2020-05-05 16:19:54 +02:00 committed by GitHub
parent 9a4cdef528
commit dff6f61145
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 10 deletions

View File

@ -239,6 +239,7 @@ enum struct cp_cache_t
int iClassname; int iClassname;
ArrayList aFrames; ArrayList aFrames;
int iPreFrames; int iPreFrames;
int iTimerPreFrames;
bool bSegmented; bool bSegmented;
int iSerial; int iSerial;
bool bPractice; bool bPractice;
@ -1734,11 +1735,21 @@ native int Shavit_GetPlayerPreFrame(int client);
* Sets player's preframe length. * Sets player's preframe length.
* *
* @param client Client index * @param client Client index
* @param preframe preframe length * @param PreFrame PreFrame length
* @param TimerPreFrame Timer start frame length
* *
* @noreturn * @noreturn
*/ */
native void Shavit_SetPlayerPreFrame(int client, int preframe); native void Shavit_SetPlayerPreFrame(int client, int PreFrame, int TimerPreFrame);
/*
* Gets player's timer frame
*
* @param client Client index
*
* @return Timer start frame
*/
native int Shavit_GetPlayerTimerframe(int client);
// same as Shavit_PrintToChat() but loops through the whole server // same as Shavit_PrintToChat() but loops through the whole server
// code stolen from the base halflife.inc file // code stolen from the base halflife.inc file

View File

@ -64,6 +64,7 @@ enum struct persistent_data_t
int iClassname; int iClassname;
ArrayList aFrames; ArrayList aFrames;
int iPreFrames; int iPreFrames;
int iTimerPreFrames;
bool bPractice; bool bPractice;
} }
@ -1135,6 +1136,7 @@ void PersistData(int client)
{ {
aData.aFrames = Shavit_GetReplayData(client); aData.aFrames = Shavit_GetReplayData(client);
aData.iPreFrames = Shavit_GetPlayerPreFrame(client); aData.iPreFrames = Shavit_GetPlayerPreFrame(client);
aData.iTimerPreFrames = Shavit_GetPlayerTimerframe(client);
} }
aData.fDisconnectTime = GetEngineTime(); aData.fDisconnectTime = GetEngineTime();
@ -1255,7 +1257,7 @@ public Action Timer_LoadPersistentData(Handle Timer, any data)
if(gB_Replay && aData.aFrames != null) if(gB_Replay && aData.aFrames != null)
{ {
Shavit_SetReplayData(client, aData.aFrames); Shavit_SetReplayData(client, aData.aFrames);
Shavit_SetPlayerPreFrame(client, aData.iPreFrames); Shavit_SetPlayerPreFrame(client, aData.iPreFrames, aData.iTimerPreFrames);
} }
if(aData.bPractice) if(aData.bPractice)
@ -2348,6 +2350,7 @@ bool SaveCheckpoint(int client, int index, bool overflow = false)
{ {
cpcache.aFrames = Shavit_GetReplayData(target); cpcache.aFrames = Shavit_GetReplayData(target);
cpcache.iPreFrames = Shavit_GetPlayerPreFrame(target); cpcache.iPreFrames = Shavit_GetPlayerPreFrame(target);
cpcache.iTimerPreFrames = Shavit_GetPlayerTimerframe(target);
} }
cpcache.bSegmented = true; cpcache.bSegmented = true;
@ -2560,7 +2563,7 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage)
else else
{ {
Shavit_SetReplayData(client, cpcache.aFrames); Shavit_SetReplayData(client, cpcache.aFrames);
Shavit_SetPlayerPreFrame(client, cpcache.iPreFrames); Shavit_SetPlayerPreFrame(client, cpcache.iPreFrames, cpcache.iTimerPreFrames);
} }
} }

View File

@ -210,6 +210,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
CreateNative("Shavit_SetReplayData", Native_SetReplayData); CreateNative("Shavit_SetReplayData", Native_SetReplayData);
CreateNative("Shavit_GetPlayerPreFrame", Native_GetPreFrame); CreateNative("Shavit_GetPlayerPreFrame", Native_GetPreFrame);
CreateNative("Shavit_SetPlayerPreFrame", Native_SetPreFrame); CreateNative("Shavit_SetPlayerPreFrame", Native_SetPreFrame);
CreateNative("Shavit_GetPlayerTimerframe", Native_GetTimerFrame);
// registers library, check "bool LibraryExists(const char[] name)" in order to use with other plugins // registers library, check "bool LibraryExists(const char[] name)" in order to use with other plugins
RegPluginLibrary("shavit-replay"); RegPluginLibrary("shavit-replay");
@ -765,8 +766,19 @@ public int Native_GetPreFrame(Handle handler, int numParams)
return gI_PlayerPrerunFrames[GetNativeCell(1)]; return gI_PlayerPrerunFrames[GetNativeCell(1)];
} }
public int Native_GetTimerFrame(Handle handler, int numParams)
{
return gI_PlayerTimerStartFrames[GetNativeCell(1)];
}
public int Native_SetPreFrame(Handle handler, int numParams) public int Native_SetPreFrame(Handle handler, int numParams)
{ {
int client = GetNativeCell(1);
int preframes = GetNativeCell(2);
int timerframes = GetNativeCell(3);
gI_PlayerPrerunFrames[client] = preframes;
gI_PlayerTimerStartFrames[client] = timerframes;
gI_PlayerPrerunFrames[GetNativeCell(1)] = GetNativeCell(2); gI_PlayerPrerunFrames[GetNativeCell(1)] = GetNativeCell(2);
} }
@ -1209,7 +1221,7 @@ bool LoadReplay(int style, int track, const char[] path)
return false; return false;
} }
bool SaveReplay(int style, int track, float time, int steamid, char[] name, int preframes, ArrayList playerrecording) bool SaveReplay(int style, int track, float time, int steamid, char[] name, int preframes, ArrayList playerrecording, int timerstartframe)
{ {
char sTrack[4]; char sTrack[4];
FormatEx(sTrack, 4, "_%d", track); FormatEx(sTrack, 4, "_%d", track);
@ -1228,7 +1240,7 @@ bool SaveReplay(int style, int track, float time, int steamid, char[] name, int
fFile.WriteString(gS_Map, true); fFile.WriteString(gS_Map, true);
fFile.WriteInt8(style); fFile.WriteInt8(style);
fFile.WriteInt8(track); fFile.WriteInt8(track);
fFile.WriteInt32(preframes); fFile.WriteInt32(preframes < 0 ? timerstartframe : timerstartframe - preframes);
int iSize = playerrecording.Length; int iSize = playerrecording.Length;
fFile.WriteInt32(iSize); fFile.WriteInt32(iSize);
@ -1240,7 +1252,7 @@ bool SaveReplay(int style, int track, float time, int steamid, char[] name, int
int iFramesWritten = 0; int iFramesWritten = 0;
gA_Frames[style][track].Clear(); gA_Frames[style][track].Clear();
for(int i = 0; i < iSize; i++) for(int i = (preframes < 0 ? 0 : preframes); i < iSize; i++)
{ {
playerrecording.GetArray(i, aFrameData, CELLS_PER_FRAME); playerrecording.GetArray(i, aFrameData, CELLS_PER_FRAME);
gA_Frames[style][track].PushArray(aFrameData); gA_Frames[style][track].PushArray(aFrameData);
@ -1264,7 +1276,7 @@ bool SaveReplay(int style, int track, float time, int steamid, char[] name, int
gA_FrameCache[style][track].fTime = time; gA_FrameCache[style][track].fTime = time;
gA_FrameCache[style][track].bNewFormat = true; gA_FrameCache[style][track].bNewFormat = true;
strcopy(gA_FrameCache[style][track].sReplayName, MAX_NAME_LENGTH, name); strcopy(gA_FrameCache[style][track].sReplayName, MAX_NAME_LENGTH, name);
gA_FrameCache[style][track].iPreFrames = preframes; gA_FrameCache[style][track].iPreFrames = preframes < 0 ? timerstartframe : (timerstartframe - preframes);
return true; return true;
} }
@ -1561,6 +1573,7 @@ public void OnClientDisconnect(int client)
if(!IsFakeClient(client)) if(!IsFakeClient(client))
{ {
RequestFrame(DeleteFrames, client); RequestFrame(DeleteFrames, client);
ClearFrames(client);
return; return;
} }
@ -1590,7 +1603,8 @@ public void DeleteFrames(int client)
public Action Shavit_OnStart(int client) public Action Shavit_OnStart(int client)
{ {
gI_PlayerPrerunFrames[client] = gA_PlayerFrames[client].Length; gI_PlayerPrerunFrames[client] = gA_PlayerFrames[client].Length - RoundToFloor(gCV_PlaybackPreRunTime.FloatValue * gF_Tickrate / gA_StyleSettings[Shavit_GetBhopStyle(client)].fTimescale);
gI_PlayerTimerStartFrames[client] = gA_PlayerFrames[client].Length;
if(!gB_ClearFrame[client]) if(!gB_ClearFrame[client])
{ {
@ -1669,7 +1683,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st
GetClientName(client, sName, MAX_NAME_LENGTH); GetClientName(client, sName, MAX_NAME_LENGTH);
ReplaceString(sName, MAX_NAME_LENGTH, "#", "?"); ReplaceString(sName, MAX_NAME_LENGTH, "#", "?");
SaveReplay(style, track, time, iSteamID, sName, gI_PlayerPrerunFrames[client], gA_PlayerFrames[client]); SaveReplay(style, track, time, iSteamID, sName, gI_PlayerPrerunFrames[client], gA_PlayerFrames[client], gI_PlayerTimerStartFrames[client]);
if(ReplayEnabled(style)) if(ReplayEnabled(style))
{ {