csgo-plugins/KnifeAlert/scripting/KnifeAlert.sp
2020-03-25 20:09:12 +02:00

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