La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 20/05/2024 18:34:21


  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 : 15/03/2003 02:10:21 Sujet du message : Script genre "Anneau de Sauron"

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 Very Happy)

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 Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Jedaï
Chevalier
Inscrit le: 14 Nov 2002
Messages: 89
Localisation: Le Havre, ville pourrie
Répondre en citant
Posté le : 15/03/2003 14:25:19 Sujet du message :

Euh lourd, très lourd, vraiment très lourd à mettre sur un OnHeartbeat.... Confused
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).... Confused

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... Embarassed


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). Very Happy

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. Embarassed

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. Very Happy
(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 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 : 15/03/2003 16:50:46 Sujet du message :

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 Shocked
_________________
» 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
 
Taern
Ecuyer
Inscrit le: 11 Avr 2003
Messages: 45
Localisation: 92
Répondre en citant
Posté le : 11/04/2003 22:44:56 Sujet du message :

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 ( Very Happy ), je ne peux rester silencieux dans ce cas Smile

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 Laughing )).

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 Razz .

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 !
Cool

[EDIT] Oups ! désolé d'avoir remonté un post aussi vieux Embarassed j'espère qu'au moins ça servira à quelquechose Very Happy
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Jedaï
Chevalier
Inscrit le: 14 Nov 2002
Messages: 89
Localisation: Le Havre, ville pourrie
Répondre en citant
Posté le : 12/04/2003 06:44:00 Sujet du message :

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). Very Happy
 
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 : 12/04/2003 12:53:45 Sujet du message :

Absolument mon cher Taern, je suis attentif à la critique. Je te remercie d'ailleurs de me contredire, j'ai tendance à être un tantinet borné Laughing

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é Confused 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 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
 
Taern
Ecuyer
Inscrit le: 11 Avr 2003
Messages: 45
Localisation: 92
Répondre en citant
Posté le : 12/04/2003 23:39:34 Sujet du message :

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 Razz

Sinon, ben de rien Cool
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Baldurien
L'homme qui chutait sur le macadam
Inscrit le: 12 Sep 2002
Messages: 14065
Localisation: Quadran Alpha
Répondre en citant
Posté le : 13/04/2003 08:13:05 Sujet du message :

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 Smile

(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 Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Taern
Ecuyer
Inscrit le: 11 Avr 2003
Messages: 45
Localisation: 92
Répondre en citant
Posté le : 13/04/2003 11:01:43 Sujet du message :

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 Smile
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 Voir le profil de l'utilisateur Envoyer un message privé 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 : 13/04/2003 17:55:22 Sujet du message :

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 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.571ms