Added natives to get/set replay frames. #450 #158

*might* cause memory leaks - hopefully not. This is my first time doing
such a thing in SourcePawn.
This commit is contained in:
shavitush 2017-08-01 15:40:21 +03:00
parent ce377bd64b
commit cdb745214d
3 changed files with 86 additions and 9 deletions

View File

@ -922,6 +922,25 @@ native void Shavit_SaveSnapshot(int client, any snapshot[TIMERSNAPSHOT_SIZE]);
*/
native void Shavit_LoadSnapshot(int client, any snapshot[TIMERSNAPSHOT_SIZE]);
/**
* Sets a player's replay recording frames from a provided ArrayList.
* To be used by save states/TAS etc.
*
* @param client Client index.
* @param data ArrayList with proper replay data.
* @noreturn
*/
native void Shavit_SetReplayData(int client, ArrayList data);
/**
* Saves a player's replay recording frames (if exists) into an ArrayList.
* To be used by save states/TAS etc.
*
* @param client Client index.
* @return ArrayList with proper replay data, or -1 if the player has no recorded data.
*/
native ArrayList Shavit_GetReplayData(int client);
/**
* Use this native when printing anything in chat if it's related to the timer.
* This native will auto-assign colors and a chat prefix.
@ -984,6 +1003,7 @@ public void __pl_shavit_SetNTVOptional()
MarkNativeAsOptional("Shavit_GetReplayBotIndex");
MarkNativeAsOptional("Shavit_GetReplayBotStyle");
MarkNativeAsOptional("Shavit_GetReplayBotTrack");
MarkNativeAsOptional("Shavit_GetReplayData");
MarkNativeAsOptional("Shavit_GetStrafeCount");
MarkNativeAsOptional("Shavit_GetStyleCount");
MarkNativeAsOptional("Shavit_GetStyleSettings");
@ -1007,6 +1027,7 @@ public void __pl_shavit_SetNTVOptional()
MarkNativeAsOptional("Shavit_ResumeTimer");
MarkNativeAsOptional("Shavit_SaveSnapshot");
MarkNativeAsOptional("Shavit_SetPracticeMode");
MarkNativeAsOptional("Shavit_SetReplayData");
MarkNativeAsOptional("Shavit_StartTimer");
MarkNativeAsOptional("Shavit_StopTimer");
MarkNativeAsOptional("Shavit_ZoneExists");

View File

@ -95,6 +95,7 @@ float gF_SaveStateData[MAXPLAYERS+1][3][3];
any gA_SaveStates[MAXPLAYERS+1][TIMERSNAPSHOT_SIZE];
bool gB_SaveStates[MAXPLAYERS+1];
char gS_SaveStateTargetname[MAXPLAYERS+1][32];
ArrayList gA_SaveFrames[MAXPLAYERS+1];
// cookies
Handle gH_HideCookie = null;
@ -162,6 +163,7 @@ Handle gH_GetPlayerMaxSpeed = null;
// modules
bool gB_Rankings = false;
bool gB_Replay = false;
// timer settings
char gS_StyleStrings[STYLE_LIMIT][STYLESTRINGS_SIZE][128];
@ -186,11 +188,6 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
return APLRes_Success;
}
public void OnAllPluginsLoaded()
{
gB_Rankings = LibraryExists("shavit-rankings");
}
public void OnPluginStart()
{
LoadTranslations("shavit-common.phrases");
@ -369,6 +366,10 @@ public void OnPluginStart()
}
}
}
// modules
gB_Rankings = LibraryExists("shavit-rankings");
gB_Replay = LibraryExists("shavit-replay");
}
public void OnClientCookiesCached(int client)
@ -576,6 +577,11 @@ public void OnLibraryAdded(const char[] name)
{
gB_Rankings = true;
}
else if(StrEqual(name, "shavit-replay"))
{
gB_Replay = true;
}
}
public void OnLibraryRemoved(const char[] name)
@ -584,6 +590,11 @@ public void OnLibraryRemoved(const char[] name)
{
gB_Rankings = false;
}
else if(StrEqual(name, "shavit-replay"))
{
gB_Replay = false;
}
}
public Action Command_Jointeam(int client, const char[] command, int args)
@ -908,7 +919,14 @@ public void OnClientPutInServer(int client)
}
ResetCheckpoints(client);
gB_SaveStates[client] = false;
if(gA_SaveFrames[client] != null)
{
delete gA_SaveFrames[client];
gA_SaveFrames[client] = null;
}
}
void ResetCheckpoints(int client)
@ -2114,11 +2132,22 @@ public Action Command_Drop(int client, const char[] command, int argc)
void LoadState(int client)
{
Shavit_LoadSnapshot(client, gA_SaveStates[client]);
TeleportEntity(client, gF_SaveStateData[client][0], gF_SaveStateData[client][1], gF_SaveStateData[client][2]);
DispatchKeyValue(client, "targetname", gS_SaveStateTargetname[client]);
Shavit_LoadSnapshot(client, gA_SaveStates[client]);
if(gA_SaveFrames[client] != null)
{
if(gB_Replay)
{
Shavit_SetReplayData(client, gA_SaveFrames[client]);
}
delete gA_SaveFrames[client];
gA_SaveFrames[client] = null;
}
gB_SaveStates[client] = false;
}
@ -2128,14 +2157,19 @@ void SaveState(int client)
{
return;
}
Shavit_SaveSnapshot(client, gA_SaveStates[client]);
GetClientAbsOrigin(client, gF_SaveStateData[client][0]);
GetClientEyeAngles(client, gF_SaveStateData[client][1]);
GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", gF_SaveStateData[client][2]);
GetEntPropString(client, Prop_Data, "m_iName", gS_SaveStateTargetname[client], 32);
Shavit_SaveSnapshot(client, gA_SaveStates[client]);
if(gB_Replay)
{
gA_SaveFrames[client] = Shavit_GetReplayData(client);
}
gB_SaveStates[client] = true;
}

View File

@ -125,6 +125,8 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
CreateNative("Shavit_GetReplayBotStyle", Native_GetReplayBotStyle);
CreateNative("Shavit_GetReplayBotTrack", Native_GetReplayBotTrack);
CreateNative("Shavit_IsReplayDataLoaded", Native_IsReplayDataLoaded);
CreateNative("Shavit_SetReplayData", Native_SetReplayData);
CreateNative("Shavit_GetReplayData", Native_GetReplayData);
// registers library, check "bool LibraryExists(const char[] name)" in order to use with other plugins
RegPluginLibrary("shavit-replay");
@ -224,6 +226,26 @@ public int Native_IsReplayDataLoaded(Handle handler, int numParams)
return view_as<int>(ReplayEnabled(style) && gI_FrameCount[style][Track_Main] > 0);
}
public int Native_SetReplayData(Handle handler, int numParams)
{
int client = GetNativeCell(1);
gA_PlayerFrames[client] = (view_as<ArrayList>(GetNativeCell(2))).Clone();
gI_PlayerFrames[client] = gA_PlayerFrames[client].Length;
}
public int Native_GetReplayData(Handle handler, int numParams)
{
int client = GetNativeCell(1);
if(gA_PlayerFrames[client] != null)
{
return view_as<int>(gA_PlayerFrames[client].Clone());
}
return -1;
}
public int Native_GetReplayBotStyle(Handle handler, int numParams)
{
return (gB_CentralBot && gA_CentralCache[iCentralReplayStatus] == Replay_Idle)? -1:GetReplayStyle(GetNativeCell(1));