Émettez des événements.
Recevez le dossier tout prêt.
GameLink relie votre jeu à Praetor de deux façons : liez le SDK à votre serveur dédié, ou appelez la Web API en HTTPS depuis n'importe quel backend. Les deux transportent les mêmes événements et donnent à Praetor les mêmes pouvoirs. Dans les deux cas, aucun changement d'architecture du jeu et aucune interruption.
- 1Connectez GameLink : liez le SDK avec votre certificat et votre clé de licence, ou appelez la Web API avec une clé d'API.
- 2Tournez en observation. Warden calibre la référence de votre jeu sans sanctionner personne.
- 3Réglez les seuils et choisissez ce qui reste automatique et ce qui passe en revue humaine.
Le code ci-dessous n'est qu'une démonstration de ce à quoi ressemble une intégration. Les vrais noms, endpoints et clés sont fournis avec votre compte GameLink.
// dedicated server, one client per process GameLink::GLClient client; client.Startup( iMaxPlayers, nullptr ); client.LoadCertificateFromFile( sCert, sKey ); client.ConnectUsingEndpoint( sEndpoint, sLicenseKey, sVersion, 5000 ); // in the server's main loop client.Tick(); // game events GameLink::Player::SendJoin( &client, iPlayer, sName, ePlatform ); GameLink::Social::SendChatMessage( &client, iSender, eChannel, sText ); client.Shutdown();
/* extern "C" over the same library */ gl_client_t * c = gl_client_create(); gl_client_startup( c, max_players, NULL ); gl_client_connect_endpoint( c, endpoint, license_key, version, 5000 ); /* server loop */ gl_client_tick( c ); gl_client_shutdown( c ); gl_client_destroy( c );
// P/Invoke over the C ABI [DllImport("gamelink")] static extern IntPtr gl_client_create(); [DllImport("gamelink")] static extern int gl_client_tick(IntPtr c); [DllImport("gamelink")] static extern int gl_client_startup(IntPtr c, uint maxPlayers, IntPtr cfg); var c = gl_client_create(); gl_client_startup(c, maxPlayers, IntPtr.Zero); // same pattern in the Unity and Unreal wrappers gl_client_tick(c);
// FFI over the C ABI use std::ffi::{c_int, c_void}; #[link(name = "gamelink")] unsafe extern "C" { fn gl_client_create() -> *mut c_void; fn gl_client_tick(c: *mut c_void) -> c_int; } let c = unsafe { gl_client_create() }; // in the server's main loop unsafe { gl_client_tick(c) };
// cgo over the C ABI /* #cgo LDFLAGS: -lgamelink #include "gamelink.h" */ import "C" c := C.gl_client_create() C.gl_client_startup(c, C.uint32_t(maxPlayers), nil) // in the server's main loop C.gl_client_tick(c)
// FFI over the C ABI (java.lang.foreign) // link() wraps Linker.nativeLinker().downcallHandle(...) try (var arena = Arena.ofConfined()) { var lib = SymbolLookup .libraryLookup("gamelink", arena); var create = link(lib, "gl_client_create", ADDRESS); var tick = link(lib, "gl_client_tick", JAVA_INT, ADDRESS); MemorySegment c = (MemorySegment) create .invoke(); tick.invoke(c); }
# GameLink Web API: events over HTTPS with an API key curl https://api.praetor.example/v1/events \ -H "Authorization: Bearer $PRAETOR_KEY" \ -H "Content-Type: application/json" \ -d '{ "server_id": "eu-west-03", "events": [ { "type": "player.join", "player": "76561198000000042" }, { "type": "combat.hit", "attacker": "76561198000000042", "victim": "76561198000000043" } ] }' # open cases waiting for review curl https://api.praetor.example/v1/cases \ -G -d status=review \ -H "Authorization: Bearer $PRAETOR_KEY"
# any HTTP client works import os, requests API = "https://api.praetor.example/v1" KEY = os.environ["PRAETOR_KEY"] H = { "Authorization": "Bearer " + KEY } requests.post(API + "/events", headers=H, json={ "server_id": "eu-west-03", "events": [ { "type": "chat.message", "player": pid, "text": msg } ] }) cases = requests.get(API + "/cases", headers=H, params={ "status": "review" }).json()
// Node 18+, built-in fetch const API = "https://api.praetor.example/v1"; const headers = { Authorization: `Bearer ${process.env.PRAETOR_KEY}`, "Content-Type": "application/json", }; await fetch(`${API}/events`, { method: "POST", headers, body: JSON.stringify({ server_id: "eu-west-03", events: [ { type: "match.end", match: matchId } ], }), });
Les exemples HTTP utilisent une adresse fictive. Le vrai endpoint et la vraie clé sont fournis avec votre compte.
Un module.
Deux façons de se connecter.
GameLink est la façon dont votre jeu parle à Praetor, et il donne à Praetor les pleins pouvoirs sur vos serveurs dans les deux formes. Choisissez le SDK ou la Web API selon votre façon de construire, pas selon vos besoins : tous les modules fonctionnent pareil dans les deux.
| SDK | Web API | |
|---|---|---|
| Canal | persistant, chiffré, ouvert par votre serveur | une requête HTTPS par lot d'événements |
| Authentification | votre certificat + clé de licence | Clé d'API |
| Sens | bidirectionnel, en direct | bidirectionnel, en HTTPS, plus webhooks |
| Agir dans le jeu | les commandes de Praetor s'exécutent directement sur le serveur | les commandes de Praetor reviennent en HTTPS et s'exécutent sur le serveur |
| Données sensibles | chiffrées sur votre serveur, avant de partir | envoyé via le HTTPS de votre serveur, chiffré par Praetor à son arrivée |
| Charge sur votre serveur | non bloquant, hors du thread de jeu | le coût de votre client HTTP |
| Chat admin en jeu | oui | oui |
| Replay Hindsight | image par image, du point de vue du joueur | image par image, du point de vue du joueur |
| Idéal pour | les serveurs dédiés en C++, Unreal ou Unity | n'importe quel backend, dans n'importe quel langage |
L'admin dans le chat.
Alt-Tab au chômage.
Avec GameLink, par le SDK ou par la Web API, les admins tapent leurs commandes directement dans le chat du jeu. Praetor les intercepte avant qu'aucun autre joueur ne les voie.
- Stats serveur ping, joueurs en ligne, mémoire, CPU
- Annonce sur un serveur, sur tous les serveurs ou dans tout le jeu
- Téléportation vers un joueur ou des coordonnées
- Zones interdites tracées en direct, en marchant jusqu'à chaque coin
Conçu pour la haute performance,
sur Ethereal.
Praetor est pensé pour le débit et la faible latence, de GameLink jusqu'au backend. Nombre de ses modules et sous-modules tournent sur Ethereal, la bibliothèque C/C++ sur laquelle Typename Studios construit ses propres produits.
Prêt à connecter GameLink ?
Dites-nous votre moteur et votre infra serveur. Nous vous enverrons un plan d'intégration : les événements à émettre, où les brancher et combien de temps ça prend.