New plugin: FixPlayerEquip
Fix lag/crashes caused by game_player_equip
This commit is contained in:
parent
83c05dc81e
commit
b84daf870c
14
FixPlayerEquip/gamedata/FixPlayerEquip.games.txt
Normal file
14
FixPlayerEquip/gamedata/FixPlayerEquip.games.txt
Normal file
@ -0,0 +1,14 @@
|
||||
"Games"
|
||||
{
|
||||
"#default"
|
||||
{
|
||||
"Signatures"
|
||||
{
|
||||
"CCSPlayer_StockPlayerAmmo"
|
||||
{
|
||||
"library" "server"
|
||||
"linux" "@_ZN9CCSPlayer15StockPlayerAmmoEP17CBaseCombatWeapon"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
109
FixPlayerEquip/scripting/FixPlayerEquip.sp
Normal file
109
FixPlayerEquip/scripting/FixPlayerEquip.sp
Normal file
@ -0,0 +1,109 @@
|
||||
#pragma semicolon 1
|
||||
#pragma newdecls required
|
||||
|
||||
#include <sourcemod>
|
||||
#include <sdktools>
|
||||
#include <sdkhooks>
|
||||
#include <dhooks>
|
||||
#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 = GetPlayerWeaponSlot(client, CS_SLOT_PRIMARY);
|
||||
if(iWeapon != -1)
|
||||
StockPlayerAmmo(client, iWeapon);
|
||||
|
||||
iWeapon = GetPlayerWeaponSlot(client, CS_SLOT_SECONDARY);
|
||||
if(iWeapon != -1)
|
||||
StockPlayerAmmo(client, iWeapon);
|
||||
|
||||
bGaveAmmo = true;
|
||||
}
|
||||
}
|
||||
else if(StrEqual(sWeapon, "item_kevlar", false))
|
||||
{
|
||||
SetEntProp(client, Prop_Send, "m_ArmorValue", 100, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
GivePlayerItem(client, sWeapon);
|
||||
}
|
||||
}
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
int StockPlayerAmmo(int client, int iWeapon)
|
||||
{
|
||||
return SDKCall(g_hCCSPlayer_StockPlayerAmmo, client, iWeapon);
|
||||
}
|
Loading…
Reference in New Issue
Block a user