diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index 9e36a89a..cf7f5a6c 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -19,6 +19,7 @@ export class WorldDataEmitter extends EventEmitter { private readonly lastPos: Vec3 private eventListeners: Record = {} private readonly emitter: WorldDataEmitter + keepChunksDistance = 0 constructor (public world: typeof __type_bot['world'], public viewDistance: number, position: Vec3 = new Vec3(0, 0, 0)) { super() @@ -191,14 +192,14 @@ export class WorldDataEmitter extends EventEmitter { const [botX, botZ] = chunkPos(pos) if (lastX !== botX || lastZ !== botZ || force) { this.emitter.emit('chunkPosUpdate', { pos }) - const newView = new ViewRect(botX, botZ, this.viewDistance) + const newViewToUnload = new ViewRect(botX, botZ, this.viewDistance + this.keepChunksDistance) const chunksToUnload: Vec3[] = [] for (const coords of Object.keys(this.loadedChunks)) { const x = parseInt(coords.split(',')[0], 10) const z = parseInt(coords.split(',')[1], 10) const p = new Vec3(x, 0, z) const [chunkX, chunkZ] = chunkPos(p) - if (!newView.contains(chunkX, chunkZ)) { + if (!newViewToUnload.contains(chunkX, chunkZ)) { chunksToUnload.push(p) } } diff --git a/src/index.ts b/src/index.ts index 39626d54..75112a67 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,7 +24,7 @@ import './reactUi' import { contro, onBotCreate } from './controls' import './dragndrop' import { possiblyCleanHandle, resetStateAfterDisconnect } from './browserfs' -import { watchOptionsAfterViewerInit } from './watchOptions' +import { watchOptionsAfterViewerInit, watchOptionsAfterWorldViewInit } from './watchOptions' import downloadAndOpenFile from './downloadAndOpenFile' import fs from 'fs' @@ -690,6 +690,7 @@ async function connect (connectOptions: ConnectOptions) { const center = bot.entity.position const worldView = window.worldView = new WorldDataEmitter(bot.world, renderDistance, center) + watchOptionsAfterWorldViewInit() bot.on('physicsTick', () => updateCursor()) diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index bcf3054f..644ec66c 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -83,6 +83,11 @@ export const guiOptionsScheme: { }, starfieldRendering: {}, renderEntities: {}, + keepChunksDistance: { + max: 5, + unit: '', + tooltip: 'Additional distance to keep the chunks loading before unloading them by marking them as too far', + }, }, ], main: [ diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index 990dd31e..cac8c9f8 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -7,6 +7,7 @@ import { omitObj } from '@zardoy/utils' const defaultOptions = { renderDistance: 3, + keepChunksDistance: 1, multiplayerRenderDistance: 3, closeConfirmation: true, autoFullScreen: false, diff --git a/src/watchOptions.ts b/src/watchOptions.ts index e379cb50..9deb46a5 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -63,3 +63,14 @@ export const watchOptionsAfterViewerInit = () => { viewer.world.starField.enabled = o.starfieldRendering }) } + +let viewWatched = false +export const watchOptionsAfterWorldViewInit = () => { + worldView!.keepChunksDistance = options.keepChunksDistance + if (viewWatched) return + viewWatched = true + watchValue(options, o => { + if (!worldView) return + worldView.keepChunksDistance = o.keepChunksDistance + }) +}