--------------------- -- Your Name is Benny --------------------- ITEMS = {} local itemmeta = {} function itemmeta:__tostring() return "ItemDef [" .. self.ClassName .. "]" end local ITEMHELPER = { Get = function( self, key ) return self.key end, GetRaw = function( self, key ) return rawget( self, key ) end, } function itemmeta.__index( self, key ) if ITEMHELPER[key] then return ITEMHELPER[key] end if rawget(self, "BaseClass") then return rawget(self, "BaseClass")[key] end end function AddItem( itemname, item ) if item then ITEMS[itemname] = item item.ClassName = itemname item.BaseClass = ITEMS[item.Base] setmetatable( item, itemmeta ) else return ITEMS[itemname] end end AddItem( "base", { PrintName = "Base Item", Description = "Beginning item base.", Category = "base", Vars = { ["Float"] = { "Acquisition", }, }, HoldType = "slam", ["Initialize"] = function( class, ent, handler ) print( class, "Initialized base initialization" ) end, ["Deploy"] = function( class, ent, handler ) end, ["Holster"] = function( class, ent, handler ) end, ["Attack"] = function( class, ent, handler ) end, ["Think"] = function( class, ent, handler ) end, ["Reload"] = function( class, ent, handler ) end, }) AddItem( "base_firearm", { PrintName = "Base Firearm", Description = "Item base for firearms.", Category = "base", Base = "base", Vars = { ["Int"] = { "Clip", "BurstCount", }, ["Float"] = { "Delay", "DelayBurst", "RefillTime", "Accuracy_Reset", "Accuracy_Amount", "DelayReload", }, }, HoldType = "rpg", Delay = 0.1, Pellets = 1, Accuracy = 1, ClipSize = 15, BurstCount = math.huge, BurstRunaway = false, BurstAuto = false, BurstDelay = 0, ["Initialize"] = function( class, ent, handler ) ITEMS["base"].Initialize( class, ent, handler ) ent:SetClip( class.ClipSize ) print( class, "Initialized a firearm" ) end, ["Think"] = function( class, ent, handler ) local InProcess = ent:GetBurstCount() > 0 local Topped = ent:GetBurstCount() == class.BurstCount local Runaway = class.BurstRunaway local BAuto = class.BurstAuto local Firedown = handler:GetOwner():KeyDown( IN_ATTACK ) if Runaway and InProcess and !Topped then class["Attack"]( class, ent, handler ) else if !Firedown then if !Topped and InProcess then ent:SetDelayBurst( CurTime() + class.BurstDelay ) end ent:SetBurstCount( 0 ) end if Topped and BAuto then ent:SetBurstCount( 0 ) ent:SetDelayBurst( CurTime() + class.BurstDelay ) end end end, ["Attack"] = function( class, ent, handler ) if ent:GetClip() <= 0 then return end if ent:GetDelay() > CurTime() then return end if ent:GetDelayBurst() > CurTime() then return end if ent:GetBurstCount() >= class.BurstCount then return end local Runaway = class.BurstRunaway local BAuto = class.BurstAuto ent:SetBurstCount( ent:GetBurstCount() + 1 ) if ent:GetBurstCount() >= class.BurstCount then ent:SetDelayBurst( CurTime() + class.BurstDelay ) if BAuto then ent:SetBurstCount( 0 ) end end ent:SetClip( ent:GetClip() - 1 ) ent:SetDelay( CurTime() + class.Delay ) handler:EmitSound( istable(class.FireSound) and TSelShared(class.FireSound, "FireSound") or class.FireSound, 140, 100, 0.4, CHAN_STATIC ) local acc = math.rad( class.Accuracy or 0 ) local p = handler:GetOwner() handler:FireBullets( { Attacker = p, Damage = 1, Force = 1, Num = class.Pellets, Dir = p:GetAimVector(), Src = p:GetShootPos(), Spread = Vector( acc, acc, 0 ), } ) end, ["Reload"] = function( class, ent, handler ) if ent:GetClip() >= class.ClipSize then return end if ent:GetDelay() > CurTime() then return end handler:EmitSound( "weapons/m4a1/m4a1_boltpull.wav", 70, 125, 0.4, CHAN_STATIC ) ent:SetDelay( CurTime() + 0.25 ) ent:SetClip( class.ClipSize ) end, ["Deploy"] = function( class, ent, handler ) handler:EmitSound( "weapons/usp/usp_slideback.wav", 70, 125, 0.4, CHAN_STATIC ) ent:SetDelay( CurTime() + 0.25 ) end, ["Holster"] = function( class, ent, handler ) handler:EmitSound( "weapons/m4a1/m4a1_deploy.wav", 70, 125, 0.4, CHAN_STATIC ) ent:SetDelay( CurTime() + 0.25 ) end, }) AddItem( "mk23", { PrintName = "#Item.mk23.Name", Description = "#Item.mk23.Description", Category = "pistol", Base = "base_firearm", Model = "models/weapons/w_pist_usp.mdl", HoldType = "revolver", ClipSize = 12, Delay = (60/350), FireSound = { "benny/weapons/usp/01.ogg", "benny/weapons/usp/02.ogg", "benny/weapons/usp/03.ogg", }, Accuracy = 5/60, BurstCount = 1, Accuracy_Add = 0.5, Accuracy_Reset = 0.4, Accuracy_Decay = 5, }) AddItem( "fnc", { PrintName = "#Item.fnc.Name", Description = "#Item.fnc.Description", Base = "base_firearm", Model = "models/weapons/w_rif_ar556.mdl", HoldType = "rpg", ClipSize = 30, Delay = (60/750), FireSound = { "benny/weapons/m16a2/fire-01.ogg", "benny/weapons/m16a2/fire-02.ogg", "benny/weapons/m16a2/fire-03.ogg", }, Accuracy = 1, Accuracy_Add = 0.4, Accuracy_Reset = 0.4, Accuracy_Decay = 12, }) AddItem( "m16a2", { PrintName = "#Item.m16a2.Name", Description = "#Item.m16a2.Description", Base = "base_firearm", Model = "models/weapons/w_rif_ar556.mdl", HoldType = "rpg", ClipSize = 30, Delay = (60/900), BurstCount = 3, BurstRunaway = true, BurstAuto = true, BurstDelay = 0.2, FireSound = { "benny/weapons/m16a2/fire-01.ogg", "benny/weapons/m16a2/fire-02.ogg", "benny/weapons/m16a2/fire-03.ogg", }, Accuracy = 1, Accuracy_Add = 0.4, Accuracy_Reset = 0.4, Accuracy_Decay = 12, }) AddItem( "spas12", { PrintName = "#Item.spas12.Name", Description = "#Item.spas12.Description", Base = "base_firearm", Model = "models/weapons/w_shotgun.mdl", HoldType = "rpg", ClipSize = 8, Pellets = 8, Delay = 0.4, BurstCount = 1, FireSound = { "benny/weapons/spas12/01.ogg", "benny/weapons/spas12/02.ogg", "benny/weapons/spas12/03.ogg", }, Accuracy = 8, Accuracy_Add = 0.4, Accuracy_Reset = 0.4, Accuracy_Decay = 12, }) for ID, Data in pairs(ITEMS) do local tent = {} tent.Base = "b-itembase" tent.PrintName = Data.PrintName or ID tent.ID = ID tent.Class = ITEMS[ID] tent.Spawnable = true tent.AdminOnly = false tent.Category = "Other" -- print("aei_" .. ID) scripted_ents.Register( tent, "b-item_" .. ID ) end