local ffi = require 'ffi'
local eBlipType = {
BLIP_NONE = 0,
BLIP_CAR = 1,
BLIP_CHAR = 2,
BLIP_OBJECT = 3,
BLIP_COORD = 4, -- Checkpoint.
BLIP_CONTACTPOINT = 5, -- Sphere.
BLIP_SPOTLIGHT = 6,
BLIP_PICKUP = 7,
BLIP_AIRSTRIP = 8
}
local eBlipDisplay = {
BLIP_DISPLAY_NEITHER = 0,
BLIP_DISPLAY_MARKER_ONLY = 1,
BLIP_DISPLAY_BLIP_ONLY = 2,
BLIP_DISPLAY_BOTH = 3
};
local eRadarSprite = {
RADAR_SPRITE_NONE = 0,
RADAR_SPRITE_WHITE = 1,
RADAR_SPRITE_CENTRE = 2,
RADAR_SPRITE_MAP_HERE = 3,
RADAR_SPRITE_NORTH = 4,
RADAR_SPRITE_AMMUGUN = 6,
RADAR_SPRITE_BIGSMOKE = 8,
RADAR_SPRITE_BURGERSHOT = 10,
RADAR_SPRITE_CATALINAPINK = 12,
RADAR_SPRITE_CHICKEN = 14,
RADAR_SPRITE_CRASH1 = 16,
RADAR_SPRITE_EMMETGUN = 18,
RADAR_SPRITE_FIRE = 20,
RADAR_SPRITE_HOSTPITAL = 22,
RADAR_SPRITE_LOGOSYNDICATE = 23,
RADAR_SPRITE_MAFIACASINO = 25,
RADAR_SPRITE_MODGARAGE = 27,
RADAR_SPRITE_PIZZA = 29,
RADAR_SPRITE_PROPERTYG = 31,
RADAR_SPRITE_RACE = 33,
RADAR_SPRITE_SAVEGAME = 35,
RADAR_SPRITE_QMARK = 37,
RADAR_SPRITE_TATTOO = 39,
RADAR_SPRITE_WAYPOINT = 41,
RADAR_SPRITE_TRIADS = 43,
RADAR_SPRITE_TSHIRT = 45,
RADAR_SPRITE_ZERO = 47,
RADAR_SPRITE_DATEDRINK = 49,
RADAR_SPRITE_TRUCK = 51,
RADAR_SPRITE_FLAG = 53,
RADAR_SPRITE_IMPOUND = 55,
RADAR_SPRITE_RUNWAY = 57,
RADAR_SPRITE_GANGP = 59,
RADAR_SPRITE_GANGN = 61,
RADAR_SPRITE_SPRAY = 63,
--RADAR_SPRITE_TORENO = 64,
RADAR_SPRITE_COUNT = 64
};
ffi.cdef[[
typedef struct { float x, y, z; } CVector;
typedef struct {
uint32_t m_nColour; // see eBlipColour
uint32_t m_nEntityHandle;
CVector m_vecPos;
uint16_t m_nCounter;
float m_fSphereRadius;
uint16_t m_nBlipSize;
struct CEntryExit *m_pEntryExit;
uint8_t m_nRadarSprite; // see eRadarSprite
uint8_t m_bBright : 1; // It makes use of bright colors. Always set.
uint8_t m_bInUse : 1; // It is available.
uint8_t m_bShortRange : 1; // It doesn't show permanently on the radar.
uint8_t m_bFriendly : 1; // It is affected by BLIP_COLOUR_THREAT.
uint8_t m_bBlipRemain : 1; // It has the priority over the entity (it will still appear after the entity's deletion).
uint8_t m_bBlipFade : 1; // Possibly a leftover. Always unset (unused).
uint8_t m_nCoordBlipAppearance : 2; // see eBlipAppearance
uint8_t m_nBlipDisplay : 2; // see eBlipDisplay
uint8_t m_nBlipType : 4; // see eBlipType
} tRadarTrace;
]]
CRadar__ms_RadarTrace = ffi.cast('tRadarTrace *', 0xBA86F0);
local function getName(data, idx) for k, v in pairs(data) do if v == idx then return k end end return "" end
function main()
repeat wait(100) until isSampAvailable()
while true do wait(1000)
if sampIsLocalPlayerSpawned() then
for i = 0, 174 do
local trace = CRadar__ms_RadarTrace[i]
if trace ~= ffi.NULL and trace.m_bInUse ~= 0 then
print("===================")
print(("Pos: {%.2f, %.2f, %.2f}; Sprite: %s; Display: %s; Type: %s; Color: %08X"):format(
trace.m_vecPos.x, trace.m_vecPos.y, trace.m_vecPos.z,
getName(eRadarSprite, trace.m_nRadarSprite),
getName(eBlipDisplay, trace.m_nBlipDisplay),
getName(eBlipType, trace.m_nBlipType),
trace.m_nColour
))
trace.m_nColour = 2 -- BLIP_COLOUR_BLUE
trace.m_nBlipType = eBlipType.BLIP_COORD
trace.m_nBlipDisplay = eBlipDisplay.BLIP_DISPLAY_BLIP_ONLY
trace.m_nRadarSprite = eRadarSprite.RADAR_SPRITE_MAP_HERE
print("===================")
end
end
end
end
end