e9da54c2f9
Too many changes to list.
430 lines
11 KiB
Lua
430 lines
11 KiB
Lua
SWEP.ViewModel = "models/weapons/v_axe/v_axe.mdl"
|
|
SWEP.WorldModel = "models/weapons/w_axe.mdl"
|
|
|
|
SWEP.Primary.ClipSize = -1
|
|
SWEP.Primary.DefaultClip = -1
|
|
SWEP.Primary.Automatic = true
|
|
SWEP.Primary.Ammo = "none"
|
|
SWEP.Primary.Delay = 1
|
|
|
|
SWEP.MeleeDamage = 30
|
|
SWEP.MeleeRange = 65
|
|
SWEP.MeleeSize = 1.5
|
|
SWEP.MeleeKnockBack = 0
|
|
|
|
SWEP.Secondary.ClipSize = 1
|
|
SWEP.Secondary.DefaultClip = 1
|
|
SWEP.Secondary.Ammo = "dummy"
|
|
SWEP.Secondary.Automatic = true
|
|
|
|
SWEP.WalkSpeed = SPEED_FAST
|
|
|
|
SWEP.IsMelee = true
|
|
SWEP.MeleeFlagged = false
|
|
|
|
SWEP.HoldType = "melee"
|
|
SWEP.SwingHoldType = "grenade"
|
|
|
|
SWEP.DamageType = DMG_SLASH
|
|
|
|
SWEP.BloodDecal = "Blood"
|
|
SWEP.HitDecal = "Impact.Concrete"
|
|
|
|
SWEP.HitAnim = ACT_VM_HITCENTER
|
|
SWEP.MissAnim = ACT_VM_MISSCENTER
|
|
|
|
SWEP.SwingTime = 0
|
|
SWEP.SwingRotation = Angle(0, 0, 0)
|
|
SWEP.SwingOffset = Vector(0, 0, 0)
|
|
|
|
SWEP.AllowQualityWeapons = false
|
|
|
|
SWEP.Weight = 4
|
|
|
|
local MAT_FLESH = MAT_FLESH
|
|
local MAT_BLOODYFLESH = MAT_BLOODYFLESH
|
|
local MAT_ANTLION = MAT_ANTLION
|
|
local MAT_ALIENFLESH = MAT_ALIENFLESH
|
|
|
|
function SWEP:Initialize()
|
|
GAMEMODE:DoChangeDeploySpeed(self)
|
|
self:SetWeaponHoldType(self.HoldType)
|
|
self:SetWeaponSwingHoldType(self.SwingHoldType)
|
|
|
|
if CLIENT then
|
|
self:Anim_Initialize()
|
|
end
|
|
end
|
|
|
|
function SWEP:SetupDataTables()
|
|
self:NetworkVar("Int", 0, "PowerCombo")
|
|
end
|
|
|
|
function SWEP:SetWeaponSwingHoldType(t)
|
|
local old = self.ActivityTranslate
|
|
self:SetWeaponHoldType(t)
|
|
local new = self.ActivityTranslate
|
|
self.ActivityTranslate = old
|
|
self.ActivityTranslateSwing = new
|
|
end
|
|
|
|
function SWEP:Deploy()
|
|
gamemode.Call("WeaponDeployed", self:GetOwner(), self)
|
|
self.IdleAnimation = CurTime() + self:SequenceDuration()
|
|
|
|
return true
|
|
end
|
|
|
|
function SWEP:Think()
|
|
if self.IdleAnimation and self.IdleAnimation <= CurTime() then
|
|
self.IdleAnimation = nil
|
|
self:SendWeaponAnim(ACT_VM_IDLE)
|
|
end
|
|
|
|
if self:IsSwinging() and self:GetSwingEnd() <= CurTime() then
|
|
self:StopSwinging()
|
|
self:MeleeSwing()
|
|
end
|
|
end
|
|
|
|
function SWEP:SecondaryAttack()
|
|
end
|
|
|
|
function SWEP:Reload()
|
|
return false
|
|
end
|
|
|
|
function SWEP:CanPrimaryAttack()
|
|
if self:GetOwner():IsHolding() or self:GetOwner():GetBarricadeGhosting() then return false end
|
|
|
|
return self:GetNextPrimaryFire() <= CurTime() and not self:IsSwinging()
|
|
end
|
|
|
|
function SWEP:PlaySwingSound()
|
|
self:EmitSound("weapons/iceaxe/iceaxe_swing1.wav")
|
|
end
|
|
|
|
function SWEP:PlayStartSwingSound()
|
|
end
|
|
|
|
function SWEP:PlayHitSound()
|
|
self:EmitSound("weapons/melee/golf club/golf_hit-0"..math.random(4)..".ogg")
|
|
end
|
|
|
|
function SWEP:PlayHitFleshSound()
|
|
self:EmitSound("physics/body/body_medium_break"..math.random(2, 4)..".wav")
|
|
end
|
|
|
|
function SWEP:PrimaryAttack()
|
|
if not self:CanPrimaryAttack() then return end
|
|
self:SetNextAttack()
|
|
|
|
if self.SwingTime == 0 then
|
|
self:MeleeSwing()
|
|
else
|
|
self:StartSwinging()
|
|
end
|
|
end
|
|
|
|
function SWEP:SetNextAttack()
|
|
local owner = self:GetOwner()
|
|
local armdelay = owner:GetMeleeSpeedMul()
|
|
self:SetNextPrimaryFire(CurTime() + self.Primary.Delay * armdelay)
|
|
end
|
|
|
|
function SWEP:Holster()
|
|
if CurTime() >= self:GetSwingEnd() then
|
|
if CLIENT then
|
|
self:Anim_Holster()
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function SWEP:StartSwinging()
|
|
local owner = self:GetOwner()
|
|
|
|
if self.StartSwingAnimation then
|
|
self:SendWeaponAnim(self.StartSwingAnimation)
|
|
self.IdleAnimation = CurTime() + self:SequenceDuration()
|
|
end
|
|
self:PlayStartSwingSound()
|
|
|
|
local armdelay = owner:GetMeleeSpeedMul()
|
|
self:SetSwingEnd(CurTime() + self.SwingTime * (owner.MeleeSwingDelayMul or 1) * armdelay)
|
|
end
|
|
|
|
function SWEP:DoMeleeAttackAnim()
|
|
self:GetOwner():DoAttackEvent()
|
|
end
|
|
|
|
function SWEP:MeleeSwing()
|
|
local owner = self:GetOwner()
|
|
|
|
self:DoMeleeAttackAnim()
|
|
|
|
local tr = owner:CompensatedMeleeTrace(self.MeleeRange * (owner.MeleeRangeMul or 1), self.MeleeSize)
|
|
|
|
if not tr.Hit then
|
|
if self.MissAnim then
|
|
self:SendWeaponAnim(self.MissAnim)
|
|
end
|
|
self.IdleAnimation = CurTime() + self:SequenceDuration()
|
|
self:PlaySwingSound()
|
|
|
|
if owner.MeleePowerAttackMul and owner.MeleePowerAttackMul > 1 then
|
|
self:SetPowerCombo(0)
|
|
end
|
|
|
|
if self.PostOnMeleeMiss then self:PostOnMeleeMiss(tr) end
|
|
|
|
return
|
|
end
|
|
|
|
local damagemultiplier = owner:Team() == TEAM_HUMAN and owner.MeleeDamageMultiplier or 1 --(owner.BuffMuscular and owner:Team()==TEAM_HUMAN) and 1.2 or 1
|
|
if owner:IsSkillActive(SKILL_LASTSTAND) then
|
|
if owner:Health() <= owner:GetMaxHealth() * 0.25 then
|
|
damagemultiplier = damagemultiplier * 2
|
|
else
|
|
damagemultiplier = damagemultiplier * 0.85
|
|
end
|
|
end
|
|
|
|
local hitent = tr.Entity
|
|
local hitflesh = tr.MatType == MAT_FLESH or tr.MatType == MAT_BLOODYFLESH or tr.MatType == MAT_ANTLION or tr.MatType == MAT_ALIENFLESH
|
|
|
|
if self.HitAnim then
|
|
self:SendWeaponAnim(self.HitAnim)
|
|
end
|
|
self.IdleAnimation = CurTime() + self:SequenceDuration()
|
|
|
|
if hitflesh then
|
|
util.Decal(self.BloodDecal, tr.HitPos + tr.HitNormal, tr.HitPos - tr.HitNormal)
|
|
self:PlayHitFleshSound()
|
|
|
|
if SERVER then
|
|
self:ServerHitFleshEffects(hitent, tr, damagemultiplier)
|
|
end
|
|
|
|
if not self.NoHitSoundFlesh then
|
|
self:PlayHitSound()
|
|
end
|
|
else
|
|
--util.Decal(self.HitDecal, tr.HitPos + tr.HitNormal, tr.HitPos - tr.HitNormal)
|
|
self:PlayHitSound()
|
|
end
|
|
|
|
if self.OnMeleeHit and self:OnMeleeHit(hitent, hitflesh, tr) then
|
|
return
|
|
end
|
|
|
|
if SERVER then
|
|
self:ServerMeleeHitEntity(tr, hitent, damagemultiplier)
|
|
end
|
|
|
|
self:MeleeHitEntity(tr, hitent, damagemultiplier)
|
|
|
|
if self.PostOnMeleeHit then self:PostOnMeleeHit(hitent, hitflesh, tr) end
|
|
|
|
if SERVER then
|
|
self:ServerMeleePostHitEntity(tr, hitent, damagemultiplier)
|
|
end
|
|
end
|
|
|
|
function SWEP:PlayerHitUtil(owner, damage, hitent, dmginfo)
|
|
if owner.MeleePowerAttackMul and owner.MeleePowerAttackMul > 1 then
|
|
self:SetPowerCombo(self:GetPowerCombo() + 1)
|
|
|
|
damage = damage + damage * (owner.MeleePowerAttackMul - 1) * (self:GetPowerCombo()/4)
|
|
dmginfo:SetDamage(damage)
|
|
|
|
if self:GetPowerCombo() >= 4 then
|
|
self:SetPowerCombo(0)
|
|
if SERVER then
|
|
local pitch = math.Clamp(math.random(90, 110) + 15 * (1 - damage/45), 50 , 200)
|
|
owner:EmitSound("npc/strider/strider_skewer1.wav", 75, pitch)
|
|
end
|
|
end
|
|
end
|
|
|
|
hitent:MeleeViewPunch(damage * (self.MeleeViewPunchScale or 1))
|
|
if hitent:IsHeadcrab() then
|
|
damage = damage * 2
|
|
dmginfo:SetDamage(damage)
|
|
end
|
|
end
|
|
|
|
function SWEP:PostHitUtil(owner, hitent, dmginfo, tr, vel)
|
|
if self.PointsMultiplier then
|
|
POINTSMULTIPLIER = self.PointsMultiplier
|
|
end
|
|
hitent:DispatchTraceAttack(dmginfo, tr, owner:GetAimVector())
|
|
if self.PointsMultiplier then
|
|
POINTSMULTIPLIER = nil
|
|
end
|
|
|
|
if vel then
|
|
hitent:SetLocalVelocity(vel)
|
|
end
|
|
|
|
-- Perform our own knockback vs. players
|
|
if hitent:IsPlayer() then
|
|
local knockback = self.MeleeKnockBack * (owner.MeleeKnockbackMultiplier or 1)
|
|
if knockback > 0 then
|
|
hitent:ThrowFromPositionSetZ(tr.StartPos, knockback, nil, true)
|
|
end
|
|
|
|
if owner.MeleeLegDamageAdd and owner.MeleeLegDamageAdd > 0 then
|
|
hitent:AddLegDamage(owner.MeleeLegDamageAdd)
|
|
end
|
|
end
|
|
|
|
local effectdata = EffectData()
|
|
effectdata:SetOrigin(tr.HitPos)
|
|
effectdata:SetStart(tr.StartPos)
|
|
effectdata:SetNormal(tr.HitNormal)
|
|
util.Effect("RagdollImpact", effectdata)
|
|
if not tr.HitSky then
|
|
effectdata:SetSurfaceProp(tr.SurfaceProps)
|
|
effectdata:SetDamageType(self.DamageType)
|
|
effectdata:SetHitBox(tr.HitBox)
|
|
effectdata:SetEntity(hitent)
|
|
util.Effect("Impact", effectdata)
|
|
end
|
|
|
|
if self.MeleeFlagged then self.IsMelee = nil end
|
|
end
|
|
|
|
function SWEP:MeleeHitEntity(tr, hitent, damagemultiplier)
|
|
if not IsFirstTimePredicted() then return end
|
|
|
|
if self.MeleeFlagged then self.IsMelee = true end
|
|
|
|
local owner = self:GetOwner()
|
|
|
|
if SERVER and hitent:IsPlayer() and not self.NoGlassWeapons and owner:IsSkillActive(SKILL_GLASSWEAPONS) then
|
|
damagemultiplier = damagemultiplier * 3.5
|
|
owner.GlassWeaponShouldBreak = not owner.GlassWeaponShouldBreak
|
|
end
|
|
|
|
local damage = self.MeleeDamage * damagemultiplier
|
|
|
|
local dmginfo = DamageInfo()
|
|
dmginfo:SetDamagePosition(tr.HitPos)
|
|
dmginfo:SetAttacker(owner)
|
|
dmginfo:SetInflictor(self)
|
|
dmginfo:SetDamageType(self.DamageType)
|
|
dmginfo:SetDamage(damage)
|
|
dmginfo:SetDamageForce(math.min(self.MeleeDamage, 50) * 50 * owner:GetAimVector())
|
|
|
|
local vel
|
|
if hitent:IsPlayer() then
|
|
self:PlayerHitUtil(owner, damage, hitent, dmginfo)
|
|
|
|
if SERVER then
|
|
hitent:SetLastHitGroup(tr.HitGroup)
|
|
if tr.HitGroup == HITGROUP_HEAD then
|
|
hitent:SetWasHitInHead()
|
|
end
|
|
|
|
if hitent:WouldDieFrom(damage, tr.HitPos) then
|
|
dmginfo:SetDamageForce(math.min(self.MeleeDamage, 50) * 400 * owner:GetAimVector())
|
|
end
|
|
end
|
|
|
|
vel = hitent:GetVelocity()
|
|
else
|
|
if owner.MeleePowerAttackMul and owner.MeleePowerAttackMul > 1 then
|
|
self:SetPowerCombo(0)
|
|
end
|
|
end
|
|
|
|
self:PostHitUtil(owner, hitent, dmginfo, tr, vel)
|
|
end
|
|
|
|
function SWEP:StopSwinging()
|
|
self:SetSwingEnd(0)
|
|
end
|
|
|
|
function SWEP:IsSwinging()
|
|
return self:GetSwingEnd() > 0
|
|
end
|
|
|
|
function SWEP:SetSwingEnd(swingend)
|
|
self:SetDTFloat(0, swingend)
|
|
end
|
|
|
|
function SWEP:GetSwingEnd()
|
|
return self:GetDTFloat(0)
|
|
end
|
|
|
|
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,
|
|
[ "revolver" ] = ACT_HL2MP_IDLE_REVOLVER,
|
|
[ "camera" ] = ACT_HL2MP_IDLE_CAMERA
|
|
}
|
|
|
|
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_IDLE ] = 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
|
|
|
|
-- these two aren't defined in ACTs for whatever reason
|
|
if t == "knife" or t == "melee2" then
|
|
self.ActivityTranslate [ ACT_MP_CROUCH_IDLE ] = nil
|
|
end
|
|
end
|
|
|
|
SWEP:SetWeaponHoldType("melee")
|
|
|
|
function SWEP:TranslateActivity( act )
|
|
if self:GetSwingEnd() ~= 0 and self.ActivityTranslateSwing[act] then
|
|
return self.ActivityTranslateSwing[act] or -1
|
|
end
|
|
|
|
return self.ActivityTranslate and self.ActivityTranslate[act] or -1
|
|
end
|