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.