La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 22/09/2024 14:16:04


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
sinquem
Ecuyer
Inscrit le: 28 Jan 2004
Messages: 68
Répondre en citant
Posté le : 14/10/2004 08:20:11 Sujet du message : Une Zone bien Chaotique ...

Bonjour à tous,
Voilà j'aurais besoin que lorsque les joueurs entre dans une zone donnée et tant qu'ils sont dans cette zone, reçoive un sort aléatoire sur la tête.
Dans le cas où il sagit d'un groupe de joueur, je prend un joueur au hazzard.

Pour cela j'ai fais ces 2 p'tits scripts, dont le principal se trouve sur le Onbeat de la Zone 2...

1- Je teste sur un module à 2 zones, et lorsque je suis sur la zone 1, le script se déclanche ... pourquoi ?

2- quand je suis dans la zone 2, le script se declanche mais aucun sort n'arrive ... ?

J'ai bien une p'tite idée sur les 2 raisons mais j'aimerais votre avis et surtout savoir aussi si je vais dans la bonne direction.

NWScript :
#include "compte_pj_in_are"

void main()
{
object oPc = GetPjInArea(OBJECT_SELF);

// si pas de joueur trouv bye bye !!
if (!GetIsPC(oPc)) return;

location lLoc=GetLocation(oPc);
SpawnScriptDebugger();
int iAlea=Random(2)+1;

switch(iAlea){
    case 1 : // machin son je sais pas Wink
        ActionCastSpellAtLocation(SPELL_SOUND_BURST,lLoc,METAMAGIC_ANY,TRUE,PROJECTILE_PATH_TYPE_HIGH_BALLISTIC,TRUE);
        break;
    case 2 : // boule de feu
        ActionCastSpellAtLocation(SPELL_FIREBALL,lLoc,METAMAGIC_ANY,TRUE,PROJECTILE_PATH_TYPE_HIGH_BALLISTIC,TRUE);
        break;
    case 3 : // eclair
        ActionCastSpellAtLocation(SPELL_LIGHTNING_BOLT,lLoc,METAMAGIC_ANY,TRUE,PROJECTILE_PATH_TYPE_HIGH_BALLISTIC,TRUE);
        break;
}
}
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.


NWScript :
object GetPjInArea(object oArea)
{
int iNbPj=0;

// recuperation du nombre de pj
object oCreature = GetFirstObjectInArea(oArea);

while (GetIsObjectValid(oCreature))
{
    if (GetIsPC(oCreature)) iNbPj++;
    oCreature=GetNextObjectInArea(oArea);
}

// on determine qui va prendre sur la tete Smile
int iAleaPc = Random(iNbPj)+1;
SendMessageToPC(GetFirstPC(),"iAleapc = "+IntToString(iAleaPc));
// initialisation de la valeur a retourner
object oStock = OBJECT_INVALID;

oCreature = GetFirstObjectInArea(oArea);
while (GetIsObjectValid(oCreature) && iAleaPc > 0)
{
    if (GetIsPC(oCreature)){
        --iAleaPc;
        oStock = oCreature;
    }
    oCreature=GetNextObjectInArea(oArea);
}
return oStock;
}
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.


merci d'avance !!
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
sinquem
Ecuyer
Inscrit le: 28 Jan 2004
Messages: 68
Répondre en citant
Posté le : 15/10/2004 08:28:29 Sujet du message :

J'ai revu le sujet mais voilà dans le script ci-dessous, je bloque sur une boucle infinie !!

Quelqu'un pourrait m'expliquer mon erreur ?
NWScript :
int verifie_presence_pilier(location lLieu)
{
    // on recherche la premiere creature dans un rayon de 30 autour de oCible, au travers des murs
    object oPilier = GetFirstObjectInShape(SHAPE_SPHERE,30.0,lLieu,FALSE,OBJECT_TYPE_PLACEABLE);
    int iTest=FALSE;

    while (GetIsObjectValid(oPilier) && !iTest)
    {
        // est-ce un pilier ?
        if (GetTag(oPilier) == "Pilier_Arcane")
        {
          iTest = TRUE;
        }
        oPilier = GetNextObjectInShape(SHAPE_SPHERE,30.0, lLieu,FALSE,OBJECT_TYPE_PLACEABLE);
    }
    return iTest;
}


