Équipes et scores
Ces commandes modifient les informations du match affichées par le HUD et les scènes : les équipes, le nom de l'événement, le format d'équipe et le score de chaque map.
Elles ont besoin que la fenêtre principale de MyHUD soit ouverte et connectée à ton compte. Chaque changement apparaît tout de suite sur les pages ouvertes, y compris les sources navigateur d'OBS.
Équipe A et équipe B
L'API utilise toujours équipe A et équipe B, comme la page match de MyHUD. Ce sont les deux équipes de la série. Elles ne correspondent pas au côté CT ou T dans le jeu.
Lire le match actuel
curl http://127.0.0.1:44555/api/match(Invoke-RestMethod http://127.0.0.1:44555/api/match).matchimport requests
match = requests.get("http://127.0.0.1:44555/api/match").json()["match"]
print(match["seriesScore"])const { match } = await (await fetch('http://127.0.0.1:44555/api/match')).json();
console.log(match.seriesScore);La réponse contient le nom de l'événement, les équipes, les maps de la série avec leurs scores, le score de la série et le veto :
{
"ok": true,
"match": {
"eventName": "Spring Cup",
"teamFormat": "5v5",
"boFormat": "bo3",
"teamA": { "name": "Vitality" },
"teamB": { "name": "NAVI" },
"maps": [
{ "number": 1, "map": "de_nuke", "label": "Nuke", "pickedBy": "Vitality", "finished": true, "scoreA": 13, "scoreB": 9, "winner": "Vitality" },
{ "number": 2, "map": "de_mirage", "label": "Mirage", "pickedBy": "NAVI", "finished": false, "scoreA": 4, "scoreB": 6, "winner": null }
],
"seriesScore": { "a": 1, "b": 0 },
"veto": {
"steps": [
{ "type": "ban", "team": "A", "map": "de_ancient" },
{ "type": "ban", "team": "B", "map": "de_train" }
],
"revealed": 2
}
}
}teamA, teamB, boFormat et veto valent null tant qu'ils ne sont pas définis.
Les commandes set_* ci-dessous renvoient le même résumé du match dans result.
Définir les équipes
POST /api/actions/set_teams
{
"teamA": { "name": "Vitality", "logo": "https://example.com/vitality.png" },
"teamB": { "name": "NAVI" },
"boFormat": "bo3"
}logoest optionnel.boFormat(bo1,bo3oubo5) est optionnel. Il définit la longueur de la série affichée sur la scène versus.
MyHUD renomme les équipes partout : résultats des maps, picks, veto et scène versus.
Définir le score d'une map
POST /api/actions/set_map_result
{ "map": 1, "scoreA": 13, "scoreB": 9, "finished": true }mapest le numéro de la map dans la série (1 à 5), ou le nom de la map si elle est dans la série ("mirage").finished: truemarque la map comme jouée. MyHUD définit alors le vainqueur. Si tu n'envoies pasfinished, la valeur actuelle reste.
La map doit déjà être dans la série, via un veto ou la page match. Si l'emplacement est vide, MyHUD répond 409 conflict.
Définir le nom de l'événement
POST /api/actions/set_event_name
{ "name": "Spring Cup — Grande finale" }Le HUD et les scènes affichent ce nom.
Définir le format d'équipe
POST /api/actions/set_team_format
{ "format": "2v2" }Valeurs : auto, 1v1, 2v2, 3v3, 5v5.
Exemple : préparer une série complète
Ce script définit l'événement et les équipes, fait un veto BO3, puis définit le score de la map 1 :
$Base = 'http://127.0.0.1:44555'
function Invoke-MyHud([string]$Action, [hashtable]$Payload = @{}) {
Invoke-RestMethod -Method Post "$Base/api/actions/$Action" `
-ContentType 'application/json' -Body ($Payload | ConvertTo-Json -Depth 6 -Compress)
}
Invoke-MyHud set_event_name @{ name = 'Spring Cup' } | Out-Null
Invoke-MyHud set_teams @{ teamA = @{ name = 'Vitality' }; teamB = @{ name = 'NAVI' }; boFormat = 'bo3' } | Out-Null
Invoke-MyHud veto_start @{
boFormat = 'bo3'
teamA = @{ name = 'Vitality' }
teamB = @{ name = 'NAVI' }
mapPool = @('ancient', 'anubis', 'dust2', 'inferno', 'mirage', 'nuke', 'train')
} | Out-Null
foreach ($map in 'nuke', 'ancient', 'mirage', 'inferno', 'anubis', 'dust2') {
Invoke-MyHud veto_select @{ map = $map } | Out-Null
}
Invoke-MyHud set_map_result @{ map = 1; scoreA = 13; scoreB = 9; finished = $true } | Out-Nullimport requests
BASE = "http://127.0.0.1:44555"
def myhud(action, payload=None):
res = requests.post(f"{BASE}/api/actions/{action}", json=payload or {}, timeout=40)
body = res.json()
if not body["ok"]:
raise RuntimeError(f"{action} failed ({res.status_code} {body['error']}): {body['message']}")
return body.get("result")
teams = {"teamA": {"name": "Vitality"}, "teamB": {"name": "NAVI"}}
myhud("set_event_name", {"name": "Spring Cup"})
myhud("set_teams", {**teams, "boFormat": "bo3"})
myhud("veto_start", {
**teams,
"boFormat": "bo3",
"mapPool": ["ancient", "anubis", "dust2", "inferno", "mirage", "nuke", "train"],
})
for map_name in ["nuke", "ancient", "mirage", "inferno", "anubis", "dust2"]:
myhud("veto_select", {"map": map_name})
match = myhud("set_map_result", {"map": 1, "scoreA": 13, "scoreB": 9, "finished": True})
print("Série :", match["seriesScore"])const BASE = 'http://127.0.0.1:44555';
async function myhud<T = unknown>(action: string, payload: object = {}): Promise<T> {
const res = await fetch(`${BASE}/api/actions/${action}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
const body = await res.json();
if (!body.ok) throw new Error(`${action} failed (${res.status} ${body.error}): ${body.message}`);
return body.result as T;
}
const teams = { teamA: { name: 'Vitality' }, teamB: { name: 'NAVI' } };
await myhud('set_event_name', { name: 'Spring Cup' });
await myhud('set_teams', { ...teams, boFormat: 'bo3' });
await myhud('veto_start', {
...teams,
boFormat: 'bo3',
mapPool: ['ancient', 'anubis', 'dust2', 'inferno', 'mirage', 'nuke', 'train'],
});
for (const map of ['nuke', 'ancient', 'mirage', 'inferno', 'anubis', 'dust2']) {
await myhud('veto_select', { map });
}
const match = await myhud<{ seriesScore: { a: number; b: number } }>('set_map_result', {
map: 1,
scoreA: 13,
scoreB: 9,
finished: true,
});
console.log('Série :', match.seriesScore);