include("shared.lua") local healingBeam = Material("effects/laser1") local healingGlow = Material("sprites/light_glow02_add") local beamColor = Color(255, 218, 65, 235) local beamCoreColor = Color(255, 252, 205, 255) local function LightPosition(scanner) local attachmentID = scanner:LookupAttachment("light") local attachment = attachmentID and attachmentID > 0 and scanner:GetAttachment(attachmentID) return attachment and attachment.Pos or (scanner:WorldSpaceCenter() + scanner:GetForward() * 16) end local function DrawHealingArc(startPosition, endPosition, scannerIndex) local direction = endPosition - startPosition local normalized = direction:GetNormalized() local perpendicular = normalized:Cross(Vector(0, 0, 1)) if perpendicular:LengthSqr() < 0.01 then perpendicular = Vector(1, 0, 0) end perpendicular:Normalize() local vertical = normalized:Cross(perpendicular):GetNormalized() local time = CurTime() local segments = 12 render.SetMaterial(healingBeam) render.StartBeam(segments + 1) for segment = 0, segments do local fraction = segment / segments local position = LerpVector(fraction, startPosition, endPosition) if segment > 0 and segment < segments then local taper = math.sin(fraction * math.pi) position = position + perpendicular * math.sin(time * 13 + segment * 2.31 + scannerIndex) * 6 * taper + vertical * math.cos(time * 17 + segment * 1.73 + scannerIndex) * 4 * taper end render.AddBeam(position, 4.5, fraction, beamColor) end render.EndBeam() render.DrawBeam(startPosition, endPosition, 1.25, 0, 1, beamCoreColor) end function ENT:Draw() self:DrawModel() end function ENT:Think() self.CustomCoopTailBone = self.CustomCoopTailBone or self:LookupBone("Scanner.Tail") local tailBone = self.CustomCoopTailBone if tailBone then if self:GetNW2Bool("CustomCoopScannerWreck", false) then self:ManipulateBoneAngles(tailBone, angle_zero) else -- Client-only bone motion: this gives the tail some life without -- feeding any rotation back into the VPhysics flight controller. local speed = math.Clamp(self:GetVelocity():Length() / 80, 0, 1) local phase = RealTime() + self:EntIndex() * 0.37 local yaw = math.sin(phase * 2.1) * (6 + speed * 4) local pitch = math.sin(phase * 1.35 + 0.8) * 3.5 local roll = math.sin(phase * 1.7 + 2.2) * 2 self:ManipulateBoneAngles(tailBone, Angle(pitch, yaw, roll)) end end self:SetNextClientThink(CurTime()) return true end function ENT:DrawTranslucent() if self:GetNW2Bool("CustomCoopScannerWreck", false) then return end local lightPosition = LightPosition(self) render.SetMaterial(healingGlow) render.DrawSprite(lightPosition, 24, 24, beamColor) local light = DynamicLight(self:EntIndex()) if light then light.pos = lightPosition light.r = 255 light.g = 205 light.b = 45 light.brightness = 2 light.Decay = 500 light.Size = 105 light.DieTime = CurTime() + 0.2 end local patient = self:GetHealingTarget() if IsValid(patient) and patient:IsPlayer() then DrawHealingArc(lightPosition, patient:WorldSpaceCenter(), self:EntIndex()) render.DrawSprite(patient:WorldSpaceCenter(), 15, 15, beamCoreColor) end end