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 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 mores in the [examples](https://github.com/PrismarineJS/mineflayer/tree/master/examples) folder
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 mores in the [examples](https://github.com/PrismarineJS/mineflayer/tree/master/examples) folder
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
@@ -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
- for (let i = 0; i < count; i++) {
17
- await craftOnce(recipe, craftingTable)
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
- bot.activateBlock(craftingTable)
24
- const [window] = await once(bot, 'windowOpen')
25
- if (!window.type.startsWith('minecraft:crafting')) {
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(window, 3, 3)
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
- window.selectedItem.metadata !== ingredient.metadata)) {
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
- window.selectedItem.metadata !== ingredient.metadata)) {
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) {
@@ -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 === obj.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]
@@ -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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mineflayer",
3
- "version": "4.8.0",
3
+ "version": "4.8.1",
4
4
  "description": "create minecraft bots with a stable, high level API",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",