Lire et agir
Tester un mod avec des forçages temporaires
Ouvrir une session de recette, observer les décisions et libérer les forçages de manière explicite.
Un scénario lié au contrat du mod
Ce parcours suppose une application JVM connectée et un mod qui accepte les opérations de recette. Commencez par game.mods.status(modId). Les codes d’aspect et indices de réglages appartiennent au mod testé : prenez-les dans ses déclarations, sans attribuer une signification universelle à un entier.
package wiki.controlrecipe
import fr.nimby.sdk.ControlResponse
import fr.nimby.sdk.Game
import fr.nimby.sdk.ModControlSession
fun <T> withSignalRecipe(
game: Game,
modId: String,
signalId: Long,
aspectFromMod: Int,
observe: (ModControlSession, ControlResponse) -> T,
): T = game.mods.control(modId, leaseMillis = 5_000).use { recipe ->
val accepted = recipe.forceSignal(signalId, aspectFromMod)
observe(recipe, accepted)
}
La fonction observe fournie par votre application organise les lectures de recette pendant le bail. forceSignal accepte une demande ; sa réponse seule ne prouve pas que le prochain calcul du mod a déjà affiché cet aspect. Utilisez recipe.readSignal(signalId), puis les observations du jeu, pour vérifier le résultat attendu.
| Lecture | Sens de active |
|---|---|
| readSignal | 0 : aucun forçage ; 1 : forçage demandé ; 2 : dernière décision observée conforme au forçage. |
| readTrain | État TrainControlState : Absent, AwaitingExit, Active, Completed ou Cancelled. Il ne constitue pas une permission de mouvement. |
constrainTrain exprime une vitesse en m/s, un mode et éventuellement un signal de sortie. releaseByRear choisit une libération par l’arrière du train ; false correspond à la tête. setSetting modifie temporairement un réglage booléen ; ce n’est pas une écriture de configuration sauvegardée. Les compteurs décrivent les forçages demandés, pas le nombre de décisions déjà exécutées.
Limiter la durée et gérer une réponse incertaine
- Le bail dure de 1 000 à 60 000 ms. Aucun renouvellement en arrière-plan : renew est un choix explicite de la recette.
- restoreSignal, restoreTrain et restoreSetting libèrent une cible ; clear libère les forçages de la session. close libère le bail et use appelle close.
- Si le programme disparaît ou ne peut plus libérer le bail, son expiration retire les forçages temporaires.
- Après une erreur, inspectez status et les observations avant une nouvelle écriture. Une absence de réponse ne prouve pas que la demande a été ignorée.
Tester l’apparence séparément
game.signals.showTexture(id, catalogue, image, durationMillis) remplace temporairement l’image pour 1 à 60 secondes ; restoreTexture retire ce remplacement. Le catalogue et l’image doivent désigner des ressources valides. Cette opération concerne l’affichage uniquement : elle ne force ni aspect logique, ni permission, ni freinage.