98 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
CircleZone = {}
 | 
						|
-- Inherits from PolyZone
 | 
						|
setmetatable(CircleZone, { __index = PolyZone })
 | 
						|
 | 
						|
function CircleZone:draw(forceDraw)
 | 
						|
  if not forceDraw and not self.debugPoly then return end
 | 
						|
  local center = self.center
 | 
						|
  local debugColor = self.debugColor
 | 
						|
  local r, g, b = debugColor[1], debugColor[2], debugColor[3]
 | 
						|
  if self.useZ then
 | 
						|
    local radius = self.radius
 | 
						|
    DrawMarker(28, center.x, center.y, center.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, radius, radius, radius, r, g, b, 48, false, false, 2, nil, nil, false)
 | 
						|
  else
 | 
						|
    local diameter = self.diameter
 | 
						|
    DrawMarker(1, center.x, center.y, -500.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, diameter, diameter, 1000.0, r, g, b, 96, false, false, 2, nil, nil, false)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
 | 
						|
local function _initDebug(zone, options)
 | 
						|
  if options.debugBlip then zone:addDebugBlip() end
 | 
						|
  if not options.debugPoly then
 | 
						|
    return
 | 
						|
  end
 | 
						|
 | 
						|
  Citizen.CreateThread(function()
 | 
						|
    while not zone.destroyed do
 | 
						|
      zone:draw(false)
 | 
						|
      Citizen.Wait(0)
 | 
						|
    end
 | 
						|
  end)
 | 
						|
end
 | 
						|
 | 
						|
function CircleZone:new(center, radius, options)
 | 
						|
  options = options or {}
 | 
						|
  local zone = {
 | 
						|
    name = tostring(options.name) or nil,
 | 
						|
    center = center,
 | 
						|
    radius = radius + 0.0,
 | 
						|
    diameter = radius * 2.0,
 | 
						|
    useZ = options.useZ or false,
 | 
						|
    debugPoly = options.debugPoly or false,
 | 
						|
    debugColor = options.debugColor or {0, 255, 0},
 | 
						|
    data = options.data or {},
 | 
						|
    isCircleZone = true,
 | 
						|
  }
 | 
						|
  if zone.useZ then
 | 
						|
    assert(type(zone.center) == "vector3", "Center must be vector3 if useZ is true {center=" .. center .. "}")
 | 
						|
  end
 | 
						|
  setmetatable(zone, self)
 | 
						|
  self.__index = self
 | 
						|
  return zone
 | 
						|
end
 | 
						|
 | 
						|
function CircleZone:Create(center, radius, options)
 | 
						|
  local zone = CircleZone:new(center, radius, options)
 | 
						|
  _initDebug(zone, options)
 | 
						|
  return zone
 | 
						|
end
 | 
						|
 | 
						|
function CircleZone:isPointInside(point)
 | 
						|
  if self.destroyed then
 | 
						|
    print("[PolyZone] Warning: Called isPointInside on destroyed zone {name=" .. self.name .. "}")
 | 
						|
    return false
 | 
						|
  end
 | 
						|
 | 
						|
  local center = self.center
 | 
						|
  local radius = self.radius
 | 
						|
 | 
						|
  if self.useZ then
 | 
						|
    return #(point - center) < radius
 | 
						|
  else
 | 
						|
    return #(point.xy - center.xy) < radius
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function CircleZone:getRadius()
 | 
						|
  return self.radius
 | 
						|
end
 | 
						|
 | 
						|
function CircleZone:setRadius(radius)
 | 
						|
  if not radius or radius == self.radius then
 | 
						|
    return
 | 
						|
  end
 | 
						|
  self.radius = radius
 | 
						|
  self.diameter = radius * 2.0
 | 
						|
end
 | 
						|
 | 
						|
function CircleZone:getCenter()
 | 
						|
  return self.center
 | 
						|
end
 | 
						|
 | 
						|
function CircleZone:setCenter(center)
 | 
						|
  if not center or center == self.center then
 | 
						|
    return
 | 
						|
  end
 | 
						|
  self.center = center
 | 
						|
end
 |