Skip to content

Commit a40a205

Browse files
Merge branch 'master' of https://github.com/PrismarineJS/mineflayer into PrismarineJS-master
2 parents 73cb436 + 55e8ed3 commit a40a205

File tree

14 files changed

+576
-391
lines changed

14 files changed

+576
-391
lines changed

docs/history.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
## 4.31.0
2+
* [Cursor 1 21 5 (#3701)](https://github.com/PrismarineJS/mineflayer/commit/8770129d26a85f9b077d2a8969d45436fa09c3f3) (thanks @rom1504)
3+
4+
## 4.30.0
5+
* [Update player_info handling (#3689)](https://github.com/PrismarineJS/mineflayer/commit/3f2fd6d393bc39167410df5a292759c93c9b249f) (thanks @extremeheat)
6+
* [Bump @types/node from 22.15.33 to 24.0.6 (#3686)](https://github.com/PrismarineJS/mineflayer/commit/12e50a2e2d0a921d075ebae8aa835437672a2b29) (thanks @dependabot[bot])
7+
* [Replace wiki.vg by minecraft.wiki. Close #3596](https://github.com/PrismarineJS/mineflayer/commit/c2794e43da71b346278818ff68acb690ec66a4fb) (thanks @rom1504)
8+
19
## 4.29.0
210
* [Sound test (#3657)](https://github.com/PrismarineJS/mineflayer/commit/51495665bbc3789ddc4284403c1ef288fea18ddc) (thanks @rom1504)
311
* [Add boss bar test (#3655)](https://github.com/PrismarineJS/mineflayer/commit/b6950e9c42324c0f6fba6f2f802d0c87973a8c92) (thanks @rom1504)

docs/update_to_1_21_5.md

Lines changed: 342 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,342 @@
1+
# Mineflayer 1.21.5 Support Plan
2+
3+
## 🚩 Latest Progress (July 2025)
4+
5+
-**Chunk loading/parsing is now fixed** in both `node_modules` and the local `prismarine-chunk` repo. The fix was applied to `PaletteChunkSection.js` and `BitArrayNoSpan.js`.
6+
- 🔗 **Local development uses `npm link` to the local prismarine-chunk repo** for immediate testing of fixes.
7+
- 🛠️ **BitArrayNoSpan.js** now validates the buffer size and logs a warning if it is invalid (e.g., Infinity), preventing crashes.
8+
- 🤖 **The bot can now spawn and interact with the world** in 1.21.5. Chunk parsing errors are resolved.
9+
-**12 tests pass** for 1.21.5, confirming core protocol and chunk logic is working.
10+
-**4 tests fail**, but these are due to higher-level Mineflayer/game logic (timeouts, creative set slot, etc.), not chunk/protocol errors.
11+
- 🚧 **Current blockers:**
12+
- Creative set slot protocol changes (UntrustedSlot)
13+
- declare_commands packet parsing (PartialReadError)
14+
15+
---
16+
17+
## Current Status
18+
19+
As of July 2025, Mineflayer has partial 1.21.5 support with several critical issues remaining. The version is already listed in `testedVersions` but tests are failing due to protocol changes in 1.21.5.
20+
21+
## Key Issues Identified
22+
23+
Based on the analysis of pull requests and issues, the main problems for 1.21.5 support are:
24+
25+
### 1. Chunk Protocol Changes (✅ FIXED)
26+
- **Issue**: Network has small changes to chunk format where size is now auto-computed to save a byte
27+
- **Status**: **RESOLVED** - Fixed size computation formula in prismarine-chunk
28+
- **Fix Applied**: Changed from `Math.ceil(constants.BLOCK_SECTION_VOLUME * bitsPerValue / 64)` to `Math.ceil(constants.BLOCK_SECTION_VOLUME / Math.floor(64 / bitsPerValue))`
29+
- **Impact**: Chunk loading now works correctly for 1.21.5
30+
- **Files Modified**:
31+
- `prismarine-chunk/src/pc/common/PaletteContainer.js` (both DirectPaletteContainer and IndirectPaletteContainer)
32+
- **Dependencies**: Updated package.json to point to fixed prismarine-chunk branch
33+
34+
### 2. Creative Set Slot Packet Behavior
35+
- **Issue**: Creative set slot packet behavior is the main breaking change (not working right now)
36+
- **Status**: Critical issue affecting creative mode functionality
37+
- **Impact**: `bot.creative.setInventorySlot()` fails
38+
- **Location**: `lib/plugins/creative.js`
39+
40+
### 3. Item Format Changes
41+
- **Issue**: New concepts of hashed items and unsecure items (related to components)
42+
- **Status**: Protocol changes need investigation
43+
- **Impact**: Item handling and inventory management
44+
- **Dependencies**: minecraft-data and minecraft-protocol updates needed
45+
46+
### 4. Entity Metadata Changes
47+
- **Issue**: Entity metadata may have changed
48+
- **Status**: Could cause issues with various listeners in mineflayer
49+
- **Impact**: Entity tracking and interaction
50+
- **Location**: `lib/plugins/entities.js`
51+
52+
## Detailed Action Plan
53+
54+
### Phase 1: Dependency Updates and Investigation
55+
56+
#### 1.1 Investigate Chunk Protocol Issues
57+
- **Task**: Manually dump and decode chunk packets to understand the new format
58+
- **Tools**: Use packet analyzers or debug tools
59+
- **Expected Outcome**: Identify exact changes in chunk size computation
60+
- **Files to Modify**: `lib/plugins/blocks.js` (chunk handling)
61+
62+
#### 1.2 Analyze Creative Set Slot Issues
63+
- **Task**: Debug creative set slot packet failures
64+
- **Method**: Compare packet structure between 1.21.4 and 1.21.5
65+
- **Files to Modify**: `lib/plugins/creative.js`
66+
- **Test**: `test/externalTests/creative.js`
67+
68+
### Phase 2: Protocol Implementation
69+
70+
#### 2.1 Fix Chunk Loading
71+
```javascript
72+
// In lib/plugins/blocks.js
73+
// Update chunk loading logic to handle auto-computed size
74+
bot._client.on('map_chunk', (packet) => {
75+
// Handle new chunk format with auto-computed size
76+
// May need to adjust data parsing based on new format
77+
})
78+
```
79+
80+
#### 2.2 Fix Creative Set Slot
81+
```javascript
82+
// In lib/plugins/creative.js
83+
// Update setInventorySlot to handle new packet format
84+
async function setInventorySlot (slot, item, waitTimeout = 400) {
85+
// Investigate and fix packet structure changes
86+
// May need new packet format or different handling
87+
}
88+
```
89+
90+
#### 2.3 Update Item Handling
91+
```javascript
92+
// In lib/plugins/inventory.js
93+
// Handle new hashed items and unsecure items concepts
94+
// Update Item.fromNotch and Item.toNotch methods
95+
```
96+
97+
#### 2.4 Fix Entity Metadata
98+
```javascript
99+
// In lib/plugins/entities.js
100+
// Update entity metadata parsing for 1.21.5 changes
101+
bot._client.on('entity_metadata', (packet) => {
102+
// Handle new metadata format
103+
})
104+
```
105+
106+
### Phase 3: Testing and Validation
107+
108+
#### 3.1 Create 1.21.5 Specific Tests
109+
```javascript
110+
// Add to test/externalTests/
111+
// Create tests that specifically validate 1.21.5 functionality
112+
```
113+
114+
#### 3.2 Update Existing Tests
115+
- **Task**: Fix failing tests for 1.21.5
116+
- **Focus**: Creative mode, chunk loading, entity handling
117+
- **Method**: Run `npm run mocha_test -- -g "mineflayer_external 1.21.5v"`
118+
119+
#### 3.3 Manual Testing
120+
- **Task**: Test core functionality manually
121+
- **Areas**: World loading, inventory management, entity interaction
122+
- **Tools**: Use examples in `examples/` directory
123+
124+
### Phase 4: Documentation and Cleanup
125+
126+
#### 4.1 Update Documentation
127+
- **Task**: Update README and API docs for 1.21.5
128+
- **Files**: `docs/README.md`, `docs/api.md`
129+
- **Content**: Document any new features or breaking changes
130+
131+
#### 4.2 Update Version Support
132+
- **Task**: Ensure 1.21.5 is properly listed as supported
133+
- **Files**: `lib/version.js`, `package.json`
134+
135+
## Analysis of Current Fix Status
136+
137+
### **Good News: Fix Already Implemented**
138+
The [prismarine-chunk PR #289](https://github.com/PrismarineJS/prismarine-chunk/pull/289/files) has already implemented the 1.21.5 chunk protocol fix:
139+
140+
**Key Changes in PR #289:**
141+
1. **Added `noSizePrefix` detection**: Uses `mcData.version['>=']('1.21.5')` to detect 1.21.5+
142+
2. **Modified chunk reading**: All palette containers now handle the `noSizePrefix` option
143+
3. **Dynamic size computation**: When `noSizePrefix` is true, size is computed as `Math.ceil(constants.BLOCK_SECTION_VOLUME * bitsPerValue / 64)`
144+
145+
### 🔍 **Current Status Check**
146+
Mineflayer is already using the experimental branches:
147+
- `prismarine-chunk`: `extremeheat/prismarine-chunk#pc1.21.5`
148+
- `minecraft-protocol`: `extremeheat/node-minecraft-protocol#pcp1.21.5`
149+
150+
### **Chunk Loading Issue RESOLVED**
151+
**FIXED**: The chunk loading issue has been resolved by correcting the size computation formula.
152+
153+
**Root Cause Analysis:**
154+
1.**Fix is implemented**: `noSizePrefix` detection and logic is present in the code
155+
2.**Version detection works**: `mcData.version['>=']('1.21.5')` returns `true` correctly
156+
3.**Size computation fixed**: Changed from `Math.ceil(constants.BLOCK_SECTION_VOLUME * bitsPerValue / 64)` to `Math.ceil(constants.BLOCK_SECTION_VOLUME / Math.floor(64 / bitsPerValue))`
157+
4.**Buffer reading works**: No more "Target offset is beyond the bounds of the internal SmartBuffer data" errors
158+
159+
**The Solution:**
160+
The issue was in the `readBuffer` method in `PaletteContainer.js`. The formula needed to calculate the number of longs based on the actual BitArray logic used in the constructor.
161+
162+
## Current Test Status
163+
164+
### **Chunk Loading Fixed**
165+
- **Status**: Chunk loading now works correctly for 1.21.5
166+
- **Evidence**: No more "Target offset is beyond the bounds of the internal SmartBuffer data" errors
167+
- **Next**: Focus on remaining test failures
168+
169+
### 🚨 **New Test Failures Identified**
170+
After fixing chunk loading, new issues emerged:
171+
172+
1. **Test Setup Timeout**: "Event message did not fire within timeout of 5000ms" in "before each" hook for "bed"
173+
2. **Server Shutdown Issues**: "Server shutdown took too long. Killing process."
174+
3. **Potential Protocol Changes**: Other 1.21.5 protocol changes may be affecting test functionality
175+
176+
## Next Priority Issues
177+
178+
### 1. **Investigate Test Setup Failures** (High Priority)
179+
- **Issue**: Tests are timing out during setup phase
180+
- **Location**: `test/externalTests/plugins/testCommon.js:127:21` - `clearInventory` function
181+
- **Possible Causes**:
182+
- Creative set slot packet changes
183+
- Inventory protocol changes
184+
- Entity metadata changes
185+
186+
### 2. **Debug Creative Set Slot** (High Priority - PROTOCOL CHANGE IDENTIFIED)
187+
- **Issue**: Creative mode functionality broken due to protocol change
188+
- **Location**: `lib/plugins/creative.js`
189+
- **Test**: `test/externalTests/creative.js`
190+
- **Root Cause**: `set_creative_slot` packet changed from `Slot` to `UntrustedSlot` type
191+
- **Key Changes**:
192+
- **1.21.4**: `packet_set_creative_slot.item` type: `Slot`
193+
- **1.21.5**: `packet_set_creative_slot.item` type: `UntrustedSlot`
194+
- `UntrustedSlot` has `present` boolean field first
195+
- Uses `UntrustedSlotComponent` instead of `SlotComponent`
196+
- New component system with `addedComponentCount` and `removedComponentCount`
197+
- **Files to Modify**: `lib/plugins/creative.js` (creative set slot handling)
198+
199+
### 3. **Check Item Format Changes** (Medium Priority - PROTOCOL CHANGES IDENTIFIED)
200+
- **Issue**: New hashed items and unsecure items concepts
201+
- **Location**: `lib/plugins/inventory.js`
202+
- **Impact**: Item handling and inventory management
203+
- **Protocol Changes Found**:
204+
- **New `vec3i` type**: Added for 3D integer vectors
205+
- **Item component system**: New component-based item system
206+
- **Component reordering**: Item component IDs have been reordered (e.g., `hide_additional_tooltip``tooltip_display`)
207+
- **New components**: Added `blocks_attacks`, `weapon` components
208+
- **Entity metadata**: `item_stack` type still uses `Slot` but may have component changes
209+
210+
### 4. **Entity Metadata Changes** (Medium Priority - MINIMAL CHANGES)
211+
- **Issue**: Entity metadata format changes
212+
- **Location**: `lib/plugins/entities.js`
213+
- **Impact**: Entity tracking and interaction
214+
- **Protocol Analysis**:
215+
- **Good news**: `entity_metadata` packet structure unchanged
216+
- **Good news**: `item_stack` type in metadata still uses `Slot` (not `UntrustedSlot`)
217+
- **Minimal impact**: Entity metadata changes appear to be minimal for 1.21.5
218+
219+
## Protocol Analysis Summary
220+
221+
Based on the [minecraft-data PR #1029](https://github.com/PrismarineJS/minecraft-data/pull/1029/files) analysis, here are the key protocol changes for 1.21.5:
222+
223+
### 🔥 **Critical Changes (Blocking Issues)**
224+
225+
1. **Creative Set Slot Packet**:
226+
- **Change**: `packet_set_creative_slot.item` type changed from `Slot` to `UntrustedSlot`
227+
- **Impact**: Creative mode inventory management completely broken
228+
- **Fix Required**: Update `lib/plugins/creative.js` to handle `UntrustedSlot` format
229+
230+
2. **New Packet Types**:
231+
- **Added**: `set_test_block` (0x39) and `test_instance_block_action` (0x3c)
232+
- **Impact**: May affect block interaction tests
233+
234+
### 📦 **Item System Changes**
235+
236+
1. **Component System**:
237+
- **New**: `UntrustedSlot` with component-based system
238+
- **Components**: `addedComponentCount`, `removedComponentCount`, `UntrustedSlotComponent`
239+
- **Impact**: Item serialization/deserialization needs updates
240+
241+
2. **Component Reordering**:
242+
- **Changed**: Component IDs reordered (e.g., `hide_additional_tooltip``tooltip_display`)
243+
- **Added**: New components like `blocks_attacks`, `weapon`
244+
245+
### 🎯 **Minimal Impact Changes**
246+
247+
1. **Entity Metadata**:
248+
- **Status**: Unchanged - still uses `Slot` for `item_stack`
249+
- **Impact**: Minimal - no changes needed
250+
251+
2. **New Types**:
252+
- **Added**: `vec3i` type for 3D integer vectors
253+
- **Impact**: May be used in new packets but not critical
254+
255+
## Implementation Steps
256+
```bash
257+
cd /media/documents/Documents/programmation/interlangage/minecraft/mineflayer
258+
npm install
259+
```
260+
261+
### Step 2: Run Current Tests
262+
```bash
263+
# Test current 1.21.5 status
264+
npm run mocha_test -- -g "mineflayer_external 1.21.5v"
265+
```
266+
267+
### Step 3: Investigate Specific Issues
268+
```bash
269+
# Debug chunk loading
270+
DEBUG="minecraft-protocol" npm run mocha_test -- -g "mineflayer_external 1.21.5v.*blocks"
271+
272+
# Debug creative mode
273+
npm run mocha_test -- -g "mineflayer_external 1.21.5v.*creative"
274+
```
275+
276+
### Step 4: Implement Fixes
277+
1. Start with chunk protocol fixes
278+
2. Fix creative set slot issues
279+
3. Update item handling
280+
4. Fix entity metadata
281+
282+
### Step 5: Validate Fixes
283+
```bash
284+
# Run all 1.21.5 tests
285+
npm run mocha_test -- -g "mineflayer_external 1.21.5v"
286+
287+
# Run specific functionality tests
288+
npm run mocha_test -- -g "mineflayer_external 1.21.5v.*inventory"
289+
npm run mocha_test -- -g "mineflayer_external 1.21.5v.*entities"
290+
```
291+
292+
## Success Criteria
293+
294+
1. All 1.21.5 tests pass
295+
2. Core functionality works (world loading, inventory, entities)
296+
3. Creative mode functions properly
297+
4. No regressions in other versions
298+
5. Documentation is updated
299+
300+
## Risk Mitigation
301+
302+
1. **Backward Compatibility**: Ensure fixes don't break older versions
303+
2. **Incremental Testing**: Test each fix individually
304+
3. **Fallback Mechanisms**: Implement fallbacks for protocol changes
305+
4. **Version Detection**: Use `bot.supportFeature()` for version-specific code
306+
307+
## Resources Needed
308+
309+
1. **Minecraft 1.21.5 Server**: For testing
310+
2. **Packet Analyzer**: For debugging protocol changes
311+
3. **Documentation**: Minecraft 1.21.5 protocol changes
312+
4. **Time**: 1-2 weeks of focused development
313+
314+
## Contributing Guidelines
315+
316+
For anyone wanting to contribute to 1.21.5 support:
317+
318+
1. **Read the Documentation**: `docs/llm_contribute.md` and `docs/README.md`
319+
2. **Understand the Test System**: `test/externalTests/`
320+
3. **Focus on One Issue**: Pick one specific problem to solve
321+
4. **Test Thoroughly**: Run tests for multiple versions
322+
5. **Document Changes**: Update relevant documentation
323+
324+
## Updated Timeline
325+
326+
- **Phase 1**: ✅ COMPLETED (chunk protocol fix)
327+
- **Phase 2**: 2-3 days (investigate and fix test setup failures)
328+
- **Phase 3**: 2-3 days (fix creative set slot and other protocol issues)
329+
- **Phase 4**: 1-2 days (testing and validation)
330+
- **Phase 5**: 1 day (documentation and cleanup)
331+
332+
**Total Estimated Time**: 6-9 days remaining
333+
334+
**Note**: Chunk loading is now fixed! Focus is on remaining protocol changes and test failures.
335+
336+
## References
337+
338+
- [PrismarineJS/prismarine-chunk#289](https://github.com/PrismarineJS/prismarine-chunk/pull/289)
339+
- [PrismarineJS/mineflayer#3691](https://github.com/PrismarineJS/mineflayer/pull/3691)
340+
- [PrismarineJS/mineflayer#3641](https://github.com/PrismarineJS/mineflayer/issues/3641)
341+
- [PrismarineJS/minecraft-data#1029](https://github.com/PrismarineJS/minecraft-data/pull/1029)
342+
- [PrismarineJS/node-minecraft-protocol#1408](https://github.com/PrismarineJS/node-minecraft-protocol/pull/1408)

lib/plugins/bed.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,10 @@ function inject (bot) {
146146
}
147147
}
148148

149+
// We need to register the listener before actually going to sleep to avoid race conditions
150+
const waitingPromise = waitUntilSleep()
149151
bot.activateBlock(bedBlock)
150-
151-
await waitUntilSleep()
152+
await waitingPromise
152153
}
153154
}
154155

lib/plugins/chat.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ function inject (bot, options) {
118118
target: data.targetName ? JSON.parse(data.targetName) : undefined,
119119
content: message ? JSON.parse(message) : { text: data.plainMessage }
120120
}
121-
const registryIndex = data.type.registryIndex ? data.type.registryIndex : data.type
121+
const registryIndex = data.type.chatType != null ? data.type.chatType : data.type
122122
msg = ChatMessage.fromNetwork(registryIndex, parameters)
123123

124124
if (data.unsignedContent) {

0 commit comments

Comments
 (0)