From f7faee7e23adcff30d77cdefe820431ea68ef981 Mon Sep 17 00:00:00 2001 From: Sergio <89666307+feelfreetofee@users.noreply.github.com> Date: Thu, 19 Dec 2024 03:55:54 +0100 Subject: [PATCH] refactor(es_extended/client/imports/point.lua) and (es_extended/client/modules/points.lua): Performace Improvement Inside loop is now handled in the same resource as long more than one point is nearby. --- [core]/es_extended/client/imports/point.lua | 95 +++++++++------- [core]/es_extended/client/modules/points.lua | 111 +++++++++---------- 2 files changed, 106 insertions(+), 100 deletions(-) diff --git a/[core]/es_extended/client/imports/point.lua b/[core]/es_extended/client/imports/point.lua index 55ec92bca..5c505cc82 100644 --- a/[core]/es_extended/client/imports/point.lua +++ b/[core]/es_extended/client/imports/point.lua @@ -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 \ No newline at end of file diff --git a/[core]/es_extended/client/modules/points.lua b/[core]/es_extended/client/modules/points.lua index fee318be6..bbcaf8a82 100644 --- a/[core]/es_extended/client/modules/points.lua +++ b/[core]/es_extended/client/modules/points.lua @@ -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) \ No newline at end of file