diff --git a/src/bit-systems/network-receive-system.ts b/src/bit-systems/network-receive-system.ts index a8ff6e848e..fc07d73bdd 100644 --- a/src/bit-systems/network-receive-system.ts +++ b/src/bit-systems/network-receive-system.ts @@ -15,6 +15,7 @@ import { localClientID, networkedQuery, pendingCreatorChanges, + pendingLegacyObjectSaves, pendingMessages, pendingParts, softRemovedEntities @@ -145,27 +146,25 @@ export function networkReceiveSystem(world: HubsWorld) { } } - // Handle save entity messages - for (let i = 0; i < pendingMessages.length; i++) { - const message = pendingMessages[i]; - - for (let j = 0; j < message.saves.length; j++) { - const { networkId: nidString } = message.saves[j]; + { + // Save entity state for loaded legacy objects + pendingLegacyObjectSaves.forEach(nidString => { const nid = APP.getSid(nidString); const eid = world.nid2eid.get(nid); if (!eid) { - console.warn(`Received save message for unknown entity ${nidString}.`); - continue; + console.warn(`Received save message for unknown legacy entity ${nidString}.`); + return; } if (!isNetworkInstantiated(eid)) { - console.warn(`Received save message for non-network-instantiated entity ${nidString}.`); - continue; + console.warn(`Received save message for non-network-instantiated legacy entity ${nidString}.`); + return; } createEntityState(APP.hubChannel!, world, eid); - } + }); + pendingLegacyObjectSaves.length = 0; } { @@ -206,7 +205,7 @@ export function networkReceiveSystem(world: HubsWorld) { } // Process the stored message before other updates - pendingMessages.unshift({ creates: [], updates, deletes: [], saves: [] }); + pendingMessages.unshift({ creates: [], updates, deletes: [] }); storedUpdates.delete(nid); } }); diff --git a/src/bit-systems/networking.ts b/src/bit-systems/networking.ts index 5fece98260..447d89675a 100644 --- a/src/bit-systems/networking.ts +++ b/src/bit-systems/networking.ts @@ -1,6 +1,13 @@ import { defineQuery } from "bitecs"; import { Networked } from "../bit-components"; -import type { CreateMessageData, CreatorChange, EntityID, Message, StringID } from "../utils/networking-types"; +import type { + CreateMessageData, + CreatorChange, + EntityID, + Message, + NetworkID, + StringID +} from "../utils/networking-types"; export let localClientID: StringID | null = null; export function setLocalClientID(clientId: StringID) { connectedClientIds.add(clientId); @@ -12,6 +19,7 @@ export const connectedClientIds = new Set(); export const disconnectedClientIds = new Set(); export const pendingMessages: Message[] = []; export const pendingCreatorChanges: CreatorChange[] = []; +export const pendingLegacyObjectSaves: NetworkID[] = []; export const pendingJoins: StringID[] = []; export const pendingParts: StringID[] = []; export const softRemovedEntities = new Set(); diff --git a/src/utils/entity-state-utils.ts b/src/utils/entity-state-utils.ts index 60c2490e00..c5f7d36c10 100644 --- a/src/utils/entity-state-utils.ts +++ b/src/utils/entity-state-utils.ts @@ -48,7 +48,9 @@ export function hasSavedEntityState(world: HubsWorld, eid: EntityID) { export async function createEntityState(hubChannel: HubChannel, world: HubsWorld, eid: EntityID) { const payload = createEntityStatePayload(world, eid); // console.log("save_entity_state", payload); - return push(hubChannel, "save_entity_state", payload); + return push(hubChannel, "save_entity_state", payload).catch(err => { + console.warn("Failed to save entity state", err); + }); } export async function updateEntityState(hubChannel: HubChannel, world: HubsWorld, eid: EntityID) { diff --git a/src/utils/listen-for-network-messages.ts b/src/utils/listen-for-network-messages.ts index 75f475feb4..6c794c93de 100644 --- a/src/utils/listen-for-network-messages.ts +++ b/src/utils/listen-for-network-messages.ts @@ -82,8 +82,7 @@ export function queueEntityStateAsMessage(entityState: EntityState) { fromClientId: "reticulum", creates: [entityState.create_message], updates: entityState.update_messages, - deletes: [], - saves: [] + deletes: [] }); pendingCreatorChanges.push({ nid: rootNid, diff --git a/src/utils/load-legacy-room-objects.ts b/src/utils/load-legacy-room-objects.ts index 220d3564fe..98d2db10cd 100644 --- a/src/utils/load-legacy-room-objects.ts +++ b/src/utils/load-legacy-room-objects.ts @@ -1,4 +1,4 @@ -import { pendingMessages } from "../bit-systems/networking"; +import { pendingLegacyObjectSaves, pendingMessages } from "../bit-systems/networking"; import { messageForLegacyRoomObjects } from "./message-for"; import { StorableMessage } from "./networking-types"; import { getReticulumFetchUrl } from "./phoenix-utils"; @@ -28,6 +28,13 @@ export async function loadLegacyRoomObjects(hubId: string) { if (hubId === APP.hub!.hub_id) { const message = messageForLegacyRoomObjects(legacyRoomObjects); + + for (const obj of legacyRoomObjects) { + if (obj.extensions.HUBS_components.pinnable.pinned) { + pendingLegacyObjectSaves.push(obj.name); + } + } + if (message) { message.fromClientId = "reticulum"; diff --git a/src/utils/message-for.ts b/src/utils/message-for.ts index cdba3e2f5d..688d182bcc 100644 --- a/src/utils/message-for.ts +++ b/src/utils/message-for.ts @@ -12,7 +12,6 @@ import type { EntityID, Message, NetworkID, - SaveMessage, StorableUpdateMessage } from "./networking-types"; @@ -37,8 +36,7 @@ export function messageFor( const message: Message = { creates: [], updates: [], - deletes: [], - saves: [] + deletes: [] }; created.forEach(eid => { @@ -112,7 +110,6 @@ export interface LegacyRoomObject { export function messageForLegacyRoomObjects(objects: LegacyRoomObject[]) { const message: Message = { creates: [], - saves: [], updates: [], deletes: [] }; @@ -134,13 +131,6 @@ export function messageForLegacyRoomObjects(objects: LegacyRoomObject[]) { }; message.creates.push(createMessage); - if (obj.extensions.HUBS_components.pinnable.pinned) { - const saveMessage: SaveMessage = { - networkId: nid - }; - message.saves.push(saveMessage); - } - const updateMessage: StorableUpdateMessage = { data: { "networked-transform": { diff --git a/src/utils/networking-types.ts b/src/utils/networking-types.ts index d58bf84c6d..af8465d320 100644 --- a/src/utils/networking-types.ts +++ b/src/utils/networking-types.ts @@ -15,9 +15,6 @@ export type CreateMessage = { prefabName: PrefabName; initialData: InitialData; }; -export type SaveMessage = { - networkId: NetworkID; -}; export interface CursorBuffer extends Array { cursor?: number; } @@ -41,7 +38,6 @@ export type Message = { creates: CreateMessage[]; updates: UpdateMessage[]; deletes: DeleteMessage[]; - saves: SaveMessage[]; }; export interface StorableMessage extends Message { version: 1;