Skip to content

Commit

Permalink
refactor(es_extended/client/imports/point.lua) and (es_extended/clien…
Browse files Browse the repository at this point in the history
…t/modules/points.lua): Performace Improvement

Inside loop is now handled in the same resource as long more than one point is nearby.
  • Loading branch information
feelfreetofee authored Dec 19, 2024
1 parent f7eb0ca commit f7faee7
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 100 deletions.
95 changes: 52 additions & 43 deletions [core]/es_extended/client/imports/point.lua
Original file line number Diff line number Diff line change
@@ -1,44 +1,53 @@
Point = ESX.Class()

function Point:constructor(properties)
self.coords = properties.coords
self.hidden = properties.hidden or false
self.inside = properties.inside or function() end
self.enter = properties.enter or function() end
self.leave = properties.leave or function() end
self.handle = ESX.CreatePointInternal(properties.coords, properties.distance, properties.hidden, function()
self.nearby = true
if self.enter then
self:enter()
end
if self.inside then
CreateThread(function()
while self.nearby do
local coords = GetEntityCoords(ESX.PlayerData.ped)
self.currDistance = #(coords - self.coords)
self:inside()
Wait(0)
end
end)
end
end, function()
self.nearby = false
if self.leave then
self:leave()
end
end)
end

function Point:delete()
ESX.RemovePointInternal(self.handle)
end

function Point:toggle(hidden)
if hidden == nil then
hidden = not self.hidden
end
self.hidden = hidden
ESX.HidePointInternal(self.handle, hidden)
end

local Point = ESX.Class()

local nearby, loop = {}

function Point:constructor(properties)
self.coords = properties.coords
self.hidden = properties.hidden
self.enter = properties.enter
self.leave = properties.leave
self.inside = properties.inside
self.handle = ESX.CreatePointInternal(properties.coords, properties.distance, properties.hidden, function()
nearby[self.handle] = self
if self.enter then
self:enter()
end
if not loop then
loop = true
CreateThread(function()
while loop do
local coords = GetEntityCoords(ESX.PlayerData.ped)
for handle, point in pairs(nearby) do
if point.inside then
point:inside(#(coords - point.coords))
end
end
Wait()
end
end)
end
end, function()
nearby[self.handle] = nil
if self.leave then
self:leave()
end
if #nearby == 0 then
loop = false
end
end)
end

function Point:delete()
ESX.RemovePointInternal(self.handle)
end

function Point:toggle(hidden)
if hidden == nil then
hidden = not self.hidden
end
self.hidden = hidden
ESX.HidePointInternal(self.handle, hidden)
end

return Point
111 changes: 54 additions & 57 deletions [core]/es_extended/client/modules/points.lua
Original file line number Diff line number Diff line change
@@ -1,57 +1,54 @@
local points = {}

function ESX.CreatePointInternal(coords, distance, hidden, enter, leave)
local point = {
coords = coords,
distance = distance,
hidden = hidden,
enter = enter,
leave = leave,
resource = GetInvokingResource()
}
local handle = ESX.Table.SizeOf(points) + 1
points[handle] = point
return handle
end

function ESX.RemovePointInternal(handle)
points[handle] = nil
end

function ESX.HidePointInternal(handle, hidden)
if points[handle] then
points[handle].hidden = hidden
end
end

function StartPointsLoop()
CreateThread(function()
while true do
local coords = GetEntityCoords(ESX.PlayerData.ped)
for i, point in pairs(points) do
local distance = #(coords - point.coords)

if not point.hidden and distance <= point.distance then
if not point.nearby then
points[i].nearby = true
points[i].enter()
end
point.currentDistance = distance
elseif point.nearby then
points[i].nearby = false
points[i].leave()
end
end
Wait(500)
end
end)
end


AddEventHandler('onResourceStop', function(resource)
for i, point in pairs(points) do
if point.resource == resource then
points[i] = nil
end
end
end)
local points = {}

function ESX.CreatePointInternal(coords, distance, hidden, enter, leave)
local point = {
coords = coords,
distance = distance,
hidden = hidden,
enter = enter,
leave = leave,
resource = GetInvokingResource()
}
local handle = ESX.Table.SizeOf(points) + 1
points[handle] = point
return handle
end

function ESX.RemovePointInternal(handle)
points[handle] = nil
end

function ESX.HidePointInternal(handle, hidden)
if points[handle] then
points[handle].hidden = hidden
end
end

function StartPointsLoop()
CreateThread(function()
while true do
local coords = GetEntityCoords(ESX.PlayerData.ped)
for handle, point in pairs(points) do
if not point.hidden and #(coords - point.coords) <= point.distance then
if not point.nearby then
points[handle].nearby = true
points[handle].enter()
end
elseif point.nearby then
points[handle].nearby = false
points[handle].leave()
end
end
Wait(500)
end
end)
end


AddEventHandler('onResourceStop', function(resource)
for handle, point in pairs(points) do
if point.resource == resource then
points[handle] = nil
end
end
end)

0 comments on commit f7faee7

Please sign in to comment.