- bone_scale_limit in ReSkateServer.json, and the bone-scale command:
the most a bone may be scaled in the poses the server passes on, 1 to
8, and its inverse the least. 1 shows every skater at the game's own
proportions; 0 (the default, "bone-scale off") is no limit
- A "big head" mod sets one joint's scale in the body's bind pose
(animation/dingo/cas_rsp_body_bind, the head from 1 to 4). The game
applies it to the bone, and the bone's scale travels in every pose,
which is how players without the mod see it. The game's own skeleton
has no scaled joint, so 1 changes nothing for anyone else
- The player with the mod still sees it on their own screen: the server
decides only what the others are sent
- Changing it sends whole states again, so nobody keeps a reference
with the old sizes in it
- Dedicated servers only; a lobby's host has no such setting
Game
- Player distance (Settings > Interface, "player-distance"): how far
away another player is still built as a skater, 50 to 1000 m, default
120. Past it they keep their nametag or dot. All the way up shows
everyone. A player already shown stays until 15% further out, so one
skating along the edge is not built and taken down over and over. The
game ran a full skater for every player on the server wherever they
were, which is most of a frame on a full one
- Nametags are always ReSkate's own. The "ReSkate nametags" toggle, the
"Nametag style" button and the nametag-style command are gone; the
game's own nametags are never shown
- Nametag distance ("nametag-distance"): how far away a name still
shows before it becomes a dot, 10 to 500 m. Default 120, was a fixed
150, so by default the name and the skater go at the same distance
- Nametag dots ("nametag-dots"): off hides the dots for far players and
the ones at the screen's edge for players off screen
- Friends' nametags only ("nametags-friends"): only Steam friends get a
name or dot; chat bubbles still show for everyone
Server
- A player out of sight of another (half as far again as the low rate
starts, 255 m by default) is sent to them once a second instead of
five times. On a full server most players are out of each other's
sight, and at five a second each they were most of what was sent
- Rotations are rounded before a pose is passed on, more coarsely the
further away the recipient is: 0.04 degrees within the full rate's
reach, 0.16 within the half rate's, a third of a degree past that,
about 5 degrees out of sight. The pose is still an ordinary one. A
bone that turned by less than a step is the same bytes as before, so
the difference from the reference leaves it out, and the low bits of
the ones that did turn pack away. By distance only: a player the
crowd limit slowed keeps the fine rotations
- A recipient crossing from one precision to another is sent a whole
state of that player, since a difference from a reference of another
precision would carry every bone again
- "net" shows the size of the poses sent at each precision
Profiler
- A function in ReSkate.dll is reported by its address when the DLL has
no symbols. A release build named every one of ours as the nearest of
three exports, so a report could not say which was slow; the
release's symbols name the address afterwards
- The crowd limit always sends a player the nearest 8 others at the
full rate and the next 12 at ten a second, whatever the budget. It
gave everyone the low rate first and the nearest what was left, and
with enough players on (about 120 at the default budget, fewer at a
lower one) nothing was left: nobody was at the full rate, and since a
skater's sound follows the full rate, nobody was heard either
- Whole pose and sound states are sent every minute instead of every 8
seconds. A whole pose measured 3.7 KB against 0.7 KB for a difference
from one, however old the reference, and at every 8 seconds they were
about a seventh of what a busy server sent
- "net" lists which of Steam's relay locations the connections go
through, and "net <player>" that player's: Steam reports pings of
several hundred ms on a server measured at 55-84 ms directly, and
this says which way the route went
Server
- Dedicated servers run at 20 network updates a second, fixed for now:
whatever tps says in ReSkateServer.json is read as 20, and the tps
command no longer changes it. A busy server's traffic, in and out, is
its players' poses, and 20 a second is a third less than 30. Lobbies
keep their own choice
- A player who has not moved or turned for three seconds is sent on at
five poses a second; the full rate is back with their first movement
- "net" shows what a pose costs as sent, and what it would cost against
a reference renewed every second, every quarter second, and against
the pose before, measured on every fourth pose that arrives. It only
measures: a nearer reference packs smaller, and this says by how much
before the server is made to send them that way
Game
- The "/" menu on a dedicated server lists /w for everyone, and /msg,
/msg-party and /msg-admins for admins. The server already answered
them; the menu is the game's own list and never had them
- The map command, from the console or an admin, refuses a map the
server does not have: the game's own maps are always allowed, a
custom one only when its mod folder is in the server's Mods. It
accepted any level path before, so a server could move everyone to a
map it had no mod for
- A map setting in ReSkateServer.json that names a map the server does
not have now stops the server at start, saying to add the map's mod
or change the map
- The map change itself checks too, whatever asks for it. Votes,
rotation and the map pool were already limited to known maps
- The MODS tile shows the skate tool again, faded like the wheel on
SETTINGS. Thunderstore's mark is no longer drawn there
- The mod manager's Thunderstore button is laid out as a link sign, the
name, then Thunderstore's mark at the far end, so it is plainly a way
out to a website. The sign is drawn (a box with an arrow leaving its
corner); the name is no longer in capitals
- It keeps Thunderstore's green on its dark blue and its height
- The MODS tile shows Thunderstore's mark in its own green instead of
the skate tool, which stays as the fallback when the mark is not
built in
- "Open Thunderstore" in the mod manager is a branded button: the mark
and name in Thunderstore green on its dark blue, taller than the
plain buttons beside it
- The mark is a new asset, assets/launcher/icon_thunderstore.png,
embedded like the other tile icons
- A disabled mod's update is no longer asked about before PLAY or
counted on the MODS tile, and "UPDATE AND PLAY" no longer installs
it. A disabled mod does not load, so its update stays on the Mods
page, where it can still be updated by choice
No protocol change: a server built from this still takes 1.1.4 players.
Server: what each player is sent
- A crowd limit: each player is sent at most crowd_budget poses a second
(default 600, 0 for none; "crowd <n>|off"). Everyone at 5 a second at
least, the nearest at the full rate, the next nearest at 10. Before,
everyone within full-rate distance was sent at the full rate, which a
crowd of 40 turned into more than a connection carries
- A skater's sound goes only to players within the full-rate distance,
and in a crowd only from the nearest; it went to everyone
- A player who joins, or arrives after a map change, is shown the others
about seven a second, nearest first, and none while what they were
already sent is still on its way. Before, every outfit and every
stream went at once (and to everyone at once after a map change)
- Whole pose and sound states every 8 seconds instead of 2, on the
source's own clock, and slower pose rates sent on that clock too, so
recipients share one patch and compression (DeltaCache) instead of one
each. The settings survive a map change
- Object updates wait for a connection that is behind
Server: Steam connections
- send_rate (default 900 KB/s, "rate <KB/s>") is set as both Steam's
minimum and maximum, for open connections and each new one. With only
the maximum raised a connection stayed at Steam's 256 KB/s; set high,
what was lost was resent until the connection was full of resends
(about 1.1 MB/s reaches a player through the relays)
- A 4 MB send buffer, and a refused must-arrive message no longer ends
the player's session at once: 15 seconds of refusals do (30 for object
updates). A full queue used to drop everyone who was behind together
Server: seeing what is going on
- "net [player]": every connection's ping, delivery, queue and rate, the
traffic by kind (poses, sound, voice, outfits, objects), who uploads
most, and how busy the server's loop is
- A [network] line in the log every minute
- A leave or failed join says how it ended: closed by the player's game
with Steam's reason, connection lost, or closed by the server and why
- The queue time no longer prints Steam's "unknown" as a number
Server: other
- Reserved slots: reserved_slots and reserved in ReSkateServer.json, and
the "reserved" command; admins always have one
- The speed check flags a game at about 1.5x and over (was 1.06x), and
tells only that player; for the admins it is in the log
Game
- A remote skater with no pose for a second stays where it was for up to
eight seconds instead of being destroyed and rebuilt three seconds
later. On a busy server one slow frame did that to many players at
once, and the rebuilding made the next frames slower still
- Every waiting message is read each frame (at most 128 were)
- On an official server the role tags (Dev, Staff, Homie, Creator) show
for every player, not only the few the game is connected to directly;
community servers keep the old rule
- The server browser searches Steam at most every 15 seconds (45 after an
empty answer) and keeps the last list for 15 minutes when Steam returns
nothing, up from 2
- The game's own connections send at up to 900 KB/s
Limit how many objects each player can place (protocol 43)
- Servers and lobby hosts set how many objects each player may have
placed: object_limit in ReSkateServer.json and the "objects" command,
"Objects per player" in the host options. Default 100; 0 is no limit
- The host and a server's admins are not limited
- At the limit a player's game refuses another object, from the native
object tool and the park editor, and the menu shows how many they have
placed
- Enforced by the host or server, which shows everyone no more than the
limit of each player's layout; objects already shown keep their place
- The limit travels in the roster, which takes the protocol to version
43: builds before this cannot join sessions with builds after it
- The protocol tests link again (the server browser needs the identity
lists since the official servers change)
- The server browser opens sorted by most players, in the overlay and
the native menu; official and friends' servers still come first
- Dedicated server names may contain "/" (builds before this hide a
server whose name has one)
Server browser
- Official servers (the backend's "official_servers") sort first and are
drawn in ReSkate blue
- Servers Steam friends are skating in sort next, drawn in green with the
friends' names; searching a friend's name finds their server
- A player in a session they joined can join another server straight from
the list; hosts still end their session first, and a Steam friend's join
offer never replaces a session
- Joining a dedicated server from the list records it as the player's
public session, so friends see it and the row shows HERE
- Blocked servers (the backend's "blocked_servers") are hidden and cannot
be joined, by code either
- When the backend sets "server_tokens_required", dedicated servers that
signed in without a login token are hidden, except on the player's own
network
- A search that gets no internet list from Steam keeps the last list for
two minutes, and waits six seconds before treating it as empty
Roles
- New Staff tag from the backend's "staff" list: green name, badge and
item animation, ranked after Dev
- Staff can pick a rainbow for their items on the Special page; it is sent
as a solid colour older builds can show, so the protocol is unchanged
Dedicated server
- steam_token: sign in with a Steam game server login token and keep the
same Steam ID every start; empty signs in anonymously as before
- A listed server without a token says so at startup, and when the token
rule starts or stops hiding it
- Linux servers update themselves from the release's "server_linux"
tarball, with the machine's curl and tar, pinned by SHA-256, and carry
on in the same process
Launcher
- Only create the MiniDumpWriteDump API-set shim under Wine/Proton
Each built its text with path::string(), which throws for a character outside the ANSI code page, so the real error or message was replaced by a code-page error.
Toolhelp returns module paths through the ANSI code page, so a folder like "Skate Тест" came back with '?' in it, the injected DLL was never matched, and the launcher killed the game. The loader's own list keeps the real path.
- Mod merge: rebuild a merged bundle's chunk metadata the way the game
writes it (one record per chunk, in chunk GUID order), so costumes
from different mods built on the same game costume keep their
textures and meshes
- Merge audit checks that layout, and there is a new unit test for it
- Server names: only letters, numbers, spaces and - _ [ ] ( ),
1 to 64 characters; the server browser hides servers with other names
- New Centrix tag from the backend's "centrix" list: blue and white
name, badge and item animation, ranked after Dev and before Creator
A player's recent chat lines show as speech bubbles above their skater: newest nearest the head, older lines stacking upward, each popping in with a slight overshoot before it fades. Emotes render as their images, a message that is nothing but a few emotes shows them jumbo, and a message longer than a handful of lines is cut with an ellipsis so one line can never wall the screen off.
Local display options live under Settings > Interface > Multiplayer (on/off, own messages, distance, duration and how many recent lines stack) and the console gains mp chat-bubbles, chat-bubbles-own, chat-bubbles-distance, chat-bubbles-duration and chat-bubbles-history.
The chat panel and the bubbles now share one rich-text module (chat_rich), and a filtered message keeps its emote names: the bad-word mask is applied, but emote tokens are put back from the original before they are parsed.
Merge: carry added assets with a changed list, combine in-place values, list repeats once
Three merge bugs found by auditing 104 installed mods:
- A changed list (the music playlist) reached every bundle copy that holds
it, but the songs a mod added beside it only reached copies of the bundle
the mod added them to. The game keeps the playlist in eight bundles, so
the other seven named songs they did not hold. Added assets now follow
the change into whichever bundle copy takes it.
- An entry naming an asset that lost its name to another mod's asset is
now dropped from the list, both in the merged bundle and in the list
other mods' copies are given.
- Two mods changing values in place in one asset (lighting) kept one mod's
copy whole and silently dropped the other's. Plain values are now
combined, the higher-priority mod winning where both changed one. An
edit that also moved a reference or resized a list is taken whole or not
at all, and the merge notes whose changes are missing.
- A reference two mods both append to a list is listed once.
In a server folder outside the ANSI code page, path.string() threw while building the error for a failed config write. At startup that second throw escaped the catch in main, so the server crashed with an empty log instead of saying it could not write the config.
- Mods that add copies of store items under new names are no longer
loaded. The launcher, mod manager and game say why.
- A chat line passed on by the host only shows a Dev/Creator/Homie
badge when the player's own copy of it arrives too, so a host
can't put one on a line that player never wrote.