Partial class that supplies the server-side API URL and key to the Backend class. On a dedicated server it reads api_serveur.json from FileSystem.Data and copies Url and Key out, logging a warning if the file is missing or incomplete; on clients it does nothing.
namespace HorizonRP;
// L'accès du serveur dédié à l'API. L'adresse et la clé ne sont jamais écrites dans le code (un jeu
// publié part avec lui) : le serveur les lit dans « api_serveur.json », posé dans ses données sur
// la machine qui l'héberge (serveur\sbox\data\…), jamais dans le projet :
// { "Url": "https://…/api.php", "Key": "…" }
// Même format que api_editeur.json de l'éditeur : copier ce fichier suffit. La clé est
// « CLE_SERVEUR » de api/config.php du site d'administration. Ne jamais l'afficher ni la
// recopier ailleurs. Sans ce fichier, le serveur refuse tous les joueurs (serveur non officiel,
// HorizonGame.AcceptConnection).
//
// Ce fichier s'appelait Secrets.Server.cs : s&box retire les *.Server.cs du paquet publié, et un
// serveur dédié qui lance le jeu publié (30/10/2026) ne lisait plus rien — « Serveur non officiel »
// pour tout le monde. Il ne contient aucun secret : il peut partir avec le jeu ; chez un joueur,
// il ne fait rien (Application.IsDedicatedServer).
public static partial class Backend
{
static partial void ReadSettings( ref string url, ref string key )
{
if ( !Application.IsDedicatedServer )
return;
var settings = FileSystem.Data.ReadJsonOrDefault<EditorSettings>( "api_serveur.json" );
if ( settings is null || string.IsNullOrWhiteSpace( settings.Url ) || string.IsNullOrWhiteSpace( settings.Key ) )
{
Log.Warning( $"[Horizon] api_serveur.json absent ou incomplet : aucun joueur ne sera accepté. À poser ici : {FileSystem.Data.GetFullPath( "/" )}" );
return;
}
url = settings.Url;
key = settings.Key;
}
}