Repository navigation
KCDS 1.0.2
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.snowreads 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:
mapsin 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
eventsplayerTravellingandplayerMapChanged. A server withoutmapsruns 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) andwebsitein 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)andAudio.list(prefix). - Equip:
Player.equip(item)andHorse.equip(item)put one piece on, a plain item or one with
its own metadata.Player.equipreturns{ ok, code, revision, items }likeInventory.add,
and a piece that cannot go on says why inconflicts. For example, a helmet needs a mail coif
under it:{ rule: 'needsFilled', slot: 'head_helmet', needs: 'head_coif_padded' }.
Inventory.setnames its conflicts the same way. - Character creator for a server's own editor:
CharacterCreator.open({ panel: false }),
preview,look,frame,accept,cancelandcharacterCreatorChanged. Crafting.addStationtakesmode: 'press' | 'hold'andholdDuration.World.SHARED_DIMENSION, the dimension everyone starts in (4294967295).- Markers go down to 0.05 m.
- Server TypeScript projects get the types of
fetchandWebSocketwith "DOM" in their lib.
Client scripts
nativeScreenOpened/nativeScreenClosedandNativeUI.openScreens()for the game's own
screens (inventory, map, journal and the rest), not only the Esc menu.LocalPlayer.knockedOutand the eventslocalPlayerKnockedOut/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.