Begin rebuild

This commit is contained in:
Fesiug 2024-03-06 17:47:44 -05:00
parent eaa404bef1
commit 35ba698d27
Signed by: Fesiug
GPG Key ID: 374BFF45E1EEF243
18 changed files with 317 additions and 3741 deletions

View File

@ -1,59 +0,0 @@
AddCSLuaFile()
ENT.Type = "anim"
ENT.Base = "base_anim"
ENT.RenderGroup = RENDERGROUP_BOTH
function ENT:Initialize()
self.DieTime = CurTime() + 3
end
function ENT:InitSpecial( model )
self:SetModel( model )
-- Physics stuff
self:SetMoveType( MOVETYPE_VPHYSICS )
self:SetSolid( SOLID_VPHYSICS )
-- Init physics only on server, so it doesn't mess up physgun beam
if ( SERVER ) then self:PhysicsInit( SOLID_VPHYSICS ) end
self:SetCollisionGroup( COLLISION_GROUP_PROJECTILE )
-- Make prop to fall on spawn
self:PhysWake()
if SERVER then
local p = self:GetPhysicsObject()
p:SetMass( 0 )
end
end
function ENT:Think()
if SERVER and self.DieTime <= CurTime() then
self:Remove()
end
end
function ENT:PhysicsCollide( data, phys )
if ( data.Speed > 200 ) and data.DeltaTime > 0.2 then
local ent = data.HitEntity
print(ent:Health())
if ent:IsValid() and ent:Health() > 0 then
ent:EmitSound( ")benny/violence/bodysplat_mix2.ogg", 70, 100, 1 )
local dmg = DamageInfo()
dmg:SetDamageType( DMG_CLUB )
dmg:SetDamage( 25 )
dmg:SetAttacker( self:GetOwner() )
dmg:SetInflictor( self )
print( data.HitSpeed, data.HitSpeed:Length() )
dmg:SetDamageForce( data.HitSpeed*-10 )
dmg:SetDamagePosition( data.HitPos )
ent:TakeDamageInfo( dmg )
else
self:EmitSound( "physics/metal/weapon_impact_hard1.wav" )
end
end
end

View File

@ -1,3 +0,0 @@
ENT.Base = "b-item"

View File

@ -1,95 +0,0 @@
function SWEP:DrawWorldModel()
local p = self:GetOwner()
do
local wm = self.CWM
local class = self:bWepClass( false )
if class then
if !IsValid(wm) then
wm = ClientsideModel( class.WModel )
self.CWM = wm
end
wm:SetModel( class.WModel )
wm:SetNoDraw( true )
if class.MAdj then
if wm:IsEffectActive( EF_BONEMERGE ) then
wm:RemoveEffects( EF_BONEMERGE )
end
-- Specify a good position
local offsetVec = class.MAdj
local offsetAng = class.MAdjA or angle_zero
local boneid = p:LookupBone("ValveBiped.Bip01_R_Hand") -- Right Hand
if !boneid then return end
local matrix = p:GetBoneMatrix(boneid)
if !matrix then return end
local newPos, newAng = LocalToWorld(offsetVec, offsetAng, matrix:GetTranslation(), matrix:GetAngles())
wm:SetPos(newPos)
wm:SetAngles(newAng)
wm:SetupBones()
else
if !wm:IsEffectActive( EF_BONEMERGE ) then
wm:AddEffects( EF_BONEMERGE )
end
wm:SetPos(self:GetPos())
wm:SetAngles(self:GetAngles())
end
wm:SetParent( p )
if true or self:GetUserAim() then wm:DrawModel() end
else
if IsValid(wm) then wm:Remove() end
end
end
do
local wm = self.CWM_Left
local class = self:bWepClass( true )
if class then
if !IsValid(wm) then
wm = ClientsideModel( class.WModel )
self.CWM_Left = wm
end
wm:SetModel( class.WModel )
wm:SetNoDraw( true )
if IsValid(p) then
-- Specify a good position
wm:SetPos( vector_origin )
wm:SetAngles( angle_zero )
wm:SetupBones()
local pv = wm:GetBoneMatrix( wm:LookupBone( "ValveBiped.Bip01_R_Hand" ) ):GetTranslation()
local pa = wm:GetBoneMatrix( wm:LookupBone( "ValveBiped.Bip01_R_Hand" ) ):GetAngles()
pv.x = -pv.x
pv.y = pv.y
pv.z = -pv.z
pa.p = -pa.p
pa.r = pa.r + 180
local boneid = p:LookupBone("ValveBiped.Bip01_L_Hand") -- Right Hand
if !boneid then return end
local matrix = p:GetBoneMatrix(boneid)
if !matrix then return end
local newPos, newAng = LocalToWorld(pv, pa, matrix:GetTranslation(), matrix:GetAngles())
wm:SetPos(newPos)
wm:SetAngles(newAng)
wm:SetupBones()
else
wm:SetPos(self:GetPos())
wm:SetAngles(self:GetAngles())
wm:SetupBones()
end
if true or self:GetUserAim() then wm:DrawModel() end
else
if IsValid(wm) then wm:Remove() end
end
end
end

View File

@ -1,34 +0,0 @@
function SWEP:Drop( hand )
if self:bWepClass( hand ) then
local p = self:GetOwner()
self:EmitSound( "weapons/slam/throw.wav", 70, 100, 1, CHAN_STATIC )
if SERVER then
local throw = ents.Create( "b-item" )
throw:SetPos( p:EyePos() + p:EyeAngles():Forward()*16 )
throw:SetAngles( p:EyeAngles() )
throw:SetOwner( p )
throw:InitSpecial(self:bWepClass( hand ).WModel)
throw:SetPhysicsAttacker( p )
throw:Spawn()
local throwp = throw:GetPhysicsObject()
assert( throwp:IsValid(), "Benny Drop: Physics object invalid" )
throwp:SetVelocityInstantaneous( (p:EyeAngles()+Angle(-7,0,0)):Forward()*1000 )
if self:bWepClass( hand ).ClassName == "m16a2" then
throwp:SetAngleVelocityInstantaneous( Vector( 360*-0.2, 360*1, 360*0 ) )
else
throwp:SetAngleVelocityInstantaneous( Vector( 360*-0.25, 360*10, 360*0.25 ) )
end
end
if SERVER or CLIENT and IsFirstTimePredicted() then
--InvDiscard( p, self:bGetInvID( hand ) )
end
self:SetJustThrew( CurTime() + 0.25 )
self:SetJustThrewHand( hand )
self:bWepTable( hand ).Thrown = true
p:AddVCDSequenceToGestureSlot( GESTURE_SLOT_JUMP, p:SelectWeightedSequence( ACT_HL2MP_GESTURE_RANGE_ATTACK_MELEE ), 0, true )
end
end

View File

@ -1,84 +0,0 @@
function SWEP:PrimaryAttack()
if self:bWepTable( self:hFlipHand( false ) ) and self:bWepTable( self:hFlipHand( false ) ).Thrown then return true end
self:BFireLogic( self:hFlipHand( false ) )
return true
end
function SWEP:SecondaryAttack()
if self:bWepTable( self:hFlipHand( true ) ) and self:bWepTable( self:hFlipHand( true ) ).Thrown then return true end
self:BFireLogic( self:hFlipHand( true ) )
return true
end
function SWEP:BFireLogic( hand )
if self:bWepClass( hand ) then
self:BFire( hand )
elseif self:bWepClass( !hand ) then
self:BFireAlt( !hand )
end
end
function SWEP:BFire( hand )
if self:bWepClass( hand ) and self:bWepClass( hand ).Func_Attack then
if self:bWepClass( hand ).Func_Attack( self, hand ) then return end
end
end
function SWEP:BFireAlt( hand )
if self:bWepClass( hand ) and self:bWepClass( hand ).Func_AttackAlt then
if self:bWepClass( hand ).Func_AttackAlt( self, hand ) then return end
end
end
local bc = { effects = true, damage = true }
function SWEP:CallFire( hand )
local p = self:GetOwner()
local class = self:bWepClass( hand )
local spread = self:BSpread( hand )
for i=1, self:GetStat( hand, "Pellets" ) do
local dir = self:GetOwner():EyeAngles()
local radius = util.SharedRandom("benny_distance_"..tostring(hand), 0, 1, i )
local circ = util.SharedRandom("benny_radius_"..tostring(hand), 0, math.rad(360), i )
dir:RotateAroundAxis( dir:Right(), spread * radius * math.sin( circ ) )
dir:RotateAroundAxis( dir:Up(), spread * radius * math.cos( circ ) )
dir:RotateAroundAxis( dir:Forward(), 0 )
local tr = util.TraceLine( {
start = p:EyePos(),
endpos = p:EyePos() + dir:Forward() * 8192,
filter = p
} )
self:FireBullets( {
Attacker = p,
Damage = class.Damage,
Force = ( class.Damage / 10 ) * self:GetStat( hand, "Pellets" ),
Src = p:EyePos(),
Dir = dir:Forward(),
Tracer = 0,
IgnoreEntity = p,
Callback = function( atk, tr, dmginfo )
if CLIENT and IsFirstTimePredicted() then
self:FireCL( hand, tr )
end
return bc
end,
} )
end
end
function SWEP:FireCL( hand, tr )
-- PROTO: This is shit! Replace it with a function that gets the right model.
local vStart = (hand and self.CWM_Left or self.CWM):GetAttachment( 1 ).Pos
local vPoint = tr.HitPos
local effectdata = EffectData()
effectdata:SetStart( vStart )
effectdata:SetOrigin( vPoint )
effectdata:SetEntity( self )
effectdata:SetScale( 1025*12 )
effectdata:SetFlags( 1 )
util.Effect( "Tracer", effectdata )
end

