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 19:33:52
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 |
lu ciol Novice Messages: 6 |
Bonjour, dans une de mes mes quetes, le perso doit tuer 20 ames en peine. Donc pour tester la quete j'ai commencer avec 1 ame en peine. J'utilse la variable "roguemort" que j'initialise dans le dialogue de quete:
NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Aprés dans les propriétés de l'ame en peine à l'option "on death" j'utilise le script d'origine que j' ai modifié et renommé NWScript :
#include "x2_inc_compon" #include "x0_i0_spawncond" void main() { int vmort = GetLocalInt(GetPCSpeaker(), "roguemort" ); int nClass = GetLevelByClass(CLASS_TYPE_COMMONER); int nAlign = GetAlignmentGoodEvil(OBJECT_SELF); object oKiller = GetLastKiller(); // If we're a good/neutral commoner, // adjust the killer's alignment evil if(nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL)) { AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5); } // Call to allies to let them know we're dead SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK); //Shout Attack my target, only works with the On Spawn In setup SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK); // NOTE: the OnDeath user-defined event does not // trigger reliably and should probably be removed if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(1007)); } craft_drop_items(oKiller); vmort = vmort + 1 ; SetLocalInt(GetPCSpeaker(), "roguemort", vmort ); } Donc dans le test je tue l'ame en peine et aprés, je retourne voir le personnage de quete qui normalement devrais changer de discours avec: NWScript :
int StartingConditional() { // Inspecter variables locales if(!(GetLocalInt(GetPCSpeaker(), "roguemort") == 1)) return FALSE; return TRUE; } Mais, j'avais toujours le meme discours. Donc j' ai essayé d'installer un brasero qui s'allume lorsque l'ame en peine est morte. Donc dans les propriété du brasero au scrip onused j'ai rectifié celui d'origine par : NWScript :
void main() { if((GetLocalInt(GetPCSpeaker(), "roguemort") == 1)) { object oSelf = OBJECT_SELF; PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE); //DelayCommand(0.4,SetPlaceabl eIllumination(oSelf, TRUE)); SetLocalInt(OBJECT_SELF,"NW_L_AMION",1); //DelayCommand(0.5,RecomputeSt aticLighting(GetArea(oSelf))); effect eLight = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_20); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oSelf); } else { object oSelf = OBJECT_SELF; PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE); //DelayCommand(0.4,SetPlaceabl eIllumination(oSelf, FALSE)); SetLocalInt(OBJECT_SELF,"NW_L_AMION",0); //DelayCommand(0.9,RecomputeSt aticLighting(GetArea(oSelf))); effect eEffect = GetFirstEffect(oSelf); while (GetIsEffectValid(eEffect) == TRUE) { if (GetEffectType(eEffect) == EFFECT_TYPE_VISUALEFFECT) RemoveEffect(oSelf, eEffect); eEffect = GetNextEffect(oSelf); } } } Mais pareil le brasero est toujours allumé. Etant novice dans Aurora ( c'est mon premier module ), Y a peut etre quelque chose qui m'échappe. D'avance merci. PS: j'essai de m'inspirer ( d'adapter ) l'acte 1 de diablo 2 sur NWN d' où la premiére quete avec l'antre maléfique ou il faut éradiquer toutes les créatures de la grotte. Edit finipe : balises NWScript rajoutées |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Salut. Alors déjà utilise les balise [*NWscript][*/NWscript] (sans les *) pour les scripts, on s'y retrouve plus vite
Donc, quand le joueur accepte le dialogue tu mets la variable "roguemort" a 0 : NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. ensuite, dans le Ondeath des ames en peine tu leur mets ça : NWScript :
void main() { object oPC = GetLastKiller(); int iAme = GetLocalInt(oPC, "roguemort"); if(iAme == 20) { SendMessageToPC(oPC, ""); } else { iAme++; SendMessageToPC(oPC, "Vous avez tuer "+IntToString(iAme)+" pour le moment"); } } Voila c'est fait rapidement sans l'éditeur, donc je sais pas si j'ai fait des erreurs, mais me semble pas, donc teste avec ça. Aufaite, ta pas besoin de te compliquer la vie a faire un brasero ou un dialogue pour voir si tu as tuer une ame, tu a juste a utilisé SendMessageToPC voila _________________ [http] |
Revenir en haut | |
Djezebel Héros Messages: 252 |
Dans ton script "onDeath" tu as marqué :
NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Le joueur ne parle pas à la créature, donc ce ne sera pas "GetPCSpeaker". Le GetPCSpeaker ne peut fonctionner que lors d'une conversation. Là, le joueur, c'est celui qui est définit comme ayant tué la créature donc : GetLastKiller(). Etant donné qu'il est définit dans le script, je t'invite à mettre ceci en dessous de la ligne définissant le oKiller : NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Normalement ça devrait aller mieux. |
Revenir en haut | |
lu ciol Novice Messages: 6 |
Merci à vous deux, effectivement cela fonctionne mieux.
J'ai procéder ainsi pour la variable. int vmort = GetLocalInt(GetModule(), "roguemort" ); J'ai mis des colonnes luineuses un peut partout dans la zone, et elles s' allument bien une fois que les 20 ames en peine sont mortes. Maintenant mon probléme c'est de faire dire un message en conséquence au personnage de quete, mais là j'y arrive pas. J'ai essayé ça dans les actions requises ( au niveau des dialogues) : NWScript : int StartingConditional() { // Inspecter variables locales if ((!GetLocalInt(GetModule(), "roguemort" ) ==20 )) return FALSE; return TRUE; } |
Revenir en haut | |
lu ciol Novice Messages: 6 |
J'ai trouvé ce qui cloché, Le ! avant la condition doit inverser la comparaison (==20)
donc la comparaison été valider pour tout ce qui était diférent de 20. Donc j'ai enlevé le !, puis là j'ai inversé l'ordre du False et du TRUE. Ce qui donne: NWScript :
int StartingConditional() { // Inspecter variables locales if (GetLocalInt(GetModule(), "roguemort" ) ==20 ) return TRUE; return FALSE; } Champagne ça marche |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Pour débutant, il est mieux de ne pas mettre de if((!, les points d'exclamation pose toujours probleme au début
_________________ [http] |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
C'est juste une histoire de grammaire. Le point d'exclamation était juste mal placé (ou la parenthèse c'est selon), il fallait faire :
NWScript :
if (GetLocalInt(GetModule(), "roguemort") !=20 ) //ou if (!(GetLocalInt(GetModule(), "roguemort") ==20) ) Là il comparait !(GetLocalInt(blabla)) à 20. Donc un résultat logique (TRUE/FALSE) soit 0 et 1 à 20, donc toujours faux. En revanche, tu peux écrire ta condition plus simplement : NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Ca renvoit bien TRUE si la varible vaut 20, FALSE sinon. |
Revenir en haut | |
lu ciol Novice Messages: 6 |
Pour écrire mon premier script éronné, je m' étais basé sur les script que donnent les assistants script de l' aide au dialogue.
D'aprés ce que j'ai pu comprendre le ! correspond à la fonction inverse dans la logique combinatoire ( dans les systémes logique électronique) c'est à dire qu'en binaire,si a=1 a!=0 ( ou "a barre" mais je ne voit pas comment le rédiger ). Donc dans mon premier script ( avec ! ) toutes les valeurs pouvait passer sauf 20 Enfin, c'est ce que je crois avoir compris Je débute dans l'éditeur aurora.Désolé |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Oui ta compris t'inquiete pas Mais fait plutot comme Sith ta montrer, c'est largement plus simple, ou alors si t'es fana des point d'exclamation, à la place de faire if(!(... tu fait != (à la place de ==)
_________________ [http] |
Revenir en haut | |
burning-angel Novice Messages: 10 |
j ai exactement le même code que lu ciol à la différence pret que je décompte au lieu de compter, tout marche à la perfection ! sauf... pour le famillier de mon druide... alors comment faire pour corriger la valeur de oKiller pour qu il compte (ou décompte) même si c'est le pet qui tue la créature
ca va faire un bon moment que je cherche une solution et je tourne en rond... actuellement mon script est ceci pour la définition de oKiller : NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. d'avance merci a qui m'aidera et a qui trouver la réponse. |
Revenir en haut | |
Flumby Chevalier Messages: 71 |
apres ta définition du tueur, fait un test pour savoir si la créature à un maitre, ca donnerait a peu près ca :
NWScript :
object oKiller = GetLastKiller(); object oMaster = GetMaster(oKiller); if(oMaster != OBJECT_INVALID){ oKiller = oMaster;} else {;} /* La suite du code */ Edit. Sachant qu'il peut y avoir des invocation d'invocation (la première solution est peut être un peu limite, tu peux aussi faire ca, pour être sur de remonter au maitre suprême (le joueur) NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Ca te renverra a coup sur la maitre _________________ Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel Preuve => http: |
Revenir en haut | |
burning-angel Novice Messages: 10 |
je teste ca tout de suite !
merci ! |
Revenir en haut | |
burning-angel Novice Messages: 10 |
ca marche !
merci beaucoup ! je retiendrais ses lignes de codes pour d autres quest dans mon module ! |
Revenir en haut | |
OVLORD Acolyte Messages: 22 |
Black Knight a écrit : Salut. Alors déjà utilise les balise [*NWscript][*/NWscript] (sans les *) pour les scripts, on s'y retrouve plus vite
BONJOUOIR (contraction de bonjour et de bonsoir lol pour pas se tromper mmm bref^^)
Donc, quand le joueur accepte le dialogue tu mets la variable "roguemort" a 0 : NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. ensuite, dans le Ondeath des ames en peine tu leur mets ça : NWScript :
void main() { object oPC = GetLastKiller(); int iAme = GetLocalInt(oPC, "roguemort"); if(iAme == 20) { SendMessageToPC(oPC, ""); } else { iAme++; SendMessageToPC(oPC, "Vous avez tuer "+IntToString(iAme)+" pour le moment"); } } voila Voila ces 2 sripts (up^^) me plaisent beaucoup mais hélas le compteur ne marche pô A chaque orques(oui chez moi c'est des orques^^) tués ça me marque toujours "vous avez tué 1 orque" sans donc faire l'addition *snif* et quand j'atteint la quantité souhaitée par la variable (20 donc) le dialogue correspondant à la condition apparait pas Donc!!!! 1- need help^^ 2- est-ce possible que "le massacre" apparaisse en mode "crier" avec le nom du PC: <FullName> a tué ... orques! -> pour un concour à la Légolas versus Gimli ça serait sympa ^^ Enfin voila... un scripteur charitable s'il vous plait??? ^^ D'avance merci |
Revenir en haut | |
warpShadow Légende vivante Messages: 363 Localisation: Perpignan |
Salut.
Pour la premiere question, ce qui manque c'est ta variable +1. Dans le OnDeath de ta créature, tu dois faire ça : NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Pour ta deuxieme question : NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Dans ton script, tu ajoutes : NWScript :
int iCompta = GetLocalInt(oKiller, "NOMDELAVARIABLE"); int iCompte = SetLocalInt(iCompta+1); string sInt = IntToString(iCompte); string sCompte = ""; string sCompte2 = " orcs"; AssignCommand(oPC, SpeakString(GetName(oPC)+sCompte+sInt+sComte2, TALKVOLUME_SHOUT)); je crois que c'est ça (j'ai pas nwn sous la main). _________________ Asphia Module RP Médiéval Fantastique pour Neverwiner Nights |
Revenir en haut | |
OVLORD Acolyte Messages: 22 |
okiiii bon je teste ça et je dis quoi
merciiii |
Revenir en haut | |
OVLORD Acolyte Messages: 22 |
Bonjouuuoirrr et bon week end aussi^^
Voila j'ai testé ce que tu m'as donné Warpshadow et le compteur fonctionne ça c'est parfait. Par contre une fois le nombre de créature qu'il faut abattre atteint, il ne m'affiche pas la phrase NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Sinon le script ci-dessous je n'ai pas trop compris en faite il se rajoute ou se substitut au script a metttre dans le ondeath car ça semble être un compteur également. NWScript :
int iCompta = GetLocalInt(oKiller, "NOMDELAVARIABLE"); int iCompte = SetLocalInt(iCompta+1); string sInt = IntToString(iCompte); string sCompte = ""; string sCompte2 = " orcs"; AssignCommand(oPC, SpeakString(GetName(oPC)+sCompte+sInt+sComte2, TALKVOLUME_SHOUT)); Merci d'éclairer ma vieille torche lol ^^ |
Revenir en haut | |
warpShadow Légende vivante Messages: 363 Localisation: Perpignan |
Salut.
Alors, pour le deuxieme script, il faut l'ajouter bien sûr Si tu ne sais pas le faire, passe-le moi ici. Pour le premier, je ne sais pas, copie-colle moi le script en entier Je repasse ce soir. _________________ Asphia Module RP Médiéval Fantastique pour Neverwiner Nights |
Revenir en haut | |
Ivellios Légende vivante Messages: 447 Localisation: Poitiers |
Tu avais pas NwN sous la main donc tu as laissé plusieurs fautes :
- Tu déclares oKiller et oPC - Tu déclares SetLocalInt en tant qu'entier - Tu as oublié les arguments dans SetLocalInt - sCompte2 tu as mit sComte2 Quelques petites remarques : - Pour ton compteur mieu vaut dans un premier temps récuperer la variable iCompta+1, et tu peut enregistrer la variable ensuite (et iCompta est exploitable car tu as +1). - Point de vu personnel je trouve sCompte, sCompte2 sont pas trop pratique ici, comme ils sont courts autant les mettres directement dans le SpeakString, c'est plus clair et ça evite deux déclarations. (dans d'autres cas je dis pas ^^) Sur ce amuse toi bien _________________ Scripts, systèmes, fonctions,... c'est par ici... Pyjama pour castor, une vocation, un avenir sûr |
Revenir en haut | |
warpShadow Légende vivante Messages: 363 Localisation: Perpignan |
Pas faux Ivellios (salut au passage, depuis le temps ).
J'attend qu'il poste ses scripts et je lui fais tout ça. _________________ Asphia Module RP Médiéval Fantastique pour Neverwiner Nights |
Revenir en haut | |
OVLORD Acolyte Messages: 22 |
En faite je suis pas allé bien loin voila ce que j'ai fait
NWScript :
void main() { object oPC = GetLastKiller(); int iAme = GetLocalInt(oPC, "mort_ork"); SetLocalInt(oPC,"mort_ork",iAme+1); if (iAme == 3) { SendMessageToPC(oPC, ""); } else { iAme++; SendMessageToPC(oPC, "Vous avez tue "+IntToString(iAme)+" orque pour le moment"); } } Apres avoir tué 3 orques, le compteur m'indique "vous avez tué 3 oques pour le moment" et non pas "Bravo!! Vous avez tué 3 orques!!!" phrase devant apparaitre si la variable concernée par le compteur arrive à 3 --> if (iAme == 3) Bon je m'y connais pas mais bon utiliser l'expression "else" est-ce correct? Voila j'ai coincé dès la début comme tu peus le voir - je suis trop PAS fort là lol ^^ Merci encore |
Revenir en haut | |
warpShadow Légende vivante Messages: 363 Localisation: Perpignan |
NWScript :
void main() { object oPC = GetLastKiller(); int iAme = GetLocalInt(oPC, "mort_ork"); SetLocalInt(oPC,"mort_ork",iAme+1); if (iAme == 3) { SendMessageToPC(oPC, ""); } else { iAme++; AssignCommand(oPC, SpeakString(GetName(oPC)+""+IntToString(iAme)+" orques pour le moment", TALKVOLUME_SHOUT)); } } (juste avec le "crier" et le nom que tu voulais, TALKVOLUME). Et en agencé plus facilement pour que tu t'y retrouves. Sinon, j'ai pas trouvé d'erreur, faut voir si ça marche. _________________ 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