Neverwinter Nights
Menú
Gamersmafia es ahora un archivo de solo lectura.

Cómo hacer para que pnjs sentados hablen

Messsplico, no para que inicien conversación, con eso no hay problema. El problema que tengo es q al poner pnjs sentados (con su script de sentarse en onspawn y otro en onconversation -pa q siga sentao aunk inicie conversación) la función SpeakString no hace ni gárgaras. Cosa curiosa, si están de pie sí funciona, así q imagino q el problema debe estar en el script del onspawn q hace q permanezcan sentados; la cosa es q conversación sí q inician, pero el SpeakString nop. Alguna sugerencia?

No lo se eh, pero puedes probar con ActionSpeakString.. o sino con AssignCommand… no lo he probado pero e suna posibilidad :/

A ésa función me refería al poner SpeakString, pero resumía al no poner el “Action”
Uso ambas, AssingCommand al hacer un delay a las frases, y ActionSpeakString pa q las suelte, pero no va. Gracias por contestar de todas formas.

Seguro que hay alguna manera pero asi se me ocurre a lo apaño… hacer un trigger que al pisarlo diga algo pero no se te serviria pa lo que tu quieres haser!, bueno eso iria con assign command i demas

No estoy muy seguro, pero lo que he observado es que cuando un personaje cuando está sentado, está ejecutando la acción “estar sentado”, y está queda en la cola de acciones. Así que, supongo que cuando a un personaje sentado le ordenas un ActionSpeakString, esta acción se añade a la cola para ejecutarse después de la que ya está en curso, “estar sentado”.

En resumen, que es imposible que un PNJ ejecute ActionSpeakString mientras está sentado. Lo que puedes probar es, antes de ejecutar el ActionSpeakString, vaciar la cola de acciones del personaje (para eso había una función cuyo nombre no recuerdo). Justo después de que hable, le ordenas que se siente de nuevo. Vamos, que en [i:3161cd085e]pseudocódigo[/i:3161cd085e] quedaría:

[code:1:3161cd085e]
VaciarColaAcciones();
ActionSpeakString(…);
ActionSentarse();

[/code:1:3161cd085e]

Sin ningún DelayCommand de por medio.

Al vaciar la cola, el personaje se levantará de la silla, pero como inmediatamente le mandamos hablar y luego sentarse, igual no se nota.

De todas formas, es una chapuza. Si a alguien se le ocurre algo mejor….

Un saludo.

Hombre, la polla loka. Ya ni saludamos, ¿eh? Veo que los malos modos se pegan

Coñas aparte… pues bueno, la verdad es que no hay modo de script para conseguir que un PNJ hable cuando se encuentra sentado…

… hasta que yo lo intenté…

El “trukillo” es “impedir” que el PNJ pueda levantarse al iniciar una conversación. Por ejemplo, si tenemos un PNJ en una posada, y lo situamos en una de esas mesitas con sillas redondas que hay en las esquinas, si el PJ se pone delante del camino de salida del sitio, e inicia una conversación, pues el PNJ no puede levantarse, por lo que inicia la conversación sentado.

Es una solución válida y eficaz, pero para el que no le guste… siempre puede crearse una “conversación paralela”.

“Éndecí”, crear una conversación de scripting cuando se pulse sobre el PNJ, con lo que la conversación que se ejecuta, es de otro elemento, y el PNJ sigue sentado. Que le pasa a esto, pues que el PNJ tiene la boquita cerrada en todo momento, pero al menos te mira y todo eso, por lo que para un trabajillo normal, pues keda bien.

En fin, a ver si sirve. Un saludete buzz.

