import { useEffect, useState } from 'react' import { useUtilsEffect } from '@zardoy/react-util' import { WorldRendererCommon } from 'renderer/viewer/lib/worldrendererCommon' import { WorldRendererThree } from 'renderer/viewer/three/worldrendererThree' import Screen from './Screen' import ChunksDebug, { ChunkDebug } from './ChunksDebug' import { useIsModalActive } from './utilsApp' const Inner = () => { const [playerX, setPlayerX] = useState(Math.floor(worldView!.lastPos.x / 16) * 16) const [playerZ, setPlayerZ] = useState(Math.floor(worldView!.lastPos.z / 16) * 16) const [update, setUpdate] = useState(0) useUtilsEffect(({ interval }) => { interval( 500, () => { setPlayerX(Math.floor(worldView!.lastPos.x / 16) * 16) setPlayerZ(Math.floor(worldView!.lastPos.z / 16) * 16) setUpdate(u => u + 1) } ) }, []) const mapChunk = (key: string, state: ChunkDebug['state']): ChunkDebug => { const chunk = worldView!.debugChunksInfo[key] return { x: Number(key.split(',')[0]), z: Number(key.split(',')[1]), state, lines: [String(chunk?.loads.length ?? 0)], sidebarLines: [ `loads: ${chunk.loads.map(l => `${l.reason} ${l.dataLength} ${l.time}`).join('\n')}`, // `blockUpdates: ${chunk.blockUpdates}`, ], } } const chunksWaitingServer = Object.keys(worldView!.waitingSpiralChunksLoad).map(key => mapChunk(key, 'server-waiting')) const world = globalThis.world as WorldRendererThree const loadedSectionsChunks = Object.fromEntries(Object.keys(world.sectionObjects).map(sectionPos => { const [x, y, z] = sectionPos.split(',').map(Number) return [`${x},${z}`, true] })) const chunksWaitingClient = Object.keys(worldView!.loadedChunks).map(key => mapChunk(key, 'client-waiting')) const clientProcessingChunks = Object.keys(world.loadedChunks).map(key => mapChunk(key, 'client-processing')) const chunksDoneEmpty = Object.keys(world.finishedChunks) .filter(chunkPos => !loadedSectionsChunks[chunkPos]) .map(key => mapChunk(key, 'done-empty')) const chunksDone = Object.keys(world.finishedChunks).map(key => mapChunk(key, 'done')) const allChunks = [ ...chunksWaitingServer, ...chunksWaitingClient, ...clientProcessingChunks, ...chunksDone, ...chunksDoneEmpty, ] return } export default () => { const isActive = useIsModalActive('chunks-debug') if (!isActive) return null return }