Changing fire rate of most weapons?

[lua] Class.ShotSpeed = function(ply)
for k, v in pairs(ply:GetWeapons()) do
v.Primary.Delay = (v.Primary.Delay * (1 + (ply.ShotSpeed / 100)))
v.Secondary.Delay = (v.Secondary.Delay * (1 + (ply.ShotSpeed / 100)))
v.Primary.RPM = (v.Primary.RPM * (1 + (ply.ShotSpeed / 100)))
end
end[/lua]

This seems to do nothing

What is the best way to change someone’s firerate

[editline]17th September 2015[/editline]

i have seen it done in multiple places mainly rpg type addons but cant seem to get it to work

Maybe they edited the weapons themself?

the weapon i am trying to alter has Primary.RPM

i changed that, no errors i also changed the way i am doing it
[lua]
if SERVER then
local function onweaponpickup(weapon)
local ply = weapon:GetOwner()
inv_firerate(ply, weapon)
end
hook.Add(‘WeaponEquip’, ‘onweaponpickup’, onweaponpickup )

function inv_firerate(ply, weapon)
	if IsValid(weapon.Primary) then
		if IsValid(weapon.Primary.Delay) then
 			weapon.Primary.Delay = (weapon.Primary.Delay * (1 + (ply.ShotSpeed / 100)))
		end
		if IsValid(weapon.Secondary.Delay) then
 			weapon.Secondary.Delay = (weapon.Secondary.Delay * (1 + (ply.ShotSpeed / 100)))
		end
		if IsValid(weapon.Primary.RPM) then
 			weapon.Primary.RPM = (weapon.Primary.RPM * (1 + (ply.ShotSpeed / 100)))
		end
	end
end

end
[/lua]

This is what i get when i print the table for said weapon (testing with a random weapon)



		AdminSpawnable	=	true
		Author	=	
		AutoSwitchFrom	=	true
		AutoSwitchTo	=	true
		Base	=	clout_gun_base
		BounceWeaponIcon	=	false
		CanBeSilenced	=	false
		Category	=	Clout's CSGO Weapons
		ClassName	=	clt_akvlcn
		Contact	=	
		DrawAmmo	=	true
		DrawCrosshair	=	true
		DrawWeaponInfoBox	=	false
		FiresUnderwater	=	false
		Folder	=	weapons/clt_akvlcn
		Gun	=	clt_akvlcn
		HoldType	=	ar2
		Instructions	=	
		IronSightsAng	=	2.342000 -0.145000 0.000000
		IronSightsPos	=	4.869000 -14.039000 1.769000
		Primary:
				Ammo	=	ar2
				Automatic	=	true
				ClipSize	=	30
				Damage	=	23
				DefaultClip	=	90
				IronAccuracy	=	0.02
				KickDown	=	0.3
				KickHorizontal	=	0.4
				KickUp	=	0.6
				RPM	=	575
				SilencedSound	=	
				Sound	=	clt_vcln-1
				Spread	=	0.03
		PrintName	=	AK-47 Vulcan
		Purpose	=	
		RunSightsAng	=	0.000000 -26.590000 1.608000
		RunSightsPos	=	-5.131000 4.952000 -2.370000
		Secondary:
				IronFOV	=	70
		SelectiveFire	=	false
		ShowWorldModel	=	false
		SightsAng	=	2.342000 -0.145000 0.000000
		SightsPos	=	4.869000 -14.039000 1.769000
		Slot	=	2
		SlotPos	=	3
		Spawnable	=	true
		ViewModel	=	models/weapons/v_vulakclt.mdl
		ViewModelFOV	=	70
		ViewModelFlip	=	true
		WElements:
				clt_vlcn_wrld:
						angle	=	-12.407 2.015 180.000
						bodygroup:
						bone	=	ValveBiped.Bip01_R_Hand
						color:
								a	=	255
								b	=	255
								g	=	255
								r	=	255
						material	=	
						model	=	models/weapons/w_vulakclt.mdl
						pos	=	3.444000 1.483000 0.400000
						rel	=	
						size	=	1.000000 1.000000 1.000000
						skin	=	0
						surpresslightning	=	false
						type	=	Model
		Weight	=	43
		WorldModel	=	models/weapons/w_rif_ak47.mdl
		data:
				ironsights	=	1


I mean edit the weapon ITSELF - the SOURCE of the weapon inside /lua/weapons from the addon.

It might be that the weapon in question, in-fact, does not use these variable to control it’s rate of fire.

I’ve seen quite a few examples of badly coded weapons where it wasn’t used, and it instead was hardcoded.

This is how I did it:


	s:AddHook( "Think", function( this )
		local k, v, wep, pl, prim, sec, save, mul

		for k, v in ipairs( player.GetAll( ) ) do
			if not v:Alive( ) then	continue	end

			wep = v:GetActiveWeapon( )

			if not wep:IsValid( ) then	continue	end

			mul = math.max( .1, 1 - ( RPG:GetSkill( v, this:GetID( ) ) * .05 ) )
			
			mul = RPG:TimeScaleMultiplier( v, mul, 0 )

			save = wep:GetSaveTable( )

			prim = save.m_flNextPrimaryAttack
			sec = save.m_flNextSecondaryAttack

			wep.RPG_LastPrimaryDelay = wep.RPG_LastPrimaryDelay or 0
			wep.RPG_LastSecondaryDelay = wep.RPG_LastSecondaryDelay or 0

			if not ( prim and sec ) then	continue	end

			if prim > wep.RPG_LastPrimaryDelay then
				prim = math.max( prim > .065 and .065 or .01, prim * mul )
				wep:SetSaveValue( "m_flNextPrimaryAttack", prim )
			end

			if sec > wep.RPG_LastSecondaryDelay then
				sec = math.max( sec > .065 and .065 or .01, sec * mul )
				wep:SetSaveValue( "m_flNextSecondaryAttack", sec )
			end

			wep.RPG_LastPrimaryDelay = prim
			wep.RPG_LastSecondaryDelay = sec
		end
	end )

It’s incredibly dirty, but it will work on nearly every weapon barring those that manage the time themselves instead of using the engine methods. You should have an idea of what you need to do from that.

mul = math.max( .1, 1 - ( RPG:GetSkill( v, this:GetID( ) ) * .05 ) )
seems so backwards to me! lol but i got it working thanks alot!

ended up multiplying it by .001 (so 100 shotspeed = 2X normal shotspeed)