Skip to content

Minecraft bedrock level provider for disk and network with caching support

Notifications You must be signed in to change notification settings

PrismarineJS/bedrock-provider

Repository files navigation

bedrock-provider

NPM version Build Status Discord Gitter Irc Try it on gitpod

Minecraft Bedrock level provider for loading and storing worlds on disk. Supports Minecraft Bedrock Editions 1.16, 1.17, 1.18.0, 1.18.10, 1.18.30 and 1.19.1.

Install

npm i bedrock-provider

Usage

Writing example:

const fs = require('fs')
const { LevelDB } = require('leveldb-zlib')
const { WorldProvider } = require('bedrock-provider')
const registry = require('prismarine-registry')('bedrock_1.17.10')
const Block = require('prismarine-block')(registry)
const ChunkColumn = require('prismarine-chunk')(registry)

async function main() {
  const x = 0, z = 0
  const cc = new ChunkColumn({ x, z })
  cc.setBlock({ x: 0, y: 1, z: 0 }, Block.fromStateId(registry.blocksByName.dirt.defaultState))

  // Create a new database and store this chunk in there
  const db = new LevelDB('./sample', { createIfMissing: true })
  await db.open() // Open the database
  // Create a WorldProvider instance from the DB with a prismarine-registry
  const world = new WorldProvider(db, { dimension: 0, registry })
  // Store this chunk in world
  world.save(x, z, cc)
  // Close it
  await db.close() 
  // Done! 😃
}

See tests/ for more usage examples.

API

WorldProvider

constructor(db: LevelDB, options: { dimension?: number; registry });

The exported WorldProvider class allows you to load a save file from a LevelDB database. The first parameter is the db (leveldb-zlib instance), and the second is an options object. The options argument takes a dimension ID (overworld or nether or end are 1, 2 and 3).

The options argument also takes an instance of prismarine-registry, which will be used when doing block related calls.

load(x: number, z: number, full: boolean): Promise

This returns a ChunkColumn at the specified x and z coordinates. full if we should load biomes, entities, tiles, and other related data ontop of chunks.

save(x: number, z: number, column: ChunkColumn): Promise

Saves a ChunkColumn into the database.