zombiesurvival-evolved/gamemodes/zombiesurvival/gamemode/obj_entity_extend_cl.lua

213 lines
5.3 KiB
Lua
Raw Normal View History

local meta = FindMetaTable("Entity")
local M_Player = FindMetaTable("Player")
local P_Team = M_Player.Team
function meta:SetModelScaleVector(vec)
local bonecount = self:GetBoneCount()
if bonecount and bonecount > 1 then
local scale
if type(vec) == "number" then
scale = vec
else
scale = math.min(vec.x, vec.y, vec.z)
end
self._ModelScale = Vector(scale, scale, scale)
self:SetModelScale(scale, 0)
else
if type(vec) == "number" then
vec = Vector(vec, vec, vec)
end
self._ModelScale = vec
local m = Matrix()
m:Scale(vec)
self:EnableMatrix("RenderMultiply", m)
end
end
if not meta.TakeDamageInfo then
meta.TakeDamageInfo = function() end
end
if not meta.SetPhysicsAttacker then
meta.SetPhysicsAttacker = function() end
end
function meta:HealPlayer(pl, amount)
local healed, rmv = 0, 0
local health, maxhealth = pl:Health(), pl:GetDTBool(DT_PLAYER_BOOL_FRAIL) and math.floor(pl:GetMaxHealth() * 0.25) or pl:GetMaxHealth()
local missing_health = maxhealth - health
local poison = pl:GetPoisonDamage()
local bleed = pl:GetBleedDamage()
local multiplier = self.MedicHealMul or 1
amount = amount * multiplier
-- Heal bleed first.
if bleed > 0 then
rmv = math.min(amount, bleed)
healed = healed + rmv
amount = amount - rmv
end
-- Heal poison next.
if poison > 0 and amount > 0 then
rmv = math.min(amount, poison)
healed = healed + rmv
amount = amount - rmv
end
-- Then heal missing health.
if missing_health > 0 and amount > 0 then
rmv = math.min(amount, missing_health)
healed = healed + rmv
amount = amount - rmv
end
return healed
end
local y = -50
local maxbarwidth = 560
local barheight = 30
function meta:Draw3DHealthBar(percentage, name, yoffset, widthprop, nameoffset)
yoffset = yoffset or 0
local barwidth = maxbarwidth * (widthprop or 1)
local startx = barwidth * -0.5
surface.SetDrawColor(0, 0, 0, 220)
surface.DrawRect(startx, y + yoffset, barwidth, barheight)
surface.SetDrawColor(255 - percentage * 255, percentage * 255, 0, 220)
surface.DrawRect(startx + 4, y + 4 + yoffset, barwidth * percentage - 8, barheight - 8)
surface.DrawOutlinedRect(startx, y + yoffset, barwidth, barheight)
if name then
draw.SimpleText(name, "ZS3D2DFont", 0, yoffset + (nameoffset or 0), COLOR_WHITE, TEXT_ALIGN_CENTER)
end
end
-- Caching
local CachedNails = {}
timer.Create("CacheNails", 0.3333, 0, function()
CachedNails = {}
for _, nail in pairs(ents.FindByClass("prop_nail")) do
if nail:IsValid() and nail.GetAttachEntity then
CachedNails[#CachedNails + 1] = nail
nail.CachedAttachEntity = nail:GetAttachEntity()
nail.CachedBaseEntity = nail:GetBaseEntity()
end
end
end)
function meta:IsNailed()
if self:IsValid() then -- In case we're the world.
for _, nail in pairs(CachedNails) do
if nail.CachedAttachEntity == self or nail.CachedBaseEntity == self then
return true
end
end
end
return false
end
function meta:TransAlphaToMe()
local radius = GAMEMODE.TransparencyRadius / 9
if radius > 0 and P_Team(MySelf) == TEAM_HUMAN then
local dist = self:GetPos():DistToSqr(EyePos())
if dist < radius then
return math.max(0.1, (dist / radius) ^ 0.5)
end
end
return 1
end
GM.CachedArsenalEntities = {}
timer.Create("CacheArsenalEntities", 0.5, 0, function()
if not GAMEMODE then return end
GAMEMODE.CachedArsenalEntities = {}
local arseents = {}
table.Add(arseents, ents.FindByClass("prop_arsenalcrate"))
table.Add(arseents, ents.FindByClass("status_arsenalpack"))
for _, v in pairs(player.GetAll()) do
if v ~= MySelf and not v:HasTrinket("arsenalpack") and v:HasWeapon("weapon_zs_arsenalcrate") then
table.insert(arseents, v)
end
end
GAMEMODE.CachedArsenalEntities = arseents
end)
GM.CachedResupplyEntities = {}
timer.Create("CachedResupplyEntities", 0.5, 0, function()
if not GAMEMODE then return end
GAMEMODE.CachedResupplyEntities = {}
local resupents = {}
table.Add(resupents, ents.FindByClass("prop_resupplybox"))
table.Add(resupents, ents.FindByClass("status_resupplypack"))
for _, v in pairs(player.GetAll()) do
if v ~= MySelf and not v:HasTrinket("resupplypack") and v:HasWeapon("weapon_zs_resupplybox") then
table.insert(resupents, v)
end
end
GAMEMODE.CachedResupplyEntities = resupents
end)
GM.CachedRemantlerEntities = {}
timer.Create("CachedRemantlerEntities", 0.5, 0, function()
if not GAMEMODE then return end
GAMEMODE.CachedRemantlerEntities = {}
local remanents = {}
table.Add(remanents, ents.FindByClass("prop_remantler"))
for _, v in pairs(player.GetAll()) do
if v ~= MySelf and v:HasWeapon("weapon_zs_remantler") then
table.insert(remanents, v)
end
end
GAMEMODE.CachedRemantlerEntities = remanents
end)
GM.CachedNests = {}
timer.Create("CachedNests", 0.5, 0, function()
if not GAMEMODE then return end
GAMEMODE.CachedNests = {}
local nests = {}
table.Add(nests, ents.FindByClass("prop_creepernest"))
GAMEMODE.CachedNests = nests
end)
GM.CachedBabies = {}
timer.Create("CachedBabies", 0.5, 0, function()
if not GAMEMODE then return end
GAMEMODE.CachedBabies = {}
local babies = {}
table.Add(babies, ents.FindByClass("prop_thrownbaby"))
table.Add(babies, ents.FindByClass("prop_thrownshadowbaby"))
GAMEMODE.CachedBabies = babies
end)
GM.CachedSigils = {}
timer.Create("CacheSigils", 1, 0, function()
if not GAMEMODE then return end
GAMEMODE.CachedSigils = GAMEMODE:GetSigils()
end)