mineflayer 4.8.0 → 4.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/docs/README.md +1 -1
- package/docs/history.md +9 -0
- package/examples/cli/readline.js +50 -0
- package/index.d.ts +1 -1
- package/lib/plugins/craft.js +26 -14
- package/lib/plugins/entities.js +2 -2
- package/lib/plugins/physics.js +4 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -123,7 +123,7 @@ And you'll get a *live* view looking like this:
|
|
|
123
123
|
|[guard](https://github.com/PrismarineJS/mineflayer/blob/master/examples/guard.js) | Make a bot guard a defined area from nearby mobs |
|
|
124
124
|
|[multiple-from-file](https://github.com/PrismarineJS/mineflayer/blob/master/examples/multiple_from_file.js) | Add a text file with accounts and have them all login |
|
|
125
125
|
|
|
126
|
-
And many
|
|
126
|
+
And many more in the [examples](https://github.com/PrismarineJS/mineflayer/tree/master/examples) folder.
|
|
127
127
|
|
|
128
128
|
### Modules
|
|
129
129
|
|
package/docs/README.md
CHANGED
|
@@ -123,7 +123,7 @@ And you'll get a *live* view looking like this:
|
|
|
123
123
|
|[guard](https://github.com/PrismarineJS/mineflayer/blob/master/examples/guard.js) | Make a bot guard a defined area from nearby mobs |
|
|
124
124
|
|[multiple-from-file](https://github.com/PrismarineJS/mineflayer/blob/master/examples/multiple_from_file.js) | Add a text file with accounts and have them all login |
|
|
125
125
|
|
|
126
|
-
And many
|
|
126
|
+
And many more in the [examples](https://github.com/PrismarineJS/mineflayer/tree/master/examples) folder.
|
|
127
127
|
|
|
128
128
|
### Modules
|
|
129
129
|
|
package/docs/history.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
## 4.8.1
|
|
2
|
+
|
|
3
|
+
* Fix client crashing when player_remove contains unknown player (@frej4189)
|
|
4
|
+
* Improve look and fix bug slow craft (@sefirosweb)
|
|
5
|
+
* Fix player entity being unset when player is updated (@frej4189)
|
|
6
|
+
* Fix type (@sefirosweb)
|
|
7
|
+
* Improve crafting stacks (@sefirosweb)
|
|
8
|
+
* add example for using the node:readline module (@Jovan-04)
|
|
9
|
+
|
|
1
10
|
## 4.8.0
|
|
2
11
|
|
|
3
12
|
* Update chat parsing (@frej4189)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This example is an easy way to connect mineflayer to the node:readline module
|
|
3
|
+
* See: https://nodejs.org/api/readline.html
|
|
4
|
+
* Using this, we can make a simple terminal-to-ingame-chat interface
|
|
5
|
+
*
|
|
6
|
+
* Made by Jovan04 01/24/2023
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
if (process.argv.length < 4 || process.argv.length > 6) {
|
|
10
|
+
console.log('Usage : node readline.js <host> <port> [<name>] [<auth>]')
|
|
11
|
+
process.exit(1)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const mineflayer = require('mineflayer') // load mineflayer library
|
|
15
|
+
const readline = require('node:readline') // load the node.js readline module
|
|
16
|
+
|
|
17
|
+
// bot options
|
|
18
|
+
const options = {
|
|
19
|
+
host: process.argv[2],
|
|
20
|
+
port: parseInt(process.argv[3]),
|
|
21
|
+
username: process.argv[4] || 'readline',
|
|
22
|
+
auth: process.argv[5] || 'offline'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const bot = mineflayer.createBot(options) // join the minecraft server
|
|
26
|
+
|
|
27
|
+
const rl = readline.createInterface({ // creates our readline interface with our console as input and output
|
|
28
|
+
input: process.stdin,
|
|
29
|
+
output: process.stdout
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
bot.once('spawn', () => {
|
|
33
|
+
console.log(`Bot joined the game with username ${bot.username}.`)
|
|
34
|
+
rl.setPrompt('> '); rl.prompt() // gives us a little arrow at the bottom for the input line
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
bot.on('message', (message) => {
|
|
38
|
+
readline.moveCursor(process.stdout, -2, 0) // we move the cursor to the left two places because our cursor is already two positions in (because of the input arrow)
|
|
39
|
+
console.log(message.toAnsi()) // convert our message to ansi to preserve chat formatting
|
|
40
|
+
rl.prompt() // regenerate our little arrow on the input line
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
rl.on('line', (line) => {
|
|
44
|
+
readline.moveCursor(process.stdout, 0, -1) // move cursor up one line
|
|
45
|
+
readline.clearScreenDown(process.stdout) // clear all the lines below the cursor (i.e. the last line we entered)
|
|
46
|
+
bot.chat(line.toString()) // sends the line we entered to ingame chat
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
bot.on('kicked', console.log)
|
|
50
|
+
bot.on('error', console.log)
|
package/index.d.ts
CHANGED
|
@@ -122,7 +122,7 @@ interface BotEvents {
|
|
|
122
122
|
) => Promise<void> | void
|
|
123
123
|
noteHeard: (block: Block, instrument: Instrument, pitch: number) => Promise<void> | void
|
|
124
124
|
pistonMove: (block: Block, isPulling: number, direction: number) => Promise<void> | void
|
|
125
|
-
chestLidMove: (block: Block, isOpen: number) => Promise<void> | void
|
|
125
|
+
chestLidMove: (block: Block, isOpen: number, block2: Block | null) => Promise<void> | void
|
|
126
126
|
blockBreakProgressObserved: (block: Block, destroyStage: number) => Promise<void> | void
|
|
127
127
|
blockBreakProgressEnd: (block: Block) => Promise<void> | void
|
|
128
128
|
diggingCompleted: (block: Block) => Promise<void> | void
|
package/lib/plugins/craft.js
CHANGED
|
@@ -6,6 +6,7 @@ module.exports = inject
|
|
|
6
6
|
function inject (bot) {
|
|
7
7
|
const Item = require('prismarine-item')(bot.registry)
|
|
8
8
|
const Recipe = require('prismarine-recipe')(bot.registry).Recipe
|
|
9
|
+
let windowCraftingTable
|
|
9
10
|
|
|
10
11
|
async function craft (recipe, count, craftingTable) {
|
|
11
12
|
assert.ok(recipe)
|
|
@@ -13,19 +14,36 @@ function inject (bot) {
|
|
|
13
14
|
if (recipe.requiresTable && !craftingTable) {
|
|
14
15
|
throw new Error('recipe requires craftingTable')
|
|
15
16
|
}
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
for (let i = 0; i < count; i++) {
|
|
20
|
+
await craftOnce(recipe, craftingTable)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (windowCraftingTable) {
|
|
24
|
+
bot.closeWindow(windowCraftingTable)
|
|
25
|
+
windowCraftingTable = undefined
|
|
26
|
+
}
|
|
27
|
+
} catch (err) {
|
|
28
|
+
if (windowCraftingTable) {
|
|
29
|
+
bot.closeWindow(windowCraftingTable)
|
|
30
|
+
windowCraftingTable = undefined
|
|
31
|
+
}
|
|
32
|
+
throw new Error(err)
|
|
18
33
|
}
|
|
19
34
|
}
|
|
20
35
|
|
|
21
36
|
async function craftOnce (recipe, craftingTable) {
|
|
22
37
|
if (craftingTable) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
38
|
+
if (!windowCraftingTable) {
|
|
39
|
+
bot.activateBlock(craftingTable)
|
|
40
|
+
const [window] = await once(bot, 'windowOpen')
|
|
41
|
+
windowCraftingTable = window
|
|
42
|
+
}
|
|
43
|
+
if (!windowCraftingTable.type.startsWith('minecraft:crafting')) {
|
|
26
44
|
throw new Error('crafting: non craftingTable used as craftingTable')
|
|
27
45
|
}
|
|
28
|
-
await startClicking(
|
|
46
|
+
await startClicking(windowCraftingTable, 3, 3)
|
|
29
47
|
} else {
|
|
30
48
|
await startClicking(bot.inventory, 2, 2)
|
|
31
49
|
}
|
|
@@ -73,7 +91,7 @@ function inject (bot) {
|
|
|
73
91
|
if (ingredient.id === -1) return nextShapeClick()
|
|
74
92
|
if (!window.selectedItem || window.selectedItem.type !== ingredient.id ||
|
|
75
93
|
(ingredient.metadata != null &&
|
|
76
|
-
|
|
94
|
+
window.selectedItem.metadata !== ingredient.metadata)) {
|
|
77
95
|
// we are not holding the item we need. click it.
|
|
78
96
|
const sourceItem = window.findInventoryItem(ingredient.id, ingredient.metadata)
|
|
79
97
|
if (!sourceItem) throw new Error('missing ingredient')
|
|
@@ -89,7 +107,7 @@ function inject (bot) {
|
|
|
89
107
|
const destSlot = extraSlots.pop()
|
|
90
108
|
if (!window.selectedItem || window.selectedItem.type !== ingredient.id ||
|
|
91
109
|
(ingredient.metadata != null &&
|
|
92
|
-
|
|
110
|
+
window.selectedItem.metadata !== ingredient.metadata)) {
|
|
93
111
|
// we are not holding the item we need. click it.
|
|
94
112
|
const sourceItem = window.findInventoryItem(ingredient.id, ingredient.metadata)
|
|
95
113
|
if (!sourceItem) throw new Error('missing ingredient')
|
|
@@ -126,7 +144,6 @@ function inject (bot) {
|
|
|
126
144
|
for (let i = 1; i <= w * h; i++) {
|
|
127
145
|
window.updateSlot(i, null)
|
|
128
146
|
}
|
|
129
|
-
closeTheWindow()
|
|
130
147
|
return
|
|
131
148
|
}
|
|
132
149
|
const slotsToClick = []
|
|
@@ -145,11 +162,6 @@ function inject (bot) {
|
|
|
145
162
|
for (const _slot of slotsToClick) {
|
|
146
163
|
await bot.putAway(_slot)
|
|
147
164
|
}
|
|
148
|
-
closeTheWindow()
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function closeTheWindow () {
|
|
152
|
-
bot.closeWindow(window)
|
|
153
165
|
}
|
|
154
166
|
|
|
155
167
|
function slot (x, y) {
|
package/lib/plugins/entities.js
CHANGED
|
@@ -484,7 +484,7 @@ function inject (bot) {
|
|
|
484
484
|
Object.assign(player, obj)
|
|
485
485
|
}
|
|
486
486
|
|
|
487
|
-
const playerEntity = Object.values(bot.entities).find(e => e.type === 'player' && e.username ===
|
|
487
|
+
const playerEntity = Object.values(bot.entities).find(e => e.type === 'player' && e.username === player.username)
|
|
488
488
|
player.entity = playerEntity
|
|
489
489
|
|
|
490
490
|
if (playerEntity === bot.entity) {
|
|
@@ -579,7 +579,7 @@ function inject (bot) {
|
|
|
579
579
|
for (const uuid of packet.players) {
|
|
580
580
|
const player = bot.uuidToUsername[uuid] ? bot.players[bot.uuidToUsername[uuid]] : null
|
|
581
581
|
|
|
582
|
-
if (player.entity === bot.entity) continue
|
|
582
|
+
if (!player || player.entity === bot.entity) continue
|
|
583
583
|
|
|
584
584
|
player.entity = null
|
|
585
585
|
delete bot.players[player.username]
|
package/lib/plugins/physics.js
CHANGED
|
@@ -235,6 +235,10 @@ function inject (bot, { physicsEnabled }) {
|
|
|
235
235
|
const yawChange = Math.round((yaw - bot.entity.yaw) / sensitivity) * sensitivity
|
|
236
236
|
const pitchChange = Math.round((pitch - bot.entity.pitch) / sensitivity) * sensitivity
|
|
237
237
|
|
|
238
|
+
if (yawChange === 0 && pitchChange === 0) {
|
|
239
|
+
return
|
|
240
|
+
}
|
|
241
|
+
|
|
238
242
|
bot.entity.yaw += yawChange
|
|
239
243
|
bot.entity.pitch += pitchChange
|
|
240
244
|
|