local Hints = {} function GM:DrawPointWorldHints() for _, ent in pairs(ents.FindByClass("point_worldhint")) do ent:DrawHint() end end function GM:WorldHint(hint, pos, ent, lifetime) lifetime = lifetime or 8 if ent and ent:IsValid() then if pos then pos = ent:WorldToLocal(pos) else pos = ent:OBBCenter() end end local hint = {Hint = hint, Pos = pos, Entity = ent, StartTime = CurTime(), EndTime = CurTime() + lifetime} table.insert(Hints, hint) return hint end net.Receive("zs_worldhint", function(length) GAMEMODE:WorldHint(net.ReadString(), net.ReadVector(), net.ReadEntity(), net.ReadFloat()) end) local matRing = Material("effects/select_ring") local colFG = Color(220, 220, 220, 255) function DrawWorldHint(hint, pos, delta, scale) local eyepos = EyePos() delta = delta or 1 colFG.a = math.min(220, delta * 220) local ang = (eyepos - pos):Angle() ang:RotateAroundAxis(ang:Right(), 270) ang:RotateAroundAxis(ang:Up(), 90) cam.IgnoreZ(true) cam.Start3D2D(pos, ang, (scale or 1) * math.max(250, eyepos:Distance(pos)) * delta * 0.0005) draw.SimpleText("!", "zshintfont", 0, 0, colFG, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) draw.SimpleText(hint, "ZS3D2DFont2Small", 0, 64, colFG, TEXT_ALIGN_CENTER) surface.SetMaterial(matRing) for i=1, 4 do colFG.a = colFG.a * (1 / i) surface.SetDrawColor(colFG) local pulse = math.max(0.25, math.abs(math.sin(RealTime() * 6))) * 30 * i surface.DrawTexturedRectRotated(0, 0, 128 + pulse, 128 + pulse, 0) end cam.End3D2D() cam.IgnoreZ(false) end local DrawWorldHint = DrawWorldHint function GM:DrawWorldHints() if #Hints > 0 then local curtime = CurTime() local done = true for _, hint in pairs(Hints) do local ent = hint.Entity if curtime < hint.EndTime and not (ent and not ent:IsValid()) then done = false DrawWorldHint(hint.Hint, ent and ent:LocalToWorld(hint.Pos) or hint.Pos, math.Clamp(hint.EndTime - curtime, 0, 1)) end end if done then Hints = {} end end end