#include <sdkhooks>
#include <vip_core>
public Plugin myinfo =
{
name = "(VIP) Survivability | Выживаемость",
author = "Drumanid",
version = "1.1.1",
url = "Discord: Drumanid#9108"
}
static const char g_sFeature[] = "Survivability";
bool g_bUse[MAXPLAYERS +1], g_bFade, g_bType;
char g_sWeapon[512];
int g_iFeature[MAXPLAYERS +1];
public void OnPluginStart()
{
ConVar hCv;
(hCv = CreateConVar("VS_WEAPON", "awp|knife|decoy", "Список оружия от которого можно получить урон и вас не спасет 'выживаемость'")).AddChangeHook(Cvar_Weapon);
hCv.GetString(g_sWeapon, sizeof(g_sWeapon));
(hCv = CreateConVar("VS_FADE", "1", "1 - включить | 0 - выключить эффект ", _, true, 0.0, true, 1.0)).AddChangeHook(Cvar_Fade);
g_bFade = hCv.BoolValue;
HookEvent("player_activate", PlayerActivate);
HookEvent("player_spawn", PlayerSpawn);
LoadTranslations("vip_modules.phrases");
if(VIP_IsVIPLoaded()) VIP_OnVIPLoaded();
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i) && g_iFeature[i] != 0)
{
SDKHook(i, SDKHook_OnTakeDamage, OnTakeDamage);
g_bUse[i] = false;
}
}
AutoExecConfig(true, "VIP_Survivability", "vip");
}
public void OnPluginEnd()
{
if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "VIP_UnregisterFeature") == FeatureStatus_Available) VIP_UnregisterFeature(g_sFeature);
}
public void VIP_OnVIPLoaded()
{
VIP_RegisterFeature(g_sFeature, INT, _, _, OnDisplayItem);
}
public void VIP_OnVIPClientLoaded(int iClient)
{
g_iFeature[iClient] = VIP_GetClientFeatureInt(iClient, g_sFeature);
}
public bool OnDisplayItem(int iClient, const char[] sFeature, char[] sDisplay, int iMaxlen)
{
if(VIP_IsClientFeatureUse(iClient, g_sFeature))
{
SetGlobalTransTarget(iClient);
FormatEx(sDisplay, iMaxlen, "%t [%i%%]", sFeature, g_iFeature[iClient]);
return true;
}
return false;
}
public void Cvar_Weapon(ConVar hCv, const char[] sOldValue, const char[] sNewValue) { hCv.GetString(g_sWeapon, sizeof(g_sWeapon)); }
public void Cvar_Fade(ConVar hCv, const char[] sOldValue, const char[] sNewValue) { g_bFade = hCv.BoolValue; }
public void OnConfigsExecuted() { g_bType = FindConVar("mp_friendlyfire").BoolValue; }
public void PlayerActivate(Event hEvent, const char[] sName, bool bDbc) { CreateTimer(0.0, TimerCheckVip, hEvent.GetInt("userid")); }
public void PlayerSpawn(Event hEvent, const char[] sName, bool bDbc) { g_bUse[GetClientOfUserId(hEvent.GetInt("userid"))] = false; }
public Action TimerCheckVip(Handle hTimer, any iClient)
{
if((iClient = GetClientOfUserId(iClient)) > 0 && !IsFakeClient(iClient) && g_iFeature[iClient] != 0) SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
return Plugin_Stop;
}
public Action OnTakeDamage(int iVictim, int &iAttacker, int &iInflictor, float &fDamage, int &iDamageType)
{
if(IsValidClient(iAttacker) && IsValidClient(iVictim) && VIP_IsClientFeatureUse(iVictim, g_sFeature))
{
if(((g_bType && iAttacker != iVictim) || (!g_bType && GetClientTeam(iAttacker) != GetClientTeam(iVictim))) &&
!g_bUse[iVictim] && (GetClientHealth(iVictim) - RoundToCeil(fDamage)) <= 0 && GetRandomInt(1, 100) <= g_iFeature[iVictim])
{
char sWeapon[32]; GetClientWeapon(iAttacker, sWeapon, sizeof(sWeapon));
if(g_sWeapon[0] == 0 || !(StrContains(g_sWeapon, sWeapon[FindCharInString(sWeapon, '_') +1], false) != -1))
{
if(g_bFade)
{
Handle hMessage = StartMessageOne("Fade", iVictim);
if(GetUserMessageType() == UM_Protobuf)
{
PbSetInt(hMessage, "duration", 150);
PbSetInt(hMessage, "hold_time", 1);
PbSetInt(hMessage, "flags", 0x0001);
PbSetColor(hMessage, "clr", {255, 0, 0, 100});
}
else
{
BfWriteShort(hMessage, 150);
BfWriteShort(hMessage, 1);
BfWriteShort(hMessage, 0x0001);
BfWriteByte(hMessage, 255);
BfWriteByte(hMessage, 0);
BfWriteByte(hMessage, 0);
BfWriteByte(hMessage, 100);
}
EndMessage();
}
SetEntityHealth(iVictim, 1);
g_bUse[iVictim] = true;
return Plugin_Handled;
}
}
}
return Plugin_Continue;
}
bool IsValidClient(int iClient)
{
if(1 <= iClient <= MaxClients && IsClientInGame(iClient)) return true;
return false;
}