+some natives +less resizing for player frames arraylist

This commit is contained in:
rtldg 2021-03-25 02:05:25 +00:00
parent abb7cbc052
commit 56c3b2af00
2 changed files with 51 additions and 20 deletions

View File

@ -1566,10 +1566,18 @@ native int Shavit_GetReplayButtons(int ent);
* *
* @param style Style. * @param style Style.
* @param track Track. * @param track Track.
* @noreturn * @return Frame count.
*/ */
native int Shavit_GetReplayFrameCount(int style, int track); native int Shavit_GetReplayFrameCount(int style, int track);
/**
* Retrieves a replay bot's frame count.
*
* @param bot Replay bot entity.
* @return Frame count.
*/
native int Shavit_GetReplayBotFrameCount(int bot);
/** /**
* Retrieves the replay data for the given style and track. * Retrieves the replay data for the given style and track.
* *
@ -1592,15 +1600,23 @@ native int Shavit_GetClientFrameCount(int client);
* *
* @param style Style. * @param style Style.
* @param track Track. * @param track Track.
* @noreturn * @return Replay length.
*/ */
native float Shavit_GetReplayLength(int style, int track); native float Shavit_GetReplayLength(int style, int track);
/**
* Retrieves a replay bot's total length in seconds.
*
* @param bot Replay bot entity.
* @return Replay length.
*/
native float Shavit_GetReplayBotLength(int bot);
/** /**
* Retrieves an actively playing replay's time. * Retrieves an actively playing replay's time.
* *
* @param entity Entity index. * @param entity Entity index.
* @return The bot's time in the replay. * @return The bot's current time in the replay.
*/ */
native float Shavit_GetReplayTime(int entity); native float Shavit_GetReplayTime(int entity);

View File

