Faire apparaitre un NPC

Répondre
Partager Rechercher
Bonjour !

Bon alors, j'aimerais faire apparaître un personnage (de nulle part, par exemple via un portail). Ça me paraissait simple, mais je m'arrache les cheveux...

Avec les recherches que j'ai fait, voilà mon script le plus aboutit (ce qui n'est pas peu dire ! ) :

Code PHP:

void main()
  {
    
object oNPC GetObjectByTag("Tag_NPC");
    
object oWaypoint GetWaypointByTag("Spawn_NPC");
    
string sResref GetResRef(oNPC);
    
location lSpawn GetLocation(oWaypoint);
  
    
CreateObject(OBJECT_TYPE_CREATUREsResreflSpawnFALSE"");
  } 
J'utilise peut-être la mauvaise fonction, j'ai essayé d'abord avec ApplyEffect et EffectAppear, sans résultat.

Je met ce script dans la dernière ligne d'un dialogue.

Merci de votre attention.
Je pense que la première des choses à faire est d'ajouter des lignes de debug.

Pour savoir si ton script se lance, et quels paramètres tu donnes au CreateObject (resref, emplacement..).

Tu devrais pouvoir utiliser SendMessageToPC(GetFirstPC(), "message"); pour cela.

J'ai fais ça, et j'ai simplement reçu le message à la fin de la conversation, sans que le script fonctionne.

Je ne sais pas vraiment à quoi ça sert, ça veut dire que mon script est bon ?
En fait dans "message", tu vas mettre ce que tu veux afficher et ça va te permettre de savoir où tu en es dans ton script et où ça ne passe pas, par exemple:
Code PHP:

void main()
{
   print(
"début du script");
   
object oNPC GetObjectByTag("Tag_NPC");
   print(
"npc: " ObjectToString(oNPC));
   
object oWaypoint GetWaypointByTag("Spawn_NPC");
   print(
"wp: " ObjectToString(oWaypoint));
   
string sResref GetResRef(oNPC);
   print(
"ref: " sResref);
   
location lSpawn GetLocation(oWaypoint);
   
//print("emplacement: " + LocationToString(lSpawn));
   
object test CreateObject(OBJECT_TYPE_CREATUREsResreflSpawnFALSE"");
   print(
"objet créé: " ObjectToString(test));
}

void print(string a)
{
   
SendMessageToPC(GetFirstPC(), a);

P.S. La fonction LocationToString n'existe pas par défaut mais tu devrais la trouver quelque part dans nwnx.

PP.S. Sinon tu peux peut-être utiliser CopyObject plutôt que d'en recréer un nouveau ?

Code PHP:

void main()
{
   
object npc GetObjectByTag("Tag_NPC");
   
object wp GetWaypointByTag("Spawn_NPC");
   
CopyObject(npcGetLocation(wp));

J'ai essayé avec CopyObject, et ça fonctionne. A défaut d'autre chose, ça sera parfait.

Au passage, saurais-tu comment faire apparaître un portail, que le joueur pourrait utiliser ensuite ?
Je ne suis pas certain exactement de ce que tu veux faire. S'il s'agit d'un portail dans le sens où lorsque le joueur clique dessus il transite autre part, pourquoi ne pas faire une simple transition ?

Sinon il faudra créer un objet du type de ton portail et le placer (de la même manière que pour le NPC). Sur le blueprint de ton objet tu mets un évènement onclick qui fait transiter le joueur où tu veux. Je pense que c'est la façon la plus simple de faire.

Je crois qu'il est possible d'attacher dynamiquement des scripts aux évènements d'un placeable sinon.
Oui c'est bien ça, je m'excuse j'avais trouvé avant ta réponse.

Il suffit d'attacher un dialogue au portail et ça ira, après j'me débrouille avec les effets d'apparition, etc...

Merci pour tes indications en tout cas !
Attention tel qu'utilisé CopyObject ne marchera que s'il existe déjà un objet de tag "Tag_NPC" dans le module.

Pour créer dynamiquement un objet (créature, plaçable, effet, ...) avec CreateObject, il faut définir d'abord un blueprint. Il suffit de copier un blueprint existant et de le modifier à sa guise pour les propriétés et si besoin attacher des scripts dans le blueprint.

Ensuite on passe dans le paramètre sTemplate de la fonction CreateObject le ResRef du blueprint.

En effet CreateObject cherche dans les blueprints, s'il n'y a pas de blueprint correspondant CreateObject ne fait rien.

Voilà un exemple de spawn dynamique d'ennemis tiré d'une célèbre campagne. On crée autant d'ennemis qu'il y a de points d'apparition portant le même tag posés sur la map. Ici on a deux blueprints, un pour les vampires masculins et un pour les vampires féminins de ResRef "vampire_m" et "vampire_s". On les associe au points de spawn correspondants "WPS_vampire_m" et "WPS_vampire_f".
Dans l'exemple le tag des créatures créées est posé dynamiquement.

Code PHP:

// spawn some opposition in the temple

void SpawnAt(string sResRefstring sWP)
{
    
int n 0;
    
object oWP GetObjectByTag(sWP);
    while (
GetIsObjectValid(oWP))
    {
        
CreateObject(OBJECT_TYPE_CREATUREsResRefGetLocation(oWP), FALSE"enemy_temple");
        
n++;
        
oWP GetObjectByTag(sWPn);
    }
}

void main()
{
    
SpawnAt("vampire_m""WPS_vampire_m");
    
SpawnAt("vampire_f""WPS_vampire_f");

Répondre

Connectés sur ce fil

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