Skip to content

Releases: basalt-mc/basalt

v0.1.0

20 Apr 17:11
71556d7

Choose a tag to compare

[0.1.0] - 2026-04-20

Chat Plugin

  • Update architecture for single loop design

Code Generation

  • Add xtask codegen tool

  • Add Configuration/Play states with category split

  • Remove generated tests, auto-format with rustfmt, fix imports

  • AnonOptionalNbt now generates NbtCompound instead of Option

Commands

  • Command registry crate with Command trait

  • Command registry crate with Command trait

  • Typed argument API with all Minecraft parsers and variants

  • Broadcast /say message to all players instead of sender only

  • Add typed ArgValue variants and Arg::token_count method

  • Simplify /tp handler using typed get_vec3

Container Plugin

  • Add ContainerPlugin for chest interaction via events

Core

  • Basalt-core crate with Context trait and shared types

  • Add Gamemode enum for type-safe gamemode handling

  • Accept impl Display in PluginLogger instead of &str

  • Add player_yaw/player_pitch to Context and preserve rotation in /tp

  • Move component types and Phase from basalt-ecs to basalt-core

  • Add SystemContext trait with typed entity access

  • Add NoopContext shared test implementation

  • Add typed broadcast methods to EntityContext

  • Add PlayerInfo struct for dispatch context identity

Derive Macros

  • Add attribute parsing for packet, field, and variant

  • Implement Encode derive for structs and enums

  • Implement Decode derive for structs and enums

  • Implement EncodedSize derive for structs and enums

  • Add macro entry points and module docs

  • Add attribute parsing for field and variant

  • Implement Encode derive for structs and enums

  • Implement Decode derive for structs and enums

  • Implement EncodedSize derive for structs and enums

  • Add #[packet] attribute macro

  • Support field attributes in enum variant fields

  • Add element = "varint" attribute for Vec fields

  • Support element_varint attribute in enum variant fields

  • Extract shared codegen helpers for field attributes

  • Cap Vec::with_capacity in length_varint decode to prevent OOM

Documentation

  • Add project guidelines

  • Document coverage job and 90% threshold

  • Comprehensive update with codegen, coverage and workflow rules

  • Add basalt-server crate to architecture and structure

  • Add element attribute, multi-player architecture, helpers

  • Add basalt-world crate to architecture

  • Add basalt-events crate to architecture

  • Document event-driven server architecture

  • Update architecture for plugin API and plugin crates

  • Add basalt-command crate and command plugin

  • Update architecture for basalt-core and command args

  • Update architecture for basalt-core and command args

  • Document fuzz testing strategy and CI integration

  • Add rule to keep README in sync with shipped features

  • Add 5 new fuzz targets to CI matrices and documentation

  • Document encoding architecture and world decoupling

  • Document ChunkPacketCache LRU eviction config

  • Document simulation distance and batch persistence

  • Document drops plugin and item entities

  • Update CLAUDE.md for new architecture

  • Document &dyn Context handlers and ServerContext split

  • Document DispatchResult, panic handling, PlayerInfo

  • Generate initial changelog

  • Add version badge to README

ECS

  • Add in-house Entity Component System with system scheduler

  • Add SkinData and ChunkView components

  • Move SkinData and ChunkView to server crate

  • Add DroppedItem component for item entities

  • Add PickupDelay component and Inventory::try_insert

  • Expand Inventory to 36 slots with protocol conversion

  • Make basalt-ecs a pure storage engine

  • Update benchmarks for pure storage engine

  • Provide World reference to SystemContext via set_world()

Events

  • Event bus crate with staged handler dispatch

  • Rename BusKind::Network to BusKind::Instant

Item Plugin

  • Rename DropsPlugin to ItemPlugin

Networking

  • Add Error type

  • Implement TCP framing

  • Implement Connection typestate

  • Implement AES-128 CFB-8 encryption

  • Implement zlib compression

  • Implement middleware pipeline

  • Add Login state and HandshakeResult enum

  • Add EncryptedStream with transparent encryption

  • Use EncryptedStream in Connection

  • Integrate zlib compression into EncryptedStream

  • Rename EncryptedStream to ProtocolStream

  • Add Configuration and Play typestates

  • Update server example with full login → empty world flow

  • Use typed Login packet instead of manual RawPayload encoding

  • Add PacketWriter trait for testable packet output

  • Limit login ack wait loop to prevent client-side DoS

  • Use zlib compression level 3 instead of default 6

  • Reuse encrypt buffer to avoid per-write allocation

  • Log trailing bytes after Play packet decode

  • Reject decompressed packets larger than 32 MB to prevent OOM

  • Add dual event bus routing for two-loop architecture

  • Update file structure for reorganized crates

