Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Help pour un script please !

Par Cassin le 15/9/2002 à 0:46:04 (#2158699)

Bon, j'ai encore besoin de vos talentueux services... ;)

J'aimerais faire mon script pour déplacer ma 15aine de PNJs sur leurs WP respectifs, mais j'ai quelques problèmes... techniques... ;)

Pour l'instant j'ai fait ça :

object oArea = GetArea(LeMonastere);

void main()
{
if (GetFirstObjectInArea (oArea = EleveGuerrier1))
ActionMoveToObject (GetObjectByTag ("WP_guerrier1"));
}


et évidemment ça ne marche pas... :rolleyes:

J'ai déjà une erreur sur la première ligne, dans la déclaration de oArea (VARIABLE DEFINED WITHOUT TYPE)...
Ensuite je ne sais pas si le modèle de mon if...ActionMoveToObject est bon ou pas... Qu'est-ce que vous en dites ?

Re: Help pour un script please !

Par Darkmore le 15/9/2002 à 1:50:16 (#2158975)

Si tu pouvais décrire plus précisement ce que tu cherches à faire ... je suis pas sur d'avoir exatement saisi :doute:
pas très malin moa :D

Je vais me contenter de remarques générales.

Déja pour faire aller un PNJ vers un waypoint qui lui est attribué il y a une solution de base : Le waypoint de type POST qui permet de fixer un poste (eh oui :p) à un PNJ.
Il suffit de le créer en suivant les instructions (clique droit sur le WP) et d'utiliser la fonction Walkwaypoint() au moment voulu pour que le PNJ se déplace (en marchant) vers son post et y reste.
Note que tu dois sortir cette même fonction du script OnSpawn par defaut de bioware si tu ne veux pas qu'il s'y dirige dès sa 'création' dans le jeux.

Pour la ton script:

object oArea = GetArea(LeMonastere);
ça ne peut pas marcher parce que LeMonastere n'est definit nul part.
Si ce script est utiliser par un pj/pnj et que tu souhaites récupérer l'area dans laquel il se trouve alors il faut
object oArea = GetArea(OBJECT_SELF);


Pour le reste je me contenterais de dire que tu devrais utiliser GetWayPointByTag c'est plus logique.

Mais comme j'ai dis je voudrais plus de précision sur qui fait quoi et ou va quel scrip.
Parce que je viens justement de bidouiller pas mal sur les GetFirst et GetNext et c'est un peu lourd :D
Alors si le systeme de WP peux suffir je me lancerais pas dans l'explication :D
Sinon il doit y avoir de toute façon un autre moyen que de regarder tout les objet de la zone (ça fait du monde logiquement).
Et feignant en plus j'ai tous les vices.

:merci:

Par Kemay le 15/9/2002 à 5:05:59 (#2159407)

Comme l'a dit Darkmore la première ligne est déjà erronée. De plus la ligne :

if (GetFirstObjectInArea (oArea = EleveGuerrier1))
signifie si le premier objet dans l'area définie comme étant ElèveGuerrier1 est vrai.... Ce qui ne veut pas dire grand chose ;)

Sinon, j'ai aussi un peu de mal à voir ce que tu veux faire :)

Par Sempai le 15/9/2002 à 10:52:27 (#2159921)


void main()
{
int iVariable = 1;
string sPNJ = "guerrier" + IntToString(iVariable);
object oPNJ = GetObjectByTag(sPNJ);
// tant qu'un tel objet existe
while (GetIsObjectValid(oPNJ) == TRUE)
{
// le faire aller a son poste
AssignCommand(oPNJ,ActionMoveToObject(GetWaypointByTag("WP_" + sPNJ)));
// incrementer la variable pour un eventuel prochain objet
iVariable = iVariable + 1;
sPNJ = "guerrier" + IntToString(iVariable);
oPNJ = GetObjectByTag(sPNJ);
}
}


Dans cet exemple précis, les PNJs ont des tags comme guerrier1 (et non pas guerrier01), guerrier2, etc...
et les WayPoints ont des tags comme WP_guerrier1, WP_guerrier2, etc.

Par Cassin le 15/9/2002 à 11:10:31 (#2160011)

Hum... je me rend compte que je n'ai pas été très clair DU TOUT moi ! ;)
J'étais vraiment trop naze hier soir... :D

Donc en fait je voudrais disperser une foule après un dialogue, chaque PNJ a son tag et son WP, ce que je voulais faire c'est un seul script pour tous les déplacer.

J'ai pas le temps d'essayer ton script pour l'instant Senpaï, j'essairais ce soir !

Par Kemay le 15/9/2002 à 11:52:38 (#2160255)

Si le script de Sempaï ne te convient pas, tu peux essayer celui-là, je ne l'ai pas testé, mais ça devrait marcher. Tu le places soit en ActionTaken à la fin du dialogue, soit dans le onConversationEnd:

void main()
{
object oArea = GetArea(OBJECT_SELF);
object oNPC = GetFirstObjectInArea(oArea);
string sTag = GetTag(oNPC);
while( oNPC != OBJECT_INVALID )
{
if( GetObjectType(oNPC)==OBJECT_TYPE_CREATURE && GetStringLeft(sTag,5)=="Eleve" )
{
string sWaypoint = "WP_"+GetStringRight(GetTag(oNPC),GetStringLength(sTag)-5);
object oWaypoint = GetWaypointByTag(sWaypoint);
AssignCommand(oNPC,ActionMoveToObject(oWaypoint));
}
oNPC = GetNextObjectInArea(oArea);
}
}
Cela devrait faire se déplacer toutes les créatures dont le Tag commence par "Eleve" vers un waypoint ayant pour tag "WP_"+ce qu'il y a après "Eleve" dans le Tag de la créature. Par exemple "EleveGuerrier1" ira au waypoint "WP_Guerrier1". Cela dit, au vu de ce que tu avais écrit tout au début du fil, cela veut dire que tu dois renommer tous tes waypoints pour mettre une majuscule après le underscore (cad remplacer les WP_guerrier1 par WP_Guerrier1 etc...)

Par Darkmore le 15/9/2002 à 16:09:31 (#2161737)

Désolé mais il me semble que le script de Sempai est mmieux

Kemay--> (oNPC != OBJECT_INVALID) ne marchera pas, les objects sont des ensembles trop compliqués pour être comparé ça foire systématiquement (jusqu'à preuve du contraire).
Il faut donc bien utiliser GetIsObjectValid(oNPC) == TRUE.

D'une manière générale je suis pas sur que balayer toute la zone soit vraiment nécessaire.

Pour moi le plus léger reste un UserDefinedEvent déclenché par la fin du dialogue qui impose un WalkWayPoint à tout les Eleves.
Et chacun restourne a son waypoint POST ...

Par Kemay le 15/9/2002 à 17:06:07 (#2161991)

Provient du message de Darkmore
Kemay--> (oNPC != OBJECT_INVALID) ne marchera pas, les objects sont des ensembles trop compliqués pour être comparé ça foire systématiquement (jusqu'à preuve du contraire).
Il faut donc bien utiliser GetIsObjectValid(oNPC) == TRUE.
Alors c'est la preuve du contraire :) oObject != OBJECT_INVALID fonctionne très bien, en fait ça revient à écrire GetIsObjectValid(oObject), juste une question de préférence au niveau de la forme :)

Je peux t'assurer que ça marche très bien, testé dans de nombreux cas différents.
Pour moi le plus léger reste un UserDefinedEvent déclenché par la fin du dialogue qui impose un WalkWayPoint à tout les Eleves.
Et chacun restourne a son waypoint POST ...

Pour info voici à quoi ressemble la fonction WalkWaypoint() ainsi que quelques autres des fonctions aux quelles elle fait appel....
void WalkWayPoints(int nRun = FALSE, float fPause = 1.0) //Run first circuit
{
ClearAllActions();
string DayWayString;
string NightWayString;
string DayPostString;
string NightPostString;
string sWay;
string sPost;

//The block of code below deals with night and day cycle for postings and walkway points.
if(GetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING))
{
DayWayString = "WP_";
NightWayString = "WN_";
DayPostString = "POST_";
NightPostString = "NIGHT_";
}
else
{
DayWayString = "WP_";
NightWayString = "WP_";
DayPostString = "POST_";
NightPostString = "POST_";
}

if(GetIsDay() || GetIsDawn())
{
SetLocalString(OBJECT_SELF, "NW_GENERIC_WALKWAYS_PREFIX", DayWayString);
SetLocalString(OBJECT_SELF, "NW_GENERIC_POSTING_PREFIX", DayPostString);
}
else
{
SetLocalString(OBJECT_SELF, "NW_GENERIC_WALKWAYS_PREFIX", NightWayString);
SetLocalString(OBJECT_SELF, "NW_GENERIC_POSTING_PREFIX", NightPostString);
}


sWay = GetLocalString(OBJECT_SELF, "NW_GENERIC_WALKWAYS_PREFIX");
sPost = GetLocalString(OBJECT_SELF, "NW_GENERIC_POSTING_PREFIX");

//I have now determined what the prefixs for the current walkways and postings are and will use them instead
// of POST_ and WP_

if(GetSpawnInCondition(NW_FLAG_STEALTH))
{
//MyPrintString("GENERIC SCRIPT DEBUG STRING ********** " + "Attempting to Activate Stealth");
ActionUseSkill(SKILL_HIDE, OBJECT_SELF);
}
if(GetSpawnInCondition(NW_FLAG_SEARCH))
{
//MyPrintString("GENERIC SCRIPT DEBUG STRING ********** " + "Attempting to Activate Search");
ActionUseSkill(SKILL_SEARCH, OBJECT_SELF);
}

//Test if OBJECT_SELF has waypoints to walk
string sWayTag = GetTag( OBJECT_SELF );
sWayTag = sWay + sWayTag + "_01";
object oWay1 = GetNearestObjectByTag(sWayTag);
if(!GetIsObjectValid(oWay1))
{
oWay1 = GetObjectByTag(sWayTag);
}
if(GetIsObjectValid(oWay1) && GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS))
{
//turn off the ambient animations if the creature should walk way points.
SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS, FALSE);
SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS, FALSE);
}

if(GetIsObjectValid(oWay1))
{
int nNth = 1;
int nTens;
int nNum;
object oNearest = GetNearestObject(OBJECT_TYPE_WAYPOINT, OBJECT_SELF, nNth);
while (GetIsObjectValid(oNearest))
{
string sNearestTag = GetTag(oNearest);
//removes the first 3 and last three characters from the waypoint's tag
//and checks it against his own tag. Waypoint tag format is WP_MyTag_XX.
if( GetSubString( sNearestTag, 3, GetStringLength( sNearestTag ) - 6 ) == GetTag( OBJECT_SELF ) )
{
string sTens = GetStringRight(GetTag(oNearest),2);
nTens = StringToInt(sTens)/10;
nNum= StringToInt(GetStringRight(GetTag(oNearest),1));
oNearest = OBJECT_INVALID;
}
else
{
nNth++;
oNearest = GetNearestObject(OBJECT_TYPE_WAYPOINT,OBJECT_SELF,nNth);
}
}
RunCircuit(nTens, nNum, nRun, fPause); //***************************************
ActionWait(fPause);
ActionDoCommand(RunNextCircuit(nRun, fPause));
//ActionDoCommand(SignalEvent(OBJECT_SELF,EventUserDefined(2)));
}
else
{
sWayTag = GetTag( OBJECT_SELF );
sWayTag = sPost + sWayTag;
oWay1 = GetNearestObjectByTag(sWayTag);
if(!GetIsObjectValid(oWay1))
{
oWay1 = GetObjectByTag(sWayTag);
}

if(GetIsObjectValid(oWay1))
{
ActionForceMoveToObject(oWay1, nRun, 1.0, 60.0);
float fFacing = GetFacing(oWay1);
ActionDoCommand(SetFacing(fFacing));
}
}
if(GetIsObjectValid(oWay1) && GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS))
{
SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS, FALSE);
SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS, FALSE);
}
}

void RunNextCircuit(int nRun = FALSE, float fPause = 1.0)
{
RunCircuit(0,1, nRun, fPause); //***************************************
ActionWait(fPause);
ActionDoCommand(RunNextCircuit(nRun, fPause));
//ActionDoCommand(SignalEvent(OBJECT_SELF,EventUserDefined(2)));
}

//::///////////////////////////////////////////////
//:: Run Circuit
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Calculates the proper path to follow along a
predetermined set of way points
*/
//:://////////////////////////////////////////////
//:: Created By: Aidan Scanlan
//:: Created On: July 10, 2001
//:://////////////////////////////////////////////

void RunCircuit(int nTens, int nNum, int nRun = FALSE, float fPause = 1.0)
{
// starting at a given way point, move sequentialy through incrementally
// increasing points until there are no more valid ones.
string sWay = GetLocalString(OBJECT_SELF, "NW_GENERIC_WALKWAYS_PREFIX");

object oTargetPoint = GetWaypointByTag(sWay + GetTag(OBJECT_SELF) + "_" + IntToString(nTens) +IntToString(nNum));

while(GetIsObjectValid(oTargetPoint))
{
ActionWait(fPause);
ActionMoveToObject(oTargetPoint, nRun);
nNum++;
if (nNum > 9)
{
nTens++;
nNum = 0;
}
oTargetPoint = GetWaypointByTag(sWay + GetTag(OBJECT_SELF) + "_" + IntToString(nTens) +IntToString(nNum));
}
// once there are no more waypoints available, decriment back to the last
// valid point.
nNum--;
if (nNum < 0)
{
nTens--;
nNum = 9;
}

// start the cycle again going back to point 01
oTargetPoint = GetWaypointByTag(sWay + GetTag(OBJECT_SELF) + "_" + IntToString(nTens) +IntToString(nNum));
while(GetIsObjectValid(oTargetPoint))
{
ActionWait(fPause);
ActionMoveToObject(oTargetPoint, nRun);
nNum--;
if (nNum < 0)
{
nTens--;
nNum = 9;
}
oTargetPoint = GetWaypointByTag(sWay + GetTag(OBJECT_SELF) + "_" + IntToString(nTens) +IntToString(nNum));
}
}

//::///////////////////////////////////////////////
//:: Check Walkways
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
This function checks the passed in object to
see if they are supposed to be walking to
day or night postings.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Feb 26, 2002
//:://////////////////////////////////////////////

int CheckWayPoints(object oWalker = OBJECT_SELF)
{
object oWay1;
object oWay2;
object oWay3;
object oWay4;
string sTag = GetTag(oWalker);
if(GetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING))
{
oWay2 = GetWaypointByTag("NIGHT_" + sTag);
oWay4 = GetWaypointByTag("WN_" + sTag + "_01");
}

oWay1 = GetWaypointByTag("POST_" + sTag);
oWay3 = GetWaypointByTag("WP_" + sTag + "_01");

if(GetIsObjectValid(oWay2) || GetIsObjectValid(oWay4) || GetIsObjectValid(oWay1) || GetIsObjectValid(oWay3))
{

return TRUE;
}
return FALSE;
}
Que de légèreté ! ;)

