Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions client/src/blocks/BlockTypeManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ export default class BlockTypeManager {
}

private _onBlockTypesPacket = (payload: NetworkManagerEventPayload.IBlockTypesPacket) => {
payload.deserializedBlockTypes.forEach((blockType: DeserializedBlockType) => {
this._updateBlockType(blockType);
});
const { deserializedBlockTypes } = payload;

for (let i = 0; i < deserializedBlockTypes.length; i++) {
this._updateBlockType(deserializedBlockTypes[i]);
}
}

private _updateBlockType = (deserializedBlockType: DeserializedBlockType) => {
Expand Down
24 changes: 14 additions & 10 deletions client/src/chunks/ChunkManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,14 +90,16 @@ export default class ChunkManager {

private _onBlocksPacket = (payload: NetworkManagerEventPayload.IBlocksPacket) => {
const update: Record<ChunkId, { localCoordinate: Vector3Like, blockId: BlockId, blockRotationIndex?: number }[]> = {};
const { deserializedBlocks } = payload;

payload.deserializedBlocks.forEach((deserializedBlock: DeserializedBlock) => {
for (let i = 0; i < deserializedBlocks.length; i++) {
const deserializedBlock: DeserializedBlock = deserializedBlocks[i];
const { id: blockId, globalCoordinate, blockRotationIndex } = deserializedBlock;
const chunkId = Chunk.globalCoordinateToChunkId(globalCoordinate);
const chunk = this._registry.getChunk(chunkId);

if (!chunk) {
return;
continue;
}

const localCoordinate = Chunk.globalCoordinateToLocalCoordinate(globalCoordinate);
Expand All @@ -107,7 +109,7 @@ export default class ChunkManager {
update[chunkId] = [];
}
update[chunkId].push({ localCoordinate, blockId, blockRotationIndex });
});
}

// Since chunks are also managed within the WebWorker, the information will be sent.
// The worker will handle determining which batches need rebuilding based on block updates.
Expand All @@ -122,11 +124,12 @@ export default class ChunkManager {
const { deserializedChunks } = payload;
const affectedBatches: Set<BatchId> = new Set();

deserializedChunks.forEach(deserializedChunk => {
for (let i = 0; i < deserializedChunks.length; i++) {
const deserializedChunk = deserializedChunks[i];
const { removed, originCoordinate, blocks, blockRotations } = deserializedChunk;

if (!originCoordinate) {
return;
continue;
}

const chunkId = Chunk.originCoordinateToChunkId(originCoordinate);
Expand Down Expand Up @@ -161,7 +164,7 @@ export default class ChunkManager {

affectedBatches.add(batchId);
}
});
}

// Build affected batches in order of proximity to the player
const basePosition = this._game.camera.gameCameraAttachedEntity?.position || this._game.camera.activeCamera.position;
Expand All @@ -174,13 +177,14 @@ export default class ChunkManager {
});

// Send batch build messages for affected batches
sortedBatches.forEach(batchId => {
for (let i = 0; i < sortedBatches.length; i++) {
const batchId = sortedBatches[i];
const chunkIds = this._registry.getBatchChunkIds(batchId);

if (chunkIds.length === 0) {
// Batch is now empty, remove its meshes
this._game.chunkMeshManager.removeAllBatchMeshes(batchId);
return;
continue;
}

const message: ChunkWorkerChunkBatchBuildMessage = {
Expand All @@ -189,7 +193,7 @@ export default class ChunkManager {
chunkIds,
};
this._game.chunkWorkerClient.postMessage(message);
});
}
}

private _onChunkBatchBuilt = (payload: WorkerEventPayload.IChunkBatchBuilt): void => {
Expand Down Expand Up @@ -279,4 +283,4 @@ export default class ChunkManager {
const absWorldPositionY = Math.abs(worldPosition.y);
return absWorldPositionY - Math.floor(absWorldPositionY) < 1.0 + WATER_SURFACE_Y_OFFSET;
}
}
}
9 changes: 6 additions & 3 deletions client/src/chunks/LightLevelManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,15 @@ export default class LightLevelManager {
};

private _onChunksPacket = (payload: NetworkManagerEventPayload.IChunksPacket): void => {
payload.deserializedChunks.forEach(({ originCoordinate, removed }) => {
const { deserializedChunks } = payload;

for (let i = 0; i < deserializedChunks.length; i++) {
const { originCoordinate, removed } = deserializedChunks[i];
if (removed) {
const chunkId = Chunk.originCoordinateToChunkId(originCoordinate);
this._deleteVolume(chunkId);
}
});
}
};

public getLightLevel(chunkId: ChunkId, localCoordinate: Vector3Like): number {
Expand All @@ -59,4 +62,4 @@ export default class LightLevelManager {
private _deleteVolume(chunkId: ChunkId): void {
this._volumes.delete(chunkId);
}
}
}
9 changes: 6 additions & 3 deletions client/src/chunks/SkyDistanceVolumeManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,15 @@ export default class SkyDistanceVolumeManager {
};

private _onChunksPacket = (payload: NetworkManagerEventPayload.IChunksPacket): void => {
payload.deserializedChunks.forEach(({ originCoordinate, removed }) => {
const { deserializedChunks } = payload;

for (let i = 0; i < deserializedChunks.length; i++) {
const { originCoordinate, removed } = deserializedChunks[i];
if (removed) {
const chunkId = Chunk.originCoordinateToChunkId(originCoordinate);
this._deleteVolume(chunkId);
}
});
}
};

public getSkyLightBrightnessByGlobalCoordinate(globalCoordinate: Vector3Like): number {
Expand All @@ -59,4 +62,4 @@ export default class SkyDistanceVolumeManager {
private _deleteVolume(chunkId: ChunkId): void {
this._volumes.delete(chunkId);
}
}
}
104 changes: 91 additions & 13 deletions client/src/network/Deserializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,13 @@ export default class Deserializer {
}

public static deserializeAudios(audios: protocol.AudiosSchema): DeserializedAudios {
return audios.map((a: protocol.AudioSchema) => this.deserializeAudio(a));
const deserializedAudios = new Array<DeserializedAudio>(audios.length);

for (let i = 0; i < audios.length; i++) {
deserializedAudios[i] = this.deserializeAudio(audios[i]);
}

return deserializedAudios;
}

public static deserializeBlock(block: protocol.BlockSchema): DeserializedBlock {
Expand All @@ -307,7 +313,13 @@ export default class Deserializer {
}

public static deserializeBlocks(blocks: protocol.BlocksSchema): DeserializedBlocks {
return blocks.map((b: protocol.BlockSchema) => this.deserializeBlock(b));
const deserializedBlocks = new Array<DeserializedBlock>(blocks.length);

for (let i = 0; i < blocks.length; i++) {
deserializedBlocks[i] = this.deserializeBlock(blocks[i]);
}

return deserializedBlocks;
}

public static deserializeBlockType(blockType: protocol.BlockTypeSchema): DeserializedBlockType {
Expand All @@ -323,7 +335,13 @@ export default class Deserializer {
}

public static deserializeBlockTypes(blockTypes: protocol.BlockTypesSchema): DeserializedBlockTypes {
return blockTypes.map((b: protocol.BlockTypeSchema) => this.deserializeBlockType(b));
const deserializedBlockTypes = new Array<DeserializedBlockType>(blockTypes.length);

for (let i = 0; i < blockTypes.length; i++) {
deserializedBlockTypes[i] = this.deserializeBlockType(blockTypes[i]);
}

return deserializedBlockTypes;
}

public static deserializeCamera(camera: protocol.CameraSchema): DeserializedCamera {
Expand Down Expand Up @@ -357,7 +375,13 @@ export default class Deserializer {
}

public static deserializeChatMessages(chatMessages: protocol.ChatMessagesSchema): DeserializedChatMessages {
return chatMessages.map((c: protocol.ChatMessageSchema) => this.deserializeChatMessage(c));
const deserializedChatMessages = new Array<DeserializedChatMessage>(chatMessages.length);

for (let i = 0; i < chatMessages.length; i++) {
deserializedChatMessages[i] = this.deserializeChatMessage(chatMessages[i]);
}

return deserializedChatMessages;
}

public static deserializeChunk(chunk: protocol.ChunkSchema): DeserializedChunk {
Expand All @@ -370,7 +394,13 @@ export default class Deserializer {
}

public static deserializeChunks(chunks: protocol.ChunksSchema): DeserializedChunks {
return chunks.map((c: protocol.ChunkSchema) => this.deserializeChunk(c));
const deserializedChunks = new Array<DeserializedChunk>(chunks.length);

for (let i = 0; i < chunks.length; i++) {
deserializedChunks[i] = this.deserializeChunk(chunks[i]);
}

return deserializedChunks;
}

public static deserializeConnection(connection: protocol.ConnectionSchema): DeserializedConnection {
Expand Down Expand Up @@ -409,7 +439,13 @@ export default class Deserializer {
}

public static deserializeEntities(entities: protocol.EntitiesSchema): DeserializedEntities {
return entities.map((e: protocol.EntitySchema) => this.deserializeEntity(e));
const deserializedEntities = new Array<DeserializedEntity>(entities.length);

for (let i = 0; i < entities.length; i++) {
deserializedEntities[i] = this.deserializeEntity(entities[i]);
}

return deserializedEntities;
}

public static deserializeModelAnimation(modelAnimation: protocol.ModelAnimationSchema): DeserializedModelAnimation {
Expand All @@ -430,7 +466,13 @@ export default class Deserializer {
}

public static deserializeModelAnimations(modelAnimations: protocol.ModelAnimationSchema[]): DeserializedModelAnimations {
return modelAnimations.map((modelAnimation: protocol.ModelAnimationSchema) => this.deserializeModelAnimation(modelAnimation));
const deserializedModelAnimations = new Array<DeserializedModelAnimation>(modelAnimations.length);

for (let i = 0; i < modelAnimations.length; i++) {
deserializedModelAnimations[i] = this.deserializeModelAnimation(modelAnimations[i]);
}

return deserializedModelAnimations;
}

public static deserializeModelNodeOverride(modelNodeOverride: protocol.ModelNodeOverrideSchema): DeserializedModelNodeOverride {
Expand All @@ -450,7 +492,13 @@ export default class Deserializer {
}

public static deserializeModelNodeOverrides(modelNodeOverrides: protocol.ModelNodeOverrideSchema[]): DeserializedModelNodeOverrides {
return modelNodeOverrides.map((m: protocol.ModelNodeOverrideSchema) => this.deserializeModelNodeOverride(m));
const deserializedModelNodeOverrides = new Array<DeserializedModelNodeOverride>(modelNodeOverrides.length);

for (let i = 0; i < modelNodeOverrides.length; i++) {
deserializedModelNodeOverrides[i] = this.deserializeModelNodeOverride(modelNodeOverrides[i]);
}

return deserializedModelNodeOverrides;
}

public static deserializeOutlineOptions(outlineOptions: protocol.OutlineSchema): DeserializedOutlineOptions {
Expand Down Expand Up @@ -508,7 +556,13 @@ export default class Deserializer {
}

public static deserializeParticleEmitters(particleEmitters: protocol.ParticleEmittersSchema): DeserializedParticleEmitters {
return particleEmitters.map((p: protocol.ParticleEmitterSchema) => this.deserializeParticleEmitter(p));
const deserializedParticleEmitters = new Array<DeserializedParticleEmitter>(particleEmitters.length);

for (let i = 0; i < particleEmitters.length; i++) {
deserializedParticleEmitters[i] = this.deserializeParticleEmitter(particleEmitters[i]);
}

return deserializedParticleEmitters;
}

public static deserializePhysicsDebugRaycast(physicsDebugRaycast: protocol.PhysicsDebugRaycastSchema): DeserializedPhysicsDebugRaycast {
Expand All @@ -521,7 +575,13 @@ export default class Deserializer {
}

public static deserializePhysicsDebugRaycasts(physicsDebugRaycasts: protocol.PhysicsDebugRaycastsSchema): DeserializedPhysicsDebugRaycasts {
return physicsDebugRaycasts.map((r: protocol.PhysicsDebugRaycastSchema) => this.deserializePhysicsDebugRaycast(r));
const deserializedPhysicsDebugRaycasts = new Array<DeserializedPhysicsDebugRaycast>(physicsDebugRaycasts.length);

for (let i = 0; i < physicsDebugRaycasts.length; i++) {
deserializedPhysicsDebugRaycasts[i] = this.deserializePhysicsDebugRaycast(physicsDebugRaycasts[i]);
}

return deserializedPhysicsDebugRaycasts;
}

public static deserializePhysicsDebugRender(physicsDebugRender: protocol.PhysicsDebugRenderSchema): DeserializedPhysicsDebugRender {
Expand All @@ -541,7 +601,13 @@ export default class Deserializer {
}

public static deserializePlayers(players: protocol.PlayersSchema): DeserializedPlayers {
return players.map((p: protocol.PlayerSchema) => this.deserializePlayer(p));
const deserializedPlayers = new Array<DeserializedPlayer>(players.length);

for (let i = 0; i < players.length; i++) {
deserializedPlayers[i] = this.deserializePlayer(players[i]);
}

return deserializedPlayers;
}

public static deserializeSceneUI(sceneUI: protocol.SceneUISchema): DeserializedSceneUI {
Expand All @@ -558,7 +624,13 @@ export default class Deserializer {
}

public static deserializeSceneUIs(sceneUIs: protocol.SceneUIsSchema): DeserializedSceneUIs {
return sceneUIs.map((s: protocol.SceneUISchema) => this.deserializeSceneUI(s));
const deserializedSceneUIs = new Array<DeserializedSceneUI>(sceneUIs.length);

for (let i = 0; i < sceneUIs.length; i++) {
deserializedSceneUIs[i] = this.deserializeSceneUI(sceneUIs[i]);
}

return deserializedSceneUIs;
}

public static deserializeSyncResponse(syncResponse: protocol.SyncResponseSchema): DeserializedSyncResponse {
Expand Down Expand Up @@ -603,7 +675,13 @@ export default class Deserializer {
}

public static deserializeUIDatas(uiDatas: protocol.UIDatasSchema): DeserializedUIDatas {
return uiDatas.map((u: protocol.UIDataSchema) => this.deserializeUIData(u));
const deserializedUIDatas = new Array<DeserializedUIData>(uiDatas.length);

for (let i = 0; i < uiDatas.length; i++) {
deserializedUIDatas[i] = this.deserializeUIData(uiDatas[i]);
}

return deserializedUIDatas;
}

public static deserializeVector(vector: protocol.VectorSchema): THREE.Vector3Like {
Expand Down
Loading