mineflayer 4.7.0 → 4.8.0

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.
@@ -33,6 +33,8 @@ jobs:
33
33
  mcVersion: '1.19'
34
34
  - javaVersion: 17
35
35
  mcVersion: '1.19.2'
36
+ - javaVersion: 17
37
+ mcVersion: '1.19.3'
36
38
  fail-fast: false
37
39
 
38
40
  steps:
package/docs/history.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 4.8.0
2
+
3
+ * Update chat parsing (@frej4189)
4
+ * Fix message event not including chat position (@frej4189)
5
+ * 1.19.3 (@frej4189)
6
+
1
7
  ## 4.7.0
2
8
 
3
9
  * 1.19.2 support (@frej4189)
@@ -12,9 +12,9 @@
12
12
  | <sub>EN</sub> [English](../README.md) | <sub>RU</sub> [русский](../ru/README_RU.md) | <sub>ES</sub> [Español](../es/README_ES.md) | <sub>FR</sub> [Français](../fr/README_FR.md) | <sub>TR</sub> [Türkçe](../tr/README_TR.md) | <sub>ZH</sub> [中文](../zh/README_ZH_CN.md) |
13
13
  |-------------------------|----------------------------|----------------------------|----------------------------|----------------------------|----------------------------|
14
14
 
15
- Создавайте ботов Minecraft с помощью мощного, стабильного и высокоуровневого JavaScript [API](api.md).
15
+ Создавайте ботов Minecraft с помощью мощного, стабильного и высокоуровневого JavaScript [API](api.md), также можете использовать Python
16
16
 
