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


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
nunch
Grand Sage du Conseil
Inscrit le: 23 Mai 2003
Messages: 966
Localisation: Dans la gueule du Lyon
Répondre en citant
Posté le : 12/09/2003 21:27:07 Sujet du message : CreateObject() et GetNextObjectInArea() en boucle

Hello,

J'expose un problème (je n'ai pas trouvé de sujet similaire avec la recherche) avec sa solution, à titre d'information.

J'ai une zone où sont répartis 12 waypoints: 7 nommés WP_VP_GuerrierScorpio, 4 nommés WP_VP_ArcherScorpio et 1 nommé WP_VP_MageScorpio.
Quand un PJ marche sur un trigger, je veux qu'une créature apparaîsse à chacun des waypoints, en fonction du nom de ce dernier. Donc dans le OnEnter() de mon trigger j'ai mis le script suivant:

Code :

void main()
{
    object oZone = GetArea(OBJECT_SELF);
    object oWaypoint = GetFirstObjectInArea(oZone);
    while(GetIsObjectValid(oWaypoint))
    {
        if(GetObjectType(oWaypoint) == OBJECT_TYPE_WAYPOINT)
        {
            string stWaypoint = GetTag(oWaypoint);
            if(stWaypoint == "WP_VP_ArcherScorpio")
            {
                CreateObject(OBJECT_TYPE_CREATURE,"ct_arch_scorpion",GetLocation(oWaypoint));
            }
            else if(stWaypoint == "WP_VP_GuerrierScorpio")
            {
                CreateObject(OBJECT_TYPE_CREATURE,"x0_stinger_war",GetLocation(oWaypoint));
            }
            else if(stWaypoint == "WP_VP_MageScorpio")
            {
                CreateObject(OBJECT_TYPE_CREATURE,"x0_stinger_mage",GetLocation(oWaypoint));
            }
        }
        oWaypoint  = GetNextObjectInArea(oZone);
    }
}

Seulement ça ne marchait pas. Au lieu de me créer mes 12 monstres, le script en créait 26 !!

J'ai mis un bout de temps avant de comprendre pourquoi, et ce grâce au debugger (et au tutorial de Landrast): la fonction GetNextObjectInArea() me renvoyait plusieurs fois certains tags (j'ai vu ça grâce aux valeurs hexadécimales des objets dans le debugger). J'en ai conclu que c'est le CreateObject() qui venait perturber d'une quelconque manière la liste des objets à retourner.

Pour contourner le problème, j'ai placé les CreateObject() dans des DelayCommand() avec un délai de 1 seconde (moins peut peut-être fonctionner aussi). Je ne vous remets pas le nouveau script qui est le même que dessus avec la modification mentionnée avant.

Voilà, comme je l'ai dit, je n'ai pas trouvé de sujet similaire avec la recherche. Si vous connaissez une meilleurs solution au problème, faites le moi savoir.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger 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 : 12/09/2003 21:48:54 Sujet du message :

Mauvaise idée de passer en boucle une liste d'objet et d'en créer ! TRES MAUVAISE IDEE.

Cela va faire une boucle à l'infini car à chaque fois que tu crée un nouvel objet, tu redémarre la liste !

Tu devrais utiliser GetObjectByTag et son deuxième argument : cela permettrait de ne passer que les Waypoints et pas les objets nouvellement crées.

ex:
Code :

string tag = "ahaah";
object bidule = GetObjectByTag( tag, 0 );
int i = 1:
while ( GetIsObjectValid( bidule ) )
{
  /* machin */

  bidule = GetObjectByTag( tag, i++ );
}


_________________
#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
 
nunch
Grand Sage du Conseil
Inscrit le: 23 Mai 2003
Messages: 966
Localisation: Dans la gueule du Lyon
Répondre en citant
Posté le : 12/09/2003 22:37:24 Sujet du message :

OK d'accord, merci. Je sais pas pourquoi mais j'ai fait l'impasse sur cette fonction quand j'ai cherché dans le lexicon.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger 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 : 12/09/2003 23:00:29 Sujet du message :

bah Smile

tu rajoute une condition

D'ailleurs, me semble que le GetObjectByTag te raméne l'objet le plus proche dans la zone, donc un truc du genre :

Code :

string tag = "ahaah";
string zone_tag = "zone";
object bidule = GetObjectByTag( tag, 0 );
int i = 1:
while ( GetIsObjectValid( bidule ) && GetTag( GetArea( bidule ) ) == zone_tag )
{
/* machin */

bidule = GetObjectByTag( tag, i++ );
}



Devrait correctement fonctionner.

Sinon, bah tu devrais utiliser une solution tabloïdesque en conservant la location de tes waypoints ie:


Code :

int get_count( string varname )
{
  return GetLocalInt( OBJECT_SELF, varname + "_count" );
}
void increment_count( string varname, int count = -1 )
{
  if ( count == -1 )
    SetLocalInt( OBJECT_SELF, varname + "_count", get_count( varname ) + 1 );
  else
    SetLocalInt( OBJECT_SELF, varname + "_count", count );
}
location get_location( string varname, int id )
{
  return GetLocalLocation( OBJECT_SELF, varname + "_l" + IntToString( id ) );
}

location set_location( string varname, int id, location whereIam )
{
  return SetLocalLocation( OBJECT_SELF, varname + "_l" + IntToString( id ), whereIam );
}
void delete_location( string varname, int id )
{
  DeleteLocalLocation( OBJECT_SELF, varname + "_l" + IntToString( id ) );
}

void main()
{
  object oZone = GetArea(OBJECT_SELF);
  object oWaypoint = GetFirstObjectInArea(oZone);

  string stWaypoint;
  location lWp;

  int i = 0, j = 0, k = 0;
  while( GetIsObjectValid(oWaypoint) )
  {
    if(GetObjectType(oWaypoint) == OBJECT_TYPE_WAYPOINT)
    {
      stWaypoint = GetTag(oWaypoint);
      lWp = GetLocation( oWaypoint );

      if( stWaypoint == "WP_VP_ArcherScorpio" )
      {
        increment_count( stWaypoint );
        set_location( stWaypoint, i++, lWp );
      }
      else if(stWaypoint == "WP_VP_GuerrierScorpio")
      {
        increment_count( stWaypoint );
        set_location( stWaypoint, j++, lWp );
      }
      else if(stWaypoint == "WP_VP_MageScorpio")
      {
        increment_count( stWaypoint );
        set_location( stWaypoint, k++, lWp );
      }
    }
    oWaypoint = GetNextObjectInArea(oZone);
  }
}


Ensuite, tu as grosso modo construit un tableau virtuellement. Pour créer tes créatures, tu peux faire ceci après le while :

Code :

string bp = "ct_arch_scorpion",
       varname = "WP_VP_ArcherScorpio";

int count = get_count( varname  ),
    counter;
for ( counter = 0; counter < count; counter++ )
{
  CreateObject(
    OBJECT_TYPE_CREATURE,
    bp,
    get_location( varname , counter )
  );
  delete_location( varname, counter );
}

bp = "x0_stinger_war";
varname = "WP_VP_GuerrierScorpio";
count = get_count( varname );

for ( counter = 0; counter < count; counter++ )
{
  CreateObject(
    OBJECT_TYPE_CREATURE,
    bp,
    get_location( varname , counter )
  );
  delete_location( varname, counter );
}


bp = "x0_stinger_mage";
varname = "WP_VP_MageScorpio";
count = get_count( varname );

for ( counter = 0; counter < count; counter++ )
{
  CreateObject(
    OBJECT_TYPE_CREATURE,
    bp,
    get_location( varname , counter )
  );
  delete_location( varname, counter );
}


Sur le papier, ça devrait faire ce que tu veux, mais même plus : le mieux est tout de même de supprimer les variables après utilisation. ie:

Code :

increment_count( "WP_VP_ArcherScorpio", 0 );
increment_count( "WP_VP_GuerrierScorpio", 0 );
increment_count( "WP_VP_MageScorpio", 0 );


Note que le script détruit après utilisation les variables locales.

C'est la seule solution potable pour créer des objets en en ayant sélectionné une liste dans la zone.

/me *prie* pour que ça fonctionne !
_________________
#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
 
nunch
Grand Sage du Conseil
Inscrit le: 23 Mai 2003
Messages: 966
Localisation: Dans la gueule du Lyon
Répondre en citant
Posté le : 13/09/2003 07:58:27 Sujet du message :

Merci de ton aide, mais ne fais pas tout le boulot sinon je vais m'ennuyer chez moi Very Happy

Ta première solution marche très bien en tous cas. Sinon j'ai une derniere question (tant qu'à faire Very Happy ), est-ce que GetNextObjectInArea() renvoie les PJ présents dans la zone ? Ou il faut que j'utilise GetNearestCreature() ?
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger 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/09/2003 12:11:42 Sujet du message :

Les PJ font normalement parti des objets de la zone quand ils sont dans la zone... Donc à priori oui.
_________________
#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
 
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 31.087ms