Všechno, co jsme vydali

Beta

STYGION Keystone b0.3.0: co je nového

NeoForge only. Keystone is built for NeoForge on Minecraft 1.21.1 and 26.2, two jars instead of four. The last Fabric build stays on CurseForge and keeps working; it gets no further updates. A Fabric server that wants what comes next moves to NeoForge, where the same config files and keystone.db carry over unchanged.

Keystone in the player's game, too. The client half - the same jar, in the game - now draws real screens and a HUD, in the look of stygion.eu by default (direction D: panels with hard shadows, the three stripes, Archivo and Atkinson Hyperlegible Next, carried in the jar under the SIL Open Font License) or whatever theme the player picks. Everything is off until the owner turns the module on, and a player without the client half loses nothing: every screen has its chat or chest version. Nothing here depends on STYGION.

  • K opens your hub: tiles with live numbers for what this server has - quests and contracts (done today, when they reset), lists, the market and crates (your keys), badges and what is new (today's vote, the changelog). A tile appears only when the server has that part switched on for you.
  • Keystone Settings (the hub's gear, the small Keystone button on the title and pause screens, /keystone settings, or Config in the mod list; their own key is unbound until you bind it): Chat, HUD, Ultimine, Notifications and Theme, each with a live preview. Kept on the player's own machine (config/keystone-client.json); what the server locked is shown as locked. The menu button finds a free place beside the game's buttons, clear of other mods'; a pack moves it or turns it off (menu-button in its file).
  • Themes are data, never code. A theme is a small subset of CSS (config/keystone/themes/<name>.kcss on the server): colours, borders, corners, hard shadows, the stripes. Four come with the jar - Night (the default), STYGION, Mist and High contrast - and a player may make their own and share it as a code (theme.own lets them; theme.offered says which).
  • The HUD (module client): a small panel that covers nothing. By default only the quests, top right: TODAY · 2 / 3 and when they reset, at most three (hud.quests.rows), one thin bar, a finished quest says done and folds away; never wider than hud.width percent of the screen, long names wrap rather than being cut. A player turns on more in Settings → HUD: where you are, the server (ping, TPS, players, the next restart, today's vote), you (coins, keys, rank, badges), pinned lists and the owner's own panels, and drags, scales or hides what the server did not lock. Panels keep out of the way: each takes the first free place from its corner and moves when something appears - effect icons, boss bars, Jade, the chat (open or not), the scoreboard, the hotbar, and the JourneyMap and FTB Chunks minimaps where their own settings put them; hud.avoid names places for any other mod. Values arrive every hud.every and only when they changed; any module or addon adds its own with ClientToolkit.hud.
  • Notices slide in at a corner for a badge, a quest done, a mention, a team list, a job, the restart; the player chooses which.
  • Daily and monthly quests (module quests, off by default): each player their own from the owner's pools, three and three by default, a re-roll a day, streaks with rewards of their own, rewards of any kind (items, crate keys, XP, a rank for a time, a badge, any command), counted from the game's own statistics and Keystone's events (mining, building, crafting, travel by foot, boat, minecart or elytra, kills, fishing, trading, votes, biomes and dimensions). Blocks a player places and breaks again do not count, and building counts only once it has stood for anti-farm.window. /quests opens the cards; a star pins one to the HUD.
  • The market catalogue: /market opens a searchable list of every Create Table Cloth shop - what it sells, for what, how many are left, whose and where, how far and which way. "Show on map" adds a waypoint in JourneyMap or FTB Chunks when the player has one (through their public APIs, never a dependency) and always a beam in the world and an arrow on the HUD (market.map).
  • Crates spin: /crate open turns a reel of prizes that slows down onto the win the server decided before it started; /crate open all turns the cards over one by one. A click skips.
  • Ultimine: more shapes, filters, a new outline. New shapes: tall tunnel, wall (the 5x5 across the face), whole tree, shapeless-any and the player's own (built in Settings). Each player picks what a tunnel may take - the same block, ores only, or anything allowed - from filters.allowed; shapes.permissions and filters.permissions keep some for some, and keystone.ultimine.any allows every shape and filter. The outline is drawn as one shape - only its outer edges, its faces faintly lit, fading in, pulsing gently and fainter through blocks - with the block count by the crosshair.
  • What's new, once after each update (module changelog): the owner's https page ({lang} for the player's language) or Markdown in the settings, drawn by Keystone's own light renderer - headings, paragraphs, lists, bold, italic and links, nothing that can run. /changelog opens it any time.
  • Your own menus and HUD panels (module menus): buttons with an item for an icon and a command run as the player who clicks, with their own permissions (/menu warps), and HUD panels of text with {placeholders}, all written as lines the editor shows.
  • Lists and jobs on screen: the lists with what each item still needs and who is getting it, pinned to the HUD; the board of offers and requests, with the reward picked from the inventory.
  • Pictures and GIFs from Discord: a picture posted in the bridged room gets a View button under its line for players with the client half, and opens in a window of its own, GIFs moving. The server fetches it from Discord's own addresses only and sends small frames, so a player's game never connects anywhere (discord.pictures). The chat itself keeps the game's look in this version.
  • FPS by mod: Settings → HUD → Measure 30 s samples the game's render thread and shows how many milliseconds of each frame every mod took, with the average and 1% low FPS, to copy as text. Nothing leaves the machine.
  • A modpack's look for the game's own screens: config/keystone-pack.json (the pack's file, not the player's) sets the HUD's colours and places it keeps clear of, the colour of container labels on every screen of the game's own and the screens it names, and tooltip colours on 1.21.x; colours as #AARRGGBB.

Addons reach all of it through the new public ClientToolkit (ModuleContext.client()): send data, open a screen, show a notice, put a value on the HUD, hear what a client sends back. Player.runCommand runs a command as a player with their own permissions.

Every vote, to your own vote page. votes.report.url (owner only, https) receives each accepted vote and, every report.every, the vote lists with their waits - for a full vote page on your website. Off until set.

Addresses Keystone posts to are checked once and connected to. Ticket forwarding, the vote report, the market webhook, the badge source and the changelog page now go only over https, never to an address inside the network (written as a number or behind a name), never follow a redirect, and connect to the very address that was checked, so a name cannot change its answer in between. Who may set any of them is the owner alone.

/back goes to whatever happened last. Until now a death outranked every teleport after it, so a player who died, respawned, later took /home and typed /back was sent to the death, not to where they had just been. Now /back goes to the spot before the latest of the last teleport and the last death, and using it saves the spot it left, so a second /back undoes the first - across dimensions too. back.prefer-death is retired and ignored. Teleports by vanilla /tp or another mod are remembered only when you switch on back.detect-teleports (off by default), and even then only for players with keystone.back.external (operators have it): Keystone cannot tell who asked for such a move, and a jail or minigame teleport must not be undone with /back. A respawn is never taken for a teleport. A mod that moves people for its own reasons emits the new API event ForcedTeleport, and /back forgets that player's spots; a staff /tpahere bring counts the same way.

Lighter on the server. The alert that says the server stood still stays quiet for the first minutes after the world opens (alerts.stall-grace-after-start, 3 minutes) and for 30 seconds after /keystone reload: a world settling is not a problem worth a ping, and stalls in that window are still kept in the metrics. The list of loaded mods is built once per start instead of on every question, the groups a player is in are worked out once and kept until something they hold changes, and hashing mod jars (for the server list and the benchmark) now uses at most a quarter of the machine's cores at a time instead of all of them.

Update without fear: the new guard module. Every start that runs ten minutes (good-after) is kept as the last good one - its mod jars as hard links, its config files copied. The next start that differs says what changed: mods updated, added and removed, what a removed mod takes out of the world (its blocks, items and entities), the config files that differ, and - worth reading twice - a jar whose bytes changed while its version did not, or one neither CurseForge nor Modrinth publishes (check-portals, only hashes leave the machine). The crash doctor reads the game's crash reports and says the cause and the mods it points at, in the editor and on Discord. /keystone guard rollback confirm (or one button in the editor's Updates & crashes screen) puts the last good start back when the server next stops; what it replaces is kept aside, never deleted. After crash-limit (3) boots in a row that crash, an update Keystone applied is rolled back before the next boot opens a world (rollback = updates-only, or always), or the server starts closed for maintenance so the same crash does not repeat. The modpack can update itself from CurseForge (update.*, off by default): a new server pack is downloaded off the server thread from CurseForge's own hosts, checked against its SHA-1, prepared with your extra mods and your config changes kept, backed up and swapped in at a restart with nobody online. Backups can leave the machine (offsite.*): to any S3-compatible bucket (AWS, R2, B2, Wasabi, MinIO, Hetzner) or over SFTP, streamed and sealed with your passphrase (AES-256-GCM), and a weekly restore drill fetches the newest one and reads its level.dat and every region file.

A profiler that says whose code it was. /keystone profile [seconds] (or the editor's new Profiler screen) samples the server thread with Flight Recorder - nothing is slowed down - and keeps a report as a page: every mod in milliseconds of each tick, alone and with what it called, a flame graph, the costliest kinds of entity and block entity (a jet engine, a drill), and the hottest chunks with whose claim they are and a teleport to go and look. Live mode repeats ten-second runs while the screen is open. A report leaves the server only when you turn profiler.share on and say where.

Your own badges, an exchange, a market list. The badges module (off by default) gives the server badges of its own, written in badges.badges or the editor: earned by a rule over anything Keystone counts (played>=24h, mined:minecraft:diamond_ore>=100), held while in a group or wearing a tag, given by /keystone badge give, or read from your own https source; {badges} puts the icons in chat and the tab list, /badges lists them, and addons hear BadgeChanged. The exchange module trades items for items at a fixed rate in the game's own trading window - a coin bank, say: /exchange (rename it /bank) or a figure players click, which Keystone keeps standing; only genuine items are taken in, and every opening is a window of its own with nothing shared. The market module finds every Create Table Cloth shop in the loaded world and lists what it sells, for what, whose and where (/market [item], GET /v1/market, your webhook). essentials.info.commands makes commands that answer with your own text (/store, /vip with {group} and {group-until}). Teams can add up their claim bonuses (territory.team-bonus = sum), and a website can spend the code /link shows (POST /v1/links/redeem), so a player can link an account without Discord.

Lists and a contracts board. The lists module (off by default) keeps lists of what a player - or their FTB team - still has to gather (/lists, /lists team <name>, /lists add <list> <count> <item>, /lists take to say you are getting it), counted on its own from inventories and from containers marked with /lists mark (anything that lets its items be read through the loader's item handler, in loaded chunks only), and a list from a Create schematic uploaded to the server (/lists schematic <name>). The jobs module (off by default) is a board of offers and requests between players, /jobs: the reward leaves the poster's inventory when the contract is posted, whole stacks with all their components, and the server holds it until the poster confirms the work - then the taker gets it, or finds it waiting when they next join. Cancelled or run out of time, it goes back. A dispute opens a ticket and freezes the reward until staff settle it (/jobs settle <id> pay|refund). Money from another economy mod only through commands you write (currency.take-command, currency.give-command). GET /v1/lists, GET /v1/jobs, and addons hear ListChanged and JobChanged.

A mining Nether, or any other world. The worlds module makes dimensions from templates (normal, amplified, caves, ore world, flat, void, arena, a second Nether or End), resets them on a plan (first monday 05:00, monthly 1 05:00, weekly, every 14d) with a new seed if you want one, keeps the spawn exactly as it was, releases claims and forgets homes in them, and sets rules per world: homes, claims, force-loading, PvP, keep inventory, blocks that may not be placed. warp=<name> makes the warp to a world's spawn; a roofed world gets a platform safe from lava. One restart, and the world is there.

A stall is said while it is still happening. Until now the alert measured the gap between two ticks, so a server thread stuck in a loop - which never gets to the next tick - was never reported. A watch thread now sends the alert as soon as the server has stood still for alerts.stall-longer-than, writes a dump of every thread to logs/keystone-stall-<time>.txt (and another every alerts.stall-dump-every, 10 s, while it lasts - the dump names the mod whose code is looping), reminds every alerts.stall-remind-every and says when the server moves again. It never interrupts or kills anything. alerts.stall-watch switches it off.

Addresses in your announcements are links, even without a path. A bare map.stygion.eu in announce.notices or any other text from the config is now clickable, like stygion.eu/discord already was; file names such as keystone.toml stay text.

/tpa to somebody in the air lands you on the nearest safe ground below them instead of refusing with "no safe place".

/sethome on a ship (a Sable / Create Aeronautics contraption) says plainly that a home there would stay behind in the air, instead of saving one.

No ultimine cooldown for whoever you say. The permission keystone.ultimine.instant skips the cooldown between veins (the same shape as keystone.tpa.instant and keystone.rtp.instant); give it to a group such as VIP. Nobody has it by default, so nothing changes until you grant it.

A backup no longer freezes the server for a second or two. Until now a backup began by writing every world to disk on the server thread and waiting for the disk to finish (the same wait as /save-all flush), which on a large modded world stopped every tick for 1-2 seconds, every time. Now the server thread does only what the game's own autosave does - hands the changed chunks, entities and saved data to the game's writers and switches saving off - and the wait for those writers happens on another thread. The copy starts only after the chunk, entity and points-of-interest writers report that everything handed over is on disk, and every file is checked again after it is copied: one that was written to meanwhile is copied again, and one that never stands still fails the backup (which is then removed whole) instead of leaving a half-written region inside it. A chunk that is in the middle of unloading at that moment keeps the version last written, as it would after a crash. Nothing to configure; the log says how long the server thread was busy (saving is paused after N ms).

Milestones from tags. Whatever marks a player with a vanilla entity tag - a quest mod's reward command, a datapack, /tag - becomes a milestone Keystone remembers once per player: module milestones (off by default), watch names the tags (stygion_quests.*), commands and announce say what happens, the TagGained event tells other modules and addons, and GET /v1/milestones (stats.read) lists who reached what for anything outside - a website's badges - to award its own way. No quest mod is a dependency; nothing is sent anywhere.

Benchmark v2. /keystone test measures in its own dimension with a fixed scene and fixed placement, ramps the load until the server drops to 1 TPS, and says what each mod cost the tick per phase, with a 95 % interval (and "in the noise" where the interval reaches zero); a noisy window is measured once more. Every run keeps its raw evidence, checks itself for plausibility before anything leaves, and is sent in the new envelope (schema 3) only as the opt-out consent says: a one-time notice says what goes where and how to stop it, and share-live = false in bench.toml keeps an existing "no". The editor shows the per-mod costs and the windows measured twice.