View File

@ -1,155 +0,0 @@
-- Holdtype thingys
do
local ActIndex = {
[ "pistol" ] = ACT_HL2MP_IDLE_PISTOL,
[ "smg" ] = ACT_HL2MP_IDLE_SMG1,
[ "grenade" ] = ACT_HL2MP_IDLE_GRENADE,
[ "ar2" ] = ACT_HL2MP_IDLE_AR2,
[ "shotgun" ] = ACT_HL2MP_IDLE_SHOTGUN,
[ "rpg" ] = ACT_HL2MP_IDLE_RPG,
[ "physgun" ] = ACT_HL2MP_IDLE_PHYSGUN,
[ "crossbow" ] = ACT_HL2MP_IDLE_CROSSBOW,
[ "melee" ] = ACT_HL2MP_IDLE_MELEE,
[ "slam" ] = ACT_HL2MP_IDLE_SLAM,
[ "normal" ] = ACT_HL2MP_IDLE,
[ "fist" ] = ACT_HL2MP_IDLE_FIST,
[ "melee2" ] = ACT_HL2MP_IDLE_MELEE2,
[ "passive" ] = ACT_HL2MP_IDLE_PASSIVE,
[ "knife" ] = ACT_HL2MP_IDLE_KNIFE,
[ "duel" ] = ACT_HL2MP_IDLE_DUEL,
[ "camera" ] = ACT_HL2MP_IDLE_CAMERA,
[ "magic" ] = ACT_HL2MP_IDLE_MAGIC,
[ "revolver" ] = ACT_HL2MP_IDLE_REVOLVER,
[ "suitcase" ] = ACT_HL2MP_IDLE,
[ "melee_angry" ] = ACT_HL2MP_IDLE_MELEE_ANGRY,
[ "angry" ] = ACT_HL2MP_IDLE_ANGRY,
[ "scared" ] = ACT_HL2MP_IDLE_SCARED,
[ "zombie" ] = ACT_HL2MP_IDLE_ZOMBIE,
[ "cower" ] = ACT_HL2MP_IDLE_COWER,
}
--[[---------------------------------------------------------
Name: SetWeaponHoldType
Desc: Sets up the translation table, to translate from normal
standing idle pose, to holding weapon pose.
-----------------------------------------------------------]]
function SWEP:SetWeaponHoldType( t )
t = string.lower( t )
local index = ActIndex[ t ]
if ( index == nil ) then
Msg( "SWEP:SetWeaponHoldType - ActIndex[ \"" .. t .. "\" ] isn't set! (defaulting to normal)\n" )
t = "normal"
index = ActIndex[ t ]
end
self.ActivityTranslate = {}
self.ActivityTranslate[ ACT_MP_STAND_IDLE ] = index
self.ActivityTranslate[ ACT_MP_WALK ] = index + 1
self.ActivityTranslate[ ACT_MP_RUN ] = index + 2
self.ActivityTranslate[ ACT_MP_CROUCH_IDLE ] = index + 3
self.ActivityTranslate[ ACT_MP_CROUCHWALK ] = index + 4
self.ActivityTranslate[ ACT_MP_ATTACK_STAND_PRIMARYFIRE ] = index + 5
self.ActivityTranslate[ ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ] = index + 5
self.ActivityTranslate[ ACT_MP_RELOAD_STAND ] = index + 6
self.ActivityTranslate[ ACT_MP_RELOAD_CROUCH ] = index + 6
self.ActivityTranslate[ ACT_MP_JUMP ] = index + 7
self.ActivityTranslate[ ACT_RANGE_ATTACK1 ] = index + 8
self.ActivityTranslate[ ACT_MP_SWIM ] = index + 9
-- "normal" jump animation doesn't exist
if ( t == "normal" ) then
self.ActivityTranslate[ ACT_MP_JUMP ] = ACT_HL2MP_JUMP_SLAM
end
if ( t == "suitcase" ) then
self.ActivityTranslate[ ACT_MP_STAND_IDLE ] = ACT_HL2MP_IDLE_SUITCASE
self.ActivityTranslate[ ACT_MP_WALK ] = ACT_HL2MP_WALK_SUITCASE
self.ActivityTranslate[ ACT_MP_JUMP ] = ACT_HL2MP_JUMP_SLAM
end
if ( t == "passive" ) then
self.ActivityTranslate[ ACT_MP_CROUCH_IDLE ] = ACT_HL2MP_IDLE_CROUCH_SLAM
self.ActivityTranslate[ ACT_MP_CROUCHWALK ] = ACT_HL2MP_WALK_CROUCH_SLAM
end
if ( t == "rpg" ) then
self.ActivityTranslate[ ACT_MP_CROUCH_IDLE ] = ACT_HL2MP_IDLE_CROUCH_AR2
self.ActivityTranslate[ ACT_MP_CROUCHWALK ] = ACT_HL2MP_WALK_CROUCH_AR2
end
--self:SetupWeaponHoldTypeForAI( t )
end
-- Default hold pos is the pistol
SWEP:SetWeaponHoldType( "pistol" )
--[[---------------------------------------------------------
Name: weapon:TranslateActivity()
Desc: Translate a player's Activity into a weapon's activity
So for example, ACT_HL2MP_RUN becomes ACT_HL2MP_RUN_PISTOL
Depending on how you want the player to be holding the weapon
-----------------------------------------------------------]]
function SWEP:TranslateActivity( act )
if ( self.Owner:IsNPC() ) then
if ( self.ActivityTranslateAI[ act ] ) then
return self.ActivityTranslateAI[ act ]
end
return -1
end
if ( self.ActivityTranslate[ act ] != nil ) then
return self.ActivityTranslate[ act ]
end
return -1
end
end
SWEP.GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_SHOTGUN, 0.85 }
SWEP.GestureReload = { ACT_FLINCH_STOMACH, 0.3 }
SWEP.GestureDraw = { ACT_GMOD_GESTURE_MELEE_SHOVE_1HAND, 0.75 }
SWEP.GestureHolster = { ACT_GMOD_GESTURE_MELEE_SHOVE_1HAND, 0.65 }
function SWEP:TPFire( hand )
if CLIENT and !IsFirstTimePredicted() then return end
local target = self:bWepClass( hand ) and self:bWepClass( hand ).GestureFire
if !target then
target = self.GestureFire
end
self:GetOwner():AddVCDSequenceToGestureSlot( GESTURE_SLOT_GRENADE, self:GetOwner():SelectWeightedSequence(target[1]), target[2], true )
end
function SWEP:TPCustom( tg1, tg2 )
if CLIENT and !IsFirstTimePredicted() then return end
self:GetOwner():AddVCDSequenceToGestureSlot( GESTURE_SLOT_GRENADE, self:GetOwner():SelectWeightedSequence(tg1), tg2, true )
end
function SWEP:TPReload( hand )
if CLIENT and !IsFirstTimePredicted() then return end
local target = self:bWepClass( hand ) and self:bWepClass( hand ).GestureReload
if !target then
target = self.GestureReload
end
self:GetOwner():AddVCDSequenceToGestureSlot( GESTURE_SLOT_GRENADE, self:GetOwner():SelectWeightedSequence(target[1]), target[2], true )
end
function SWEP:TPDraw( hand )
if CLIENT and !IsFirstTimePredicted() then return end
local target = self:bWepClass( hand ) and self:bWepClass( hand ).GestureDraw
if !target then
target = self.GestureDraw
end
self:GetOwner():AddVCDSequenceToGestureSlot( GESTURE_SLOT_GRENADE, self:GetOwner():SelectWeightedSequence(target[1]), target[2], true )
end
function SWEP:TPHolster( hand )
if CLIENT and !IsFirstTimePredicted() then return end
local target = self:bWepClass( hand ) and self:bWepClass( hand ).GestureHolster
if !target then
target = self.GestureHolster
end
self:GetOwner():AddVCDSequenceToGestureSlot( GESTURE_SLOT_GRENADE, self:GetOwner():SelectWeightedSequence(target[1]), target[2], true )
end

View File

