[Script] Faire s'asseoir un perso

Répondre
Partager Rechercher
Script proposé par Eliossar :

Bon alors je ne sais pas si le post du script d' Elmo pour s'assoir marche ms j'en ai fait un autre. Mais cette fois ci qui est dans les propriétés de la chaise.
Mettre useable pour la chaise
ensuite dans OnUsed mettre


Code PHP:

void main()
{
    
object chaise;
    
//le tag de la chaise
    
chaise GetObjectByTag("tagdelachaise");
    
    
//fait agir l'object le plus proche de la chaise cad le joueur
    //l'action est de s'assoir
    
AssignCommand(GetNearestObject(OBJECT_TYPE_CREATURE,chaise,1),ActionSit(chaise));

    
//cette partie permet juste de faire le test
    //pour savoir si l'object est bien trouve
    //s'il ne l'ai pas alors le jeu quitte dans ce cas
    
if (chaise == OBJECT_INVALID)
    {
        
EndGame("End");
    }



Donc ce script permet de faire s'assoir n'importe quel joueur.
Ne pas mettre un objet trop pret de la/des chaise(s) pour pas géner le joueur pour s'assoir et surtout pour ne pas que avoir de conflit lors de la détection de l'objet le plus proche. Il faut que le joueur soit le plus proche objet de la chaise pour que ça marche sinon je pense que ça marchera pas.

__________________
Posté par talendil
Salut,
sympa ton script, Eliossar !
Mais y'a un truc qi m'échappe
Je ne comprends pas pourquoi tu utilises la constante OBJECT_TYPE_ALL plutôt que OBJECT_TYPE_CREATURE dans cette partie du code :
Code PHP:

AssignCommand(GetNearestObject(OBJECT_TYPE_ALL,chaise,1),ActionSit(chaise)); 


A mon avis, ça éviterait le conflit dont tu parles avec un autre objet trop proche, non ?
posté par Majca
je dirais même plus !

Tu devrais utiliser ceci:

Code PHP:

GetNearestCreature (CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_IS_PC ); 

=> la chaise cherchera le joueur le plus proche


pour un pnj:
Code PHP:

GetNearestCreature(CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_NOT_PC); 


Majca
posté par ZeDuckMaster
dans le genre :
script pour qu'un joueur s'asseye sur un objet lorsqu'il clique dessus .....

Code PHP:

void main()
{
    
object oChair OBJECT_SELF;
    
AssignCommand(GetLastUsedBy(),ActionSit(oChair));

le script est bien evidemment a placer dans le OnUsed

-> pas de tags predefinis, donc peut etre appliqué a n'importe quel objet tel quel sous la forme d'un seul script unique (quoique s'asseoir sur une table ou sur une armoire ca fait pas top top )


remarque : le fait de créer un objet temporaire (oChair) semble etre necessaire puisque la fonction AssignCommand prend un object en parametre et que la constante OBJECT_SELF seule ne marche pas (c'est un int je penses ...), le compilateur doit alors la transformer en objet valide dans le cas d'un assignement.
et pour que le pnj s'assoie parterre ? et non sur une chaise, c'est quoi le script ? ( de maniere a ce que apres un dialogue, il se remet parterre et ne reste pas debout )
pour faire s'asseoir une créature par terre, utilise ceci :

Code PHP:

void main()
{
int nAnimation ANIMATION_LOOPING_SIT_CROSS;
float fSpeed 1.0;

ActionPlayAnimation(nAnimationfSpeed,X.X); // ou X.X correspond a la duree en seconde.

Sachant que si tu veux que ton pnj reste assis par terre tout le temps, il faudra que la durée dépasse 6 secondes (c'est le temps d'une animation normale). A placer sur le OnHeartbeat donc.

Sinon, tu as la possibilité de faire un AssignCommand sur l'évenement OnEnter de l'area ou sont les créatures qui doivent s'asseoir (voir meme sur le OnHeartbeat de l'area si tu as beaucoup de creatures à faire asseoir).

Code PHP:

void main()
{
int nAnimation ANIMATION_LOOPING_SIT_CROSS;
float fSpeed 1.0;
oTarget GetObjectByTag("tag de la creature qui doit s'asseoir");

AssignCommand(oTargetActionPlayAnimation(nAnimationfSpeed,X.X)); // ou X.X correspond a la duree en seconde.


Dans ce cas, je te conseil de mettre une forte valeur pour la durée de l'animation (genre 600.0 secondes).
Lightbulb
Sûrement déjà vu...
Hi!


Note... Après plusieurs tests, je me suis rendu compte d'une chose élémentaire (tardivement je sais, mais je suis le nb de Langue-Laid)!


Les Animations des Créatures sont divisées en 2 Catégories :

- LOOPING (boucle ? continu ?)
- FIREFORGET (feu de paille ? bref ?)

Quoi qu'il en soit, il m'est apparu que les Animations de type LOOPING ne se répétaient pas à proprement parlé, mais se prolongeaient... à condition de prolonger la Durée... C le cas de SIT_CROSS par exemple (CF. Script de Shadoh)...


Tout ça pour en venir où ? et ben la conclusion qui a suivi, et de façon effective (j'ai éprouvé), c que ce type de fonction n'a pas besoin d'être placé dans le OnHeartbeat mais peut tout à fait fonctionner dans le OnSpawn... et ce même s'il l'on veut que ça dure... suffit juste de mettre une Durée suffisante (genre 600 sec)!

Mais si on parle au PNJ assis me diriez-vous ? et bien il suffit juste de rajouter le même Script de SIT_CROSS dans l'Action conséquente de la phrase d'entrée du PNJ ([PROPRIETAIRE]Bonjour!)... et veiller aussi à le mettre dans les emplacements prévus de "Scripts de fin dialogue" de l'onglet Fichier actuel (2.Normales & Abandon)... tout ça pour qu'il reste assis de bout en bout...

Mais j'imagine, comme vous me le diriez par ailleurs, qu'il peut y avoir d'autres types de prob (comme le fait que le PNJ soit attaqué et ne reprenne plus sa place), mais il suffit d'aviser... et puis le PNJ n'est pas toujours obligé de rester assis, selon...


Pour finir... tirant parti de ce constat, je me suis demandé comment remédier au prob des PNJs qui ne peuvent rester assis sur les Chaises quand on leur parle... je ne sais pas si on a déjà présenté la solution par ici (certainement j'imagine... j'ai beaucoup d'imagination oui...), mais je me suis personnellement rendu compte que l'Action ne peut être pérennisée de la même façon que les Animations... Du moins ça n'est pas élémentaire...

Il y a bien des questions que je me pose encore (comme "comment faire durer une Action ?" & "Comment appliquer SIT_CHAIR sur une Chair justement ??")... mais quoi qu'il en soit, j'ai trouvé là aussi une alternative à ce prob épineux...

J'ai donc, après divers essais et tests fructueux, réalisé que le prob semblait se situer dans le OnPerception... Script faisant réagir le PNJ à contre-sens de nos intentions d'immobilisme (Totalitarisme quand tu nous tient!)... aussi, dans le cadre de mes PNJs Assis sur Chaise, je me suis tout simplement contenté de supprimer le Script de base du OnPerception (est-ce mal ? sinon on peut faire des modifs avisées dessus ??)... et pour le reste j'ai fait la même chose que pour SIT_CROSS (OnSpawn& Rajouts dans les Fins de Conversation), mais avec l'Action ActionSit...)!!
Code PHP:

void main()
{
    
object oChair GetObjectByTag ("Chair1") ;
    
ActionSit(oChair) ;

ET CA MARCHE!!! couché Médor!


Voilà, voilà...



... Voilà, de longue explications pour ne pas balancer les choses gratuitement... et pour signifier aussi aux nbs comme moi comment l'exploration élémentaire peut apporter ses lumières...

et voila une auter moule du sript , mais j'ai rien pigé a vos modif ... alors qje ux assoir un pnj sur une chaise... c'et pas bon ca ?
Code PHP:


void main
()
{
    
object chaise;
    
//le tag de la chaise
    
chaise GetObjectByTag("tagdelachaise");
    
    
//fait agir l'object le plus proche de la chaise cad le joueur
    //l'action est de s'assoir
    
AssignCommand(GetNearestCreature(CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_NOT_PC);

    
//cette partie permet juste de faire le test
    //pour savoir si l'object est bien trouve
    //s'il ne l'ai pas alors le jeu quitte dans ce cas
    
if (chaise == OBJECT_INVALID)
    {
        
EndGame("End");
    }

il y a celui la aussi a mettre dans le OnUsed de la chaise :
Code PHP:

void main() 

  
object oChair OBJECT_SELF
  if(!
GetIsObjectValid(GetSittingCreature(oChair))) 
  { 
    
AssignCommand(GetLastUsedBy(), ActionSit(oChair)); 
  } 

Citation :
Provient du message de coolstar
Mais à quoi sert donc ANIMATION_LOOPING_SIT_CHAIR???
Pour les jeux du cirque peut être . Une chaise, un artiste et hop des looping

Non ? j'ai faux ?
Heeuuu... Il se lève tout seul parce que par défaut le ClearAllActions du 'OnConversation' annule l'Ordre de s'Asseoir... Il faut donc y rajouter ceci (en plus de l'équivalence dans le 'OnSpawn' pour l'asseoir... oui oui, le 'OnSpawn', sachant que le 'OnHeartBeat' apparaît bien inutile là!)...
Code PHP:

    AssignCommand(OBJECT_SELFActionSit(GetObjectByTag("throneevil"))); 

Et ne pas oublier surtout de retirer les Scripts par défaut qui se trouvent dans Fichier actuel/2.Normales &
Fichier actuel/Abandon... sinon ça fait encore lever le NPC à la Fin de la Conversation...
Heu tu pourrai meiu expliquer ??
La ligne que tu rajoute tu la rajoute ou ici :
Code PHP:

//::///////////////////////////////////////////////
//:: SetListeningPatterns
//:: NW_C2_DEFAULT4
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Determines the course of action to be taken
    by the generic script after dialogue or a
    shout is initiated.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Oct 24, 2001
//:://////////////////////////////////////////////

#include "NW_I0_GENERIC"

void main()
{
    
int nMatch GetListenPatternNumber();
    
object oShouter GetLastSpeaker();
    
object oIntruder;

    if (
nMatch == -&& GetCommandable(OBJECT_SELF))
    {
        
ClearAllActions();
        
BeginConversation();
    }
    else
    if(
nMatch != -&& GetIsObjectValid(oShouter) && !GetIsPC(oShouter) && GetIsFriend(oShouter))
    {
        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;
                    }
                }
            }
        }
        
RespondToShout(oShouternMatchoIntruder);
    }


    if(
GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT))
    {
        
SignalEvent(OBJECT_SELFEventUserDefined(1004));
    }


Citation :
Et ne pas oublier surtout de retirer les Scripts par défaut qui se trouvent dans Fichier actuel/2.Normales &
Fichier actuel/Abandon... sinon ça fait encore lever le NPC à la Fin de la Conversation...
C'est a dire sa se trouve ou ca ??

Merci
Smile
Citation :
Publié par kerigan
pour faire s'asseoir une créature par terre
C'est exactement ce que je cherchais; merci.
Je sais le post date, mais mon ethique m'obligeait à remercier Kerigan pour ce script qui va m'être d'une grande utilité.
Merci
Salut, j'ai ajouté la ligne AssignCommand(OBJECT_SELF, ActionSit(GetObjectByTag("tagdelachaise"))); au script.

Voilà ce que j'obtiens:

Code PHP:

//::///////////////////////////////////////////////
//:: SetListeningPatterns
//:: NW_C2_DEFAULT4
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Determines the course of action to be taken
    by the generic script after dialogue or a
    shout is initiated.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Oct 24, 2001
//:://////////////////////////////////////////////

#include "NW_I0_GENERIC"

void main()
{
    
int nMatch GetListenPatternNumber();
    
object oShouter GetLastSpeaker();
    
object oIntruder;

    if (
nMatch == -&& GetCommandable(OBJECT_SELF))
    {
        
ClearAllActions();
        
BeginConversation();
        
AssignCommand(OBJECT_SELFActionSit(GetObjectByTag("tagdelachaise")));
    }
    else
    if(
nMatch != -&& GetIsObjectValid(oShouter) && !GetIsPC(oShouter) && GetIsFriend(oShouter))
    {
        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;
                    }
                }
            }
        }
        
RespondToShout(oShouternMatchoIntruder);
    }


    if(
GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT))
    {
        
SignalEvent(OBJECT_SELFEventUserDefined(1004));
    }

Lorsque je parle au pnj il reste assis mais le problème c'est qu'il pivote sur ça chaise pour être face à moi, pendant le dialogue et même quand j'ai finis de lui parler il continu à se tenir face à moi comme le montre ce screenshot.
Si quelqu'un connait une commande pour que le PNJ reste dans la même position avant, pendant et après la conversation se serait sympa merci beaucoup .
Répondre

Connectés sur ce fil

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