La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 04/05/2024 12:38:03


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Silverwave
Ecuyer
Inscrit le: 21 Mai 2003
Messages: 69
Répondre en citant
Posté le : 02/08/2003 23:26:13 Sujet du message : Garde qui prend une torche la nuit mais pas le jour.

Voilà, j'aimerais faire un script pour que mes gardes de ville, lors de la niut tombée, sortent leur torche de leur inventaire et l'équippent et l'inverse lors de l'arrivée de l'aube.

Voici mon script, mais il ne semble rien faire.
Je l'est mit dans OnHeartBeat.

Code :
 if ((GetIsNight() == TRUE) || (GetIsDusk() == TRUE))
    {
        ActionEquipItem(GetObjectByTag("NW_IT_TORCH001"), INVENTORY_SLOT_RIGHTHAND);
    }

    if ((GetIsDay() == TRUE) || GetIsDawn() == TRUE)
    {
        ActionUnequipItem(GetObjectByTag("NW_IT_TORCH001"));
    }

_________________
~ J'suis rendu un écuye ! Yé ! ~

Laughing:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé 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 : 03/08/2003 00:38:25 Sujet du message :

Ta fonction GetObjectByTag va rapporter la référence d'UNE torche dans ton module et non la référence de LA torche que possède le PNJ. De ce fait, le premier objet trouvé dans le module et portant le tag NW_IT_TORCH001 n'est pas forcément celle que possède le PNJ, et pour cause, tu as sans doute plusieurs PNJs possèdant une torche.
Pour que cela fonctionne, utilise GetItemPossessedBy qui te renverra une référence à une objet possédé par une créature, tout ceci en le cherchant par le TAG. Remplace tes GetItemByTag("NW_IT_TORCH001") par GetItemPossessedBy(OBJECT_SELF, "NW_IT_TORCH001"). Par ailleurs, je crois que les torches s'équipent dans INVENTORY_SLOT_LEFTHAND

Par ailleurs, ce n'est pas le seul problème que tu vas rencontrer. Ton script va s'exécuter toutes les 6 secondes pour autant de garde que tu vas mettre dans ton module. Cela risque de charger un peu ton processeur. Secondement, toutes les 6 secondes durant la nuit, le personnage équipera sa torche, même s'il l'a déjà en main. Il n'y a pas de notion de "passage" du jour à la nuit avec ta solution, dans ton script, tout le temps qu'il fait nuit, toutes les 6 secondes, ton garde équipe sa torche.

Voici, à mon sens quelque chose qui fonctionnera mieux et sera moins gourmand en ressource :
Dans le OnHeartbeat du module, tu testes le passage du jour à la nuit et vice-versa, de la façon suivante :
Code :

void main()
{
  int nIsDay=GetLocalInt(GetModule(), "ISDAY"); //situation au moment de l'exécution du script
  if (nIsDay)
  {
    //Il faisait jour il y a 6 secondes, on teste si la situation change
    if (GetIsDawn() || GetIsNight())
    {
      //Il fait nuit maintenant, on exécute un script qui demande aux gardes de prendre leurs torches et on enregistre le changement de situation
      ExecuteScript("gardtaketorch", GetModule());
      SetLocalInt(GetModule(), "ISDAY", FALSE);
    }
  }
  else
  {
    //Il faisait nuit il y a 6 secondes, on teste si la situation a changé
    if (GetIsDusk() || GetIsDay())
    {
      //Il fait jour maintenant, on fait en sorte que les gardes lachent leur torche et on enregistre la nouvelle situation
      ExecuteScript("garddroptorch", GetModule());
      SetLocalInt(GetModule(), "ISDAY", TRUE);
    }
  }
}


Ce Heartbeat de module testera la situation enregistrée au dernier passage (s'il fait jour ou nuit) et n'exécutera un script que s'il y a un changement. A noter que dès sa première exécution, il peut y avoir un changement, puisque la situation de départ ne sera pas enregistrée est sera considérée par défaut comme la nuit (un entier en variable est égal à 0 quand il n'existe pas). Comme le OnHeartbeat s'exécute toutes les 6 secondes, cette initialisation sera rapide. Au pire, 6 secondes après avoir démarré, tes gardes seront comme il faut.

Enfin enore faut-il créer les script appelé lors des changements. En supposant que tous tes gardes portent le même tag (on va dire "GARDE"), voilà ce que ça donnerait :

Le script "gardtaketorch"
Code :

void main()
{
  int nCount=0;
  object oGard=GetObjectByTag("GARDE", nCount);
  while (GetIsObjectValid(oGard))
  {
    AssignCommand(oGard, ActionEquipItem(GetItemPossessedBy(oGard, "NW_IT_TORCH001"), INVENTORY_SLOT_LEFTHAND));
    nCount++;
    oGard=GetObjectByTag("GARDE", nCount);
  }
}


le script "garddroptorch"
Code :

void main()
{
  int nCount=0;
  object oGard=GetObjectByTag("GARDE", nCount);
  while (GetIsObjectValid(oGard))
  {
    AssignCommand(oGard, ActionUnequipItem(GetItemPossessedBy(oGard, "NW_IT_TORCH001")));
    nCount++;
    oGard=GetObjectByTag("GARDE", nCount);
  }
}


Bien entendu, si tu n'as que peu de garde, la première solution avec OnHeartbeat sur les gardes te suffira amplement, au détail prêt cité plus haut.

Il y aurait une solution plus élégante avec les évènements personnalisés (voir un de mes précédents et récents messages), mais c'est peut-être trop pour ce que tu as à faire.
_________________
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
 
warpShadow
Légende vivante
Inscrit le: 01 Fév 2005
Messages: 363
Localisation: Perpignan
Répondre en citant
Posté le : 04/02/2008 13:13:03 Sujet du message :



Désolé hein. Very Happy

Donc voilà, je me suis servi de ce script, maiiiis... Il ne marche pas (eh oui !). Pas de problème de tag. Alors je me demande d'où il vient le p'tit souci quoi. Confused

une piste ?
(les scripts sont tels quels quasiment, je ne les remet pas ici).

Merci Smile
_________________
Asphia
Module RP Médiéval Fantastique pour Neverwiner Nights
 
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 22.051ms