113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #pragma semicolon 1
 | |
| #pragma newdecls required
 | |
| 
 | |
| #include <sourcemod>
 | |
| #include <multicolors>
 | |
| 
 | |
| Handle g_hCVar_NotificationTime = INVALID_HANDLE;
 | |
| char g_sAttackerSID[MAXPLAYERS + 1][32];
 | |
| int g_iNotificationTime[MAXPLAYERS + 1];
 | |
| 
 | |
| public Plugin myinfo =
 | |
| {
 | |
| 	name         = "Knife Notifications",
 | |
| 	author       = "Obus + BotoX",
 | |
| 	description  = "Notify administrators when zombies have been knifed by humans.",
 | |
| 	version      = "2.2",
 | |
| 	url          = ""
 | |
| };
 | |
| 
 | |
| public void OnPluginStart()
 | |
| {
 | |
| 	g_hCVar_NotificationTime = CreateConVar("sm_knifenotifytime", "5", "Amount of time to pass before a knifed zombie is considered \"not knifed\" anymore.", 0, true, 0.0, true, 60.0);
 | |
| 
 | |
| 	if(!HookEventEx("player_hurt", Event_PlayerHurt, EventHookMode_Pre))
 | |
| 		SetFailState("[Knife-Notifications] Failed to hook \"player_hurt\" event.");
 | |
| }
 | |
| 
 | |
| public int GetClientFromSteamID(const char[] auth)
 | |
| {
 | |
| 	char clientAuth[32];
 | |
| 
 | |
| 	for(int client = 1; client <= MaxClients; client++)
 | |
| 	{
 | |
| 		if(!IsClientAuthorized(client))
 | |
| 			continue;
 | |
| 
 | |
| 		GetClientAuthId(client, AuthId_Steam2, clientAuth, sizeof(clientAuth));
 | |
| 
 | |
| 		if(StrEqual(auth, clientAuth))
 | |
| 			return client;
 | |
| 	}
 | |
| 
 | |
| 	return -1;
 | |
| }
 | |
| 
 | |
| public Action Event_PlayerHurt(Handle hEvent, const char[] name, bool dontBroadcast)
 | |
| {
 | |
| 	int victim;
 | |
| 	int attacker;
 | |
| 	char sWepName[64];
 | |
| 	char sAtkSID[32];
 | |
| 	char sVictSID[32];
 | |
| 	GetEventString(hEvent, "weapon", sWepName, sizeof(sWepName));
 | |
| 
 | |
| 	if((victim = GetClientOfUserId(GetEventInt(hEvent, "userid"))) == 0)
 | |
| 		return;
 | |
| 
 | |
| 	if((attacker = GetClientOfUserId(GetEventInt(hEvent, "attacker"))) == 0)
 | |
| 		return;
 | |
| 
 | |
| 	if(!IsClientInGame(victim) || !IsPlayerAlive(victim))
 | |
| 		return;
 | |
| 
 | |
| 	if(!IsClientInGame(attacker) || !IsPlayerAlive(attacker))
 | |
| 		return;
 | |
| 
 | |
| 	if(victim != attacker && GetClientTeam(victim) == 2 && GetClientTeam(attacker) == 3)
 | |
| 	{
 | |
| 		if(StrEqual(sWepName, "knife"))
 | |
| 		{
 | |
| 			int damage = GetEventInt(hEvent, "dmg_health");
 | |
| 
 | |
| 			if(damage < 35)
 | |
| 				return;
 | |
| 
 | |
| 			GetClientAuthId(attacker, AuthId_Steam2, sAtkSID, sizeof(sAtkSID));
 | |
| 			GetClientAuthId(attacker, AuthId_Steam2, g_sAttackerSID[victim], sizeof(g_sAttackerSID[]));
 | |
| 			GetClientAuthId(victim, AuthId_Steam2, sVictSID, sizeof(sVictSID));
 | |
| 			LogMessage("%L knifed %L", attacker, victim);
 | |
| 
 | |
| 			g_iNotificationTime[victim] = (GetTime() + GetConVarInt(g_hCVar_NotificationTime));
 | |
| 
 | |
| 			for(int i = 1; i <= MaxClients; i++)
 | |
| 			{
 | |
| 				if(IsClientConnected(i) && IsClientInGame(i) && (IsClientSourceTV(i) || GetAdminFlag(GetUserAdmin(i), Admin_Generic)))
 | |
| 					CPrintToChat(i, "{green}[SM] {blue}%N {default}knifed {red}%N", attacker, victim);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	else if(victim != attacker && GetClientTeam(attacker) == 2 && GetClientTeam(victim) == 3)
 | |
| 	{
 | |
| 		int pOldKnifer;
 | |
| 		pOldKnifer = GetClientFromSteamID(g_sAttackerSID[attacker]);
 | |
| 
 | |
| 		if(g_iNotificationTime[attacker] > GetTime() && (victim != pOldKnifer))
 | |
| 		{
 | |
| 			char sAtkAttackerName[MAX_NAME_LENGTH];
 | |
| 			GetClientAuthId(attacker, AuthId_Steam2, sAtkSID, sizeof(sAtkSID));
 | |
| 
 | |
| 			if(pOldKnifer != -1)
 | |
| 			{
 | |
| 				GetClientName(pOldKnifer, sAtkAttackerName, sizeof(sAtkAttackerName));
 | |
| 				LogMessage("%L killed %L (Recently knifed by %L)", attacker, victim, pOldKnifer);
 | |
| 			}
 | |
| 			else
 | |
| 				LogMessage("%L killed %L (Recently knifed by a disconnected player [%s])", attacker, victim, g_sAttackerSID[attacker]);
 | |
| 
 | |
| 			CPrintToChatAll("{green}[SM] {red}%N {green}(%s){default} killed {blue}%N{default} - knifed by {blue}%s {green}(%s)",
 | |
| 				attacker, sAtkSID, victim, (pOldKnifer != -1) ? sAtkAttackerName : "a disconnected player", g_sAttackerSID[attacker]);
 | |
| 		}
 | |
| 	}
 | |
| }
 |