radar
local enableBlips = true
local renderNorthBlip = falsee
local alwaysRenderMap = false --true = always render map, false = only render when in interior world 0 (radar will stay, only the map will stop rendering)
local alwaysRenderOxygen = false --true = always render oxygen, false = only when oxygen not full/local player in water
local disableGTASAhealth = false --Disable GTASA's HUD health display
local disableGTASAarmor = false --Disable GTASA's HUD armour display
local disableGTASAoxygen = false --Disable GTASA's HUD oxygen display
local worldW, worldH = 3686, 3686 --map image dimensions - if map image changed, please edit appropriately
local blip = 12 --Blip size, pixels relative to 1366x768 resolution
local healthOkayR, healthOkayG, healthOkayB = 102, 204, 102 --RGB for health which is 'okay' (50% or more)
local healthBadR, healthBadG, healthBadB = 200, 200, 0 --RGB for health which is 'bad' (25%)
local healthCriticalR, healthCriticalG, healthCriticalB = 200, 0, 0 --RGB for health which is 'critically low' (near/at 0%)
local armorColorR, armorColorG, armorColorB = 0, 102, 255
local oxygenColorR, oxygenColorG, oxygenColorB = 255, 255, 0
local sx, sy = guiGetScreenSize()
local rt = dxCreateRenderTarget(290, 175)
local xFactor, yFactor = sx/1366, sy/768
local yFactor = xFactor --otherwise the radar looses it's 2:3 ratio.
function findRotation(x1,y1,x2,y2) --Author: Doomed_Space_Marine & robhol
local t = -math.deg(math.atan2(x2-x1,y2-y1))
if t < 0 then t = t + 360 end;
return t;
end
function getPointFromDistanceRotation(x, y, dist, angle) --Author: robhol
local a = math.rad(90 - angle);
local dx = math.cos(a) * dist;
local dy = math.sin(a) * dist;
return x+dx, y+dy;
end
function drawRadar()
setPlayerHudComponentVisible("radar", false)
if disableGTASAhealth then setPlayerHudComponentVisible("health", false) end
if disableGTASAarmor then setPlayerHudComponentVisible("armour", false) end
if disableGTASAoxygen then setPlayerHudComponentVisible("breath", false) end
if (not isPlayerMapVisible()) then
local mW, mH = dxGetMaterialSize(rt)
local x, y = getElementPosition(localPlayer)
local X, Y = mW/2 -(x/(6000/worldW)), mH/2 +(y/(6000/worldH))
local camX,camY,camZ = getElementRotation(getCamera())
dxSetRenderTarget(rt, true)
if alwaysRenderMap or getElementInterior(localPlayer) == 0 then
dxDrawRectangle(0, 0, mW, mH, 0xFF7CA7D1) --render background
dxDrawImage(X - worldW/2, mH/5 + (Y - worldH/2), worldW, worldH, "image/world.jpg", camZ, (x/(6000/worldW)), -(y/(6000/worldH)), tocolor(255, 255, 255, 255))
end
dxSetRenderTarget()
dxDrawRectangle((10)*xFactor, sy-((200+10))*yFactor, (300)*xFactor, (185)*yFactor, tocolor(20, 20, 20, 200))
dxDrawImage((10+5)*xFactor, sy-((200+5))*yFactor, (300-10)*xFactor, (175)*yFactor, rt, 0, 0, 0, tocolor(255, 255, 255, 220))
local health = math.max(math.min(getElementHealth(localPlayer)/(0.232018558500192*getPedStat(localPlayer, 24) -32.018558511152), 1), 0)
local armor = math.max(math.min(getPedArmor(localPlayer)/100, 1), 0)
local oxygen = math.max(math.min(getPedOxygenLevel(localPlayer)/(1.5*getPedStat(localPlayer, 225) +1000), 1), 0)
local rx, ry, rz = getElementRotation(localPlayer)
local lB = (15)*xFactor
local rB = (15+290)*xFactor
local tB = sy-(205)*yFactor
local bB = tB + (175)*yFactor
local cX, cY = (rB+lB)/2, (tB+bB)/2 +(35)*yFactor
local toLeft, toTop, toRight, toBottom = cX-lB, cY-tB, rB-cX, bB-cY
blib = getElementsByType("blip")
for v=1, #blib do
local value = blib[v]
local bx, by = getElementPosition(value)
local actualDist = getDistanceBetweenPoints2D(x, y, bx, by)
local maxDist = getBlipVisibleDistance(value)
if actualDist <= maxDist and getElementDimension(value)==getElementDimension(localPlayer) and getElementInterior(value)==getElementInterior(localPlayer) then
local dist = actualDist/(6000/((worldW+worldH)/2))
local rot = findRotation(bx, by, x, y)-camZ
local bpx, bpy = getPointFromDistanceRotation(cX, cY, math.min(dist, math.sqrt(toTop^2 + toRight^2)), rot)
local bpx = math.max(lB, math.min(rB, bpx))
local bpy = math.max(tB, math.min(bB, bpy))
local bid = getElementData(value, "customIcon") or getBlipIcon(value)
local _, _, _, bcA = getBlipColor(value)
local bcR, bcG, bcB = 255, 255, 255
if getBlipIcon(value) == 0 then
bcR, bcG, bcB = getBlipColor(value)
end
local bS = getBlipSize(value)
dxDrawImage(bpx -(blip*bS)*xFactor/2, bpy -(blip*bS)*yFactor/2, (blip*bS)*xFactor, (blip*bS)*yFactor, "image/blip/"..bid..".png", 0, 0, 0, tocolor(bcR, bcG, bcB, bcA))
end
end
if renderNorthBlip then
local rot = -camZ+180
local bpx, bpy = getPointFromDistanceRotation(cX, cY, math.sqrt(toTop^2 + toRight^2), rot) --get position
local bpx = math.max(lB, math.min(rB, bpx))
local bpy = math.max(tB, math.min(bB, bpy)) --cap position to screen
local dist = getDistanceBetweenPoints2D(cX, cY, bpx, bpy) --get distance to the capped position
local bpx, bpy = getPointFromDistanceRotation(cX, cY, dist, rot) --re-calculate position based on new distance
if bpx and bpy then --if position was obtained successfully
local bpx = math.max(lB, math.min(rB, bpx))
local bpy = math.max(tB, math.min(bB, bpy)) --cap position just in case
dxDrawImage(bpx -(blip*2)/2, bpy -(blip*2)/2, blip*2, blip*2, "image/blip/4.png", 0, 0, 0) --draw north (4) blip
end
end
dxDrawImage(cX -(blip*2)*xFactor/2, cY -(blip*2)*yFactor/2, (blip*2)*xFactor, (blip*2)*yFactor, "image/player.png", camZ-rz, 0, 0)
end
end
addEventHandler("onClientRender", root, drawRadar)
addEventHandler("onClientResourceStop", resourceRoot, function()
setPlayerHudComponentVisible("radar", true)
if disableGTASAhealth then setPlayerHudComponentVisible("health", true) end
if disableGTASAarmor then setPlayerHudComponentVisible("armour", true) end
if disableGTASAoxygen then setPlayerHudComponentVisible("breath", true) end
end)