Emetti eventi.
Ricevi il caso già pronto.
GameLink collega il tuo gioco a Praetor in due modi: integra l'SDK nel tuo server dedicato, o chiama la Web API via HTTPS da qualsiasi backend. Entrambi portano gli stessi eventi e danno a Praetor lo stesso potere. In entrambi i casi, nessuna modifica all'architettura del gioco e nessun downtime.
- 1Collega GameLink: integra l'SDK con il tuo certificato e la chiave di licenza, oppure chiama la Web API con una chiave API.
- 2Avvia in osservazione. Warden calibra la baseline del tuo gioco senza punire nessuno.
- 3Imposta le soglie e scegli cosa resta automatico e cosa va in revisione umana.
Il codice qui sotto è solo una dimostrazione di come appare un'integrazione. Nomi reali, endpoint e chiavi arrivano con il tuo account 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 } ], }), });
Gli esempi HTTP usano un indirizzo segnaposto. L'endpoint e la chiave reali arrivano con il tuo account.
Un modulo.
Due modi per collegarsi.
GameLink è il modo in cui il tuo gioco parla con Praetor, e dà a Praetor pieno potere sui tuoi server in entrambe le forme. Scegli l'SDK o la Web API in base a come costruisci, non a ciò che ti serve: ogni modulo funziona allo stesso modo in entrambe.
| SDK | Web API | |
|---|---|---|
| Canale | persistente, cifrato, aperto dal tuo server | una richiesta HTTPS per ogni lotto di eventi |
| Autenticazione | il tuo certificato + chiave di licenza | chiave API |
| Direzione | bidirezionale, live | bidirezionale, via HTTPS, più webhook |
| Agire nel gioco | i comandi di Praetor girano direttamente nel server | i comandi di Praetor tornano via HTTPS e girano nel server |
| Dati sensibili | cifrati sul tuo server, prima di uscire | viaggia sull'HTTPS del tuo server e Praetor lo cifra all'arrivo |
| Carico sul tuo server | non bloccante, fuori dal thread di gioco | quanto costa il tuo client HTTP |
| Chat admin in gioco | sì | sì |
| Replay di Hindsight | fotogramma per fotogramma, dalla vista del giocatore | fotogramma per fotogramma, dalla vista del giocatore |
| Ideale per | server dedicati in C++, Unreal o Unity | qualsiasi backend, in qualsiasi linguaggio |
Amministra dalla chat.
L'alt-tab va in pensione.
Con GameLink, tramite l'SDK o la Web API, gli admin digitano i comandi direttamente nella chat di gioco. Praetor li intercetta prima che qualsiasi altro giocatore li veda.
- Statistiche del server ping, giocatori online, memoria, CPU
- Annunci a un server, a tutti i server o all'intero gioco
- Teletrasporto verso un giocatore o delle coordinate
- Zone vietate disegnate live, raggiungendo a piedi ogni angolo
Costruito per alte prestazioni,
su Ethereal.
Praetor è progettato per throughput e bassa latenza, da GameLink al backend. Molti dei suoi moduli e sottomoduli girano su Ethereal, la libreria C/C++ su cui Typename Studios costruisce i propri prodotti.
Pronto a collegare GameLink?
Raccontaci il tuo engine e la configurazione dei server. Ti invieremo un piano di integrazione: gli eventi da emettere, dove agganciarli e quanto tempo serve.