Skip to content

KCDS 1.0.2

Choose a tag to compare

@github-actions github-actions released this 08 Nov 19:27
87db2b5

KCDS 1.0.2.

KCDS 1.0.2

Snow, two maps on one server, a new server browser, a lobby before the world, lead ropes between
players, server-side sounds, many fixes asked for by server owners, and a fix for games that died
with a lost graphics device while starting.

Servers and players both need 1.0.2: a client and a server of different versions refuse each other
when joining. The launcher updates itself on the next start; servers update from their update
channel, the new packages or the Docker image ghcr.io/kcd-synced/kcds-server:1.0.2. One script
change: Player.equip now returns { ok, code, ... } instead of true or false (see below).

Fixes

  • Games that died while starting, with "D3D12 Device Removed" in the game's log or "Nvidia
    Aftermath caught a GPU crash" (RTX and Radeon cards alike): the client's start-up check of the
    graphics hooks borrowed the game's own graphics device while the game was still starting. It
    now uses a device of its own, and the chat overlay draws on the queue that shows the frame.
    Crash reports also carry the graphics card's crash dump when there is one.
  • Asset/Animation Studio after World Architect: opening the Studio after World Architect left
    its panels dead (only the camera moved). Fixed.
  • NPCs at doors: a villager no longer stops in front of a door and stands there when a player
    is near it, and a door a script locked now holds for the level's NPCs too.
  • playAnimation: a one-shot animation that plays to its end frees the player; before, a
    movement lock stayed until the script stopped the animation.
  • Client scripts no longer stall when they read the game's screens (NativeUI.element) while
    the game is still loading them.
  • Door.find takes a door's GUID in either order, the one World.raycast gives and the one the
    server shows.
  • Level people: a woman of the level gets a woman's body (her name matched her look before
    only for men).
  • Action hints: a hint on X takes the key press even where the game uses X for the horse
    whistle.
  • A server's loading page stays over the server browser when a player joins again from the menu,
    and the browser fits a small or nearly square game window.

Snow

  • World.setSnow({ amount, frost, freezing, flakes }): a server lets it snow in every player's
    game. Snow lies on the ground, roofs, rocks and trees (not on people) and buries the grass;
    flakes fall around each player. There is no snow under the roof over your head, and none on the
    ground under a roof. World.snow reads it back, and {} melts it. The cover costs no frame time
    of its own; flakes do (about a tenth of the frame rate for 1000 flakes), as the docs say.

Servers

  • Two maps at once: maps in server.json runs Trosky and Kuttenberg together, and the game's
    own travel between them works. World.maps, Player.map, Player.setMap(map, position), the
    events playerTravelling and playerMapChanged. A server without maps runs one map as before.
  • Lobby: Player.setLobby(true) holds a player out of the world while they log in or make a
    character: nobody sees or hears them, they hear nothing of the world, they are out of voice chat
    and the server's loading page stays up. Player.inLobby, playerLobbyChanged.
  • Server browser info: description, tags (from a fixed list) and website in server.json
    show in the new browser.
  • Lead ropes: Player.setLeadRope(target, { from, to, length }) ties a rope from a player's hand
    to another player or an NPC, drawn smoothly by every client, late joiners included.
    horse.follow(target, { rope: { at: 'neck' } }) ties a horse's rope where the script says.
  • Sounds from the server: Audio.playAt(trigger, position, { range, dimension }),
    Audio.playFrom(trigger, entity) and Audio.list(prefix).
  • Equip: Player.equip(item) and Horse.equip(item) put one piece on, a plain item or one with
    its own metadata. Player.equip returns { ok, code, revision, items } like Inventory.add,
    and a piece that cannot go on says why in conflicts. For example, a helmet needs a mail coif
    under it: { rule: 'needsFilled', slot: 'head_helmet', needs: 'head_coif_padded' }.
    Inventory.set names its conflicts the same way.
  • Character creator for a server's own editor: CharacterCreator.open({ panel: false }),
    preview, look, frame, accept, cancel and characterCreatorChanged.
  • Crafting.addStation takes mode: 'press' | 'hold' and holdDuration.
  • World.SHARED_DIMENSION, the dimension everyone starts in (4294967295).
  • Markers go down to 0.05 m.
  • Server TypeScript projects get the types of fetch and WebSocket with "DOM" in their lib.

Client scripts

  • nativeScreenOpened / nativeScreenClosed and NativeUI.openScreens() for the game's own
    screens (inventory, map, journal and the rest), not only the Esc menu.
  • LocalPlayer.knockedOut and the events localPlayerKnockedOut / localPlayerRevived.
  • Hud.rect('vitals'): where the game's health and stamina frame is on the screen.
  • Web views paint at the display's refresh rate (up to 240 a second), so typing and clicking in a
    server's page shows sooner.

Server browser

  • Rebuilt: lists (All, Favourites, Recent, Localhost), filters (has players, not full, ping under
    60 ms), tags, search, and rows that open for a server's picture, description, address, version
    and website. Each listed server's ping is measured and shown.

World Architect

  • Copy several things at once: Shift with Select builds a group, Ctrl+C copies it and Ctrl+V
    puts it down where you point, a whole castle included.
  • Panels resize by dragging their edges, and the dock folds to its tabs.
  • The angle snap goes down to 1 degree and off.
  • Grass works when the editor starts from the main menu (clear nature, ground changes, add nature).
  • The editor name button shows that it opens the Saves tab.

Downloads (public):

Unpack the Client zip anywhere and follow its README.txt.