prismarine-world
Version:
The core implementation of the world for prismarine
216 lines (151 loc) • 6.42 kB
TypeScript
import type { EventEmitter } from "events";
import type { Vec3 } from "vec3";
import type { Block } from "prismarine-block";
import loaderOfChunk from "prismarine-chunk";
import type { RaycastBlock } from "./iterators";
export type Chunk = InstanceType<ReturnType<typeof loaderOfChunk>>;
export type ChunkGenerator = (chunkX: number, chunkZ: number) => Chunk;
export type ChunkCoordinates = { chunkX: number, chunkZ: number };
export type ChunkCoordsAndColumn = { chunkX: number, chunkZ: number, column: Chunk };
export interface StorageProvider {
load(chunkX: number, chunkZ: number): Promise<Chunk>;
save(chunkX: number, chunkZ: number, chunk: Chunk): Promise<void>;
}
export declare class World extends EventEmitter {
private readonly savingQueue: Map<String, ChunkCoordinates>;
private finishedSaving: Promise<unknown>;
private readonly columns: { [key: string]: Chunk };
public readonly chunkGenerator: ChunkGenerator | null | undefined;
public readonly storageProvider: StorageProvider | null | undefined;
public readonly savingInterval: number;
public readonly sync: WorldSync;
/**
* @param {ChunkGenerator} chunkGenerator A generator that requires X and Z coordinates of lower left of chunk. Returns a {Chunk} chunk object.
* @param {StorageProvider} storageProvider The provider the world uses to save chunks. See "prismarine-provider-anvil" or "prismarine-provider-raw".
* @param {number} savingInterval The duration in milliseconds between saves.
*/
constructor(
chunkGenerator?: ChunkGenerator | null | undefined,
storageProvider?: StorageProvider | null | undefined,
savingInterval?: number,
);
public initialize(
iniFunc: (x: number, y: number, z: number) => Block,
length: number,
width: number,
height?: number,
iniPos?: Vec3,
): Promise<ChunkCoordinates[]>;
/**
*
* @param {Vec3} from Position to start raycasting from.
* @param {Vec3} direction Normalized vector, direction of raycast.
* @param {number} range Maximum range to raycast.
* @param {(block: Block) => boolean} matcher Optional function with a block parameter, return true if the raycast should stop at this block, false otherwise.
*/
public raycast(
from: Vec3,
direction: Vec3,
range: number,
matcher?: (block: Block) => boolean,
): Promise<RaycastBlock | null>;
public getLoadedColumn(chunkX: number, chunkZ: number): Chunk;
public getColumn(chunkX: number, chunkZ: number): Promise<Chunk>;
private _emitBlockUpdate(
oldBlock: Block,
newBlock: Block,
position: Vec3,
): void;
public setLoadedColumn(
chunkX: number,
chunkZ: number,
chunk: Chunk,
save?: boolean,
): void;
public setColumn(
chunkX: number,
chunkZ: number,
chunk: Chunk,
save?: boolean,
): Promise<void>;
public unloadColumn(chunkX: number, chunkZ: number): void;
public saveNow(): Promise<void>;
public startSaving(): void;
public waitSaving(): Promise<void>;
public stopSaving(): void;
public queueSaving(chunkX: number, chunkZ: number): void;
public saveAt(pos: Vec3): void;
public getColumns(): ChunkCoordsAndColumn[];
public getLoadedColumnAt(pos: Vec3): Chunk;
public getColumnAt(pos: Vec3): Promise<Chunk>;
public setBlock(pos: Vec3, block: Block): Promise<void>;
public getBlock(pos: Vec3): Promise<Block>;
public getBlockStateId(pos: Vec3): Promise<number>;
public getBlockType(pos: Vec3): Promise<number>;
public getBlockData(pos: Vec3): Promise<number>;
public getBlockLight(pos: Vec3): Promise<number>;
public getSkyLight(pos: Vec3): Promise<number>;
public getBiome(pos: Vec3): Promise<number>;
public setBlockStateId(pos: Vec3, stateId: number): Promise<void>;
public setBlockType(pos: Vec3, blockType: number): Promise<void>;
public setBlockData(pos: Vec3, data: number): Promise<void>;
public setBlockLight(pos: Vec3, light: number): Promise<void>;
public setSkyLight(pos: Vec3, light: number): Promise<void>;
public setBiome(pos: Vec3, biome: number): Promise<void>;
}
export declare class WorldSync extends EventEmitter {
public readonly async: World;
/**
* @param {World} world Async representation of the World object.
*/
constructor(world: World);
public initialize(
iniFunc: (x: number, y: number, z: number) => Block,
length: number,
width: number,
height?: number,
iniPos?: Vec3,
): void;
/**
*
* @param {Vec3} from Position to start raycasting from.
* @param {Vec3} direction Normalized vector, direction of raycast.
* @param {number} range Maximum range to raycast.
* @param {(block: Block) => boolean} matcher Optional function with a block parameter, return true if the raycast should stop at this block, false otherwise.
*/
public raycast(
from: Vec3,
direction: Vec3,
range: number,
matcher?: (block: Block) => boolean,
): RaycastResult | null;
private _emitBlockUpdate(
oldBlock: Block,
newBlock: Block,
position: Vec3
): void;
public getColumns(): ChunkCoordsAndColumn[];
public getColumn(chunkX: number, chunkZ: number): Chunk;
public getColumnAt(pos: Vec3): Chunk;
public setColumn(
chunkX: number,
chunkZ: number,
chunk: Chunk,
save?: boolean,
): void;
public unloadColumn(chunkX: number, chunkZ: number): void;
public getBlock(pos: Vec3): Block;
public getBlockStateId(pos: Vec3): number;
public getBlockType(pos: Vec3): number;
public getBlockData(pos: Vec3): number;
public getBlockLight(pos: Vec3): number;
public getSkyLight(pos: Vec3): number;
public getBiome(pos: Vec3): number;
public setBlock(pos: Vec3, block: Block): void;
public setBlockStateId(pos: Vec3, stateId: number): void;
public setBlockType(pos: Vec3, blockType: number): void;
public setBlockData(pos: Vec3, data: number): void;
public setBlockLight(pos: Vec3, light: number): void;
public setSkyLight(pos: Vec3, light: number): void;
public setBiome(pos: Vec3, biome: number): void;
}