Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Je ne capte pas pour un listing de toutes mes zones!
Je ne capte pas pour un listing de toutes mes zones!
Par RAT le 20/12/2002 à 3:46:34 (#2837052)
Je fais une recherche de toutes mes zones pour qu'ils détectent mes waypoints.
Et pourtant , j'ai fais aussi un test pour savoir s'il détectait des waypoints invalide ou pas et il m'en détecte aucun.
Et pourtant, il m'en trouve que 18.
Alors la je ne capte pas du tout.
Je vous mets ma fonction pour que vous puissiez regarder :).
void list_zone(object ofirst,string swaypoint="AREA_")
{
int Count=0;
string sCount;
object otag;
object oPC = GetLastSpeaker();
object oarea;
string AreaName;
while (GetIsObjectValid(ofirst))
{
Count++;
if (Count < 10)
sCount="0" + IntToString(Count);
else
sCount= IntToString(Count);
otag=GetObjectByTag(swaypoint+ sCount);
oarea=GetArea(otag);
AreaName=GetName(oarea);
SetLocalString(oPC,"NOM_VILLE_"+sCount,AreaName);
SendMessageToAllDMs(sCount + " : " + AreaName);
ofirst=GetNextObjectInArea(otag);
}
}
Par eMRaistlin le 20/12/2002 à 10:02:55 (#2837802)
Genre un objet placé sur des arbres qui empeche de sauvegarder la zone ?
Pasque sinon, oui, c'est logique : c'est le placement de ton WP qui est invalide, pas le WP lui-meme. Donc le script ne detecte rien de particulier avec GetIsObjectValid, vu que le WP est un objet valid place a un endroit invalide.
Qui plus est, tu ne doit meme pas pouvoir faire un check de la posistion, car les coordonnes (85.0,85.0) sur une de jeu de 8*8 ne sont pas invalide... elle esont juste hors tile.
(mais si tu cree un monstre en (85.0,85.0), il se créera bien, mais sera invisible...) c'est un bug que j'ai rencontré. J'ai arrete les spawn a des position random a cause de ca.
Par RAT le 20/12/2002 à 10:48:39 (#2838084)
Tu veux dire qu'il te trouve 18 WP nvalide au moment ou tu fais un chk area, c'est ca ?
oui c'est tout à fait ça eMGenre un objet placé sur des arbres qui empeche de sauvegarder la zone ?
Ba normalement, je vais quand même revérifier, mais mes emplacements pour mes objets sont valides, car quand je fais une vérification de la zone il me détecte aucune erreur.Pasque sinon, oui, c'est logique : c'est le placement de ton WP qui est invalide, pas le WP lui-meme. Donc le script ne detecte rien de particulier avec GetIsObjectValid, vu que le WP est un objet valid place a un endroit invalide.
Il n'y a pas un moyen de détecter si l'emplacement est invalide excepté en faisant une vérification de la zone. Car c'est ce que j'ai fais, et il ne me détecte aucune erreur.
:(
grumph
Tu aurais un moyen eM???
Merci en tout pour ton aide!
Par eMRaistlin le 20/12/2002 à 11:12:03 (#2838219)
Un fois que c'est fait, il ne te reste plus qu'a le remettre a l'endroit ou il etait, et normalement, lors d'un deplacement a la souris ulterieur a son placement, il gere mieux...
Va comprendre...
Par RAT le 20/12/2002 à 11:31:42 (#2838367)
Mais pour toi , c'est bien l'emplacement qu'ils doit trouver invalide et non mon code?
Bon allez zouu, je vais aller faire les tests, je vous préviendrai si c'est bon ou pas!
Par eMRaistlin le 20/12/2002 à 12:18:44 (#2838752)
de ce que j'en sais, c'est l'emplacement, mais en fait il n'est pas totalement invalide... il est juste hors carte... donc le code est content, puisque ses donnes sont coherentes, mais le moteur du jeu l'est moins...
mais vu que le create est plus fort, il est possible de créer des objet a des position non valide.
Exemple :
Lors de mes testsur le detect Evil, voici ce que m'a donne un respawn aleatoire :
http://narf2.free.fr/emraistlin/MidgardShoot/bug/NWN0000.jpg
A noter que la zone de mer est intra-carte, et que le code de respawn etait correct... c'est juste que la seule zone de terre vaide de toute ma carte est la portion sur laquelle je suis.
Tu vois : la position est "Valide", mais l'emplacement non... donc impossible de tester la location...
voila, en esperant que cela t'eclaire... (meme si c'est tout ce que je peut faire)...
Par RAT le 20/12/2002 à 12:20:18 (#2838762)
Par contre, un truc surprenant, c'est que suivant la zone ou je suis, il va m'en trouver moins ou sa totalité, c'est à dire 22.
Je ne comprends vraiement pas pourquoi?
*se tappe la tete contre le mur*:hardos: :confus: :confus: :monstre: :maboule:
Par RAT le 20/12/2002 à 12:22:59 (#2838796)
Par RAT le 20/12/2002 à 13:50:10 (#2839544)
c'est que suivant la zone ou je suis, il va m'en trouver moins ou sa totalité( c'est à dire 22). C'est quand même étrange alors que je ne fais pas pourtant de GetNearest ou je ne sais quoi.
Maudit code!
Par RAT le 20/12/2002 à 19:26:35 (#2842251)
Par Jedaï le 20/12/2002 à 19:30:04 (#2842280)
ofirst=GetNextObjectInArea(otag);
N'est-ce pas ici plutôt oArea qu'il faudrait mettre (je sais pas j'ai pas Aurora sous les yeux).:doute:
Si j'ai bien compris le but de ton script, est-ce que ceci ne marcherait pas aussi bien, sinon mieux (si j'ai pas compris, je m'en excuse :o ) :
void list_zone(object ofirst,string swaypoint="AREA_")
{
int Count=0;
string sCount;
object oPC = GetLastSpeaker();
object oarea;
string AreaName;
while (GetIsObjectValid(ofirst))
{
Count++;
if (Count < 10)
sCount="0" + IntToString(Count);
else
sCount= IntToString(Count);
ofirst=GetObjectByTag(swaypoint+ sCount);
oarea=GetArea(ofirst);
AreaName=GetName(oarea);
SetLocalString(oPC,"NOM_VILLE_"+sCount,AreaName);
SendMessageToAllDMs(sCount + " : " + AreaName);
}
}
Par RAT le 20/12/2002 à 20:33:41 (#2842782)
object otag=GetObjectByTag("AREA_01");
object ofirst=GetFirstObjectInArea(otag);
list_zone(ofirst);
puis la fonction
void list_zone(object ofirst,string swaypoint="AREA_")
{
int Count=0;
string sCount;
object otag;
object oPC = GetLastSpeaker();
object oarea;
string AreaName;
while (GetIsObjectValid(ofirst))
{
Count++;
if (Count < 10)
sCount="0" + IntToString(Count);
else
sCount= IntToString(Count);
otag=GetObjectByTag(swaypoint+ sCount);
oarea=GetArea(otag);
AreaName=GetName(oarea);
SetLocalString(oPC,"NOM_VILLE_"+sCount,AreaName);
SendMessageToAllDMs(sCount + " : " + AreaName);
ofirst=GetNextObjectInArea(otag);
}
}
En fait si j'ai bien compris, la commande GetFirstObjectInArea();
C'est qu'il va chercher dans la premiere area, le premier objet qu'il l'intéresse, ici c'est le waypoint qui va chercher.
Si l'objet est valide, il rentre dans la boucle, et il va ainsi de suite changer d'area, pour chercher le waypoint comportant le tag "AREA_X"
d'où otag =GetObjectByTag(swaypoint+ sCount);
oarea va me permettre juste de choper l'object area pour trouver son nom, et de pouvoir lister toutes mes zones.
Pour l'instant mon code marche très bien , à une exception prêt, c'est qu'il ne me trouve que 18 zones au lieu des 22 (donc 22 waipoints) . Et l'autre petit soucie qui est lié à mon avis à mon problème, c'est que si je change de zone, et que je relance le script, il va me trouver moins ou plus de zones, par exemple: sur une zone, il ne va m'en trouver que 5 et dans une autre les 22.
Ce que je ne comprends, c'est que dans mon code, il n'utilise en aucun cas la position du PC, et ni de son object, excepté de sauvegarder le résultat avec les SetLocal.
Voilà, j'espère que vous allez mieux me comprendre lol.
Mais c'est vrai que là, je n'arrive pas à comprendre.
Merci d'avance :):D:D
Par RAT le 20/12/2002 à 21:08:43 (#2843115)
en fait , merci à jedaï, tu avais raison le GetFirstObjectArea ne sert à rien. donc faut le virer et juste le faire par
otag=GetObjectByTag(swaypoint+ sCount);
mais je vous mettrai le code quand je reviendrai, car là j'ai une partie de jeu de rôle à faire avec des potes :).
A très tôt demain matin :p
JOL Archives 1.0.1
@ JOL / JeuxOnLine