Assias a todos por contestar, menos a Imris, por warra
Eso q comentáis por ahí de limpiar las acciones es ClearAllActions(); es de lo primero q usé, pero no furula, pq entonces el pnj se levanta, habla, y se vuelve a sentar, con lo que parece que tiene un buen consolador en la silla.
Ya digo q conversación, lo que es conversación normal, sí que se activa, pero cada pnj tiene la suya con el pj (una simple frase).
Lo q dices tú, warrapenca (él sabe quién es ) es lo q ya hago: al entrar en un desencadenante se activa el script de “tal pnj dice frase, delay, tal otro pnj dice frase, etc…” pero por razones misteriosas no va; ara bien, si me cargo la silla (pa forzar q se levanta) sí funciona
Pero eso q dice la warrapenca del script externo ma dao una idea (me arrepentiré de esto ): como el problema es q no hay santa forma de q a un pnj sentao le endiñes un ActionSpeakString, pues adjudicar la función a objetos invisibles justo bajo sus sillitas: al ser una simple frase no sale ni retrato ni referencia de quien lo dice, salvo por localización del texto, así q en teoría debería funcionar, ya la cosa será ajustar el objeto invisible colocándolo bien.
Ya os diré!

[quote:02b257dfcf]al ser una simple frase no sale ni retrato ni referencia de quien lo dice[/quote:02b257dfcf]

Eso es condicional Si quieres que salga un careto y un nombre y tal, pues añade una frase… y una respuesta (estilo Fin Diálogo), para que salga la pantallita de diálogo.

Por cierto, a ver si me dices lo de “warra” a la cara, que te meto con mis “oscuros poderes”

ALEGRÍA PA LA CASA! Conseguido

Os cuento, la cosa era pa hacer q 3 pnjs sentados simularan una partida de cartas; ante la imposibilidad de asignar un ActionSpeakString a los pnjs por estar sentaos (estando sentados no funciona esa función) coloqué en cada silla un objeto invisible y le asigné la función a ellos; los llamé [i:05c5e29ec9]dummy01, dummy02[/i:05c5e29ec9] y [i:05c5e29ec9]dummy03[/i:05c5e29ec9]. La única referencia hacia el objeto al soltar la frase es que ésta viene precedida del NOMBRE (no etiqueta) del objeto en corchetes, así que les puse el nombre (repito, no etiqueta) del pnj en cuestión, y para que no quedara la frase mu pegá al último corchete (que queda) simplemente la inicié con un espacio. Ahí os dejo el script por si os sirve de referencia en casos similares. Gracias por vuestra ayuda, con la que fui llegando a la solución.

(Script en OnEnter de un desencadenante cercano a la escena) :

void main()
{

object oPC = GetEnteringObject();

if (!GetIsPC(oPC)) return;

int DoOnce = GetLocalInt(oPC, GetTag(OBJECT_SELF));

if (DoOnce==TRUE) return;

SetLocalInt(oPC, GetTag(OBJECT_SELF), TRUE);

object oTarget;
oTarget = GetObjectByTag(“dummy01”);

object oTargeto;
oTargeto = GetObjectByTag(“dummy02”);

object oTargete;
oTargete = GetObjectByTag(“dummy03”);

AssignCommand(oTarget, ActionSpeakString(“ Quién quiere cartas”));

DelayCommand (4.0, AssignCommand(oTargeto, ActionSpeakString(“ Yo quiero una”)));

DelayCommand (6.0, AssignCommand(oTargete, ActionSpeakString(“ ¡Maldición!”)));

DelayCommand (9.0, AssignCommand(oTargete, ActionSpeakString(“ Dame cuatro”)));

}

Nada Buzz, un placer

Sólo comentar una cosilla… “la cosa era pa hacer q 3 pnjs sentados simularan una partida de cartas; ante la imposibilidad de asignar un ActionSpeakString a los pnjs por estar sentaos”

Ehm… esto a mi me sale normalmente, que quieres que te diga, jejeje. No se qué harías en el script, pero funciona sin problemas.

Es que ya digo, uso dos scripts: uno en OnSpawn pa sentarlo y otro en OnConversation, pa que se quede sentao cuando lo clickeas, y pa mí q éste era el q jodía la marrana.

Los más activos en Scripting