-- Generates some fonts surface.CreateFont( "HealthEnergyNum", { font = "Agency FB", size = 20, weight = 600, blursize = 0, scanlines = 0, antialias = true } ) -- Setup basic variables -- elements = { { {x, y[, u, v]}, {x, y[, u, v]} } } local dynamic, hudMain, T, B, L, R = {}, {}; cryHud = { LineColour = {123, 158, 127, 255}, PolyColour = {50, 50, 50, 125} } -- Draw a line function cryHud.Line(x1, y1, x2, y2, xThickness, yThickness, colour) for xDiff = 0, (xThickness or 1) - 1 do for yDiff = 0, (yThickness or 1) - 1 do table.insert(dynamic, { {x1 + xDiff, y1 + yDiff}, {x2 + xDiff, y2 + yDiff}, colour = colour }) end end end -- Draws a chain of lines function cryHud.Chain(points, colour) local lastPoint = nil for _, point in ipairs(points) do if lastPoint then cryHud.Line(lastPoint[1], lastPoint[2], point[1], point[2], point[3], point[4], colour) end lastPoint = point end end -- Draw a poly function cryHud.Poly(vertices, colour) local index = #dynamic + 1 dynamic[index] = vertices dynamic[index].colour = colour end -- Draw a rectangle function cryHud.Rect(tlx, tly, brx, bry, colour) local trx, try, blx, bly = brx, tly, tlx, bry cryHud.Poly({ {x = tlx, y = tly, u = 0, v = 0}, {x = trx, y = try, u = 1, v = 0}, {x = brx, y = bry, u = 1, v = 1}, {x = blx, y = bly, u = 0, v = 1}, }, colour) end -- Draw a hex with surrounding lines function cryHud.Hex(cx, cy, radius, surroundWidth, colour, surroundColour) local py = (math.sqrt(3)/4)*radius local bx, by, tx, ty, blx, bly, brx, bry, tlx, tly, trx, try = cx, cy + radius, cx, cy - radius, cx - radius, cy + py, cx + radius, cy + py, cx - radius, cy - py, cx + radius, cy - py cryHud.Poly({ {x = tx, y = ty, u = 0.5, v = 0}, {x = trx, y = try, u = 1, v = 1/3}, {x = brx, y = bry, u = 1, v = 2/3}, {x = bx, y = by, u = 0.5, v = 1}, {x = blx, y = bly, u = 0, v = 2/3}, {x = tlx, y = tly, u = 0, v = 1/3} }) -- Surrounding green line if surroundWidth then for offset = 0, surroundWidth - 1 do cryHud.Line(tlx - offset, tly, blx - offset, bly, surroundColour) cryHud.Line(trx + offset, try, brx + offset, bry, surroundColour) cryHud.Line(tlx - offset, tly, tx, ty - offset, surroundColour) cryHud.Line(trx + offset, try, tx, ty - offset, surroundColour) cryHud.Line(blx - offset, bly, bx, by + offset, surroundColour) cryHud.Line(brx + offset, bry, bx, by + offset, surroundColour) end end end -- Draws everything inside the fed table local function Render(elementTable) for _, element in ipairs(elementTable) do if #element == 2 then surface.SetDrawColor(unpack(element.colour or cryHud.LineColour)) local x1, y1 = unpack(element[1]) local x2, y2 = unpack(element[2]) surface.DrawLine(x1, y1, x2, y2) else surface.SetDrawColor(unpack(element.colour or cryHud.PolyColour)) surface.DrawPoly(element) end end end -- Draws hudMain HUD elements local function DrawHudMain() dynamic, T, B, L, R = {}, ScrH()/32, (ScrH()-ScrH()/32), ScrW()/32, (ScrW()-ScrW()/32) -- Suit Mode Hex cryHud.Hex(R - 32, B - 32, 32, 2) -- Health Ammo Rectangle -- Secondary Ammo Indicator cryHud.Poly({ {x = R - 185, y = B - 102, u = 0, v = 0}, {x = R - 33, y = B - 102, u = 1, v = 0}, {x = R - 33, y = B - 72, u = 1, v = 1}, {x = R - 175, y = B - 72, u = 0.05, v = 1}, {x = R - 185, y = B - 82, u = 0, v = 2/3} }) -- Primary Ammo Indicator cryHud.Poly({ {x = R - 175, y = B - 136, u = 0.05, v = 0}, {x = R - 43, y = B - 136, u = 0.95, v = 0}, {x = R - 33, y = B - 126, u = 1, v = 1/3}, {x = R - 33, y = B - 106, u = 1, v = 1}, {x = R - 185, y = B - 106, u = 0, v = 1}, {x = R - 185, y = B - 126, u = 0, v = 1/3} }) -- Surrounding lines for above cryHud.Chain({ {R - 33, B - 72}, {R - 33, B - 126, 2}, {R - 43, B - 136, 2} }) cryHud.Line(R - 82, B - 73, R - 82, B - 102, 2) cryHud.Line(R - 82, B - 107, R - 82, B - 136, 2) -- Health/ammo Rect -- cryHud.Poly({R - 70, B - 66, R - 70, B - 48, R - 38, B - 66}) cryHud.Rect(R - 70, B - 18, R - 240, B - 66) -- cryHud.Poly({R - 240, B - 18, R - 252, B - 28, R - 240, B - 66}) -- cryHud.Poly({R - 240, B - 66, R - 252, B - 56, R - 252, B - 28}) -- Alert level hex and surrounding lines cryHud.Hex(L + 32, B - 32, 32, 2) -- cryHud.Poly({L + 196, B - 20, L + 72, B - 20, L + 72, B - 40}) -- cryHud.Poly({L + 196, B - 20, L + 214, B - 40, L + 72, B - 40}) -- cryHud.Poly({L + 72, B - 132, L + 33, B - 72, L + 72, B - 50}) -- cryHud.Poly({L + 72, B - 132, L + 33, B - 132, L + 33, B - 72}) cryHud.Rect(L + 72, B - 40, L + 214, B - 132) -- cryHud.Poly({L + 33, B - 136, L + 196, B - 154, L + 214, B - 136}) -- cryHud.Poly({L + 33, B - 136, L + 33, B - 144, L + 41, B - 154}) -- cryHud.Poly({L + 33, B - 136, L + 196, B - 154, L + 41, B - 154}) -- Thick/doubled lines drawn here for off = 0, 1 do -- Styling around suit mode hex area cryHud.Line(R + 2 + off, B - 52, R - 33 + off, B - 72) cryHud.Line(R + 10 + off, B - 28, R + 10 + off, B - 14) cryHud.Line(R + 10 + off, B - 14, R - 26 + off, B + 7) --[[ Ammo indicator surrounding cryHud.Line(R - 32 - off, B - 72, R - 32 - off, B - 126) cryHud.Line(R - 32 - off, B - 126, R - 43 - off, B - 137) cryHud.Line(R - 82 - off, B - 73, R - 82 - off, B - 102) cryHud.Line(R - 82 - off, B - 107, R - 82 - off, B - 136)]]-- -- Health rectangle cryHud.Line(R - 70, B - 17 - off, R - 240, B - 17 - off) cryHud.Line(R - 240, B - 17 - off, R - 253, B - 28 - off) -- Top corner frames cryHud.Line(L - off, T, L - 10 - off, T + 12) cryHud.Line(L, T - off, L + 40, T + 4 - off) cryHud.Line(R + off, T, R + 10 + off, T + 12) cryHud.Line(R, T - off, R - 40, T + 4 - off) -- Map frames cryHud.Line(L - 10 - off, B - 14, L - 10 - off, B - 28) cryHud.Line(L - 10 - off, B - 14, L + 26 - off, B + 7) cryHud.Line(L + 33 - off, B - 72, L - 2 - off, B - 52) cryHud.Line(L + 33 - off, B - 72, L + 33 - off, B - 144) cryHud.Line(L + 33 - off, B - 144, L + 41 - off, B - 154) cryHud.Line(L + 196, B - 19 - off, L + 72, B - 19 - off) cryHud.Line(L + 196, B - 19 - off, L + 214, B - 39 - off) end -- Freeze these elements in a separate table hudMain = dynamic dynamic = {} end -- Draw hud from elements table local function DrawHud() -- Draw dynamic elements local ply = LocalPlayer() -- Health and Armor local healthPos = math.ceil((ply:Health() / 100) * 135) local armorPos = math.ceil((ply:Armor() / 100) * 135) cryHud.Rect(R - 100 - healthPos, B - 40, R - 100, B - 25, nil, {110, 175, 40, 255}) cryHud.Rect(R - 100 - armorPos, B - 60, R - 100, B - 45, nil, {25, 155, 230, 255}) draw.SimpleText(ply:Health(), "HealthEnergyNum", R - 86, B - 42, Color(165, 185, 160, 255), TEXT_ALIGN_CENTER) draw.SimpleText(ply:Armor(), "HealthEnergyNum", R - 86, B - 62, Color(165, 185, 160, 255), TEXT_ALIGN_CENTER) -- Actually do some drawing Render(hudMain) Render(dynamic) -- Nils the dynamic elements table since they are regenerated every frame dynamic = {} end -- Generates the static hud elements once. Much faster DrawHudMain() -- Hook the DrawHud function up hook.Add("HUDPaint", "crysisHUD", DrawHud) -- Removes Default HUD Elements hook.Add("HUDShouldDraw", "hidehud", function(name) for _, element in pairs{"CHudHealth", "CHudBattery", "CHudAmmo", "CHudSecondaryAmmo"} do if name == element then return false end end end)