Faires asseoir un PNJ et reste assis

Répondre
Partager Rechercher
je voudrais faire asseoir un pnj, grace au sommaire des scrypt j'ai trouvé un sujet dessus mais un peu brouillont pour moi j'en ai deduis ce scrypt que je met dans le Onspawn du pnj, mais quand on parle au pnj il se leve

Code PHP:

void main()
{

      
object oChair GetObjectByTag ("trone1") ;

     
AssignCommand(OBJECT_SELFActionSit(GetObjectByTag("trone1")));

    
object oChaise GetNearestObject(OBJECT_TYPE_PLACEABLE,OBJECT_SELF);
    
string sChaise=GetTag(oChaise);
    
ActionSit(GetNearestObjectByTag(sChaise));



pourquoi?
OU tu veux, la : il n'y a pas d'appel de retour d'evenement.


Pourquoi un PnJ se lève quand on lui parle ? parceque c'est HardCoded (et parcequ'il ne peut pas faire 2 choses en même temps). SOlution : tu lui met ce script dans la fin de dialogue : il se rassira apres avoir parle.
Place le script suivant sur le OnSpawn du PNJ :

Code PHP:

#include "NW_I0_GENERIC"

void main()

{

     
object oChaise;

     
int nChaise 1;

     
oChaise GetNearestObjectByTag("Chair"OBJECT_SELFnChaise);

     
ClearAllActions();

     
ActionSit (oChaise);


et ensuite tu places celui-ci dans l'onglet action conséquente d'une conversation (sur la dernière phrase que dit le PNJ) :

Code PHP:

void main()
{
int nChair 1;
object oChair GetNearestObjectByTag("Chair"OBJECT_SELFnChair);
while (
GetIsObjectValid(GetSittingCreature(oChair)))
{
oChair GetNearestObjectByTag("Chair"OBJECT_SELFnChair);
nChair++;
}
DelayCommand(3.0ActionSit(oChair));

Cela aura pour conséquence de faire assoir le PNJ lorsque le module se lance, puis de le faire se lever lorsque le PJ lui adresse la parole (ce qui est plus poli n'est-ce pas ? ) et enfin, lorsque la conversation est terminée de le faire se rassoir.

Is it clear gentlemen ?

Edit : Grilled par eM !
Moi je me souviens quand j'étais allé sur le Bouchon Lyonnais, j'étais resté 15 minutes à parler à des PNJ assis sur une chaise parce que je ne comprenais pas pourquoi ils ne se levaient pas. Ils auraient trouvé une autre solution eux ?
Et bien je ne sais pas trop : a part en modifiant les animations du PnJ, ou bien en creant des modeles 3D de PnJ+chaise, je suis pas sur que tu puisse empecher le "levage".

Apres, peut etre que si tu met le ActionSit() directement sur le OnConversation, il se lance assez vite pour donner l'illusion qu'il ne s'est pas levé, mais j'en doute.

Parcequ'un PnJ qui ne possede pas de script de OnConversation va se lever quand même, donc ce n'est pas le fait de lancer le dialogue qui le lève, mais juste le lancement de l'evenement. (sinon, il aurait suffit d'affecter le dialogue au Pj, et pas au PnJ.)

Mais le pb, c'est que le bouchon Lyonnais n'as pas de hakpak, je crois...
j'ai bien compris votre réponse, mais je souhaité qu'il reste assis pendant la conversation donc en plus de mettre un scrypt dans Onconversation et non pas dans une des branche de conversation


avec un truc du genre( mais suis tres mauvais scrypteur)

Code PHP:

    if(GetCommandable(OBJECT_SELF)){
    {
        
BeginConversation();
        } 
et a la suite mettre

Code PHP:


     object oChaise
;

     
int nChaise 1;

     
oChaise GetNearestObjectByTag("Chair"OBJECT_SELFnChaise);

     
ClearAllActions();

     
ActionSit (oChaise); 

enfin un truc moins mauvais que ca
Bon voila ca a l'air de marcher enfin chez moi

Code PHP:

void main()
{

     if(
GetCommandable(OBJECT_SELF)){
    {
        
BeginConversation();
        }

  
object oChaise;

     
int nChaise 1;

     
oChaise GetNearestObjectByTag("tag de la chaise"OBJECT_SELFnChaise);

     
ClearAllActions();

     
ActionSit (oChaise);
       }


si quelqu'un peux me dire si ca va comme scrypt? merci a tous pour votre aide et idée
Code PHP:

//:://////////////////////////////////////////////////
//:: NW_C2_DEFAULT4
/*
  Default OnConversation event handler for NPCs.

 */
//:://////////////////////////////////////////////////
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/22/2002
//:://////////////////////////////////////////////////

#include "nw_i0_generic"

void ActionBeginConversation(object oObjectToConverseWithstring sDialogResRef="")
{
    
BeginConversationsDialogResRefoObjectToConverseWith);
}

void main()
{
    
// * if petrified, jump out
    
if (GetHasEffect(EFFECT_TYPE_PETRIFYOBJECT_SELF) == TRUE)
    {
        return;
    }

    
// * If dead, exit directly.
    
if (GetIsDead(OBJECT_SELF) == TRUE)
    {
        return;
    }

    
// See if what we just 'heard' matches any of our
    // predefined patterns
    
int nMatch GetListenPatternNumber();
    
object oShouter GetLastSpeaker();
    
object oSelf OBJECT_SELF;

    if (
nMatch == -1)
    {
        
// Not a match -- start an ordinary conversation
        
if (GetCommandable(OBJECT_SELF))
        {
            if (
GetCurrentActionoSelf) != ACTION_SIT)
                
ClearActions(CLEAR_NW_C2_DEFAULT4_29);
            
AssignCommandoShouterActionBeginConversationoSelf));
        }
    }
    
// Respond to shouts from friendly non-PCs only
    
else if (GetIsObjectValid(oShouter)
               && !
GetIsPC(oShouter)
               && 
GetIsFriend(oShouter))
    {
        
object oIntruder OBJECT_INVALID;
        
// Determine the intruder if any
        
if(nMatch == 4)
        {
            
oIntruder GetLocalObject(oShouter"NW_BLOCKER_INTRUDER");
        }
        else if (
nMatch == 5)
        {
            
oIntruder GetLastHostileActor(oShouter);
            if(!
GetIsObjectValid(oIntruder))
            {
                
oIntruder GetAttemptedAttackTarget();
                if(!
GetIsObjectValid(oIntruder))
                {
                    
oIntruder GetAttemptedSpellTarget();
                    if(!
GetIsObjectValid(oIntruder))
                    {
                        
oIntruder OBJECT_INVALID;
                    }
                }
            }
        }

        
// Actually respond to the shout
        
RespondToShout(oShouternMatchoIntruder);
    }

    
// Send the user-defined event if appropriate
    
if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT))
    {
        
SignalEvent(OBJECT_SELFEventUserDefined(EVENT_DIALOGUE));
    }

