Problème pour supprimer un PNJ

Répondre
Partager Rechercher
Salut à tous,

Maintenant que j'ai un nouveau ordi je peux enfin essayer NWN2, et me lancer dans la conception d'un module solo. (Débutant total, mais c'est un bon rêve de gosse comme on dit)

Actuellement, je suis entrain d'écrire le script pour mes veilleurs (merci JOL, pour les tuto), la grande majorité du script fonctionne parfaitement. Il n'y a que la fonction void cRepos() qui me pose problème.

Voici les deux scripts au complet, c'est un peu indigeste (l'un fait 588 lignes) mais autant avoir toutes les cartes en main. (je sais que je peux améliorer certaines parties, mais je me suis dit : attend que tes veilleurs bossent correctement)
Le dernier et la partie du script qui me pose problème.

J'aimerai supprimer l'utilisateur du script (donc le PNJ), j'avais cru comprendre que la destruction des créatures était lié à la fonction DestroyObject.. sauf que voilà, le PNJ reste devant sa porte à l'ouvrir en boucle.

J'ai tout essayé, même de crée une fonction void mort() à part avec un DestroyObject(oSelf) (et autres) dans toutes ses formes.. mais niet.. je commence à me dire que je devrai détruire le PNJ en scriptant sa porte comme il faut.

Mais comme je suis idiot, je voudrai vous demander pourquoi le PNJ ne veut pas se détruire ?

Après çà, j'aurai quelques questions :

- Pendant l'exécution du script cLampe et cLampadaire, j'aimerai empêcher le joueur d'interagir avec le PNJ. (et que celui-ci lui dise "Pas maintenant, je suis occupé(e) !" Mais çà je sais comment faire)

Pour faire simple, je ne veux pas que cette partie du script s'interrompt pour une discussion, c'est possible ?

- Le calendrier du module est bien celui des royaumes oubliés ? (12 mois, 3 semaines par mois, 10 jours par semaine et 5 jours spéciaux)
Et si c'est bien le cas, comment son inclus ses jours spéciaux ? (un 31 jour ?)

- Dernière question, quant on survole avec la souris un PNJ, une petite fenêtre s'affiche :

Nom du PNJ
état du PNJ

J'aimerai ajouter une ligne en dessous du nom, c'est faisable ?

Voilà, merci de votre temps.

Edit : J'ai découpé le script pour facilité la lecture, et corriger quelques erreurs que je n'avais pas vu (et appliquer des conseils aussi), il n'y a que le groupe A pour réduire le nombre de ligne

Code PHP:

// SCRIPT DES VEILLEURS POUR UNE VILLE \\

/* Il y a 5 groupes, 1 groupe est composé d'un trinôme :

    1 - Le PNJ travail de 8H à 16H
    2 - Le PNJ travail de 16H à 24H
    3 - Le PNJ travail de 00H à 8H
    
*/

