Respawn de PNJ

Répondre
Partager Rechercher
Un PNJ doit être tué pour terminé la quête A, mais par contre est nécessaire pour continuer la quête B. De plus, il doit être présent dans sa maison chaque fois que quelqu'un y entre. Si est tué, il n'est bien entendu pas présent, mais reviendra au bout d'un certain délais (sans doute en jour in-game) pour ne pas bloquer la quête B.

Si je pose directement le PNJ sur la zone dans le toolset, il apparaîtra, mais s'il se fait tué, il ne reviendra pas.
Si je met un trigger de rencontre, il ne faudrait pas que je me retrouve avec 50 PNJ dans la maison car il s'enclenchera en permanence (il faudrait donc mettre un script qui vérifie que le PNJ n'est pas présent pour qu'il le fasse apparaître). Mais si le trigger se déclenche à chaque fois qu'un joueur passe dessus, il ne prendra pas compte de la mort du PNJ, sauf si je lui dit de regarder une variable apparue à la mort dudit PNJ. Mais dans ce cas, je fais comment pour que cette variable disparaisse au bout d'un temps X ?

Bon bref, faut faire comment pour arriver au résultat qui m'intéresse ? Et merci de bien détailler (avec script si possible, parce que bon... ).
Les ressources de NWN, SoU et même HotU peuvent être utilisées pour résoudre mon petit problème.

Merchi
En fait, ce que tu veux, c'est que X temps après sa mort, il revienne. Donc dans le OnDeath, il te faut placer une commande pour le faire spawner dans X temps. Avec un cht'it DelayCommand je pense.

Je peux pas te détailler le script, parce que je sais pas encore faire Mais c'est cette piste là que je suivrais.
Pour une fois que je peux aider voila le script que j'utilise pour respawn une créature au bout d'un certain temp une fois tuée.
Code PHP:

////////////////////////////////////////////////////////////////////////////////
// Ce script permet de faire respawn une créature au bout d'un temps précis.
// La créature sera respawn à l'endroit ou elle a été placé sur l'area lors de la creation du module. Voila ce qu'il faut faire :
// 1) Créer un monstre avec le "creature wizard".
// 2) Mettre le Script 1 dans le OnDeath de la Creature
// 3) Ajouter les lignes du script 2 au script OnSpawn de la creature. Il faut placer ces 2 lignes juste au-dessus de la dernière "}" du script.
// 4) Changer le Temps de respawn de la créature dans le script 1 la ou c'est indiqué.
////////////////////////////////////////////////////////////////////////////////

// Script 1 a mettre dans le OnDeath du monstre
#include "NW_I0_GENERIC"

void VoidCreateObject(string sTemplatelocation lLocint bUseAppearAnimation=TRUE);

void main()
{
    if(
GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
        {
        
SignalEvent(OBJECT_SELFEventUserDefined(1007));
        }

object oSelf OBJECT_SELF;
location lLoca GetLocalLocationoSelf"lSpawn");
float fSeconds 1200.0//temps en secondes pour le respawn
string sTemplate GetResRefoSelf );

AssignCommandGetAreaoSelf ) , DelayCommandfSecondsVoidCreateObjectsTemplatelLoca ) ) );

}

void VoidCreateObject(string sTemplatelocation lLocint bUseAppearAnimation=TRUE)
{
CreateObject(OBJECT_TYPE_CREATUREsTemplate,lLocbUseAppearAnimation);
}


//Script 2 Lignes a ajouter avant la derniere "}" du script OnSpawn des monstres
/*
object oSelf = OBJECT_SELF;
SetLocalLocation( oSelf, "lSpawn", GetLocation( oSelf ) );
*/ 
Merci

Si plusieurs PNJs ont ce script, est-ce qu'il y aura des problèmes de respawn dans le cas où ils se feraient tous tués dans le même laps de temps ?
Si j'ai bien compté, mon PNJ devrait respawner au bout de 14h IRL (si je reste à 5 min IRL = 1h in-game), soit 50400 secondes. Je risque de le faire passer à 36h IRL. C'est grave que ce soit aussi énorme ou ça n'aura aucune influence ?
Je n'ai pas regardé le script générique du OnDeath mais il contient quoi (juste histoire de savoir s'il y a des trucs qu'il me faudrait conserver) ?

Je crois qu'il s'agit de toutes les questions que j'ai pour l'instant.
* Tu crées ta créature en mettant RESPAWN dans son tag (par exemple: LUCRESPAWN
* Tu crées un (ou plusieurs) WP avec comme tag celui de la créature (+ un chiffre si plusieurs WP, pour qu'il n'apparaisse pas toujours au même endroit, par exemple LUCRESPAWN1 et LUCRESPAWN2)
* Tu places ceci dans le OnDeath de la créature (ou tu l'ajoutes à nw_c2_default7)

Code PHP:

void RespawnObject(string sResRefint iTypelocation lLocfloat fFacingstring sNewTag)
{
object oRespawn CreateObject(iTypesResReflLoc);
object oNew CopyObject(oRespawnlLocOBJECT_INVALIDsNewTag);
DestroyObject(oRespawn);
AssignCommand(oNewActionDoCommand(SetFacing(fFacing)));
SetLocalInt(GetModule(), "ONCE"1);
}
void main()
{
string sResRef GetResRef(OBJECT_SELF);
int iType GetObjectType(OBJECT_SELF);
float fFacing;
 
location lLoc;
 
int iRandom d10(1);
 
string sTag GetTag(OBJECT_SELF);
 
object oWaypoint GetWaypointByTag(sTag IntToString(iRandom));
 
fFacing GetFacing(oWaypoint);
 if (
FindSubString(sTag"RESPAWN") > -)
 {
 if (
GetIsObjectValid(oWaypoint))
    
lLoc GetLocation(oWaypoint);
 else
 {
   
oWaypoint GetWaypointByTag(GetTag(OBJECT_SELF));
   
fFacing GetFacing(oWaypoint);
   if (
GetIsObjectValid(oWaypoint))
     
lLoc GetLocation(oWaypoint);
   else
   {
     
lLoc GetLocalLocation(OBJECT_SELF,"spawn");
     
DeleteLocalInt(OBJECT_SELF"spawn");
     
fFacing GetFacing(OBJECT_SELF);
   }
 }
 
float fDelay 250.0;  //300.0 = 5 minutes
 
AssignCommand(GetModule(), DelayCommand(fDelayRespawnObject(sResRefiTypelLocfFacingsTag)));
 }

Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés