Releases: vib-studios/vib-MC
Release list
v0.0.7
The survival release. Everything Minecraft has that vib-MC did not, except mobs — blocks now drop, physics react, you can starve, drown, fight, craft, smelt, and store things in a chest. Same requirements as before: Java 8+, Minecraft 1.8 through 26.1.2 (minus 1.16, 1.16.1 and 1.19.3).
Mining and building
Blocks drop what you break. Until now breaking a block just deleted it, so survival had no material loop at all and everything came from /give. Drops go straight into your inventory — there are still no item entities, so nothing lands on the ground — and they respect tool tiers: stone needs a pickaxe, diamond needs iron, iron ore drops itself to be smelted. Tools take durability and break.
Blocks react to each other. Sand and gravel fall. Water and lava flow, and drain again when you take their source away. Leaves cut off from their log decay. Cacti break without sand under them or when you build against them. Water meeting lava makes stone.
Ore generates in veins, and gold, diamond, redstone, lapis and emerald exist for the first time — previously the world contained only coal and iron, scattered as single blocks.
Cacti grow in deserts, on dry sand, with the vanilla spacing rule that keeps them apart.
Staying alive
Damage has more than two sources. Falling and the void used to be the only ways to lose health. Now there is drowning with a working air bar, suffocation in a wall, fire, lava, cactus contact, and starvation — plus natural regeneration when you are fed.
Hunger is real. The bar used to sit at 20 forever. Walking and sprinting cost exhaustion, and food is eaten from the hotbar. Apples from oak leaves are currently the only food source, so they drop more generously than in vanilla.
Armour works. Helmet, chestplate, leggings and boots have real slots, reduce damage by 4% per point up to the vanilla 80% cap, and are visible on other players.
PvP works. Attacking another player deals weapon damage with knockback, invulnerability frames, and a hurt flash. Two players could not interact at all before this.
Crafting, smelting, and storage
A 2x2 grid in your own inventory and a 3x3 at a crafting table, covering tools, armour, and the usual blocks. Chests hold 27 slots and keep their contents across restarts. Furnaces burn fuel and smelt — which is what makes iron and gold ore worth mining, and iron and gold gear reachable.
Sound
The server sent no sounds, particles, or animations whatsoever before this release. Breaking and placing blocks, taking damage, dying, and swinging your arm are all audible and visible now.
Fixed
- An error inside a queued server task silently killed the tick thread. The server kept accepting connections while nothing in the world advanced again — no log line, no crash. It now survives and logs.
- Inventory clicks were never acknowledged, so clients below 1.17 stalled after the first one.
- A placed chest or furnace never opened, because rotating it on placement made it stop matching the block the server was looking for.
Notes for existing worlds
Chunks already saved to disk are not regenerated, so existing terrain keeps its old ore distribution and gains no cacti — only newly generated chunks get them. Player data has a new format that still reads old files. Dying keeps your inventory: without item entities, dropping it would destroy it.
Verifying it yourself
tools/survival-test.js (npm run test:survival in tools/) drives a real 1.12.2 client through drops, break effects, falling sand, a crafting-table window, chest round-tripping, and a reconnect that reads back the server's own restored inventory. It needs an opped bot and a fresh world.
v0.0.6-hotfix.1
Three water and flight fixes on top of v0.0.6. Same jar, same requirements — Java 8+, Minecraft 1.8 through 26.1.2 (minus 1.16, 1.16.1 and 1.19.3).
Fixed
Players no longer spawn in water. The dry-spawn search used to give up and return the column it started from when everything within range was ocean, which dropped you straight into the sea. It now scans real blocks first, then keeps widening against the terrain generator out to 4096 blocks and confirms the result against real blocks before using it. For a world with no reachable land at all there is a last-resort platform that replaces the water above the seabed. A player whose saved position is underwater is also moved to dry land on login, unless they logged out in creative or spectator.
/gamemode creative can no longer get you kicked for flying. The floating check's flag was sticky and only cleared when a movement packet arrived, so a flag raised in survival could still fire after you were legitimately flying. The exemption — creative, spectator, granted flight, movement grace, unconfirmed teleport — is now re-evaluated every tick, switching game mode clears the flag immediately, and the kick closes the connection properly instead of sending a Disconnect packet into a channel it left open. Survival players who actually hover are still kicked.
Villages are no longer generated in water. Placement scored wetness but still accepted a wet site when nothing drier fitted inside the search radius. It now widens the search out to 1024 blocks until the entire footprint is above sea level, with dryness outranking both nearness and flatness, and no village piece is ever anchored below the water line.
Note for existing worlds
Chunks already saved to disk are not regenerated, so a village that already generated in water stays where it is — only newly generated chunks get the fixed placement. A fresh world shows all three fixes immediately.
Verifying it yourself
tools/spawn-flight-test.js (npm run test:spawn-flight in tools/) drives real 1.12.2 clients against a running server and checks that the spawn is dry, that a hovering survival player is still kicked, and that a hovering creative player is not.
v0.0.6 - Multi-version and PacketEvents based networking
Networking Rewrite
The entire server networking stack has been migrated from custom Java NIO selectors and hand-rolled packet handling to PacketEvents + Netty. This is the largest change in vib-MC to date:
- Netty event loops replace the Java selector transport
- PacketEvents standalone runtime, channel injector, decoder, and encoder are now active
- AES/CFB8 encryption runs as Netty pipeline handlers
- All outbound packet families — lifecycle, entity, player list, inventory, join/respawn, and chunks — use PacketEvents wrappers
- Handshake, status, login, and play input use PacketEvents wrappers and listeners
- Chat uses
User.sendMessage(Component)with the correct legacy representation for 1.12.2 - Player profiles and texture properties use PacketEvents
UserProfile/TexturePropertydirectly User.sendPacket(wrapper)replaces the oldPacketEventsSender/PendingConnectionfacade — packets are sent directly at call sites
Removed: Java NIO selectors, custom frame parser, packet DTOs, Packet, PacketBuffer, raw packet-ID registries, ProtocolBase, Protocol340, ProtocolImplementation, AutoService discovery, and the legacy chunk serializer.
Multi-Version Support
The server now detects and handles connections from multiple Minecraft client versions through PacketEvents ClientVersion resolution. Vendored PrismarineJS minecraft-data snapshots provide registry/configuration payloads for modern Join Game dimension codecs.
Verified compatibility: Minecraft 1.8 through 26.2. Minecraft 1.16 and 1.16.1 are explicitly rejected due to incorrect packet IDs in PacketEvents; 1.19.3 is rejected because it drops a profile-key field that PacketEvents expects.
ServerPlayer Architecture
- A
ServerPlayeris created immediately for every PacketEventsUser, with nullable fields until authentication completes isInWorld()distinguishes active gameplay players from pre-login sessions- Chunk coordinates are atomically reserved before generation or sending, preventing concurrent sends from login and tick threads
- Chunks stream in expanding rings so entity and player-list packets are not starved behind large chunk queues
Chunk Pipeline
PlayerManagerreserves chunk coordinates in expanding ringsWorldChunkprovides PacketEventsWrappedBlockStatesections and semantic biome dataPacketEventsChunkAdaptercreates 1.12-compatibleChunk_v1_9sections, palettes, block light, skylight, byte biome data, and fullColumnWrapperPlayServerChunkDatasends throughUser.sendPacket(...)- PacketEvents serializes for the target
ClientVersion, framed by Netty, then encrypted
All 16 sections are emitted explicitly for ViaFabricPlus compatibility — empty sections contain a one-entry air palette instead of being omitted.
World Data
- World chunks store PacketEvents
WrappedBlockStateobjects directly - Inventories use PacketEvents
ItemStack/ItemTypedirectly - Chunk persistence format v2 stores PacketEvents wrapped-state global IDs (older worlds require reset)
- Structure palettes, terrain generation, block interaction, creative inventory updates, durability,
/give, persistence, and chunk packets all share the same semantic objects
Commands & Permissions
/opand/deopwrite UUID-based, vanilla-shapedops.jsonentries- Operator manager uses PacketEvents
UserProfiledirectly for server console bootstrapping - Permission manager checks operator status for command execution
Testing & Tools
- Updated protocol tests for the new PacketEvents-based flow
- New
PacketEventsChunkAdapterandPacketEventsTagsunit tests - Development tools updated for multi-version compatibility testing
tools/version-compat-test.jsverifies handshake across supported versions
License
Relicensed to GPL-3.0-or-later due to PacketEvents dependency. See LICENSE.
v0.0.5-hotfix.1 — dimensions you can actually use
The Nether and the End shipped in v0.0.5 generated, but were not really playable: portals were invisible and travelling to a dimension never arrived. This fixes that, and changes how you get there — nothing is handed to you at spawn any more.
Requires Java 8 or newer. Drop the jar in a folder and run java -jar vib-mc.jar.
Dimensions
- Portals actually appear. Portal blocks were sent with a block state the 1.12.2 client does not know, so it drew every portal as air — you could stand in one and never see it.
- Travel arrives. A dimension change sent a Respawn packet and never told the client where it landed, so it sat on "Downloading terrain" forever. Everything that packet throws away is re-sent behind it now.
- The Nether is a place. It was solid netherrack with the occasional bubble. Now it is an open cavern between a rolling floor and a hanging ceiling, over a lava sea, with soul sand, glowstone and quartz.
- The End has towers. Ten obsidian pillars ring the island, and the arrival platform sits in a patch of void the generator keeps clear, so you land on the platform instead of inside an island.
You build your own way in
- No free obsidian portal at spawn. Rare lava pools in a bed of stone are the obsidian supply: pour water on lava, mine it, build a frame, light it with flint and steel.
- Twelve eyes of ender in a frame ring open an End portal.
- Breaking and placing blocks did not exist before this release, which is why none of the above was possible. Digging, placing, drops into your inventory, and inventory sync are all new.
- There is no crafting yet, so tools come from
/give:diamond_pickaxe(you need it — the client decides break times, and bare hands never finish obsidian),flint_and_steel,water_bucket,end_portal_frame,ender_eye.
Everything else
- Real lighting. Sky light was worked out per column and block light was hardcoded to zero, which is why trees rendered as black lumps and glowstone gave off nothing. Both are flooded properly now.
- Fall damage, and the void kills you. Falling used to trip the anti-flight check and kick you off the server. Dying puts up a death screen and you respawn in the overworld.
- A usable console. Chunk and packet logging moved behind
log-level=debug. - EULA.
eula.txtis written on first start and must be accepted, as with vanilla. - Fixed a disconnect under load. Packets were encrypted and queued as two separate steps, so two threads sending at once could put the encrypted stream out of order and drop the client with "Bad packet id".
Not in this release
No mobs, no endermen, no dragon fight. The server has no entity layer at all — players are the only thing it sends to a client — so the End towers are scenery. That is the next thing to build.
v0.0.5 - Nether, End, and real online mode
v0.0.5 — Nether, End, and real online mode
Dimensions
- The Nether is real: netherrack terrain with caverns, lava seas, soul sand and glowstone, bedrock floor and roof, no sky light
- The End: end-stone islands floating in the void, with a guaranteed solid arrival platform at spawn
- Nether and End portals actually travel: stand in a portal to cross over (Nether coordinates are overworld ÷ 8; the End has vanilla's fixed platform). If there is no portal on the far side, one is built for you
- Existing worlds automatically get a spawn-area Nether portal and an End exit portal on startup
- Proper per-dimension sky-light handling so the Nether isn't rendered as if the sun were shining
Online mode (real accounts)
online-mode=trueby default: logins verified against Mojang's session servers using the real RSA + AES-128/CFB8 handshake- Players get real UUIDs and their real Mojang skins
proxy-mode=legacy+proxy-trusted-addressfor BungeeCord / Velocity legacy forwarding (Velocity modern forwarding isn't possible on protocol 340)- The server refuses to start on an insecure combination (legacy proxy with online mode off)
World & terrain
- Biome-aware oak tree generation (dense forests, sparse plains, none in deserts)
- Seeds: blank
seed=rolls a random seed per new world, numbers are used as-is, text seeds are hashed deterministically; the saved world'slevel.datis the authority - Generator refactor: Overworld / Nether / End behind one
ChunkGeneratorinterface - Vanilla-style anti-flight check: only sustained unsupported hovering gets kicked, never normal play
- New config:
shutdown-message,proxy-mode,proxy-trusted-address, documentedseed
Protocol & fixes
- Two wrong protocol-340 packet IDs that caused real-client disconnects
- Villages no longer place chest blocks with no tile entity (crashed real clients)
Test suite: auth, legacy forwarding, flight check, protocol, multiplayer visibility, dimension portals, seeds, terrain generation, world storage — all green.
v0.0.4-hotfix.3 — World Persistence
v0.0.4-hotfix.3 — World Persistence
This hotfix adds the world persistence system that was previously missing from vib-MC.
What's fixed
Previously, vib-MC could generate and use the world in memory, but it did not actually persist world data to disk. This meant a server could create plugins/ while having no persistent world/ directory, and /save-all could report that the world was saved without actually writing world data.
Hotfix 3 adds real world persistence.
What's new
- Creates the
world/directory at startup. - Adds persistent
level.dat. - Persists the world seed.
- Adds persistent chunk storage under
world/region/. - Chunks are loaded from disk when available.
- Chunks are generated only when no saved chunk exists.
/save-allnow actually saves changed chunks./save-allreports how many chunks were written.- Incremental saving — unchanged chunks are not rewritten.
- Automatic saving can be configured.
- Worlds can optionally save automatically when the server stops.
- Corrupt/truncated chunk files are detected and regenerated instead of crashing the server.
- Chunk writes use temporary files before replacement to reduce the chance of leaving partially written chunk files.
- Added persistence tests covering round trips, negative chunk coordinates, corrupt files, incorrect coordinates, and dirty tracking.
- Fixed the startup banner to report the actual world seed being used.
Configuration
Two new server.properties options are available:
autosave-interval-ticks=6000
save-on-stop=trueSet:
autosave-interval-ticks=0to disable automatic saving.
Important
This is still a development Minecraft server implementation and should not be considered production-ready.
Back up your world data before testing new builds.
Thanks
Thanks to everyone reporting issues and helping test vib-MC.
v0.0.4-hotfix.2
Hotfix for v0.0.4: the client now actually switches game mode. /gamemode and plugin commands that call setGameMode send the Change Game State packet (0x1E, reason 3) instead of silently changing server state, so the creative/spectator UI switch works in-game. Like v0.0.4-hotfix.1, this fix applies to all versions going forward.
v0.0.4-hotfix.1
Hotfix for v0.0.4: slash commands now actually execute. Chat messages starting with / are routed to the CommandManager instead of being broadcast as chat, so /gamemode, /tp, /time and plugin commands finally work in-game. This fix applies to all versions going forward.
v0.0.4-hotfix.2 applies here too
All releases are affected by the v0.0.4 hotfixes — grab the updated jar from the latest hotfix release:
- v0.0.4-hotfix.1 — slash commands (
/gamemode,/tp, plugin commands) now actually execute in-game - v0.0.4-hotfix.2 — the client actually switches game mode:
setGameModesends the Change Game State packet (0x1E, reason 3)
v0.0.4
vib-MC v0.0.4
Changes since v0.0.3:
- Terrain actually renders on the vanilla 1.12.2 client ΓÇö chunk data now uses the canonical 13-bit block encoding (the old 12-bit format was being interpreted as garbage by the notchian client)
- New terrain profile ΓÇö grass (2 layers) on top, stone mixed with andesite and diorite (7 layers), water up to 4 deep, bedrock at the bottom
- Spawn on dry land ΓÇö the game finds the nearest dry column instead of dropping you in the water
- Chunk streaming fixed ΓÇö partial non-blocking writes are flushed properly so terrain streams in as you move
- Protocol fixes ΓÇö client status (respawn), client settings, teleport confirm, plugin messages, keep-alive, and position packets handled at the correct 1.12.2 IDs
- Andesite/diorite wired up ΓÇö stone metadata states (stone:3 diorite, stone:5 andesite) now map correctly
Run it
gradle build
java -jar build/libs/vib-mc.jar
Starts on port 25565.
MIT. Do whatever you want with this AI-generated mess.
Hotfixes apply here
All releases are affected by the v0.0.4 hotfixes — grab the updated jar from the latest hotfix release:
- v0.0.4-hotfix.1 — slash commands (
/gamemode,/tp, plugin commands) now actually execute in-game - v0.0.4-hotfix.2 — the client actually switches game mode:
setGameModesends the Change Game State packet (0x1E, reason 3)
v0.0.3
A Minecraft server for 1.12.2, vibed into existence by AI.
What's here
Connects and lets people join
Terrain generation
Chunk rendering and streaming
Plugins, mobs, and commands
Java 8+ compatibility
Known issues
Terrain rendering is still being improved
Some features are experimental
Run it
gradle build
java -jar build/libs/vib-mc.jar
Starts on port 25565.
MIT licensed. Have fun with the AI-generated mess.
Hotfixes apply here
All releases are affected by the v0.0.4 hotfixes — grab the updated jar from the latest hotfix release:
- v0.0.4-hotfix.1 — slash commands (
/gamemode,/tp, plugin commands) now actually execute in-game - v0.0.4-hotfix.2 — the client actually switches game mode:
setGameModesends the Change Game State packet (0x1E, reason 3)