Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > gardes "vivant"
gardes "vivant"
Par Iridian le 1/12/2002 à 22:46:10 (#2689172)
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)
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)
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)
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