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;
ArrayList aFrames;
int iPreFrames;
int iTimerPreFrames;
bool bSegmented;
int iSerial;
bool bPractice;
@ -1734,11 +1735,21 @@ native int Shavit_GetPlayerPreFrame(int client);
* Sets player's preframe length.
*
* @param client Client index
* @param preframe preframe length
* @param PreFrame PreFrame length
* @param TimerPreFrame Timer start frame length
*
* @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
// code stolen from the base halflife.inc file

View File

@ -64,6 +64,7 @@ enum struct persistent_data_t
int iClassname;
ArrayList aFrames;
int iPreFrames;
int iTimerPreFrames;
bool bPractice;
}
@ -1135,6 +1136,7 @@ void PersistData(int client)
{
aData.aFrames = Shavit_GetReplayData(client);
aData.iPreFrames = Shavit_GetPlayerPreFrame(client);
aData.iTimerPreFrames = Shavit_GetPlayerTimerframe(client);
}
aData.fDisconnectTime = GetEngineTime();
@ -1255,7 +1257,7 @@ public Action Timer_LoadPersistentData(Handle Timer, any data)
if(gB_Replay && aData.aFrames != null)
{
Shavit_SetReplayData(client, aData.aFrames);
Shavit_SetPlayerPreFrame(client, aData.iPreFrames);
Shavit_SetPlayerPreFrame(client, aData.iPreFrames, aData.iTimerPreFrames);
}
if(aData.bPractice)
@ -2348,6 +2350,7 @@ bool SaveCheckpoint(int client, int index, bool overflow = false)
{
cpcache.aFrames = Shavit_GetReplayData(target);
cpcache.iPreFrames = Shavit_GetPlayerPreFrame(target);
cpcache.iTimerPreFrames = Shavit_GetPlayerTimerframe(target);
}
cpcache.bSegmented = true;
@ -2560,7 +2563,7 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage)
else
{
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_GetPlayerPreFrame", Native_GetPreFrame);
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
RegPluginLibrary("shavit-replay");
@ -765,8 +766,19 @@ public int Native_GetPreFrame(Handle handler, int numParams)
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)
{
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);
}
@ -1209,7 +1221,7 @@ bool LoadReplay(int style, int track, const char[] path)
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];
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.WriteInt8(style);
fFile.WriteInt8(track);
fFile.WriteInt32(preframes);
fFile.WriteInt32(preframes < 0 ? timerstartframe : timerstartframe - preframes);
int iSize = playerrecording.Length;
fFile.WriteInt32(iSize);
@ -1240,7 +1252,7 @@ bool SaveReplay(int style, int track, float time, int steamid, char[] name, int
int iFramesWritten = 0;
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);
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].bNewFormat = true;
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;
}
@ -1561,6 +1573,7 @@ public void OnClientDisconnect(int client)
if(!IsFakeClient(client))
{
RequestFrame(DeleteFrames, client);
ClearFrames(client);
return;
}
@ -1590,7 +1603,8 @@ public void DeleteFrames(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])
{
@ -1669,7 +1683,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st
GetClientName(client, 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))
{