[Barde inside] Quelques questions simples

Répondre
Partager Rechercher
nonon, c'est bien le resref, mais peut etre le CreateItemInInventory fonctionne mal avec des placeables... (quoique ca m'etonnerait).

Juste pour tester, peut tu mettre une creature avec ce script (en remplacant GetLastClosedBy par GetPCSpeaker) dans son OnConv, pour verifier son inventaire apres ?
Va falloir m'expliquer un peu mieux, parce que là j'y arrive pas...

J'ai modifié le script et je l'ai rajouté au script de base du OnConv (parce que sinon il veut pas me parler). J'ai mit un joli dialogue inutile.
J'ai mit l'objet direct dans l'inventaire du PNJ, mais quand on lui parle ça fait rien.
Impossible de lui parler en DM et donc pour lancer le script ça me semble pas gagné (je précise que si je met l'objet dans la tombe en DM, il disparait mais il n'y a aucun effet)... Et je ne sais vérifier un inventaire qu'en DM.

Humph de humph... Tu peux pas me faire une explication détaillée en style télégraphique ?
Je vais revérifier les resref au cas où (reste plus qu'à retrouver les objets...), même si j'avais déjà fait cette vérif...
Tu peux parler en mode GM : a partir du menu contextuel circulaire. (n00b, va ! )


SInon, ce que je te proposait, c'etait juste pour verifier si c'est l'inventaire des placeable qui ne marche pas, ou si c'est un pb dans la fonction crée (mais je vois pas : le script est simple et a l'air bon)

D'ou l'idée de passer d'un place&able avec un OnClose pour une creature avec un OnConv. (et n'oublie pas de lui donner un inventaire, a cette creature ^^)


Une fois qu'on saura si ca marche ou pas avec une creature, on pourra essayer de comprendre pourquoi ca marche pas avec ton coffre...
Humph... Il y a un petit problème.
Je met le script dans le OnConv du PNJ (je met un dialogue inutile au PNJ et Crypt_Tomb_03 dans son inventaire). Mais si je lance la conversation, rien ne se passe (ni xp, ni effets visuels).
J'ai du faire une grosse erreur quelque part mais je sais pas où...

Je sent que je vais simplifier ça et mettre un banal dialogue.
Que veux-tu mettre dans la tombe ?
- Objet 1 (apparait si Objet 1 dans l'inventaire du PJ)
- Objet 2
- ...

Au moins ça devrait marcher. Mais c'est moins bien .

[Edit] C'est bon, j'ai trouvé. Quand je prenais les resref, je faisait éditer et copier dans la palette, et j'enlevais 1 au nombre terminant le resref. J'avais tout simplement pas fait attention que en plus d'augmenter le chiffre de fin de 1 ça enlevait le nw_ du début.
Par contre, ça marche pas complètement . Je vient de tester et de remplir 25 contenant de la tombe . Tout a été dupliqué .

Code PHP:

void main()

{

int nXP_amount  250;
string sItem01 "nw_mcloth012";
string sItem02 "nw_wmgwn008";
string sItem03 "nw_it_mpotion012";
effect eFX EffectVisualEffect(VFX_IMP_DISPEL);
object oItem GetFirstItemInInventory(OBJECT_SELF);
object oPC GetLastClosedBy();

while (
GetIsObjectValid(oItem))
    {
    if (
GetTag(oItem)=="Crypt_Tomb_03")
         {
        
DestroyObject(oItem);
        
GiveXPToCreature(oPCnXP_amount);
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eFX,oPC,1.0);
        
CreateItemOnObject(sItem01,OBJECT_SELF,1);
        
CreateItemOnObject(sItem02,OBJECT_SELF,1);
        
CreateItemOnObject(sItem03,OBJECT_SELF,5);
        }
    
oItem GetNextItemInInventory(OBJECT_SELF);
    }

Oui, si tu as plusieurs objets dans le contenant, ca peut être un peu tendu.

Essaye ca pour corriger :

Code PHP:

void FillInventory(object OC,object O1object O2=OBJET_INVALIDobject O3 OBJECT_INVALID)
{
CreateItemOnObject(O1,OC,1);
CreateItemOnObject(O2,OC,1);
CreateItemOnObject(O3,OC,5);
return;
}

void main()

{

int nXP_amount  250;
string sItem01 "nw_mcloth012";
string sItem02 "nw_wmgwn008";
string sItem03 "nw_it_mpotion012";
effect eFX EffectVisualEffect(VFX_IMP_DISPEL);
object oItem GetFirstItemInInventory(OBJECT_SELF);
object oPC GetLastClosedBy();

while (
GetIsObjectValid(oItem))
    {
    if (
GetTag(oItem)=="Crypt_Tomb_03")
         {
        
DestroyObject(oItem);
        
GiveXPToCreature(oPCnXP_amount);
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eFX,oPC,1.0);
        
DelayCommand(1.0,FillInventory(OBJECT_SELF,sItem01,sItem02,sItem03);
        }
    
oItem GetNextItemInInventory(OBJECT_SELF);
    }

Je vais demander quelque chose de beaucoup plus simple cette fois .

[PNJ] : blablabla
- [PJ] : [jet de force] Tu vas t'en prendre une.
-- [PNJ] : [Echec] Même pas peur
---[PNJ] : [Réussite] Maman !
- [PJ] : [jet de charisme] Tu vas t'en prendre une.
-- [PNJ] : [Echec] Même pas peur
---[PNJ] : [Réussite] Maman !

Je fais comment les jets de carac ? (j'ai regardé dans WW comment étaient fait les jets de carac, mais j'ai rien compris à leur script...).
Pour la difficulté, on va dire 15.

Deuxième petite question.

[PNJ] : Santé !
- [PJ] : [Jet de constitution/réussite] Santé !
- [PJ] : [Jet de constitution/échec] Beuarp !
--[PNJ] : On remet ça !
--- [PJ] : [Jet de constitution/réussite] Santé !
--- [PJ] : [Jet de constitution/échec] Beuarp !
etc.

Si le jet est réussit (difficulté 10), il faut augmenter une variable de 1, et suivant la valeur de la variable (0 à 5), la difficulté du jet est différente (+2 par point dans la variable).
Var = 0 ----> DC 10
Var = 1 ----> DC 12
Etc.
Si le jet est un échec, la variable doit être remis à 0, le PJ se met à tituber et s'étale par terre en ronflant pendant quelques secondes (on va dire 5), avant de se relever.

Troisième petite question.
Si le PNJ perd le petit concours de beuverie, il se lève, se dirige vers la porte de sortie, l'ouvre et disparaît.
Il suffit juste que je lui dise d'aller ouvrir l'objet ayant le tag "tagdelaporte" et que je fasse un DestroyObject sur lui même ?

Rien de bien difficile n'est-ce pas ?
Bon, j'ai réussit à faire ce que je demandais au dessus (il me manque juste l'effet visuel pour le ronflement).

J'ai un tout petit problème. Lorsque je parle à un PNJ assis, il se lève, et j'aimerais qu'il reste assis. J'avais réussit à faire ça il y a quelques siècles, mais j'arrive pas à remettre la main dessus .
Quelqu'un peut m'aider à faire rester ces abrutis de PNJ sur leur chaise ?
pour les PnJ qui se levent, c'est a cause d'un clearAllaction a la fin des conversations, probablement.

Soit tu remet un AssignCommand(oPNJ, SiSit(!)) dans l'evenement de fin de script (avec un delaycommand de 0.5), soit tu refait le tour de tous les script du dialogue, a la recherche de ClearAllActions();

(pour les autres questions, ca va, ou il en reste ? )
Pas de ClearAllAction à la fin des dialogues.
Mon problème c'est en début de dialogue. Lorsque je clique sur le pnj pour lui parler, il se lève au moment où débute la conversation. C'est ce truc que je veux enlever, je veux qu'il ne se lève pas quand je débute une conversation.

Je sais qu'il y a un truc à virer mais je sais plus quoi. Je crois que c'est en rapport avec le OnConversation, mais comme il a changé suite à SoU, je suis perdu.
Mais BioWare n'avait pas rajouté quelque chose justement pour éviter que le personnage ne se lève de sa chaise ?

*part fouiller dans divers modules à la recherche de PNJ restant assis*
Bon, j'ai un problème (comme d'habitude). Mon PNJ doit aller jusqu'à la porte, l'ouvrir, et ce n'est qu'à ce moment là qu'il doit disparaître. Mais le problème, c'est qu'il disparaît un peu trop tot...
Comment je fais pour que le DestroyObject se lance 1 seconde après ouverture de la porte ?

Code PHP:

void main()
{
   
object oDoor;
   
object oTarget;
   
oDoor GetNearestObjectByTag ("Door_exit");
   
oTarget OBJECT_SELF;
   
SetLocalInt(GetPCSpeaker(), "var_gerdil"2);
   
ActionOpenDoor(oDoor);
   
DestroyObject(oTarget1.0);

Et j'ai toujours le problème de ce fichu PNJ qui veut pas rester sur sa chaise... Je l'oblige à se rasseoir avec un OnHeartBeat, mais j'aime pas (pas à cause du OnHeartBeat qui n'est pas dérangeant vu le module, mais parce que le PNJ se lève et se rassoit au lieu de rester assis).
Ah ok, ActionDoCommand sert donc à ça ! J'aurais appris un truc.
C'est vrai que maintenant, ça marche beaucoup mieux.

Hop, je retourne au charbon (me reste plus beaucoup de script à faire, si ce n'est une pseudo cinématique et deux-trois tests de variables...).
10 heures de travail pour 10 minutes de jeu, je trouve ça correct .
J'ai un script qui marche... presque.
Il faut que deux PNJ apparaisse sur deux waypoint, avec un effet pour faire un peu plus joli, puis l'un d'eux lance une conversation.
Mes PNJ apparaissent, mais j'ai pas de joli effet lumineux (et j'ai pas fait la conversation pour l'instant, donc je sais pas si ça marche ou pas à ce niveau là).
Quelqu'un peut me corriger ça ?

Code PHP:

void main()
{

object oPC GetPCSpeaker();

object oTarget1;
object oSpawn1;
location lTarget1;
object oTarget2;
object oSpawn2;
location lTarget2;

oTarget1 GetWaypointByTag("wp_capitaine");
lTarget1 GetLocation(oTarget1);
oSpawn1 CreateObject(OBJECT_TYPE_CREATURE"dorne"lTarget1);
oTarget1 oSpawn1;
oTarget2 GetWaypointByTag("wp_rolenth");
lTarget2 GetLocation(oTarget1);
oSpawn2 CreateObject(OBJECT_TYPE_CREATURE"rolenth"lTarget2);
oTarget2 oSpawn2;

int nInt1;
nInt1 GetObjectType(oTarget1);
int nInt2;
nInt2 GetObjectType(oTarget2);

if (
nInt1 != OBJECT_TYPE_WAYPOINTApplyEffectToObject(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_GATE), oTarget1);
else 
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_GATE), GetLocation(oTarget1));
if (
nInt2 != OBJECT_TYPE_WAYPOINTApplyEffectToObject(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_GATE), oTarget2);
else 
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_GATE), GetLocation(oTarget2));

