Added Shavit_HijackAngles.

This native hijacks the replay recording so that the current tick will have your desired angles recorded to the replay data.
This commit is contained in:
shavit 2018-04-30 11:51:50 +03:00
parent 499a395baf
commit 41c2136b42
2 changed files with 35 additions and 2 deletions

View File

@ -871,6 +871,17 @@ native float Shavit_GetReplayTime(int style, int track);
*/ */
native void Shavit_GetReplayName(int style, int track, char[] buffer, int length); native void Shavit_GetReplayName(int style, int track, char[] buffer, int length);
/**
* Hijack the replay data so that this view angle will be used for the next tick.
* Use case is to make segmented runs look smoother.
*
* @param client Client index.
* @param pitch Vertical view angle.
* @param yaw Horizontal view angle.
* @noreturn
*/
native void Shavit_HijackAngles(int client, float pitch, float yaw);
/** /**
* Checks if there's loaded replay data for a bhop style or not. * Checks if there's loaded replay data for a bhop style or not.
* *
@ -1202,6 +1213,7 @@ public void __pl_shavit_SetNTVOptional()
MarkNativeAsOptional("Shavit_GetWRRecordID"); MarkNativeAsOptional("Shavit_GetWRRecordID");
MarkNativeAsOptional("Shavit_GetWRTime"); MarkNativeAsOptional("Shavit_GetWRTime");
MarkNativeAsOptional("Shavit_HasStyleAccess"); MarkNativeAsOptional("Shavit_HasStyleAccess");
MarkNativeAsOptional("Shavit_HijackAngles");
MarkNativeAsOptional("Shavit_InsideZone"); MarkNativeAsOptional("Shavit_InsideZone");
MarkNativeAsOptional("Shavit_IsClientCreatingZone"); MarkNativeAsOptional("Shavit_IsClientCreatingZone");
MarkNativeAsOptional("Shavit_IsKZMap"); MarkNativeAsOptional("Shavit_IsKZMap");

View File

@ -100,6 +100,8 @@ any gA_CentralCache[CENTRALBOTCACHE_SIZE];
// how do i call this // how do i call this
bool gB_HideNameChange = false; bool gB_HideNameChange = false;
bool gB_DontCallTimer = false; bool gB_DontCallTimer = false;
bool gB_HijackFrame[MAXPLAYERS+1];
float gF_HijackedAngles[MAXPLAYERS+1][2];
// plugin cvars // plugin cvars
ConVar gCV_Enabled = null; ConVar gCV_Enabled = null;
@ -154,6 +156,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
CreateNative("Shavit_GetReplayLength", Native_GetReplayLength); CreateNative("Shavit_GetReplayLength", Native_GetReplayLength);
CreateNative("Shavit_GetReplayName", Native_GetReplayName); CreateNative("Shavit_GetReplayName", Native_GetReplayName);
CreateNative("Shavit_GetReplayTime", Native_GetReplayTime); CreateNative("Shavit_GetReplayTime", Native_GetReplayTime);
CreateNative("Shavit_HijackAngles", Native_HijackAngles);
CreateNative("Shavit_IsReplayDataLoaded", Native_IsReplayDataLoaded); CreateNative("Shavit_IsReplayDataLoaded", Native_IsReplayDataLoaded);
CreateNative("Shavit_ReloadReplay", Native_ReloadReplay); CreateNative("Shavit_ReloadReplay", Native_ReloadReplay);
CreateNative("Shavit_ReloadReplays", Native_ReloadReplays); CreateNative("Shavit_ReloadReplays", Native_ReloadReplays);
@ -433,6 +436,15 @@ public int Native_GetReplayTime(Handle handler, int numParams)
return view_as<int>(float(gI_ReplayTick[style]) / gF_Tickrate); return view_as<int>(float(gI_ReplayTick[style]) / gF_Tickrate);
} }
public int Native_HijackAngles(Handle handler, int numParams)
{
int client = GetNativeCell(1);
gB_HijackFrame[client] = true;
gF_HijackedAngles[client][0] = view_as<float>(GetNativeCell(2));
gF_HijackedAngles[client][1] = view_as<float>(GetNativeCell(3));
}
public int Native_GetReplayBotStyle(Handle handler, int numParams) public int Native_GetReplayBotStyle(Handle handler, int numParams)
{ {
return (gB_CentralBot && gA_CentralCache[iCentralReplayStatus] == Replay_Idle)? -1:GetReplayStyle(GetNativeCell(1)); return (gB_CentralBot && gA_CentralCache[iCentralReplayStatus] == Replay_Idle)? -1:GetReplayStyle(GetNativeCell(1));
@ -1545,8 +1557,17 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3
gA_PlayerFrames[client].Set(gI_PlayerFrames[client], vecCurrentPosition[1], 1); gA_PlayerFrames[client].Set(gI_PlayerFrames[client], vecCurrentPosition[1], 1);
gA_PlayerFrames[client].Set(gI_PlayerFrames[client], vecCurrentPosition[2], 2); gA_PlayerFrames[client].Set(gI_PlayerFrames[client], vecCurrentPosition[2], 2);
if(!gB_HijackFrame[client])
{
gA_PlayerFrames[client].Set(gI_PlayerFrames[client], angles[0], 3); gA_PlayerFrames[client].Set(gI_PlayerFrames[client], angles[0], 3);
gA_PlayerFrames[client].Set(gI_PlayerFrames[client], angles[1], 4); gA_PlayerFrames[client].Set(gI_PlayerFrames[client], angles[1], 4);
}
else
{
gA_PlayerFrames[client].Set(gI_PlayerFrames[client], gF_HijackedAngles[client][0], 3);
gA_PlayerFrames[client].Set(gI_PlayerFrames[client], gF_HijackedAngles[client][1], 4);
}
gA_PlayerFrames[client].Set(gI_PlayerFrames[client], buttons, 5); gA_PlayerFrames[client].Set(gI_PlayerFrames[client], buttons, 5);
gA_PlayerFrames[client].Set(gI_PlayerFrames[client], GetEntityFlags(client), 6); gA_PlayerFrames[client].Set(gI_PlayerFrames[client], GetEntityFlags(client), 6);