113 lines
2.7 KiB
SourcePawn
113 lines
2.7 KiB
SourcePawn
#pragma semicolon 1
|
|
#pragma newdecls required
|
|
|
|
#include <sourcemod>
|
|
#include <sdktools>
|
|
#include <sdkhooks>
|
|
#include <cstrike>
|
|
|
|
// void CCSPlayer::StockPlayerAmmo( CBaseCombatWeapon *pNewWeapon )
|
|
Handle g_hCCSPlayer_StockPlayerAmmo;
|
|
|
|
public Plugin myinfo =
|
|
{
|
|
name = "FixPlayerEquip",
|
|
author = "BotoX",
|
|
description = "Fix lag caused by game_player_equip entity.",
|
|
version = "1.0"
|
|
}
|
|
|
|
public void OnPluginStart()
|
|
{
|
|
Handle hGameConf = LoadGameConfigFile("FixPlayerEquip.games");
|
|
if(hGameConf == INVALID_HANDLE)
|
|
{
|
|
SetFailState("Couldn't load FixPlayerEquip.games game config!");
|
|
return;
|
|
}
|
|
|
|
// void CCSPlayer::StockPlayerAmmo( CBaseCombatWeapon *pNewWeapon )
|
|
StartPrepSDKCall(SDKCall_Player);
|
|
if(!PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "CCSPlayer_StockPlayerAmmo"))
|
|
{
|
|
CloseHandle(hGameConf);
|
|
SetFailState("PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, \"CCSPlayer_StockPlayerAmmo\" failed!");
|
|
return;
|
|
}
|
|
PrepSDKCall_AddParameter(SDKType_CBaseEntity, SDKPass_Pointer);
|
|
g_hCCSPlayer_StockPlayerAmmo = EndPrepSDKCall();
|
|
|
|
CloseHandle(hGameConf);
|
|
|
|
/* Late Load */
|
|
int entity = INVALID_ENT_REFERENCE;
|
|
while((entity = FindEntityByClassname(entity, "game_player_equip")) != INVALID_ENT_REFERENCE)
|
|
{
|
|
OnEntityCreated(entity, "game_player_equip");
|
|
}
|
|
}
|
|
|
|
public void OnEntityCreated(int entity, const char[] classname)
|
|
{
|
|
if(StrEqual(classname, "game_player_equip"))
|
|
{
|
|
SDKHook(entity, SDKHook_Use, OnUse);
|
|
}
|
|
}
|
|
|
|
public Action OnUse(int entity, int client)
|
|
{
|
|
static int s_MaxEquip = -1;
|
|
if(s_MaxEquip == -1)
|
|
s_MaxEquip = GetEntPropArraySize(entity, Prop_Data, "m_weaponNames");
|
|
|
|
if(client > MaxClients || client <= 0)
|
|
return Plugin_Continue;
|
|
|
|
bool bGaveAmmo = false;
|
|
|
|
for(int i = 0; i < s_MaxEquip; i++)
|
|
{
|
|
char sWeapon[32];
|
|
GetEntPropString(entity, Prop_Data, "m_weaponNames", sWeapon, sizeof(sWeapon), i);
|
|
|
|
if(!sWeapon[0])
|
|
break;
|
|
|
|
if(strncmp(sWeapon, "ammo_", 5, false) == 0)
|
|
{
|
|
if(!bGaveAmmo)
|
|
{
|
|
int iWeapon = INVALID_ENT_REFERENCE;
|
|
if((iWeapon = GetPlayerWeaponSlot(client, CS_SLOT_PRIMARY)) != INVALID_ENT_REFERENCE)
|
|
StockPlayerAmmo(client, iWeapon);
|
|
|
|
if((iWeapon = GetPlayerWeaponSlot(client, CS_SLOT_SECONDARY)) != INVALID_ENT_REFERENCE)
|
|
StockPlayerAmmo(client, iWeapon);
|
|
|
|
bGaveAmmo = true;
|
|
}
|
|
}
|
|
else if(StrEqual(sWeapon, "item_kevlar", false))
|
|
{
|
|
SetEntProp(client, Prop_Send, "m_ArmorValue", 100, 1);
|
|
}
|
|
else if(StrEqual(sWeapon, "item_assaultsuit", false))
|
|
{
|
|
SetEntProp(client, Prop_Send, "m_ArmorValue", 100, 1);
|
|
SetEntProp(client, Prop_Send, "m_bHasHelmet", 1, 1);
|
|
}
|
|
else
|
|
{
|
|
GivePlayerItem(client, sWeapon);
|
|
}
|
|
}
|
|
|
|
return Plugin_Handled;
|
|
}
|
|
|
|
int StockPlayerAmmo(int client, int iWeapon)
|
|
{
|
|
return SDKCall(g_hCCSPlayer_StockPlayerAmmo, client, iWeapon);
|
|
}
|