@ -1,97 +0,0 @@
function SWEP:GetStat( hand, stat )
local Hand = ((hand==true and "Left Hand") or (hand==false and "Right Hand"))
assert( self:bWepClass( hand ), "No weapon in " .. Hand .. " (Trying to get stat " .. stat .. ")" )
local thereturn = (self:bWepClass( hand ) and self:bWepClass( hand )[stat])
assert( thereturn, "No stat for " .. stat .. " ( " .. Hand .. " )" )
return thereturn
end
function BENNY_GetStat( class, stat )
assert( class, "No class" )
local thereturn = class[stat]
assert( thereturn, "No stat for " .. stat )
return thereturn
end
function SWEP:hFlipHand( hand )
hand = hand or false
local p = self:GetOwner()
local lt = self:bWepClass( true )
local flip = false
if lt then
if lt.Features == "firearm" then
flip = p:GetInfoNum( "benny_wep_ao_firearms", 1 )==1
elseif lt.Features == "grenade" then
flip = p:GetInfoNum( "benny_wep_ao_grenades", 0 )==1
else
flip = p:GetInfoNum( "benny_wep_ao_junk", 0 )==1
end
else
--return false
end
return ((flip and !hand) or (!flip and hand))
end
function SWEP:C_AttackDown( hand )
if self:hFlipHand() then hand = !hand end
return (hand == true) and self:GetOwner():KeyDown( IN_ATTACK2 ) or (hand == false) and self:GetOwner():KeyDown( IN_ATTACK )
end
function SWEP:BDeploy( hand, id )
assert( isbool(hand), "You forgot the hand." )
assert( isstring(id), "You forgot the ID." )
if self:bGetInvID( hand ) == id then
-- This breaks prediction somewhat!!
-- return -- PROTO: If you're in the middle of holstering, cancel it
elseif self:bGetInvID( hand ) != "" then
return--self:BHolster( hand )
end
local p = self:GetOwner()
local inv = p:INV_Get()
local item = inv[id]
local class = WeaponGet(item.Class)
assert( item, "That item doesn't exist. " .. tostring(item) )
self:bSetInvID( hand, id )
self:bSetMagInvID( hand, "" )
self:bSetIntClip( hand, 0 )
self:bSetSpread( hand, 0 )
self:bSetIntDelay( hand, CurTime() + 0.35 )
B_Sound( self, "Common.Deploy" )
if item.Loaded and item.Loaded != "" then
local mid = item.Loaded
local midi = inv[ mid ]
if !midi then
item.Loaded = ""
error( "Deploy: Magazine doesn't exist in the inventory!! " .. tostring(mid) .. " item.Loaded removed." )
end
self:bSetMagInvID( hand, mid )
self:bSetIntClip( hand, midi.Ammo )
end
end
function SWEP:BHolster( hand )
if self:bGetInvID( hand ) == "" then
return -- What the hell are you holstering..?
end
local p = self:GetOwner()
--B_Sound( self, "Common.Holster" )
local item = self:bWepTable( hand )
if item then
local class = WeaponGet(item.Class)
if class.Custom_Holster then class.Custom_Holster( self, item, class, hand ) end
end
self:bSetInvID( hand, "" )
self:bSetMagInvID( hand, "" )
self:bSetIntClip( hand, 0 )
end
function SWEP:BSpread( hand )
return self:bWepClass( hand ).Spread + self:bGetSpread( hand )
end

View File

@ -1,135 +0,0 @@
-- Reload logic
function SWEP:Reload( hand )
if hand == nil then return end -- Needs to be called from the custom ones
local p = self:GetOwner()
local inv = p:INV_Get()
local wep_table = self:bWepTable( hand )
local wep_class = self:bWepClass( hand )
if wep_table then
if self:bWepClass( hand ) and self:bWepClass( hand ).Func_Reload then
if self:bWepClass( hand ).Func_Reload( self, hand ) then return end
end
if wep_class.Custom_Reload then
if wep_class.Custom_Reload( self, wep_table ) then return end
end
if self:bGetIntDelay( hand ) > CurTime() then
return false
end
local rt = self:bGetReloadTime( hand )
if rt > 0 then
local rtt = self:bGetReloadType( hand )
-- TODO: Unshitify this.
if rtt == 1 then
if (rt+self:GetStat( hand, "Reload_MagIn_Bonus1" )) <= RealTime() and RealTime() <= (rt+self:GetStat( hand, "Reload_MagIn_Bonus2" )) then
self:bSetReloadTime( hand, 0 )
return true
else
B_Sound( self, "Common.ReloadFail" )
self:bSetReloadTime( hand, RealTime() )
return false
end
else
return false
end
end
local curmag = self:bGetMagInvID( hand )
if curmag != "" then
self:bSetReloadTime( hand, RealTime() )
self:bSetReloadType( hand, 2 )
B_Sound( self, wep_class.Sound_MagOut )
self:Reload_MagOut( hand, self:bGetMagInvID( hand ), inv )
elseif self:GetBestLoadableMagazine( hand, wep_table.Class, inv, wep_table ) then
self:bSetReloadTime( hand, RealTime() )
self:bSetReloadType( hand, 1 )
B_Sound( self, wep_class.Sound_MagIn )
else
B_Sound( self, "Common.NoAmmo" )
end
self:TPReload( hand )
end
return true
end
function SWEP:Reload_MagOut( hand, curmag, optinv, optwep_table, optwep_class )
local p = self:GetOwner()
local inv = optinv or p:INV_Get()
local wep_table = optwep_table or self:bWepTable( hand )
local wep_class = optwep_class or self:bWepClass( hand )
if !inv[curmag] then
-- PROTO: This happens sometimes. I'm commenting it so it doesn't look like anything broke, because it didn't.
-- ErrorNoHalt( "Mag isn't a valid item" )
self:bSetMagInvID( hand, "" )
wep_table.Loaded = ""
elseif inv[curmag].Ammo == 0 then
if SERVER or (CLIENT and IsFirstTimePredicted()) then
p:INV_Discard( curmag )
end
end
self:bSetMagInvID( hand, "" )
self:bSetIntClip( hand, 0 )
--B_Sound( self, wep_class.Sound_MagOut )
wep_table.Loaded = ""
end
function SWEP:GetLoadableMagazines( hand, class, optinv, optwep_table )
local p = self:GetOwner()
local inv = optinv or p:INV_Get()
local wep_table = optwep_table or self:bWepTable( hand )
local maglist = p:INV_FindMag( wep_table.Class )
local usedlist = {}
for _id, mrow in pairs( inv ) do
if mrow.Loaded and mrow.Loaded != "" then
usedlist[mrow.Loaded] = true
end
end
return maglist
end
function SWEP:GetBestLoadableMagazine( hand, class, optinv, optwep_table )
local p = self:GetOwner()
local inv = optinv or p:INV_Get()
local wep_table = optwep_table or self:bWepTable( hand )
local maglist = p:INV_FindMag( wep_table.Class )
local mag = false
local usedlist = {}
for _id, mrow in pairs( inv ) do
if mrow.Loaded and mrow.Loaded != "" then
usedlist[mrow.Loaded] = true
end
end
for num, mid in ipairs( maglist ) do
if usedlist[mid] then
else
mag = mid
break
end
end
return mag
end
function SWEP:Reload_MagIn( hand, curmag, optinv, optwep_table, optwep_class )
local p = self:GetOwner()
local inv = optinv or p:INV_Get()
local wep_table = optwep_table or self:bWepTable( hand )
local wep_class = optwep_class or self:bWepClass( hand )
local mag = self:GetBestLoadableMagazine( hand, wep_table.Class )
if mag then
self:bSetMagInvID( hand, mag )
self:bSetIntClip( hand, inv[mag].Ammo )
wep_table.Loaded = mag
B_Sound( self, wep_class.Sound_Cock )
else
B_Sound( self, "Common.NoAmmo" )
end
end

View File

