zombiesurvival-evolved/gamemodes/zombiesurvival/entities/entities/prop_creepernest/cl_init.lua
2014-10-01 20:49:54 -04:00

167 lines
5 KiB
Lua

include("shared.lua")
ENT.Seed = 0
ENT.Tall = 0
ENT.Blocked = false
function ENT:Initialize()
local dist = math.max(16, GAMEMODE.DynamicSpawnDist) * 2
self:SetRenderBounds(Vector(-dist, -dist, -dist), Vector(dist, dist, dist))
self:ManipulateBoneScale(0, self.ModelScale)
self.AmbientSound = CreateSound(self, "ambient/levels/citadel/citadel_drone_loop5.wav")
self.FloorModel = ClientsideModel("models/props_wasteland/antlionhill.mdl")
if self.FloorModel:IsValid() then
self.FloorModel:SetParent(self)
self.FloorModel:SetOwner(self)
self.FloorModel:SetPos(self:GetPos())
self.FloorModel:SetAngles(self:GetAngles())
self.FloorModel:Spawn()
self.FloorModel:ManipulateBoneScale(0, Vector(0.01, 0.01, 0.01))
self.FloorModel:SetMaterial("models/flesh")
end
self.Seed = math.Rand(0, 10)
end
local EmitSounds = {
Sound("physics/flesh/flesh_squishy_impact_hard1.wav"),
Sound("physics/flesh/flesh_squishy_impact_hard2.wav"),
Sound("physics/flesh/flesh_squishy_impact_hard3.wav"),
Sound("physics/flesh/flesh_squishy_impact_hard4.wav"),
Sound(")npc/barnacle/barnacle_die1.wav"),
Sound(")npc/barnacle/barnacle_die2.wav"),
Sound(")npc/barnacle/barnacle_digesting1.wav"),
Sound(")npc/barnacle/barnacle_digesting2.wav"),
Sound(")npc/barnacle/barnacle_gulp1.wav"),
Sound(")npc/barnacle/barnacle_gulp2.wav")
}
function ENT:Think()
self.Tall = math.Approach(self.Tall, math.Clamp(self:GetNestHealth() / self:GetNestMaxHealth(), 0.001, 1), FrameTime())
if MySelf:IsValid() and MySelf:Team() == TEAM_UNDEAD then
local blocked = false
local nearest = self:GetPos()
for _, human in pairs(team.GetPlayers(TEAM_HUMAN)) do
if util.SkewedDistance(human:GetPos(), nearest, 2.75) <= GAMEMODE.DynamicSpawnDist then
blocked = true
break
end
end
self.Blocked = blocked
end
if self.FloorModel:IsValid() then
local a = math.abs(math.sin(CurTime())) ^ 3
local hscale = 0.2 + a * 0.04
self.FloorModel:ManipulateBoneScale(0, Vector(hscale * 1.1 + 0.05, hscale * 1.1 + 0.05, 0.02 * self.Tall))
end
if self.DoEmitNextFrame then
self.DoEmitNextFrame = nil
self:EmitSound(EmitSounds[math.random(#EmitSounds)], 65, math.random(95, 105))
end
self.AmbientSound:PlayEx(0.6, 100 + CurTime() % 1)
end
function ENT:OnRemove()
self.AmbientSound:Stop()
if self.FloorModel:IsValid() then
self.FloorModel:Remove()
end
end
ENT.NextEmit = 0
local gravParticle = Vector(0, 0, -200)
local matFlesh = Material("models/flesh")
local matWireframe = Material("models/wireframe")
local matBeam = Material("Effects/laser1", "smooth")
local r, g = 0, 0
local colRing = Color(0, 0, 0, 255)
function ENT:Draw()
local curtime = CurTime() + self.Seed
local a = math.abs(math.sin(curtime)) ^ 3
local hscale = 0.2 + a * 0.04
local built = self:GetNestBuilt()
local floormodel = self.FloorModel
local fmvalid = floormodel:IsValid()
if MySelf:IsValid() and MySelf:Team() == TEAM_UNDEAD and built then
local frametime = FrameTime() * 500
local ringtime = (curtime / 2 % 1) ^ 0.5
local ringsize = ringtime * GAMEMODE.DynamicSpawnDist
local beamsize = ringtime * 20
local up = self:GetUp()
local ang = self:GetForward():Angle()
ang.yaw = curtime * 360 % 360
local ringpos = self:GetPos() + up * 16
local blocked = self.Blocked
local a = (1 - ringtime) * 0.8
r = math.Approach(r, blocked and 255 or 0, frametime)
g = math.Approach(g, blocked and 0 or 255, frametime)
colRing.r = r * a
colRing.g = g * a
render.SetMaterial(matBeam)
render.StartBeam(19)
for i=1, 19 do
render.AddBeam(ringpos + ang:Forward() * ringsize, beamsize, beamsize, colRing)
ang:RotateAroundAxis(up, 20)
end
render.EndBeam()
end
if built then
render.ModelMaterialOverride(matFlesh)
--if fmvalid then floormodel:SetNoDraw(false) end
else
render.ModelMaterialOverride(matWireframe)
render.SetColorModulation(self.Tall, 0, 0)
--if fmvalid then floormodel:SetNoDraw(true) end
end
if fmvalid then
floormodel:ManipulateBoneScale(0, Vector(hscale * 1.1 + 0.05, hscale * 1.1 + 0.05, 0.02 * self.Tall))
end
self:ManipulateBoneScale(0, Vector(hscale, hscale, (0.1 - a * 0.005) * self.Tall))
self:DrawModel()
render.SetColorModulation(1, 1, 1)
render.ModelMaterialOverride()
if not built or curtime < self.NextEmit then return end
self.NextEmit = curtime + math.Rand(0.4, 2)
if math.random(4) == 1 then
self.DoEmitNextFrame = true
end
local pos = self:GetPos() + self:GetUp() * 8
local emitter = ParticleEmitter(pos)
emitter:SetNearClip(16, 24)
for i=0, math.Rand(0, 1) ^ 0.5 * 10 do
local particle = emitter:Add("noxctf/sprite_bloodspray"..math.random(8), pos)
particle:SetGravity(gravParticle)
particle:SetDieTime(math.Rand(4, 6))
particle:SetVelocity(Angle(math.Rand(-85, -70), math.Rand(0, 360), 0):Forward() * math.Rand(100, 200))
particle:SetStartAlpha(255)
particle:SetEndAlpha(255)
particle:SetStartSize(math.Rand(2, 4))
particle:SetEndSize(0)
particle:SetRoll(math.Rand(0, 360))
particle:SetRollDelta(math.Rand(-2, 2))
particle:SetColor(180, 0, 0)
particle:SetCollide(true)
end
emitter:Finish()
end