Voiiiiilà j'ai trouvé !
En fait, DelayCommand n'est rien d'autre qu'un évènement pour l'objet qui l'invoque, pour NWN.
En clair, cela signifie que l'objet qui invoque DelayCommand stock les variables du script en cours - pour qu'elles soient encore valides lors de l'exécution du Delay - et reçoit un event lorsque le temps du Delay est écoulé.
Il exécute alors la commande qui a été Delayée.
Dans notre cas, sur l'évènement OnDead, le DelayCommand est ajouté à la pile de l'objet en train de mourir, objet qui va disparaître dans les 3 secondes ! Fort évidement, ça ne fonctionne pas, l'event est tout simplement supprimé, et rien ne se passe.
La solution de contournement la plus simple serait de créer deux scripts.
Un sur le OnDead :
void main() {
object oPJ = GetLastKiller();
SetLocalString(oPJ,"RespawnResRef",GetResRef(OBJECT_SELF));
SetLocalLocation(oPJ,"RespawnLocation",GetLocation(OBJECT_SELF));
ExecuteScript("RespawnAfterKill",oPJ);
}
Et un script nommé "RespawnAfterKill" :
void VoidCreateObject(string sTemplate, location lLoc, int bUseAppearAnimation=TRUE) {
CreateObject(OBJECT_TYPE_CREATURE, sTemplate,lLoc, bUseAppearAnimation);
}
void main() {
string sResRef = GetLocalString(OBJECT_SELF,"RespawnResRef");
location lLoc = GetLocalLocation(OBJECT_SELF,"RespawnLocation");
DelayCommand(10.0f, VoidCreateObject(sResRef,lLoc));
DeleteLocalString(OBJECT_SELF,"RespawnResRef");
DeleteLocalLocation(OBJECT_SELF,"RespawnLocation");
}
Et hop, ça marche !
Encore un détail : surtout, ne pas passer directement la fonction GetLocalTruc en argument de VoidCreateObject ! Car du coup, si le PJ tue 2 ennemis à la suite avant le respawn du 1er, il y aura 2 respawns du second... Tandit que si l'on stock les valeurs dans des variables, celles-ci sont mises en pile... Ce n'est pas le cas des fonctions...
Tordu, hein ?
- Edit pour rajouter les DeleteLocal dans le 2ème script -