Modification du script de conversation:
Si le PNJ fait l'action d'être assis, pô de ClearActions-Debug-Bioware-Action-Stop-Station-Touch
En plus c'est le PJ qui fait l'action de dialoguer.
Donc double sécurité

Testé et approuvé
J'aimais bien ta solution eM.

Citation :
Provient du message de eMRaistlin
Parcequ'un PnJ qui ne possede pas de script de OnConversation va se lever quand même
Mais seulement parce que le moteur lance la conversation par défaut dans ce cas. Paradoxalement il faut un script pour empêcher qu'une conversation ait lieu.
alors voilà

sur l'Onspawn:
Code:
ActionSit(GetNearestObjectByTag("Chair"));
sur le OnConversation définir cette fonction (en dehors du main):
Code:
void VoidBeginConv(string sConv,object oDialWith)
{
    BeginConversation(sConv, oDialWith);
}
et dans le main:
Code:
    if (nMatch == -1)
    {
        // Not a match -- start an ordinary conversation
        if (GetCommandable(OBJECT_SELF))
        {
            object oSelf = OBJECT_SELF;
            AssignCommand(oShouter,VoidBeginConv("sittalk",oSelf));            
        }
    }
NB: "sittalk" doit être la ResRef de ta conversation.
et "Chair" le tag de ta chaise.
tout ceci est compatible avec les scripts par défaut de Bio, il suffit de coller dedans ( de remplacer en fait pour la dernière partie)
Pour ce qui est de ton script il est fonctionnel, mais un peu bordélique raistlin, et pas seulement à cause de l'indentation . Pourquoi déclarer les variables au milieu du script? Pourquoi une partie du code est elle dans le if et l'autre en dehors?
Citation :
En tant qu'habitué des absences prolongées je te souhaite bon retour
Euh..... il a pas parlé de retour il a parlé que ca fesait des mois qu'il était plus venus. Nuance