Par Darkmore le 15/9/2002 à 17:21:15 (#2162045)

Provient du message de Kemay
Alors c'est la preuve du contraire :) oObject != OBJECT_INVALID fonctionne très bienNon c'est la preuve que j'ai parlé trop vite :D
oObject != OBJECT_INVALID peut effectivement marcher, comme tu dis ça revient à tester la validité de l'objet .... et non pas comparer deux objets.
Ce qui ne marche pas (et là j'ai toujours pas la preuve du contraire :p ) c'est la comparaison d'objects.

Mais admet que d'un point de vue scriptage écrire 'WalkWaypoint()' c'est plus léger que des lignes de scripts qui traite des morceaux de Tag :) .

Par Kemay le 15/9/2002 à 17:34:28 (#2162125)

A écrire, WalkWaypoint c'est plus léger, pour le CPU par contre...

Je ne comprends pas ce que tu appelles "comparer des objets" ? Si tu veux dire utiliser des opérateurs comme ">", "<" ou "==" pour des objets, c'est sûr que ça marche pas mais ce n'est pas particulier au NWScript, tu ne peux comparer que des caractéristiques d'objets pas les objets eux-mêmes, comme partout. Une pomme n'est pas supérieure à une autre pomme. Tu ne peux pas comparer les deux objets, mais leur diamètre, leur taux d'acidité, etc... bref seulement des caractéristiques. :)

Par Darkmore le 15/9/2002 à 17:46:19 (#2162184)

Provient du message de Kemay
Si tu veux dire utiliser des opérateurs comme ">", "<" ou "==" pour des objets, c'est sûr que ça marche pas mais ce n'est pas particulier au NWScript, tu ne peux comparer que des caractéristiques d'objets pas les objets eux-mêmes, comme partout. Une pomme n'est pas supérieure à une autre pomme. Tu ne peux pas comparer les deux objets, mais leur diamètre, leur taux d'acidité, etc... bref seulement des caractéristiques. :)
C'est à peu près ce que j'ai dit non?
Sinon perso j'aurais utiliser des poires mais c'est une question de gout :D

Par Cassin le 15/9/2002 à 22:29:09 (#2164408)

J'ai essayé ton script Kemay, mais il ne marche pas... :doute:

J'ai bien renommé mes NPC et WP selon les dénominations du script (PNJ EleveGuerrier1 et waypoint WP_Guerrier1, etc..., avec majuscules et tout), mais rien ne se passe, personne ne bouge...

J'ai testé en mettant le script dans le EndScript du dialogue ou dans le ActionTaken de la dernière phrase du dialogue, mais ça ne change rien...

J'ai fais une connerie ou y'a une subtilité que je n'ai pas compris ???

Par Kemay le 16/9/2002 à 5:19:14 (#2165385)

Oups oui, il y avait une erreur au début. C'est corrigée et je viens de tester dans le Action Taken du dialogue et cela marche :) :

void main()
{
object oArea = GetArea(OBJECT_SELF);
object oNPC = GetFirstObjectInArea(oArea);
while( oNPC != OBJECT_INVALID )
{
string sTag = GetTag(oNPC);
if( GetObjectType(oNPC)==OBJECT_TYPE_CREATURE && GetStringLeft(sTag,5)=="Eleve" )
{
string sWaypoint = "WP_"+GetStringRight(sTag,GetStringLength(sTag)-5);
object oWaypoint = GetWaypointByTag(sWaypoint);
AssignCommand(oNPC,ActionMoveToObject(oWaypoint));
}
oNPC = GetNextObjectInArea(oArea);
}
}
Voilà :)

Par Cassin le 16/9/2002 à 14:30:43 (#2167255)

Ah, oui, ça marche beaucoup mieux ! ;)

Bon, j'ai eu à déplorer quelques embouteillages à la porte du temple (faut dire, essayer de passer à 15 de front par une porte prévue pour une, c'est pas malin ! :mdr: ), mais y'a un piti problème : les persos ne se tournent pas dans le sens du Waypoint !
Donc s'ils les ont bien atteints comme je voulais, ils sont tous dans la même direction ! Les élèves tournent le dos à leurs professeurs, c'est pas très poli ! ;)

Comment ce fait-il que la direction du WP ne soit pas prise en compte ? La petite flèche qu'on se fait chier à tourner ne sert-elle à rien (attente d'un futur patch ?), les WP ne sont en fait que de simples points ?

Par Sempai le 16/9/2002 à 14:44:30 (#2167331)

Il me semble qu'il y a une commande du style "GetFacing", un truc comme ça, pour orienter les personnages.

JOL Archives 1.0.1
@ JOL / JeuxOnLine