Everything we published

Beta

STYGION Keystone b0.2.8: what's new

The pack's data, in one file, for whoever builds on it. Start the server with -Dkeystone.export=pack-data.zip (or KEYSTONE_EXPORT) and once it is up Keystone writes one zip: every item, the item, block and fluid tags with nested tags resolved, every recipe of every type - from the game's own API and from the recipe's JSON where the API says too little (Create's extra results and chances, fluids, Mekanism's chemicals, sequenced assembly) - the advancements with what each step waits for, every loot table with who drops it (a mob, a block, a chest), and the English and Czech names out of the mods' own files. -Dkeystone.export.stop=true stops the server after. On a running server the same dump is POST /v1/export with a key holding pack.read. Nothing leaves the machine: it is a file on the server's disk, written only when asked for, never larger than export.max-mib (512). STYGION Workbench builds quests from it; the format is documented, so anything else can too.

And the pack's icons, drawn by the game itself. A client with Keystone started with -Dkeystone.export.icons=icons.zip (or KEYSTONE_EXPORT_ICONS) waits until it has loaded, draws every item exactly as an inventory shows it - 3D blocks, mods' own renderers - and every fluid as its tinted texture, 64×64 with a transparent background, writes one zip and closes. Minecraft 1.21.1 for now; on 26.x it says so and closes without drawing.

Your own world is yours. In a world opened in the game itself - singleplayer, or one opened to LAN - Keystone limits nothing by default: no Discord link to join, no waiting for a home, a teleport, /back or ultimine, and whoever opened the world gets the best rank's limits - every kit with no wait, the biggest vein, the most homes and claims, the best crate odds, /fly over their land. LAN guests join without a Discord link too and keep the default rank; on a LAN world without Mojang's check nobody else may use the host's name, and being the host is decided by the game's own in-memory connection, never by a name or a UUID. It is a profile, not a rule: singleplayer.profile = "server" makes such a world behave like a dedicated server, singleplayer.rank names the group, singleplayer.settings lists what an open world reads instead of the files. A dedicated server reads none of it. For mods: Game.integrated(), Game.isHost() and ModuleContext.unrestricted(player).

/feedback <message> just works. A shortcut from tickets.shortcuts that is not one of the ticket kinds used to answer only "no such kind"; it now opens the ticket for whoever answers the default kind, labelled as typed.

/crate open all opens every key at once (up to 100): no spin, one list, the best in the title, and wins from announce-from up announced as ever.

The vote party works again. 0.2.7 built its party show before reading its settings, so the party's bar threw every five minutes and a party reached would have thrown too.

A gift says who it is from. POST /v1/players/group takes from - carried on the grant itself (GrantChanged.from()) - and celebrate.gifts (vip | &a{player} got VIP from {from}!) is what the celebration says then. celebrate.sources also takes one source exactly as kind:detail - a shop granting through its own API key is other:<key name>, which a celebration limited to shop never matched.

A recipe the codec will not write keeps what the game knows. Such a line in the pack data dump has its inputs and outputs from the game's API and the reason in raw_error, instead of an error line with nothing in it.

Whole numbers read by the API stay whole. A number read from JSON came back as 8.0 instead of 8 - in the frozen bench report and in JSON-RPC ids.