152 lines
3.8 KiB
SourcePawn
152 lines
3.8 KiB
SourcePawn
|
|
||
|
|
||
|
/*public void LoadMainGhost()
|
||
|
{
|
||
|
//Something went wrong, escape.
|
||
|
if (!g_iGhost)
|
||
|
return;
|
||
|
|
||
|
char path[PLATFORM_MAX_PATH];
|
||
|
BuildPath(Path_SM, path, sizeof(path), "data/ctimer/replay/%s.bin", g_sMapName);
|
||
|
if (!FileExists(path))
|
||
|
{
|
||
|
Format(g_sGhostNames, MAX_NAME_LENGTH, "No replay available");
|
||
|
g_iGhostFrame = -1;
|
||
|
return;
|
||
|
}
|
||
|
File file = OpenFile(path, "rb", false, "GAME");
|
||
|
if (file)
|
||
|
{
|
||
|
g_arrayGhost.Clear();
|
||
|
float pos[3], ang[2], vel[3];
|
||
|
int currentframe, buttons;
|
||
|
while (!file.EndOfFile())
|
||
|
{
|
||
|
currentframe = g_arrayGhost.Length;
|
||
|
currentframe++;
|
||
|
g_arrayGhost.Resize(currentframe);
|
||
|
file.Read(view_as<int>(pos), 3, 4);
|
||
|
file.Read(view_as<int>(ang), 2, 4);
|
||
|
file.Read(view_as<int>(vel), 3, 4);
|
||
|
file.ReadInt32(buttons);
|
||
|
SetArrayCell(g_arrayGhost, currentframe, pos[0], 0);
|
||
|
SetArrayCell(g_arrayGhost, currentframe, pos[1], 1);
|
||
|
SetArrayCell(g_arrayGhost, currentframe, pos[2], 2);
|
||
|
SetArrayCell(g_arrayGhost, currentframe, ang[0], 3);
|
||
|
SetArrayCell(g_arrayGhost, currentframe, ang[1], 4);
|
||
|
SetArrayCell(g_arrayGhost, currentframe, vel[0], 5);
|
||
|
SetArrayCell(g_arrayGhost, currentframe, vel[1], 6);
|
||
|
SetArrayCell(g_arrayGhost, currentframe, vel[2], 7);
|
||
|
SetArrayCell(g_arrayGhost, currentframe, buttons, 8);
|
||
|
|
||
|
}
|
||
|
file.Close();
|
||
|
PrintToServer("Main replay loaded");
|
||
|
g_iGhostFrame = -2;
|
||
|
pos[0] = GetArrayCell(g_arrayGhost, 0, 0);
|
||
|
pos[1] = GetArrayCell(g_arrayGhost, 0, 1);
|
||
|
pos[2] = GetArrayCell(g_arrayGhost, 0, 2);
|
||
|
TeleportEntity(g_iGhost, pos, NULL_VECTOR, NULL_VECTOR);
|
||
|
}
|
||
|
}*/
|
||
|
|
||
|
bool SaveRecord(int client)
|
||
|
{
|
||
|
if ( !isValidClient(client) )
|
||
|
{
|
||
|
LogError("Client %d is not valid", client);
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
char path[PLATFORM_MAX_PATH];
|
||
|
BuildPath(Path_SM, path, sizeof(path), "%s/%s/%s.steamedhams", REPLAYS_PATH, g_sMapName, g_sMapName);
|
||
|
|
||
|
if (FileExists(path))
|
||
|
{
|
||
|
#if defined BACKUP_REPLAYS
|
||
|
BackupRecord(path);
|
||
|
#endif
|
||
|
|
||
|
DeleteFile(path); // Kinda unnecessary? Opening the file later will truncate it.
|
||
|
}
|
||
|
|
||
|
File file = OpenFile(path, "wb");
|
||
|
if (file)
|
||
|
{
|
||
|
int size = g_arrayRun[client].Length;
|
||
|
if (!size)
|
||
|
{
|
||
|
LogError("Couldn't save record. Run array is empty.");
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
int values[RUNDATA_MAX];
|
||
|
|
||
|
for (int i = 0; i < size; ++i)
|
||
|
{
|
||
|
g_arrayRun[client].GetArray(i, values, RUNDATA_MAX);
|
||
|
|
||
|
file.Write(values, RUNDATA_MAX-1, 4);
|
||
|
file.WriteInt8(values[RUNDATA_WEAPONID]);
|
||
|
|
||
|
}
|
||
|
file.Close();
|
||
|
return true;
|
||
|
}
|
||
|
LogError("Could not open the file \"%s\" for writing.", path);
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void BackupRecord(char[] recordPath)
|
||
|
{
|
||
|
char sPath[PLATFORM_MAX_PATH];
|
||
|
FormatEx(sPath, sizeof(sPath), "%s_old", recordPath);
|
||
|
|
||
|
// Delete the last backup
|
||
|
if (FileExists(sPath))
|
||
|
{
|
||
|
DeleteFile(sPath);
|
||
|
}
|
||
|
|
||
|
RenameFile(sPath, recordPath);
|
||
|
}
|
||
|
|
||
|
public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
|
||
|
{
|
||
|
// Handle humans
|
||
|
if (isValidClient(client))
|
||
|
{
|
||
|
if (IsPlayerAlive(client))
|
||
|
{
|
||
|
// Is the player running?
|
||
|
if (g_iActivity[client] == 0)
|
||
|
{
|
||
|
if(GetEntityMoveType(client) != MOVETYPE_NOCLIP)
|
||
|
{
|
||
|
// Record run data
|
||
|
int values[RUNDATA_MAX];
|
||
|
|
||
|
float origin[3];
|
||
|
GetEntDataVector(client, m_vecOrigin, origin);
|
||
|
|
||
|
values[RUNDATA_POSITION_X] = view_as<int>(origin[0]);
|
||
|
values[RUNDATA_POSITION_Y] = view_as<int>(origin[1]);
|
||
|
values[RUNDATA_POSITION_Z] = view_as<int>(origin[2]);
|
||
|
values[RUNDATA_PITCH] = view_as<int>(angles[0]);
|
||
|
values[RUNDATA_YAW] = view_as<int>(angles[1]);
|
||
|
values[RUNDATA_BUTTONS] = buttons;
|
||
|
values[RUNDATA_IMPULSE] = impulse;
|
||
|
values[RUNDATA_WEAPONID] = view_as<int>( GetWeaponID(client) );
|
||
|
|
||
|
g_arrayRun[client].PushArray(values, RUNDATA_MAX);
|
||
|
}
|
||
|
|
||
|
else
|
||
|
{
|
||
|
g_iActivity[client] = -1;
|
||
|
TimerPrintToChat(client, false, "%T", "TimerCheatStopped", LANG_SERVER);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|