classicborne
    Preparing search index...

    classicborne

    classicborne

    NPM version badge Open GitHub issues badge

    A general purpose* Minecraft Classic server with CPE support.

    import { BaseUniverse } from "classicborne/class/server/BaseUniverse.mjs"

    const myUniverse = new BaseUniverse({
    port: 25565,
    postToMainServer: true,
    })

    // flush changes on all levels every 60 seconds
    setInterval(() => {
    myUniverse.levels.forEach(async (level) => {
    level = await level
    if (level.changeRecord) level.changeRecord.flushChanges()
    })
    }, 60000)

    Extend it by subclassing base classes.

    import { BaseLevel } from "classicborne/class/level/BaseLevel.mjs"
    import { BasePlayer } from "classicborne/class/player/BasePlayer.mjs"
    import { BaseUniverse } from "classicborne/class/server/BaseUniverse.mjs"

    class MyLevel extends BaseLevel {
    /** */
    constructor(...args) {
    super(...args)
    this.positionEventListeners = new Map()
    this.on("playerRemoved", async (player) => {
    const positionEventListener = this.positionEventListeners.get(player)
    player.client.removeListener("position", positionEventListener)
    })
    this.on("playerAdded", async (player) => {
    const onPosition = (position) => {
    console.log(position)
    }
    player.client.on("position", onPosition)
    this.positionEventListeners.set(player, onPosition)
    })
    }

    static async teleportPlayer(player) {
    if (super.teleportPlayer(player) === false) return
    MyLevel.loadIntoUniverse(player.universe, "my-level").then(async (level) => {
    level.addPlayer(player, [60, 8, 4], [162, 254])
    })
    }
    }

    class MyPlayer extends BasePlayer {
    /** */
    async initialize(...args) {
    const authenticated = await super.initialize(...args)
    if (!authenticated) return
    this.universe.addPlayer(this)
    MyLevel.teleportPlayer(this)
    }
    }

    class MyUniverse extends BaseUniverse {
    static playerClass = MyPlayer
    }

    new MyUniverse({
    port: 25565,
    postToMainServer: false,
    })
    • Support for Classic Protocol Extension (CPE).
    • Multiple level management.
    • Per-client entity ID assignment.
    • Novel level data persistence.
      • It's just undoable history in a compact format.
      • Block changes and command issues are only recorded.
      • Optional caching of "keyframes" when restoring from changes alone takes long.
      • Each change can be undone.
    • Basic "Watchdog" client monitor.

    See the GitHub topic for more.