CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PrismarineJS

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.

GitHub Repository: PrismarineJS/mineflayer
Path: blob/master/lib/loader.js
Views: 788
1
const mc = require('minecraft-protocol')
2
const { EventEmitter } = require('events')
3
const pluginLoader = require('./plugin_loader')
4
const plugins = {
5
bed: require('./plugins/bed'),
6
title: require('./plugins/title'),
7
block_actions: require('./plugins/block_actions'),
8
blocks: require('./plugins/blocks'),
9
book: require('./plugins/book'),
10
boss_bar: require('./plugins/boss_bar'),
11
breath: require('./plugins/breath'),
12
chat: require('./plugins/chat'),
13
chest: require('./plugins/chest'),
14
command_block: require('./plugins/command_block'),
15
craft: require('./plugins/craft'),
16
creative: require('./plugins/creative'),
17
digging: require('./plugins/digging'),
18
enchantment_table: require('./plugins/enchantment_table'),
19
entities: require('./plugins/entities'),
20
experience: require('./plugins/experience'),
21
explosion: require('./plugins/explosion'),
22
fishing: require('./plugins/fishing'),
23
furnace: require('./plugins/furnace'),
24
game: require('./plugins/game'),
25
health: require('./plugins/health'),
26
inventory: require('./plugins/inventory'),
27
kick: require('./plugins/kick'),
28
physics: require('./plugins/physics'),
29
place_block: require('./plugins/place_block'),
30
rain: require('./plugins/rain'),
31
ray_trace: require('./plugins/ray_trace'),
32
resource_pack: require('./plugins/resource_pack'),
33
scoreboard: require('./plugins/scoreboard'),
34
team: require('./plugins/team'),
35
settings: require('./plugins/settings'),
36
simple_inventory: require('./plugins/simple_inventory'),
37
sound: require('./plugins/sound'),
38
spawn_point: require('./plugins/spawn_point'),
39
tablist: require('./plugins/tablist'),
40
time: require('./plugins/time'),
41
villager: require('./plugins/villager'),
42
anvil: require('./plugins/anvil'),
43
place_entity: require('./plugins/place_entity'),
44
generic_place: require('./plugins/generic_place'),
45
particle: require('./plugins/particle')
46
}
47
48
const minecraftData = require('minecraft-data')
49
const { testedVersions, latestSupportedVersion, oldestSupportedVersion } = require('./version')
50
51
module.exports = {
52
createBot,
53
Location: require('./location'),
54
Painting: require('./painting'),
55
ScoreBoard: require('./scoreboard'),
56
BossBar: require('./bossbar'),
57
Particle: require('./particle'),
58
latestSupportedVersion,
59
oldestSupportedVersion,
60
testedVersions,
61
supportFeature: (feature, version) => minecraftData(version).supportFeature(feature)
62
}
63
64
function createBot (options = {}) {
65
options.username = options.username ?? 'Player'
66
options.version = options.version ?? false
67
options.plugins = options.plugins ?? {}
68
options.hideErrors = options.hideErrors ?? false
69
options.logErrors = options.logErrors ?? true
70
options.loadInternalPlugins = options.loadInternalPlugins ?? true
71
options.client = options.client ?? null
72
options.brand = options.brand ?? 'vanilla'
73
options.respawn = options.respawn ?? true
74
const bot = new EventEmitter()
75
bot._client = options.client
76
bot.end = (reason) => bot._client.end(reason)
77
if (options.logErrors) {
78
bot.on('error', err => {
79
if (!options.hideErrors) {
80
console.log(err)
81
}
82
})
83
}
84
85
pluginLoader(bot, options)
86
const internalPlugins = Object.keys(plugins)
87
.filter(key => {
88
if (typeof options.plugins[key] === 'function') return false
89
if (options.plugins[key] === false) return false
90
return options.plugins[key] || options.loadInternalPlugins
91
}).map(key => plugins[key])
92
const externalPlugins = Object.keys(options.plugins)
93
.filter(key => {
94
return typeof options.plugins[key] === 'function'
95
}).map(key => options.plugins[key])
96
bot.loadPlugins([...internalPlugins, ...externalPlugins])
97
98
options.validateChannelProtocol = false
99
bot._client = bot._client ?? mc.createClient(options)
100
bot._client.on('connect', () => {
101
bot.emit('connect')
102
})
103
bot._client.on('error', (err) => {
104
bot.emit('error', err)
105
})
106
bot._client.on('end', (reason) => {
107
bot.emit('end', reason)
108
})
109
if (!bot._client.wait_connect) next()
110
else bot._client.once('connect_allowed', next)
111
function next () {
112
const serverPingVersion = bot._client.version
113
bot.registry = require('prismarine-registry')(serverPingVersion)
114
if (!bot.registry?.version) throw new Error(`Server version '${serverPingVersion}' is not supported, no data for version`)
115
116
const versionData = bot.registry.version
117
if (versionData['>'](latestSupportedVersion)) {
118
throw new Error(`Server version '${serverPingVersion}' is not supported. Latest supported version is '${latestSupportedVersion}'.`)
119
} else if (versionData['<'](oldestSupportedVersion)) {
120
throw new Error(`Server version '${serverPingVersion}' is not supported. Oldest supported version is '${oldestSupportedVersion}'.`)
121
}
122
123
bot.protocolVersion = versionData.version
124
bot.majorVersion = versionData.majorVersion
125
bot.version = versionData.minecraftVersion
126
options.version = versionData.minecraftVersion
127
bot.supportFeature = bot.registry.supportFeature
128
setTimeout(() => bot.emit('inject_allowed'), 0)
129
}
130
return bot
131
}
132
133