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);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
} |