void main() 
{
    
// VARIABLES

    
int nHEURE GetTimeHour(); // HEURE DU MODULE
    
    
object oSELF OBJECT_SELF// C'est le PNJ qui va effectuer le script
    
string sTAG GetTag(OBJECT_SELF); // Le TAG du PNJ
    
    // VARIABLES LOCALES
    
    
int xLAMPES GetLocalInt(oSELF,"LUMIERE_ACTIVEE"); // Statut des LAMPES

    // SCRIPT 
    
    
if(nHEURE >= && nHEURE 16// TEMPS : 8H à 16H exclu
    
{
        if(
sTAG == "VCS_VEILLEUR_A2" || sTAG == "VCS_VEILLEUR_B2" || sTAG == "VCS_VEILLEUR_C2" || sTAG == "VCS_VEILLEUR_D2" || sTAG == "VCS_VEILLEUR_E2"// PNJs 2
            
cRepos(); // Les PNJs vont se reposer.
        
else if(sTAG == "VCS_VEILLEUR_A3" || sTAG == "VCS_VEILLEUR_B3" || sTAG == "VCS_VEILLEUR_C3" || sTAG == "VCS_VEILLEUR_D3" || sTAG == "VCS_VEILLEUR_E3"// PNJs 3
            
cRepos(); // Les PNJs vont se reposer.
        
else if(sTAG == "VCS_VEILLEUR_A1" || sTAG == "VCS_VEILLEUR_B1" || sTAG == "VCS_VEILLEUR_C1" || sTAG == "VCS_VEILLEUR_D1" || sTAG == "VCS_VEILLEUR_E1"// PNJs 1
            
cPatrouille(); // Les PNJs vont faire leurs patrouilles.
    
}
    else if(
nHEURE >= 16 && nHEURE 24// TEMPS : 16H à 24H exclu
    
{
        if(
sTAG == "VCS_VEILLEUR_A1" || sTAG == "VCS_VEILLEUR_B1" || sTAG == "VCS_VEILLEUR_C1" || sTAG == "VCS_VEILLEUR_D1" || sTAG == "VCS_VEILLEUR_E1"// PNJs 1
            
cRepos(); // Les PNJs 2 se mettent en mode repos.
        
else if(sTAG == "VCS_VEILLEUR_A3" || sTAG == "VCS_VEILLEUR_B3" || sTAG == "VCS_VEILLEUR_C3" || sTAG == "VCS_VEILLEUR_D3" || sTAG == "VCS_VEILLEUR_E3"// PNJs 3
            
cRepos(); // Les PNJs vont se reposer.
        
else if(sTAG == "VCS_VEILLEUR_A2" || sTAG == "VCS_VEILLEUR_B2" || sTAG == "VCS_VEILLEUR_C2" || sTAG == "VCS_VEILLEUR_D2" || sTAG == "VCS_VEILLEUR_E2"// PNJs 2
        
{
            if(
xLAMPES == && nHEURE >= 18)
                
cLampe(); // Les PNJs vont allumer ou éteindre les lampes.
            
else if(xLAMPES == || nHEURE 18)
                
cPatrouille(); // Les PNJs vont faire leurs patrouilles.
        
}
    }
    else if(
nHEURE >=&& nHEURE 8// TEMPS : 0H à 8H exclu
    
{
        if(
sTAG == "VCS_VEILLEUR_A1" || sTAG == "VCS_VEILLEUR_B1" || sTAG == "VCS_VEILLEUR_C1" || sTAG == "VCS_VEILLEUR_D1" || sTAG == "VCS_VEILLEUR_E1"// PNJs 1    
            
cRepos(); // Les PNJs vont se reposer.    
        
else if(sTAG == "VCS_VEILLEUR_A2" || sTAG == "VCS_VEILLEUR_B2" || sTAG == "VCS_VEILLEUR_C2" || sTAG == "VCS_VEILLEUR_D2" || sTAG == "VCS_VEILLEUR_E2"// PNJs 2
            
cRepos(); // Les PNJs vont se reposer.
        
else if(sTAG == "VCS_VEILLEUR_A3" || sTAG == "VCS_VEILLEUR_B3" || sTAG == "VCS_VEILLEUR_C3" || sTAG == "VCS_VEILLEUR_D3" || sTAG == "VCS_VEILLEUR_E3"// PNJs 3
        
{
            if(
xLAMPES == && nHEURE >= 6)
                
cLampe(); // Les PNJs vont allumer ou éteindre les lampes.
            
else if(xLAMPES == || nHEURE 6)
                
cPatrouille(); // Les PNJs vont faire leurs patrouilles.
        
}
    }
    
    
ActionDoCommand(ExecuteScript("vsc_script_veilleur",oSELF));
    

Code PHP:

void cPatrouille() // SCRIPT DES PATROUILLES
{
    
// VARIABLES
    
    
int nHEURE GetTimeHour(); // HEURE DU MODULE
    
    
object oSELF OBJECT_SELF// C'est le PNJ qui va effectuer le script
    
    
string sTAG GetTag(OBJECT_SELF); // Le TAG du PNJ
    
    // SCRIPT
    
    // GROUPE A
    
if(sTAG == "VCS_VEILLEUR_A1" || sTAG == "VCS_VEILLEUR_A2" || sTAG == "VCS_VEILLEUR_A3")
    {    
        
// VARIABLES LOCALES
        
object oPAT OBJECT_SELF// PERSONNAGE : UTILISATEUR DU SCRIPT
    
        
int nPDP GetLocalInt(oPAT,"POINT_DE_PASSAGE_EN_COURS"); // VARIABLE POUR INCREMENTER LA VALEUR POINT_DE_PASSAGE
        
object oPDP GetWaypointByTag("POINT_DE_PASSAGE_A"+IntToString(nPDP)); // OBJET : POINT_DE_PASSAGE
    
        // SCRIPT
    
        
if(oPDP==OBJECT_INVALID// il n'y a plus de point de passage
            
DeleteLocalInt(oPAT,"POINT_DE_PASSAGE_EN_COURS"); // Supprimer la varaible oPAT
        
else
        {
            if(
nHEURE >= 17)
                
ActionEquipItem(GetItemPossessedBy(oPAT,"NW_IT_TORCH001"),INVENTORY_SLOT_LEFTHAND); // Si il fait nuit, le PNJ utilise sa torche
            
else if(nHEURE 6)
                
ActionUnequipItem(GetItemPossessedBy(oPAT,"NW_IT_TORCH001")); // sinon il range sa torche
            
ActionEquipItem(GetItemPossessedBy(oPAT,"NW_WSWRP001"),INVENTORY_SLOT_RIGHTHAND); // le veilleur s'équipe de son rapière.
            
ActionForceMoveToObject(oPDP); // Le PNJ va vers son point de patrouille
            
ActionDoCommand(SetLocalInt(oPAT,"POINT_DE_PASSAGE_EN_COURS",nPDP+1));
        }
    }

Code PHP:

void cLampadaire() // PLACEABLE
{
    
// VARIABLES
    
int nHEURE GetTimeHour(); // HEURE DU MODULE
     
object oSELF OBJECT_SELF;
    
    
string sTAG GetTag(OBJECT_SELF); // Le TAG du PNJ
    
    // LAMPADAIRE A
    
    
if(sTAG == "VCS_VEILLEUR_A2" || sTAG == "VCS_VEILLEUR_A3")
    {
        
int nLAMPE GetLocalInt(oSELF,"LAMPE_EN_COURS");
        
object oLAMPE GetObjectByTag("LAMPE_A"+IntToString(nLAMPE)); // OBJET : Lampadaire.
        
        
DestroyObject(oLAMPE);
        if(
nHEURE >= 17)
            
CreateObject(OBJECT_TYPE_PLACEABLE,"plc_ml_postlampon",GetLocation(oLAMPE),FALSE,("LAMPE_A"+IntToString(nLAMPE))); // Remplace le lampadaire éteint par le lampadaire allumé.
        
else if(nHEURE >= && nHEURE <= 16)
            
CreateObject(OBJECT_TYPE_PLACEABLE,"plc_ml_postlamp",GetLocation(oLAMPE),FALSE,("LAMPE_A"+IntToString(nLAMPE))); // Remplace le lampadaire allumé par le lampadaire allumé.
    

Code PHP:

void cLampe() // SCRIPT POUR LES LAMPADAIRES
{
    
// VARIABLES

    
int nHEURE GetTimeHour(); // HEURE DU MODULE
    
    
object oSELF OBJECT_SELF// C'est le PNJ qui va effectuer le script

    
string sTAG GetTag(OBJECT_SELF); // Le TAG du PNJ
    
    // SCRIPT
    
    // GROUPE A
    
    
if(sTAG == "VCS_VEILLEUR_A2" || sTAG == "VCS_VEILLEUR_A3")
    {
        
int nLAMPE GetLocalInt(oSELF,"LAMPE_EN_COURS");
        
        
object oLAMPE GetObjectByTag("LAMPE_A"+IntToString(nLAMPE)); // OBJET : Lampe.
        
object oLUMIERE GetObjectByTag("LUMIERE_A"+IntToString(nLAMPE)); // OBJET : Lumière.

        
int nACTIVE GetLocalInt(oLUMIERE,"ACTIVE");
        
        if(
oLAMPE == OBJECT_INVALID)
        {
            
ActionUnequipItem(GetItemPossessedBy(oSELF,"NW_WSWRP001")); // Enlever le rapière de la main gauche.
            
SetLocalInt(oSELF,"LUMIERE_ACTIVEE",1); // Mettre la variable locale "LUMIERE_ACTIVEE" sur 1.
            
DeleteLocalInt(oSELF,"LAMPE_EN_COURS"); // Supprimer la variable locale "LAMPE_EN_COURS".
        
}
        else
        {
            if(
nHEURE >= && nHEURE 18)
                
ActionEquipItem(GetItemPossessedBy(oSELF,"NW_WSWRP001"),INVENTORY_SLOT_LEFTHAND); // Equiper le rapière en main gauche
            
ActionForceMoveToObject(oLAMPE); // Le PNJ va vers la lampe
            
ActionPlayAnimation(ANIMATION_FIREFORGET_BARDSONG,1.0,2.0); // Le PNJ fait sont animation
            
ActionDoCommand(cLampadaire()); // Remplacer placeable
            
ActionDoCommand(SetLightActive(oLUMIERE,!nACTIVE)); // Active la lumière.
            
ActionDoCommand(SetLocalInt(oLUMIERE,"ACTIVE",!nACTIVE)); // Change la variable locale de la lumière.
            
ActionDoCommand(SetLocalInt(oSELF,"LAMPE_EN_COURS",nLAMPE+1)); // Incrémente la variable local de la lampe.
        
}
    }

Code PHP:

void cRepos() 

  
// Même remarque que plus haut, une seule variable suffit 
    
string tag GetTag(OBJECT_SELF); 

    if (
tag == "VCS_VEILLEUR_A1"
    { 
        
object door GetObjectByTag("PORTE_VCS_VEILLEUR_A1"); 
        
SetLocked(doorFALSE); 
        
ActionOpenDoor(door); 

        
DestroyObject(OBJECT_SELF); // Détruit le PNJ 
    

    
    else if (
tag == "VCS_VEILLEUR_A2"
    { 
        
object door GetObjectByTag("PORTE_VCS_VEILLEUR_A2"); 
        
SetLocked(doorFALSE); 
        
ActionOpenDoor(door); 

        
DestroyObject(OBJECT_SELF); // Détruit le PNJ 
    

    
    else if (
tag == "VCS_VEILLEUR_A3"
    { 
        
object door GetObjectByTag("PORTE_VCS_VEILLEUR_A3"); 
        
SetLocked(doorFALSE); 
        
ActionOpenDoor(door); 

        
DestroyObject(OBJECT_SELF); // Détruit le PNJ 
    



Dernière modification par Wilaz ; 18/01/2013 à 19h36.
Citation :
Publié par Wilaz
Voici les deux scripts au complet, c'est un peu indigeste (l'un fait 588 lignes) mais autant avoir toutes les cartes en main. (je sais que je peux améliorer certaines parties, mais je me suis dit : attend que tes veilleurs bossent correctement)
Le dernier et la partie du script qui me pose problème.

J'aimerai supprimer l'utilisateur du script (donc le PNJ), j'avais cru comprendre que la destruction des créatures était lié à la fonction DestroyObject.. sauf que voilà, le PNJ reste devant sa porte à l'ouvrir en boucle.

J'ai tout essayé, même de crée une fonction void mort() à part avec un DestroyObject(oSelf) (et autres) dans toutes ses formes.. mais niet.. je commence à me dire que je devrai détruire le PNJ en scriptant sa porte comme il faut.

Mais comme je suis idiot, je voudrai vous demander pourquoi le PNJ ne veut pas se détruire ?
Alors c'est vrai que c'est pas simple à lire, je pense que tu peux commencer par supprimer une partie du code pour avoir un problème plus simple.
Voilà ce que j'ai ressorti rapidement en me concentrant sur le veilleur A1:
Code PHP:

// On spawn
void main() 
{
  
int hour GetTimeHour();
  
// Note que tu affecte plusieurs variables (sVA1, sVB1, etc.)
  // avec la même valeur (GetTag), c'est pas nécessaire !
  
string tag GetTag(OBJECT_SELF);

  if (
hour >= 16 && hour 24)
  {
    if (
tag == "VCS_VEILLEUR_A1")
      
cRepos();
  }
  
// Et n'oublie pas d'utiliser des else if !

  // Par soucis de simplicité, ce sera juste une fonction ici
  // Dans notre cas ce script ne fait rien, tu peux l'enlever
  
cVeilleur();
}

void cRepos()
{
  
// Même remarque que plus haut, une seule variable suffit
  
string tag GetTag(OBJECT_SELF);

  if (
tag == "VCS_VEILLEUR_A1")
  {
    
object door GetObjectByTag("PORTE_VCS_VEILLEUR_A1");
    
SetLocked(doorFALSE);
    
ActionOpenDoor(door);

    
DestroyObject(OBJECT_SELF); // Détruit le PNJ
  
}
}

void cVeilleur()
{
  
int hour GetTimeHour();
  
// veilleur devrait être OBJECT_INVALID car il a été détruit dans cRepos
  
object veilleur GetObjectByTag("VCS_VEILLEUR_A1");

  
// On n'entre pas dans ce IF dans notre cas
  
if (veilleur == OBJECT_INVALID && hour >= && hour 16)
    
CreateObject(OBJECT_TYPE_CREATURE"VCS_VEILLEUR_A1",
      
GetLocation(GetWaypointByTag("WP_VCS_VEILLEUR_A1")));

  
// Note que dans ton script original (ligne 30) tu refais
  // le test sur oVA_1 au lieu de oVB_1 si l'on suit la logique

Bon courage !
Bien vu pour le tag, je n'y avais pas du tout pensé. (Je l'avais dit que j'étais idiot )

J'ai edité mon premier post pour faciliter la lecture et j'ai commencé à appliquer tes conseils. (même si pour moi, c'est un opérateur if avec un mot en plus..)

Bon, mon problème est toujours le même pour ce code, mon PnJ ne se supprime pas et il reste devant la porte à refaire le script en boucle.

J'ai testé de mettre ActionDoCommand(ExecuteScript("vsc_script_veilleur",oSELF)); dans les autres scripts et de supprimer celui du main(), mais le seul truc qui a changé c'est qu'il reste devant sa porte à glandouiller.
Dès que j'ai un peu de temps ce week-end je regarderais ce que ça donne chez moi.

Il y a une différence entre if.. et else if. En français:
Code PHP:

Si A // if (A)
  
alors B
Si C 
// if (C)
  
alors D


Si A 
// if (A)
  
alors B
Sinon si C 
// else if (C)
  
alors D 
Ça dépend donc des situations. Dans ton cas il est conseillé d'utiliser des else if.
Quelques exemples:
Code PHP:

int state 0;
if (
state == 0// on teste state
  
state 1:
if (
state == 1// on reteste state
  
state 2;
// A la fin de ce code, state vaut 2, et on a testé 2 fois state 
Code PHP:

int state 0;
if (
state == 0// on teste state
  
state 1;
else if (
state == 1// on ne teste pas car on est déjà entré dans une des solutions
  
state 2;
// A la fin de ce code, state vaut 1 

Dernière modification par Lv4 ; 15/04/2013 à 23h56. Motif: Correction pseudo code.
D'accord, je commence à comprendre de l'utilité de "else if "du coup.

Bon, j'ai une bonne nouvelle, après plusieurs tests : J'ai trouvé d'où venait l'erreur !

Il ne vient pas du script.. mais de la créature en faite.

Comme je crée mes PNJ de A à Z, je n'avais pas rempli l'onglet "Behavior" du menu Properties. Et après avoir coché la case "Decays" tout fonctionne correctement.
C'est tout con, mais il fallait le savoir...

Je suis bien content du coup, mon premier script fonctionne ! Il ne me reste plus qu'à l'alléger un peu, et ajouter quelques actions en plus. Bon ceci dit, mes autres questions reste sans réponse.

Merci de ton aide en tout cas.

Bon, aujourd'hui et après avoir bien réfléchis, j'ai décidé de permettre l'utilisation du script dans plusieurs villes différentes. Mais aussi de fusionner cPatrouille avec cLampe. (parce que c'était ridicule "RP parlant") Alors, j'ai réussi et pour çà j'ai utilisé les fonctions GetNearestObjectByTag(); et GetNearestObject(); pour le cPorte. (je vais à côté de la porte grâce au wp_spawn du PNJ)

Maintenant, à chaque point de passage, le PNJ vérifie si le lampadaire le plus proche est allumé (en journée) ou éteint (le soir), le PNJ va dessus pour changer son état. (Sinon, il continu son chemin)

Mais (parce qu'il y a un mais) je me suis senti obligé de mettre des "SetLocalInt" et des "if "partout, sinon les PnJs font n'importe quoi !
(Par exemple : Faire des aller-retours entre deux lampadaires, ou allumer qu'une lampe sur deux)

Bon, d'un côté sa marche, je me dis que c'est normal. Mais de l'autre je suis plutôt étonné et je me dis que j'ai du loupé un truc... et j'aimerai bien quelques explications de se côté là en faite.

Voici le script cPatrouille en question (seulement pour les Veilleurs A), je vous ai mis le programme en lien pour faciliter la lecture (via Notepad++)

Bon maintenant, je vais voir si je peux lui faire un petit régime à se bout de code..

Code PHP:

void cPatrouille() // SCRIPT DES PATROUILLES
{
// VARIABLES
    
    
int nHEURE GetTimeHour(); // HEURE DU MODULE
    
    
object oSELF OBJECT_SELF// C'est le PNJ qui va effectuer le script
    
string sTAG GetTag(oSELF); // Le TAG du PNJ
    
// SCRIPT

// PARTIE COMMUNE

    
if(nHEURE >= 17 || nHEURE 6// Entre 17H et 6 H
        
ActionEquipItem(GetItemPossessedBy(oSELF,"NW_IT_TORCH001"),INVENTORY_SLOT_LEFTHAND); // Le PNJ utilise sa torche dans sa main gauche
    
else if(nHEURE >= && nHEURE 17// Entre 6H et 17H
        
ActionUnequipItem(GetItemPossessedBy(oSELF,"NW_IT_TORCH001")); // il range sa torche 
    
ActionEquipItem(GetItemPossessedBy(oSELF,"NW_WSWRP001"),INVENTORY_SLOT_RIGHTHAND); // le veilleur s'équipe de son rapière en main droite    

// GROUPE A
    
if(sTAG == "VEILLEUR_A1" || sTAG == "VEILLEUR_A2" || sTAG == "VEILLEUR_A3")
    {    
        
// VARIABLES
        
int nPDP GetLocalInt(oSELF,"POINT_DE_PASSAGE_EN_COURS"); // VARIABLE POUR INCREMENTER LA VALEUR POINT_DE_PASSAGE
        
object oPDP GetWaypointByTag("POINT_DE_PASSAGE_A_"+IntToString(nPDP)); // OBJET : POINT_DE_PASSAGE
        
object oLAMPADAIRE GetNearestObjectByTag("LAMPADAIRE");
        
object oLAMPE GetNearestObjectByTag("LUMIERE_A");
        
int nETAT GetLocalInt(oLAMPE,"ETAT");
    
        
// SCRIPT
        
if(oPDP==OBJECT_INVALID// il n'y a plus de point de passage 
            
DeleteLocalInt(oSELF,"POINT_DE_PASSAGE_EN_COURS"); // Supprimer la variable de oSELF 
        
else 
        {
            if(
GetLocalInt(oSELF,"SUR_POINT") == )
            {
                
ActionForceMoveToObject(oPDP); // Le PNJ va vers son point de patrouille.
                
ActionDoCommand(SetLocalInt(oSELF,"SUR_POINT",1));
            }
            
            else if((
GetLocalInt(oSELF,"SUR_POINT") == 1)    // de 6H à 17H
            
{
                if((
GetLocalInt(oLAMPE,"ETAT") == && nHEURE >= && nHEURE 17) || (GetLocalInt(oLAMPE,"ETAT") == && nHEURE >= 17 || nHEURE 6))    // Si la lumière la plus proche = 0 (éteinte) en journée ou Si la lumière la plus proche = 1 (allumée) en soirée.
                
{
                    
ActionDoCommand(SetLocalInt(oSELF,"POINT_DE_PASSAGE_EN_COURS",nPDP+1)); // La valeur POINT_DE_PASSAGE_EN_COURS s'incrémente.
                    
ActionDoCommand(SetLocalInt(oSELF,"SUR_POINT",0));
                }
                else if((
GetLocalInt(oLAMPE,"ETAT") == && nHEURE >= && nHEURE 17) || (GetLocalInt(oLAMPE,"ETAT") == && nHEURE >= 17 || nHEURE 6))    // Sinon SI la lumière la plus proche = 1 (Allumée) en journée ou si la lumière la plus proche = 0 (éteinte) en soirée.
                
{
                    
ActionDoCommand(SetLocalInt(oLAMPE,"SUR_LAMPE",1)); // La lampe indique qu'il y a un PNJ sur elle
                    
if(GetLocalInt(oLAMPE,"SUR_LAMPE") == 1// Si il y a un PNJ sur la lampe
                    
{
                        
ActionForceMoveToObject(oLAMPADAIRE); // Le PNJ va vers la lumière
                        
ActionDoCommand(SetLocalInt(oLAMPADAIRE,"SUR_LAMPADAIRE",1)); // Le PNJ est à côté du lampadaire
                        
if(GetLocalInt(oLAMPADAIRE,"SUR_LAMPADAIRE") == 1)
                        {
                            if(
nHEURE >= && nHEURE 17)
                            {
                                
ActionUnequipItem(GetItemPossessedBy(oSELF,"NW_WSWRP001")); // Enlever le rapière de la main droite.
                                
ActionEquipItem(GetItemPossessedBy(oSELF,"NW_WSWRP001"),INVENTORY_SLOT_LEFTHAND); // Equiper le rapière en main gauche.    
                            
}
                            
ActionPlayAnimation(ANIMATION_FIREFORGET_BARDSONG,1.0,2.0); // Le PNJ fait sont animation
                            
ActionDoCommand(cLampadaire()); // Remplacer le placeable du lampadaire
                            
ActionDoCommand(SetLightActive(oLAMPE,!nETAT)); // Eteindre la lumière
                            
ActionDoCommand(SetLocalInt(oLAMPE,"ETAT",!nETAT)); // Mettre l'état de la lampe sur 0
                            
ActionDoCommand(SetLocalInt(oLAMPE,"SUR_LAMPE",0)); // Indique qu'il y a plus de PNJ sur la lampe
                            
ActionDoCommand(SetLocalInt(oSELF,"SUR_POINT",0));
                            
ActionDoCommand(SetLocalInt(oSELF,"POINT_DE_PASSAGE_EN_COURS",nPDP+1));
                        }
                    }
                }
            }
        }
    }

Fichiers attachés
cPATROUILLE2.txt (3,7 Ko, 27 affichages)

Dernière modification par Wilaz ; 20/01/2013 à 20h06.
Quelques idées qui te permettront d'y voir plus clair:
- utiliser une variable is_day au lieu de recalculer l'heure tout le temps.
- tu stocke l'état ligne 28 sans le réutiliser partout (alors que tu pourrais ligne 43 et 48).
- utiliser une fonction qui se charge de l'animation du PNJ, d'éteindre la lumière, etc.
- tu n'as pas besoin de faire ActionDoCommand(SetLocalInt ...), SetLocalInt suffit.

Ce que ça donnerait par exemple:
Code PHP:

int day nHeure >= && nHeure 17;
[...]
// !day correspond à l'inverse de day, c'est à dire nHEURE >= 17 || nHEURE < 6
else if (nETAT == && day || nETAT == && !day)
{
  
// on utilise une fonction
  
changer_lampe(oLAMPADAIREoLAMPEnETAT);
  
SetLocalInt(OBJECT_SELF"SUR_POINT"0);
  
SetLocalInt(OBJECT_SELF"POINT_DE_PASSAGE_EN_COURS"nPDP+1);
}
[...]

void changer_lampe(object lampadaireobject lampeint etat)
{
  
// A noter que j'ai enlevé les if ligne 51 et 55 puisqu'ils sont toujours vrai:
  // SetLocalInt(oLAMPE, "SUR_LAMPE", 1);
  // if (GetLocalInt(oLAMPE, "SUR_LAMPE") == 1) // toujours vrai !
  
ActionMoveToObject(lampadaire);
  
ActionPlayAnimation(ANIMATION_FIREFORGET_BARDSONG1.02.0);
  
cLampadaire();
  
SetLightActive(lampe, !etat);
  
SetLocalInt(lampe"ETAT", !etat);

Ah, je suis content car j'avais déjà appliqué quelques conseils avant de lire.

Je n'avais pas pensé à faire une fonction pour allumer le lampadaire, par contre la variable "SUR_LAMPE" est nécessaire dans mon script. Si elle n'est pas présente, le veilleur ne va allumer qu'une lampe sur deux. Puis si "SUR_LAMPADAIRE" manque le veilleur fait des aller-retour entre deux lampadaires (et en plus, il n'allume pas le bon).

Bon, je vais déjà créer la fonction pour l'animation, je verrai bien pour la suite.
--
Sinon petite question, pour un autre script, j'ai commencé à écrire l'IA des civiles.

Les PNJs auront accès à une bibliothèque avec plusieurs options, par exemple :

- ils vont au marché (si et seulement si c'est le jour du marché) (cMarche)
- ils vont dans le premier parc (cParc1)
- ils vont dans le second parc (cParc2)
- ils vont voir les soldats sur le terrain d'entraînement (cSoldat)
- ils jouent dans la rue (Je pense à un "c'est toi le chat" pour les enfants seulement)

Actuellement, je suis entrain de faire le void main d'un des PNJs , j'ai fait en sorte qu'il ne fasse qu'une action par jour. (avec un bon vieux (Random) sauf le jour du marché, il va faire ses courses si c'est pas déjà fait.

J'aimerai complexer un peu le tout pour qu'il lance une nouvelle action toutes les heures. (ou autres) Je n'ai pas trop d'idée malheureusement, enfin si, un truc dans se genre là : (mais si vous avez d'autres idées, je suis tout ouïe)

Code PHP:

int nRANDOM// ACTION DU PNJ.
int nRAND GetLocalInt(oSELF,"ACTION_EN_COURS")
nt nHEURE GetTimeHour();
int nILEST GetLocalInt(oSELF,"HEURE");

if(
nRAND 0// Accès à la Fonction Random
        
        
SetLocalInt(nRAND 1)
        switch(
Random(x))
        {
            case 
nRANDOM x; break;  
            case 
nRANDOM 1; break; 
            default : 
nRANDOM 0; break; // Marché
        
}
        
else if (
nRAND == 1// Accès une fois que l'action est défini
        
        
if(nILEST == 0)
            
SetLocalInt(oSELF,"HEURE",nHEURE);
            
        else
        {
            if(
nILEST == nHEURE)
            {
                if(
nRANDOM == 0  )
                    
cMarche():
                else if(
nRandom == x)
                    
cX();
            }
            else
            {
                
SetLocalInt(oSELF,"HEURE",0)
                
SetLocalInt(oSELF,"ACTION_EN_COURS",0)
            }
        }
    }
Executescript blala


Dernière modification par Wilaz ; 22/01/2013 à 15h16.
Répondre

Connectés sur ce fil

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