La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 18:09:40
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Silverwave Ecuyer Messages: 69 |
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é ! ~ : |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
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 | |
warpShadow Légende vivante Messages: 363 Localisation: Perpignan |
Désolé hein. 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. une piste ? (les scripts sont tels quels quasiment, je ne les remet pas ici). Merci _________________ Asphia Module RP Médiéval Fantastique pour Neverwiner Nights |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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