Releases: basalt-mc/basalt
v0.1.0
[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...