AssignCommand(oTarget1ActionStartConversation(oPC""));


Voyons voyons... A priori c'est l'effet appliqué dans ton test qui ne marche pas. (Au passage, tu ne peux jamais passer dans le else, à priori.) Mais pourquoi? Je ne m'y connais p'tet pas assez, mais j'essayerais plutôt d'appliquer l'effet à l'emplacement de oTarget1 plutôt que sur oTarget1 directement.

Ca donnerais ça:

Code PHP:

void main()
{

object oPC GetPCSpeaker();

object oTarget1;
object oSpawn1;
location lTarget1;
object oTarget2;
object oSpawn2;
location lTarget2;

oTarget1 GetWaypointByTag("wp_capitaine");
lTarget1 GetLocation(oTarget1);
oSpawn1 CreateObject(OBJECT_TYPE_CREATURE"dorne"lTarget1);
oTarget1 oSpawn1;
oTarget2 GetWaypointByTag("wp_rolenth");
lTarget2 GetLocation(oTarget1);
oSpawn2 CreateObject(OBJECT_TYPE_CREATURE"rolenth"lTarget2);
oTarget2 oSpawn2;

int nInt1;
nInt1 GetObjectType(oTarget1);
int nInt2;
nInt2 GetObjectType(oTarget2);

ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_GATE), GetLocation(oTarget1));
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_FNF_SUMMON_GATE), GetLocation(oTarget2));

