2014-10-02 08:49:54 +08:00
|
|
|
local meta = FindMetaTable("Player")
|
|
|
|
|
|
|
|
function meta:FloatingScore(victim, effectname, frags, flags)
|
|
|
|
if MySelf == self then
|
|
|
|
gamemode.Call("FloatingScore", victim, effectname, frags, flags)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function meta:FixModelAngles(velocity)
|
|
|
|
local eye = self:EyeAngles()
|
|
|
|
self:SetLocalAngles(eye)
|
|
|
|
self:SetRenderAngles(eye)
|
|
|
|
self:SetPoseParameter("move_yaw", math.NormalizeAngle(velocity:Angle().yaw - eye.y))
|
|
|
|
end
|
|
|
|
|
|
|
|
function meta:RemoveAllStatus(bSilent, bInstant)
|
|
|
|
end
|
|
|
|
|
|
|
|
function meta:RemoveStatus(sType, bSilent, bInstant, sExclude)
|
|
|
|
end
|
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
function meta:HasWon()
|
|
|
|
return self:Team() == TEAM_HUMAN and self:GetObserverMode() == OBS_MODE_ROAMING
|
|
|
|
end
|
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
function meta:GetStatus(sType)
|
|
|
|
local ent = self["status_"..sType]
|
2018-05-02 06:32:59 +08:00
|
|
|
if ent and ent:GetOwner() == self then return ent end
|
2014-10-02 08:49:54 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
function meta:GiveStatus(sType, fDie)
|
|
|
|
end
|
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
function meta:KnockDown(time)
|
|
|
|
end
|
|
|
|
|
|
|
|
local ViewHullMins = Vector(-8, -8, -8)
|
|
|
|
local ViewHullMaxs = Vector(8, 8, 8)
|
|
|
|
function meta:GetThirdPersonCameraPos(origin, angles)
|
|
|
|
local allplayers = player.GetAll()
|
|
|
|
local tr = util.TraceHull({start = origin, endpos = origin + angles:Forward() * -math.max(36, self:Team() == TEAM_UNDEAD and self:GetZombieClassTable().CameraDistance or self:BoundingRadius()), mask = MASK_SHOT, filter = allplayers, mins = ViewHullMins, maxs = ViewHullMaxs})
|
|
|
|
return tr.HitPos + tr.HitNormal * 3
|
|
|
|
end
|
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
function meta:IsFriend()
|
|
|
|
return self.m_IsFriend
|
|
|
|
end
|
|
|
|
|
|
|
|
timer.Create("checkfriend", 5, 0, function()
|
|
|
|
-- This probably isn't the fastest function in the world so I cache it.
|
|
|
|
for _, pl in pairs(player.GetAll()) do
|
|
|
|
pl.m_IsFriend = pl:GetFriendStatus() == "friend"
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
if not meta.SetGroundEntity then
|
|
|
|
function meta:SetGroundEntity(ent) end
|
|
|
|
end
|
|
|
|
|
|
|
|
if not meta.Kill then
|
|
|
|
function meta:Kill() end
|
|
|
|
end
|
|
|
|
|
|
|
|
if not meta.HasWeapon then
|
|
|
|
function meta:HasWeapon(class)
|
|
|
|
for _, wep in pairs(self:GetWeapons()) do
|
|
|
|
if wep:GetClass() == class then return true end
|
|
|
|
end
|
|
|
|
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function meta:SetMaxHealth(num)
|
|
|
|
self:SetDTInt(0, math.ceil(num))
|
|
|
|
end
|
|
|
|
|
2022-07-12 18:33:47 +08:00
|
|
|
meta.OldGetMaxHealth = meta.OldGetMaxHealth or FindMetaTable("Entity").GetMaxHealth
|
2014-10-02 08:49:54 +08:00
|
|
|
function meta:GetMaxHealth()
|
|
|
|
return self:GetDTInt(0)
|
|
|
|
end
|
|
|
|
|
|
|
|
function meta:DoHulls(classid, teamid)
|
|
|
|
teamid = teamid or self:Team()
|
|
|
|
classid = classid or self:GetZombieClass()
|
|
|
|
|
|
|
|
if teamid == TEAM_UNDEAD then
|
|
|
|
self:SetIK(false)
|
|
|
|
|
|
|
|
local classtab = GAMEMODE.ZombieClasses[classid]
|
|
|
|
if classtab then
|
|
|
|
if classtab.ModelScale then
|
|
|
|
self:SetModelScale(classtab.ModelScale, 0)
|
|
|
|
elseif self:GetModelScale() ~= DEFAULT_MODELSCALE then
|
|
|
|
self:SetModelScale(DEFAULT_MODELSCALE, 0)
|
|
|
|
end
|
|
|
|
|
|
|
|
if not classtab.Hull or not classtab.HullDuck then
|
|
|
|
self:ResetHull()
|
|
|
|
end
|
|
|
|
if classtab.ViewOffset then
|
|
|
|
self:SetViewOffset(classtab.ViewOffset)
|
|
|
|
elseif self:GetViewOffset() ~= DEFAULT_VIEW_OFFSET then
|
|
|
|
self:SetViewOffset(DEFAULT_VIEW_OFFSET)
|
|
|
|
end
|
|
|
|
if classtab.ViewOffsetDucked then
|
|
|
|
self:SetViewOffsetDucked(classtab.ViewOffsetDucked)
|
|
|
|
elseif self:GetViewOffsetDucked() ~= DEFAULT_VIEW_OFFSET_DUCKED then
|
|
|
|
self:SetViewOffsetDucked(DEFAULT_VIEW_OFFSET_DUCKED)
|
|
|
|
end
|
|
|
|
if classtab.HullDuck then
|
|
|
|
self:SetHullDuck(classtab.HullDuck[1], classtab.HullDuck[2])
|
|
|
|
end
|
|
|
|
if classtab.Hull then
|
|
|
|
self:SetHull(classtab.Hull[1], classtab.Hull[2])
|
|
|
|
end
|
|
|
|
if classtab.StepSize then
|
|
|
|
self:SetStepSize(classtab.StepSize)
|
|
|
|
elseif self:GetStepSize() ~= DEFAULT_STEP_SIZE then
|
|
|
|
self:SetStepSize(DEFAULT_STEP_SIZE)
|
|
|
|
end
|
|
|
|
if classtab.JumpPower then
|
|
|
|
self:SetJumpPower(classtab.JumpPower)
|
|
|
|
elseif self:GetJumpPower() ~= DEFAULT_JUMP_POWER then
|
|
|
|
self:SetJumpPower(DEFAULT_JUMP_POWER)
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
if classtab.Gravity then
|
|
|
|
self:SetGravity(classtab.Gravity)
|
|
|
|
elseif self:GetGravity() ~= 1 then
|
|
|
|
self:SetGravity(1)
|
|
|
|
end
|
2014-10-02 08:49:54 +08:00
|
|
|
|
|
|
|
if classtab.ClientsideModelScale then
|
|
|
|
self.ClientsideModelScale = Vector(1, 1, 1) * classtab.ClientsideModelScale
|
|
|
|
local m = Matrix()
|
|
|
|
m:Scale(self.ClientsideModelScale)
|
|
|
|
self:EnableMatrix("RenderMultiply", m)
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
self.NoCollideAll = classtab.NoCollideAll or (classtab.ModelScale or 1) ~= DEFAULT_MODELSCALE
|
|
|
|
--self.NoCollideInside = classtab.NoCollideInside or (classtab.ModelScale or 1) ~= DEFAULT_MODELSCALE
|
2014-10-02 08:49:54 +08:00
|
|
|
self.AllowTeamDamage = classtab.AllowTeamDamage
|
|
|
|
self.NeverAlive = classtab.NeverAlive
|
2018-05-02 06:32:59 +08:00
|
|
|
self.KnockbackScale = classtab.KnockbackScale
|
2014-10-02 08:49:54 +08:00
|
|
|
local phys = self:GetPhysicsObject()
|
|
|
|
if phys:IsValid() then
|
|
|
|
phys:SetMass(classtab.Mass or DEFAULT_MASS)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
self:SetIK(true)
|
|
|
|
|
|
|
|
self:SetModelScale(DEFAULT_MODELSCALE, 0)
|
|
|
|
self:ResetHull()
|
|
|
|
self:SetViewOffset(DEFAULT_VIEW_OFFSET)
|
|
|
|
self:SetViewOffsetDucked(DEFAULT_VIEW_OFFSET_DUCKED)
|
|
|
|
self:SetStepSize(DEFAULT_STEP_SIZE)
|
|
|
|
self:SetJumpPower(DEFAULT_JUMP_POWER)
|
2018-05-02 06:32:59 +08:00
|
|
|
self:SetGravity(1)
|
2014-10-02 08:49:54 +08:00
|
|
|
|
|
|
|
if self.ClientsideModelScale then
|
|
|
|
self.ClientsideModelScale = nil
|
|
|
|
self:DisableMatrix("RenderMultiply")
|
|
|
|
end
|
|
|
|
self.NoCollideAll = nil
|
2018-05-02 06:32:59 +08:00
|
|
|
--self.NoCollideInside = nil
|
2014-10-02 08:49:54 +08:00
|
|
|
self.AllowTeamDamage = nil
|
|
|
|
self.NeverAlive = nil
|
2018-05-02 06:32:59 +08:00
|
|
|
self.KnockbackScale = nil
|
2014-10-02 08:49:54 +08:00
|
|
|
local phys = self:GetPhysicsObject()
|
|
|
|
if phys:IsValid() then
|
|
|
|
phys:SetMass(DEFAULT_MASS)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function meta:GivePenalty(amount)
|
|
|
|
surface.PlaySound("ambient/alarms/klaxon1.wav")
|
|
|
|
end
|
|
|
|
|
|
|
|
function meta:SetZombieClass(cl)
|
2018-05-02 06:32:59 +08:00
|
|
|
self:CallZombieFunction0("SwitchedAway")
|
2014-10-02 08:49:54 +08:00
|
|
|
|
|
|
|
local classtab = GAMEMODE.ZombieClasses[cl]
|
|
|
|
if classtab then
|
|
|
|
self.Class = classtab.Index or cl
|
2018-05-02 06:32:59 +08:00
|
|
|
self:CallZombieFunction0("SwitchedTo")
|
2014-10-02 08:49:54 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
function meta:GetRateOfPalsy(ft, frightened, health, threshold, gunsway)
|
|
|
|
local healthth = health <= threshold and (((threshold - health) / threshold) * 7) or 0
|
|
|
|
|
|
|
|
return ft * (
|
|
|
|
(frightened and 14 or healthth) * (MySelf.AimShakeMul or 1) +
|
|
|
|
(gunsway and (4 * (MySelf.AimSpreadMul or 1)) or 0)
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
GM.CachedResupplyAmmoType = "scrap"
|
|
|
|
timer.Create("CacheResupplyAmmoType", 0.3333, 0, function()
|
|
|
|
if not GAMEMODE or not MySelf or not MySelf.GetResupplyAmmoType then return end
|
|
|
|
|
|
|
|
GAMEMODE.CachedResupplyAmmoType = MySelf:GetResupplyAmmoType()
|
|
|
|
end)
|
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
net.Receive("zs_penalty", function(length)
|
|
|
|
local penalty = net.ReadUInt(16)
|
|
|
|
|
|
|
|
MySelf:GivePenalty(penalty)
|
|
|
|
end)
|
|
|
|
|
|
|
|
net.Receive("zs_dohulls", function(length)
|
|
|
|
local ent = net.ReadEntity()
|
2018-05-02 06:32:59 +08:00
|
|
|
local classid = net.ReadUInt(8)
|
|
|
|
local is_zombie = net.ReadBool()
|
2014-10-02 08:49:54 +08:00
|
|
|
|
|
|
|
if ent:IsValid() then
|
2018-05-02 06:32:59 +08:00
|
|
|
ent:DoHulls(classid, is_zombie and TEAM_UNDEAD or TEAM_HUMAN)
|
2014-10-02 08:49:54 +08:00
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
net.Receive("zs_zclass", function(length)
|
|
|
|
local ent = net.ReadEntity()
|
|
|
|
local id = net.ReadUInt(8)
|
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
if ent:IsValidPlayer() then
|
2014-10-02 08:49:54 +08:00
|
|
|
ent:SetZombieClass(id)
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
net.Receive("zs_floatscore", function(length)
|
|
|
|
local victim = net.ReadEntity()
|
|
|
|
local effectname = net.ReadString()
|
|
|
|
local frags = net.ReadInt(24)
|
|
|
|
local flags = net.ReadUInt(8)
|
|
|
|
|
|
|
|
if victim and victim:IsValid() then
|
|
|
|
MySelf:FloatingScore(victim, effectname, frags, flags)
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
net.Receive("zs_floatscore_vec", function(length)
|
|
|
|
local pos = net.ReadVector()
|
|
|
|
local effectname = net.ReadString()
|
|
|
|
local frags = net.ReadInt(24)
|
|
|
|
local flags = net.ReadUInt(8)
|
|
|
|
|
|
|
|
MySelf:FloatingScore(pos, effectname, frags, flags)
|
|
|
|
end)
|