17
- Первый раз используете Node.js? Начните с [этого](tutorial.md).
17
+ Первый раз используете Node.js? Начните с [этого](tutorial.md). Любите гонять змею? Зацените [Python примеры](https://github.com/PrismarineJS/mineflayer/tree/master/examples/python) и попробуйте колабнуться в [Mineflayer Google коллабе](https://colab.research.google.com/github/PrismarineJS/mineflayer/blob/master/docs/mineflayer.ipynb).
18
18
 
19
19
  ## Возможности
20
20
 
package/index.d.ts CHANGED
@@ -567,6 +567,7 @@ export interface TransferOptions {
567
567
  window: Window
568
568
  itemType: number
569
569
  metadata: number | null
570
+ count?: number,
570
571
  sourceStart: number
571
572
  sourceEnd: number
572
573
  destStart: number
@@ -113,30 +113,18 @@ function inject (bot, options) {
113
113
  const verified = data.verified
114
114
  let msg
115
115
  if (bot.supportFeature('clientsideChatFormatting')) {
116
- let sender
117
-
118
- try {
119
- sender = JSON.parse(data.senderName)
120
- } catch {
121
- sender = {
122
- insertion: data.senderName,
123
- clickEvent: { action: 'suggest_command', value: `/tell ${data.senderName} ` },
124
- hoverEvent: { action: 'show_entity', contents: { id: bot.findPlayer(data.senderName).id, name: data.senderName } },
125
- text: data.senderName
126
- }
127
- }
128
-
129
116
  const parameters = {
130
- sender,
117
+ sender: data.senderName ? JSON.parse(data.senderName) : undefined,
118
+ target: data.targetName ? JSON.parse(data.targetName) : undefined,
131
119
  content: message ? JSON.parse(message) : { text: data.plainMessage }
132
120
  }
133
121
  msg = ChatMessage.fromNetwork(data.type, parameters)
134
122
 
135
123
  if (data.unsignedContent) {
136
- msg.unsigned = ChatMessage.fromNetwork(data.type, { sender, content: JSON.parse(data.unsignedContent) })
124
+ msg.unsigned = ChatMessage.fromNetwork(data.type, { sender: parameters.sender, target: parameters.target, content: JSON.parse(data.unsignedContent) })
137
125
  }
138
126
  } else {
139
- msg = ChatMessage.fromNotch(data.formattedMessage)
127
+ msg = ChatMessage.fromNotch(message)
140
128
  }
141
129
  bot.emit('message', msg, 'chat', data.sender, verified)
142
130
  bot.emit('messagestr', msg.toString(), 'chat', msg, data.sender, verified)
@@ -148,9 +136,9 @@ function inject (bot, options) {
148
136
  1: 'system',
149
137
  2: 'game_info'
150
138
  }
151
- bot.emit('message', msg, chatPositions[data.positionid], null)
152
- bot.emit('messagestr', msg.toString(), chatPositions[data.positionid], msg, null)
153
- if (data.positionid === 2) bot.emit('actionBar', msg, null)
139
+ bot.emit('message', msg, chatPositions[data.positionId], null)
140
+ bot.emit('messagestr', msg.toString(), chatPositions[data.positionId], msg, null)
141
+ if (data.positionId === 2) bot.emit('actionBar', msg, null)
154
142
  })
155
143
 
156
144
  function chatWithHeader (header, message) {
@@ -170,6 +158,8 @@ function inject (bot, options) {
170
158
  salt: 0n,
171
159
  argumentSignatures: [],
172
160
  signedPreview: false,
161
+ messageCount: 0,
162
+ acknowledged: Buffer.alloc(3),
173
163
  // 1.19.2 Chat Command packet also includes an array of last seen messages
174
164
  previousMessages: []
175
165
  })
@@ -361,13 +361,14 @@ function inject (bot) {
361
361
  entity.metadata = metadata
362
362
  bot.emit('entityUpdate', entity)
363
363
 
364
- const typeSlot = bot.supportFeature('itemsAreAlsoBlocks') ? 5 : 6
364
+ const typeSlot = (bot.supportFeature('itemsAreAlsoBlocks') ? 5 : 6) + (bot.supportFeature('entityMetadataHasLong') ? 1 : 0)
365
365
  const slot = packet.metadata.find(e => e.type === typeSlot)
366
366
  if (entity.name && (entity.name.toLowerCase() === 'item' || entity.name === 'item_stack') && slot) {
367
367
  bot.emit('itemDrop', entity)
368
368
  }
369
369
 
370
- const pose = packet.metadata.find(e => e.type === 18)
370
+ const typePose = bot.supportFeature('entityMetadataHasLong') ? 19 : 18
371
+ const pose = packet.metadata.find(e => e.type === typePose)
371
372
  if (pose && pose.value === 2) {
372
373
  bot.emit('entitySleep', entity)
373
374
  }
@@ -444,81 +445,149 @@ function inject (bot) {
444
445
 
445
446
  bot._client.on('player_info', (packet) => {
446
447
  // player list item(s)
447
- for (const item of packet.data) {
448
- let player = bot.uuidToUsername[item.UUID] ? bot.players[bot.uuidToUsername[item.UUID]] : null
449
- if (packet.action === 0) {
448
+
449
+ if (bot.supportFeature('playerInfoActionIsBitfield')) {
450
+ for (const item of packet.data) {
451
+ let player = bot.uuidToUsername[item.uuid] ? bot.players[bot.uuidToUsername[item.uuid]] : null
450
452
  let newPlayer = false
451
453
 
452
- // New Player
453
- if (!player) {
454
- player = bot.players[item.name] = {
455
- username: item.name,
456
- ping: item.ping,
457
- uuid: item.UUID,
458
- displayName: new ChatMessage({ text: '', extra: [{ text: item.name }] }),
459
- profileKeys: item.crypto
460
- ? {
461
- publicKey: item.crypto.publicKey, // DER-encoded public key
462
- signature: item.crypto.signature // Signature
463
- }
464
- : null
465
- }
454
+ const obj = {
455
+ uuid: item.uuid
456
+ }
466
457
 
467
- bot.uuidToUsername[item.UUID] = item.name
468
- bot.emit('playerJoined', player)
469
- newPlayer = true
470
- } else {
471
- // Just an Update
472
- player.gamemode = item.gamemode
473
- player.ping = item.ping
474
- if (item.crypto) {
475
- player.profileKeys = {
476
- publicKey: item.crypto.publicKey,
477
- signature: item.crypto.signature
478
- }
479
- }
458
+ if (!player) newPlayer = true
459
+
460
+ player = player || obj
461
+
462
+ if (packet.action & 1) {
463
+ obj.username = item.player.name
464
+ obj.displayName = player.displayName || new ChatMessage({ text: '', extra: [{ text: item.player.name }] })
465
+ }
466
+
467
+ if (packet.action & 4) {
468
+ obj.gamemode = item.gamemode
469
+ }
470
+
471
+ if (packet.action & 16) {
472
+ obj.ping = item.latency
480
473
  }
481
474
 
482
475
  if (item.displayName) {
483
- player.displayName = new ChatMessage(JSON.parse(item.displayName))
476
+ obj.displayName = new ChatMessage(JSON.parse(item.displayName))
477
+ } else if (packet.action & 32) obj.displayName = new ChatMessage({ text: '', extra: [{ text: player.username || obj.username }] })
478
+
479
+ if (newPlayer) {
480
+ if (!obj.username) continue // Should be unreachable
481
+ player = bot.players[obj.username] = obj
482
+ bot.uuidToUsername[obj.uuid] = obj.username
483
+ } else {
484
+ Object.assign(player, obj)
484
485
  }
485
486
 
486
- const playerEntity = Object.values(bot.entities).find(e => e.type === 'player' && e.username === item.name)
487
+ const playerEntity = Object.values(bot.entities).find(e => e.type === 'player' && e.username === obj.username)
487
488
  player.entity = playerEntity
488
489
 
489
490
  if (playerEntity === bot.entity) {
490
491
  bot.player = player
491
492
  }
492
493
 
493
- if (!newPlayer) {
494
- bot.emit('playerUpdated', player)
495
- }
496
- } else if (player) {
497
- if (packet.action === 1) {
498
- player.gamemode = item.gamemode
499
- } else if (packet.action === 2) {
500
- player.ping = item.ping
501
- } else if (packet.action === 3 && !item.displayName) {
502
- player.displayName = new ChatMessage({ text: '', extra: [{ text: player.username }] })
503
- } else if (packet.action === 3 && item.displayName) {
504
- player.displayName = new ChatMessage(JSON.parse(item.displayName))
505
- } else if (packet.action === 4) {
506
- if (player.entity === bot.entity) continue
507
-
508
- player.entity = null
509
- delete bot.players[player.username]
510
- delete bot.uuidToUsername[item.UUID]
511
- bot.emit('playerLeft', player)
512
- continue
494
+ if (newPlayer) {
495
+ bot.emit('playerJoined', player)
513
496
  } else {
514
- continue
497
+ bot.emit('playerUpdated', player)
515
498
  }
499
+ }
500
+ } else {
501
+ for (const item of packet.data) {
502
+ let player = bot.uuidToUsername[item.UUID] ? bot.players[bot.uuidToUsername[item.UUID]] : null
503
+ if (packet.action === 0) {
504
+ let newPlayer = false
505
+
506
+ // New Player
507
+ if (!player) {
508
+ player = bot.players[item.name] = {
509
+ username: item.name,
510
+ ping: item.ping,
511
+ uuid: item.UUID,
512
+ displayName: new ChatMessage({ text: '', extra: [{ text: item.name }] }),
513
+ profileKeys: item.crypto
514
+ ? {
515
+ publicKey: item.crypto.publicKey, // DER-encoded public key
516
+ signature: item.crypto.signature // Signature
517
+ }
518
+ : null
519
+ }
520
+
521
+ bot.uuidToUsername[item.UUID] = item.name
522
+ bot.emit('playerJoined', player)
523
+ newPlayer = true
524
+ } else {
525
+ // Just an Update
526
+ player.gamemode = item.gamemode
527
+ player.ping = item.ping
528
+ if (item.crypto) {
529
+ player.profileKeys = {
530
+ publicKey: item.crypto.publicKey,
531
+ signature: item.crypto.signature
532
+ }
533
+ }
534
+ }
535
+
536
+ if (item.displayName) {
537
+ player.displayName = new ChatMessage(JSON.parse(item.displayName))
538
+ }
539
+
540
+ const playerEntity = Object.values(bot.entities).find(e => e.type === 'player' && e.username === item.name)
541
+ player.entity = playerEntity
542
+
543
+ if (playerEntity === bot.entity) {
544
+ bot.player = player
545
+ }
516
546
 
517
- bot.emit('playerUpdated', player)
547
+ if (!newPlayer) {
548
+ bot.emit('playerUpdated', player)
549
+ }
550
+ } else if (player) {
551
+ if (packet.action === 1) {
552
+ player.gamemode = item.gamemode
553
+ } else if (packet.action === 2) {
554
+ player.ping = item.ping
555
+ } else if (packet.action === 3 && !item.displayName) {
556
+ player.displayName = new ChatMessage({ text: '', extra: [{ text: player.username }] })
557
+ } else if (packet.action === 3 && item.displayName) {
558
+ player.displayName = new ChatMessage(JSON.parse(item.displayName))
559
+ } else if (packet.action === 4) {
560
+ if (player.entity === bot.entity) continue
561
+
562
+ player.entity = null
563
+ delete bot.players[player.username]
564
+ delete bot.uuidToUsername[item.UUID]
565
+ bot.emit('playerLeft', player)
566
+ continue
567
+ } else {
568
+ continue
569
+ }
570
+
571
+ bot.emit('playerUpdated', player)
572
+ }
518
573
  }
519
574
  }
520
575
  })
521
576
 
577
+ // (1.19.3) player(s) leave the game
578
+ bot._client.on('player_remove', (packet) => {
579
+ for (const uuid of packet.players) {
580
+ const player = bot.uuidToUsername[uuid] ? bot.players[bot.uuidToUsername[uuid]] : null
581
+
582
+ if (player.entity === bot.entity) continue
583
+
584
+ player.entity = null
585
+ delete bot.players[player.username]
586
+ delete bot.uuidToUsername[uuid]
587
+ bot.emit('playerLeft', player)
588
+ }
589
+ })
590
+
522
591
  // attaching to a vehicle
523
592
  bot._client.on('attach_entity', (packet) => {
524
593
  if (packet.entityId !== bot.entity.id) return
package/lib/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  module.exports = {
2
2
  supportedVersions: ['1.8', '1.9', '1.10', '1.11', '1.12', '1.13', '1.14', '1.15', '1.16', '1.17', '1.18', '1.19'],
3
- testedVersions: ['1.8.8', '1.9.4', '1.10.2', '1.11.2', '1.12.2', '1.13.2', '1.14.4', '1.15.2', '1.16.5', '1.17.1', '1.18.2', '1.19', '1.19.2']
3
+ testedVersions: ['1.8.8', '1.9.4', '1.10.2', '1.11.2', '1.12.2', '1.13.2', '1.14.4', '1.15.2', '1.16.5', '1.17.1', '1.18.2', '1.19', '1.19.2', '1.19.3']
4
4
  } // when updating testedVersions, make sure to update CI.yml
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mineflayer",
3
- "version": "4.7.0",
3
+ "version": "4.8.0",
4
4
  "description": "create minecraft bots with a stable, high level API",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -21,8 +21,8 @@
21
21
  },
22
22
  "license": "MIT",
23
23
  "dependencies": {
24
- "minecraft-data": "^3.15.2",
25
- "minecraft-protocol": "^1.38.1",
24
+ "minecraft-data": "^3.26.0",
25
+ "minecraft-protocol": "^1.40.3",
26
26
  "prismarine-biome": "^1.1.1",
27
27
  "prismarine-block": "^1.13.1",
28
28
  "prismarine-chat": "^1.7.1",