4.4 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
MinEGO is a Go-based Minecraft protocol implementation that generates packet codecs and data components for Minecraft Java Edition protocol version 1.21.6 (protocol 771). The project uses code generation to create serialization/deserialization code for Minecraft network packets and item components.
Architecture
The project follows a modular architecture centered around code generation:
codec/data/component/
- Contains Go structs for all Minecraft item components (e.g., damage, enchantments, custom_name). Each component implements theslot.Component
interface with Type() and ID() methods.codec/data/packet/game/
- Contains client and server packet definitions following the Minecraft protocol specificationcodec/data/slot/
- Core slot/item stack implementation and component registration systemnet/
- Network layer implementation (currently empty)- Protocol Reference -
codec/data/packet/protocol.wiki
contains the complete Minecraft protocol specification from wiki.vg
Code Generation System
The project uses a custom code generator called packetizer
that processes Go structs marked with //codec:gen
comments. This generates the necessary ReadFrom/WriteTo methods for network serialization.
Key patterns:
- Structs marked with
//codec:gen
will have codecs auto-generated - Structs marked with
//codec:ignore
are excluded from generation - Components must implement
Type() slot.ComponentID
andID() string
methods - Components are registered in
codec/data/component/components.go
usingslot.RegisterComponent()
Development Commands
Code Generation
# Generate packet codecs (run from project root)
./gen-packet.sh
# This runs: packetizer ./codec
Standard Go Commands
# Build the project
go build
# Run tests (if any exist)
go test ./...
# Format code
go fmt ./...
# Get dependencies
go mod tidy
Dependencies
- github.com/Tnze/go-mc - Core Minecraft protocol library (uses forked version)
- packetizer - Custom code generation tool (available at /root/go/bin/packetizer)
Working with Components
When adding new Minecraft item components:
- Create the struct in
codec/data/component/
following existing patterns - Add
//codec:gen
comment above the struct - Implement
Type()
andID()
methods with correct component ID and namespace - Register the component in
components.go
init() function - Run
./gen-packet.sh
to generate codecs
Working with Packets
When adding new packet types:
- Define the packet struct in appropriate
client/
orserver/
directory - Add
//codec:gen
comment for auto-generation - Register the packet in the appropriate packets map
- Run
./gen-packet.sh
to generate codecs
Module Path
The project uses git.konjactw.dev/patyhank/minego
as its module path and includes a replace directive for the go-mc dependency pointing to a custom fork.
Code Generation Tasks
- Java to Go Packet Conversion:
- Task to implement Game State packets by converting Java code from
~/GoProjects/mc-network-source/network/protocol/game
to Go structs - Focus on maintaining the same read/write logic during translation
- Ensure packet structures match the original Java implementation
- Use packetizer for automatic codec generation
- Task to implement Game State packets by converting Java code from
Reference Notes
- PacketID Reference:
- In
/root/go/pkg/mod/git.konjactw.dev/patyhank/go-mc@v1.20.3-0.20250618004758-a3d57fde34e8/data/packetid/packetid.go
, you can find all packet IDs (excluding handshake stage)
- In
Packet Serialization Techniques
- 對於Optional封包資料 簡易的格式可以使用pk.Option[XXX,*XXX] 的方法 比較複雜的需要自己實作一個ReadFrom&WriteTo 並且移除codec:gen的標記
Example
// ExampleTypeFull full example for codec generator
//
//codec:gen
type ExampleTypeFull struct {
PlayerID int32 `mc:"VarInt"`
PlayerName string
UUID uuid.UUID `mc:"UUID"`
ResourceLocation string `mc:"Identifier"`
Data nbt.RawMessage `mc:"NBT"`
ByteData []byte `mc:"ByteArray"`
Health float32
Balance float64
Message chat.Message
SentMessages []chat.Message
}