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
// 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 >= 8 && 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 == 0 && nHEURE >= 18)
cLampe(); // Les PNJs vont allumer ou éteindre les lampes.
else if(xLAMPES == 1 || nHEURE < 18)
cPatrouille(); // Les PNJs vont faire leurs patrouilles.
}
}
else if(nHEURE >=0 && 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 == 0 && nHEURE >= 6)
cLampe(); // Les PNJs vont allumer ou éteindre les lampes.
else if(xLAMPES == 1 || nHEURE < 6)
cPatrouille(); // Les PNJs vont faire leurs patrouilles.
}
}
ActionDoCommand(ExecuteScript("vsc_script_veilleur",oSELF));
}
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));
}
}
}
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 >= 5 && nHEURE <= 16)
CreateObject(OBJECT_TYPE_PLACEABLE,"plc_ml_postlamp",GetLocation(oLAMPE),FALSE,("LAMPE_A"+IntToString(nLAMPE))); // Remplace le lampadaire allumé par le lampadaire allumé.
}
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 >= 6 && 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.
}
}
}
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(door, FALSE);
ActionOpenDoor(door);
DestroyObject(OBJECT_SELF); // Détruit le PNJ
}
else if (tag == "VCS_VEILLEUR_A2")
{
object door = GetObjectByTag("PORTE_VCS_VEILLEUR_A2");
SetLocked(door, FALSE);
ActionOpenDoor(door);
DestroyObject(OBJECT_SELF); // Détruit le PNJ
}
else if (tag == "VCS_VEILLEUR_A3")
{
object door = GetObjectByTag("PORTE_VCS_VEILLEUR_A3");
SetLocked(door, FALSE);
ActionOpenDoor(door);
DestroyObject(OBJECT_SELF); // Détruit le PNJ
}
}