Veteran Member
Join Date: Jan 2010
Location: mom's basement
|
08-22-2020
, 08:53
Re: Weird bug in Counter-Strike: Source – Night vision gives ammo
|
#7
|
Was looking... source code.
Seems when use command buy item/weapon,
all weapons, item_kevlar(vest), item_assaultsuit(vesthelm), item_nvgs(nvgs) are using this function, except item_defuser
PHP Code:
CCSPlayer::GiveNamedItem( const char *pszName, int iSubType )
...which will StockPlayerAmmo( pWeapon ); at end of code.
if StockPlayerAmmo( pWeapon ); fail find entity as CWeaponCSBase, for example nvgs+vesthelm+vest,
it will then refill both, primary and secondary weapons ammo
This also happen to all items (nvgs, vest, vesthelm, defuser) with command give and SourceMod function GivePlayerItem,
it will refill primary and secondary weapons ammo.
But if those items are created by ent_create, it won't stock ammo.
---------------
I tried made plugin but I don't have time. There is many ways to get ammo (buyammo1, buyammo2, cl_rebuy "PrimaryWeapon PrimaryAmmo Defuser Armor HEGrenade Flashbang SmokeGrenade SecondaryWeapon SecondaryAmmo NightVision" and so on).
not perfect
PHP Code:
#include <sdktools>
Handle timers[MAXPLAYERS];
public void OnPluginStart() { //AddCommandListener(cmd, "buy"); HookEventEx("item_pickup", item_pickup); //RegConsoleCmd("sm_armor", armor); }
public Action armor(int client, int args) {
return Plugin_Handled; }
public Action cmd(int client, char[] command, args) { if(client == 0 || !IsClientInGame(client) || GetClientTeam(client) < 2 || !IsPlayerAlive(client)) return Plugin_Continue;
char buffer[10]; GetCmdArg(1, buffer, sizeof(buffer));
if(StrEqual(buffer, "nvgs", false) || StrEqual(buffer, "vest", false) || StrEqual(buffer, "vesthelm", false)) { if(timers[client] != null) return Plugin_Continue; int primary = GetPlayerWeaponSlot(client, 0); int secondary = GetPlayerWeaponSlot(client, 1);
int primary_ammo_type = -1; int primary_ammo = -1; int primary_clip = -1; int secondary_ammo_type = -1; int secondary_ammo = -1; int secondary_clip = -1;
if(primary != -1) { primary_ammo_type = GetEntProp(primary, Prop_Send, "m_iPrimaryAmmoType"); primary_ammo = GetEntProp(client, Prop_Send, "m_iAmmo", _, primary_ammo_type); primary_clip = GetEntProp(primary, Prop_Send, "m_iClip1"); PrintToServer("item_pickup primary %i %i", primary_ammo, primary_clip); }
if(secondary != -1) { secondary_ammo_type = GetEntProp(secondary, Prop_Send, "m_iPrimaryAmmoType"); secondary_ammo = GetEntProp(client, Prop_Send, "m_iAmmo", _, secondary_ammo_type); secondary_clip = GetEntProp(secondary, Prop_Send, "m_iClip1"); PrintToServer("item_pickup secondary %i %i", secondary_ammo, secondary_clip); }
DataPack pack; timers[client] = CreateDataTimer(1.0, delay, pack); pack.WriteCell(client); pack.WriteCell(GetClientUserId(client)); pack.WriteCell(primary); pack.WriteCell(primary_ammo_type); pack.WriteCell(primary_ammo); pack.WriteCell(primary_clip); pack.WriteCell(secondary); pack.WriteCell(secondary_ammo_type); pack.WriteCell(secondary_ammo); pack.WriteCell(secondary_clip); pack.Reset(); }
return Plugin_Continue; }
public void item_pickup(Event event, char[] name, bool dontBroadcast) { /* item_pickup userid short 2 item string usp */ int userid = event.GetInt("userid");
char item[10]; event.GetString("item", item, sizeof(item));
if(StrEqual(item, "nvgs", false) || StrEqual(item, "vest", false) || StrEqual(item, "vesthelm", false)) { int client = GetClientOfUserId(userid); if(timers[client] != null) return; int primary = GetPlayerWeaponSlot(client, 0); int secondary = GetPlayerWeaponSlot(client, 1);
int primary_ammo_type = -1; int primary_ammo = -1; int primary_clip = -1; int secondary_ammo_type = -1; int secondary_ammo = -1; int secondary_clip = -1;
if(primary != -1) { primary_ammo_type = GetEntProp(primary, Prop_Send, "m_iPrimaryAmmoType"); primary_ammo = GetEntProp(client, Prop_Send, "m_iAmmo", _, primary_ammo_type); primary_clip = GetEntProp(primary, Prop_Send, "m_iClip1"); PrintToServer("item_pickup primary %i %i", primary_ammo, primary_clip); }
if(secondary != -1) { secondary_ammo_type = GetEntProp(secondary, Prop_Send, "m_iPrimaryAmmoType"); secondary_ammo = GetEntProp(client, Prop_Send, "m_iAmmo", _, secondary_ammo_type); secondary_clip = GetEntProp(secondary, Prop_Send, "m_iClip1"); PrintToServer("item_pickup secondary %i %i", secondary_ammo, secondary_clip); }
DataPack pack; timers[client] = CreateDataTimer(1.0, delay, pack); pack.WriteCell(GetClientOfUserId(userid)); pack.WriteCell(userid); pack.WriteCell(primary); pack.WriteCell(primary_ammo_type); pack.WriteCell(primary_ammo); pack.WriteCell(primary_clip); pack.WriteCell(secondary); pack.WriteCell(secondary_ammo_type); pack.WriteCell(secondary_ammo); pack.WriteCell(secondary_clip); pack.Reset(); } }
public Action delay(Handle timer, DataPack pack) { int index = pack.ReadCell(); int client = GetClientOfUserId(pack.ReadCell()); timers[index] = null;
if(client == 0 || !IsClientInGame(client) || !IsPlayerAlive(client)) return Plugin_Continue;
int primary = pack.ReadCell(); int primary_ammo_type = pack.ReadCell(); int primary_ammo = pack.ReadCell(); int primary_clip = pack.ReadCell(); int secondary = pack.ReadCell(); int secondary_ammo_type = pack.ReadCell(); int secondary_ammo = pack.ReadCell(); int secondary_clip = pack.ReadCell();
if(primary != -1) { SetEntProp(client, Prop_Send, "m_iAmmo", primary_ammo, _, primary_ammo_type); SetEntProp(primary, Prop_Send, "m_iClip1", primary_clip); }
if(secondary != -1) { SetEntProp(client, Prop_Send, "m_iAmmo", secondary_ammo, _, secondary_ammo_type); SetEntProp(secondary, Prop_Send, "m_iClip1", secondary_clip); } return Plugin_Continue; }
__________________
Do not Private Message @me
Last edited by Bacardi; 08-22-2020 at 08:55.
|
|