ReSkate dedicated server ======================== A headless ReSkate lobby that runs on its own, without the game. Players find it in the in-game server browser (Multiplayer > Servers), or join with its code. Start it -------- Run ReSkateServer.exe. The first run writes ReSkateServer.json next to it; edit that file (at least "name") and start the server again, then make yourself an admin by typing role admin in its window. Leave this folder together: steam_api64.dll, steamclient64.dll, tier0_s64.dll and vstdlib_s64.dll are how the server talks to Steam, and world-layers.json lets it set world layers (time of day and so on) for everyone. Start it with --config to use another settings file instead, e.g. ReSkateServer.exe --config grom.json. A file that does not exist yet is written with the defaults, as on the first run. Custom maps ----------- Copy a custom map's mod folder from the game's Mods folder into a Mods folder next to the server (its reskate-levels.json and manifest.json are read). The map can then be chosen by name. Players need the same map mod installed to join. A player without it is offered it when the map is from Thunderstore: the game downloads it, applies it and joins the server again. For that the folder has to keep the name Thunderstore gives it: Owner-Name as the launcher installs it (Sandos-Vancouver_Plaza), or Owner-Name-1.0.0 as its zip unpacks. The server tells players that name, and the version from manifest.json when the file is there. A map under any other folder name works as before: players install it themselves. Park mods --------- A park built in the game's Park Editor and saved as a mod (a folder with manifest.json and parks/.park.json) can be put up by the server for everyone. Copy the mod's folder into the Mods folder next to the server, list it in maps.park_mods with a name and the map it was built on, and spawn it with "park-mod add " while that map runs: from the console, in chat by a player whose role has park-mod (/park-mod add street 30; the admin role does, see README-roles.txt), or by a player vote (see votes.custom). With minutes (1-1440) it goes by itself when the time is up; players are told a minute before and when it goes. Without, it stays until removed. Every park goes when the map changes, and none come back after a restart. Nothing needs a restart: a mod copied into Mods can be set up with "park-mod config add" (saved to the config like the map pool), and a park whose mod was updated is read again with "park-mod reload ". Every park-mod add reads the park's file afresh. Don't edit ReSkateServer.json by hand while the server runs: it writes its settings back whenever an admin changes one. A spawned park belongs to the server, not to a player: it counts against nobody's object limit, nobody can move or delete it, and it stays when players leave. Players need no mod for it: its objects are Build Kit items the game has. An object players' games would not show (not a Build Kit item, or broken) is left out, and the log says which. A park only fits the map it was built on, so the server spawns it on that map alone, even where custom maps share a base map's parks (most use bam). The log has a [parks] line for each park spawned or removed, and for each one that could not be. Players connect through Steam's relay network, so no ports need opening. If you do forward UDP 27015-27016 (port, query_port), the browser also shows the server's ping and players can join a little faster. The server signs in to Steam anonymously and gets a new Steam ID, and so a new join code, every time it starts. The browser always finds it by name. Players and the server need the same ReSkate version. Updates ------- The server keeps itself on the latest ReSkate release. It checks when it starts and every half hour after that. A new version found while players are on is installed as soon as the server is empty: it restarts on its own, keeping ReSkateServer.json, Mods and its logs. Type "update" to check and install straight away (players are told to rejoin). Turn this off with "auto_update": false, or start the server with --no-update. ReSkateServer.json ------------------ The settings are in sections; each setting below is listed under the section it is in, like "server": {"name": "My server"}. A file from an older version, with every setting at the top and some under older names, is read as it is and written back this way the first time the server starts. "server" - The server itself: its name, who it lets in by password, and its ports. name Shown in the browser: 1-64 letters, numbers, spaces and - _ / [ ] ( ). password Empty for anyone; otherwise players type it to join. welcome_message A chat line sent to each player as they join. chat_color The colour of the server's own lines in chat: its "Server" badge and name, as "#RRGGBB" (default "#8E5CFF", violet). chat_text_color The colour of the text of those lines (default "#D9C8FF", lavender). Pick one that reads on a dark background. Console: chat-color <#badge> [<#text>]. listed false hides the server; players then need the code. max_players 1-249. port, query_port Steam game server ports (default 27015, 27016). steam_token A Steam game server login token, or empty (default). Without one the server signs in anonymously and gets a new Steam ID every start. With one it keeps the same Steam ID, printed at startup. Make a token at steamcommunity.com/dev/managegameservers with App ID 3354750; each running server needs its own. Keep it private: anyone with it can sign in as your server. The ReSkate team can set the in-game server browser to show only servers that have one; the server says so in its log when that hides it. Players can always join with the code. auto_update Install new ReSkate releases when nobody is on (default true). autostart The server window starts the server as soon as it opens, without waiting for Start (default false). The console server always starts at once. activity_log Log what players do (default true): throwdown drops placed, joins, starts, turns and results; objects placed or removed; how long players take to load. "access" - Who always has a place on the server. (Who runs it is in data/roles.json: see Roles below.) reserved_players_slots SteamID64s of the players with a reserved slot, e.g. ["76561198000000000"] (default none). They can join when the server is full, as players whose role has a reserved slot always can: each of them adds a slot beyond max_players that only they use. With 32 players and 2 admins and 2 listed, anyone can join until 32 are on, and those four can still join after that, up to 36. The browser then shows 33/32 and so on. Nothing is held back from everyone else. use_global_bans Turn away players the ReSkate team has banned from multiplayer (default true). The list is read from api.reskate.dev at startup and every ten minutes. false lets them in; the server's own bans (data/bans.json) apply either way. "maps" - What is skated. map The map everyone skates, named like the game's load command: "San Vansterdam", "Isle of Grom", "Super Ultra Mega Resort", "Stadium 1", or a custom map such as "bbcity" (see Custom maps). pool The maps players may vote for and the rotation goes through, in order, e.g. ["San Vansterdam", "Isle of Grom", "bbcity"]. Empty (the default) allows every map the server knows. Admins can still change to any map. rotation_minutes Minutes on each map before the server moves to the next one in pool (default 0: off). Players get a minute's warning; the clock waits while nobody is on, and starts over whenever the map changes (by a vote or an admin too). rotation_vote When a map's time is up, players vote for the next one (default false): three maps of the pool picked at random, "Random map", and "Stay here". The most votes wins, a tie is drawn, and with no vote at all it is the pool's next map. The maps are chosen a minute before, so players' games have their pictures ready. rotation_vote_seconds How long that vote runs, 10-120 (default 30). It ends sooner once everyone has voted. rotation_extend_minutes What "Stay here" adds to the map's time, 1-240 (default 15), or 0 to leave that answer out. Players can ask for the same at any time with "/vote extend" (votes.extend_map), and "rotation extend [minutes]" adds time at once. rotation_announce Tell players on a card when the map has 10, 5 and 1 minutes left (default true). latest_versions Keep this server's custom maps at Thunderstore's newest version (default false). A map mod in Mods whose folder is a Thunderstore package (Owner-Name) is looked up when the server starts and every latest_check_minutes; when a newer version is out, that version is written into the folder's manifest.json and the maps are read again. Nothing is downloaded: the server only needs to know the version, and players, who are sent to the server's version of a map, fetch it as they join. A player who already has a later version than the server keeps it. The map being played is left until nobody is on it. A folder that is not a Thunderstore package is never touched. The level list is not changed: when a new version adds, removes or renames levels, copy its reskate-levels.json in. latest_check_minutes How often Thunderstore is asked, 5-1440 (default 60). parks Layout for each park lot, e.g. "skatepark_01", or "empty". world_layer_sync Force the "layers" below on every player. layers World layer key -> "on" / "off". park_mods Parks built in the game's Park Editor and shared as mods, which the server can spawn for everyone (see Park mods). A list, e.g. [{"name": "street", "folder": "popular skate 2 street park", "map": "San Vansterdam", "key": "bam"}] name: what park-mod and votes call it, 1-16 of a-z, 0-9, - and _. folder: the mod's folder in Mods next to the server (copied from the game's Mods folder; spaces are fine). map: the map it was built on; it is only spawned while that map runs. key: which of the mod's parks, by the base map it is for (the file parks/.park.json: bam, grom, mpr, ftue, stadium_1, stadium_2); empty when the mod has one. park_limits How much may be spawned at once (default {"parks": 3, "objects": 512}): parks 1-16, their objects in all 1-1024. "players" - What players may do. allow_noclip, allow_no_bail, allow_boosts Let players use noclip (and tp) / No Bail / the forward and up boosts (default true; admins always can). allow_parties Let players form parties (default true): invite each other from the game's Social menu, a player card, the ReSkate Multiplayer menu or chat (/party invite ). Party members join each other's coop challenges, see each other on the map and talk with /p . party_size Most players in one party, 2-8 (default 8). afk_kick_minutes Remove a player who has been away this many minutes, 1-1440 (default 0: never). Away is not moving, speaking, typing in chat or changing their objects. They are warned in chat a minute before and can join again at once. Admins are never removed for it. Console: afk-kick |off. kick_minutes How long a player kicked by an admin is kept out: 1-1440 minutes (default 0: until the server restarts). They are told how long when they are kicked and when they try to join. A kick keeps the time it was given; changing this is for later kicks. A ban is still for good. One kick can be given its own time: kick 30. A kick by a vote has its own time, votes.kick_minutes. Console: kick-time |restart. word_warnings The ReSkate team keeps a list of words that are not allowed in chat at all (read from api.reskate.dev with the global bans). A message with one is never passed on, whatever this is set to, and its player is warned. After this many warnings, 1-10 (default 3), the next one gets them kicked; they can join again, and are kicked again at the next. Warnings last until the server restarts. 0: nobody is warned or kicked; the message is still not passed on. use_global_word_filter Use the ReSkate team's chat word lists (default true). Set false to leave them out: then only the words in this server's own data/words_blocked.txt are refused in chat. Console: words global on|off. See "Chat words" below. allow_voice_chat Allow voice chat. voice_range How far proximity voice reaches, 50-1000 m. object_placement everyone, admins (only admins can build), or nobody. object_limit How many objects each player may have placed, 1-1024 (default 100), or 0 for no limit. Admins are not limited. A player at the limit deletes one to place another. A player who places more than twice the limit plus 100 in a minute (a modified game animating objects by respawning them) has theirs deleted for everyone, and nothing they place is shared for a minute; the log says who. Admins are exempt. allow_object_scaling Let players place objects bigger or smaller than their own size (default true). false shares every player's objects at their own size and turns the size controls off in their park editor. Admins can still resize theirs. Console: object-scaling on|off. sync_effects Let players see each other's skater effects (default true): sparks and dust where a skater touches the world, and the trails and fire of costumes and skateboards. false relays none and players' games show each other without them, which saves a little traffic and drawing on a busy server. Console: effects on|off. sync_drones Let players see each other's FPV drones (default true): the marker where a player flying ReSkate's drone mode has their drone. false relays none, and players' games neither send their drone nor show anyone else's. Console: drones on|off. announce_throwdowns Tell everyone in chat when a throwdown drop is placed (default true). throwdown_locks Tools locked for the players of a throwdown while it runs, for fair games on a server that allows them for free skating (default [], none): any of "noclip" (with teleporting), "nobail", "boosts", "tuning" (their own physics tuning). They are locked when the throwdown starts and unlocked when the player quits it, it ends (the server hears nothing more of it for a minute or so) or they leave. Example: ["nobail", "boosts", "tuning"]. Console: throwdown-locks |off. See lock below. "anti_cheat" - What the server checks, and what it does about it. speed_hack Catch players whose game runs faster than normal (Cheat Engine's speedhack and the like), measured from the timing of what their game sends: "warn" (default) takes them out of throwdowns and coop challenges until their speed is normal again and tells them so (the log has it for the admins), "kick" removes them from the server, "off" does not check. pinned_board Catch players whose skateboard stays on another player as that player moves (a hacked game placing its board there): "warn" (default) stops showing their board to everyone else until it has behaved for half a minute and tells the admins in the game and the log who it is, "kick" removes them from the server, "off" does not check. modified_scoring Catch players whose mods change how many points tricks score (per-trick points, the scoring multipliers, the throwdown scoring logic) or how the skater handles (core physics, wipeouts, trick gestures). Each player's ReSkate checks its mods at launch and reports the result when joining: "warn" (default) takes them out of throwdowns and coop challenges (the server stops passing their throwdown messages on) and everyone is told in chat, "kick" removes them, "off" does not check. A player has to restart Skate without the mod to take part again. allowed_scoring_mods Scoring fingerprints accepted like the game's own, for a server that runs on a scoring mod everyone installs (16 hex digits each; score-check lists each player's). enforce_tuning Players skate with the game's own Gameplay/SkatePhysicsTuning, not copies they edited (default true). Edited tuning (truck positions and the rest) otherwise shows on their skater for everyone. bone_scale_limit How far a mod may resize part of a skater for the other players (a "big head" mod and the like): the most a bone may be scaled, 1 to 8 (default 2); 0 is no limit. The game's own skater height is a scale too, so 1 shows every skater at the same height and build as well as stopping mods; 2 leaves height alone and still halves the largest heads. The player with the mod still sees it on their own screen. Console: bone-scale <1-8>|off. bone_reach_limit How far, in metres, a bone of a skater's body or board may be from the one it hangs from for the other players: 0.5 to 20 (default 1); 0 is no limit. The game never moves them (the longest, a thigh, is 0.44), so the default changes nothing for an ordinary player and stops a hacked game from stretching its skater across the map. Every player's own game also holds what it is shown to 2. Console: bone-reach <0.5-20>|off. "network" - How players connect and how much they are sent. The defaults suit most servers. use_steam_relay How players reach the server: true (default) or false. true Through Steam's relay network. Nothing to open, and the server never sees a player's address. The route is Steam's choice and can be a long way round. false Straight to this server's "port" over UDP, which must be open to the internet. The shortest route, so the lowest ping. The server sees the addresses of the players who connect this way, as any dedicated server does; players never see each other's. With false the server still answers through the relays: a game tries the port first and uses the relays if it gets no answer in a few seconds, and a player can turn direct connections off in their own settings. So false never keeps anyone out. Steam vouches for who each player is either way. "net" shows who is direct, and the log has a [direct] line for each player who asks to connect that way. send_rate The most the server sends one player, in KB/s (default 900, 128-16384). About 1100 is what reaches a player through Steam's relays: set higher, what is lost is resent until the connection is full of resends and half of everything is lost. Console: rate , also for the players already on. crowd_budget The most position updates a second one player is sent (default 600, 0 for no limit). Players near each other are sent at the full rate, 20 a second; this only matters once more are in one place than budget / 20, about 30. Then the nearest stay at the full rate and the farthest of the crowd drop to 10 and 5 a second, instead of everyone's connection filling up. About 1000 is what reaches a player through Steam's relays; more than that was seen to lose half. Console: crowd |off. pack_ms How long a message to a player may wait to go in the same packet as the next ones, in milliseconds (default 10, 0 to 50). A full server sends each player hundreds of small messages a second, each in a packet of its own with its own headers; packed, the same updates take fewer packets, less bandwidth and less CPU. It adds up to that long to when an update arrives. Voice is never held back. 0 sends every message at once, as before. Takes effect on restart. threads How many threads share the sending of each pass (default 0: one for each of the machine's processors but one, up to 8; 1: a single thread, as before). Most of a full server's work is building each player's update of everyone else, which the threads do for several players at once. What is sent is the same whatever the number. The server says how many it uses when it starts. Takes effect on restart. finger_distance Past this many metres (default 25) a player's fingers are not sent moving: they stay as they were, and move again when the player is nearer. Fingers are nearly half of every position update and cannot be made out at that distance. 0 always sends them. distances When far-away players update less often (metres). steam_debug true logs what Steam's own networking says it is doing: each connection asked for, and what it refused or ignored and why. For finding out why players cannot connect; it is a lot of text, so turn it off again afterwards. "votes" - What players may vote on. votes Player votes, each off until turned on: "map": {"enabled": true, "percent": 60} /vote map (a map in maps.pool) "kick": {"enabled": true, "percent": 60} /vote kick "time_of_day": {"enabled": true, "percent": 50} /vote tod