Add entity instance equality check and helper functions

This commit is contained in:
2026-03-31 05:53:55 +02:00
parent 646c9300d1
commit b304143909

View File

@@ -88,6 +88,10 @@ function cloneVec3(vector: Vec3): Vec3 {
};
}
function areVec3Equal(left: Vec3, right: Vec3): boolean {
return left.x === right.x && left.y === right.y && left.z === right.z;
}
function assertFiniteVec3(vector: Vec3, label: string) {
if (!Number.isFinite(vector.x) || !Number.isFinite(vector.y) || !Number.isFinite(vector.z)) {
throw new Error(`${label} must be finite on every axis.`);
@@ -326,6 +330,34 @@ export function cloneEntityRegistry(entities: Record<string, EntityInstance>): R
return Object.fromEntries(Object.entries(entities).map(([entityId, entity]) => [entityId, cloneEntityInstance(entity)]));
}
export function areEntityInstancesEqual(left: EntityInstance, right: EntityInstance): boolean {
if (left.kind !== right.kind || left.id !== right.id || !areVec3Equal(left.position, right.position)) {
return false;
}
switch (left.kind) {
case "playerStart":
return left.yawDegrees === right.yawDegrees;
case "soundEmitter":
return (
left.radius === right.radius &&
left.gain === right.gain &&
left.autoplay === right.autoplay &&
left.loop === right.loop
);
case "triggerVolume":
return (
areVec3Equal(left.size, right.size) &&
left.triggerOnEnter === right.triggerOnEnter &&
left.triggerOnExit === right.triggerOnExit
);
case "teleportTarget":
return left.yawDegrees === right.yawDegrees;
case "interactable":
return left.radius === right.radius && left.prompt === right.prompt && left.enabled === right.enabled;
}
}
export function compareEntityInstances(left: EntityInstance, right: EntityInstance): number {
const leftOrder = ENTITY_KIND_ORDER.indexOf(left.kind);
const rightOrder = ENTITY_KIND_ORDER.indexOf(right.kind);