/*
/ Версия 1.0
/ Релиз
/ Версия 1.1
/ Оптимизация кода
/ Убрана поддержка изменения урона
/ Версия 1.2
/ Оптимизация кода v2
/ Добавлена поддержка изменения урона
/ Версия 1.3
/ Оптимизация кода v3
/ Версия 1.4
/ Оптимизация кода v4
/ Исправлен баг когда не вип игрок метая инструмент наносил измененный урон
/ Версия 1.5
/ Оптимизация кода v5
/ Добавлена поддержка мультиязычной меню
/ Добавлено новое метательное оружие (метательный нож)
/ Добавлена возможность подобрать свой инструмент после выкидывания "Instruments_To_Lift"
/ Добавлена возможность заблокировать выкидывание инструмента "Instruments_Throw_Out"
/ Исправлен баг когда не вип игрок метая инструмент наносил измененный урон
/ Версия 1.5.1
/ Дописана полная выгрузка модуля, для корректной выгрузки загрузки модуля
/ Версия 1.5.2
/ Исправлен "баг" если установить параметр "ничего" то при перезаходе выдает предыдущее оружие.
*/
#include <vip_core>
#include <sdktools>
#include <sdkhooks>
#include <clientprefs>
#pragma semicolon 1
#pragma newdecls required
static const char g_szFeature[][] = {"Instruments", "Instruments_Throw_Out", "Instruments_To_Lift"};
int m_hMyWeapons, m_iItemDefinitionIndex, g_iInstruments[MAXPLAYERS + 1];
char g_szInstruments[MAXPLAYERS + 1][24];
Handle hCookie;
public Plugin myinfo =
{
name = "[VIP] Instruments",
author = "Faya™ (DS: Faya™#8514)",
version = "1.5.2 [PUBLIC]",
url = "http://hlmod.ru"
};
public void OnPluginStart()
{
HookEvent("player_spawn", ePS);
hCookie = RegClientCookie("VIP_Instruments_test", "VIP_Instruments_test", CookieAccess_Protected);
m_hMyWeapons = FindSendPropInfo("CBasePlayer", "m_hMyWeapons");
m_iItemDefinitionIndex = FindSendPropInfo("CEconEntity", "m_iItemDefinitionIndex");
if(VIP_IsVIPLoaded()) VIP_OnVIPLoaded();
for(int i = 1; i <= MaxClients; i++)
if(IsClientInGame(i) && !IsClientSourceTV(i))
{
OnClientPutInServer(i);
VIP_OnVIPClientLoaded(i);
}
LoadTranslations("vip_instruments.phrases");
}
public void OnPluginEnd()
{
if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "VIP_UnregisterFeature") == FeatureStatus_Available)
{
VIP_UnregisterFeature(g_szFeature[0]);
VIP_UnregisterFeature(g_szFeature[1]);
VIP_UnregisterFeature(g_szFeature[2]);
}
}
public void VIP_OnVIPLoaded()
{
VIP_RegisterFeature(g_szFeature[0], FLOAT, SELECTABLE, OnSelectItem);
VIP_RegisterFeature(g_szFeature[1], BOOL, HIDE);
VIP_RegisterFeature(g_szFeature[2], BOOL, HIDE);
}
public void OnClientPutInServer(int iClient)
{
g_szInstruments[iClient][0] = 0;
g_szInstruments[iClient][7] = 0;
if(!IsFakeClient(iClient)) SDKHook(iClient, SDKHook_WeaponCanUse, CallBack_SDKHook_WCU);
SDKHook(iClient, SDKHook_OnTakeDamageAlive, CallBack_SDKHook_OTDA);
}
public void VIP_OnVIPClientLoaded(int iClient)
{
if(VIP_GetClientFeatureStatus(iClient, g_szFeature[0]))
{
char szBuffer[24];
GetClientCookie(iClient, hCookie, szBuffer, sizeof szBuffer);
if(szBuffer[0]) strcopy(g_szInstruments[iClient], sizeof g_szInstruments[], szBuffer);
else
{
g_szInstruments[iClient][0] = 0;
g_szInstruments[iClient][7] = 0;
}
}
}
public void OnClientDisconnect(int iClient)
{
if(!IsFakeClient(iClient)) SetClientCookie(iClient, hCookie, g_szInstruments[iClient]);
}
public bool OnSelectItem(int iClient, const char[] szFeature)
{
OpenMenu(iClient);
return false;
}
void OpenMenu(int iClient)
{
Handle hMenu = CreateMenu(CallBack_Menu, MenuAction_End|MenuAction_Cancel|MenuAction_Select);
char szBuffer[64];
FormatEx(szBuffer, sizeof szBuffer, "%t\n ", "MENU_TITLE");
SetMenuTitle(hMenu, szBuffer);
SetMenuExitBackButton(hMenu, true);
FormatEx(szBuffer, sizeof szBuffer, "%t\n ", "MENU_NOTHING", g_szInstruments[iClient][0] == 0 ? "MENU_ON" : "MENU_OFF");
AddMenuItem(hMenu, "", szBuffer);
FormatEx(szBuffer, sizeof szBuffer, "%t", "MENU_AXE", g_szInstruments[iClient][7] == 'a' ? "MENU_ON" : "MENU_OFF");
AddMenuItem(hMenu, "weapon_axe", szBuffer);
FormatEx(szBuffer, sizeof szBuffer, "%t", "MENU_HAMMER", g_szInstruments[iClient][7] == 'h' ? "MENU_ON" : "MENU_OFF");
AddMenuItem(hMenu, "weapon_hammer", szBuffer);
FormatEx(szBuffer, sizeof szBuffer, "%t", "MENU_SPANNER", g_szInstruments[iClient][7] == 's' ? "MENU_ON" : "MENU_OFF");
AddMenuItem(hMenu, "weapon_spanner", szBuffer);
DisplayMenu(hMenu, iClient, MENU_TIME_FOREVER);
}
public int CallBack_Menu(Menu hMenu, MenuAction eAction, int iClient, int iItem)
{
switch(eAction)
{
case MenuAction_End: CloseHandle(hMenu);
case MenuAction_Cancel: if(iItem == MenuCancel_ExitBack) VIP_SendClientVIPMenu(iClient);
case MenuAction_Select:
{
if(iItem == 0) g_szInstruments[iClient][7] = 0;
GetMenuItem(hMenu, iItem, g_szInstruments[iClient], sizeof g_szInstruments[]);
OpenMenu(iClient);
}
}
return 0;
}
public void ePS(Event event, const char[] name, bool dontBroadcast)
{
int iClient = GetClientOfUserId(GetEventInt(event, "userid"));
if(VIP_IsClientFeatureUse(iClient, g_szFeature[0]))
{
int iWeapon;
for(int i; i < 64; i++)
{
iWeapon = GetEntDataEnt2(iClient, m_hMyWeapons+i*4);
if(iWeapon != -1 && IsValidEntity(iWeapon))
switch(GetEntData(iWeapon, m_iItemDefinitionIndex))
{
case 75, 76, 78: return;
}
}
if(g_szInstruments[iClient][0] != 0)
{
g_iInstruments[iClient] = GivePlayerItem(iClient, g_szInstruments[iClient]);
EquipPlayerWeapon(iClient, g_iInstruments[iClient]);
}
}
}
public Action CallBack_SDKHook_OTDA(int iVictim, int& iAttacker, int& iInflictor, float& fDamage, int& iDamagetype, int& iWeapon, float fDamageForce[3], float fDamagePosition[3])
{
if(iVictim > 0 && iVictim <= MaxClients && iAttacker > 0 && iAttacker <= MaxClients && iWeapon == -1 && VIP_IsClientVIP(iAttacker) && g_szInstruments[iAttacker][0] != 0 && (fDamage == 60.0 || fDamage == 30.0) && iDamagetype & 4224)
{
fDamage = VIP_GetClientFeatureFloat(iAttacker, g_szFeature[0]);
return Plugin_Changed;
}
return Plugin_Continue;
}
public Action CallBack_SDKHook_WCU(int iClient, int iWeapon)
{
if(iWeapon != 1 && VIP_IsClientFeatureUse(iClient, g_szFeature[2]) && g_iInstruments[iClient] == iWeapon)
switch(GetEntData(iWeapon, m_iItemDefinitionIndex))
{
case 75, 76, 78: EquipPlayerWeapon(iClient, iWeapon);
}
return Plugin_Continue;
}
public Action OnPlayerRunCmd(int iClient, int& iButtons)
{
if(iButtons & IN_ATTACK2)
if(!VIP_IsClientFeatureUse(iClient, g_szFeature[1]))
{
static int iWeapon; static char szWeapon[24];
iWeapon = GetEntPropEnt(iClient, Prop_Send, "m_hActiveWeapon");
if(iWeapon != 1 && IsValidEdict(iWeapon))
{
GetEdictClassname(iWeapon, szWeapon, sizeof szWeapon);
if(!strcmp(szWeapon[7], "melee"))
{
iButtons &= ~IN_ATTACK2;
return Plugin_Changed;
}
}
}
return Plugin_Continue;
}