// spawnable SWEP.Spawnable = false SWEP.AdminOnly = false // names and stuff SWEP.PrintName = "Arctic's Tactical RP Base" SWEP.Category = "[FT] Оружие" SWEP.Description = "" SWEP.Description_Quote = nil // Italics, always on last line. Make sure to save some space for it (may overlap) SWEP.Trivia_Caliber = nil SWEP.Trivia_Manufacturer = nil SWEP.Trivia_Year = nil // Production Year SWEP.Faction = TacRP.FACTION_NEUTRAL // Only used in trivia for now // Valid values: TacRP.FACTION_NEUTRAL, TacRP.FACTION_COALITION, TacRP.FACTION_MILITIA SWEP.Credits = nil // Multiline string like Description SWEP.ViewModel = "" SWEP.WorldModel = "" SWEP.ViewModelFOV = 65 SWEP.NoRanger = false SWEP.NoStatBox = false SWEP.NPCUsable = true SWEP.Slot = 1 SWEP.RenderGroup = RENDERGROUP_BOTH SWEP.BalanceStats = {} // replacement stats for each TacRP.BALANCE_ enum // What weapon this will replace in TTT if enabled. Use TacRP.TTTReplacePreset presets or define your own SWEP.TTTReplace = nil // {["weapon_ttt_glock"] = 1} // key is weapon to replace, value is relative weight. // "ballistics" SWEP.Damage_Max = 30 // damage at minimum range SWEP.Damage_Min = 20 // damage at maximum range SWEP.Range_Min = 256 // distance for which to maintain maximum damage SWEP.Range_Max = 1024 // distance at which we drop to minimum damage SWEP.Penetration = 0 // units of metal this weapon can penetrate SWEP.ArmorPenetration = 0.5 // How good the weapon can penetrate body armor. SWEP.ArmorBonus = 1 // multiplier on armor damage SWEP.DamageMultNPC = 1 // Damage multiplier against NPCs and Nextbots SWEP.DamageType = nil // override damage type SWEP.ShootEnt = false SWEP.ShootEntForce = 10000 SWEP.Num = 1 SWEP.TracerNum = 1 SWEP.BodyDamageMultipliers = { [HITGROUP_HEAD] = 1.25, [HITGROUP_CHEST] = 1, [HITGROUP_STOMACH] = 1, [HITGROUP_LEFTARM] = 1, [HITGROUP_RIGHTARM] = 1, [HITGROUP_LEFTLEG] = 0.9, [HITGROUP_RIGHTLEG] = 0.9, [HITGROUP_GEAR] = 0.9 } SWEP.MuzzleVelocity = 30000 SWEP.ExplosiveEffect = nil SWEP.ExplosiveDamage = 0 SWEP.ExplosiveRadius = 0 // misc. shooting // Firemode system works just like ArcCW // 2 = full auto // 1 = semi auto // 0 = safe // negative numbers = burst SWEP.Firemode = 2 SWEP.Firemodes = nil // {1, 2, 0} ... SWEP.RunawayBurst = false // continue firing until burst is completely expended SWEP.PostBurstDelay = 0 // only applies to runaway burst guns SWEP.AutoBurst = false // hold the trigger to keep firing burst after burst SWEP.RPM = 600 SWEP.RPMMultBurst = 1 // modify RPM while in burst mode SWEP.RPMMultSemi = 1 // modify RPM while in semi mode SWEP.Spread = 0.01 SWEP.ShootTimeMult = 1 SWEP.Bipod = false // Weapon can deploy bipod SWEP.BipodRecoil = 0.35 // Recoil Amount multiplier per shot SWEP.BipodKick = 0.25 // Recoil Kick multiplier SWEP.TriggerDelay = 0.0 // SWEP.ShootChance = 1 SWEP.JamWaitTime = 0.3 SWEP.JamFactor = 0 // higher = more frequent jams. no jams at 0 SWEP.JamTakesRound = false // consume ammo on jam SWEP.JamSkipFix = false // only do dryfire and the initial delay. use on revolvers mostly SWEP.JamBaseMSB = nil // use this number as the base value instead of being based on ammo. // Spread penalties are in spread units and are additive SWEP.MoveSpreadPenalty = 0.01 // spread penalty while travelling at max. 250 u/s SWEP.MidAirSpreadPenalty = 0.1 // spread penalty for being in the air SWEP.HipFireSpreadPenalty = 0.02 // spread penalty for not being scoped in SWEP.ScopedSpreadPenalty = 0 // spread penalty for... being scoped in? SWEP.BlindFireSpreadPenalty = 0 // spread penalty for blind firing SWEP.CrouchSpreadPenalty = 0 SWEP.PeekPenaltyFraction = 0.3 // percentage of hipfire penalty to use while peeking in sights // Technically does not affect recoil at all, but affects spread (now called "bloom") SWEP.RecoilPerShot = 1 SWEP.RecoilMaximum = 10 SWEP.RecoilResetTime = 0 // time after you stop shooting for recoil to start dissipating SWEP.RecoilDissipationRate = 2 SWEP.RecoilFirstShotMult = 1 // multiplier for the first shot's recoil amount SWEP.RecoilSpreadPenalty = 0.001 // extra spread per one unit of recoil SWEP.RecoilResetInstant = true // Set false to account for RPM. SWEP.RecoilMultBurst = 0.9 // Affects both "bloom" and recoil kick while current firemode is burst SWEP.RecoilMultSemi = 0.9 // Affects both "bloom" and recoil kick while current firemode is semi SWEP.RecoilMultCrouch = 0.85 // Affects both "bloom" and recoil kick while crouched // Controls alternate bloom behavior, defaults to convar SWEP.AlwaysAltRecoil = nil SWEP.NeverAltRecoil = nil SWEP.RecoilVisualKick = 0.1 SWEP.RecoilKick = 0.25 SWEP.RecoilStability = 0 // Direction of recoil kick, 1 is completely vertical and 0 is 180deg cone SWEP.RecoilAltMultiplier = 200 // Multiplier to RecoilSpreadPenalty when using alternative recoil mode. SWEP.ShotgunPelletSpread = 0 // per-pellet spread for shotguns (if enabled). Otherwise just adds to spread SWEP.NoRecoilPattern = false // set true to not use recoil patterns for this gun SWEP.RecoilPatternSeed = nil // custom seed. Defaults to weapon class SWEP.CanBlindFire = true SWEP.CannotHipFire = false // lockon // We're using a new system for lockon now, which doesn't use this system. // SWEP.LockOnAngle = math.cos(math.rad(5)) SWEP.LockOnTrackAngle = 5 SWEP.LockOnRange = 3500 SWEP.LockOnTime = 1.5 SWEP.ProvideTargetData = true SWEP.LockOnOutOfSights = false SWEP.LockOnInSights = false SWEP.RequireLockOn = false // Cannot shoot without a lock // handling SWEP.MoveSpeedMult = 1 SWEP.ShootingSpeedMult = 0.5 // slow down applied while shooting SWEP.SightedSpeedMult = 0.5 SWEP.MeleeSpeedMult = 0.75 SWEP.MeleeSpeedMultTime = 1 // seconds to apply slow down for SWEP.ReloadSpeedMult = 1 SWEP.ReloadSpeedMultTime = 0.5 // duration for slowdown to fade out for AFTER RELOAD FINISHES SWEP.ShootWhileSprint = false SWEP.AimDownSightsTime = 0.25 SWEP.SprintToFireTime = 0.25 // how long it takes to go from sprinting to shooting // hold types SWEP.HoldType = "ar2" SWEP.HoldTypeSprint = "passive" SWEP.HoldTypeBlindFire = false SWEP.HoldTypeCustomize = "slam" SWEP.HoldTypeNPC = nil SWEP.HoldTypeSuicide = "pistol" SWEP.GestureShoot = ACT_HL2MP_GESTURE_RANGE_ATTACK_AR2 SWEP.GestureReload = ACT_HL2MP_GESTURE_RELOAD_AR2 SWEP.GestureBash = ACT_GMOD_GESTURE_MELEE_SHOVE_1HAND SWEP.PassiveAng = Angle(0, 0, 0) SWEP.PassivePos = Vector(0, 0, 0) SWEP.SprintAng = Angle(0, 45, 0) SWEP.SprintPos = Vector(0, 0, 0) SWEP.BlindFireAng = Angle(0, 15, 0) SWEP.BlindFirePos = Vector(0, 0, -6) SWEP.BlindFireLeftAng = Angle(75, 0, 0) SWEP.BlindFireLeftPos = Vector(8, 14, -12) SWEP.BlindFireRightAng = Angle(-75, 0, 0) SWEP.BlindFireRightPos = Vector(-8, 14, -12) SWEP.BlindFireSuicideAng = Angle(0, 145, 130) SWEP.BlindFireSuicidePos = Vector(-6, 32, -26) SWEP.CustomizeAng = Angle(30, 15, 0) SWEP.CustomizePos = Vector(6, 0, -7) SWEP.SightAng = Angle(0, 0, 0) SWEP.SightPos = Vector(0, 1, 1) SWEP.PeekAng = Angle(0, 0, -7) SWEP.PeekPos = Vector(3, 2, -1.5) SWEP.HolsterVisible = false SWEP.HolsterSlot = TacRP.HOLSTER_SLOT_BACK SWEP.HolsterPos = Vector(0, 0, 0) SWEP.HolsterAng = Angle(0, 0, 0) SWEP.HolsterModel = nil // string, model. SWEP.SightMidPoint = { Pos = Vector(-1, 15, -6), Ang = Angle(0, 0, -45) } SWEP.SprintMidPoint = { Pos = Vector(4, 10, 2), Ang = Angle(0, -10, -45) } SWEP.NearWallPos = Vector(0, 6, 0) SWEP.NearWallAng = Angle(-3, 5, -5) // scope SWEP.Scope = true SWEP.ScopeOverlay = nil // Material("path/to/overlay") SWEP.ScopeFOV = 90 / 1.1 SWEP.ScopeLevels = 1 // 2 = like CS:S SWEP.ScopeHideWeapon = false SWEP.QuickScopeSpreadPenalty = 0.05 SWEP.QuickScopeTime = 0.2 // amount of time over which to fade out the quickscope spread penalty // sway SWEP.Sway = 1 SWEP.ScopedSway = 0.1 SWEP.BlindFireSway = 2 SWEP.SwayCrouchMult = 0.75 SWEP.BreathRecovery = 1 SWEP.BreathDrain = 1 SWEP.FreeAim = true SWEP.FreeAimMaxAngle = 3.5 SWEP.ShootOffset = Vector(0, 0, 0) SWEP.ShootOffsetAngle = Angle(0, 0, 0) // quicknade SWEP.CanQuickNade = true SWEP.QuickNadeTimeMult = 1 // melee SWEP.CanMeleeAttack = true SWEP.MeleeDamage = 25 SWEP.MeleeAttackTime = 0.8 // time between swings SWEP.MeleeRange = 96 SWEP.MeleeDamageType = DMG_GENERIC SWEP.MeleeDelay = 0.25 // delay between swing start and trace // secondary attack, used on knives SWEP.Melee2Damage = nil SWEP.Melee2AttackTime = nil SWEP.Melee2Range = nil SWEP.Melee2AttackMissTime = nil SWEP.Melee2Delay = nil SWEP.MeleeThrowForce = 3000 // used on knife perks SWEP.MeleePerkStr = 0.5 SWEP.MeleePerkAgi = 0.5 SWEP.MeleePerkInt = 0.5 // reload SWEP.AmmoPerShot = 1 SWEP.ClipSize = 30 SWEP.Ammo = "pistol" SWEP.InfiniteAmmo = false // do not consume reserve ammo SWEP.SupplyAmmoAmount = false // overrides clipsize/ammo for ammo pickups SWEP.SupplyLimit = 1 // Multiplier for supply ammo SWEP.TryUnholster = false // if we have an "unholster" animation use it instead of "deploy" SWEP.ShotgunReload = false SWEP.ShotgunThreeload = true // use those stupid 3 shot reload animations SWEP.ShotgunReloadCompleteStart = false // do not interrupt reload_start and instead wait for it to finish first. used on FP6 animations SWEP.ShotgunFullCancel = false // Ignore tacrp_reload_sg_cancel and force cancel animation SWEP.ShotgunNoReverseStart = true // don't reverse starting animation on a non-empty reload SWEP.ShotgunUpInTime = 0.9 // time after which one round is finished loading SWEP.ReloadUpInTime = nil // time to restore ammo, if unset restores at end of animation SWEP.ReloadTimeMult = 1 SWEP.DeployTimeMult = 1 SWEP.HolsterTimeMult = 1 SWEP.UnholsterTimeMult = 1 SWEP.DropMagazineModel = false SWEP.DropMagazineImpact = "pistol" // available: "pistol", "plastic", "metal", "bullet", "shotgun" SWEP.DropMagazineAmount = 1 SWEP.DropMagazineTime = 0 SWEP.MidReload = false // allow guns with "midreload" animation to continue reload after holster SWEP.DefaultBodygroups = "0000000" SWEP.DefaultWMBodygroups = "0000000" SWEP.DefaultSkin = 0 SWEP.BulletBodygroups = nil SWEP.BulletBodygroupsSetAll = false // Set all applicable bullet groups, rather than just the last /* { [1] = {5, 1} } */ SWEP.LoadInTime = 0.25 // how long to replenish the visible "belt" of ammo SWEP.ShotgunLoadInTime = 0.9 // visual update delay for shotguns // sounds SWEP.Sound_Shoot = "^" SWEP.Sound_Shoot_Silenced = "" SWEP.Vol_Shoot = 130 SWEP.Pitch_Shoot = 100 SWEP.Loudness_Shoot = 1 SWEP.ShootPitchVariance = 2.5 // amount to vary pitch by each shot SWEP.Sound_ScopeIn = "" SWEP.Sound_MeleeAttack = "" SWEP.Sound_DryFire = "TacRP/weapons/dryfire_pistol-1.wav" SWEP.Sound_Jam = "TacRP/malfunction.wav" SWEP.Sound_BipodDown = "tacrp/bipod_down.wav" SWEP.Sound_BipodUp = "tacrp/bipod_up.wav" SWEP.Sound_MeleeSwing = "" SWEP.Sound_ToggleTactical = "tacrp/firemode.wav" SWEP.Sound_StartLockOn = "tacrp/check1.wav" SWEP.Sound_FinishLockOn = "tacrp/locked1.wav" // effects SWEP.EffectsAlternate = false // Effects will alternate using L and R attachments. SWEP.EffectsDoubled = false // Per shot, play effects a second time on the other attachment. // .qc attachment for muzzle flash and eject when EffectsAlternate is NOT true. SWEP.QCA_Muzzle = 1 SWEP.QCA_Eject = 2 // .qc attachments when EffectsAlternate is set to true. SWEP.QCA_MuzzleL = 3 SWEP.QCA_MuzzleR = 4 SWEP.QCA_EjectL = 6 SWEP.QCA_EjectR = 7 // ditto but for worldmodel SWEP.WM_QCA_Muzzle = 1 SWEP.WM_QCA_Eject = 2 SWEP.WM_QCA_MuzzleL = 1 SWEP.WM_QCA_MuzzleR = 2 SWEP.WM_QCA_EjectL = 3 SWEP.WM_QCA_EjectR = 4 SWEP.MuzzleEffect = "muzzleflash_pistol" SWEP.EjectEffect = 0 // 1 = pistol, 2 = rifle, 3 = shotgun SWEP.EjectDelay = 0 SWEP.EjectScale = 1 // anims // VM: // idle // fire // fire1, fire2... // dryfire // melee // reload // midreload // prime_grenade // throw_grenade // throw_grenade_underhand // deploy // blind_idle // blind_fire // blind_fire1, blind_fire2... // blind_dryfire // WM: // attack1 SWEP.AnimationTranslationTable = { ["melee"] = {"melee1", "melee2"}, ["jam"] = "midreload" } // translates ["fire"] = "shoot"; key = translates from, value = translates to // e.g. you have a "shoot1" sequence and need "fire" // so ["fire"] = "shoot1" // can be ["fire"] = {"list", "of", "values"} SWEP.ProceduralIronFire = nil // procedurally animate the viewmodel and bones when using ironsights // { // vm_pos = Vector(0, -0.5, -0.6), // vm_ang = Angle(0, 2, 0), // t = 0.2, // duration of vm pos/ang // tmax = 0.2, // clean up after this time has passed // bones = { // { // bone = "ValveBiped.slide", // pos = Vector(0, 0, -3), // optional // ang = Angle(0, 0, 0), // optional // t0 = 0.05, // duration to reach full movement // t1 = 0.2, // duration to reset // }, // }, // } SWEP.NoHolsterAnimation = false // Will play draw reversed instead SWEP.LastShot = false // Use special animation setup for akimbo pistols. // Does not adjust effects - set AlternatingEffects separately. SWEP.Akimbo = false // attachments SWEP.AttachmentElements = nil /* { ["bg_name"] = { BGs_VM = { {1, 1} }, BGs_WM = { {1, 1} }, AttPosMods = { [1] = { Pos_VM = Vector(), Pos_WM = Vector(), Ang_VM = Angle(), Ang_WM = Angle(), }, }, SortOrder = 1, // defaults to 1, higher value means process later } } */ SWEP.Attachments = nil // { // [1] = { // Installed = nil, // Default = nil, // install this attachment by default // InstalledElements = "", // single or list of elements to activate when something is installed here // UnInstalledElements = "", // Integral = false, // cannot be removed // Category = "", // single or {"list", "of", "values"} // Bone = "", // WMBone = "", // Pos_VM = Vector(0, 0, 0), // Pos_WM = Vector(0, 0, 0), // Ang_VM = Angle(0, 0, 0), // Ang_WM = Angle(0, 0, 0), // CapacityMult = 1, // multiply the amount of Capacity this attachment occupies // } // } // boilerplate SWEP.FreeAim = true SWEP.ArcticTacRP = true SWEP.DrawCrosshair = true SWEP.AccurateCrosshair = true SWEP.DrawWeaponInfoBox = false SWEP.UseHands = true SWEP.Shields = {} SWEP.CurrentAnimation = "" SWEP.Primary.Automatic = false SWEP.Primary.ClipSize = 0 SWEP.Primary.Ammo = "" SWEP.Primary.DefaultClip = 0 SWEP.Secondary.Automatic = true SWEP.Secondary.ClipSize = -1 SWEP.Secondary.Ammo = "" SWEP.Secondary.DefaultClip = 0 SWEP.GaveDefaultAmmo = false SWEP.BounceWeaponIcon = false SWEP.SwayScale = 1 SWEP.BobScale = 1 SWEP.LaserColor = Color(255, 0, 0) SWEP.ActiveEffects = {} SWEP.PCFs = {} SWEP.MuzzPCFs = {} AddCSLuaFile() local searchdir = "weapons/tacrp_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("Float", 0, "RecoilAmount") self:NetworkVar("Float", 1, "AnimLockTime") self:NetworkVar("Float", 2, "NextIdle") self:NetworkVar("Float", 3, "LastRecoilTime") self:NetworkVar("Float", 4, "RecoilDirection") self:NetworkVar("Float", 5, "SprintAmount") self:NetworkVar("Float", 6, "SprintLockTime") self:NetworkVar("Float", 7, "LastScopeTime") self:NetworkVar("Float", 8, "LastMeleeTime") self:NetworkVar("Float", 9, "PrimedGrenadeTime") self:NetworkVar("Float", 10, "StartPrimedGrenadeTime") self:NetworkVar("Float", 11, "ReloadFinishTime") self:NetworkVar("Float", 12, "NWSightAmount") self:NetworkVar("Float", 13, "BlindFireFinishTime") self:NetworkVar("Float", 14, "HolsterTime") self:NetworkVar("Float", 15, "NWLastProceduralFireTime") self:NetworkVar("Float", 16, "NWHoldBreathAmount") self:NetworkVar("Float", 17, "Breath") self:NetworkVar("Float", 18, "LockOnStartTime") self:NetworkVar("Int", 0, "BurstCount") self:NetworkVar("Int", 1, "ScopeLevel") self:NetworkVar("Int", 2, "NthShot") self:NetworkVar("Int", 3, "LoadedRounds") self:NetworkVar("Int", 4, "Firemode") self:NetworkVar("Int", 5, "PatternCount") self:NetworkVar("Bool", 0, "Customize") self:NetworkVar("Bool", 1, "Reloading") self:NetworkVar("Bool", 2, "BlindFire") self:NetworkVar("Bool", 3, "EndReload") self:NetworkVar("Bool", 4, "PrimedGrenade") self:NetworkVar("Bool", 5, "Safe") self:NetworkVar("Bool", 6, "BlindFireLeft") self:NetworkVar("Bool", 7, "Tactical") self:NetworkVar("Bool", 8, "Charge") self:NetworkVar("Bool", 9, "NWPeeking") self:NetworkVar("Bool", 10, "BlindFireRight") // bleh, but actually less networking load than using an integer (32 bit) self:NetworkVar("Bool", 11, "Jammed") self:NetworkVar("Bool", 12, "Ready") self:NetworkVar("Bool", 13, "InBipod") self:NetworkVar("Bool", 14, "OutOfBreath") self:NetworkVar("Bool", 15, "HoldingBreath") self:NetworkVar("Bool", 16, "LastWasSprinting") self:NetworkVar("Bool", 17, "EmptyReload") self:NetworkVar("Angle", 0, "FreeAimAngle") self:NetworkVar("Angle", 1, "LastAimAngle") self:NetworkVar("Angle", 2, "BipodAngle") self:NetworkVar("Vector", 0, "BipodPos") self:NetworkVar("Entity", 0, "HolsterEntity") self:NetworkVar("Entity", 1, "CornershotEntity") self:NetworkVar("Entity", 2, "LockOnEntity") self:SetFreeAimAngle(Angle()) self:SetLastAimAngle(Angle()) self:SetFiremode(1) self:SetTactical(true) self:SetReady(false) self:SetBreath(1) self:SetHoldBreathAmount(0) self:SetLastWasSprinting(false) self:SetHoldingBreath(false) self:SetLockOnEntity(NULL) self:SetLockOnStartTime(0) end function SWEP:OnDrop(owner) if self.PreviousZoom and IsValid(owner) then owner:SetCanZoom(true) end self:SetReady(false) end function SWEP:SecondaryAttack() self:RunHook("Hook_SecondaryAttack") return end local function clunpredictvar(tbl, name, varname, default) local clvar = "CL_" .. name tbl[clvar] = default tbl["Set" .. name] = function(self, v) if (!game.SinglePlayer() and CLIENT and self:GetOwner() == LocalPlayer()) then self[clvar] = v end self["Set" .. varname](self, v) end tbl["Get" .. name] = function(self) if (!game.SinglePlayer() and CLIENT and self:GetOwner() == LocalPlayer()) then return self[clvar] end return self["Get" .. varname](self) end end clunpredictvar(SWEP, "SightAmount", "NWSightAmount", 0) -- clunpredictvar(SWEP, "SprintAmount", "NWSprintAmount", 0) clunpredictvar(SWEP, "LastProceduralFireTime", "NWLastProceduralFireTime", 0) clunpredictvar(SWEP, "HoldBreathAmount", "NWHoldBreathAmount", 0)