Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Path: blob/master/lib/loader.js
Views: 788
const mc = require('minecraft-protocol')1const { EventEmitter } = require('events')2const pluginLoader = require('./plugin_loader')3const plugins = {4bed: require('./plugins/bed'),5title: require('./plugins/title'),6block_actions: require('./plugins/block_actions'),7blocks: require('./plugins/blocks'),8book: require('./plugins/book'),9boss_bar: require('./plugins/boss_bar'),10breath: require('./plugins/breath'),11chat: require('./plugins/chat'),12chest: require('./plugins/chest'),13command_block: require('./plugins/command_block'),14craft: require('./plugins/craft'),15creative: require('./plugins/creative'),16digging: require('./plugins/digging'),17enchantment_table: require('./plugins/enchantment_table'),18entities: require('./plugins/entities'),19experience: require('./plugins/experience'),20explosion: require('./plugins/explosion'),21fishing: require('./plugins/fishing'),22furnace: require('./plugins/furnace'),23game: require('./plugins/game'),24health: require('./plugins/health'),25inventory: require('./plugins/inventory'),26kick: require('./plugins/kick'),27physics: require('./plugins/physics'),28place_block: require('./plugins/place_block'),29rain: require('./plugins/rain'),30ray_trace: require('./plugins/ray_trace'),31resource_pack: require('./plugins/resource_pack'),32scoreboard: require('./plugins/scoreboard'),33team: require('./plugins/team'),34settings: require('./plugins/settings'),35simple_inventory: require('./plugins/simple_inventory'),36sound: require('./plugins/sound'),37spawn_point: require('./plugins/spawn_point'),38tablist: require('./plugins/tablist'),39time: require('./plugins/time'),40villager: require('./plugins/villager'),41anvil: require('./plugins/anvil'),42place_entity: require('./plugins/place_entity'),43generic_place: require('./plugins/generic_place'),44particle: require('./plugins/particle')45}4647const minecraftData = require('minecraft-data')48const { testedVersions, latestSupportedVersion, oldestSupportedVersion } = require('./version')4950module.exports = {51createBot,52Location: require('./location'),53Painting: require('./painting'),54ScoreBoard: require('./scoreboard'),55BossBar: require('./bossbar'),56Particle: require('./particle'),57latestSupportedVersion,58oldestSupportedVersion,59testedVersions,60supportFeature: (feature, version) => minecraftData(version).supportFeature(feature)61}6263function createBot (options = {}) {64options.username = options.username ?? 'Player'65options.version = options.version ?? false66options.plugins = options.plugins ?? {}67options.hideErrors = options.hideErrors ?? false68options.logErrors = options.logErrors ?? true69options.loadInternalPlugins = options.loadInternalPlugins ?? true70options.client = options.client ?? null71options.brand = options.brand ?? 'vanilla'72options.respawn = options.respawn ?? true73const bot = new EventEmitter()74bot._client = options.client75bot.end = (reason) => bot._client.end(reason)76if (options.logErrors) {77bot.on('error', err => {78if (!options.hideErrors) {79console.log(err)80}81})82}8384pluginLoader(bot, options)85const internalPlugins = Object.keys(plugins)86.filter(key => {87if (typeof options.plugins[key] === 'function') return false88if (options.plugins[key] === false) return false89return options.plugins[key] || options.loadInternalPlugins90}).map(key => plugins[key])91const externalPlugins = Object.keys(options.plugins)92.filter(key => {93return typeof options.plugins[key] === 'function'94}).map(key => options.plugins[key])95bot.loadPlugins([...internalPlugins, ...externalPlugins])9697options.validateChannelProtocol = false98bot._client = bot._client ?? mc.createClient(options)99bot._client.on('connect', () => {100bot.emit('connect')101})102bot._client.on('error', (err) => {103bot.emit('error', err)104})105bot._client.on('end', (reason) => {106bot.emit('end', reason)107})108if (!bot._client.wait_connect) next()109else bot._client.once('connect_allowed', next)110function next () {111const serverPingVersion = bot._client.version112bot.registry = require('prismarine-registry')(serverPingVersion)113if (!bot.registry?.version) throw new Error(`Server version '${serverPingVersion}' is not supported, no data for version`)114115const versionData = bot.registry.version116if (versionData['>'](latestSupportedVersion)) {117throw new Error(`Server version '${serverPingVersion}' is not supported. Latest supported version is '${latestSupportedVersion}'.`)118} else if (versionData['<'](oldestSupportedVersion)) {119throw new Error(`Server version '${serverPingVersion}' is not supported. Oldest supported version is '${oldestSupportedVersion}'.`)120}121122bot.protocolVersion = versionData.version123bot.majorVersion = versionData.majorVersion124bot.version = versionData.minecraftVersion125options.version = versionData.minecraftVersion126bot.supportFeature = bot.registry.supportFeature127setTimeout(() => bot.emit('inject_allowed'), 0)128}129return bot130}131132133