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);
 | |
| }
 |