@ -1,156 +0,0 @@
-- Stat2
function SWEP:bWepTable( alt )
return self:GetOwner():INV_Get()[ ((alt==true) and self:GetWep2()) or ((alt==false) and self:GetWep1()) ]
end
function SWEP:bWepClass( alt )
local ta = self:bWepTable( alt )
if ta then
return WeaponGet( ta.Class )
else
return false
end
end
function SWEP:bMagTable( alt )
return self:GetOwner():INV_Get()[ ((alt==true) and self:GetWep2_Clip()) or ((alt==false) and self:GetWep1_Clip()) ]
end
function SWEP:bMagClass( alt )
local ta = self:bMagTable( alt )
if ta then
return WeaponGet( ta.Class )
else
return false
end
end
-- Weapon ID
function SWEP:bGetInvID( hand )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:GetWep2() or (hand == false) and self:GetWep1()
end
function SWEP:bSetInvID( hand, value )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:SetWep2( value ) or (hand == false) and self:SetWep1( value )
end
-- Wep. Clip ID
function SWEP:bGetMagInvID( hand )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:GetWep2_Clip() or (hand == false) and self:GetWep1_Clip()
end
function SWEP:bSetMagInvID( hand, value )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:SetWep2_Clip( value ) or (hand == false) and self:SetWep1_Clip( value )
end
-- Weapon Firemode
function SWEP:bGetFiremode( hand )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:GetWep2_Firemode() or (hand == false) and self:GetWep1_Firemode()
end
function SWEP:bSetFiremode( hand, value )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:SetWep2_Firemode( value ) or (hand == false) and self:SetWep1_Firemode( value )
end
-- Weapon Burst
function SWEP:bGetBurst( hand )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:GetWep2_Burst() or (hand == false) and self:GetWep1_Burst()
end
function SWEP:bSetBurst( hand, value )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:SetWep2_Burst( value ) or (hand == false) and self:SetWep1_Burst( value )
end
-- Weapon Spread
function SWEP:bGetSpread( hand )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:GetWep2_Spread() or (hand == false) and self:GetWep1_Spread()
end
function SWEP:bSetSpread( hand, value )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:SetWep2_Spread( value ) or (hand == false) and self:SetWep1_Spread( value )
end
-- Weapon Spread
function SWEP:bGetShotTime( hand )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:GetWep2_ShotTime() or (hand == false) and self:GetWep1_ShotTime()
end
function SWEP:bSetShotTime( hand, value )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:SetWep2_ShotTime( value ) or (hand == false) and self:SetWep1_ShotTime( value )
end
-- Weapon Holstering Time
function SWEP:bGetHolsterTime( hand )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:GetWep2_Holstering() or (hand == false) and self:GetWep1_Holstering()
end
function SWEP:bSetHolsterTime( hand, value )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:SetWep2_Holstering( value ) or (hand == false) and self:SetWep1_Holstering( value )
end
-- Weapon Reloading Time
function SWEP:bGetReloadTime( hand )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:GetWep2_Reloading() or (hand == false) and self:GetWep1_Reloading()
end
function SWEP:bSetReloadTime( hand, value )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:SetWep2_Reloading( value ) or (hand == false) and self:SetWep1_Reloading( value )
end
-- Weapon Reload Type
function SWEP:bGetReloadType( hand )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:GetWep2_ReloadType() or (hand == false) and self:GetWep1_ReloadType()
end
function SWEP:bSetReloadType( hand, value )
assert( hand!=nil, "Missing hand argument" )
return (hand == true) and self:SetWep2_ReloadType( value ) or (hand == false) and self:SetWep1_ReloadType( value )
end
-- Weapon Player Requesting ID
function SWEP:bGetReqInvID( hand )
local p = self:GetOwner()
return (hand == true) and p:GetReqID2() or (hand == false) and p:GetReqID1()
end
function SWEP:bSetReqInvID( hand, value )
local p = self:GetOwner()
return (hand == true) and p:SetReqID2( value ) or (hand == false) and p:SetReqID1( value )
end
-- Internal SWEP Delay
function SWEP:bGetIntDelay( hand )
return (hand == true) and self:GetDelay2() or (hand == false) and self:GetDelay1()
end
function SWEP:bSetIntDelay( hand, value )
return (hand == true) and self:SetDelay2( value ) or (hand == false) and self:SetDelay1( value )
end
-- Internal SWEP Clip
function SWEP:bGetIntClip( hand )
return (hand == true) and self:Clip2() or (hand == false) and self:Clip1()
end
function SWEP:bSetIntClip( hand, value )
return (hand == true) and self:SetClip2( value ) or (hand == false) and self:SetClip1( value )
end

View File

