Emite eventos.
Recibe el caso ya armado.
GameLink conecta tu juego con Praetor de dos formas: enlaza el SDK en tu servidor dedicado o llama a la Web API por HTTPS desde cualquier backend. Las dos llevan los mismos eventos y le dan a Praetor el mismo poder. Por cualquiera de las dos vías, sin cambiar la arquitectura del juego y sin tiempo de inactividad.
- 1Conecta GameLink: enlaza el SDK con tu certificado y tu clave de licencia, o llama a la Web API con una API key.
- 2Arranca en modo observación. Warden calibra la línea base de tu juego sin castigar a nadie.
- 3Ajusta los umbrales y elige qué queda automático y qué pasa a revisión humana.
El código de abajo es solo una demostración de cómo se ve una integración. Los nombres, endpoints y claves reales llegan con tu cuenta de 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 } ], }), });
Los ejemplos HTTP usan una dirección de ejemplo. El endpoint y la clave reales llegan con tu cuenta.
Un módulo.
Dos formas de conectar.
GameLink es la forma en que tu juego habla con Praetor, y le da a Praetor pleno control sobre tus servidores en las dos formas. Elige el SDK o la Web API según tu forma de desarrollar, no según lo que necesitas: todos los módulos funcionan igual en las dos.
| SDK | Web API | |
|---|---|---|
| Canal | persistente, cifrado, abierto por tu servidor | una petición HTTPS por lote de eventos |
| Autenticación | tu certificado + clave de licencia | API key |
| Sentido | ida y vuelta, en vivo | ida y vuelta, por HTTPS, más webhooks |
| Actuar en el juego | los comandos de Praetor se ejecutan directamente en el servidor | los comandos de Praetor vuelven por HTTPS y se ejecutan en el servidor |
| Datos sensibles | cifrados en tu servidor, antes de salir | viaja por el HTTPS de tu servidor y Praetor lo cifra al llegar |
| Carga en tu servidor | no bloqueante, fuera del hilo del juego | lo que cueste tu cliente HTTP |
| Chat de admin en el juego | sí | sí |
| Replay de Hindsight | fotograma a fotograma, desde la vista del jugador | fotograma a fotograma, desde la vista del jugador |
| Ideal para | servidores dedicados en C++, Unreal o Unity | cualquier backend, en cualquier lenguaje |
Administra desde el chat.
Sin hacer alt-tab.
Con GameLink, por el SDK o por la Web API, los admins escriben comandos directamente en el chat del juego. Praetor los intercepta antes de que ningún otro jugador los vea.
- Estadísticas del servidor ping, jugadores conectados, memoria, CPU
- Aviso global a un servidor, a todos los servidores o a todo el juego
- Teletransporte a un jugador o a unas coordenadas
- Zonas prohibidas dibujadas en vivo, recorriendo cada esquina
Construido para rendir,
sobre Ethereal.
Praetor está diseñado para alto rendimiento y baja latencia, de GameLink al backend. Muchos de sus módulos y submódulos corren sobre Ethereal, la biblioteca de C/C++ sobre la que Typename Studios construye sus propios productos.
¿Listo para conectar GameLink?
Cuéntanos tu motor y cómo montas los servidores. Te enviamos un plan de integración: los eventos a emitir, dónde engancharlos y cuánto tarda.