-
Notifications
You must be signed in to change notification settings - Fork 2
/
shavit-replayrun.sp
127 lines (104 loc) · 4.42 KB
/
shavit-replayrun.sp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//Nuko: pretty much just get the record array by Shavit_GetReplayData when you finish the map and play it by Shavit_StartReplayFromFrameCache
#pragma semicolon 1
#pragma newdecls required
#include <sourcemod>
#include <shavit/core>
#include <shavit/wr>
#include <shavit/replay-playback>
#include <shavit/replay-recorder>
#undef REQUIRE_EXTENSIONS
#include <cstrike>
public Plugin myinfo =
{
name = "shavit-replayrun",
author = "fri-end",
description = "Replay your most recent run.",
version = "1.0",
url = "https://github.com/zamboniguy"
};
frame_cache_t aReplayData[MAXPLAYERS + 1];
int gI_PlayerFinishFrame[MAXPLAYERS + 1];
public void OnPluginStart()
{
RegConsoleCmd("sm_replayrun", SM_ReplayRun);
}
public void OnClientPutInServer(int client)
{
char sReplayName[MAX_NAME_LENGTH];
GetClientName(client, sReplayName, sizeof(sReplayName));
Format(sReplayName, MAX_NAME_LENGTH, "*%s", sReplayName);
char sAuthID[32];
GetClientAuthId(client, AuthId_Steam3, sAuthID, sizeof(sAuthID));
ReplaceString(sAuthID, 32, "[U:1:", "");
ReplaceString(sAuthID, 32, "]", "");
aReplayData[client].fTickrate = (1.0 / GetTickInterval());
aReplayData[client].iPreFrames = 0;
aReplayData[client].iPostFrames = RoundFloat(FindConVar("shavit_replay_postruntime").FloatValue * aReplayData[client].fTickrate);
aReplayData[client].iFrameCount = 0;
aReplayData[client].fTime = -1.0;
aReplayData[client].bNewFormat = true;
aReplayData[client].iReplayVersion = 0x09;
aReplayData[client].sReplayName = sReplayName;
aReplayData[client].aFrames = new ArrayList(aReplayData[client].iReplayVersion, 0);
aReplayData[client].iSteamID = StringToInt(sAuthID);
}
public void OnClientDisconnect(int client)
{
aReplayData[client].iPreFrames = 0;
aReplayData[client].iPostFrames = 0;
aReplayData[client].iFrameCount = 0;
aReplayData[client].fTime = -1.0;
aReplayData[client].bNewFormat = false;
aReplayData[client].iReplayVersion = 0x09;
aReplayData[client].sReplayName = "error";
delete aReplayData[client].aFrames;
aReplayData[client].fTickrate = -1.0;
aReplayData[client].iSteamID = 0;
}
public Action SM_ReplayRun(int client, int args)
{
ChangeClientTeam(client, CS_TEAM_SPECTATOR);
RequestFrame(ReplayRun, GetClientSerial(client));
return Plugin_Handled;
}
public void ReplayRun(any data)
{
int client = GetClientFromSerial(data);
// Check if central replay bot is idle
if (Shavit_GetReplayStatus(Shavit_GetReplayBotIndex(-1, -1)) == Replay_Idle)
{
// Check if there are any frames to play... switch to counting aFrames instead of iFrameCount
if (aReplayData[client].iFrameCount > 0)
{
Shavit_StartReplayFromFrameCache(Shavit_GetBhopStyle(client), Shavit_GetClientTrack(client), -1.0, client, Shavit_GetReplayBotIndex(-1, -1), Replay_Central, false, aReplayData[client]);
PrintToChat(client, "[\x02ReplayRun\x01] Now playing \x0Cyour \x01most recent run.");
}
else
{
PrintToChat(client, "[\x02ReplayRun\x01] No replay data... \x0Cnothing to replay.");
}
}
else
{
PrintToChat(client, "[\x02ReplayRun\x01] \x0cWait \x01for current bot replay to stop.");
}
}
public void Shavit_OnFinish(int client, int style, float time, int jumps, int strafes, float sync, int track, float oldtime, float perfs, float avgvel, float maxvel, int timestamp)
{
gI_PlayerFinishFrame[client] = Shavit_GetClientFrameCount(client);
}
public Action Shavit_ShouldSaveReplayCopy(int client, int style, float time, int jumps, int strafes, float sync, int track, float oldtime, float perfs, float avgvel, float maxvel, int timestamp, bool isbestreplay, bool istoolong)
{
delete aReplayData[client].aFrames;
aReplayData[client].aFrames = Shavit_GetReplayData(client);
aReplayData[client].iPreFrames = Shavit_GetPlayerPreFrames(client);
aReplayData[client].iPostFrames = Shavit_GetClientFrameCount(client) - gI_PlayerFinishFrame[client];
aReplayData[client].iFrameCount = aReplayData[client].aFrames.Length - aReplayData[client].iPreFrames - aReplayData[client].iPostFrames;
aReplayData[client].fTime = time;
//PrintToChat(client, "PreFrames: %i", aReplayData[client].iPreFrames);
//PrintToChat(client, "PostFrames: %i", aReplayData[client].iPostFrames);
//PrintToChat(client, "FrameCount: %i %i", Shavit_GetClientFrameCount(client), aReplayData[client].iFrameCount);
//PrintToChat(client, "Frames.Length: %i", aReplayData[client].aFrames.Length);
PrintToChat(client, "[\x02ReplayRun\x01] Your \x0cpersonal replay data saved. \x01Use \x0c!replayrun \x01to watch.");
return Plugin_Continue;
}