Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > [help] Casse Tete.
[help] Casse Tete.
Par PesteLaMenace le 8/2/2003 à 17:50:43 (#3197442)
Voici un probleme que je n'arrive pas a resoudre, et que j'espère connu de quelqu'un.
Un peuplement automatique de zone créé des pnjs dont six gardes. (pas de soucis).
Ces gardes ont pour fonction de faire ranger les armes a quelqu'un qui les a sortie. (via un script sur le OnHeathbeat).
Ils font deux sommations, sortent arme et bouclier puis s'approche de la cible, refont une sommation et attaque si l'arme n'est toujours pas rangée. Lorsque l'arme de la cible est rangée ils rangent les leurs et retournent à leur place puis se reorientent. Tout ca fonctionne tres bien.
Du moins cela fonctionne tres bien pour le premier garde créé par le script de peuplement sur le OnEnter de la zone.
Les cinqs autres gardes executent toutes les fonctions correctement a part la sortie des armes.
Si je change l'ordre de création c'est toujours le premier créé qui executera correctement toute les actions du script mais pas les cinqs autres qui oublieront de sortir leurs armes.
Etrange non?
Les six gardes existent dans la palette personnalisée, ils ont le même tag mais un blueprint différent.
J'ai essayé en leur mettant un tag différent a chacun, sans resultats.
Le script OnHeathBeat est différent pour chaque garde également. (la seule différence de chaque script c'est leur lieux de retour une fois l'arme de la cible rangée).
Voila, ca sort largement de mon domaine de compétences alors si quelqu'un a une solution ou une idée, c'est vendu!
Merci.
PS : Deuxieme constatation a propos du remplissage de zone automatique. Lorsque qu'un joueur rentre dans ladite zone il n'est pas rare qu'un pnj soit téléporté sur le joueur en question....ca ne doit pas qu'arriver a moi...?
Cela se produit lorsqu'il y a plus de trois pnj du meme type créé au meme point.
Merci-bis pour des idées si quelqu'un a.:rolleyes:
Peste
Par Azrael07 le 8/2/2003 à 18:19:50 (#3197581)
Ca n'est pas vraiement ton problème il me semble, mais bon on sais jamais ^^
pour ton problème, ben sans script sous la main je peux pas te dire grand chose .......
Par PesteLaMenace le 8/2/2003 à 18:47:41 (#3197712)
// script original venant de la demo de peuplement de tarverne par mirandiel
void main()
{
if (GetIsPC(GetEnteringObject())) {
SetLocalInt(OBJECT_SELF, "PJcomptoir", GetLocalInt(OBJECT_SELF, "PJcomptoir")+1);
if (GetLocalInt(OBJECT_SELF, "PJcomptoir") == 1) {
location la;
object PNJ;
//creation d'une foule aleatoire sur un waypoint aleatoire
//cette foule s'habille aussi aleatoirement parmis un panel d'habits (dans le OnSpawn des pnjs)
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "habitant00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "habitant00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "habitant00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "habitant00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "habitant00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "habitant00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "noble00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "noble00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "noble00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "noble00"+IntToString(Random(5)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "noble00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "noble00"+IntToString(Random(8)), la);
la = GetLocation(GetObjectByTag("sum_comptoir00"+IntToString(Random(5))));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "noble00"+IntToString(Random(8)), la);
//summon des gardes des lieux chargés de veiller au bon ordre
la = GetLocation(GetObjectByTag("sum_comptoir010"));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "gard_compt005", la);
la = GetLocation(GetObjectByTag("sum_comptoir009"));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "gard_compt004", la);
la = GetLocation(GetObjectByTag("sum_comptoir008"));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "gard_compt003", la);
la = GetLocation(GetObjectByTag("sum_comptoir007"));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "gard_compt002", la);
la = GetLocation(GetObjectByTag("sum_comptoir006"));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "gard_compt001", la);
la = GetLocation(GetObjectByTag("sum_comptoir005"));
PNJ = CreateObject(OBJECT_TYPE_CREATURE, "gard_compt000", la);
}
}
}
C'etait le script de remplissage de la zone a l'arrivée d'un PJ.
Voici le script d'un des gardes sur son OHBeat.
//:://////////////////////////////////////////////
//:: Created By: David "The Shadowlord" Corrales
//:: Created On: August 20 2002
//:://////////////////////////////////////////////
#include "NW_I0_GENERIC"
//VARIABLES START - EDIT AT OWN PLEASURE
string WARNING1 = "Pouvez vous ranger votre arme s'il vous plait.";
string WARNING2 = "Votre arme je vous prie.";
string WARNING3 = "Une derniere fois. Rangez votre arme!";//Move to Player
string ATTACK_MSG = "Dommage!";//Attack here
string COMPLY_REPLY = "Je vous remercie.";
float WARN_DISTANCE = 20.0;//Distance in which to spot player
float ANGER_DUR = 120.0; //Length of time (sec) that will remain angry at the pc
location Place = GetLocation (GetWaypointByTag ("sum_comptoir005"));
float Face = GetFacing (GetWaypointByTag ("sum_comptoir005"));
object oShield = GetFirstItemInInventory();
object oArme = GetFirstItemInInventory ();
//END OF VARIABLES
void main()
{
object oPC;
object item;
oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF);
if(oPC != OBJECT_INVALID && (GetDistanceBetween(OBJECT_SELF,oPC) 6)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
}
}
}
if(GetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(1001));
}
}
Les deux objets qu'il doit equiper a savoir un cimeterre +1 et un petit bouclier +1 sont dans son inventaire.
Les cinqs autres scripts (puisqu'il y a six gardes) sont presque identiques, la seule différence etant le waypoint de retour.
Ce script fonctionne bien, mais uniquement sur le premier garde crée par le script de remplissage de la zone. Si je change l'ordre de creation des gardes, le premier créé equipera bien ses armes, pas les suivants.. :doute:
Vala et merci encore pour l'existence de ce forum.
Peste.
Par Azrael07 le 8/2/2003 à 19:14:46 (#3197889)
/me meurt étouffé sous la page de script....
:bouffon: :bouffon:
bon je vais l'avouer, j'ai pas tout lut, seulment les passages que j'immaginais être conserné, mais j'ai du mal a voir globalement d'où ca vient. L'idéal, c'est de placer des fonctions de débugging, sinon tu aura du mal à t'en sortir.
Met des fonction qui indiquent dans le log si oui ou non tel ligne de code a été executée pour chaques gardes, et avance avec ca.(j'ai fait un tut la dessus, le lien est dans le post persistant)
bon courage ;)
*marteau de 1000 tonnes de scripts*
Par PesteLaMenace le 8/2/2003 à 19:37:27 (#3198038)
Je n'ai pas encore assimilé les fonctions debugging, soit je m'y met ou alors....les gardes auront leurs armes en mains même si cela ne me plait guère vu que ce n'est pas logique qu'ils soient armés....
M'enfin, le pire c'est que ca fonctionne mais pour un seul, et je ne voit vraiment pas pourquoi...
Marf...michi quand même :p
Peste
Par Jedaï le 9/2/2003 à 11:05:50 (#3200577)
Allez on va dire que t'as pas vu l'erreur ...
C'est un classique vraiment ! :o
Regardons les lignes fautives :
if (oShield == GetObjectByTag ("NW_ASHMSW002"))
et
if (oArme == GetObjectByTag ("NW_WSWMSC002"))
Le problème est le suivant : la comparaison de deux object ne donne vrai que si les deux objets sont vraiment les mêmes : il ne faut pas qu'il diffère par leur emplacement par exemple ! :p
GetObjectByTag("Le tag"[, n]) renvoit toujours le même objet tant qu'on ne change pas "n".
Or cet objet se trouve dans l'inventaire d'un seul des gardes, le seul qui puisse le trouver dans son inventaire, les autres cherchent dans leur inventaire l'objet qui se trouve maintenant dans les mains de leur compagnon... ils ne peuvent évidemment pas le trouver ! :maboule:
La solution classique est de vérifier seulement le tag de l'objet :
if (GetTag(oShield) == "NW_ASHMSW002")
et
if (GetTag(oArme) == "NW_WSWMSC002")
Là évidemment ça va marcher, mais on peut faire encore mieux que cette boucle inepte ! :doute:
On peut remplacer :
while (GetIsObjectValid (oArme)) {
if (oArme == GetObjectByTag ("NW_WSWMSC002")){
ActionEquipItem (oArme,INVENTORY_SLOT_RIGHTHAND);
}
oArme = GetNextItemInInventory ();
}
Par
ActionEquipItem (GetItemPossessedBy(OBJECT_SELF, "NW_WSWMSC002"), INVENTORY_SLOT_RIGHTHAND);
et
while (GetIsObjectValid (oShield)) {
if (oShield == GetObjectByTag ("NW_ASHMSW002")){
ActionEquipItem (oShield,INVENTORY_SLOT_LEFTHAND);
}
oShield = GetNextItemInInventory ();
}
par :
ActionEquipItem (GetItemPossessedBy(OBJECT_SELF, "NW_ASHMSW002"), INVENTORY_SLOT_LEFTHAND);
Par la même occasion on peut supprimer les deux lignes suivantes :
object oShield = GetFirstItemInInventory();
object oArme = GetFirstItemInInventory ();
Qui n'ont maintenant plus aucune utilité. :cool:
Voilà. Ca devrait marcher mieux (attention j'ai pas dit parfaitement ;) ) :p
Par PesteLaMenace le 9/2/2003 à 17:44:33 (#3202689)
Donc merci! C'est une erreur que je ne referais plus!
:merci: :merci: :merci: :merci:
Peste
Par Skanzo Sylan le 9/2/2003 à 20:48:46 (#3203654)
On devrait lui donner la palme du "M'enerve! Comment y fait?!" :rasta:
Par Théranthil le 9/2/2003 à 21:29:41 (#3203908)
(petite gueulante personnelle qui n'a aucun interêt: QUEL EST LE ... .... ... ... DE .... qui a inventé les points virgules à la fin de chaque ligne de code!!!)
Voila. Je suis calme. Merci
Par Azrael07 le 9/2/2003 à 21:55:43 (#3204022)
sisisisi je t'ai vu toi te cache pas
comment tu ferais si il y ét pas pour déclarer la fin d'une instruction ???? :p :p
non mais quand on me cherche on me trouve :enerve: :enerve: :enerve: QUEL EST LE ... .... ... ... DE .... qui a inventé les points virgules à la fin de chaque ligne de code!!!)
c'est le jeu du pendu ?
bon je commence.... le "O"
mdr :bouffon: :bouffon: :bouffon:
Par Jedaï le 9/2/2003 à 22:55:09 (#3204255)
comment tu ferais si il y ét pas pour déclarer la fin d'une instruction ????
Ben tu ferais comme en python, tu mettrai une fin de ligne sans " \ " !
Ah oui mais avec le python faut des instructions bien alignées parce que les blocs sont définis par leur indentation.:(
Baaah de toute façon on peut pas tout avoir !:p
Avec le JavaScript y a pas de ";" non plus mais si tu saute une ligne là où fallait pas t'as droit à une erreur...:D
Finalement je l'aime bien moi le ";" :)
(Même si j'avoue que parfois je l'oublie....;) )
Allons-y pour le grand débat : POUR ou CONTRE le " ; " !!!! :rasta:
Par mobidique le 10/2/2003 à 1:02:12 (#3204808)
Provient du message de Azrael07
Kernighan et Ritchie ?
QUEL EST LE ... .... ... ... DE .... qui a inventé les points virgules à la fin de chaque ligne de code!!!)
JOL Archives 1.0.1
@ JOL / JeuxOnLine