Alors Skanzo ? retour juste ce soir ou définitiviement ?

(PS : euh... nan aim c'est pas la peine je vais dodoter la )
Citation :
Provient du message de Sire Pom-pom
J'aimais bien ta solution eM.


Pour ce qui est de ton script il est fonctionnel, mais un peu bordélique raistlin, et pas seulement à cause de l'indentation . Pourquoi déclarer les variables au milieu du script? Pourquoi une partie du code est elle dans le if et l'autre en dehors?

bien peux tu me montrer comment mon scrypt ( qui marche bien ) aurais dut être fait (pour que je puisse apprendre a pécher de plus gros poisson pour me nourrir mieux)


sinon pourquoi le scrypt de Skanzo qui est beaucoup plus long et fait par un pro et mieux que celui que j'ai fait avec juste quelque ligne ??
Pour le script de Skanzo il est plus long parce qu'il contient tout le script par défaut de Bio. Il est d'ailleurs plus général que ce que je proposais personnellement de ce fait:
if(GetCurrentAction( oSelf) != ACTION_SIT )
Par contre il déclare ses variables n'importe où lui aussi, grr .


En s'inspirant du script de Skanzo, mais en faisant se rasseoir le PNJ au lieu d'empêcher qu'il se lève on obtiendrait :
Code:
    if (nMatch == -1)
    {

        // Not a match -- start an ordinary conversation

        if (GetCommandable(OBJECT_SELF))
        {          
            
            if (GetCurrentAction( OBJECT_SELF) == ACTION_SIT)
            {
                BeginConversation();
                ActionSit (GetNearestObjectByTag("tag de la chaise"));
            }
            else
            {
                ClearActions(CLEAR_NW_C2_DEFAULT4_29);
                BeginConversation();
            }        
        }
    }
Tu dois substituer ce code à la partie équivalente - le if(nMatch == -1) - dans le code de Bioware.


Comme tu vois tout le code que tu avais écrit (ou équivalent) se retrouve dans le if(GetCommandable... car d'un point de vue logique c'est sa place .

Conseil à propos des variables:
1)toujours les déclarer en tête de bloc ou de fonction (i.e. juste après un "{" ).
2) Les déclarer le plus tard possible (après le premier { en "remontant" le code ).
Pourquoi? 1) on sait toujours ou les trouver 2) Le code n'est pas obscurci par des variables qui sont vivantes à un endroit alors qu'elles n'y ont aucune pertinence.

PS: Skanzo, je ne savais pas que ça marchait le "" dans BeginConversation quand le NPC était l'"objet" de la conversation et pas son sujet. Merci pour le tuyau.
Pourquoi je comprends que dalle
__________________
Citation :
STOP RIGHT NOW. You are using LOGIC and FACTS on these forums, and WE WILL NOT TOLERATE IT. Come back when you've learned to distort the truth and make up wild analogies in order to win arguments!
Code PHP:

void main()
{
    if(
GetCommandable(OBJECT_SELF)){
    {
        
BeginConversation();
        }
    
ClearAllActions();
    
int nChair 1;
    
object oChair;
    
oChair GetNearestObjectByTag("Chair"OBJECT_SELFnChair);
    
ActionSit(oChair);
    }

Script trouvé sur NWN-FR.com. Pour info il marche très bien et permet de parler avec un pnj alors que ce dernier reste assit.
Répondre

Connectés sur ce fil

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