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] {lightblue}%N {default}knifed {lightred}%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 {lightblue}%N{default} - knifed by {lightblue}%s {green}(%s)",
|
|
attacker, sAtkSID, victim, (pOldKnifer != -1) ? sAtkAttackerName : "a disconnected player", g_sAttackerSID[attacker]);
|
|
}
|
|
}
|
|
}
|