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.
- package/.github/workflows/ci.yml +2 -0
- package/docs/history.md +6 -0
- package/docs/ru/README_RU.md +2 -2
- package/index.d.ts +1 -0
- package/lib/plugins/chat.js +9 -19
- package/lib/plugins/entities.js +125 -56
- package/lib/version.js +1 -1
- package/package.json +3 -3
package/.github/workflows/ci.yml
CHANGED
package/docs/history.md
CHANGED
package/docs/ru/README_RU.md
CHANGED
|
@@ -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
package/lib/plugins/chat.js
CHANGED
|
@@ -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(
|
|
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.
|
|
152
|
-
bot.emit('messagestr', msg.toString(), chatPositions[data.
|
|
153
|
-
if (data.
|
|
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
|
})
|
package/lib/plugins/entities.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
448
|
-
|
|
449
|
-
|
|
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
|
-
|
|
453
|
-
|
|
454
|
-
|
|
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
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
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
|
-
|
|
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 ===
|
|
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 (
|
|
494
|
-
bot.emit('
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
25
|
-
"minecraft-protocol": "^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",
|