@ -240,7 +240,9 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
CreateNative("Shavit_GetReplayData", Native_GetReplayData); CreateNative("Shavit_GetReplayData", Native_GetReplayData);
CreateNative("Shavit_GetReplayFrames", Native_GetReplayFrames); CreateNative("Shavit_GetReplayFrames", Native_GetReplayFrames);
CreateNative("Shavit_GetReplayFrameCount", Native_GetReplayFrameCount); CreateNative("Shavit_GetReplayFrameCount", Native_GetReplayFrameCount);
CreateNative("Shavit_GetReplayBotFrameCount", Native_GetReplayBotFrameCount);
CreateNative("Shavit_GetReplayLength", Native_GetReplayLength); CreateNative("Shavit_GetReplayLength", Native_GetReplayLength);
CreateNative("Shavit_GetReplayBotLength", Native_GetReplayBotLength);
CreateNative("Shavit_GetReplayName", Native_GetReplayName); CreateNative("Shavit_GetReplayName", Native_GetReplayName);
CreateNative("Shavit_GetReplayStatus", Native_GetReplayStatus); CreateNative("Shavit_GetReplayStatus", Native_GetReplayStatus);
CreateNative("Shavit_GetReplayTime", Native_GetReplayTime); CreateNative("Shavit_GetReplayTime", Native_GetReplayTime);
@ -889,6 +891,7 @@ public int Native_GetReplayData(Handle plugin, int numParams)
if(gA_PlayerFrames[client] != null) if(gA_PlayerFrames[client] != null)
{ {
ArrayList frames = gA_PlayerFrames[client].Clone(); ArrayList frames = gA_PlayerFrames[client].Clone();
frames.Resize(gI_PlayerFrames[client]);
cloned = CloneHandle(frames, plugin); // set the calling plugin as the handle owner cloned = CloneHandle(frames, plugin); // set the calling plugin as the handle owner
CloseHandle(frames); CloseHandle(frames);
} }
@ -912,18 +915,23 @@ public int Native_GetReplayFrames(Handle plugin, int numParams)
return view_as<int>(cloned); return view_as<int>(cloned);
} }
// TODO: Add a native that'd return the frame count of a replay bot... because custom frames...
public int Native_GetReplayFrameCount(Handle handler, int numParams) public int Native_GetReplayFrameCount(Handle handler, int numParams)
{ {
return gA_FrameCache[GetNativeCell(1)][GetNativeCell(2)].iFrameCount; return gA_FrameCache[GetNativeCell(1)][GetNativeCell(2)].iFrameCount;
} }
public int Native_GetClientFrameCount(Handle handler, int numParams) public int Native_GetReplayBotFrameCount(Handle handler, int numParams)
{ {
return gA_PlayerFrames[GetNativeCell(1)].Length; int bot = GetNativeCell(1);
int index = GetBotInfoIndex(bot);
return gA_BotInfo[index].aCache.iFrameCount;
}
public int Native_GetClientFrameCount(Handle handler, int numParams)
{
return gI_PlayerFrames[GetNativeCell(1)];
} }
// TODO: Add a native that'd return the replay length of a replay bot... because custom frames...
public int Native_GetReplayLength(Handle handler, int numParams) public int Native_GetReplayLength(Handle handler, int numParams)
{ {
int style = GetNativeCell(1); int style = GetNativeCell(1);
@ -931,6 +939,13 @@ public int Native_GetReplayLength(Handle handler, int numParams)
return view_as<int>(GetReplayLength(style, track, gA_FrameCache[style][track])); return view_as<int>(GetReplayLength(style, track, gA_FrameCache[style][track]));
} }
public int Native_GetReplayBotLength(Handle handler, int numParams)
{
int bot = GetNativeCell(1);
int index = GetBotInfoIndex(bot);
return view_as<int>(GetReplayLength( gA_BotInfo[index].iStyle, gA_BotInfo[index].iTrack, gA_BotInfo[index].aCache));
}
// TODO: Add a native that'd return the replay name of a replay bot... because custom frames... // TODO: Add a native that'd return the replay name of a replay bot... because custom frames...
public int Native_GetReplayName(Handle handler, int numParams) public int Native_GetReplayName(Handle handler, int numParams)
{ {
@ -1556,7 +1571,7 @@ void WriteReplayHeader(File fFile, int style, int track, float time, int steamid
fFile.WriteInt32(steamid); fFile.WriteInt32(steamid);
} }
void SaveReplay(int style, int track, float time, int steamid, char[] name, int preframes, ArrayList playerrecording, int timerstartframe, int timestamp, bool saveCopy, bool saveReplay, char[] sPath, int sPathLen) void SaveReplay(int style, int track, float time, int steamid, char[] name, int preframes, ArrayList playerrecording, int iSize, int timerstartframe, int timestamp, bool saveCopy, bool saveReplay, char[] sPath, int sPathLen)
{ {
char sTrack[4]; char sTrack[4];
FormatEx(sTrack, 4, "_%d", track); FormatEx(sTrack, 4, "_%d", track);
@ -1578,8 +1593,6 @@ void SaveReplay(int style, int track, float time, int steamid, char[] name, int
fCopy = OpenFile(sPath, "wb"); fCopy = OpenFile(sPath, "wb");
} }
int iSize = playerrecording.Length;
if (saveReplay) if (saveReplay)
{ {
WriteReplayHeader(fWR, style, track, time, steamid, preframes, timerstartframe, iSize); WriteReplayHeader(fWR, style, track, time, steamid, preframes, timerstartframe, iSize);
@ -2058,12 +2071,12 @@ public Action Shavit_OnStart(int client)
{ {
int iMaxPreFrames = RoundToFloor(gCV_PlaybackPreRunTime.FloatValue * gF_Tickrate / Shavit_GetStyleSettingFloat(Shavit_GetBhopStyle(client), "speed")); int iMaxPreFrames = RoundToFloor(gCV_PlaybackPreRunTime.FloatValue * gF_Tickrate / Shavit_GetStyleSettingFloat(Shavit_GetBhopStyle(client), "speed"));
gI_PlayerPrerunFrames[client] = gA_PlayerFrames[client].Length - iMaxPreFrames; gI_PlayerPrerunFrames[client] = gI_PlayerFrames[client] - iMaxPreFrames;
if(gI_PlayerPrerunFrames[client] < 0) if(gI_PlayerPrerunFrames[client] < 0)
{ {
gI_PlayerPrerunFrames[client] = 0; gI_PlayerPrerunFrames[client] = 0;
} }
gI_PlayerTimerStartFrames[client] = gA_PlayerFrames[client].Length; gI_PlayerTimerStartFrames[client] = gI_PlayerFrames[client];
if(!gB_ClearFrame[client]) if(!gB_ClearFrame[client])
{ {
@ -2075,7 +2088,7 @@ public Action Shavit_OnStart(int client)
} }
else else
{ {
if(gA_PlayerFrames[client].Length >= iMaxPreFrames) if(gI_PlayerFrames[client] >= iMaxPreFrames)
{ {
gA_PlayerFrames[client].Erase(0); gA_PlayerFrames[client].Erase(0);
gI_PlayerFrames[client]--; gI_PlayerFrames[client]--;
@ -2143,7 +2156,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st
ReplaceString(sName, MAX_NAME_LENGTH, "#", "?"); ReplaceString(sName, MAX_NAME_LENGTH, "#", "?");
char sPath[PLATFORM_MAX_PATH]; char sPath[PLATFORM_MAX_PATH];
SaveReplay(style, track, time, iSteamID, sName, gI_PlayerPrerunFrames[client], gA_PlayerFrames[client], gI_PlayerTimerStartFrames[client], timestamp, makeCopy, makeReplay, sPath, sizeof(sPath)); SaveReplay(style, track, time, iSteamID, sName, gI_PlayerPrerunFrames[client], gA_PlayerFrames[client], gI_PlayerFrames[client], gI_PlayerTimerStartFrames[client], timestamp, makeCopy, makeReplay, sPath, sizeof(sPath));
Call_StartForward(gH_OnReplaySaved); Call_StartForward(gH_OnReplaySaved);
Call_PushCell(client); Call_PushCell(client);
@ -2379,8 +2392,12 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3
{ {
if(gF_NextFrameTime[client] <= 0.0) if(gF_NextFrameTime[client] <= 0.0)
{ {
// TODO: better resizing than this. Probably pre-allocating two seconds worth. if (gA_PlayerFrames[client].Length <= gI_PlayerFrames[client])
gA_PlayerFrames[client].Resize(gI_PlayerFrames[client] + 1); {
// Add about two seconds worth of frames so we don't have to resize so often
gA_PlayerFrames[client].Resize(gI_PlayerFrames[client] + (RoundToCeil(gF_Tickrate) * 2));
//PrintToChat(client, "resizing %d -> %d", gI_PlayerFrames[client], gA_PlayerFrames[client].Length);
}
frame_t aFrame; frame_t aFrame;
GetClientAbsOrigin(client, aFrame.pos); GetClientAbsOrigin(client, aFrame.pos);
@ -2404,9 +2421,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3
aFrame.mt = GetEntityMoveType(client); aFrame.mt = GetEntityMoveType(client);
//GetEntPropVector(client, Prop_Data, "m_vecVelocity", aFrame.vel); // TODO: m_vecBaseVelocity? m_vecAbsVelocity? //GetEntPropVector(client, Prop_Data, "m_vecVelocity", aFrame.vel); // TODO: m_vecBaseVelocity? m_vecAbsVelocity?
// TODO: Change to pusharray gA_PlayerFrames[client].SetArray(gI_PlayerFrames[client]++, aFrame, sizeof(frame_t));
gA_PlayerFrames[client].SetArray(gI_PlayerFrames[client], aFrame, sizeof(frame_t));
gI_PlayerFrames[client]++;
if(fTimescale != -1.0) if(fTimescale != -1.0)
{ {
@ -3340,7 +3355,7 @@ float GetClosestReplayTime(int client)
int iPreFrames = gA_FrameCache[style][track].iPreFrames; int iPreFrames = gA_FrameCache[style][track].iPreFrames;
int iSearch = RoundToFloor(gCV_DynamicTimeSearch.FloatValue * (1.0 / GetTickInterval())); int iSearch = RoundToFloor(gCV_DynamicTimeSearch.FloatValue * (1.0 / GetTickInterval()));
int iPlayerFrames = gA_PlayerFrames[client].Length - gI_PlayerPrerunFrames[client]; int iPlayerFrames = gI_PlayerFrames[client] - gI_PlayerPrerunFrames[client];
int iStartFrame = iPlayerFrames - iSearch; int iStartFrame = iPlayerFrames - iSearch;
int iEndFrame = iPlayerFrames + iSearch; int iEndFrame = iPlayerFrames + iSearch;