mirror of
https://github.com/CommunityOx/ox_lib.git
synced 2026-08-17 06:56:03 +01:00
perf(package): only run points loop when there's at least one point
This commit is contained in:
@@ -6,6 +6,7 @@ let nearbyPoints: Point[] = [];
|
|||||||
let nearbyCount: number = 0;
|
let nearbyCount: number = 0;
|
||||||
let closestPoint: Point | undefined;
|
let closestPoint: Point | undefined;
|
||||||
let tick: number | undefined;
|
let tick: number | undefined;
|
||||||
|
let pointsInterval: CitizenTimer;
|
||||||
|
|
||||||
interface LibPoint<T = unknown> {
|
interface LibPoint<T = unknown> {
|
||||||
coords: number[];
|
coords: number[];
|
||||||
@@ -37,6 +38,9 @@ export class Point<T = unknown> {
|
|||||||
this.nearby = point.nearby;
|
this.nearby = point.nearby;
|
||||||
this.args = point.args;
|
this.args = point.args;
|
||||||
points.push(this);
|
points.push(this);
|
||||||
|
if (points.length === 1) {
|
||||||
|
startPointsInterval();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
remove = () => {
|
remove = () => {
|
||||||
@@ -51,71 +55,76 @@ export class Point<T = unknown> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
points = points.filter((point) => point.id !== this.id);
|
points = points.filter((point) => point.id !== this.id);
|
||||||
|
if (points.length === 0) {
|
||||||
|
clearInterval(pointsInterval);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
setInterval(() => {
|
const startPointsInterval = () => {
|
||||||
if (points.length < 1) return;
|
pointsInterval = setInterval(() => {
|
||||||
|
if (points.length < 1) return;
|
||||||
|
|
||||||
if (nearbyCount !== 0) {
|
if (nearbyCount !== 0) {
|
||||||
nearbyPoints = [];
|
nearbyPoints = [];
|
||||||
nearbyCount = 0;
|
nearbyCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const coords = Vector3.fromArray(GetEntityCoords(cache.ped, false));
|
const coords = Vector3.fromArray(GetEntityCoords(cache.ped, false));
|
||||||
|
|
||||||
if (closestPoint && coords.distance(closestPoint.coords) > closestPoint.distance) {
|
if (closestPoint && coords.distance(closestPoint.coords) > closestPoint.distance) {
|
||||||
closestPoint = undefined;
|
closestPoint = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < points.length; i++) {
|
for (let i = 0; i < points.length; i++) {
|
||||||
const point = points[i];
|
const point = points[i];
|
||||||
const distance = coords.distance(point.coords);
|
const distance = coords.distance(point.coords);
|
||||||
|
|
||||||
if (distance <= point.distance) {
|
if (distance <= point.distance) {
|
||||||
point.currentDistance = distance;
|
point.currentDistance = distance;
|
||||||
|
|
||||||
if (closestPoint && closestPoint.currentDistance) {
|
if (closestPoint && closestPoint.currentDistance) {
|
||||||
if (distance < closestPoint.currentDistance) {
|
if (distance < closestPoint.currentDistance) {
|
||||||
closestPoint.isClosest = false;
|
closestPoint.isClosest = false;
|
||||||
|
point.isClosest = true;
|
||||||
|
closestPoint = point;
|
||||||
|
}
|
||||||
|
} else if (distance < point.distance) {
|
||||||
point.isClosest = true;
|
point.isClosest = true;
|
||||||
closestPoint = point;
|
closestPoint = point;
|
||||||
}
|
}
|
||||||
} else if (distance < point.distance) {
|
|
||||||
point.isClosest = true;
|
|
||||||
closestPoint = point;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (point.nearby) {
|
if (point.nearby) {
|
||||||
nearbyCount++;
|
nearbyCount++;
|
||||||
nearbyPoints[nearbyCount - 1] = point;
|
nearbyPoints[nearbyCount - 1] = point;
|
||||||
}
|
|
||||||
|
|
||||||
if (point.onEnter && !point.inside) {
|
|
||||||
point.inside = true;
|
|
||||||
point.onEnter();
|
|
||||||
}
|
|
||||||
} else if (point.currentDistance) {
|
|
||||||
if (point.onExit) point.onExit();
|
|
||||||
point.inside = false;
|
|
||||||
point.currentDistance = undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!tick) {
|
|
||||||
if (nearbyCount !== 0) {
|
|
||||||
tick = setTick(() => {
|
|
||||||
for (let i = 0; i < nearbyCount; i++) {
|
|
||||||
const point = nearbyPoints[i];
|
|
||||||
|
|
||||||
if (point && point.nearby) {
|
|
||||||
point.nearby();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
if (point.onEnter && !point.inside) {
|
||||||
|
point.inside = true;
|
||||||
|
point.onEnter();
|
||||||
|
}
|
||||||
|
} else if (point.currentDistance) {
|
||||||
|
if (point.onExit) point.onExit();
|
||||||
|
point.inside = false;
|
||||||
|
point.currentDistance = undefined;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (nearbyCount === 0) {
|
|
||||||
clearTick(tick);
|
if (!tick) {
|
||||||
tick = undefined;
|
if (nearbyCount !== 0) {
|
||||||
}
|
tick = setTick(() => {
|
||||||
}, 300);
|
for (let i = 0; i < nearbyCount; i++) {
|
||||||
|
const point = nearbyPoints[i];
|
||||||
|
|
||||||
|
if (point && point.nearby) {
|
||||||
|
point.nearby();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (nearbyCount === 0) {
|
||||||
|
clearTick(tick);
|
||||||
|
tick = undefined;
|
||||||
|
}
|
||||||
|
}, 300);
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user