Files
wnsrc/lua/tfa/modules/tfa_nzombies.lua
lifestorm 6a58f406b1 Upload
2024-08-04 23:54:45 +03:00

236 lines
7.5 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/
--]]
-- Copyright (c) 2018-2020 TFA Base Devs
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
-- The above copyright notice and this permission notice shall be included in all
-- copies or substantial portions of the Software.
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-- SOFTWARE.
TFA.NZombies = TFA.NZombies or {}
if TFA.NZombies.Patch == nil then
TFA.NZombies.Patch = true --Change this if you need to
end
local cv_melee_scaling, cv_melee_basefactor, cv_melee_berserkscale
local nzombies = string.lower(engine.ActiveGamemode() or "") == "nzombies"
if nZombies or NZombies or NZ then
nzombies = true
end
if nzombies then
cv_melee_scaling = CreateConVar("sv_tfa_nz_melee_scaling", "1", {FCVAR_SERVER_CAN_EXECUTE, FCVAR_REPLICATED}, "0.5x means if zombies have 4x health, melee does 2x damage")
cv_melee_basefactor = CreateConVar("sv_tfa_nz_melee_multiplier", "0.65", {FCVAR_SERVER_CAN_EXECUTE, FCVAR_REPLICATED}, "Base damage scale for TFA Melees.")
cv_melee_berserkscale = CreateConVar("sv_tfa_nz_melee_immunity", "0.67", {FCVAR_SERVER_CAN_EXECUTE, FCVAR_REPLICATED}, "Take X% damage from zombies while you're melee.")
--cv_melee_juggscale = CreateConVar("sv_tfa_nz_melee_juggernaut", "1.5", {FCVAR_SERVER_CAN_EXECUTE, FCVAR_REPLICATED}, "Do X% damage to zombies while you're jug.")
hook.Add("TFA_AnimationRate","NZBase",function(wep,act,rate)
if wep:OwnerIsValid() and wep:GetOwner().HasPerk and wep:GetOwner():HasPerk("speed") and wep.SpeedColaActivities[ act ] then
rate = rate * wep.SpeedColaFactor
end
if wep:OwnerIsValid() and wep:GetOwner().HasPerk and wep:GetOwner():HasPerk("dtap") and wep.DTapActivities[ act ] then
rate = rate * wep.DTapSpeed
end
if wep:OwnerIsValid() and wep:GetOwner().HasPerk and wep:GetOwner():HasPerk("dtap2") and wep.DTapActivities[ act ] then
rate = rate * wep.DTap2Speed
end
return rate
end)
hook.Add("TFA_Deploy","NZBase",function(wep)
local pap = wep:GetPaP()
wep.OldPaP = pap
local spd2 = wep:OwnerIsValid() and wep:GetOwner().HasPerk and wep:GetOwner():HasPerk("speed")
if pap and pap ~= wep.OldPaP then
if AddPackAPunchName and wep.NZPaPName and not wep.HasAddedNZName then
AddPackAPunchName( wep.ClassName, wep.NZPaPName )
wep.HasAddedNZName = true
end
if wep.NZPaPName and wep:GetPaP() then
wep.PrintName = wep.NZPaPName
wep:SetNW2String("PrintName",wep.NZPaPName)
end
local pn = wep:GetNW2String("PrintName")
if pn and pn ~= "" then
wep.PrintName = pn
end
wep:ClearStatCache()
timer.Simple(0.1,function()
if IsValid(wep) then
wep:ClearStatCache()
end
end)
end
if spd2 ~= wep.OldSpCola then
wep:ClearStatCache()
end
wep.OldSpCola = spd2
end)
hook.Add("TFA_Initialize", "NZBase", function(wep)
timer.Simple(0.1, function() -- timers for everything YAY
if not IsValid(wep) then return end
wep.Primary_TFA.Ammo = game.GetAmmoName(wep:GetPrimaryAmmoType())
wep:ClearStatCache("Primary.Ammo")
end)
end)
end
--[[
local function SpreadFix()
local GAMEMODE = gmod.GetGamemode() or GAMEMODE
if not GAMEMODE then return end
print("[TFA] Patching NZombies")
if TFA.NZombies.Patch then return end
local ghosttraceentities = {
["wall_block"] = true,
["invis_wall"] = true,
["player"] = true
}
function GAMEMODE:EntityFireBullets(ent, data)
-- Fire the PaP shooting sound if the weapon is PaP'd
--print(wep, wep.pap)
if ent:IsPlayer() and IsValid(ent:GetActiveWeapon()) then
local wep = ent:GetActiveWeapon()
if wep.pap and ( not wep.IsMelee ) and ( not wep.IsKnife ) then
wep:EmitSound("nz/effects/pap_shoot_glock20.wav", 105, 100)
end
end
if ent:IsPlayer() and ent:HasPerk("dtap2") then
data.Num = data.Num * 2
end
-- Perform a trace that filters out entities from the table above
local tr = util.TraceLine({
start = data.Src,
endpos = data.Src + (data.Dir * data.Distance),
filter = function(entv)
if ghosttraceentities[entv:GetClass()] and not entv:IsPlayer() then
return true
else
return false
end
end
})
--PrintTable(tr)
-- If we hit anything, move the source of the bullets up to that point
if IsValid(tr.Entity) and tr.Fraction < 1 then
local tr2 = util.TraceLine({
start = data.Src,
endpos = data.Src + (data.Dir * data.Distance),
filter = function(entv)
if ghosttraceentities[entv:GetClass()] then
return false
else
return true
end
end
})
data.Src = tr2.HitPos - data.Dir * 5
return true
end
if ent:IsPlayer() and ent:HasPerk("dtap2") then return true end
end
end
]]
--
local function MeleeFix()
hook.Add("EntityTakeDamage", "TFA_MeleeScaling", function(target, dmg)
if not TFA.NZombies.Patch then return end
if not nzRound then return end
local ent = dmg:GetInflictor()
if not ent:IsWeapon() and ent:IsPlayer() then
ent = ent:GetActiveWeapon()
end
if not IsValid(ent) or not ent:IsWeapon() then return end
if ent.IsTFAWeapon and (dmg:IsDamageType(DMG_CRUSH) or dmg:IsDamageType(DMG_CLUB) or dmg:IsDamageType(DMG_SLASH)) then
local scalefactor = cv_melee_scaling:GetFloat()
local basefactor = cv_melee_basefactor:GetFloat()
dmg:ScaleDamage(((nzRound:GetZombieHealth() - 75) / 75 * scalefactor + 1) * basefactor)
--if IsValid(ent:GetOwner()) and ent:GetOwner():IsPlayer() and ent:GetOwner():HasPerk("jugg") then
-- dmg:ScaleDamage(cv_melee_juggscale:GetFloat())
--end
end
end)
hook.Add("EntityTakeDamage", "TFA_MeleeReceiveLess", function(target, dmg)
if not TFA.NZombies.Patch then return end
if target:IsPlayer() and target.GetActiveWeapon then
local wep = target:GetActiveWeapon()
if IsValid(wep) and wep.IsTFAWeapon and (wep.IsKnife or wep.IsMelee or wep.Primary.Reach) then
dmg:ScaleDamage(cv_melee_berserkscale:GetFloat())
end
end
end)
hook.Add("EntityTakeDamage", "TFA_MeleePaP", function(target, dmg)
if not TFA.NZombies.Patch then return end
local ent = dmg:GetInflictor()
if IsValid(ent) then
local wep
if ent:IsPlayer() then
wep = ent:GetActiveWeapon()
elseif ent:IsWeapon() then
wep = ent
end
if IsValid(wep) and wep.IsTFAWeapon and (wep.Primary.Attacks or wep.IsMelee or wep.Primary.Reach) and wep:GetPaP() then
dmg:ScaleDamage(2)
end
end
end)
end
local function NZPatch()
if not TFA.NZombies.Patch then return end
nzombies = string.lower(engine.ActiveGamemode() or "") == "nzombies"
if nZombies or NZombies or NZ or NZombies then
nzombies = true
end
if nzombies then
--SpreadFix()
MeleeFix()
end
end
hook.Add("InitPostEntity", "TFA_NZPatch", NZPatch)
NZPatch()