From 512c5a470aea01d3f5db7243e1fdb76e504af037 Mon Sep 17 00:00:00 2001 From: cha0s Date: Tue, 24 Sep 2024 05:33:08 -0500 Subject: [PATCH] refactor: hmr --- app/routes/_main-menu.play.$.$/route.jsx | 9 +++------ app/server/engine.js | 3 +++ app/server/worker.js | 18 +++++++++++++++++- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/routes/_main-menu.play.$.$/route.jsx b/app/routes/_main-menu.play.$.$/route.jsx index dadcba0..e4e7bf4 100644 --- a/app/routes/_main-menu.play.$.$/route.jsx +++ b/app/routes/_main-menu.play.$.$/route.jsx @@ -58,6 +58,7 @@ export default function PlaySpecific() { markChange() {} } ecsRef.current = new ClientEcsPerf({Components, Systems}); + mainEntityRef.current = undefined; }, [ecsRef, Components, Systems]); useEffect(() => { async function setEcsStuff() { @@ -67,7 +68,7 @@ export default function PlaySpecific() { setSystems(Systems); } setEcsStuff(); - }, []); + }); useEffect(() => { refreshEcs(); }, [refreshEcs]); @@ -90,6 +91,7 @@ export default function PlaySpecific() { function onConnectionStatus(status) { switch (status) { case 'aborted': { + client.disconnect(); setDisconnected(true); break; } @@ -127,15 +129,10 @@ export default function PlaySpecific() { if (!client || !disconnected) { return; } - mainEntityRef.current = undefined; async function reconnect() { await client.connect(url); } reconnect(); - const handle = setInterval(reconnect, 1000); - return () => { - clearInterval(handle); - }; }, [client, disconnected, mainEntityRef, url]); // useEffect(() => { // let source = true; diff --git a/app/server/engine.js b/app/server/engine.js index 3a382e7..328e7b1 100644 --- a/app/server/engine.js +++ b/app/server/engine.js @@ -130,6 +130,9 @@ export default class Engine { }); this.server.addPacketListener('Heartbeat', (connection) => { const playerData = this.connectedPlayers.get(connection); + if (!playerData) { + return; + } const {distance} = playerData; const now = performance.now(); distance.rtt = (now - distance.last) / 1000; diff --git a/app/server/worker.js b/app/server/worker.js index ee406c4..71ae58a 100644 --- a/app/server/worker.js +++ b/app/server/worker.js @@ -68,7 +68,19 @@ onmessage = async (event) => { if (import.meta.hot) { const before = withResolvers(); const promises = [before.promise]; - import.meta.hot.on('vite:beforeUpdate', async () => { + const accepted = [ + '/app/server/engine.js', + '/app/server/create/player.js', + '/app/server/create/forest.js', + '/app/server/create/town.js', + '/app/server/create/homestead.js', + ]; + let isAccepted = false; + import.meta.hot.on('vite:beforeUpdate', async ({updates}) => { + isAccepted = !!updates.find(({acceptedPath}) => accepted.includes(acceptedPath)); + if (!isAccepted) { + return; + } await engine.disconnectPlayer(0); engine.stop(); await engine.saveEcses(); @@ -128,8 +140,12 @@ import.meta.hot.accept('./create/town.js', async ({default: createTown}) => { resolve(); }); import.meta.hot.on('vite:afterUpdate', async () => { + if (!isAccepted) { + return; + } await Promise.all(promises); postMessage(encode({type: 'ConnectionStatus', payload: 'aborted'})); + postMessage(encode({type: 'EcsChange'})); close(); }); import.meta.hot.accept();