AssignCommand(oTarget1ActionStartConversation(oPC""));


(Plus de test et forcement sur la localisation et plus sur l'objet.)

J'ai bon?

Fanley, scripteur très débutant.

PS: Merci de tes questions, Simkim, ça me permet de voir des difficultés intéressantes à mon niveau
Bon, le script marche... presque. En fait, j'ai fait une erreur à la dernière ligne, et j'arrive pas à la corriger...

Code PHP:

AssignCommand(oTarget1ActionStartConversation(oPC"")); 

C'est pas oTarget qui doit lancer une conversation, mais Dorne (est aussi le nom du Tag et du resref), l'un des PNJ qui est apparu.
Je voulais mettre un GetCreatureByTag à la place de oTarget, mais j'ai l'impression que cette commande n'existe pas...
Je dois faire comment ?

[Edit] : A ben peut-être que c'est juste GetObjectByTag qu'il faut prendre

[Edit2] : J'arrive pas à lancer cette fichue conversation

[Edit3] : J'ai finit par trouver une solution (c'est peut-être pas la meilleure, mais elle fonctionne), mettre un script dans le OnSpawn pour lancer la conversation.
Et quelqu'un peut me modifier juste un peu le script d'apparition des PNJ afin que l'effet visuel ait lieu avant l'apparition, et non après ?
Répondre

Connectés sur ce fil

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