function GM:DrawSelectedUnitBoxes()
local player = LocalPlayer()
local playerpos = player:GetPos() -- Get players position
for entID,entTable in pairs(LocalPlayer():GetTable().SelectedUnits) do -- Do the following for all the currently selected ents
ent = Entity(entID)
if player:IsValid() and ent:IsValid() and entTable.Owner == player then -- Check the ent is valid, and is owned by the player
local entpos = ent:GetPos() -- Get the ents current position
local dist = playerpos - entpos
local dist = dist:Length() -- get the distance from the ent to the player
if dist < 4096 then -- If the ent is close enough....
local alpha = 512 - (dist * 0.125) -- Make an alpha value based on the distance
if alpha > 255 then alpha = 255 end -- Clip it to 255 if over (this causes the ents to only start fading at 1024 distance)
local bc, tc = ent:WorldSpaceAABB() -- Get the ents bounding box
local Ta = Vector(tc.x, tc.y, tc.z):ToScreen() -- Get the screen coords of one of the corners
if alpha > 0 and Ta.visible then -- If alpha is more than zero, and the corner we just got is visible...
local Tb,Tc,Td = Vector(tc.x, bc.y, tc.z):ToScreen(), -- ...get the rest of the bounding box corners
Vector(bc.x, tc.y, tc.z):ToScreen(), -- ( these first ones are the at the top of the ent)
Vector(bc.x, bc.y, tc.z):ToScreen()
local Ba,Bb,Bc,Bd = Vector(tc.x, tc.y, bc.z):ToScreen(), -- ( these are the ones at the bottom)
Vector(tc.x, bc.y, bc.z):ToScreen(),
Vector(bc.x, tc.y, bc.z):ToScreen(),
Vector(bc.x, bc.y, bc.z):ToScreen()
local x,y = math.min(Ta.x, Tb.x, Tc.x, Td.x, Ba.x, Bb.x, Bc.x, Bd.x), -- Get the lowest x,y values (the top left of the 2d bounding box)
math.min(Ta.y, Tb.y, Tc.y, Td.y, Ba.y, Bb.y, Bc.y, Bd.y)
local w,h = math.max(Ta.x, Tb.x, Tc.x, Td.x, Ba.x, Bb.x, Bc.x, Bd.x) - x, -- Get the highest x,y values, and subtract the lowest (Giving us the height & Width)
math.max(Ta.y, Tb.y, Tc.y, Td.y, Ba.y, Bb.y, Bc.y, Bd.y) - y
surface.SetDrawColor( 30, 200, 30, alpha )
surface.DrawOutlinedRect( x, y, w, h ) -- Draw the box
surface.DrawOutlinedRect( x-1, y, w+2, h+1 ) -- Make it thicker
local hBar = 0 -- Set healthbar height (default zero)
local health, maxhealth = entTable.Health, entTable.MaxHealth -- Get the ents health & max health
if dist < 512 then hBar = 5 -- Scale the health bar size based on distance from the player
elseif dist < 1024 then hBar = 4
elseif dist < 2048 then hBar = 3
elseif dist < 3072 then hBar = 2
elseif dist < 4096 then hBar = 1
end
surface.DrawRect( x-1, y - hBar - 1, w + 2, hBar + 2 ) -- Draw the green outline (the draw colour is still green from earlier)
surface.SetDrawColor( 0, 0, 0, 255 )
surface.DrawRect( x, y - hBar, w, hBar) -- Draw the black bit
surface.SetDrawColor( 255, 20, 30, 255 )
surface.DrawRect( x, y - hBar, w * (health/maxhealth), hBar) -- Draw the red bit (the actual health)
end
end
else
LocalPlayer():GetTable().SelectedUnits[entID] = nil -- If ent is not valid, remove it from the selected list so we don't call it again.
LocalPlayer():GetTable().Units[entID] = nil
end
end
end