@ -1,34 +0,0 @@
if SERVER then
util.AddNetworkString( "Benny_StatRegen" )
function SWEP:BSend( ... )
net.Start( "Benny_StatRegen" )
net.WriteUInt( #{ ... }, 4 )
for i, v in ipairs( { ... } ) do
net.WriteString( v[1] )
net.WriteBool( v[2] )
if v[2] then
net.WriteString( v[3] )
else
net.WriteDouble( v[3] )
end
end
net.Send( self:GetOwner() )
end
else
net.Receive( "Benny_StatRegen", function( len, ply )
local count = net.ReadUInt( 4 )
for i=1, count do
local stat = net.ReadString()
local str = net.ReadBool()
local data
if str then
data = net.ReadString()
else
data = net.ReadDouble()
end
LocalPlayer():GetActiveWeapon():bWepTable()[stat] = data
end
end)
end

View File

@ -1,311 +0,0 @@
-- The benny weapon handles the weapon pickups you find throughout the game.
SWEP.Base = "weapon_base"
SWEP.PrintName = "Benny Weapon Handler"
SWEP.ViewModel = "models/weapons/c_pistol.mdl"
SWEP.ViewModelFOV = 10
SWEP.WorldModel = "models/weapons/w_pistol.mdl"
SWEP.Primary.ClipSize = 0
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Automatic = true
SWEP.Primary.Ammo = "none"
SWEP.Secondary.ClipSize = 0
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Automatic = true
SWEP.Secondary.Ammo = "none"
AddCSLuaFile( "sh_statregen.lua" )
include ( "sh_statregen.lua" )
AddCSLuaFile( "sh_firing.lua" )
include ( "sh_firing.lua" )
AddCSLuaFile( "sh_inv.lua" )
include ( "sh_inv.lua" )
AddCSLuaFile( "sh_stat2.lua" )
include ( "sh_stat2.lua" )
AddCSLuaFile( "sh_holdtypes.lua" )
include ( "sh_holdtypes.lua" )
AddCSLuaFile( "sh_reload.lua" )
include ( "sh_reload.lua" )
AddCSLuaFile( "sh_drop.lua" )
include ( "sh_drop.lua" )
AddCSLuaFile( "cl_wm.lua" )
if CLIENT then
include ( "cl_wm.lua" )
end
function SWEP:SetupDataTables()
self:NetworkVar( "Float", 0, "Aim" )
self:NetworkVar( "Float", 1, "Delay1" )
self:NetworkVar( "Float", 2, "Delay2" )
self:NetworkVar( "Float", 3, "GrenadeDownStart" )
self:NetworkVar( "Float", 4, "Wep1_Spread" )
self:NetworkVar( "Float", 5, "Wep2_Spread" )
self:NetworkVar( "Float", 6, "Wep1_ShotTime" )
self:NetworkVar( "Float", 7, "Wep2_ShotTime" )
self:NetworkVar( "Float", 8, "Wep1_Holstering" )
self:NetworkVar( "Float", 9, "Wep2_Holstering" )
self:NetworkVar( "Float", 10, "Wep1_Reloading" )
self:NetworkVar( "Float", 11, "Wep2_Reloading" )
self:NetworkVar( "Float", 12, "JustThrew" )
self:NetworkVar( "String", 0, "Wep1" )
self:NetworkVar( "String", 1, "Wep2" )
self:NetworkVar( "String", 2, "Wep1_Clip" )
self:NetworkVar( "String", 3, "Wep2_Clip" )
self:NetworkVar( "Int", 0, "Wep1_Burst" )
self:NetworkVar( "Int", 1, "Wep2_Burst" )
self:NetworkVar( "Int", 2, "Wep1_Firemode" )
self:NetworkVar( "Int", 3, "Wep2_Firemode" )
self:NetworkVar( "Int", 4, "Wep1_ReloadType" )
self:NetworkVar( "Int", 5, "Wep2_ReloadType" )
self:NetworkVar( "Bool", 0, "UserAim" )
self:NetworkVar( "Bool", 1, "GrenadeDown" )
self:NetworkVar( "Bool", 2, "JustThrewHand" )
self:SetWep1_Firemode( 1 )
self:SetWep2_Firemode( 1 )
self:SetWep1_Holstering( -1 )
self:SetWep2_Holstering( -1 )
self:SetWep1_Reloading( -1 )
self:SetWep2_Reloading( -1 )
end
function SWEP:B_Ammo( hand, value )
local p = self:GetOwner()
local inv = p:INV_Get()
self:bSetIntClip( hand, value )
assert( self:bGetMagInvID( hand ) != "", "There is no magazine loaded!" )
inv[ self:bGetMagInvID( hand ) ].Ammo = value
end
function SWEP:B_Firemode( alt )
return self:bWepClass( alt ).Firemodes[ self:bGetFiremode( alt ) ]
end
function SWEP:B_FiremodeName( alt )
local mode = self:B_Firemode( alt ).Mode
if mode == 1 then
return "SEMI"
elseif mode == math.huge then
return "AUTO"
else
return mode .. "RND"
end
end
hook.Add( "PlayerButtonDown", "Benny_PlayerButtonDown_TempForAim", function( ply, button )
local wep = ply:BennyCheck()
if wep then
if button == KEY_F then
if tobool(ply:GetInfoNum("benny_wep_toggleaim", 1)) then
wep:SetUserAim( !wep:GetUserAim() )
else
wep:SetUserAim( true )
end
end
if button == ply:GetInfoNum("benny_bind_reload", KEY_R) then
wep:Reload( wep:hFlipHand( false ) )
end
if button == ply:GetInfoNum("benny_bind_reloada", KEY_T) then
wep:Reload( wep:hFlipHand( true ) )
end
if button == ply:GetInfoNum("benny_bind_drop", KEY_G) then
wep:Drop( wep:hFlipHand( false ) )
end
if button == ply:GetInfoNum("benny_bind_dropa", KEY_H) then
wep:Drop( wep:hFlipHand( true ) )
end
end
end)
hook.Add( "PlayerButtonUp", "Benny_PlayerButtonUp_TempForAim", function( ply, button )
local wep = ply:BennyCheck()
if wep then
if button == KEY_F then
if !tobool(ply:GetInfoNum("benny_wep_toggleaim", 0)) then
wep:SetUserAim( false )
end
end
end
end)
function SWEP:BStartHolster( hand )
if self:bGetHolsterTime( hand ) == -1 then
B_Sound( self, "Common.Holster" )
-- print( "Holstering the " .. (hand and "LEFT" or "RIGHT") )
self:bSetHolsterTime( hand, 0 )
self:bSetReloadTime( hand, -1 )
self:bSetReloadType( hand, 0 )
end
end
function SWEP:BThinkHolster( hand )
if self:bGetHolsterTime( hand ) >= 0 then
self:bSetHolsterTime( hand, math.Approach( self:bGetHolsterTime( hand ), 1, FrameTime() / 0.35 ) )
end
if self:bGetHolsterTime( hand ) == 1 then
self:bSetHolsterTime( hand, -1 )
self:bSetReloadTime( hand, -1 )
self:bSetReloadType( hand, 0 )
self:BHolster( hand )
local p = self:GetOwner()
local req = self:bGetReqInvID( hand )
local inv = p:INV_Get()
if req != "" and inv[req] then
self:BDeploy( hand, req )
end
end
end
function SWEP:Think()
local p = self:GetOwner()
local inv = p:INV_Get()
local wep1 = self:bWepTable( false )
local wep1c = self:bWepClass( false )
local wep2 = self:bWepTable( true )
local wep2c = self:bWepClass( true )
if self:bGetReqInvID( false ) != "" and self:bGetReqInvID( true ) != "" and self:bGetReqInvID( false ) == self:bGetReqInvID( true ) then
self:bSetReqInvID( false, "" )
self:bSetReqInvID( true, "" )
if CLIENT then chat.AddText( "Same weapons on ReqID, both holstered" ) end
end
for i=1, 2 do
local hand = i==2
if self:bGetReqInvID( hand ) != "" and !inv[self:bGetReqInvID( hand )] then
self:bSetReqInvID( hand, "" )
end
local req = self:bGetReqInvID( hand )
local req_o = self:bGetReqInvID( !hand )
local curr = self:bGetInvID( hand )
local curr_o = self:bGetInvID( !hand )
if req != curr then
-- Don't allow holstering from this weapon if...
-- Just know, this feels bad.
if self:bGetReloadTime( hand ) > 0 then
-- hold
elseif self:GetJustThrew() > CurTime() then
-- hold
elseif self:bWepClass( hand ) and self:bGetShotTime( hand ) + self:GetStat( hand, "ShootHolsterTime" ) > CurTime() then
-- hold
else
if curr != "" then
-- require holster first
self:BStartHolster( hand )
else
local otherhasthis = curr_o == req
if req != "" then
if otherhasthis then
self:BStartHolster( !hand )
else
self:BDeploy( hand, req )
end
else
self:BStartHolster( hand )
end
end
end
end
self:BThinkHolster( hand )
if self:GetJustThrew() != 0 and self:GetJustThrew() <= CurTime() then
if SERVER then
InvDiscard( p, self:bGetInvID( self:GetJustThrewHand() ) )
end
self:SetJustThrew( 0 )
end
do -- Reload logic
if self:bGetReloadTime( hand ) != -1 then
local rlt = self:bGetReloadType( hand )
-- TODO: Unshitify this.
if RealTime() >= self:bGetReloadTime( hand ) + (rlt == 1 and self:GetStat( hand, "Reload_MagIn" ) or rlt == 2 and self:GetStat( hand, "Reload_MagOut" )) then
if rlt == 1 then
if SERVER or (CLIENT and IsFirstTimePredicted() ) then
self:Reload_MagIn( hand, self:bGetMagInvID( hand ), inv )
end
elseif rlt == 2 then
end
self:bSetReloadTime( hand, -1 )
self:bSetReloadType( hand, 0 )
-- Do reload stuff.
end
end
end
end
self:SetAim( math.Approach( self:GetAim(), self:GetUserAim() and 1 or 0, FrameTime()/0.2 ) )
for i=1, 2 do
local hand = i==2
if !self:C_AttackDown( hand ) then
self:bSetBurst( hand, 0 )
end
end
for i=1, 2 do
local hand = i==2
local wep, wepc = self:bWepTable( hand ), self:bWepClass( hand )
if wepc and wepc.Features == "firearm" and self:bGetIntDelay( hand ) < CurTime()-0.01 then
local mweh = math.Remap( CurTime(), self:bGetShotTime( hand ), self:bGetShotTime( hand ) + self:GetStat( hand, "SpreadDecay_RampTime" ), 0, 1 )
mweh = math.Clamp( mweh, 0, 1 )
local decayfinal = Lerp( math.ease.InExpo( mweh ), self:GetStat( hand, "SpreadDecay_Start" ), self:GetStat( hand, "SpreadDecay_End" ) )
self:bSetSpread( hand, math.Approach( self:bGetSpread( hand ), 0, decayfinal * FrameTime() ) )
end
end
local ht = "normal"
if self:bWepClass( false ) and self:bGetHolsterTime( false ) < 0 then
ht = "passive"
if self:GetUserAim() then
if self:GetJustThrew() != 0 then
ht = "melee"
elseif self:bWepClass( true ) then
ht = "duel"
else
ht = self:GetStat( false, "HoldType" )
end
end
end
if ht == "normal" and self:GetHoldType() != "normal" then
self:TPHolster( false )
elseif ht != "normal" and self:GetHoldType() == "normal" then
self:TPDraw( false )
end
for i=1, 2 do
local hand = i==2
if self:bWepClass( hand ) then
if self:bWepClass( hand ).Custom_Think then
self:bWepClass( hand ).Custom_Think( self, self:bWepTable( hand ), self:bWepClass( hand ), hand )
end
end
end
self:SetWeaponHoldType(ht)
self:SetHoldType(ht)
return true
end
function SWEP:Deploy()
return true
end
function SWEP:Holster()
return true
end

View File

@ -0,0 +1,200 @@
AddCSLuaFile()
SWEP.Base = "weapon_base"
SWEP.AEItemHandler = true
SWEP.ViewModel = "models/weapons/c_arms.mdl"
SWEP.ViewModelFOV = 74
SWEP.ViewModelFlip = false
SWEP.UseHands = true
SWEP.WorldModel = "models/weapons/w_pistol.mdl"
SWEP.DrawWorldModel = true
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Ammo = "none"
SWEP.Primary.Automatic = true
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Ammo = "none"
SWEP.Secondary.Automatic = true
function SWEP:SetupDataTables()
self:NetworkVar( "Entity", 0, "ActiveR" )
self:NetworkVar( "Entity", 1, "ActiveL" )
end
function SWEP:ItemR( run )
local active = self:GetActiveR()
if run and active:IsValid() then
return active.Class[run]( active.Class, active, self )
else
return active:IsValid() and active or false
end
end
function SWEP:ItemL( run )
local active = self:GetActiveL()
if run and active:IsValid() then
active.Class[run]( active.Class, active, self )
else
return active:IsValid() and active or false
end
end
function SWEP:Initialize()
end
local size = 8/2
local tracedef = {
mins = Vector( -size, -size, -size ),
maxs = Vector( size, size, size ),
}
function SWEP:ItemCheckTrace()
local p = self:GetOwner()
p:LagCompensation( true )
tracedef.filter = p
tracedef.start = p:EyePos()
tracedef.endpos = p:EyePos() + (p:GetAimVector() * 72)
local trace = util.TraceHull(tracedef)
p:LagCompensation( false )
return trace
end
function SWEP:SetActive( ent )
local p = self:GetOwner()
if ent:GetOwner() != p then return false end
if self:GetActiveR():IsValid() then self:Deactive() end
self:SetActiveR( ent )
self:ItemR( "Deploy" )
return true
end
function SWEP:Deactive()
local p = self:GetOwner()
self:SetActiveR( NULL )
end
function SWEP:PrimaryAttack()
local p = self:GetOwner()
if self:ItemR() then
self:ItemR("Attack")
else
local trace = self:ItemCheckTrace()
self:EquipItem( trace.Entity )
end
end
function SWEP:Reload()
if self:ItemR() then
self:ItemR("Reload")
end
end
function SWEP:SecondaryAttack()
local p = self:GetOwner()
if p:KeyPressed(IN_ATTACK2) then
self:DropItem()
end
end
if SERVER then
util.AddNetworkString("AEINV_PredictItem")
else
net.Receive("AEINV_PredictItem", function()
local ent = net.ReadEntity()
if ent:IsValid() then
ent:SetPredictable( net.ReadBool() )
else
print("Tried to make an ent predictable")
end
end)
end
function SWEP:EquipItem( ent )
local p = self:GetOwner()
if CLIENT then print("FUCK OFF") debug.Trace() return end
if IsValid(ent) and ent.AEItem then
if ent:GetOwner() != NULL then
print( ent, "belongs to", ent:GetOwner(), "!! Not equipping." )
return
end
if p:GetInventory()[ent] then
print( ent, "is in", p, "'s inventory!" )
return
end
print("Pick up", ent)
ent:AddEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
ent:RemoveEffects( EF_ITEM_BLINK )
ent:SetParent( p )
ent:SetOwner( p )
ent:SetPos( vector_origin )
ent:SetAngles( Angle( 0, p:EyeAngles().y, 0 ) )
ent:SetAcquisition( CurTime() )
ent:EmitSound( "ae/items/pickup.ogg", 70, 100, 1, CHAN_STATIC )
--self:SetActive( ent )
local inv = p:GetInventory()
inv[ent] = true
inv:Sync()
net.Start("AEINV_PredictItem")
net.WriteEntity( ent )
net.WriteBool( true )
net.Send( p )
end
end
function SWEP:DropItem()
local p = self:GetOwner()
local ent = self:GetActiveR()
if CLIENT then print("FUCK OFF") debug.Trace() return end
if ent:IsValid() then
ent:SetParent( NULL )
ent:SetOwner( NULL )
local ep = ent:GetPhysicsObject()
ent:RemoveEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
ent:AddEffects( EF_ITEM_BLINK )
ent:SetPos( p:EyePos() + p:GetAimVector() * 0 )
ent:SetAngles( p:EyeAngles() + Angle( 0, 180, 0 ) )
self:Deactive()
local inv = p:GetInventory()
inv[ent] = nil
inv:Sync()
local ep = ent:GetPhysicsObject()
ep:SetVelocity( p:GetAimVector() * 700 )
ep:SetAngleVelocity( Vector( 0, -360*4, 0 ) )
ep:Wake()
net.Start("AEINV_PredictItem")
net.WriteEntity( ent )
net.WriteBool( false )
net.Send( p )
end
end
function SWEP:Think()
local p = self:GetOwner()
if p:IsValid() then
if self:ItemR() then
self:ItemR("Think")
end
else
print( self, "Thinking without an owner." )
end
end
function SWEP:Deploy()
end
function SWEP:Holster()
end

View File

@ -0,0 +1,117 @@
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",
Vars = {
["Float"] = {
"Acquisition",
},
},
["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",
Base = "base",
Vars = {
["Int"] = {
"Clip",
"BurstCount",
},
["Float"] = {
"Delay",
"DelayBurst",
"RefillTime",
"Accuracy_Reset",
"Accuracy_Amount",
"DelayReload",
},
},
Delay = 0.1,
Pellets = 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,
})
AddItem( "mk23", {
PrintName = "MK.23",
Base = "base_firearm",
Model = "models/weapons/w_pist_usp.mdl",
ClipSize = 12,
Delay = (60/300),
FireSound = "weapons/usp/usp_unsil-1.wav",
Accuracy = 5/60,
BurstCount = 1,
Accuracy_Add = 0.5,
Accuracy_Reset = 0.4,
Accuracy_Decay = 5,
})