void main()
{
object oPc = GetEnteringObject();

// on verifie que c'est bien un joueur qui entre
if (GetObjectType(oPc) != OBJECT_TYPE_CREATURE) return;
if (!GetIsPC(oPc)) return;

// on verifie que l'on est bien en zone001
object oArea = GetArea(oPc);
if (GetTag(oArea) != "Zone001") return;

// Recherche les objets dans les environs
object oWp = GetFirstObjectInArea();
location lLoc;

while (GetIsObjectValid(oWp)){
    if ((GetObjectType(oWp) == OBJECT_TYPE_WAYPOINT) && (GetTag(oWp) == "TagWpPilierArcane")){
        lLoc = GetLocation(oWp);
        if (!verifie_presence_pilier(lLoc)){
            CreateObject(OBJECT_TYPE_PLACEABLE, "arcane_pillar", lLoc);
        }
    }
    oWp = GetNextObjectInArea();
}

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


En debbug, le "oWp = GetNextObjectInArea();" ne change jamais !!

ObiWan Kenobie vous êtes mon seul espoir Very Happy
 
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 : 15/10/2004 12:02:46 Sujet du message :


sinquem a écrit :
J'ai revu le sujet mais voilà dans le script ci-dessous, je bloque sur une boucle infinie !!
J'ai regardé vite fait et je te soumets une idée en passant : il ne me semble pas qu'il y ait d'erreur, mais il convient de retenir que certaines instructions de NWNScript ne sont pas sans conséquences sur d'autres. En l'occurrence, le fait de créer un objet dans une zone entraîne pas mal de conséquence. La plus évidente est le déclenchement d'un nouvel évènement OnEnter pour la zone, mais ton OnEnter ci-dessus teste bien les conditions dans lesquelles on va réellement travailler (sur l'arrivée d'un PJ uniquement). Une seconde, moins connue, agit sur les fonctions de parcours de tout poil du type GetFirst/GetNext.
A partir du moment où tu créés un objet dans une zone, les fonctions de parcours d'objets dans la zone s'en trouve affectée. Précisément, il est difficile de dire ce qui va se passer, dans la mesure où on ne sait pas où cet objet va être inséré dans la liste des objets d'une zone (qui est une liste linéaire chaînée, pour ceux qui maîtrisent les structures de données). Est-il inséré au milieu, placé à la fin, au début ? On en sait trop rien. Et surtout, est-ce que la liste n'est pas tout simplement rebâtie. Les GetNext peuvent alors perdrent leurs petits (Je parle des GetNext en général, car je pense que le problème est similaire pour les parcours d'inventaire par exemple).
C'est moins génant quand on détruit des objets, car la destruction est différée à la fin de l'exécution du script ce qui fait que les fonctions de parcours continuent à fonctionner, aucun objets n'ayant disparu de leur liste.

Maintenant, quelle solution adopter ? J'en entrevois 2 (il y en a sûrement d'autres):

La plus simple de mon point de vue consiste à marquer tes déjà traités. A savoir, si tu as déjà créé un nouvel objet relatif à ton parcours des plaçables de la zone, alors tu sais déjà qu'il ne faut pas le refaire. Ainsi, si ton GetNext tombe sur le même objet, un test permet de savoir s'il faut refaire la même manipulation. Pour cela, il suffit de stocker une variable locale sur l'objet déjà traité (un booléen par exemple).

La seconde, un peu plus compliquée, consiste à créer un tableau d'objet à l'aide SetLocalObject, et en faisant varier le nom de la variable par une valeur numérique, pour chaque objet correspondant à ton critère dans la boucle. Mais tu n'engages aucune action dans cette boucle de parcours GetFirst/GetNext. En revanche, une fois cette boucle terminée, tu refais une autre boucle en prenant cette fois les objets de ton tableau et tu accomplis les actions de CreateObject correspondantes.

Pour finir, il est une chose que tu n'as pas précisé, mais il serait bon de savoir si ton cas de boucle infinie se produisait bien en faisant des CreateObject sans arrêt, car c'est à mon sens la raison pour laquelle il boucle. Pour le savoir, mets en remarque la ligne du CreateObject pour voir s'il boucle de la même façon, et là, sans doute pourra-t-on dire que le problème est ailleurs (comme la vérité d'ailleurs Wink ). En dehors de ça, je n'ai pas d'explication, il faudra creuser Smile
_________________
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
 
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 59.517ms