mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2026-08-15 13:04:36 +00:00
Add reusable inventory sweep tooling
This commit is contained in:
parent
c98c2a8f83
commit
5545aabb60
4 changed files with 797 additions and 0 deletions
|
|
@ -115,6 +115,43 @@ Use this for TPS, movement-cadence, or packet-cadence work:
|
|||
|
||||
Run them against a real server with a temp config and summarize counts from the captured logs.
|
||||
|
||||
### 4. Full inventory regression sweep
|
||||
|
||||
Use this when touching inventory snapshots, player/container slot sync, creative inventory, item-slot serialization, packet palettes, game-mode updates, or block-use paths that open containers:
|
||||
|
||||
```bash
|
||||
tools/run-inventory-full-sweep.sh --versions "1.21.10 1.21.11"
|
||||
```
|
||||
|
||||
Default coverage includes:
|
||||
|
||||
- player inventory listing and inventory discovery
|
||||
- creative give/delete
|
||||
- inventory search
|
||||
- player right/left click stack split and merge
|
||||
- player drop one and drop all
|
||||
- chest open via `useblock`
|
||||
- container listing and close
|
||||
- mirrored player slots in container windows
|
||||
- shift-click and shift-right-click transfer
|
||||
- container right/left click, cursor stack, drop one, and drop all
|
||||
- creative middle-click command path
|
||||
- log scan for packet parse failures, queue-empty crashes, unhandled exceptions, and disconnects
|
||||
|
||||
Run the Issue #3112 repro after a passing sweep:
|
||||
|
||||
```bash
|
||||
tools/run-inventory-full-sweep.sh --versions "1.20.4" --run-issue-script
|
||||
```
|
||||
|
||||
The script writes `summary.tsv` under `RUN_ROOT` and per-version logs under `/tmp/mcc-debug/inventory-full-<version>/mcc-debug.log`.
|
||||
|
||||
When a matrix has existing PASS rows, do not rerun them unless a later code change affects that row or the user asks for a full rerun. Derive remaining rows from summaries:
|
||||
|
||||
```bash
|
||||
awk 'FNR>1 && $2=="PASS" {print $1}' /tmp/mcc-inventory-full-sweep/*/summary.tsv | sort -V | uniq
|
||||
```
|
||||
|
||||
## Preconditions
|
||||
|
||||
Before running any scenario:
|
||||
|
|
@ -165,6 +202,8 @@ Optionally override the login name with the fourth argument to the config helper
|
|||
- summarize the latest full-spectrum run
|
||||
- `tools/run-creative-e2e.sh`
|
||||
- ordered creative-mode E2E regression scenario
|
||||
- `tools/run-inventory-full-sweep.sh`
|
||||
- full inventory command/API sweep across one or more versions, with optional Issue #3112 MCCScript repro
|
||||
|
||||
## Evidence Discipline
|
||||
|
||||
|
|
@ -224,3 +263,7 @@ Always summarize:
|
|||
- If a test assertion fails, inspect the real MCC output before changing the code or weakening the assertion.
|
||||
- If an older server behaves oddly on Linux, check `use-native-transport=false` in `server.properties`.
|
||||
- If a matrix row fails before producing `mcc.log` or a command transcript, treat it as a harness failure, fix the environment, and rerun that row before drawing product conclusions.
|
||||
- If creative inventory commands report "You must be in Creative gamemode" after RCON switched the player, inspect game-mode update parsing before assuming creative inventory is broken. Modern servers can update local game mode through game event reason `3`.
|
||||
- If an inventory row crashes with `Queue empty` or `Failed to process incoming packet`, inspect packet palette routing before changing inventory code. A single shifted packet ID can make a healthy inventory feature look broken.
|
||||
- For chest-open failures, separate product and harness causes. The player may be standing inside the chest or suffocating on older servers. Stand beside the chest, put a floor under the player, and retry `useblock`.
|
||||
- For shared local servers, a `Done` log line does not prove RCON is ready. Retry setup commands and verify the actual RCON port from `server.properties`.
|
||||
|
|
|
|||
|
|
@ -157,6 +157,50 @@ When packet changes are detected:
|
|||
2. Create new `PacketPaletteXXX.cs` based on the previous one, adjusting IDs
|
||||
3. Update `PacketType18Handler.cs` routing
|
||||
|
||||
Use scriptable comparisons instead of eyeballing long packet tables. The packet ID is the registration index in `GameProtocols.java`:
|
||||
|
||||
```bash
|
||||
python3 - <<'PY'
|
||||
import re
|
||||
for ver in ["1.21.10", "1.21.11", "26.1"]:
|
||||
path=f"MinecraftOfficial/{ver}-decompiled/net/minecraft/network/protocol/game/GameProtocols.java"
|
||||
text=open(path).read()
|
||||
start=text.index("CLIENTBOUND_TEMPLATE")
|
||||
names=[m.group(1) for m in re.finditer(r"\.addPacket\(([^,]+),", text[start:])]
|
||||
print("==", ver, len(names))
|
||||
for i, name in enumerate(names):
|
||||
print(f"0x{i:02X}", name)
|
||||
PY
|
||||
```
|
||||
|
||||
For focused diffs:
|
||||
|
||||
```bash
|
||||
python3 - <<'PY'
|
||||
import re
|
||||
def packets(ver, marker):
|
||||
text=open(f"MinecraftOfficial/{ver}-decompiled/net/minecraft/network/protocol/game/GameProtocols.java").read()
|
||||
start=text.index(marker)
|
||||
return [m.group(1) for m in re.finditer(r"\.addPacket\(([^,]+),", text[start:])]
|
||||
left, right = "1.21.10", "1.21.11"
|
||||
a, b = packets(left, "CLIENTBOUND_TEMPLATE"), packets(right, "CLIENTBOUND_TEMPLATE")
|
||||
for i in range(max(len(a), len(b))):
|
||||
x = a[i] if i < len(a) else "<none>"
|
||||
y = b[i] if i < len(b) else "<none>"
|
||||
if x != y:
|
||||
print(f"0x{i:02X}: {left}={x} | {right}={y}")
|
||||
PY
|
||||
```
|
||||
|
||||
Do the same for `SERVERBOUND_TEMPLATE`. Clientbound and serverbound can change independently. Do not inherit a newer palette just because one side looks similar. For example, `1.21.11` used the same play packet order as `1.21.9/1.21.10` for the tested inventory path, while `26.1` had additional shifts.
|
||||
|
||||
Known packet lessons:
|
||||
|
||||
- `1.9`, `1.9.1`, and `1.9.2` need their own packet palette. They are not safe to route through the later 1.9.x palette.
|
||||
- Pure `1.19` serverbound IDs differ from later 1.19.x. Do not put `MessageAcknowledgment` at `0x03`; pure 1.19 has `ChatCommand` at `0x03`, `ChatMessage` at `0x04`, and `ChatPreview` at `0x05`.
|
||||
- A wrong packet palette often appears as unrelated inventory failure: creative give/delete disconnects, `Queue empty`, or `Failed to process incoming packet`.
|
||||
- Game event reason `3` is `CHANGE_GAME_MODE`. If RCON changed the player to creative but MCC still refuses creative inventory commands, inspect `ChangeGameState` handling.
|
||||
|
||||
## Step 5: Check Variant Encoding Changes
|
||||
|
||||
For entity types that use variant serializers (Cat, Wolf, Frog, Painting), check if the codec changed between versions by inspecting:
|
||||
|
|
@ -186,6 +230,17 @@ Compare key packet codec classes between versions. Known changes:
|
|||
|
||||
When in doubt, compare the relevant packet class (e.g. `ClientboundAddEntityPacket.java`) between versions.
|
||||
|
||||
## Step 7.1: Check JoinGame and Respawn Formats
|
||||
|
||||
JoinGame and Respawn are high-risk because dimension fields changed several times:
|
||||
|
||||
- `1.16` and `1.16.1`: dimension type/name handling uses string identifiers in places where later versions do not.
|
||||
- `1.16.2` through `1.18.2`: dimension type can be an NBT compound in JoinGame/Respawn.
|
||||
- `1.19+`: dimension type commonly moves back to identifiers.
|
||||
- `1.20.6+`: registry-driven IDs appear in more fields.
|
||||
|
||||
When a version joins but terrain, inventory, or later packets look misaligned, inspect JoinGame/Respawn first. A single wrong dimension-field read leaves unread bytes in the packet and can make the next packet look broken.
|
||||
|
||||
## Step 8: Update Block Collision Shapes (Physics Engine)
|
||||
|
||||
MCC's physics engine uses block collision shape data from PrismarineJS `minecraft-data` to perform accurate AABB collision detection (stored in `MinecraftClient/Physics/BlockShapeData.json`, embedded as a resource).
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue