2014-10-02 08:49:54 +08:00
|
|
|
AddCSLuaFile()
|
2018-05-02 06:32:59 +08:00
|
|
|
DEFINE_BASECLASS("weapon_zs_base")
|
2014-10-02 08:49:54 +08:00
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
SWEP.PrintName = "'Ricochete' Magnum"
|
|
|
|
SWEP.Description = "This gun's bullets will bounce off of walls which will then deal extra damage."
|
|
|
|
SWEP.Slot = 1
|
|
|
|
SWEP.SlotPos = 0
|
2014-10-02 08:49:54 +08:00
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
if CLIENT then
|
2014-10-02 08:49:54 +08:00
|
|
|
SWEP.ViewModelFlip = false
|
|
|
|
SWEP.ViewModelFOV = 60
|
|
|
|
|
|
|
|
SWEP.HUD3DBone = "Python"
|
|
|
|
SWEP.HUD3DPos = Vector(0.85, 0, -2.5)
|
|
|
|
SWEP.HUD3DScale = 0.015
|
|
|
|
end
|
|
|
|
|
|
|
|
SWEP.Base = "weapon_zs_base"
|
|
|
|
|
|
|
|
SWEP.HoldType = "revolver"
|
|
|
|
|
|
|
|
SWEP.ViewModel = "models/weapons/c_357.mdl"
|
|
|
|
SWEP.WorldModel = "models/weapons/w_357.mdl"
|
|
|
|
SWEP.UseHands = true
|
|
|
|
|
|
|
|
SWEP.CSMuzzleFlashes = false
|
|
|
|
|
|
|
|
SWEP.Primary.Sound = Sound("Weapon_357.Single")
|
|
|
|
SWEP.Primary.Delay = 0.7
|
|
|
|
SWEP.Primary.Damage = 59
|
|
|
|
SWEP.Primary.NumShots = 1
|
|
|
|
|
|
|
|
SWEP.Primary.ClipSize = 6
|
|
|
|
SWEP.Primary.Automatic = false
|
|
|
|
SWEP.Primary.Ammo = "pistol"
|
|
|
|
SWEP.Primary.Gesture = ACT_HL2MP_GESTURE_RANGE_ATTACK_PISTOL
|
|
|
|
GAMEMODE:SetupDefaultClip(SWEP.Primary)
|
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
SWEP.Tier = 2
|
|
|
|
|
|
|
|
SWEP.ConeMax = 3.75
|
|
|
|
SWEP.ConeMin = 2
|
|
|
|
SWEP.BounceMulti = 1.5
|
2014-10-02 08:49:54 +08:00
|
|
|
|
|
|
|
SWEP.IronSightsPos = Vector(-4.65, 4, 0.25)
|
|
|
|
SWEP.IronSightsAng = Vector(0, 0, 1)
|
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
GAMEMODE:AttachWeaponModifier(SWEP, WEAPON_MODIFIER_MAX_SPREAD, -0.7, 1)
|
|
|
|
GAMEMODE:AttachWeaponModifier(SWEP, WEAPON_MODIFIER_MIN_SPREAD, -0.35, 1)
|
|
|
|
GAMEMODE:AttachWeaponModifier(SWEP, WEAPON_MODIFIER_FIRE_DELAY, -0.07, 1)
|
|
|
|
GAMEMODE:AddNewRemantleBranch(SWEP, 1, "'Backlash' Magnum", "Gets more accurate for each direct hit, but less damage on non-bounced shots", function(wept)
|
|
|
|
wept.Primary.Damage = wept.Primary.Damage * 0.85
|
|
|
|
wept.BounceMulti = 1.764
|
|
|
|
wept.GetCone = function(self)
|
|
|
|
return BaseClass.GetCone(self) * (1 - self:GetDTInt(9)/13)
|
|
|
|
end
|
|
|
|
wept.FinishReload = function(self)
|
|
|
|
self:SetDTInt(9, 0)
|
|
|
|
BaseClass.FinishReload(self)
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
local function DoRicochet(attacker, hitpos, hitnormal, normal, damage)
|
2018-05-02 06:32:59 +08:00
|
|
|
local RicoCallback = function(att, tr, dmginfo)
|
|
|
|
local ent = tr.Entity
|
|
|
|
local wep = att:GetActiveWeapon()
|
|
|
|
if wep.Branch == 1 and ent:IsValidZombie() then
|
|
|
|
wep:SetDTInt(9, wep:GetDTInt(9) + 2)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
attacker.RicochetBullet = true
|
2018-05-02 06:32:59 +08:00
|
|
|
if attacker:IsValid() then
|
|
|
|
attacker:FireBulletsLua(hitpos, 2 * hitnormal * hitnormal:Dot(normal * -1) + normal, 0, 1, damage, nil, nil, "tracer_rico", RicoCallback, nil, nil, nil, nil, attacker:GetActiveWeapon())
|
|
|
|
end
|
2014-10-02 08:49:54 +08:00
|
|
|
attacker.RicochetBullet = nil
|
|
|
|
end
|
|
|
|
function SWEP.BulletCallback(attacker, tr, dmginfo)
|
2018-05-02 06:32:59 +08:00
|
|
|
local ent = tr.Entity
|
2014-10-02 08:49:54 +08:00
|
|
|
if SERVER and tr.HitWorld and not tr.HitSky then
|
2018-05-02 06:32:59 +08:00
|
|
|
local hitpos, hitnormal, normal, dmg = tr.HitPos, tr.HitNormal, tr.Normal, dmginfo:GetDamage() * attacker:GetActiveWeapon().BounceMulti
|
2014-10-02 08:49:54 +08:00
|
|
|
timer.Simple(0, function() DoRicochet(attacker, hitpos, hitnormal, normal, dmg) end)
|
|
|
|
end
|
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
if SERVER then
|
|
|
|
local wep = attacker:GetActiveWeapon()
|
|
|
|
if wep.Branch == 1 and ent:IsValidZombie() then
|
|
|
|
wep:SetDTInt(9, wep:GetDTInt(9) + 1)
|
|
|
|
end
|
|
|
|
end
|
2014-10-02 08:49:54 +08:00
|
|
|
end
|