Ritournelles sans OnHeartbeat...

Répondre
Partager Rechercher
Un petit problème que je rencontre: j'aimerais qu'un PNJ chante une petite ritournelle en continue dès qu'arrive un PJ, ce qui est assez simple à faire dans le OnHeartbeat. Mais bon, ça a pas l'air très recommandé visiblement

Y-a-t-il un moyen de faire autrement ?
Oui, mais pour une simple ritournelle, sans effets spéciaux de la mort qui tue et boucle à travers tous les objets du modules, ce serait du gâchis de ne pas utiliser le OnHeartBeat, il est parfait pour ça et ça ne sera pas lourd du tout (ôte moi d'un doute : tu ne fais pas chanter des hosannas à la totalités de tes PNJs ? ).

Donc vas-y sans hésiter !

PS : Si tu veux qu'on puisse causer à ton chanteur, n'oublie pas de faire en sorte qu'il s'arrête de chanter pendant les discussions !
Bon vala, j'ai mis ma ritournelle dans Onperceived, ça donne à peu près ça.


object oVu=GetLastPerceived();

if (GetIsPC(oVu))
{
ActionSpeakString("tralala !");
ActionWait(1.5);
ActionSpeakString("Tsoin tsoin");
ActionWait(1.5);
ActionSpeakString("tiroulirouli");
ActionWait(1.5);
}


Je vois pas pourquoi ça marche pas :/
J'ai mis ClearAllAction() au début, du coup ça marche, il chante^^ ...mais il reste sur place et oublie ses waypoints...

argg c'est un vrai casse-tête chinois ce truc :/
Citation :
Provient du message de riprip
J'ai mis ClearAllAction() au début, du coup ça marche, il chante^^ ...mais il reste sur place et oublie ses waypoints...

argg c'est un vrai casse-tête chinois ce truc :/
quelqu'un peut m'aider, je sèche là
Si tu veux simplement qu'il reprenne son chemin après avoir chanté, rappelle simplement WalkWayPoints à la fin de ton script.

Si tu veux qu'il marche en chantant, la solution la plus simple, je pense, est d'utiliser des SpeakString à la place des ActionSpeakString et des DelayCommand pour le timing. Comme tu ne passeras plus par la queue d'action cela ne devrait plus interférer avec le walkwaypoints.
Si tu ne veux pas de DelayCommand, j'ai peur que tu n'aies d'autre choix que de te faire une fonction personnelle équivalente à WalkWayPoint (en beaucoup plus simple éventuellement car appliquée à ce cas spécifique). Dans ce cas tu pourrais lui faire chanter sa ritournelle selon l'évolution de sa déambulation, et donc intégrer tout ça à la queue d'action.
Bon ma ritournelle marche bien sur le OnPercieved du PNJ maintenant.

Mais je me pose une question bête : la ritournelle chantée par le PNJ s'enclenche sur l'arrivée d'un PJ (avec un if (GetIsPC(GetLastPerceived()) ). Si un second PJ arrive au moment ou le PNJ est au milieu de sa ritournelle, est-ce que le PNJ réinitialise sa ritournelle et la reprend au début sans terminer celle en cours ou pas ?

Et comment faire pour qu'un programme placé dans le OnPerceived ne se déclanche qu'une et une seule fois et pas à chaque passage du ou des PJ ?
avec une variable
tu la met à 1 quand tu commence ta ritournelle et tu teste dans le onperceive, si elle est à 1, tu commence pas à chanter, sinon, c'est bon
Justement j'y ai pensé

Mais en tant que grosse quiche, j'arrive pas à le faire concrètement
ya un truc qui cloche (en fait j'arrive pas à récupérer la variable)

En script, ça donne quoi ?
bon, alors en gros :

Code PHP:


object oVu
=GetLastPerceived();
int nDone GetLocalInt(OBJECT_SELF"RITOURNELLE_DONE"); 
if (
GetIsPC(oVu) && (!nDone)) //chuis jamais sure de ma syntaxe mais normalement ...
{
SetLocalInt(OBJECT_SELF"RITOURNELLE_DONE"1);
ActionSpeakString("tralala !");
ActionWait(1.5);
ActionSpeakString("Tsoin tsoin");
ActionWait(1.5);
ActionSpeakString("tiroulirouli");
ActionWait(1.5);


et puis a la fin de ta ritournelle tu peux faire pour qu'il puisse la rechanter une fois qu'il la chanson finie :

Code PHP:


ActionSpeakString
("tiroulirouli");
ActionWait(1.5);
ActionDoCommand(DeleteLocalInt(OBJECT_SELF"RITOURNELLE_DONE"));

si ca pas bon ... c"est qu'il faut peut être un DelayCommand(0.1 ...) pour le SetLocalInt ... je suis jamais trop confiant dans ces trucs là, mais en théorie, je pense que c'est bon ...
Bon ce ne sera pas très élégant, des UDE auraient probablement été plus appropriés.

La petite difficulté c'est qu'il aurait été sympa de poster ton code

Enfin, si tu n'as pas fait de fonction récursive la suite devrait marcher sans problème:

A la fin de ton script tu dois avoir, en reprenant ce que tu avais posté précédemment:

Code PHP:

DelayCommand(OBJECT_SELFSpeakString("tiroulirouli")); 

A la place mets:

Code PHP:

DelayCommand(OBJECT_SELFSingLastString()); 

Où SingLastString est une fonction ad hoc que tu définiras ainsi:
[php]
void SingLastString()
{
SpeakString("tiroulirouli");
DeleteLocalInt(OBJECT_SELF, "SINGING");
}


et tu commences ton script comme ceci:

Code PHP:

if(GetLocalInt(OBJECT_SELF"SINGING")) return;
SetLocalInt(OBJECT_SELF"SINGING",1) ;
//... 
Et voilà Jol n'aime pas mon ad hoc, le doute m'assaille et j'arrive trop tard...
Ah ben non comme ça tu as les deux approches c'est parfait...
Citation :
Provient du message de riprip
Bon vala, j'ai mis ma ritournelle dans Onperceived, ça donne à peu près ça.


object oVu=GetLastPerceived();

if (GetIsPC(oVu))
{
ActionSpeakString("tralala !");
ActionWait(1.5);
ActionSpeakString("Tsoin tsoin");
ActionWait(1.5);
ActionSpeakString("tiroulirouli");
ActionWait(1.5);
}


Je vois pas pourquoi ça marche pas :/
Bah, pour le faire chanter ça, épargne toi un script

Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés