La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 29/12/2024 19:27:32


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 18/05/2003 08:27:35 Sujet du message : Un placeable déclenche un script au bout de X secondes

Salut la compagnie !

Je me demandais s'il y avait moyen de savoir quand un jouer CESSE d'utiliser un placeable... en l'occurrence sur mon script (situé dans le onUsed d'un placeable) il y a une commande faisant effectuer une animation au joueur. J'aimerais que des trucs se produisent si et seulement si le joueur reste bien sage sans bouger pendant au moins 30 secondes... J'ai beau me creuser la tête je trouve pas de solution Confused

(il faudrait que l'animation en question soit considérée comme une action ce serait jouable peut-être, mais ce n'est pas le cas...)

Que Scriptos le grand dieu du script me vienne en aide ! Very Happy
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Tyrion
Ecuyer
Inscrit le: 23 Fév 2003
Messages: 43
Répondre en citant
Posté le : 18/05/2003 10:04:31 Sujet du message :


Citation :
J'aimerais que des trucs se produisent si et seulement si le joueur reste bien sage sans bouger pendant au moins 30 secondes...
Ca doit etre faisable en mettant un systeme de perception ( un genre de testeur de proximite) et un chronometre pour le declenchement


Citation :
Je me demandais s'il y avait moyen de savoir quand un jouer CESSE d'utiliser un placeable... en l'occurrence sur mon script (situé dans le onUsed d'un placeable) il y a une commande faisant effectuer une animation au joueur.
hum pour sa je ne sais pas du tout.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
Wololo
Légende vivante
Inscrit le: 13 Déc 2002
Messages: 385
Répondre en citant
Posté le : 18/05/2003 10:57:35 Sujet du message :

hmm, tu peux toujours détruire l'ancien pour en créer un autre celui ci utilisable (2 versions du même placeable donc ..)

de toute facon, tu ne peux pas allouer dynamaiquement le OnUsed par défaut ...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 18/05/2003 15:18:32 Sujet du message :

Eh oui, c'est bien ça le problème... je songeais à un script sur le onUsed, avec un EventUserDefined(1001) pour le joueur, et un compteur de cycles... enfin quelle galère ! Tant pis, je laisse tomber, je vais tricher avec un GetDistanceBetween(...) et pis voilà, ce sera imprécis Sad

Merci pour les réponses à +
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 20/05/2003 10:25:09 Sujet du message :

Il existe une solution consistant à affecter deux actions dans la queue d'action du personnage. En l'occurrence une action d'attente de 30 seconde et une action personnalisée qui accomplira ce que tu veux qu'il se passe à ce moment. De cette façon, si le joueur ne reste pas en place, cela annule sa queue d'action et l'action devant se déclencher au bout de 30 secondes ne se produira pas.
Si tu veux des détails, je peux chercher la solution complète, mais le principe marche puisque je l'utilise dans mes Artisanats (en fait la séquence d'animation de l'artisanat peut-être interrompue pas une action du joueur ou une interventions extérieure, ce qui annule le travail).
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 20/05/2003 16:54:07 Sujet du message :

Oui, c'est à ça que je pensais, le problème étant que la 1ère action est du type ActionPlayAnimation(...), et lorsque le joueur effectue ça, il n'y a aucune action visible dans la queue d'action (contrairement à un ActionSit(...) par exemple). A partir de là, je ne vois pas comment faire pour justement transformer ça en une action. Enfin si tu as des détails, oui je suis preneur Very Happy

Merci pour le coup de pouce !
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 20/05/2003 20:23:43 Sujet du message :

Eh bien écoute, je ne m'appelle pas Scriptos et je ne suis pas un dieu, mais j'ai testé cela à l'instant et ça marche :
Code :

//A mettre sur le OnUsed du placeable.
void main()
{
  object oPC=GetLastUsedBy();
  AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP, 1.0, 20.0));
  AssignCommand(oPC, ActionSpeakString("fini de prier ! attendons un peu"));
  AssignCommand(oPC, ActionWait(10.0));
  AssignCommand(oPC, ActionSpeakString("voila, j'ai fini"));
}


Je te l'accorde, la queue d'action n'est pas correctement affichée mais malgré tout, tout fonctionne parfaitement.
Ensuite, si tu veux créer des actions personnalisées tu as plusieurs solutions dont celle-là :
Code :

  AssignCommand(oPC, ActionDoCommand(ActionPersonnalisee()));


La fonction ActionDoCommand convertie une exécution standard d'une fonction en une exécution différée.

Exemple concret :
Code :

void MyAction(object oPC, string sToSay)
{
  AssignCommand(oPC, ActionSpeakString(sToSay));
}

void main()
{
  object oPC=GetLastUsedBy();
  string sToSay="Bonjour la compagnie";
  AssignCommand(oPC, ActionWait(30.0));
  AssignCommand(oPC, ActionDoCommand(MyAction(oPC, sToSay)));
}


Ou encore.

Code :

void MyAction()
{
  string sToSay=GetLocalString(OBJECT_SELF, "TOSAY");
  AssignCommand(OBJECT_SELF, ActionSpeakString(sToSay));
}

void main()
{
  object oPC=GetLastUsedBy();
  string sToSay="Bonjour la compagnie";
  SetLocalString(oPC, "TOSAY", sToSay);
  AssignCommand(oPC, ActionWait(30.0));
  AssignCommand(oPC, ActionDoCommand(MyAction()));
}


Attention lors de la création d'un action personnalisée à bien se souvenir que les actions vont être affectée à un objet par AssignCommand et que lors de leur exécution, ces objets sont les OBJECT_SELF de la fonction créée. Voici pourquoi je présentais cette autre solution.

J'attire ton attention sur les actions différées de la sorte. Il est très difficile de lier les actions différées entre elle surtout si tu fais intervenir de la création ou de la destruction d'objet. Un objet créé par une action différée doit pouvoir être retrouvé par une autre actions différée sans possibilité de passer des paramètres d'une focntion à l'autre autrement que par des sauvegarde de variable (comme dans mon dernier exemple) ou des recherches systématique, ce qui peut s'avérer long... m'enfin je te laisse chercher les petites subtilités du problème. Mr. Green
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 20/05/2003 22:41:33 Sujet du message :

Merci pour ces précisions claires et précises sur le ActionDoCommand, j'ai appris plein de trucs Smile ! Seulement, mon problème est que je veux que la seconde action, celle qui doit se faire au bout de xx secondes, ne se fasse qu'à condition que la première action, à savoir l'animation jouée par le pc, soit effectuée jusqu'au bout...

Bon pour être plus clair, un objet invisible nommé "Se recueillir..." est placé devant un autel. Sur le onUsed de cet objet, le script en question. J'aimerais que si le joueur reste à prier gentiment sans bouger pendant 30 secondes, il regagne une vingtaine de points de vie. Voilà voilà. Le script en lui-même fonctionne impeccable, il est très simple, sauf que si le joueur décide d'interrompre la prière avant ces 30 secondes, la guérison se fera quand même au bout des 30 secondes alors qu'il ne se trouve plus en train de prier, ce qui est débile Very Happy

Je mets le script tel quel pour info :
Code :
void main()
{
object oPC = GetLastUsedBy();
object oCible = GetNearestObjectByTag("Cible"); // un objet invisible pour que le joueur soit tourné face à l'autel
object oTarget = OBJECT_SELF;
int nHeal;

if (GetIsPC(oPC))
  {
  if(GetIsObjectValid(oTarget))
    {
    DelayCommand(1.0, AssignCommand(oPC, SetFacingPoint(GetPosition(oCible))));
    DelayCommand(1.0, AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 35.0)));
    if(GetAlignmentGoodEvil(oPC) != ALIGNMENT_EVIL)
      {
      nHeal = 20;
      DelayCommand(30.0, FloatingTextStringOnCreature("Un profond bien-être vous envahit...", oPC, FALSE));
      DelayCommand(34.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_M), oPC));
      DelayCommand(34.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(nHeal), oPC));
      }
    else
      {
      if(GetCurrentHitPoints(oPC) <= 20)
        {
        nHeal = (GetCurrentHitPoints(oPC)-1);
        }
      else
        {
        nHeal = 20;
        }
      DelayCommand(30.0, FloatingTextStringOnCreature("Vous ressentez une violente douleur cérébrale...", oPC, FALSE));
      DelayCommand(34.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLOW), oPC));
      DelayCommand(34.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nHeal), oPC));
      DelayCommand(35.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oPC, 60.0));
      }
    }
  }
}


Voilà comme ça ce sera peut-être plus clair Smile Je réfléchis à tout ça de mon côté et si jamais qqun avait une idée de génie, je suis preneur

PS : c'est d'autant plus idiot qu'au départ je voulais juste mettre un petit truc de fun dans mon module et là ça prend des proportions élyséennes Laughing
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 21/05/2003 00:11:46 Sujet du message :

Il est trop tard pour que je te rédige la solution, mais elle dérive de mon premier script. Si l'action d'animation est interrompue, le personnage n'aura pas l'action de guérison qu'on a placé dans sa queue d'action. Si tu es patient, je te fais le script qui correspond après ma nuit de sommeil, car là j'ai plus les yeux en face des trous
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 21/05/2003 05:54:23 Sujet du message :

Hop là c'est bon je me suis débrouillé et ça fonctionne, pas la peine de te prendre la tête pour moi. Merci beaucoup en tout cas, ce petit truc tout bête fut fort instructif. Pour ceux qui sont curieux voilà donc le script final :

Code :
void Guerison(object oPC, string sPhrase, int nHeal)
{
AssignCommand(oPC, FloatingTextStringOnCreature(sPhrase, oPC, FALSE));
AssignCommand(oPC, ActionWait(1.5));
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_M), oPC));
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(nHeal), oPC));
}

void Blessure(object oPC, string sPhrase, int nHeal)
{
AssignCommand(oPC, FloatingTextStringOnCreature(sPhrase, oPC, FALSE));
AssignCommand(oPC, ActionWait(1.5));
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_NEGATIVE), oPC));
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nHeal), oPC));
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oPC, 60.0));
}

void main()
{
object oPC = GetLastUsedBy();
object oCible = GetNearestObjectByTag("Cible");
object oTarget = OBJECT_SELF;
int nHeal;

if (GetIsPC(oPC))
  {
  if(GetIsObjectValid(oTarget))
    {
    AssignCommand(oPC, SetFacingPoint(GetPosition(oCible)));
    AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 35.0));

    if(GetAlignmentGoodEvil(oPC) != ALIGNMENT_EVIL)
      {
      string sPhrase = "Un profond bien-être vous envahit...";
      nHeal = 20;
      ActionWait(30.0);
      AssignCommand(oPC, ActionDoCommand(Guerison(oPC, sPhrase, nHeal)));
      }

    else
      {
      string sPhrase = "Vous ressentez une violente douleur cérébrale...";
      if(GetCurrentHitPoints(oPC) <= 20)
        {
        nHeal = (GetCurrentHitPoints(oPC)-1);
        }
      else
        {
        nHeal = 20;
        }
      ActionWait(30.0);
      AssignCommand(oPC, ActionDoCommand(Blessure(oPC, sPhrase, nHeal)));
      }
    }
  }
}


Bye !
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 36.74ms