mirror of
https://github.com/shavitush/bhoptimer.git
synced 2025-12-16 02:37:18 +00:00
*might* cause memory leaks - hopefully not. This is my first time doing such a thing in SourcePawn.
This commit is contained in:
parent
ce377bd64b
commit
cdb745214d
@ -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");
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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));
|
||||
|
||||
Loading…
Reference in New Issue
Block a user