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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

gardes "vivant"

Par Iridian le 1/12/2002 à 22:46:10 (#2689172)

Voila le problème :
Je voudrais que mes gardes servent a autre chose qu'a de la figuration.
Je veux donc qu'après 2 avertissements, ils attaquent les PJs qui se promènent armées en ville.

J'ai ajouter ca dans leur OnPerception :


object oPercu = GetLastPerceived();
if (GetIsPC(oPercu))
{
//on recupere ce que le pj a dans sa main
object oArme = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPercu);
if (GetIsObjectValid(oArme))
{ //le pj a quelque chose dans la main !
SpeakString("*Mais il est arme le bougre*");
//on regarde si un avertissement a deja ete donnee
object oCompare = GetLocalObject(OBJECT_SELF,"surveille");
int iNum;
if (oCompare != oPercu)
{ //le pj n'a pas encore ete prevenu
//se sera donc son premier avertissement
iNum=1;
//on note qu'il est surveille
SetLocalObject(OBJECT_SELF,"surveille",oPercu);
}
else
{ //celui la a deja ete prevenu, on recupere le numero d'avertissement suivant
iNum = GetLocalInt(OBJECT_SELF,"alerte");
}
switch (iNum)
{
case 1:
//premier avertissement
//on stoque le numero de la prochaine alerte : 2
SpeakString(GetName(oPercu) + ", veuillez ranger votre arme s'il vous plais");
SetLocalInt(OBJECT_SELF,"alerte",2);
ActionWait(5.0f);
break;
case 2:
//deuxieme avertissement
//on stoque le numero de la prochaine alerte : 3
SpeakString(GetName(oPercu) + ", au nom du roi je vous ordonne de ranger votre arme !");
SetLocalInt(OBJECT_SELF,"alerte",2);
ActionWait(5.0f);
break;
case 3:
//dernier avertissement, ca va chauffer !
SpeakString("A moi la garde !!!");
ActionAttack(oPercu);
break;
}
}
}

Le script se compile sans problèmes, mais il n'a pas le comportement voulu :
-le pnj ne fait rien pendant quelques secondes
-puis il déballe son texte (2 avertissements + a moi la garde)
-il n'attaque pas !!!
:aide: une idée ? :aide:
(j'ai piqué l'idée sur un permanent que je visitais, mais j'ai pas trouvé comment contacté le maitre des lieux)

Par eMRaistlin le 2/12/2002 à 9:59:44 (#2691227)

Bein... en premier, evite de comparer un objet a un autre pour verifier si l'avertissement a été dit ou non :

tu devrait plutot stocker une variable booleenne sur le PC percu, genre :


object oPercu = GetLastPerceived();
if (GetIsPC(oPercu))
{
//on recupere ce que le pj a dans sa main
object oArme = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPercu);
if (GetIsObjectValid(oArme))
{ //le pj a quelque chose dans la main !
SpeakString("*Mais il est arme le bougre*");
//on regarde si un avertissement a deja ete donnee
int nCompare = GetLocalInt(oPercu,"surveille");
int iNum;
if (nCompare == FALSE)
{ //le pj n'a pas encore ete prevenu
SetLocalInt(oPercu,"surveille",TRUE);
// [etc...]

Par Iridian le 2/12/2002 à 10:13:04 (#2691303)

J'avais pensé a stoquer les variables sur le joueurs (ce qui aurai aussi l'avantage de les mettre sous la surveillance de TOUS les gardes) mais j'avoue avec honte que je ne savais pas trop comment gérer la remise a blanc des valeurs si le pj est tué ou s'il range ses armes ...

ceci dit la comparaison des objets fonctionnais a priori (puisqu'il déballais son texte !).

En tout cas merci encore a toi eMRaistlin (l'homme a la boite a MP pleine)
J'essai de reprendre ca des se soir, si quelqu'un a une autre idée entre temps, je suis preneur :ange:

Par Iridian le 2/12/2002 à 22:06:35 (#2697158)

Bon bin voici ma solution, je n'ai pas réussi a stoquer les variables sur le PJ (problème s'il sortait de la zone etc...) mais ça marche a peu près :


object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF);
if(oPC != OBJECT_INVALID && (GetDistanceBetween(OBJECT_SELF,oPC) < 20.0) && GetObjectSeen(oPC) && !GetIsEnemy(oPC))
{
object item = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
if(item!=OBJECT_INVALID)
{
if(GetLocalObject(OBJECT_SELF,"surveille")==oPC)
{
int iNum = GetLocalInt(OBJECT_SELF,"nb_avertissement");
switch(iNum)
{
case 2:
SpeakString("Je vous ai prevenu ! En garde !");
SetIsTemporaryEnemy(oPC,OBJECT_SELF,TRUE,60.0);
ActionAttack(oPC);
break;
case 1:
ActionMoveToObject(oPC,TRUE);
SetLocalInt(OBJECT_SELF,"nb_avertissement",2);
SpeakString(GetName(oPC) + ", je ne le repeterai pas, rangez vos armes !");
break;
case 0:
SetLocalInt(OBJECT_SELF,"nb_avertissement",1);
SpeakString(GetName(oPC) + ", je vous ai demandez de ranger vos armes");
break;
}
}
else
{
SetLocalInt(OBJECT_SELF,"nb_avertissement",0);
SpeakString(GetName(oPC) + ", rangez vos armes s'il vous plais");
SetLocalObject(OBJECT_SELF,"surveille",oPC);
}
}
else
{
if( GetLocalObject(OBJECT_SELF,"surveille")!= OBJECT_INVALID)
{
SpeakString("Bien");
DeleteLocalObject(OBJECT_SELF,"surveille");
SetLocalInt(OBJECT_SELF,"nb_avertissement",0);
}
}
}

JOL Archives 1.0.1
@ JOL / JeuxOnLine