Zones
Zones spatiales (sphere / box / poly) avec callbacks enter / exit / inside — partageant toutes un seul tick.
Zones spatiales (sphere / box / poly) avec callbacks enter / exit / inside — partageant toutes un seul tick.
lib.zones crée des zones spatiales qui déclenchent des callbacks onEnter / onExit /
inside. Toutes les zones partagent un seul tick (via lib.grid), donc pas de coût d'un
thread par zone. Les callbacks sont côté client ; le serveur expose des lookups.
Chacun renvoie un ZoneData avec une méthode :remove(). Ajoute debug = true pour dessiner la zone.
lib.zones.sphere(data)local zone = lib.zones.sphere({
coords = vector3(215.7, -810.1, 30.7),
radius = 5.0,
onEnter = function(self) lib.print.info('in', self.id) end,
onExit = function(self) lib.print.info('out', self.id) end,
inside = function(self)
if IsControlJustPressed(0, 38) then print('E inside') end
end,
})radius vaut 2.0 par défaut ; un thickness optionnel en fait un cylindre plat.
lib.zones.box(data)lib.zones.box({
coords = vector3(100.0, 200.0, 30.0),
size = vector3(8.0, 4.0, 3.0),
rotation = math.rad(45),
onEnter = function(self) end,
})size vaut vector3(4, 4, 4) par défaut ; rotation est en radians sur Z ; l'épaisseur verticale = size.z.
lib.zones.poly(data)lib.zones.poly({
points = {
vector3(0, 0, 30), vector3(10, 0, 30),
vector3(10, 10, 30), vector3(0, 10, 30),
},
thickness = 6.0,
})Nécessite 3+ points. coords (centroïde) et radius sont calculés pour toi.
onEnterfun(self)optionalDéclenché quand le joueur entre dans la zone.
onExitfun(self)optionalDéclenché quand le joueur sort.
insidefun(self)optionalDéclenché à chaque frame tant qu'on est dedans — garde-le léger (ex : un check d'input).
Le serveur ne peut pas exécuter de callbacks, mais il peut interroger : lib.zones.getPlayerZones(source)
renvoie les zones contenant un joueur, et lib.zones.isPlayerInZone(source, zoneId) est un booléen.
Les callbacks sont client-only. La détection enter / exit tourne toutes les ~300 ms (pas instantanée) ; inside tourne à la fréquence d'image, garde-le léger. Fais toujours :remove() sur une zone dont tu n'as plus besoin — une zone fuitée continue de ticker. Pour déplacer une zone, supprime-la et recrée-la.