Other

  • Add Cargo workspace with four crate skeletons

  • Generate switch enums from protocol switch fields

  • Thread global types through codegen pipeline

  • Replace parser with IR-based TypeRegistry

  • Skip relative-path switches and emit element varint

  • Add missing world plugin crate and fix gitignore

  • Add basalt-test-utils crate with PluginTestHarness

  • Migrate all plugin tests to PluginTestHarness

  • Add first benchmarks for VarInt, NBT, string, and chunk encoding

  • Add fuzz targets for protocol type decoders

  • Compare encoded bytes in NBT fuzz target instead of struct equality

  • Add fuzz_packet_play target for serverbound Play packets

  • Add fuzz_text_component target for NBT text parsing

  • Add fuzz_position target for packed block coordinates

  • Add fuzz_decompress target for zlib packet decompression

  • Add fuzz_chunk_deserialize target for BSR chunk format

  • Replace criterion with libtest native benchmarks

  • Simplify plugin tests with PluginTestHarness

  • Rename basalt-test-utils to basalt-testkit

  • Improve PluginTestHarness API and clean tests

  • Add drops plugin — spawn items on block break

Physics Plugin

  • Add physics plugin with gravity and AABB collision

  • Migrate to SystemContext API

Plugin API

  • Public plugin API crate with ServerContext and Plugin trait

  • Centralized command registration and DeclareCommands

  • Implement Context trait, fluent command builder

  • Use Gamemode enum instead of raw u8 in Context trait

  • Add Debug and Clone derives to all event structs

  • Change ServerContext world from &'static to Arc

  • Add system and component registration to PluginRegistrar

  • Add block_state to BlockBrokenEvent and SpawnDroppedItem response

  • Split Context trait into sub-context domains

  • Add PlayerInteractEvent for block right-click

  • Remove unsafe ecs_ptr from ServerContext

  • Decouple basalt-api from basalt-ecs

  • Organize prelude into focused modules

  • Use basalt-api as sole plugin dependency

  • Remove ComponentRegistration dead code

  • Restructure events with domain files and structured types

  • Use PlayerInfo in ServerContext and clean Response enum

  • Split context.rs into domain sub-modules

  • Plugin handlers receive &dyn Context instead of &ServerContext

  • Migrate all plugin tests to DispatchResult

Protocol

  • Add Error type and ConnectionState enum

  • Add ProtocolVersion enum

  • Implement Handshake packets

  • Implement PacketRegistry

  • Replace hand-written Handshake packets with codegen

  • Add Login dispatch to PacketRegistry

  • Add generated Configuration and Play packets

  • Add Configuration and Play dispatch

  • Regenerate all packets without inline tests

  • Add minimum registry data builder for Configuration

  • Add empty chunk data builder for Play state

  • Add all vanilla 1.21.4 damage types

  • Add chat_type registry for Configuration

  • Move chunk builder to basalt-server

Server

  • Implement Status packets

  • Replace hand-written Status packets with codegen

  • Add generated Login packets

  • Add minimal server example

  • Create basalt-server with play loop and packet dispatch

  • Add chat system with commands

  • Multi-player with shared state and broadcast

  • Send 7x7 chunk grid with stone floor at y=99

  • Fetch player skins from Mojang API

  • Add server-specific Error type

  • Fetch skin in parallel with configuration exchange

  • Replace RwLock+mpsc with DashMap+broadcast channel

  • Introduce PacketContext for handler abstraction

  • Dynamic chunk streaming from basalt-world

  • Use noise terrain with seed 42

  • Block breaking and placing with creative inventory

  • Add event types, context, and response queue

  • Add ChatHandler plugin

  • Add BlockInteractionHandler plugin

  • Add movement, world, and lifecycle handler plugins

  • Wire event bus into play loop and connection lifecycle

  • Add StorageHandler plugin for chunk persistence

  • Add built-in plugin crates under plugins/

  • Use plugin crates and ServerContext from basalt-api

  • Config-driven plugin registration via basalt.toml

  • Structured logging with log crate and PluginLogger

  • Add CommandPlugin with gameplay and admin commands

  • Command dispatch, declare commands tree, and tab-complete

  • Rewrite all commands with builder API and variants

  • Handle broadcast channel lag instead of silently dropping

  • Handle bind and accept errors gracefully instead of panicking

  • Reuse shared reqwest::Client for skin fetching

  • Remove unsafe lifetime extension for world reference

  • Update plugin tests to use Arc instead of OnceLock

  • Add keep-alive timeout and client input validation

  • Add [server.performance] config section with chunk_cache_max_entries

  • Add project README

  • Add tick loop, channels, and message types

  • Implement two-loop architecture with dedicated threads

  • Migrate game loop players to ECS entities

  • Add Position and BoundingBox to player entities

  • Sync player position to ECS on every movement packet

  • Restructure messages and channels for single loop

  • Absorb network loop into game loop

  • Instant chat/commands in net task

  • Rewire server star...

Read more