@nymphjs/client
Version:
Nymph.js - Client
75 lines • 2.76 kB
JavaScript
import Entity from './Entity.js';
// Save referenced entities in an entity's data.
export function saveEntities(entity) {
let savedEntities = {};
// @ts-ignore: Accessing a protected property.
for (let [_key, value] of Object.entries(entity.$dataStore)) {
addEntitiesToObject(value, savedEntities);
}
return savedEntities;
}
const addEntitiesToObject = (item, entitiesObject) => {
// @ts-ignore: Accessing a private property.
if (item instanceof Entity && !item.$isASleepingReference) {
// Convert entities to references.
if (item.guid) {
entitiesObject[item.guid] = item;
}
}
else if (Array.isArray(item)) {
// Recurse into lower arrays.
item.forEach((item) => addEntitiesToObject(item, entitiesObject));
}
else if (item instanceof Object) {
for (let [_key, value] of Object.entries(item)) {
addEntitiesToObject(value, entitiesObject);
}
}
};
// Restore referenced entities into an entity's data.
// Returns true if there are any sleeping references still in the entity's data
// after the restore.
export function restoreEntities(entity, savedEntities) {
let data = {
containsSleepingReference: false,
};
// @ts-ignore: Accessing a protected property.
for (let [key, value] of Object.entries(entity.$dataStore)) {
// @ts-ignore: Accessing a protected property.
entity.$dataStore[key] = retoreEntitiesFromObject(value, savedEntities, data);
}
return data.containsSleepingReference;
}
const retoreEntitiesFromObject = (item, entitiesObject, data) => {
if (item instanceof Entity) {
// @ts-ignore: Accessing a private property.
if (item.$isASleepingReference) {
if (item.guid && entitiesObject.hasOwnProperty(item.guid)) {
return entitiesObject[item.guid];
}
else {
// Couldn't find the entity in saved entities.
data.containsSleepingReference = true;
return item;
}
}
else {
// Leave entities alone.
return item;
}
}
else if (Array.isArray(item)) {
// Recurse into lower arrays.
return item.map((item) => retoreEntitiesFromObject(item, entitiesObject, data));
}
else if (item instanceof Object) {
for (let [key, value] of Object.entries(item)) {
// @ts-ignore: The key comes from the object. It can definitely be used to index it.
item[key] = retoreEntitiesFromObject(value, entitiesObject, data);
}
return item;
}
// Not an array, just return it.
return item;
};
//# sourceMappingURL=entityRefresh.js.map