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 29/12/2024 02:11:33
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 |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Voilà un script qui permet de faire apparaître aléatoirement sur la zone du PC des spectres, lorsque le PC met un objet sur lui, et inversement de faire disparaitre les spectres lorsque le PC enlève l'objet (en l'occurence un gant, mais ç'aurait pu être un anneau, à la JRR Tolkien )
A placer sur le OnHeartBeat du module (le script s'adapte à toutes les zones d'un même module. Code : ////////////////////////////////////////////
// // // Script du gantelet spectral par finipe // // e-mail : fibrustulette@yahoo.fr // // // //////////////////////////////////////////// // // // A placer dans le OnHeartBeat du module // // (ou de la zone selon vos besoins // // de scenario) // // // //////////////////////////////////////////// // // // - Creez un objet pour le gantelet // // spectral dont le tag est "GANTELET" // // // // - Creez une creature pour les // // spectres dont le tag est "SPECTRE" // // // //////////////////////////////////////////// // // // Merci a lendraste pour le script // // donnant la taille de la zone. // // // //////////////////////////////////////////// //--> Recuperer la largeur de la zone int GetAreaXDim(object oArea) { int nX; int nEnd; location lLoc; vector vPos; nEnd = FALSE; while ((nX<=31) && (!nEnd)) { vPos = Vector(IntToFloat(nX), 0.0, 0.0); lLoc = Location(oArea, vPos, 0.0); int nCol = GetTileSourceLight1Color(lLoc); if (nCol == 519) { nEnd = TRUE; nX--; } else { nX++; } } return nX+1; } //--> Recuperer la profondeur de la zone int GetAreaYDim(object oArea) { int nY; int nEnd; location lLoc; vector vPos; nEnd = FALSE; while ((nY<=31) && (!nEnd)) { vPos = Vector(0.0, IntToFloat(nY), 0.0); lLoc = Location(oArea, vPos, 0.0); int nCol = GetTileSourceLight1Color(lLoc); if (nCol == 519) { nEnd = TRUE; nY--; } else { nY++; } } return nY+1; } //--> Script du gant spectral void main() { //--> Definitions... effect eVis = EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE); effect eVis2 = EffectVisualEffect(VFX_DUR_AURA_ODD); effect eVis3 = EffectVisualEffect(VFX_FNF_DISPEL_GREATER); effect eVis4 = EffectVisualEffect(VFX_FNF_SMOKE_PUFF); object oGant = GetObjectByTag("GANTELET"); object oPC = GetFirstPC(); int i; /* La variable locale "monde_spectral" permet de verifier si le script doit se declencher ou non */ if (GetLocalInt(oPC, "monde_spectral") != 1) { //--> Si le PC porte le gantelet spectral... if (GetTag(GetItemInSlot(INVENTORY_SLOT_ARMS, oPC)) == "GANTELET") { SetLocalInt(oPC, "monde_spectral", 1); // application de l'effet "visage spectral" sur le PC // et autre effet temporaire pour faire joli :-) ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oPC); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis3, oPC); for(i=1 ; i<=20 ; i++) // de 1 jusqu'a 20 : vous pouvez changer cette valeur pour modifier le nombre de spectre a creer { // definition d'un vecteur aleatoire sur l'area vector vRandomPos; vRandomPos.x = IntToFloat(Random(GetAreaXDim(GetArea(oPC))*10)); vRandomPos.y = IntToFloat(Random(GetAreaYDim(GetArea(oPC))*10)); vRandomPos.z = 0.0; // location correspondante au vecteur aleatoire location lLoc = Location(GetArea(oPC), vRandomPos, (GetFacing(oPC)-180.0)); // creation du spectre sur le waypoint aleatoire CreateObject(OBJECT_TYPE_CREATURE,"SPECTRE",lLoc,TRUE); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, GetObjectByTag("SPECTRE", i-1)); } } } if (GetLocalInt(oPC, "monde_spectral") == 1) { //--> Si le PC ne porte pas le gantelet spectral, ou s'il ne porte pas de gants du tout if ((GetTag(GetItemInSlot(INVENTORY_SLOT_ARMS, oPC)) != "GANTELET") || (!(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_ARMS, oPC))))) { SetLocalInt(oPC, "monde_spectral", 0); // supprimer les spectres for(i=1 ; i<=20 ; i++) { object oSpectre = GetObjectByTag("SPECTRE", i-1); if(GetIsObjectValid(oSpectre)) { DestroyObject(oSpectre, 0.0); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis4, oSpectre); } else break; } // annuler l'effet "visage spectral" du PC effect eEffect = GetFirstEffect(oPC); RemoveEffect(oPC, eEffect); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis3, oPC); } } } Reste quelques trucs à aménager : - trouver une solution pour pouvoir démarrer un son lorsque le PC porte le gant, et ce quelle que soit la zone - trouver une solution pour changer les éclairages et la brume lorsque le PC porte le gant, histoire de rendre l'atmosphère plus glauque - une incertitude pour l'annulation de l'effet... effect eEffect = GetFirstEffect(oPC); RemoveEffect(oPC, eEffect); ... je ne sais pas ce qui se passe si le PC est déjà affecté par un effet ou plusieurs. A voir. _________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine » 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII Dernière édition par finipe le 15/03/2003 17:38:23; édité 1 fois
|
Revenir en haut | |
Jedaï Chevalier Messages: 89 Localisation: Le Havre, ville pourrie |
Euh lourd, très lourd, vraiment très lourd à mettre sur un OnHeartbeat....
Je te déconseille très fortement de t'engager dans cette voie si tu compte faire un monde multijoueur d'une dimension raisonnable (même si ici c'est un script pour un jeu solo).... D'autant que tu pourrais carrément optimiser ce script.... Plusieurs questions donc : 1) Cet objet est-il en un seul exemplaire sur ton module 2) Pourquoi faire toutes tes déclarations au début, où elles ne sont pas utiles (surtout oGant, inutilisé) 3) Pourquoi ne pas déclarer les dimensions de l'area en dehors de ta boucle for() (la fonction est très lourde (et assez géniale je dois dire !)) Encore mieux pourquoi ne pas les stocker sur l'Area en tant que local int au chargement du module. 4)D'autres remarques sans importance... Bon pour un monde solo ça va encore et en plus ça ne ramera vraiment que lors de la convocation des spectres (là ça devrait ramer méchamment si tu as un module un peu lourd). Alors tes questions maintenant : 1) Je suppose (vu le but de ton script) que tu veux que ce son soit joué en continu tant que le PJ porte le gant ? Dans ce cas je te conseille plutôt d'utiliser les fonctions AmbientSoundChangeDay() et AmbientSoundChangeNight() avec éventuellement AmbientSoundSet(Day/Night)Volume() au début et à la fin AmbientSoundStop(). Tu peux aussi essayer PlaySound() mais c'est plus limité et les sound objects devraient être copiés dans toutes tes zones (c'est peut-être la meilleure solution si tu as le courage toutefois). 2) A priori la brume n'est pas modifiable par script mais tu peux modifier l'éclairage et les couleurs grâces aux fonctions : SetTileMainLightColor() et SetTileSourceLightColor(). 3)Si le PJ est déjà affecté par plusieurs effets, je crois que tu supprimera le dernier à lui avoir été affecté donc pas forcément le bon. A cela deux solutions : L'une consiste à faire une boucle dans les effets de cette façon : Code : effect eEffect = GetFirstEffect( oPC ); while( GetIsEffectValid( eEffect ) ) { if( GetEffectType( eEffect ) == EFFECT_TYPE_* ) { RemoveEffect( eEffect ); } eEffect == GetNextEffect( oPC ); } Problème, je n'ai jamais utilisé cette méthode avec les effets visuels, je ne sais donc pas si elle marche bien avec eux. Donc deuxième méthode : Tu peux t'éviter d'avoir à enlever tes effets provoqué par le port de ton gant, il te suffit de ne les créer que pour 6.5 secondes, à chaque fois que le OnHeartBeat se répète et que ton PJ porte toujours le gant. Ils disparaîtront ainsi automatiquement avec le gant. C'est la méthode que je te conseille. (D'ailleurs tu avais oublié de supprimer aussi l'effet Aura Odd) N'hésite pas à me demander de repréciser certains points. |
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Oui oui oui tout cela est très pertinent... pour la lourdeur du onHeartBeat, je n'en suis pas si sûr. En solo, c'est sûr que ça passe très bien. Sur un module plus lourd, il est envisageable de mettre tout simplement moins de spectres (je pense que c'est surtout ça qui fait ramer). De plus, le script ne se déclenche qu'en deux occasions grâce à la variable locale : soit le PC met le gant, soit il l'enlève, finalement ça revient au même que si le script démarrait en utilisant un placeable.
Pour répondre à tes questions : 1 - Oui, je pense que c'est le genre d'objet qui ne peut être qu'en un seul exemplaire dans un module. 2 - oGant inutilisé, c'est un oubli, en fait j'ai pas mis tout le script ici, puisque j'ai déjà fait qques tests pour changer les lumières, mais que je n'ai pas reporté dans mon message par soucis de concision. 3 - C'est exact, ce serait bcp mieux de déclarer les dimension en dehors de la boucle for. Pour les changements de couleurs et de son, je réfléchi actuellement à une solution pas trop lourde (l'objectif étant que ça puisse se faire sur toutes les zones du module, alors effectivement ce serait lourd de mettre un objet son inactif et continu sur CHAQUE zone du module). Pour l'annulation de l'effet, j'avais essayé ça : Code : effect eEffect = GetFirstEffect(oPC);
if (eEffect == EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE)) { RemoveEffect(oPC, eEffect); } else { effect eEffect = GetNextEffect(oPC); while (eEffect != EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE)) { effect eEffect = GetNextEffect(oPC); } RemoveEffect(oPC, eEffect); } ... mais ça marche pas. A voir donc. Et enfin, pour ta méthode de suppression de l'effet en le remettant toutes les 6.5 secondes, ne penses-tu pas que ça fait ça de plus comme charge sur le CPU ? Enfin voilà voilà, je pense que ça pourrait être un script assez sympa, mais pour qu'il s'adpate à toutes les zones, c'est chaud _________________ » 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 | |
Taern Ecuyer Messages: 45 Localisation: 92 |
Hop là, je profite de ce post pour passer un tit bonjour à ce forum, étant un participant (infidèle en plus) des forums de JOL.
Bon alors, malgré que le fait de donner raison à Jedaï me soit à chaque fois douloureux ( ), je ne peux rester silencieux dans ce cas Plus sérieusement, je t'assure mon cher Finipe que ton OnHeartBeat risque vraiment d'être nocif (et pourtant je suis le premier à défendre cet évenement ( défendre un évenement ? je débloque )). Bon en fait après relecture attentive du script, effectivement ça devrais passer sans problème en mode solo. En fait il reste surtout le problème de la lisibilité (une fonction ou même un UDE sur la zone auraient été les bienvenus ici). Autre chose, tes boucles for sont trop chargées. Ca joue sur la lisibilité, mais pas seulement. Je ne suis pas un expert en compilation, mais pourtant le fait de redéclarer les variables plusieurs fois dans une boucle me paraît un peu malhonnête . Enfin, juste une petite contribution qui, elle, sera sûrement utile : la fonction PlaySound n'a pas besoin d'un "objet" son dans la zone pour jouer un son. En fait l'argument se trouve être la référence du son (pour les obtenir, pas évident, ce que j'ai trouvé de mieux c'est regarder dans les propriétés des objets sons faits par Bioware, mais doit y avoir un autre moyen). Donc si tu trouve un son convenable ça serait d'après moi la meilleure solution. Vala, savoir accepter les critiques c'est le premier pas vers la gloire et la renommée ! [EDIT] Oups ! désolé d'avoir remonté un post aussi vieux j'espère qu'au moins ça servira à quelquechose |
Revenir en haut | |
Jedaï Chevalier Messages: 89 Localisation: Le Havre, ville pourrie |
Pour PlaySound() ma phrase n'était peut-être pas très claire, mais effectivement je présentais là les trois façon différente d'accéder au son : Ambient...(), PlaySound() et les SoundObject avec SoundObjectStart() et Stop() (ou un truc comme ça).
|
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Absolument mon cher Taern, je suis attentif à la critique. Je te remercie d'ailleurs de me contredire, j'ai tendance à être un tantinet borné
En vérité je me base sur l'exemple testé sur mon pc, qui ne rame pas du tout avec ce script. Mais c'est vrai que c'est une machine pas mal, donc ce n'est probablement pas le meilleur exemple. Pour la fonction playsound c'est une excellente idée, je n'y avais guère pensé seulement je trouve que souvent les sons utilisés avec cette méthode ne sont pas assez forts pas rapport aux autres (ambiance, musique etc.) qu'en pensez-vous ? Thx pour les réponses, c'est tjs appréciable _________________ » 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 | |
Taern Ecuyer Messages: 45 Localisation: 92 |
Je suppose que PlaySound prend en compte les paramètres du jeu, donc que ces sons se jouent au même volume que les autres.
Enfin après si tu considère que des sons d'ambiance (genre le crépitement d'une torche) c'est sûr qu'ils doivent être assez discrets Sinon, ben de rien |
Revenir en haut | |
Baldurien L'homme qui chutait sur le macadam Messages: 14066 Localisation: Quadran Alpha |
pourquoi ne pas mettre ceci dans un endroit plus logique ? genre OnAcquireItem (même si c'est faussé le comportement du gant)
Car le HB... heu lourd, lourd comme ils disent (vivement que Bioware pense à ajouter une section script aux objets, du genre: OnUse, OnHit, OnMiss, etc. Idem pour les armures avec des trucs du genre: OnProtect, OnHurt, etc) _________________ #nwnights-fr @ irc.darkmyst.org TitanQuest-FR |
Revenir en haut | |
Taern Ecuyer Messages: 45 Localisation: 92 |
En fait Bioware a évoqué un évenement OnCreatureHit, qui se déclencherait au niveau du module, mais pas pour avant la 2ème expansion. Même chose pour un évenement OnEquip.
Par contre il a été clairement dit que des évenements propres à chaque objet (arme, armure etc.) ne sont pas faisables avec le moteur actuel. Mais effectivement faire un ptit script récurrent qui se lancerait sur le OnAcquireItem et s'arrêterait sur le OnUnacquireItem, ça marcherait aussi Enfin là le script est quand même clairement destiné à un module solo, donc c'est pas indispensable (enfin d'après moi). |
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
C'est vrai que certains événements manquent cruellement ; la question s'est posée assez souvent, et la seule réponse possible c'est le onHeartBeat suivi d'une série de variables locales pénibles à manipuler...
_________________ » 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 | |
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