#pragma semicolon 1
#include <sourcemod>
#include <sdkhooks>
#include <vip_core>
#undef REQUIRE_PLUGIN
#include <lsd>
#include <custom_rounds>
#pragma newdecls required
#define DAMAGE 0.0 //Регулировать урон с ножа, 0.0 - урона нет
bool g_bDuelStart,
bLSDLoaded,
bCRLoaded;
bool g_bStatus[MAXPLAYERS + 1];
static const char g_sFeature[] = "AntiKnifeDamage"; // Уникальное имя ф-и в VIP
/* ДОБАВИТЬ В ФАЙЛ ПЕРЕВОДА
"Phrases"
{
"AntiKnifeDamage"
{
"ru" "Защита от урона ножом"
}
}
*/
public Plugin myinfo =
{
name = "[VIP] Anti Knife Damage",
author = "MizzZer",
version = "1.0.0",
url = "vk.com/mizzzer"
}
public void OnPluginStart()
{
if(VIP_IsVIPLoaded())
{
VIP_OnVIPLoaded();
}
}
public void VIP_OnVIPLoaded()
{
VIP_RegisterFeature(g_sFeature, BOOL, TOGGLABLE, ChangeStatus); //Отображение пункта в меню VIP
}
Action ChangeStatus(int iClient, const char[] szFeature, VIP_ToggleState eOldStatus, VIP_ToggleState &eNewStatus)
{
g_bStatus[iClient] = eNewStatus == ENABLED;
return Plugin_Continue;
}
//Проверка на наличие плагинов.
public void OnAllPluginsLoaded()
{
bLSDLoaded = LibraryExists("lsd");
bCRLoaded = LibraryExists("custom_rounds");
}
public void OnLibraryRemoved(const char[] szName)
{
SetLibraryStatus(szName, false);
}
public void OnLibraryAdded(const char[] szName)
{
SetLibraryStatus(szName, true);
}
void SetLibraryStatus(const char[] szName, bool bStatus)
{
if(strcmp(szName, "lsd") == 0)
{
bLSDLoaded = bStatus;
}
if(strcmp(szName, "custom_rounds") == 0)
{
bCRLoaded = bStatus;
}
}
//////////////////////////////////////////////////
public void VIP_OnVIPClientLoaded(int iClient)
{
g_bStatus[iClient] = VIP_IsClientFeatureUse(iClient, g_sFeature);
if(g_bStatus[iClient])
{
SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}
}
public void VIP_OnVIPClientAdded(int iClient, int iAdmin)
{
VIP_OnVIPClientLoaded(iClient);
}
public void VIP_OnVIPClientRemoved(int iClient, const char[] szReason, int iAdmin)
{
g_bStatus[iClient] = false;
SDKUnhook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}
Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype)
{
if(attacker > 0 && g_bStatus[victim] && damagetype & DMG_SLASH)
{
if(bCRLoaded && CR_IsCustomRound() || bLSDLoaded && g_bDuelStart)
{
return Plugin_Continue;
}
static char szWeapon[32];
GetClientWeapon(attacker, szWeapon, sizeof szWeapon);
if(StrContains(szWeapon, "knife", false) != -1 || StrContains(szWeapon, "bayonet", false) != -1)
{
damage = DAMAGE;
return Plugin_Changed;
}
}
return Plugin_Continue;
}
public void LSD_OnDuelStart(KeyValues hKV, const int iDuelist[2], const char[] sMode)
{
g_bDuelStart = true;
}
public void LSD_OnDuelEnd(int iReason, const int iDuelist[2])
{
g_bDuelStart = false;
}
public void OnPluginEnd()
{
if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "VIP_UnregisterFeature") == FeatureStatus_Available)
{
VIP_UnregisterFeature(g_sFeature);
}
}