Grid
Partitionnement spatial 2D de la map pour des lookups de proximité en O(1) — le moteur derrière zones et points.
Partitionnement spatial 2D de la map pour des lookups de proximité en O(1) — le moteur derrière zones et points.
lib.grid découpe la map GTA5 en une grille de cellules fixe pour trouver les entrées proches
à bas coût. C'est la base de lib.zones et lib.points — la plupart des scripts utilisent
ceux-là. Passe par la grille directement quand tu indexes tes propres objets (shops, props…)
pour la proximité.
lib.grid.addEntry(entry) — indexe une entrée ; elle a besoin de coords (vector3) et soit radius, soit width/length.lib.grid.removeEntry(entry) — retire une entrée (comparée par identité — la même instance de table).lib.grid.getNearbyEntries(point, filter?) → table[] — les entrées dans les cellules autour de point, dédupliquées ; prédicat de filtre optionnel.lib.grid.getCell(point) → table[]? — le contenu brut de la seule cellule contenant point.lib.grid.getCellPosition(point) → number, number — les indices cellX, cellY d'un point monde (clampés à la map).local entry = { coords = vector3(215.0, -810.0, 30.0), radius = 5.0, id = 'shop_1' }
lib.grid.addEntry(entry)
local coords = GetEntityCoords(cache.ped)
for _, candidate in ipairs(lib.grid.getNearbyEntries(coords)) do
if #(coords - candidate.coords) <= candidate.radius then
print('inside', candidate.id)
end
end
lib.grid.removeEntry(entry)Un prédicat resserre le scan :
local zonesOnly = lib.grid.getNearbyEntries(coords, function(entry)
return entry.type == 'zone'
end)Les entrées sont comparées par identité — recréer une table équivalente ne la retire pas. Si tu changes les coords / radius d'une entrée, retire-la et ré-ajoute-la (l'index ne se met pas à jour en place). Les coords hors map sont clampées, pas rejetées. Passe une référence filter stable — une closure inline recréée à chaque frame casse le cache interne.