View File

@ -1,53 +0,0 @@
--[[
Your Name Is Benny
Item definition
]]
-- Not 100% sure how metastuff works yet.
-- Global weapons table
WEAPONS = {}
function WeaponGet(class)
return ItemDef(class)
end
-- ItemDef metatable
ItemDef = {}
ItemDefHelpers = {
Get = function( self, key )
return self.key
end,
GetRaw = function( self, key )
return rawget( self, key )
end,
}
function ItemDef.__index( self, key )
if ItemDefHelpers[key] then return ItemDefHelpers[key] end
if rawget(self, "BaseClass") then
return rawget(self, "BaseClass")[key]
end
end
function ItemDef:new( classname, classtable )
if classtable then
local newdef = classtable
newdef.ClassName = classname
newdef.BaseClass = WEAPONS[newdef.Base]
setmetatable( newdef, ItemDef )
WEAPONS[classname] = newdef
return newdef
else
return WEAPONS[classname]
end
end
function ItemDef:__tostring()
return "ItemDef [" .. self.ClassName .. "]"
end
setmetatable( ItemDef, { __call = ItemDef.new } )

View File

@ -1,5 +0,0 @@
--[[
Your Name Is Benny
Item existance
]]

View File

@ -1,735 +0,0 @@
do -- Toolgun
WEAPONS["camera"] = {
Name = "CAMERA",
Description = "Developer development device",
Type = "special",
WModel = "models/maxofs2d/camera.mdl",
HoldType = "camera",
GestureDraw = { ACT_HL2MP_GESTURE_RELOAD_REVOLVER, 0.8 },
Delay = (60/300),
Firemodes = FIREMODE_SEMI,
Custom_Fire = function( self, data )
if self:GetDelay1() > CurTime() then
return true
end
self:SetDelay1( CurTime() + 0.2 )
local p = self:GetOwner()
if CLIENT and IsFirstTimePredicted() then
local zp, za, zf = p:EyePos(), p:EyeAngles(), 90
RunConsoleCommand( "benny_cam_override", zp.x .. " " .. zp.y .. " " .. zp.z .. " " .. za.p .. " " .. za.y .. " " .. za.r .. " " .. zf )
end
-- Return true to skip weapon logic
return true
end,
Custom_Reload = function( self, data )
RunConsoleCommand( "benny_cam_override", "" )
-- Return true to skip weapon logic
return true
end,
Custom_DisableSpecialMovement = function( self, data )
-- Return true to skip weapon logic
if self:GetUserAim() then
return true
end
end,
Custom_CalcView = function( self, data )
if self:GetUserAim() and GetConVar("benny_cam_override"):GetString() == "" then
data.drawviewer = false
data.origin = self:GetOwner():EyePos()
data.angles = self:GetOwner():EyeAngles()
return true -- Return true to halt
end
end,
Features = "firearm",
}
end
do -- Handguns
end
do -- SMGs & PDWs
end
do -- Shotguns
WEAPONS["spas12"] = {
Name = "SPAS-12",
Description = "Heavy metal pump-action shotgun.",
Type = "shotgun",
WModel = "models/weapons/w_shotgun.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_CROSSBOW, 0.5 },
Sound_Fire = "SPAS12.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "SPAS12.MagOut",
Sound_MagIn = "SPAS12.MagIn",
Delay = (60/120),
Firemodes = FIREMODE_SEMI,
Ammo = 8,
Damage = 10,
Pellets = 8,
Spread = 150/60,
SpreadAdd = 150/60,
SpreadAddMax = 20,
SpreadDecay_Start = 2,
SpreadDecay_End = 30,
SpreadDecay_RampTime = 0.7,
Speed_Move = 0.93,
Speed_Aiming = 0.95,
Speed_Reloading = 0.85,
Speed_Firing = 0.75,
Features = "firearm",
}
WEAPONS["doublebarrel"] = {
Name = "D/B",
Description = "Pocket-sized double-barrelled rocket of fun!",
Type = "shotgun",
WModel = "models/weapons/w_shot_shorty.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_CROSSBOW, 0.5 },
Sound_Fire = "SPAS12.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "SPAS12.MagOut",
Sound_MagIn = "SPAS12.MagIn",
Delay = (60/120),
Firemodes = FIREMODE_SEMI,
Ammo = 2,
Damage = 10,
Pellets = 8,
Spread = 300/60,
SpreadAdd = 150/60,
SpreadAddMax = 20,
SpreadDecay_Start = 10,
SpreadDecay_End = 30,
SpreadDecay_RampTime = 0.5,
Speed_Move = 0.95,
Speed_Aiming = 0.95,
Speed_Reloading = 0.9,
Speed_Firing = 0.9,
Features = "firearm",
}
WEAPONS["overunder"] = {
Name = "O/U",
Description = "Full-length double-barrelled bar fight finisher.",
Type = "shotgun",
WModel = "models/weapons/w_shot_kozlice.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_CROSSBOW, 0.5 },
Sound_Fire = "SPAS12.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "SPAS12.MagOut",
Sound_MagIn = "SPAS12.MagIn",
Delay = (60/120),
Firemodes = FIREMODE_SEMI,
Ammo = 2,
Damage = 10,
Pellets = 8,
Spread = 130/60,
SpreadAdd = 130/60,
SpreadAddMax = 20,
SpreadDecay_Start = 10,
SpreadDecay_End = 30,
SpreadDecay_RampTime = 0.5,
Speed_Move = 0.93,
Speed_Aiming = 0.95,
Speed_Reloading = 0.85,
Speed_Firing = 0.85,
Features = "firearm",
}
WEAPONS["aa12"] = {
Name = "AA-12",
Description = "Magazine fed powerhouse.",
Type = "shotgun",
WModel = "models/weapons/w_shot_br99.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_CROSSBOW, 0.5 },
Sound_Fire = "AA12.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "AA12.MagOut",
Sound_MagIn = "AA12.MagIn",
Delay = (60/180),
Firemodes = FIREMODE_AUTO,
Ammo = 8,
Damage = 8,
Pellets = 8,
Spread = 250/60,
SpreadAdd = 150/60,
SpreadAddMax = 20,
SpreadDecay_Start = 700/60,
SpreadDecay_End = 30,
SpreadDecay_RampTime = 1,
Reload_MagOut = 0.5,
Reload_MagIn = 1.5,
Reload_MagIn_Bonus1 = 1.2,
Reload_MagIn_Bonus2 = 1.2+0.1,
Speed_Move = 0.92,
Speed_Aiming = 0.92,
Speed_Reloading = 0.5,
Speed_Firing = 0.334,
Speed_FiringTime = 0.5,
Features = "firearm",
}
end
do -- Rifles
WEAPONS["fnc"] = {
Name = "FNC PARA",
Description = "Run of the mill automatic assault rifle.",
Type = "rifle",
Icon = Material( "benny/weapons/fnc.png", "smooth" ),
WModel = "models/weapons/w_rif_ar556.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_PISTOL, 0.3 },
Sound_Fire = "FNC.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "FNC.MagOut",
Sound_MagIn = "FNC.MagIn",
Sound_Cock = "FNC.Cock",
Delay = (60/700),
Firemodes = FIREMODE_AUTOSEMI,
Ammo = 30,
Damage = 30,
Spread = 30/60,
SpreadAdd = 22/60,
SpreadAddMax = 10,
SpreadDecay_Start = 0,
SpreadDecay_End = 12,
SpreadDecay_RampTime = 0.2,
Reload_MagOut = 0.3,
Reload_MagIn = 1.3,
Reload_MagIn_Bonus1 = 0.8,
Reload_MagIn_Bonus2 = 0.8+0.1,
Speed_Move = 0.95,
Speed_Aiming = 0.95,
Speed_Reloading = 0.95,
Speed_Firing = 0.95,
Features = "firearm",
}
WEAPONS["qbz"] = {
Name = "QBZ-95",
Description = "Bullpup assault rifle. Low profile, great in close quarters.",
Type = "rifle",
Icon = Material( "benny/weapons/fnc.png", "smooth" ),
WModel = "models/weapons/w_rif_bakm.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_PISTOL, 0.3 },
Sound_Fire = "QBBLSW.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "FNC.MagOut",
Sound_MagIn = "FNC.MagIn",
Sound_Cock = "FNC.Cock",
Delay = (60/800),
Firemodes = FIREMODE_AUTOSEMI,
Ammo = 30,
Damage = 28,
Spread = 45/60,
SpreadAdd = 35/60,
SpreadAddMax = 10,
SpreadDecay_Start = 12,
SpreadDecay_End = 36,
SpreadDecay_RampTime = 0.6,
Reload_MagOut = 0.4,
Reload_MagIn = 1.5,
Reload_MagIn_Bonus1 = 0.8,
Reload_MagIn_Bonus2 = 0.8+0.1,
Speed_Move = 0.975,
Speed_Aiming = 0.975,
Speed_Reloading = 0.975,
Speed_Firing = 0.975,
Features = "firearm",
}
WEAPONS["m16a2"] = {
Name = "M16A2",
Description = "Burst-fire assault rifle. Precise and effective at range.",
Type = "rifle",
Icon = Material( "benny/weapons/m16a2.png", "smooth" ),
WModel = "models/weapons/w_rif_m16a2.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_PISTOL, 0.3 },
Sound_Fire = "M16A2.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "M16A2.MagOut",
Sound_MagIn = "M16A2.MagIn",
Sound_Cock = "M16A2.Cock",
Delay = (60/700),
Firemodes = {
{ Mode = 3 },
{ Mode = 1 },
},
Ammo = 30,
Damage = 32,
Spread = 22/60,
SpreadAdd = 11/60,
SpreadAddMax = 10,
SpreadDecay_Start = 0,
SpreadDecay_End = 12,
SpreadDecay_RampTime = 0.3,
Reload_MagOut = 0.3,
Reload_MagIn = 1.3,
Reload_MagIn_Bonus1 = 0.6,
Reload_MagIn_Bonus2 = 0.6+0.1,
Speed_Move = 0.95,
Speed_Aiming = 0.9,
Speed_Reloading = 0.95,
Speed_Firing = 0.9,
Features = "firearm",
}
end
do -- Sniper rifles
WEAPONS["barrett"] = {
Name = "BARRETT .50c",
Description = "Semi-automatic .50 slinger. Turns people into slushie!",
Type = "sniper",
Icon = Material( "benny/weapons/m16a2.png", "smooth" ),
WModel = "models/weapons/w_snip_awp.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_CROSSBOW, 0.1 },
Sound_Fire = "Barrett.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "Barrett.MagOut",
Sound_MagIn = "Barrett.MagIn",
Sound_Cock = "Barrett.Cock",
ShootHolsterTime = 1,
Delay = (60/140),
Firemodes = FIREMODE_SEMI,
Ammo = 5,
Damage = 99,
Spread = 5/60,
SpreadAdd = 9,
SpreadAddMax = 18,
SpreadDecay_Start = 4,
SpreadDecay_End = 22,
SpreadDecay_RampTime = 1,
Reload_MagOut = 0.5,
Reload_MagIn = 1.5,
Reload_MagIn_Bonus1 = 1.0,
Reload_MagIn_Bonus2 = 1.0+0.1,
Speed_Move = 0.75,
Speed_Aiming = 0.75,
Speed_Reloading = 0.5,
Speed_Firing = 0.334,
Speed_FiringTime = 1,
Features = "firearm",
}
end
do -- Machine guns
WEAPONS["stoner63"] = {
Name = "STONER 63",
Description = "Box-fed light machine gun that maintains mid-range authority.",
Type = "machinegun",
WModel = "models/weapons/w_mach_hk21e.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_REVOLVER, 0.3 },
Sound_Fire = "Stoner63.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "M16A2.MagOut",
Sound_MagIn = "M16A2.MagIn",
Delay = (60/650),
Firemodes = FIREMODE_AUTOSEMI,
Ammo = 75,
Damage = 32,
Spread = 26/60,
SpreadAdd = 22/60,
SpreadAddMax = 10,
SpreadDecay_Start = 4,
SpreadDecay_End = 36,
SpreadDecay_RampTime = 0.6,
Speed_Move = 0.8,
Speed_Aiming = 0.75,
Speed_Reloading = 0.5,
Speed_Firing = 0.334,
Features = "firearm",
}
WEAPONS["qbblsw"] = {
Name = "QBB-LSW-42",
Description = "Bullpup mag-fed light machine gun that excels in close quarters.",
Type = "machinegun",
WModel = "models/weapons/w_mach_mg36.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_REVOLVER, 0.3 },
Sound_Fire = "QBBLSW.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "M16A2.MagOut",
Sound_MagIn = "M16A2.MagIn",
Delay = (60/850),
Firemodes = FIREMODE_AUTOSEMI,
Ammo = 60,
Damage = 29,
Spread = 36/60,
SpreadAdd = 33/60,
SpreadAddMax = 15,
SpreadDecay_Start = 6,
SpreadDecay_End = 36,
SpreadDecay_RampTime = 0.4,
Speed_Move = 0.8,
Speed_Aiming = 0.8,
Speed_Reloading = 0.75,
Speed_Firing = 0.334,
Features = "firearm",
}
end
do -- Grenades, nothing here is guaranteed.
local function GrenadeFire( self, data, class, hand )
local p = self:GetOwner()
if self:GetGrenadeDown() then
return true
end
if self:bGetHolsterTime( hand ) > 0 then
return true
end
self:SetGrenadeDown( true )
self:SetGrenadeDownStart( CurTime() )
return true
end
local function GrenadeReload( self, data )
return true
end
local function GrenadeCreate( self, data )
-- PROTO: See to getting this done better. Maybe it's spawned while priming the nade for low CL-SV/phys delay?
local p = self:GetOwner()
local class = WeaponGet(data.Class)
local GENT = ents.Create( class.GrenadeEnt )
GENT:SetOwner( p )
local ang = p:EyeAngles()
ang.p = ang.p - 5
GENT:SetPos( p:EyePos() + (ang:Forward()*16) )
GENT:SetAngles( ang + Angle( 0, 0, -90 ) )
GENT.Fuse = self:GetGrenadeDownStart() + class.GrenadeFuse
GENT:Spawn()
local velocity = ang:Forward() * 1500
velocity:Mul( Lerp( math.TimeFraction( 90, 0, ang.p ), 0, 1 ) )
-- velocity:Add( p:EyeAngles():Up() * 500 * Lerp( math.TimeFraction( 0, -90, p:EyeAngles().p ), 0, 1 ) )
GENT:GetPhysicsObject():SetVelocity( velocity )
end
local function GrenadeThrow( self, data )
local p = self:GetOwner()
local class = WeaponGet(data.Class)
self:SetGrenadeDown( false )
-- TEMP: Do this right!
if !class.GrenadeCharge then self:SetGrenadeDownStart( CurTime() ) end
--
local hand = (self:bWepTable( true ) and self:bWepTable( true ).Class == data.Class) or false
self:TPFire( hand )
if SERVER then GrenadeCreate( self, data ) end
local id = self:bGetInvID( hand )
self:BHolster( hand )
if SERVER or (CLIENT and IsFirstTimePredicted()) then
p:INV_Discard( id )
end
-- local subsequent = p:INV_Find( data.Class )[1]
-- if subsequent then
-- self:BDeploy( hand, subsequent )
-- end
end
local function GrenadeThink( self, data, class, hand )
local p = self:GetOwner()
local class = WeaponGet(data.Class)
if self:GetGrenadeDown() then
if true or ( CurTime() >= (self:GetGrenadeDownStart() + class.GrenadeFuse) ) then
GrenadeThrow( self, data )
end
end
return true
end
local function GrenadeHolster( self, data )
if self:GetGrenadeDown() then
GrenadeThrow( self, data )
end
return true
end
WEAPONS["g_frag"] = {
Name = "FRAG GRENADE",
Description = "Pull the pin and throw it the hell away!",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_frag",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_fraggrenade.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_semtex"] = {
Name = "SEMTEX GRENADE",
Description = "Long, audible fuse, but sticks to whatever it touches.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_semtex",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_molotov"] = {
Name = "MOLOTOV COCKTAIL",
Description = "Alcoholic bottle of flame!",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_molotov",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_tknife"] = {
Name = "THROWING KNIFE",
Description = "Lightweight knife to throw and pick back up.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_tknife",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_smoke"] = {
Name = "SMOKE GRENADE",
Description = "Smoke bomb used to conceal a position, and makes enemies cough.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_smoke",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_flashbang"] = {
Name = "FLASHBANG",
Description = "Stun grenade that gives off a bright flash and a loud 'bang'.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_flashbang",
GrenadeFuse = 2,
GrenadeCharge = false,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_prox"] = {
Name = "PROXIMITY MINE",
Description = "Mine that bounces into the air.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_prox",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
end
do -- Equipment, nothing here is guaranteed.
WEAPONS["e_medkit"] = {
Name = "MEDKIT",
Description = "Station that regenerates a portion of health.",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
WEAPONS["e_ammo"] = {
Name = "AMMO CRATE",
Description = "Station that replenishes ammo.",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
end
-- Ammo generator
for class, data in SortedPairs( WEAPONS ) do
if data.Features == "firearm" then
WEAPONS["mag_" .. class] = {
Name = "MAG: " .. WEAPONS[class].Name,
Description = "Magazine for the " .. WEAPONS[class].Name .. ".",
Type = "magazine",
WModel = "models/weapons/w_pist_glock18.mdl",
HoldType = "slam",
Ammo = WEAPONS[class].Ammo,
Features = "magazine",
}
end
end

View File

@ -1,326 +0,0 @@
--[[
WEAPONS["m92"] = {
Name = "M92FS",
Description = "Accurate pistol, but low caliber won't do much against armor.",
Type = "pistol",
Icon = Material( "benny/weapons/mk23.png", "smooth" ),
WModel = "models/weapons/w_pist_elite_single.mdl",
HoldType = "revolver",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_PISTOL, 0.2 },
GestureDraw = { ACT_HL2MP_GESTURE_RELOAD_REVOLVER, 0.8 },
Sound_Fire = "M92.Fire",
Sound_DryFire = "Common.Dryfire.Pistol",
Sound_Reload = "USP.Reload",
Sound_MagOut = "USP.MagOut",
Sound_MagIn = "USP.MagIn",
Delay = (60/400),
Firemodes = FIREMODE_SEMI,
Ammo = 15,
Damage = 30,
Features = "firearm",
}
WEAPONS["p226"] = {
Name = "P226",
Description = "Special forces pistol in fast .357 ammo.",
Type = "pistol",
Icon = Material( "benny/weapons/mk23.png", "smooth" ),
WModel = "models/weapons/w_pist_p228.mdl",
HoldType = "revolver",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_PISTOL, 0.2 },
GestureDraw = { ACT_HL2MP_GESTURE_RELOAD_REVOLVER, 0.8 },
Sound_Fire = "P226.Fire",
Sound_DryFire = "Common.Dryfire.Pistol",
Sound_Reload = "USP.Reload",
Sound_MagOut = "P226.MagOut",
Sound_MagIn = "P226.MagIn",
Delay = (60/350),
Firemodes = FIREMODE_SEMI,
Ammo = 13,
Damage = 30,
Features = "firearm",
}
WEAPONS["cqb70"] = {
Name = "CS-70",
Description = "meow",
Type = "shotgun",
WModel = "models/weapons/w_shot_cs3.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_CROSSBOW, 0.5 },
Sound_Fire = "AA12.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "AA12.MagOut",
Sound_MagIn = "AA12.MagIn",
Delay = (60/120),
Firemodes = FIREMODE_SEMI,
Ammo = 4,
Damage = 10,
Pellets = 8,
Spread = 150/60,
Features = "firearm",
}
WEAPONS["m12ak"] = {
Name = "M12AK",
Description = "meow",
Type = "shotgun",
WModel = "models/weapons/w_shot_saiga.mdl",
HoldType = "rpg",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_CROSSBOW, 0.5 },
Sound_Fire = "AA12.Fire",
Sound_DryFire = "Common.Dryfire.Rifle",
Sound_MagOut = "AA12.MagOut",
Sound_MagIn = "AA12.MagIn",
Delay = (60/160),
Firemodes = FIREMODE_SEMI,
Ammo = 5,
Damage = 10,
Pellets = 8,
Spread = 150/60,
Features = "firearm",
}
WEAPONS["g_gas"] = {
Name = "GAS GRENADE",
Description = "Short burst of gas that slows and disorient targets.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_gas",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_claymore"] = {
Name = "CLAYMORE",
Description = "Mine that shoots shrapnel in a cone.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_claymore",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_scrambler"] = {
Name = "SCRAMBLER",
Description = "Disrupts enemy radar based on proximity.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_scrambler",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_emp"] = {
Name = "EMP NADE",
Description = "Disrupts enemy equipment based on proximity.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_emp",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_shockcharge"] = {
Name = "SHOCK CHARGE",
Description = "Charge that stuns and forces enemies to fire their weapons.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_shockcharge",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["g_thermobaric"] = {
Name = "THERMOBARIC GRENADE",
Description = "Burns through armor.",
Type = "grenade",
Custom_Fire = GrenadeFire,
Custom_Reload = GrenadeReload,
Custom_Think = GrenadeThink,
Custom_Holster = GrenadeHolster,
GrenadeEnt = "b-gr_thermobaric",
GrenadeFuse = 4,
GrenadeCharge = true,
WModel = "models/weapons/w_eq_flashbang.mdl",
HoldType = "grenade",
GestureFire = { ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, 0 },
Features = "grenade",
}
WEAPONS["e_tacinsertion"] = {
Name = "TACTICAL INSERTION",
Description = "Flare that changes your deployment location.",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
WEAPONS["e_cover"] = {
Name = "DEPLOYABLE COVER",
Description = ".",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
WEAPONS["e_ddos"] = {
Name = "DDOS",
Description = ".",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
WEAPONS["e_trophysystem"] = {
Name = "TROPHY SYSTEM",
Description = "Disrupts enemy equipment.",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
WEAPONS["e_portableradar"] = {
Name = "PORTABLE RADAR",
Description = "Detects nearby enemies based on proximity.",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
WEAPONS["e_cameraspike"] = {
Name = "CAMERA SPIKE",
Description = "Mountable camera that gives you a live video feed.",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
WEAPONS["e_recondrone"] = {
Name = "RECON DRONE",
Description = "Pilotable hovering recon drone that automatically marks enemies.",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
WEAPONS["e_gasdrone"] = {
Name = "GAS DRONE",
Description = "Drone that dispenses toxic gas onto an area.",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
WEAPONS["e_suppressionmine"] = {
Name = "SUPPRESSION MINE",
Description = "Mine that detonates to dispense hard-to-see sleeping gas.",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
WEAPONS["e_antiarmor"] = {
Name = "ANTI-ARMOR ROUNDS",
Description = "Ammo crate that dispenses armor to disable vehicles.",
Type = "equipment",
WModel = "models/weapons/w_eq_flashbang.mdl",
Features = "grenade",
}
]]

File diff suppressed because it is too large Load Diff