Actions validées

Actions validées

Des parties vérifiées par le serveur pour les classements et la monnaie du jeu, sans écrire de code serveur. Des tickets à usage unique par partie, des règles présentes uniquement sur le serveur, les journaux d'entrées des meilleures parties et la modération limitent ce qu'un tricheur peut gagner. Uniquement dans le cloud, pas dans le simpleServer auto-hébergé.

Demarrer gratuitement

Tickets à usage unique par partie

Chaque partie commence par un ticket du serveur lié au joueur, au classement et à une graine du serveur. Un ticket compte exactement une fois et une partie refusée le consomme aussi, si bien que personne ne peut sonder vos limites avec un seul ticket.

Des règles uniquement sur le serveur

Les limites de score, la durée minimale, le score par seconde, les règles par niveau et les limites de monnaie par partie résident sur le serveur. Elles n'apparaissent jamais dans les réponses de l'app ni dans les messages d'erreur, et seul le serveur écrit la monnaie.

Journaux d'entrées et modération

Pour les meilleures parties et les parties signalées, le serveur demande au jeu son journal d'entrées. Vous pouvez rejouer vous-même une partie suspecte avec sa graine et son journal, puis décider de la suite.

Integration rapide

Integration rapide

Configurer les Actions validées
Vidéo bientôt disponible

Activez les envois validés pour un classement et définissez vos règles serveur dans Actions validées. Suivez ensuite les parties vérifiées et examinez les preuves des meilleures parties dans le tableau de bord.

C#
// Unity C#: Validated Actions
// Dashboard: turn on "Validated submissions only" for the leaderboard "weekly"
var va = ValidatedActionsManager.Instance;

// Round start: single-use ticket plus server seed
var run = await va.StartRun("weekly");
if (run == null) { Debug.Log(va.LastErrorCode); return; } // e.g. RUN_RATE_LIMITED
var random = new System.Random(run.seed);

// ... play, record the inputs into inputLog (byte[]) ...

// Round end: score plus input log (the SDK sends its SHA-256 hash)
var result = await va.SubmitValidated(18250, inputLog);
if (result == null)
{
    Debug.Log($"{va.LastErrorCode}, run kept: {va.HasActiveRun}"); // e.g. DURATION_TOO_SHORT
}
REST
# REST API: Validated Actions (needs the player's session token)

# Start a run: returns runId, a single-use ticket, seed and expiresAt
curl -X POST https://eu.horizon.pm/api/v1/app/validated-actions/runs \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Authorization: Bearer SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"userId":"USER_ID","leaderboardKey":"weekly"}'

# Submit the run: score plus the SHA-256 hex of the input log
curl -X POST https://eu.horizon.pm/api/v1/app/validated-actions/submit \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Authorization: Bearer SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"userId":"USER_ID","ticket":"TICKET","leaderboardKey":"weekly","score":18250,"inputLogHash":"SHA256_HEX"}'

# Rejected runs answer 422 with a code, e.g. TICKET_EXPIRED or DURATION_TOO_SHORT
Questions frequentes

Questions frequentes

Pret a integrer ?

Commencez a construire avec horizOn des aujourd'hui. Tier gratuit inclus.