Skip to content

Commit 7a83a2a

Browse files
committed
fix(important): fix all known issues wiht panorama crashing whole game in single file build (minecraft.html)
1 parent 64da602 commit 7a83a2a

File tree

6 files changed

+43
-18
lines changed

6 files changed

+43
-18
lines changed

renderer/viewer/baseGraphicsBackend.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import { proxy } from 'valtio'
12
import { NonReactiveState, RendererReactiveState } from '../../src/appViewer'
23

34
export const getDefaultRendererState = (): {
45
reactive: RendererReactiveState
56
nonReactive: NonReactiveState
67
} => {
78
return {
8-
reactive: {
9+
reactive: proxy({
910
world: {
1011
chunksLoaded: new Set(),
1112
heightmaps: new Map(),
@@ -15,7 +16,7 @@ export const getDefaultRendererState = (): {
1516
},
1617
renderer: '',
1718
preventEscapeMenu: false
18-
},
19+
}),
1920
nonReactive: {
2021
world: {
2122
chunksLoaded: new Set(),

renderer/viewer/lib/worldDataEmitter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter<Wo
210210
if (bot?.time?.timeOfDay) {
211211
this.emitter.emit('time', bot.time.timeOfDay)
212212
}
213-
if (bot.entity) {
213+
if (bot?.entity) {
214214
this.emitter.emit('playerEntity', bot.entity)
215215
}
216216
this.emitterGotConnected()

renderer/viewer/three/panorama.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { loadThreeJsTextureFromUrl, loadThreeJsTextureFromUrlSync } from './thre
1313
import { WorldRendererThree } from './worldrendererThree'
1414
import { EntityMesh } from './entity/EntityMesh'
1515
import { DocumentRenderer } from './documentRenderer'
16+
import { PANORAMA_VERSION } from './panoramaShared'
1617

1718
const panoramaFiles = [
1819
'panorama_3.png', // right (+x)
@@ -156,7 +157,7 @@ export class PanoramaRenderer {
156157
}
157158

158159
async worldBlocksPanorama () {
159-
const version = '1.21.4'
160+
const version = PANORAMA_VERSION
160161
const fullResourceManager = this.options.resourcesManager as ResourcesManager
161162
fullResourceManager.currentConfig = { version, noInventoryGui: true, }
162163
await fullResourceManager.updateAssetsData({ })
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const PANORAMA_VERSION = '1.21.4'

src/appViewer.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ import { proxy, subscribe } from 'valtio'
88
import { getDefaultRendererState } from 'renderer/viewer/baseGraphicsBackend'
99
import { getSyncWorld } from 'renderer/playground/shared'
1010
import { MaybePromise } from 'contro-max/build/types/store'
11+
import { PANORAMA_VERSION } from 'renderer/viewer/three/panoramaShared'
1112
import { playerState } from './mineflayer/playerState'
1213
import { createNotificationProgressReporter, ProgressReporter } from './core/progressReporter'
1314
import { setLoadingScreenStatus } from './appStatus'
1415
import { activeModalStack, miscUiState } from './globalState'
1516
import { options } from './optionsStorage'
1617
import { ResourcesManager, ResourcesManagerTransferred } from './resourcesManager'
1718
import { watchOptionsAfterWorldViewInit } from './watchOptions'
19+
import { loadMinecraftData } from './connect'
1820

1921
export interface RendererReactiveState {
2022
world: {
@@ -112,7 +114,7 @@ export class AppViewer {
112114
inWorldRenderingConfig: WorldRendererConfig = proxy(defaultWorldRendererConfig)
113115
lastCamUpdate = 0
114116
playerState = playerState
115-
rendererState = proxy(getDefaultRendererState().reactive)
117+
rendererState = getDefaultRendererState().reactive
116118
nonReactiveState: NonReactiveState = getDefaultRendererState().nonReactive
117119
worldReady: Promise<void>
118120
private resolveWorldReady: () => void
@@ -162,11 +164,15 @@ export class AppViewer {
162164

163165
// Execute queued action if exists
164166
if (this.currentState) {
165-
const { method, args } = this.currentState
166-
this.backend[method](...args)
167-
if (method === 'startWorld') {
168-
void this.worldView!.init(bot.entity.position)
169-
// void this.worldView!.init(args[0].playerState.getPosition())
167+
if (this.currentState.method === 'startPanorama') {
168+
this.startPanorama()
169+
} else {
170+
const { method, args } = this.currentState
171+
this.backend[method](...args)
172+
if (method === 'startWorld') {
173+
void this.worldView!.init(bot.entity.position)
174+
// void this.worldView!.init(args[0].playerState.getPosition())
175+
}
170176
}
171177
}
172178

@@ -225,10 +231,16 @@ export class AppViewer {
225231

226232
startPanorama () {
227233
if (this.currentDisplay === 'menu') return
228-
this.currentDisplay = 'menu'
229234
if (options.disableAssets) return
230-
if (this.backend) {
231-
this.backend.startPanorama()
235+
if (this.backend && !hasAppStatus()) {
236+
this.currentDisplay = 'menu'
237+
if (process.env.SINGLE_FILE_BUILD_MODE) {
238+
void loadMinecraftData(PANORAMA_VERSION).then(() => {
239+
this.backend?.startPanorama()
240+
})
241+
} else {
242+
this.backend.startPanorama()
243+
}
232244
}
233245
this.currentState = { method: 'startPanorama', args: [] }
234246
}
@@ -316,15 +328,16 @@ const initialMenuStart = async () => {
316328
}
317329
window.initialMenuStart = initialMenuStart
318330

331+
const hasAppStatus = () => activeModalStack.some(m => m.reactType === 'app-status')
332+
319333
const modalStackUpdateChecks = () => {
320334
// maybe start panorama
321-
if (!miscUiState.gameLoaded) {
335+
if (!miscUiState.gameLoaded && !hasAppStatus()) {
322336
void initialMenuStart()
323337
}
324338

325339
if (appViewer.backend) {
326-
const hasAppStatus = activeModalStack.some(m => m.reactType === 'app-status')
327-
appViewer.backend.setRendering(!hasAppStatus)
340+
appViewer.backend.setRendering(!hasAppStatus())
328341
}
329342

330343
appViewer.inWorldRenderingConfig.foreground = activeModalStack.length === 0

src/shims/minecraftData.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,20 @@ const customResolver = () => {
1919
}
2020
}
2121

22+
let dataStatus = 'not-called'
23+
2224
const optimizedDataResolver = customResolver()
2325
window._MC_DATA_RESOLVER = optimizedDataResolver
2426
window._LOAD_MC_DATA = async () => {
2527
if (optimizedDataResolver.resolvedData) return
26-
optimizedDataResolver.resolve(await importLargeData('mcData'))
28+
dataStatus = 'loading'
29+
try {
30+
optimizedDataResolver.resolve(await importLargeData('mcData'))
31+
dataStatus = 'ready'
32+
} catch (e) {
33+
dataStatus = 'error'
34+
throw e
35+
}
2736
}
2837

2938
// 30 seconds
@@ -39,7 +48,7 @@ const possiblyGetFromCache = (version: string) => {
3948
}
4049
const inner = () => {
4150
if (!optimizedDataResolver.resolvedData) {
42-
throw new Error(`Data for ${version} is not ready yet`)
51+
throw new Error(`Minecraft data are not ready yet. Ensure you await window._LOAD_MC_DATA() before using it. Status: ${dataStatus}`)
4352
}
4453
const dataTypes = Object.keys(optimizedDataResolver.resolvedData)
4554
const allRestored = {}

0 commit comments

Comments
 (0)