#include <tf2_stocks>
#include <sdkhooks>
#pragma newdecls required
public Plugin myinfo = {
description = "Only HeadShot for TF2",
version = "1.0",
author = "CrazyHackGUT aka Kruzya",
name = "[TF2] Only HeadShot",
url = "https://kruzefag.ru/"
};
public void OnPluginStart() {
for (int i; ++i <= MaxClients;) {
if (!IsClientInGame(i))
continue;
OnClientPutInServer(i);
}
}
public void OnClientPutInServer(int iClient) {
SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}
public Action OnTakeDamage(int iVictim, int &iAttacker, int &iInflictor, float &fDamage, int &iDamageType, int &iWeapon, float fDamageForce[3], float fDamagePosition[3], int iDamageCustom) {
if (iAttacker == iVictim || iDamageCustom == TF_CUSTOM_HEADSHOT || TF2_IsPlayerInCondition(iVictim, TFCond_Bonked) || iAttacker < 1 || iAttacker > MaxClients || TF2_GetPlayerClass(iAttacker) != TFClass_Sniper || !UTIL_IsActiveWeapon(iAttacker, TFWeaponSlot_Primary)) {
return Plugin_Continue;
}
TF2_AddCondition(iVictim, TFCond_Bonked, TFCondDuration_Infinite, 0);
RequestFrame(OnNeedRemoveCondition, GetClientUserId(iVictim));
return Plugin_Continue;
}
public void OnNeedRemoveCondition(int iClient) {
if (!(iClient = GetClientOfUserId(iClient)))
return;
TF2_RemoveCondition(iClient, TFCond_Bonked);
}
bool UTIL_IsActiveWeapon(int iClient, int iWeaponSlot) {
int iActiveWeapon = GetEntPropEnt(iClient, Prop_Send, "m_hActiveWeapon");
int iWeapon = GetPlayerWeaponSlot(iClient, iWeaponSlot);
return ((iActiveWeapon > MaxClients && iWeapon != -1) ? (iActiveWeapon == iWeapon) : false);
}