NWN2 - La Tour des Arcanes

conversation

Répondre
Partager Rechercher
C'est exactement ce que j'ai fait, encore merci !!

Tient, une nouvelle question pour la peine :

y-a-t-il un moyen lors d'une conv pour transférer un objet de l'inventaire du pnj qui parle à celui du pj ?
C'est faisable, et tu as deux manières :

La première consiste effectivement à transférer un item d'un inventaire vers un autre :
Code PHP:

// En admettant que le tag de l'item est "item_a_transferer"
void main()
{
    
object oPNJ OBJECT_SELF;
    
object oItem GetFirstItemInInventory(oPNJ);
    while(
oItem!=OBJECT_INVALID)
    {
        if(
GetTag(oItem)=="item_a_transférer")
            break;
        
oItem GetNextItemInInventory(oPNJ);
    }
    
ActionGiveItem(oItem,GetFirstPC());

La seconde consiste à créer directement l'item dans l'inventaire du joueur :
Code PHP:

// En admettant que le ResRef de l'item est "item_a_creer"
void main()
{
    
CreateItemOnObject("item_a_creer",GetFirstPC());

Pour la création d'un objet, pas de souci. Pour le transfert, je met le script sur un node de conversation du pnj en question je suppose.

Edit: en complément du transfert d'objet, est-il possible de faire vérifier la présence d'un objet dans l'inventaire du PNJ avant un noeud de dialogue (pour éviter qu'il ne donne un objet qu'il n'a plus par exemple)?
Ici lors de la première boucle de Deyonara, il y a déjà le test. C'est à dire que le NPC ne donne l'objet que s'il le possède. Cependant ça peut donner lieu à des situations bizarres, si le NPC propose de donner l'objet puis qu'il ne le trouve pas.

Pour tester la présence d'un objet dans l'inventaire d'un personnage, j'utilise ça et ne sait pas s'il y a mieux (GetItemPossessedBy nous intéresse) :
Code PHP:

// Renvoie TRUE si oCreature possède un item de sTag dans son inventaire,
// FALSE sinon.
int HasItem(object oCreaturestring sTag)
{
   return 
GetItemPossessedBy(oCreaturesTag) != OBJECT_INVALID;

Par contre, tu devrais pouvoir utiliser cette fonction (GetItemPossessedBy) aussi pour récupérer l'objet comme dans la boucle de Deyonara, ainsi le code serait plus simple :
Code PHP:

void main()
{
    
object oPNJ OBJECT_SELF;
    
object oItem GetItemPossessedBy(oPNJ"item_a_transférer");

    if (
oItem != OBJECT_INVALID)
        
ActionGiveItem(oItemGetFirstPC());
    else
        
// Le code que tu peux effectuer lorsque le NPC n'a plus l'objet.

Directement depuis la liste de fonctions de JOL

object GetItemPossessedBy
(
object oCreature,
string sItemTag
)
Paramètres :
- oCreature : La créature concernée.
- sItemTag : Le Tag de l'item recherché.
Description :
Renvoie la valeur "object" de l'item, dont le tag est défini par sItemTag, que posséde l'objet désigné par oCreature.
Bon, je me retrouve bloqué de nouveau malgré ce script :

Citation :
Publié par Deyonara
Dans ce cas essaye comme ça :
Code PHP:

#include "nw_i0_generic"
 
void main()
{
    
object oPC GetFirstPC();
 
    
SetIsTemporaryEnemy(oPC);
    
DetermineCombatRound(oPC);

Si tu es en mode campagne, il faudra que tu mettes le paramètre "UsesPersonnalReputations" de ta campagne à "True".
En effet, si j'utilise le paramètre "UsesPersonnalReputations" à True, mes compagnons n'attaquent plus les cibles hostiles.
Quelqu'un saurait comment je peux palier à cela ?
A mon avis (pas forcément bon), il faut penser autrement si tu ne veux pas partir dans la définition de réputations.

Pourquoi ne pas essayer de bloquer ce fameux compagnon qui ne doit pas attaquer ? Par exemple, en lui attribuant un niveau d'IA nul ([SetCreatureScriptsToSet(object, int)]) puis en lui redonnant sont IA par défaut une fois le combat terminé (cela dit, y a peut-être plus simple).

Sinon, par pure curiosité, pourquoi faut-il attribuer TRUE à "UsesPersonnalReputations" ?
Peut-être en rajoutant une boucle qui fait le tour de tes compagnons et rend la cible hostile envers eux aussi.

Je propose ça (de mémoire, et il est tard... enfin... tôt... enfin voilà) :
Code PHP:

#include "nw_i0_generic"
 
void main()
{
    
object oPC GetFirstPC();
    
object oParty GetFirstFactionMember(oPC);
    while(
oParty != OBJECT_INVALID)
    {
        
SetIsTemporaryEnemy(oPC);
        
oParty GetNextFactionMember(oPC);
    }
    
DetermineCombatRound(oPC);

Citation :
Publié par Lv4
A mon avis (pas forcément bon), il faut penser autrement si tu ne veux pas partir dans la définition de réputations.

Pourquoi ne pas essayer de bloquer ce fameux compagnon qui ne doit pas attaquer ? Par exemple, en lui attribuant un niveau d'IA nul ([SetCreatureScriptsToSet(object, int)]) puis en lui redonnant sont IA par défaut une fois le combat terminé (cela dit, y a peut-être plus simple).

Sinon, par pure curiosité, pourquoi faut-il attribuer TRUE à "UsesPersonnalReputations" ?
Il avait été mis sur TRUE pour permettre au PNJ, et à lui seul, de me considérer comme un ennemi potentiel sans changer son alignement. Tu t'y connais dans la définition des réputations ?

@Deyonara: le cript, je le mets ou?

Edit: il n'y aurait pas un moyen de faire changer la faction du PNJ pour une faction spéciale en cours de dialogue de manière à ce qu'il passe en hostile uniquement envers le pj ?
Normalement tu le mets à la place de l'autre, celui qui fait que le PNJ devient hostile envers toi.

Sinon, transférer un PNJ dans une faction personnalisée nécessite qu'un membre de cette faction soit présent en jeu (idéalement, on place un PNJ ou un plaçable de repère dans une zone intérieure inaccessible, et on lui attribue un tag unique qu'on peut retrouver facilement).
Mon souci c'est que les compagnons n'attaquent plus du tout toutes les autres créatures hostiles et ce quelle que soit la zone !!!
Ils les considèrent comme neutre voire amicale.
Je vais essayer de faire un pnj comme tu l'indiques, je verrais bien ce que ça peut donner, meerci de ton aide
Nope, je n'ai pas eu le temps, en crash de sauvegarde m'a fait perdre une bonne partie de mon travail, mais je te tiens au courant

Après teste, le pnj semble frapper un peu mais s'arrète assez rapidement, j'ai aussi l'icone dialogue qui reste lorsque je passe le curseur sur lui. Je suis en personal reputation à FALSE.
Double post, en parcourant le net je suis tombé par hasard sur un script faisant à peu près ce qu'il me fallait (il a été fait par un certain "Dakeyras").

Je l'ai modifié (tout seul comme un grand) pour qu'il puisse altérer la réputation du PJ par rapport à un PNJ bien particulier et pas forcément le PNJ avec qui l'on discute (attention, ça altère la réputation pour toute la faction et pas seulement le PNJ).

Voici le script:

Code PHP:

//Script Dakeyras
//modif Lyendhal
void main(string sTagint nChange

object oNPC GetObjectByTagsTag );
int nRep GetReputation(oNPCGetPCSpeaker()); 
 
 
   
AdjustReputation (GetPCSpeaker(), oNPCnChange); 
 
   
nRep GetReputationoNPCGetPCSpeaker()); 
 

Je remonte un vieux post car je suis toujours bloqué par mon PJ qui doit suivre un pnj, j'ai entendu parler de la commande CutsceneDominatedEffect à utiliser sur le PJ en cours de conversation, mais je suis bien incapable de savoir comment m'en servir
Jusqu'ici, j'utilisais ce système, mais ce que je voudrais c'est que le joueur ne contrôle pas le PJ, ce serait pour une cutscene. Il faudrait qu'il se dirige tout seul.
Dans ce cas, à chaque fois que tu fais bouger le PNJ, tu fais bouger le PJ avec un délai par exemple :

AssignCommand(oNPC, ActionMoveToLocation(lNextWP));
DelayCommand(2.0f, AssignCommand(oPC, ActionMoveToLocation(lNextWP)));

Le PJ suit avec un écart de 2 secondes.
J'utilise ce script pour faire bouger mon pnj :

Code PHP:

#include "ginc_param_const"
void main(string sNPCstring sWP1string sWP2int nRun)
{
    
object oNPC GetTarget(sNPC);
    
object oWP1 GetObjectByTag(sWP1);
    
object oWP2 GetObjectByTag(sWP2);
    
/*If need more waypoints put them here and also list
    them in void main line.
    
    An AssignCommand line for each waypoint to move to.
    Each AssignCommand will complete before the next one
    starts*/
    
AssignCommand(oNPCActionMoveToObject(oWP1nRun));
    
AssignCommand(oNPCActionMoveToObject(oWP2nRun));

J'ajoute les 2 lignes avant chaque " AssignCommand(oNPC, ActionMoveToObject(oWP1, nRun));" ?
Je dirais plutôt juste après chaque ligne, j'augmenterais aussi le délai pour la deuxième commande au PJ de façon à lui laisser le temps de donner l'impression d'aller d'abord vers le premier point. Par exemple 4 à 6 secondes pour le deuxième délai, en fonction du chemin que tu lui fais parcourir.
J'obtiens un message d'erreur en face des lignes DelayCommand, de type : Declaration does not match parameter.

Voici mon script modifié:
Code PHP:

#include "ginc_param_const"
void main(string sNPCstring sWP1string sWP2int nRun)
{
    
object oNPC GetTarget(sNPC);
    
object oWP1 GetObjectByTag(sWP1);
    
object oWP2 GetObjectByTag(sWP2);
    
/*If need more waypoints put them here and also list
    them in void main line.
    
    An AssignCommand line for each waypoint to move to.
    Each AssignCommand will complete before the next one
    starts*/
    
AssignCommand(oNPCActionMoveToObject(oWP1nRun));
    
DelayCommand(2.0fAssignCommand(oPCActionMoveToLocation(oWP1nRun)));
    
AssignCommand(oNPCActionMoveToObject(oWP2nRun));
    
DelayCommand(2.0fAssignCommand(oPCActionMoveToLocation(oWP2nRun)));

Comment puis-je le déclarer, j'ai essayé de modifier comme suit :

Code PHP:

#include "ginc_param_const"
void main(string sNPCstring sPCstring sWP1string sWP2int nRun)
{
    
object oNPC GetTarget(sNPC);
    
object oPC GetTarget(sPC);
    
object oWP1 GetObjectByTag(sWP1);
    
object oWP2 GetObjectByTag(sWP2); 
mais j'obtiens toujours une erreur "Declaration does not match parameter"
Ok, voici mon script (il compile sans problème):

Code PHP:

#include "ginc_param_const"
void main(string sNPCstring sPCstring sWP1string sWP2int nRun)
{
    
object oNPC GetTarget(sNPC);
    
object oPC GetTarget(sPC);
    
object oWP1 GetObjectByTag(sWP1);
    
object oWP2 GetObjectByTag(sWP2);
    
/*If need more waypoints put them here and also list
    them in void main line.
    
    An AssignCommand line for each waypoint to move to.
    Each AssignCommand will complete before the next one
    starts*/
    
AssignCommand(oNPCActionMoveToObject(oWP1nRun));
    
DelayCommand(2.0fAssignCommand(oPCActionMoveToObject(oWP1nRun)));
    
AssignCommand(oNPCActionMoveToObject(oWP2nRun));
    
DelayCommand(2.0fAssignCommand(oPCActionMoveToObject(oWP2nRun)));

Nouveau problème, vu que je l'utilise dans une conversation, il me demande un tag pour mon PJ et si je laisse vide, le PJ ne suit pas le pnj.
Répondre

Connectés sur ce fil

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