mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
1000 lines
34 KiB
Lua
1000 lines
34 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
AddCSLuaFile()
|
|
|
|
-- For those who may find it useful...
|
|
-- use WEAPONENTITY:SetNWBool("ArcCW_DisableAutosave", true) to tell the client to not load their autosaves.
|
|
|
|
SWEP.Spawnable = false -- this obviously has to be set to true
|
|
SWEP.AutoSpawnable = nil -- TTT weapon autospawn. ArcCW weapons automatically spawn in TTT as long as SWEP.Spawnable is set to true
|
|
SWEP.Category = "ArcCW - Firearms" -- edit this if you like
|
|
SWEP.AdminOnly = false
|
|
|
|
SWEP.PrintName = "ArcCW Base"
|
|
SWEP.Trivia_Class = nil -- "Submachine Gun"
|
|
SWEP.Trivia_Desc = nil -- "Ubiquitous 9mm SMG. Created as a response to the need for a faster-firing and more reliable submachine gun than existing options at the time."
|
|
SWEP.Trivia_Manufacturer = nil -- "Auschen Waffenfabrik"
|
|
SWEP.Trivia_Calibre = nil -- "9x21mm Jager"
|
|
SWEP.Trivia_Mechanism = nil -- "Roller-Delayed Blowback"
|
|
SWEP.Trivia_Country = nil -- "Austria"
|
|
SWEP.Trivia_Year = nil -- 1968
|
|
|
|
SWEP.UseHands = true
|
|
|
|
SWEP.ViewModel = "" -- I mean, you probably have to edit these too
|
|
SWEP.WorldModel = ""
|
|
|
|
SWEP.MirrorVMWM = nil -- Copy the viewmodel, along with all its attachments, to the worldmodel. Super convenient!
|
|
SWEP.MirrorWorldModel = nil -- Use this to set the mirrored viewmodel to a different model, without any floating speedloaders or cartridges you may have. Needs MirrorVMWM
|
|
SWEP.HideViewmodel = nil
|
|
--[[SWEP.WorldModelOffset = {
|
|
pos = Vector(0, 0, 0),
|
|
ang = Angle(0, 0, 0),
|
|
bone = "ValveBiped.Bip01_R_Hand",
|
|
scale = 1
|
|
}]]
|
|
|
|
SWEP.PresetBase = nil -- make this weapon share saves with this one.
|
|
|
|
SWEP.KillIconAlias = nil -- set to other weapon class to share select and kill icons
|
|
|
|
SWEP.DefaultBodygroups = "00000000"
|
|
SWEP.DefaultWMBodygroups = "00000000"
|
|
SWEP.DefaultSkin = 0
|
|
SWEP.DefaultWMSkin = 0
|
|
|
|
SWEP.WorldModelOffset = nil
|
|
-- {
|
|
-- pos = Vector(0, 0, 0),
|
|
-- ang = Angle(0, 0, 0)
|
|
-- }
|
|
|
|
SWEP.NoHideLeftHandInCustomization = false
|
|
|
|
SWEP.Damage = 26
|
|
SWEP.DamageMin = 10 -- damage done at maximum range
|
|
SWEP.DamageRand = 0 -- damage will vary randomly each shot by this fraction
|
|
SWEP.RangeMin = 0 -- how far bullets will retain their maximum damage for
|
|
SWEP.Range = 200 -- in METRES
|
|
SWEP.Penetration = 4
|
|
SWEP.DamageType = DMG_BULLET
|
|
SWEP.DamageTypeHandled = false -- set to true to have the base not do anything with damage types
|
|
-- this includes: igniting if type has DMG_BURN; adding DMG_AIRBOAT when hitting helicopter; adding DMG_BULLET to DMG_BUCKSHOT
|
|
|
|
SWEP.Distance = nil -- Maximum distance of the bullet (does not affect physbullets)
|
|
|
|
SWEP.Force = nil -- bullet force. set nil to autocalculate
|
|
|
|
SWEP.ShootEntity = nil -- entity to fire, if any
|
|
SWEP.MuzzleVelocity = 400 -- projectile muzzle velocity in m/s
|
|
SWEP.PhysBulletMuzzleVelocity = nil -- override phys bullet muzzle velocity
|
|
SWEP.PhysBulletDrag = 1
|
|
SWEP.PhysBulletGravity = 1
|
|
SWEP.PhysBulletDontInheritPlayerVelocity = true
|
|
|
|
SWEP.BodyDamageMults = nil
|
|
-- if a limb is not set the damage multiplier will default to 1
|
|
-- that means gmod's stupid default limb mults will **NOT** apply
|
|
-- {
|
|
-- [HITGROUP_HEAD] = 1.25,
|
|
-- [HITGROUP_CHEST] = 1,
|
|
-- [HITGROUP_LEFTARM] = 0.9,
|
|
-- [HITGROUP_RIGHTARM] = 0.9,
|
|
-- }
|
|
|
|
SWEP.AlwaysPhysBullet = false
|
|
SWEP.NeverPhysBullet = false
|
|
SWEP.PhysTracerProfile = 0 -- color for phys tracer. can be a number or a string (see sh_physbullet2.lua)
|
|
-- there are 8 default options:
|
|
-- 0 = normal
|
|
-- 1 = red
|
|
-- 2 = green
|
|
-- 3 = blue
|
|
-- 4 = yellow
|
|
-- 5 = violet
|
|
-- 6 = cyan
|
|
-- 7 = black/invisible
|
|
|
|
SWEP.TracerNum = 1 -- tracer every X
|
|
SWEP.TracerFinalMag = 0 -- the last X bullets in a magazine are all tracers
|
|
SWEP.Tracer = "arccw_tracer" -- override tracer (hitscan) effect
|
|
SWEP.TracerCol = Color(255, 255, 255)
|
|
SWEP.HullSize = 0 -- HullSize used by FireBullets
|
|
|
|
SWEP.ChamberSize = 1 -- how many rounds can be chambered.
|
|
SWEP.Primary.ClipSize = 25 -- DefaultClip is automatically set.
|
|
SWEP.ExtendedClipSize = 50
|
|
SWEP.ReducedClipSize = 10
|
|
|
|
-- But if you insist...
|
|
SWEP.ForceDefaultClip = nil
|
|
SWEP.ForceDefaultAmmo = nil
|
|
|
|
-- The amount of rounds to load in the chamber when the gun is non-empty or empty
|
|
-- Defaults to ChamberSize and 0. Don't change unless you have a good reason
|
|
SWEP.ChamberLoadNonEmpty = nil
|
|
SWEP.ChamberLoadEmpty = nil
|
|
|
|
SWEP.AmmoPerShot = 1
|
|
SWEP.InfiniteAmmo = false -- weapon can reload for free
|
|
SWEP.BottomlessClip = false -- weapon never has to reload
|
|
|
|
SWEP.DoNotEquipmentAmmo = false -- do not automatically give this weapon unique ammo when arccw_equipmentammo is used
|
|
|
|
SWEP.ShotgunReload = false -- reloads like shotgun instead of magazines
|
|
SWEP.HybridReload = false -- reload normally when empty, reload like shotgun when part full
|
|
|
|
SWEP.ManualAction = false -- pump/bolt action
|
|
SWEP.NoLastCycle = false -- do not cycle on last shot
|
|
|
|
SWEP.RevolverReload = false -- cases all eject on reload
|
|
|
|
SWEP.ReloadInSights = false
|
|
SWEP.ReloadInSights_CloseIn = 0.25
|
|
SWEP.ReloadInSights_FOVMult = 0.875
|
|
SWEP.LockSightsInReload = false
|
|
|
|
SWEP.LockSightsInPriorityAnim = false
|
|
|
|
SWEP.CanFireUnderwater = false
|
|
|
|
SWEP.Disposable = false -- when all ammo is expended, the gun will remove itself when holstered
|
|
|
|
SWEP.AutoReload = false -- when weapon is drawn, the gun will reload itself.
|
|
|
|
SWEP.IsShotgun = false -- weapon receives shotgun ammo types
|
|
|
|
SWEP.TriggerDelay = false -- Set to true to play the "trigger" animation before firing. Delay time is dependent on animation time.
|
|
SWEP.TriggerCharge = false -- If TriggerDelay is set, holding trigger will charge and releasing it fires. Also allows premature release of trigger.
|
|
SWEP.TriggerPullWhenEmpty = true -- If true, can pull the trigger even if no ammo is left.
|
|
|
|
SWEP.Recoil = 2
|
|
SWEP.RecoilSide = 1
|
|
SWEP.RecoilRise = 1
|
|
SWEP.MaxRecoilBlowback = -1
|
|
SWEP.VisualRecoilMult = 1.25
|
|
SWEP.RecoilPunch = 1.5
|
|
SWEP.RecoilPunchBackMax = 1
|
|
SWEP.RecoilPunchBackMaxSights = nil -- may clip with scopes
|
|
SWEP.RecoilVMShake = 1 -- random viewmodel offset when shooty
|
|
|
|
SWEP.Sway = 0
|
|
|
|
SWEP.ShotgunSpreadDispersion = false -- dispersion will cause pattern to increase instead of shifting
|
|
SWEP.ShotgunSpreadPattern = nil
|
|
SWEP.ShotgunSpreadPatternOverrun = nil
|
|
-- {Angle(1, 1, 0), Angle(1, 0, 0) ..}
|
|
-- list of how far each pellet should veer
|
|
-- if only one pellet then it'll use the first index
|
|
-- if two then the first two
|
|
-- in case of overrun pellets will start looping, preferably with the second one, so use that for the loopables
|
|
-- precision will still be applied
|
|
SWEP.NoRandSpread = false
|
|
|
|
SWEP.RecoilDirection = Angle(1, 0, 0)
|
|
SWEP.RecoilDirectionSide = Angle(0, 1, 0)
|
|
|
|
SWEP.Delay = 60 / 750 -- 60 / RPM.
|
|
SWEP.Num = 1 -- number of shots per trigger pull.
|
|
SWEP.Firemode = 1 -- 0: safe, 1: semi, 2: auto, negative: burst
|
|
SWEP.Firemodes = {
|
|
-- {
|
|
-- Mode = 1,
|
|
-- CustomBars = "---_#!",
|
|
--[[
|
|
Custom bar setup
|
|
Colored variants Classic
|
|
'a' Filled '-' Filled
|
|
'b' Outline '_' Outline
|
|
'd' CLR w Outline '!' Red w Outline
|
|
'#' Empty
|
|
]]
|
|
-- PrintName = "PUMP",
|
|
-- RunAwayBurst = false,
|
|
-- AutoBurst = false, -- hold fire to continue firing bursts
|
|
-- PostBurstDelay = 0,
|
|
-- ActivateElements = {}
|
|
-- RestoreAmmo = false -- switching to this firemode will call RestoreAmmo(). intended to be used alongside firemode changing animations
|
|
-- }
|
|
}
|
|
|
|
SWEP.ShotRecoilTable = nil -- {[1] = 0.25, [2] = 2} etc.
|
|
|
|
SWEP.NotForNPCS = false
|
|
SWEP.NPCWeaponType = nil -- string or table, the NPC weapons for this gun to replace
|
|
-- if nil, this will be based on holdtype
|
|
SWEP.NPCWeight = 0 -- relative likeliness for an NPC to have this weapon
|
|
SWEP.TTTWeaponType = nil -- string or table, like NPCWeaponType but specifically for TTT weapons (takes precdence over NPCWeaponType)
|
|
SWEP.TTTWeight = 0 -- like NPCWeight but for TTT gamemode
|
|
|
|
SWEP.AccuracyMOA = 15 -- accuracy in Minutes of Angle. There are 60 MOA in a degree.
|
|
SWEP.HipDispersion = 500 -- inaccuracy added by hip firing.
|
|
SWEP.MoveDispersion = 150 -- inaccuracy added by moving. Applies in sights as well! Walking speed is considered as "maximum".
|
|
SWEP.SightsDispersion = 0 -- dispersion that remains even in sights
|
|
SWEP.JumpDispersion = 300 -- dispersion penalty when in the air
|
|
|
|
SWEP.Bipod_Integral = false -- Integral bipod (ie, weapon model has one)
|
|
SWEP.BipodDispersion = 1 -- Bipod dispersion for Integral bipods
|
|
SWEP.BipodRecoil = 1 -- Bipod recoil for Integral bipods
|
|
|
|
SWEP.ShootWhileSprint = false
|
|
|
|
SWEP.Primary.Ammo = "pistol" -- what ammo type the gun uses
|
|
SWEP.MagID = "mpk1" -- the magazine pool this gun draws from
|
|
|
|
SWEP.ShootVol = 125 -- volume of shoot sound
|
|
SWEP.ShootPitch = 100 -- pitch of shoot sound
|
|
SWEP.ShootPitchVariation = 0.05
|
|
|
|
SWEP.FirstShootSound = nil
|
|
SWEP.ShootSound = ""
|
|
SWEP.ShootSoundLooping = nil
|
|
SWEP.FirstShootSoundSilenced = nil
|
|
SWEP.ShootDrySound = nil -- Add an attachment hook for Hook_GetShootDrySound please!
|
|
SWEP.DistantShootSound = nil
|
|
SWEP.ShootSoundSilenced = "weapons/arccw/m4a1/m4a1-1.wav"
|
|
SWEP.ShootSoundSilencedLooping = nil
|
|
SWEP.FiremodeSound = "weapons/arccw/firemode.wav"
|
|
SWEP.MeleeSwingSound = "weapons/arccw/melee_lift.wav"
|
|
SWEP.MeleeMissSound = "weapons/arccw/melee_miss.wav"
|
|
SWEP.MeleeHitSound = "weapons/arccw/melee_hitworld.wav"
|
|
SWEP.MeleeHitNPCSound = "weapons/arccw/melee_hitbody.wav"
|
|
SWEP.EnterBipodSound = "weapons/arccw/bipod_down.wav"
|
|
SWEP.ExitBipodSound = "weapons/arccw/bipod_up.wav"
|
|
SWEP.SelectUBGLSound = "weapons/arccw/ubgl_select.wav"
|
|
SWEP.ExitUBGLSound = "weapons/arccw/ubgl_exit.wav"
|
|
|
|
SWEP.NoFlash = nil -- disable light flash
|
|
SWEP.MuzzleEffect = nil
|
|
SWEP.FastMuzzleEffect = nil
|
|
SWEP.GMMuzzleEffect = false -- Use Gmod muzzle effects rather than particle effects
|
|
SWEP.ImpactEffect = nil
|
|
SWEP.ImpactDecal = nil
|
|
|
|
SWEP.ShellModel = "models/shells/shell_556.mdl"
|
|
SWEP.ShellMaterial = nil
|
|
SWEP.ShellEffect = nil
|
|
SWEP.ShellEjectPosCorrection = nil
|
|
SWEP.ShellScale = 1
|
|
SWEP.ShellPhysScale = 1
|
|
SWEP.ShellPitch = 100
|
|
SWEP.ShellSounds = "autocheck"--ArcCW.ShellSoundsTable
|
|
SWEP.ShellRotate = 0
|
|
SWEP.ShellTime = 0.5
|
|
|
|
SWEP.MuzzleEffectAttachment = 1 -- which attachment to put the muzzle on
|
|
SWEP.CaseEffectAttachment = 2 -- which attachment to put the case effect on
|
|
SWEP.ProceduralViewBobAttachment = nil -- attachment on which coolview is affected by, default is muzzleeffect
|
|
SWEP.CamAttachment = nil -- if set, this attachment will control camera movement
|
|
SWEP.MuzzleFlashColor = Color(244, 209, 66)
|
|
|
|
SWEP.SpeedMult = 0.9
|
|
SWEP.SightedSpeedMult = 0.75
|
|
SWEP.ShootSpeedMult = 1
|
|
|
|
SWEP.BulletBones = { -- the bone that represents bullets in gun/mag
|
|
-- [0] = "bulletchamber",
|
|
-- [1] = "bullet1"
|
|
}
|
|
SWEP.CaseBones = {}
|
|
-- Unlike BulletBones, these bones are determined by the missing bullet amount when reloading
|
|
SWEP.StripperClipBones = {}
|
|
|
|
-- the same as the bone versions but works via bodygroups.
|
|
-- bodygroups work the same as in attachmentelements.
|
|
-- [0] = {ind = 0, bg = 1}
|
|
SWEP.BulletBGs = {}
|
|
SWEP.CaseBGs = {}
|
|
SWEP.StripperClipBGs = {}
|
|
|
|
SWEP.KeepBaseIrons = false -- do not override iron sights when scope installed
|
|
SWEP.BaseIronsFirst = false -- If a sight keeps base irons, irons comes first
|
|
|
|
SWEP.IronSightStruct = {
|
|
Pos = Vector(-8.728, -13.702, 4.014),
|
|
Ang = Angle(-1.397, -0.341, -2.602),
|
|
Midpoint = { -- Where the gun should be at the middle of it's irons
|
|
Pos = Vector(0, 15, -4),
|
|
Ang = Angle(0, 0, -45),
|
|
},
|
|
Magnification = 1,
|
|
BlackBox = false,
|
|
ScopeTexture = nil,
|
|
SwitchToSound = "", -- sound that plays when switching to this sight
|
|
SwitchFromSound = "",
|
|
ScrollFunc = ArcCW.SCROLL_NONE,
|
|
CrosshairInSights = false,
|
|
}
|
|
|
|
SWEP.LaserOffsetAngle = nil -- adjusts the offset angle of lasers
|
|
SWEP.LaserIronsAngle = nil -- additional offset when using ironsights only
|
|
|
|
-- Works identically to AdditionalSights in attachments
|
|
-- KeepBaseIrons and BaseIronsFirst also affect this
|
|
SWEP.ExtraIrons = nil
|
|
|
|
-- add lasers to your weapon without attachments
|
|
SWEP.Lasers = nil
|
|
-- {
|
|
-- {
|
|
-- LaserStrength = 1,
|
|
-- LaserBone = "laser",
|
|
-- Color = Color(255, 0, 0)
|
|
-- }
|
|
-- }
|
|
|
|
SWEP.ProceduralRegularFire = false
|
|
SWEP.ProceduralIronFire = false
|
|
SWEP.SightTime = 0.33
|
|
SWEP.SprintTime = 0
|
|
|
|
-- Override free aim convar and variable
|
|
SWEP.FreeAimAngle = nil -- defaults to HipDispersion / 80. overwrite here
|
|
SWEP.NeverFreeAim = nil
|
|
SWEP.AlwaysFreeAim = nil
|
|
|
|
-- If Jamming is enabled, a heat meter will gradually build up until it reaches HeatCapacity.
|
|
-- Once that happens, the gun will overheat, playing an animation. If HeatLockout is true, it cannot be fired until heat is 0 again.
|
|
SWEP.Jamming = false
|
|
SWEP.HeatGain = 1 -- heat gained per shot
|
|
SWEP.HeatCapacity = 200 -- rounds that can be fired non-stop before the gun jams, playing the "fix" animation
|
|
SWEP.HeatDissipation = 2 -- rounds' worth of heat lost per second
|
|
SWEP.HeatLockout = false -- overheating means you cannot fire until heat has been fully depleted
|
|
SWEP.HeatDelayTime = 0.5
|
|
SWEP.HeatFix = false -- when the "fix" animation is played, all heat is restored.
|
|
SWEP.HeatOverflow = nil -- if true, heat is allowed to exceed capacity (this only applies when the default overheat handling is overridden)
|
|
|
|
-- If Malfunction is enabled, the gun has a random chance to be jammed
|
|
-- after the gun is jammed, it won't fire unless reload is pressed, which plays the "unjam" animation
|
|
-- if no "unjam", "fix", or "cycle" animations exist, the weapon will reload instead
|
|
SWEP.Malfunction = false
|
|
SWEP.MalfunctionJam = true -- After a malfunction happens, the gun will dryfire until reload is pressed. If unset, instead plays animation right after.
|
|
SWEP.MalfunctionTakeRound = true -- When malfunctioning, a bullet is consumed.
|
|
SWEP.MalfunctionPostFire = false -- If set, jam will occur after firing the round successfully.
|
|
SWEP.MalfunctionWait = 0.5 -- The amount of time to wait before playing malfunction animation (or can reload)
|
|
SWEP.MalfunctionMean = nil -- The mean number of shots between malfunctions, will be autocalculated if nil
|
|
SWEP.MalfunctionVariance = 0.25 -- The fraction of mean for variance. e.g. 0.2 means 20% variance
|
|
SWEP.MalfunctionSound = "weapons/arccw/malfunction.wav"
|
|
|
|
SWEP.HoldtypeHolstered = "passive"
|
|
SWEP.HoldtypeActive = "shotgun"
|
|
SWEP.HoldtypeSights = "smg"
|
|
SWEP.HoldtypeCustomize = "slam"
|
|
SWEP.HoldtypeSprintShoot = nil
|
|
SWEP.HoldtypeNPC = nil
|
|
|
|
SWEP.AnimShoot = ACT_HL2MP_GESTURE_RANGE_ATTACK_AR2
|
|
|
|
SWEP.GuaranteeLaser = false -- GUARANTEE that the laser position will be accurate, so don't bother with sighted correction
|
|
|
|
SWEP.ShieldProps = nil
|
|
-- {
|
|
-- {
|
|
-- Model = "",
|
|
-- Pos = Vector(0, 0, 0),
|
|
-- Ang = Angle(0, 0, 0),
|
|
-- Bone = "", -- leave blank for valvebiped right hand
|
|
-- Resistance = 5, -- one unit of this object counts for how much penetration amount
|
|
-- }
|
|
-- }
|
|
|
|
SWEP.CanBash = true
|
|
SWEP.PrimaryBash = false -- primary attack triggers melee attack
|
|
|
|
SWEP.Lunge = nil -- Whether to allow the bash/melee to lunge a short distance
|
|
SWEP.LungeLength = 64 -- Maximum distance for lunging
|
|
|
|
SWEP.MeleeDamage = 25
|
|
SWEP.MeleeRange = 16
|
|
SWEP.MeleeDamageType = DMG_CLUB
|
|
SWEP.MeleeTime = 0.5
|
|
SWEP.MeleeGesture = nil
|
|
SWEP.MeleeAttackTime = 0.2
|
|
|
|
SWEP.Melee2 = false
|
|
SWEP.Melee2Damage = 25
|
|
SWEP.Melee2Range = 16
|
|
SWEP.Melee2Time = 0.5
|
|
SWEP.Melee2Gesture = nil
|
|
SWEP.Melee2AttackTime = 0.2
|
|
|
|
SWEP.BashPreparePos = Vector(2.187, -4.117, -7.14)
|
|
SWEP.BashPrepareAng = Angle(32.182, -3.652, -19.039)
|
|
|
|
SWEP.BashPos = Vector(8.876, 0, 0)
|
|
SWEP.BashAng = Angle(-16.524, 70, -11.046)
|
|
|
|
SWEP.ActivePos = Vector(0, 0, 0)
|
|
SWEP.ActiveAng = Angle(0, 0, 0)
|
|
|
|
SWEP.ReloadPos = nil
|
|
SWEP.ReloadAng = nil
|
|
|
|
SWEP.CrouchPos = nil
|
|
SWEP.CrouchAng = nil
|
|
|
|
SWEP.HolsterPos = Vector(0.532, -6, 0)
|
|
SWEP.HolsterAng = Angle(-4.633, 36.881, 0)
|
|
|
|
-- When using custom sprint animations, set this to the same as ActivePos and ActiveAng
|
|
SWEP.SprintPos = nil
|
|
SWEP.SprintAng = nil
|
|
|
|
SWEP.BarrelOffsetSighted = Vector(0, 0, 0)
|
|
SWEP.BarrelOffsetCrouch = nil
|
|
SWEP.BarrelOffsetHip = Vector(3, 0, -3)
|
|
|
|
SWEP.CustomizePos = Vector(9.824, 0, -4.897)
|
|
SWEP.CustomizeAng = Angle(12.149, 30.547, 0)
|
|
|
|
SWEP.InBipodPos = Vector(-8, 0, -4)
|
|
SWEP.InBipodMult = Vector(2, 1, 1)
|
|
|
|
SWEP.BarrelLength = 24
|
|
|
|
SWEP.SightPlusOffset = nil
|
|
|
|
SWEP.DefaultPoseParams = {} -- {["pose"] = 0.5}
|
|
SWEP.DefaultWMPoseParams = {}
|
|
|
|
SWEP.DefaultElements = {} -- {"ele1", "ele2"}
|
|
|
|
SWEP.AttachmentElements = {
|
|
-- ["name"] = {
|
|
-- RequireFlags = {}, -- same as attachments
|
|
-- ExcludeFlags = {},
|
|
-- NamePriority = 0, -- higher = more likely to be chosen
|
|
-- NameChange = "",
|
|
-- TrueNameChange = "",
|
|
-- AddPrefix = "",
|
|
-- AddSuffix = "",
|
|
-- VMPoseParams = {}, -- {["pose"] = 0.5}
|
|
-- VMColor = Color(),
|
|
-- VMMaterial = "",
|
|
-- VMBodygroups = {{ind = 1, bg = 1}},
|
|
-- VMElements = {
|
|
-- {
|
|
-- Model = "",
|
|
-- Bone = "",
|
|
-- Offset = {
|
|
-- pos = Vector(),
|
|
-- ang = Angle(),
|
|
-- },
|
|
-- ModelSkin = 0,
|
|
-- ModelBodygroups = "",
|
|
-- Scale = Vector(1, 1, 1),
|
|
-- IsMuzzleDevice = false -- this element is a muzzle device, and the muzzle flash should come from here.
|
|
-- }
|
|
-- },
|
|
-- VMOverride = "", -- change the view model to something else. Please make sure it's compatible with the last one.
|
|
-- VMBoneMods = {
|
|
-- ["bone"] = Vector(0, 0, 0)
|
|
-- },
|
|
-- WMPoseParams = {}, -- {["pose"] = 0.5}
|
|
-- WMColor = Color(),
|
|
-- WMMaterial = "",
|
|
-- WMBodygroups = {},
|
|
-- WMElements = {
|
|
-- {
|
|
-- Model = "",
|
|
-- Offset = {
|
|
-- pos = Vector(),
|
|
-- ang = Angle(),
|
|
-- },
|
|
-- IsMuzzleDevice = false -- this element is a muzzle device, and the muzzle flash should come from here.
|
|
-- }
|
|
-- },
|
|
-- WMOverride = "", -- change the world model to something else. Please make sure it's compatible with the last one.
|
|
-- WMBoneMods = {
|
|
-- ["bone"] = Vector(0, 0, 0)
|
|
-- },
|
|
-- AttPosMods = {
|
|
-- [1] = {
|
|
-- bone = "", -- optional
|
|
-- vpos = Vector(0, 0, 0),
|
|
-- vang = Angle(0, 0, 0),
|
|
-- wpos = Vector(0, 0, 0),
|
|
-- wang = Angle(0, 0, 0),
|
|
-- SlideAmount = { -- only if base att has slideable
|
|
-- vmin = Vector(0, 0, 0),
|
|
-- vmax = Vector(0, 0, 0),
|
|
-- wmin = Vector(0, 0, 0),
|
|
-- wmax = Vector(0, 0, 0)
|
|
-- }
|
|
-- }
|
|
-- }
|
|
-- }
|
|
}
|
|
|
|
SWEP.RejectAttachments = {
|
|
-- ["optic_docter"] = true -- stop this attachment from being usable on this gun
|
|
}
|
|
|
|
SWEP.TTT_DoNotAttachOnBuy = false -- don't give all attachments when bought
|
|
|
|
SWEP.Attachments = {}
|
|
-- [1] = {
|
|
-- PrintName = "Optic", -- print name
|
|
-- DefaultAttName = "Iron Sights", -- used to display the "no attachment" text
|
|
-- DefaultAttIcon = Material(),
|
|
-- Slot = "pic_sight", -- what kind of attachments can fit here
|
|
-- MergeSlots = {}, -- these other slots will be merged into this one.
|
|
-- Bone = "sight", -- relevant bone any attachments will be mostly referring to
|
|
-- WMBone = "ValveBiped.Bip01_L_Hand", -- set it to change parent bone of attachment WM
|
|
-- KeepBaseIrons = false,
|
|
-- ExtraSightDist = 0,
|
|
-- Offset = {
|
|
-- vpos = Vector(0, 0, 0), -- offset that the attachment will be relative to the bone
|
|
-- vang = Angle(0, 0, 0),
|
|
-- wpos = Vector(0, 0, 0), -- same, for the worldmodels
|
|
-- wang = Angle(0, 0, 0)
|
|
-- },
|
|
-- RejectAttachments = {}, -- specific blacklist of attachments this slot cannot accept. Needs to be like {"optic_mrs" = true}
|
|
-- VMScale = Vector(1, 1, 1),
|
|
-- WMScale = Vector(1, 1, 1),
|
|
-- SlideAmount = { -- how far this attachment can slide in both directions.
|
|
-- -- overrides Offset.
|
|
-- vmin = Vector(0, 0, 0),
|
|
-- vmax = Vector(0, 0, 0),
|
|
-- wmin = Vector(0, 0, 0),
|
|
-- wmax = Vector(0, 0, 0),
|
|
-- },
|
|
-- CorrectiveAng = Vector(1, 1, 1), -- okay, I know I said sights were pain-free.
|
|
-- CorrectivePos = Vector(0, 0, 0), -- that won't always be the case. Use these to fix it. Issues mainly crop up in case of sights parented to bones that are not a root bone.
|
|
-- InstalledEles = {"toprail"}, -- activate these AttachmentElements if something is installed
|
|
-- DefaultEles = {""} -- activeate these AttachmentElements *unless* something is installed
|
|
-- Hidden = false, -- attachment cannot be seen in customize menu
|
|
-- Integral = false, -- attachment is assumed never to change
|
|
-- RandomChance = 1, -- multiplies chance this slot will get a random attachment
|
|
-- DoNotRandomize = false,
|
|
-- NoWM = false, -- do not make this show up on worldmodel
|
|
-- NoVM = false, -- what do *you* think this one does?
|
|
-- FreeSlot = false, -- slot does not count towards attachment capacity
|
|
-- -- ABOUT THE FLAG SYSTEM:
|
|
-- -- Attachments and slots can give flags
|
|
-- -- All attachments automatically give themselves as a flag, e.g. "optic_mrs"
|
|
-- -- If requirements are not satisfied, the slot or attachment will not be attachable
|
|
-- ExcludeFlags = {}, -- if the weapon has this flag, hide this slot
|
|
-- RequireFlags = {}, -- if the weapon does not have all these flags, hide this slot
|
|
-- GivesFlags = {} -- give these slots if something is installed here
|
|
-- DefaultFlags = {} -- give these slots UNLESS something is installed here
|
|
-- HideIfBlocked = false, -- If flag requirements are not met, do not show the attachment at all
|
|
-- }
|
|
|
|
-- ready: deploy first time
|
|
-- draw
|
|
-- holster
|
|
-- reload
|
|
-- fire
|
|
-- cycle (for bolt/pump actions)
|
|
-- bash
|
|
-- fix
|
|
-- enter_bipod
|
|
-- exit_bipod
|
|
-- enter_sight
|
|
-- exit_sight
|
|
-- a_to_b: switch from firemode a to firemode b. e.g.: 1_to_2
|
|
-- idle
|
|
-- idle_sights
|
|
-- idle_sprint
|
|
-- idle_bipod
|
|
-- enter_inspect
|
|
-- idle_inspect
|
|
-- exit_inspect
|
|
-- enter_ubgl
|
|
-- exit_ubgl
|
|
-- idle_ubgl
|
|
|
|
-- you can append suffixes for different states
|
|
-- append list:
|
|
|
|
-- _iron, _sights, or _sight for sighted variation
|
|
-- _sprint for sprinting variation
|
|
-- _bipod for bipod variation
|
|
-- _empty for empty variation
|
|
-- _jammed for jammed variation
|
|
|
|
-- this does not apply to reload animations.
|
|
|
|
-- !! they MUST be in the order of this list.
|
|
-- example: fire_iron_bipod_empty
|
|
|
|
-- use SWEP/wep.Hook_TranslateAnimation, same as in attachment, to do even more behaviours
|
|
-- use SWEP/wep.Hook_SelectReloadAnimation to change the reload animation
|
|
-- use SWEP/wep.Hook_SelectInsertAnimation to change the shotgun reload insert animation
|
|
-- use SWEP/wep.Hook_SelectFireAnimation to change the fire animation
|
|
-- use SWEP/wep.Hook_SelectCycleAnimation to change the cycle/pump animation
|
|
-- use SWEP/wep.Hook_SelectBashAnim to change the bash animation
|
|
-- use SWEP/wep.Hook_SelectJamAnim to change the jam animation
|
|
|
|
-- which sequence to derive the sight autosolver from.
|
|
SWEP.AutosolveSourceSeq = "idle"
|
|
|
|
-- Disclaimer: LHIK is *actually* a type of forward kinematics.
|
|
-- If you prefer, LHIK can stand for "Left Hand Individual Kinematics" or some shit
|
|
|
|
SWEP.Animations = {
|
|
-- ["idle"] = {
|
|
-- Source = "idle",
|
|
-- Time = 10
|
|
-- },
|
|
-- ["draw"] = {
|
|
-- RestoreAmmo = 1, -- only used by shotgun empty insert reload
|
|
-- Source = "deploy",
|
|
-- RareSource = "", -- 1/RareSourceChance of playing this animation instead
|
|
-- RareSourceChance = 100, -- Chance the rapper
|
|
-- Time = 0.5, -- Overwrites the duration of the animation (changes speed). Don't set to use sequence length
|
|
-- Mult = 1, -- Multiplies the rate of animation.
|
|
-- TPAnim = ACT_HL2MP_GESTURE_RELOAD_AR2, -- third person animation to play when this animation is played
|
|
-- TPAnimStartTime = 0, -- when to start it from
|
|
-- Checkpoints = {}, -- time checkpoints. If weapon is unequipped, the animation will continue to play from these checkpoints when reequipped.
|
|
-- ShellEjectAt = 0, -- animation includes a shell eject at these times
|
|
-- LHIKIn = 0.25, -- In/Out controls how long it takes to switch to regular animation.
|
|
-- LHIKOut = 0.25, -- (not actually inverse kinematics)
|
|
-- LHIKEaseIn = 0.1, -- how long LHIK eases in.
|
|
-- LHIKEaseOut = 0.1, -- if no value is specified then ease = lhikin
|
|
-- LHIKTimeline = { -- allows arbitrary LHIK values to be interpolated between
|
|
-- {
|
|
-- t = 0.1,
|
|
-- lhik = 0,
|
|
-- },
|
|
-- {
|
|
-- t = 0.25,
|
|
-- lhik = 1
|
|
-- }
|
|
-- },
|
|
-- LHIK = true, -- basically disable foregrips on this anim
|
|
-- SoundTable = {
|
|
-- {
|
|
-- s = "", -- sound; can be string or table
|
|
-- p = 100, -- pitch
|
|
-- v = 75, -- volume
|
|
-- t = 1, -- time at which to play relative to Animations.Time
|
|
-- c = CHAN_ITEM, -- channel to play the sound
|
|
|
|
-- -- Can also play an effect at the same time
|
|
-- e = "", -- effect name
|
|
-- att = nil, -- attachment, defaults to shell attachment
|
|
-- mag = 100, -- magnitude
|
|
-- -- also capable of modifying bodygroups
|
|
-- ind = 0,
|
|
-- bg = 0,
|
|
-- -- and poseparams
|
|
-- pp = "pose",
|
|
-- ppv = 0.25,
|
|
-- }
|
|
-- },
|
|
-- ViewPunchTable = {
|
|
-- {
|
|
-- p = Vector(0, 0, 0),
|
|
-- t = 1
|
|
-- }
|
|
-- },
|
|
-- ProcDraw = false, -- for draw/deploy animations, always procedurally draw in addition to playing animation
|
|
-- ProcHolster = false, -- procedural holster weapon, THEN play animation
|
|
-- LastClip1OutTime = 0, -- when should the belt visually replenish on a belt fed
|
|
-- MinProgress = 0, -- how much time in seconds must pass before the animation can be cancelled
|
|
-- ForceEmpty = false, -- Used by empty shotgun reloads that load rounds to force consider the weapon to still be empty.
|
|
-- ForceCamReset = false, -- Use the first frame of the sequence as starting angles for the cambone.
|
|
-- }
|
|
}
|
|
|
|
-- don't change any of this stuff
|
|
|
|
SWEP.Primary.Automatic = true
|
|
SWEP.Primary.DefaultClip = -1
|
|
SWEP.Secondary.ClipSize = -1
|
|
SWEP.Secondary.DefaultClip = -1
|
|
SWEP.Secondary.Automatic = false
|
|
SWEP.Secondary.Ammo = "none"
|
|
SWEP.DrawCrosshair = true
|
|
SWEP.m_WeaponDeploySpeed = 80.08135 -- 8008135 boobies is funny but it'll bitch in console :(
|
|
-- We don't do that here
|
|
|
|
SWEP.ArcCW = true
|
|
SWEP.BurstCount = 0
|
|
SWEP.AnimQueue = {}
|
|
SWEP.FiremodeIndex = 1
|
|
SWEP.UnReady = true
|
|
SWEP.EventTable = {
|
|
[1] = {} -- for every overlapping one, a new one is made -- checked to be removed afterwards, except 1
|
|
}
|
|
|
|
SWEP.ProneMod_DisableTransitions = true
|
|
|
|
SWEP.DrawWeaponInfoBox = false
|
|
SWEP.BounceWeaponIcon = false
|
|
|
|
if CLIENT or game.SinglePlayer() then
|
|
|
|
SWEP.RecoilAmount = 0
|
|
SWEP.RecoilAmountSide = 0
|
|
SWEP.RecoilPunchBack = 0
|
|
SWEP.RecoilPunchUp = 0
|
|
SWEP.RecoilPunchSide = 0
|
|
SWEP.HammerDown = false
|
|
|
|
SWEP.LHIKTimeline = nil
|
|
SWEP.LHIKStartTime = 0
|
|
-- {number starttime, number intime, number outtime, number finishouttime}
|
|
end
|
|
|
|
SWEP.Bodygroups = {} -- [0] = 1, [1] = 0...
|
|
-- SWEP.RegularClipSize = 0
|
|
|
|
local searchdir = "weapons/arccw_base"
|
|
|
|
local function autoinclude(dir)
|
|
local files, dirs = file.Find(searchdir .. "/*.lua", "LUA")
|
|
|
|
for _, filename in pairs(files) do
|
|
if filename == "shared.lua" then continue end
|
|
local luatype = string.sub(filename, 1, 2)
|
|
|
|
if luatype == "sv" then
|
|
if SERVER then
|
|
include(dir .. "/" .. filename)
|
|
end
|
|
elseif luatype == "cl" then
|
|
AddCSLuaFile(dir .. "/" .. filename)
|
|
if CLIENT then
|
|
include(dir .. "/" .. filename)
|
|
end
|
|
else
|
|
AddCSLuaFile(dir .. "/" .. filename)
|
|
include(dir .. "/" .. filename)
|
|
end
|
|
end
|
|
|
|
for _, path in pairs(dirs) do
|
|
autoinclude(dir .. "/" .. path)
|
|
end
|
|
end
|
|
|
|
autoinclude(searchdir)
|
|
|
|
function SWEP:SetupDataTables()
|
|
self:NetworkVar("Int", 0, "NWState")
|
|
self:NetworkVar("Int", 1, "FireMode")
|
|
self:NetworkVar("Int", 2, "BurstCountUM")
|
|
self:NetworkVar("Int", 3, "LastLoad")
|
|
self:NetworkVar("Int", 4, "NthReload")
|
|
self:NetworkVar("Int", 5, "NthShot")
|
|
|
|
-- 2 = insert
|
|
-- 3 = cancelling
|
|
-- 4 = insert empty
|
|
-- 5 = cancelling empty
|
|
self:NetworkVar("Int", 6, "ShotgunReloading")
|
|
self:NetworkVar("Int", 7, "MagUpCount")
|
|
|
|
self:NetworkVar("Bool", 0, "HeatLocked")
|
|
self:NetworkVar("Bool", 1, "NeedCycle")
|
|
self:NetworkVar("Bool", 2, "InBipod")
|
|
self:NetworkVar("Bool", 3, "InUBGL")
|
|
self:NetworkVar("Bool", 4, "InCustomize")
|
|
self:NetworkVar("Bool", 5, "GrenadePrimed")
|
|
self:NetworkVar("Bool", 6, "NWMalfunctionJam")
|
|
self:NetworkVar("Bool", 7, "UBGLDebounce")
|
|
|
|
self:NetworkVar("Float", 0, "Heat")
|
|
self:NetworkVar("Float", 1, "WeaponOpDelay")
|
|
self:NetworkVar("Float", 2, "ReloadingREAL")
|
|
self:NetworkVar("Float", 3, "MagUpIn")
|
|
self:NetworkVar("Float", 4, "NextPrimaryFireSlowdown")
|
|
self:NetworkVar("Float", 5, "NextIdle")
|
|
self:NetworkVar("Float", 6, "Holster_Time")
|
|
self:NetworkVar("Float", 7, "NWSightDelta")
|
|
self:NetworkVar("Float", 8, "NWSprintDelta")
|
|
self:NetworkVar("Float", 9, "NWPriorityAnim")
|
|
|
|
self:NetworkVar("Vector", 0, "BipodPos")
|
|
|
|
self:NetworkVar("Angle", 0, "BipodAngle")
|
|
self:NetworkVar("Angle", 1, "FreeAimAngle")
|
|
self:NetworkVar("Angle", 2, "LastAimAngle")
|
|
|
|
self:NetworkVar("Entity", 0, "Holster_Entity")
|
|
|
|
self:SetNWSightDelta(1)
|
|
end
|
|
|
|
function SWEP:OnRestore()
|
|
self:SetNthReload(0)
|
|
self:SetNthShot(0)
|
|
self:SetBurstCountUM(0)
|
|
self:SetReloadingREAL(0)
|
|
self:SetWeaponOpDelay(0)
|
|
self:SetMagUpIn(0)
|
|
self:SetNWPriorityAnim(0)
|
|
|
|
self:KillTimers()
|
|
self:Initialize()
|
|
|
|
self.UnReady = false
|
|
end
|
|
|
|
|
|
function SWEP:SetReloading(v)
|
|
if isbool(v) then
|
|
if v then
|
|
self:SetReloadingREAL(math.huge)
|
|
else
|
|
self:SetReloadingREAL(-math.huge)
|
|
end
|
|
elseif isnumber(v) and v > self:GetReloadingREAL() then
|
|
self:SetReloadingREAL( v )
|
|
end
|
|
end
|
|
|
|
function SWEP:GetReloading()
|
|
local decide
|
|
|
|
if self:GetReloadingREAL() > CurTime() then
|
|
decide = true
|
|
else
|
|
decide = false
|
|
end
|
|
|
|
self:GetBuff_Hook("Hook_GetReloading", decide)
|
|
|
|
return decide
|
|
end
|
|
|
|
function SWEP:SetBurstCount(b)
|
|
self:SetBurstCountUM(b)
|
|
end
|
|
|
|
function SWEP:GetBurstCount()
|
|
return self:GetBuff_Hook("Hook_GetBurstCount", self:GetBurstCountUM()) or self:GetBurstCountUM() or 0
|
|
end
|
|
|
|
function SWEP:SetState(v)
|
|
self:SetNWState(v)
|
|
if !game.SinglePlayer() and CLIENT then self.State = v end
|
|
end
|
|
|
|
function SWEP:GetState(v)
|
|
if !game.SinglePlayer() and CLIENT and self.State then return self.State end
|
|
return self:GetNWState(v)
|
|
end
|
|
|
|
function SWEP:IsProne()
|
|
if PRONE_INPRONE then
|
|
return self:GetOwner().IsProne and self:GetOwner():IsProne()
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- BarrelHitWall is known to cause viewmodel flickering on certain playermodels if called during VM position function (a270cc9)
|
|
local hitwallcache
|
|
function SWEP:BarrelHitWall()
|
|
|
|
local len = self:GetBuff("BarrelLength")
|
|
if len == 0 or !ArcCW.ConVars["override_nearwall"]:GetBool()
|
|
or (vrmod and vrmod.IsPlayerInVR(self:GetOwner()))
|
|
or (self:GetOwner():IsPlayer() and self:GetOwner():InVehicle()) then
|
|
hitwallcache = {0, CurTime()}
|
|
end
|
|
|
|
if !hitwallcache or hitwallcache[2] ~= CurTime() then
|
|
|
|
local offset = self:GetBuff("BarrelOffsetHip")
|
|
|
|
if self:GetState() == ArcCW.STATE_SIGHTS then
|
|
offset = LerpVector(self:GetSightDelta(), self:GetBuff("BarrelOffsetSighted"), offset)
|
|
end
|
|
|
|
local dir = self:GetOwner():EyeAngles()
|
|
local src = self:GetOwner():EyePos()
|
|
local r, f, u = dir:Right(), dir:Forward(), dir:Up()
|
|
|
|
for i = 1, 3 do
|
|
src[i] = src[i]
|
|
+ r[i] * offset[1]
|
|
+ f[i] * offset[2]
|
|
+ u[i] * offset[3]
|
|
end
|
|
|
|
local filter = {self:GetOwner()}
|
|
|
|
table.Add(filter, self.Shields)
|
|
|
|
local tr = util.TraceLine({
|
|
start = src,
|
|
endpos = src + (f * len),
|
|
filter = filter,
|
|
mask = MASK_SOLID
|
|
})
|
|
|
|
if tr.Hit and !tr.Entity.ArcCWProjectile then
|
|
--local l = (tr.HitPos - src):Length()
|
|
--hitwallcache = {math.Clamp(1 - l / len, 0, 1), CurTime()}
|
|
hitwallcache = {1 - tr.Fraction, CurTime()}
|
|
else
|
|
hitwallcache = {0, CurTime()}
|
|
end
|
|
end
|
|
|
|
return hitwallcache[1] or 0
|
|
end
|
|
|
|
function SWEP:GetBarrelNearWall()
|
|
return hitwallcache and hitwallcache[1] or 0
|
|
end
|
|
|
|
SWEP.CL_SightDelta = 1
|
|
function SWEP:SetSightDelta(d)
|
|
if !game.SinglePlayer() and CLIENT then self.CL_SightDelta = d end
|
|
self:SetNWSightDelta(d)
|
|
end
|
|
|
|
function SWEP:GetSightDelta()
|
|
if !game.SinglePlayer() and CLIENT then return self.CL_SightDelta end
|
|
return self:GetNWSightDelta()
|
|
end
|
|
|
|
SWEP.CL_SprintDelta = 0
|
|
function SWEP:SetSprintDelta(d)
|
|
if !game.SinglePlayer() and CLIENT then self.CL_SprintDelta = d end
|
|
self:SetNWSprintDelta(d)
|
|
end
|
|
|
|
function SWEP:GetSprintDelta()
|
|
if !game.SinglePlayer() and CLIENT then return self.CL_SprintDelta end
|
|
return self:GetNWSprintDelta()
|
|
end
|
|
|
|
SWEP.CL_MalfunctionJam = false
|
|
function SWEP:SetMalfunctionJam(d)
|
|
if !game.SinglePlayer() and CLIENT then self.CL_MalfunctionJam = tobool(d) end
|
|
self:SetNWMalfunctionJam(d)
|
|
end
|
|
|
|
function SWEP:GetMalfunctionJam()
|
|
if !game.SinglePlayer() and CLIENT then return self.CL_MalfunctionJam end
|
|
return self:GetNWMalfunctionJam()
|
|
end
|
|
|
|
-- DIRTY OPTIMIZATION TRICK: NeedCycle is reused for grenades!
|
|
function SWEP:SetGrenadeAlt(d)
|
|
if !self.Throwing then return end
|
|
self:SetNeedCycle(d)
|
|
end
|
|
|
|
function SWEP:GetGrenadeAlt()
|
|
if !self.Throwing then return false end
|
|
return self:GetNeedCycle()
|
|
end
|
|
|
|
function SWEP:SetPriorityAnim(v)
|
|
if isbool(v) then
|
|
if v then
|
|
self:SetNWPriorityAnim(math.huge)
|
|
else
|
|
self:SetNWPriorityAnim(-math.huge)
|
|
end
|
|
elseif isnumber(v) and v > self:GetNWPriorityAnim() then
|
|
self:SetNWPriorityAnim(v)
|
|
end
|
|
end
|
|
|
|
function SWEP:GetPriorityAnim()
|
|
local decide = self:GetNWPriorityAnim() > CurTime()
|
|
|
|
-- Reloading is always a priority animation
|
|
if !decide then decide = self:GetReloading() end
|
|
|
|
self:GetBuff_Hook("Hook_GetPriorityAnim", decide)
|
|
|
|
return decide
|
|
end |