Skip to content

Releases: vib-studios/vib-MC

v0.0.7

Choose a tag to compare

@gabytz777 gabytz777 released this 28 Aug 16:24

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

Choose a tag to compare

@gabytz777 gabytz777 released this 28 Aug 11:16

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

Choose a tag to compare

@anmvc anmvc released this 27 Aug 15:38
312e25e

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 / TextureProperty directly
  • User.sendPacket(wrapper) replaces the old PacketEventsSender / PendingConnection facade — 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 ServerPlayer is created immediately for every PacketEvents User, 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

  1. PlayerManager reserves chunk coordinates in expanding rings
  2. WorldChunk provides PacketEvents WrappedBlockState sections and semantic biome data
  3. PacketEventsChunkAdapter creates 1.12-compatible Chunk_v1_9 sections, palettes, block light, skylight, byte biome data, and full Column
  4. WrapperPlayServerChunkData sends through User.sendPacket(...)
  5. 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 WrappedBlockState objects directly
  • Inventories use PacketEvents ItemStack / ItemType directly
  • 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

  • /op and /deop write UUID-based, vanilla-shaped ops.json entries
  • Operator manager uses PacketEvents UserProfile directly for server console bootstrapping
  • Permission manager checks operator status for command execution

Testing & Tools

  • Updated protocol tests for the new PacketEvents-based flow
  • New PacketEventsChunkAdapter and PacketEventsTags unit tests
  • Development tools updated for multi-version compatibility testing
  • tools/version-compat-test.js verifies 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

Choose a tag to compare

@gabytz777 gabytz777 released this 16 Aug 11:45

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.txt is 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

Choose a tag to compare

@gabytz777 gabytz777 released this 15 Aug 23:39

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=true by 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-address for 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's level.dat is the authority
  • Generator refactor: Overworld / Nether / End behind one ChunkGenerator interface
  • Vanilla-style anti-flight check: only sustained unsupported hovering gets kicked, never normal play
  • New config: shutdown-message, proxy-mode, proxy-trusted-address, documented seed

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

Choose a tag to compare

@gabytz777 gabytz777 released this 15 Aug 20:55
0fcc3d1

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-all now actually saves changed chunks.
  • /save-all reports 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=true

Set:

autosave-interval-ticks=0

to 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

Choose a tag to compare

@gabytz777 gabytz777 released this 14 Aug 15:42

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

Choose a tag to compare

@gabytz777 gabytz777 released this 14 Aug 14:57

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: setGameMode sends the Change Game State packet (0x1E, reason 3)

v0.0.4

Choose a tag to compare

@gabytz777 gabytz777 released this 14 Aug 14:03

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: setGameMode sends the Change Game State packet (0x1E, reason 3)

v0.0.3

Choose a tag to compare

@gabytz777 gabytz777 released this 03 Aug 10:14

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: setGameMode sends the Change Game State packet (0x1E, reason 3)