Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Comment faire parler un cadavre ?

Par Cassin le 16/7/2002 à 15:09:04 (#1813487)

Dans mon module j'ai placé un "Plague Victim Corpse" sur un lit pour figurer quelqu'un de malade, et j'aimerais assigner à cet "objet" une conversation.

Je suppose que le script est à mettre dans le OnUse de l'objet (après l'avoir rendu Useable).

Reste maintenant le problème du script lui-même (membre de la Quiche Ltd inside ;) )...

En jetant un oeil dans les fonctions j'en entrevois deux qui pourraient convenir : BeginConversation et ActionStartConversation.

Bon, vous allez dire que je n'ai qu'à tester les deux pour savoir laquelle marche, mais ensuite il me faut donc déclarer les variables et là ça coince toujours... :doute:

Pour BeginConversation on a

int BeginConversation(string sResRef=", object oObjectToDialog=OBJECT_INVALID)

et pour ActionStartConversation on a
void ActionStartConversation(object oObjectToConverseWith, string sDialogResRef=", int bPrivateConversation=FALSE)


Que dois-je déclarer ? Et comment ?

(merci de ne pas me donner de réponse toute faite, ce n'est pas en regardant forger qu'on devient forgeron ;) )

Par Grunk le 16/7/2002 à 15:20:10 (#1813517)

BeginConversation (nomdelaconversation,oPC);

le nom de la conversation c est le nom du fichier sous lequel tu l as sauvegardé sans le .extension
le oPC correspond a l objet defini par le joueur qui va parler a ton cadavre, a toi de voire comment le recuperer.

Par Cassin le 16/7/2002 à 15:45:08 (#1813650)

J'ai fait ça :


void main()
{
object oPC=GetLastSpeaker();
BeginConversation ("darren",oPC);
}


mais il ne se passe rien lorsque je clique sur le corps. Le script se compile et je n'ai aucun message d'erreur.

Alors, est-ce que je me suis trompé en déclarant oPC, ou bien ce script n'est pas à mettre dans le OnUsed de l'objet ? :doute:

(ou alors j'ai fais une autre erreur quichière ? :D)

Par Gargantuel le 16/7/2002 à 15:51:15 (#1813691)

object oPC=GetLastSpeaker();

Ca n'est pas la bonne fonction a lancer.
Tu es sur un onused donc tu dois utiliser la fonction qui permet de récuperer l'utilisateur de l'objet en cours.

A savoir : GetLastUsedBy()

Ceci dit, je ne sais pas si on peut faire parler un cadavre...
Tiens nous au courant :)

Par mobidique le 16/7/2002 à 15:55:02 (#1813717)

J'vais peut être dire un truc con là .... Si l'effet sleep a pour conséquence de coucher un NPC, pourquoi ne pas appliquer un effet sleep à un NPC et faire ton dialogue normalement ? J'ai cru comprendre qu'il y avait une distinction entre un effet et une variable d'état, c'est à dire qu'un effet peut être appliqué à un objet sans que ses variables d'état soient modifiés comme lorsque par exemple on fait ouvrir une TrapDoor sans pour autant modifier la variable déclarant la TrapDoor ouverte ou fermée.

J'ai dit une connerie ayez ?

Mob'.

Par Grunk le 16/7/2002 à 15:55:07 (#1813719)

bah on peut bien faire parler une porte (cf chapitre 1, prison porte principale, module officiel nwn), un brazier (cf chap 2 ou 3) une fontaine (cf chap 3 pour le word of power dans la cite construite par les lezards.....les creator je crois ou truc du style) alors pourquoi pas un cadavre....

Par Amaranthe le 16/7/2002 à 15:56:43 (#1813729)

J'aurai tendance a dire que la réponse est contenue dans la question ;)

Regarde l'initialisation de ton oPC... GetLastSpeaker() soit le dernier a avoir... ?

Est ce bien ce Pc la que tu veux récupérer ?


Amaranthe.

P.S. J'apprecie bcp la facon dont tu demandes de l'aide. Cf la leçon numéro Six pour les quiches, sortie ce jour ;)

Par Cassin le 16/7/2002 à 15:59:54 (#1813754)

En remplaçant GetLastSpeaker par GetLastUsedBy j'obtiens un message d'erreur à la compilation : ERROR: PARSING VARIABLE LIST.

En outre dans l'help c'est indiqué que

Returns OBJECT_INVALID if it is called by something other than a placeable or a door.


Qu'est-ce que ça veut dire, "si l'objet est appelé par autre chose qu'un placeable ou une porte" ? L'objet peut être appelé par un PJ, OK, ou par un PNJ, mais par quoi d'autre ? :doute:


Argh, je nage, c'est pas encore demain la veille où je donnerais ma démission du Club des Quiches ! :mdr:



EDIT : Houlà, y'a eu pas mal de réponses pendant que je testais ! ;)
- Oui, j'ai justement essayé de reprendre le script de la porte qui parle du chapter2 (je ne savais pas pour le reste, j'en suis pas encore là ! :D), mais ça ne marche pas... :(
- Je ne peux pas non plus faire coucher un NPC, vu que le lit n'est pas lui-même un placeable, il fait partit du tileset CityInterior, j'ai fait une "Barracks Room" (ou un truc du genre), avec des lits superposés, mais ils ne sont pas sélectionnables, donc on ne peux pas les rendre useable... :(

Par mobidique le 16/7/2002 à 16:11:32 (#1813824)

Provient du message de Cassin
j'ai fait une "Barracks Room" (ou un truc du genre), avec des lits superposés, mais ils ne sont pas sélectionnables, donc on ne peux pas les rendre useable... :(


Et tu as pu quand même poser ton plague victim sur un lit :doute: Enfin peu importe ... perso je suis pour les solutions simples rapide et de bon gout. Dans l'hypothèse ou ma suggestion est réalisable, de 1°) il y a au bout des barracks un pièce qui peut fort bien servir d'infirmerie ou de lieu de quarantaine pour un malade et de 2°) entre faire un script compliqué et faire un dortoir à la main mon choix est fait, je vote pour le dortoir avec des lits useable pour dormir dessus et d'ailleurs c'est ce que j'ai fait au bout du compte ... l'interieur barracks n'ayant pas des portes coïncidant avec le tile barracks du tile rural :eek:

M'enfin d'un autre coté c'est sûr que tu vas apprendre kkchose à vouloir le faire comme ça, c'est sûr ...

Mob'.

Par Gargantuel le 16/7/2002 à 16:11:36 (#1813826)

EDIT: Triple post ... c'est la fete :(

Par Gargantuel le 16/7/2002 à 16:12:30 (#1813830)

EDIT: Double post ... Ca raaaaaame !

Par Gargantuel le 16/7/2002 à 16:12:30 (#1813831)

Si tu veux etre sur que tu as bien affaire à un joueur, utilises

object oPC = GetLastUsedBy();
if (GetIsPC(oPC))
{
....
}

Comme ca tu seras sur :)

ERROR: PARSING VARIABLE LIST.

Je comprends pas ce qu'il se passe. Montre nous le source stp.

Par Adalorn le 16/7/2002 à 17:11:56 (#1814122)

je crois que
ActionStartConversation(oPlayer, "darren",TRUE), comme ça tu as une convers privée, en plus, BeginConversation ne sert pas à ça :
// Use this in an OnDialog script to start up the dialog tree.
// - sResRef: if this is not specified, the default dialog file will be used
// - oObjectToDialog: if this is not specified the person that triggered the
// event will be used
c'est pour quelqu'un à qui tu peux phisiquement parler!!!

Par Cassin le 16/7/2002 à 17:42:04 (#1814301)


Et tu as pu quand même poser ton plague victim sur un lit


Ben oui, tu le met en dessous et tu fais F5 pour rafraîchir, et hop, magique, il saute au-dessus du lit ! :D
Mais dans un sens tu as raison, je ne sais pas si le PJ pourra lui parler s'il est sur le lit du dessus, et vu qu'on pas le mettre entre deux... :doute:



l'interieur barracks n'ayant pas des portes coïncidant avec le tile barracks du tile rural


Oui, c'est très con d'ailleurs, mais bon...




citation :
ERROR: PARSING VARIABLE LIST.

Je comprends pas ce qu'il se passe. Montre nous le source stp.


Voilà ce que j'ai en tout et pour tout pour l'instant (sachant que je n'ai pas pu y bosser depuis tout à l'heure)

void main()
{
object oPC=GetlastUsedBy();
BeginConversation ("darren",oPC);
}




en plus, BeginConversation ne sert pas à ça :
// Use this in an OnDialog script to start up the dialog tree.


J'avais remarqué ça, mais je m'étais dit, "bah, si ça se trouve ça marchera quand même" :D


Bon, je bosserais dessus ce soir si j'ai le temps et je vous tiens au courant demain.

Par Adalorn le 16/7/2002 à 17:45:17 (#1814320)

si ça marche pas parcequ'il est en haut, tu fais un trigueur autour du lit, et dans OnEnter, tu place ton truck

Par Fed le 16/7/2002 à 18:02:41 (#1814408)

Ton erreur est la :

Il ne faut pas écrire GetlastUsedBy mais GetLastUsedBy

Le langage de script est sensible à la casse des charactères :)

Par Cassin le 16/7/2002 à 19:19:40 (#1814832)


Ton erreur est la :

Il ne faut pas écrire GetlastUsedBy mais GetLastUsedBy

Le langage de script est sensible à la casse des charactères


Je m'en suis aperçut en voulant le remplacer ;)



Bon, c'est imppec, ça marche ! Merci tous, encore une fois !

Voilà le script, que je vas aller mettre dans la liste des scripts qui marchent :
void main()
{
object oPC = GetLastUsedBy();
if (GetIsPC(oPC))
{
ActionStartConversation(oPC, "NomDeLaConversation",TRUE);
}
}




Et comme je m'en doutais, je peux plus parler au personnage lorsqu'il est sur le lit, il est inaccessible.
J'ai donc placé un trigger, comme suggéré (j'y avais pensé également) et placé le script sur le OnEnter, mais ça ne marchait pas, il ne se passait rien.
Après quelques tatonnements j'ai trouvé la fonction GetEnteringObject au lieu de GetLastUsedBy et ça marche.

Désolé de refaire remonter ce thread

Par BlackWings le 17/8/2002 à 11:06:25 (#1973984)


void main()
{
object chaise;
object oPC = GetLastUsedBy();

//le tag de la chaise
chaise = GetObjectByTag("TroneKlepen");

//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));

//Le trone parle seulement au PC qui s'est assis sur lui
ActionStartConversation(oPC,"cs_trone_tl",TRUE);

}


Dans le onUsed de mon trone.

Le PC ne s'asseoit plus depuis que j'ai mis:

//Le trone parle seulement au PC qui s'est assis sur lui
ActionStartConversation(oPC,"cs_trone_tl",TRUE);


Mais la conversation elle ne se déclenche pas non plus.

Dans End Conversation Script, à normal j'ai mis le script suivant:

void main()
{
object oPC = GetLastUsedBy();
AssignCommand(oPC, JumpToLocation(GetLocation(GetWaypointByTag("WpTemple" ))));

}


Une :eureka: ??

Par BlackWings le 17/8/2002 à 11:57:35 (#1974141)

Petite précision sur mon problème de banc:

Quand j'ai installer les banc à partir du blueprint. Je les ai mis un par un.

Le premier à droite de la porte et le second à gauche.

Si je souhaite m'asseoir sur celui de droite (le premier) alors il va va s'asseoir sur celui de gauche(le deuxieme posé).

Par contre si je souhaite m'asseoir sur celui de gauche, alors là, il s'asseoir sur le bon, celui de gauche.

Il semblerait donc que le getNearest fonctionne mais que le toolset considère le dernier posé comme le seul banc valable. pourtant ils sont identiques :(

Par Kemay le 17/8/2002 à 12:23:29 (#1974257)

Comme d'hab avec le toolset, il faut bidouiller. Pour que le personnage ait la discussion tout en etant assis, il faut qu'il lance la conversation, puis s'asseoie (si tu le fais dans l'autre sens, il va se relever pour le dialogue et si c'est le trône qui lance la discussion, il ne s'assied pas du tout)

void main()
{
object oChair = GetObjectByTag("TroneKlepen");
object oPC = GetLastUsedBy();

if( GetSittingCreature(oChair) == OBJECT_INVALID )
{
AssignCommand(oPC,ActionStartConversation(oChair,"cs_trone_tl",TRUE));
AssignCommand(oPC,ActionSit(oChair));
}
}


Pour le teleport, si tu utilise un Waypoint pour obtenir une localisation tu as meilleur temps d'utiliser JumpToObject que JumpToLocation :
void main()
{
AssignCommand(GetPCSpeaker(), JumpToObject(GetWaypointByTag("WpTemple")));
}

Par Kemay le 17/8/2002 à 12:33:31 (#1974293)

Quand j'ai installer les banc à partir du blueprint. Je les ai mis un par un.


Je comprends pas bien ce que tu appelles "installer à partir du blueprint".

Si je souhaite m'asseoir sur celui de droite (le premier) alors il va va s'asseoir sur celui de gauche(le deuxieme posé).

Par contre si je souhaite m'asseoir sur celui de gauche, alors là, il s'asseoir sur le bon, celui de gauche.

Il semblerait donc que le getNearest fonctionne mais que le toolset considère le dernier posé comme le seul banc valable. pourtant ils sont identiques


Il y a effectivement des problèmes avec les fonctions GetNearest... mais à priori pas dans ce genre de conditions. De toute façon, tu n'as pas besoin d'utiliser GetNearestObject pour faire s'asseoir un PJ sur un banc :
Dans l'event onUsed de tes bancs :
void main()
{
object oChair = OBJECT_SELF;
object oPC = GetLastUsedBy();
if( GetSittingCreature(oChair) == OBJECT_INVALID )
AssignCommand(oPC,ActionSit(oChair));
}

Par BlackWings le 17/8/2002 à 12:36:27 (#1974301)

Merci :merci:

Il fallait y penser :)

Par BlackWings le 17/8/2002 à 16:54:08 (#1975289)

Comme on dit: " un problème en cache souvent un autre"

Et voilà!

Mon trône lance une conversation en fonction de la classe du PC.
Si le PC est un moine il le téléporte vers une autre zone sur un Waypoint.

Le PC est alors assis sur le trône au moment de la téléportation.

Le Waypoint est en plein milieu de la zone.

Le PC y apparaît bien... seulement une demi seconde avant de réapparaître sur un mur de la même zone, position assis... mais assis sur rien.

Je peux le déplacer ensuite et il tombe du mur directement...

Mais, snif alors :( , pourquoi qu'il est sur ce mur?

j'ai tenté de lui faire un move sur un second waypoint en face du premier, histoire de le mettre debout. Rien n'y fait, il se retrouve assis comme une quiche sur le mur :sanglote:

Cà fait 2h que je cherche et je trouve toujours pas où est le problème.

Please HEELLLPP :sanglote: :sanglote: :D

Par Jedaï le 17/8/2002 à 21:22:20 (#1976383)

Attends, j'ai repéré un truc vraiment tout con : si ta source est un copier-coller, essaie de remplacer GetlastUsedBy par GetLastUsedBy

edit : oups désolé j'avais pas vu la deuxième page

Par Jedaï le 17/8/2002 à 21:28:39 (#1976409)

Peut-être que si tu le faisais lever avant de le téléporter ...

Par BlackWings le 18/8/2002 à 20:23:45 (#1980495)

C'était tout bête :D

AssignCommand(oPC,ClearAllAction());

Après ActionSit();

:D

JOL Archives 1.0.1
@ JOL / JeuxOnLine