94 lines
4.5 KiB
Markdown
94 lines
4.5 KiB
Markdown
# RegionIO
|
|
|
|
A Minecraft Java Edition server core written in Go, targeting version
|
|
**26.1.2** (protocol **775**). RegionIO implements the connection lifecycle
|
|
(status → login → configuration → play), multiplayer chunk streaming, shared
|
|
block editing, persistent worlds, and an overworld generator built on the real
|
|
`noise_router` `final_density` tree.
|
|
|
|
## Status
|
|
|
|
- **Network**: full handshake/status/login (offline mode)/configuration/play
|
|
state machine with zlib compression, keep-alive, and chunk streaming.
|
|
- **Registries**: 28 synchronized registries + tags, captured verbatim from the
|
|
26.1.2 vanilla server and sent during configuration.
|
|
- **World**: revisioned, concurrency-safe chunk snapshots; memoized
|
|
`level_chunk_with_light` frames; bounded LRU cache; Anvil `.mca` persistence
|
|
with autosave and seed metadata.
|
|
- **Generation**: vanilla-derived overworld terrain from the embedded datapack
|
|
(`ImprovedNoise`/`PerlinNoise`/`BlendedNoise`/`NormalNoise` + the density
|
|
function interpreter), 3D multi-noise biomes, surface-rule interpretation,
|
|
deterministic decoration, and basic template structures.
|
|
- **Gameplay**: four-player session registry; player join/leave and movement
|
|
synchronization; chunk-scoped visibility for players and mobs; shared
|
|
creative block place/break; broadcast chat; and hotbar item→block mapping.
|
|
- **Lighting**: stored vanilla nibble arrays for sky and block light; horizontal
|
|
and cross-chunk propagation; incremental updates after edits; persisted
|
|
`SkyLight`/`BlockLight`; and chunk-scoped `light_update` broadcasts.
|
|
- **Safety**: duplicate chunk generation is coalesced; corrupt stored chunks are
|
|
not silently regenerated or overwritten; a world cannot reopen with another
|
|
seed.
|
|
|
|
## Build & run
|
|
|
|
```
|
|
go build ./...
|
|
go run ./cmd/regionio -seed 12345
|
|
```
|
|
|
|
The world seed defaults to `0`; override it with the `-seed` flag or the
|
|
`REGIONIO_SEED` environment variable. The server listens on `0.0.0.0:25565`.
|
|
Changing the seed for an existing world directory is rejected.
|
|
|
|
## Testing
|
|
|
|
```
|
|
go test ./...
|
|
go test -race ./internal/network ./internal/server ./internal/world \
|
|
-run 'Test(Integration|BoundaryEdit|PlayerInfo|PlayerRegistry|Concurrent|Incremental|EncodeLight|Cache|Store|Eviction|Region)'
|
|
# or run both gates:
|
|
make verify
|
|
```
|
|
|
|
The integration suite exercises four clients across two visibility regions:
|
|
join, movement, leaving, mob visibility, and local block/light updates. A
|
|
two-client scenario separately covers shared block edits and chat. Concurrency
|
|
tests cover simultaneous frame encoding, editing, autosave, cache misses, and
|
|
session movement/broadcasts. Lighting tests compare the initial flat chunk and a
|
|
31x31x31 glowstone propagation volume against fixtures captured from the
|
|
official vanilla 26.1.2 server. Optional terrain parity diagnostics compare
|
|
surface heights against `/tmp/vanilla_ground.json` when that capture is present.
|
|
|
|
## v0.3 scope
|
|
|
|
RegionIO v0.3 is a small creative multiplayer server core, not a complete
|
|
vanilla gameplay implementation. Player and mob visibility is chunk-scoped,
|
|
but there is no interest prioritization or delta-movement compression yet.
|
|
Lighting matches vanilla's block-state dampening, emission, and face-occlusion
|
|
properties and propagates across loaded chunk boundaries. Chunks outside the
|
|
live cache are recalculated exactly when loaded rather than retained as active
|
|
light-engine state. Structures, placed features, mob AI, authentication,
|
|
inventory, and survival mechanics remain intentionally partial. The density
|
|
router is vanilla-derived, while biome/surface/decoration layers still contain
|
|
approximations and require stricter parity fixtures.
|
|
|
|
## Project layout
|
|
|
|
```
|
|
cmd/regionio/ entry point (config, listener, graceful shutdown)
|
|
internal/
|
|
protocol/ wire primitives: VarInt, framing, compression, packet IDs
|
|
nbt/ NBT encoder/decoder (with modified UTF-8)
|
|
registry/ embedded synchronized registries + tags
|
|
world/ chunk model, level_chunk encoder, cache, generators, biomes
|
|
worldgen/ noise core + density-function interpreter + climate finder
|
|
network/ per-connection state machine (handler/conn/play/login/...)
|
|
server/ shared core: config, status response, profiles
|
|
```
|
|
|
|
## Notes
|
|
|
|
The vanilla `server.jar` and its unpacked `libraries/`/`versions/` are **not**
|
|
included (obtain them from Mojang). The embedded data under `internal/`
|
|
(registries, biome parameters, the overworld datapack) is derived from vanilla
|
|
reports and is all that is required to build and run.
|