forked from PrismarineJS/mineflayer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
113 lines (106 loc) · 3.82 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
const mc = require('minecraft-protocol')
const EventEmitter = require('events').EventEmitter
const pluginLoader = require('./lib/plugin_loader')
const plugins = {
bed: require('./lib/plugins/bed'),
title: require('./lib/plugins/title'),
block_actions: require('./lib/plugins/block_actions'),
blocks: require('./lib/plugins/blocks'),
book: require('./lib/plugins/book'),
chat: require('./lib/plugins/chat'),
chest: require('./lib/plugins/chest'),
command_block: require('./lib/plugins/command_block'),
craft: require('./lib/plugins/craft'),
creative: require('./lib/plugins/creative'),
digging: require('./lib/plugins/digging'),
dispenser: require('./lib/plugins/dispenser'),
enchantment_table: require('./lib/plugins/enchantment_table'),
entities: require('./lib/plugins/entities'),
experience: require('./lib/plugins/experience'),
furnace: require('./lib/plugins/furnace'),
game: require('./lib/plugins/game'),
health: require('./lib/plugins/health'),
inventory: require('./lib/plugins/inventory'),
kick: require('./lib/plugins/kick'),
physics: require('./lib/plugins/physics'),
rain: require('./lib/plugins/rain'),
scoreboard: require('./lib/plugins/scoreboard'),
settings: require('./lib/plugins/settings'),
simple_inventory: require('./lib/plugins/simple_inventory'),
sound: require('./lib/plugins/sound'),
spawn_point: require('./lib/plugins/spawn_point'),
time: require('./lib/plugins/time'),
villager: require('./lib/plugins/villager')
}
const supportedVersions = require('./lib/version').supportedVersions
module.exports = {
createBot,
Location: require('./lib/location'),
Painting: require('./lib/painting'),
Chest: require('./lib/chest'),
Furnace: require('./lib/furnace'),
Dispenser: require('./lib/dispenser'),
EnchantmentTable: require('./lib/enchantment_table'),
ScoreBoard: require('./lib/scoreboard'),
supportedVersions
}
function createBot (options = {}) {
options.username = options.username || 'Player'
options.version = options.version || false
options.plugins = options.plugins || {}
options.loadInternalPlugins = options.loadInternalPlugins !== false
const bot = new Bot()
pluginLoader(bot, options)
const internalPlugins = Object.keys(plugins)
.filter(key => {
if (typeof options.plugins[key] === 'function') return
if (options.plugins[key] === false) return
return options.plugins[key] || options.loadInternalPlugins
}).map(key => plugins[key])
const externalPlugins = Object.keys(options.plugins)
.filter(key => {
return typeof options.plugins[key] === 'function'
}).map(key => options.plugins[key])
bot.loadPlugins([...internalPlugins, ...externalPlugins])
bot.connect(options)
return bot
}
class Bot extends EventEmitter {
constructor () {
super()
this._client = null
}
connect (options) {
const self = this
self._client = mc.createClient(options)
self.username = self._client.username
self._client.on('session', () => {
self.username = self._client.username
})
self._client.on('connect', () => {
self.emit('connect')
})
self._client.on('error', (err) => {
self.emit('error', err)
})
self._client.on('end', () => {
self.emit('end')
})
if (!self._client.wait_connect) next()
else self._client.once('connect_allowed', next)
function next () {
const version = require('minecraft-data')(self._client.version).version
if (supportedVersions.indexOf(version.majorVersion) === -1) {
throw new Error(`Version ${version.minecraftVersion} is not supported.`)
}
self.protocolVersion = version.version
self.majorVersion = version.majorVersion
self.version = version.minecraftVersion
options.version = version.minecraftVersion
self.emit('inject_allowed')
}
}
end () {
this._client.end()
}
}