Corregidme si me equivoco pero...
… pensando y pensando… me he preguntado si es posible hacer una cadena continua de acciones por parte de un pnj. Me explico. Imaginemos por un momento, que hay tres pnjs juntos, que cuando el pj entra en una zona determinada, se ponen ha hablar (gracias Ilmater), y cuando terminan de hablar, dos se van hasta la puerta, y desaparecen. Esto es facil de conseguir (para mi vamos
). Ahora bien, mi restante pnj, tras hablar, pues andaría una serie de waypoints (un pasillo), se pararía ante una puerta, realizaría la acción de abrir cerraduras, abriria la puerta, entraría, cerraría la puerta y ya dentro de la alcoba en cuestíón, desaparecería, dando un efecto de lo más realístico si al pj le da por seguir a la guardia (quien sabe, hay quien ve morboso eso de las armaduras completas… en fin). He pensado, que todo esto puede realizarse haciendo una cadena de acciones, solo que desconozco como se hace, por lo que alguien puede hecharme una manita, será siempre bien recibida. Un saludo a todos. Imrishale N´her Orbdrin
Neverwinter Nights
Pues yo pienso que lo único que tienes que hacer es escribir todas las acciones que quieres que sucedan por orden y ya está:
Éso sí, seguramente tendrás que meter delays entre acción y acción.
Supongo que lo que tengo que hacer es empezar y poner todo en orden, es decir, supongamos que tengo un mayordomo, que en cuanto apareces en una casa, pues te habla y todo eso. Despues de hablar, te dice ke le siguas hasta donde está su señor. Te guía por todo el camino, ke es llegar hasta un waypoint. Entre el waypoint, hay una puerta, que debe de abrirse. Cuando llega al waypoint, se da la vuelta, e inicia su conversación diciendote que ya habeis llegado y que hable con el noble k se encuentra en la puerta contigua. Te dice que si necesita algo, estará en el vestíbulo.
Bien, yo lo que he hecho ha sido los siguiente:
1.- Creo el trigger en el que al aparecer el PJ, el mayordomo inicia su conversación. Esto no tengo problemas.
2.- Al finalizar la conversación, tengo puesto este script para que se vaya al waypoint:
void main()
{
//Ir al waypoint//
object oWP = GetObjectByTag(“WP_Mayordomo1”);
location lDestino = GetLocation(oWP);
ActionMoveToLocation(lDestino,FALSE);
}
La puerta esa que comentaba antes, la abre directamente, sin problemas. Ahora bien, si quisiera que realizase la animación de “Abrir Cerraduras”, típica de un ladrón, pero para dar el efecto de ke abre la puerta con llave, usaría el código:
void main()
{
PlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,3.0);
}
Entonces, he pensado, que lo que tendría que hacer es:
1.- Hacer que el PNJ vaya hasta un waypoint intermedio, situado frente a la puerta.
2.- Hacer que realizace la acción de abrir puertas frente a la puerta.
3.- Ke continue hasta un segundo waypoint, antiguo original pasando por la puerta, que la abre directamente.
4.- Ke llegue al waypoint “y se de la vuelta”, que no de la espalda a por donde ha venido. He intentado hacer esto creando otro waypoint muy pegado, pero un poco más hacia atras, para que se diese la vuelta, pero no he conseguido que haga mas de un waypoint
Me hace uno, y se queda parado. Tras hablar con el mayordomo por 2ª vez, cosa que tengo ke hacer manual, ya k no consigo ke reempiece el solo la conversación (ni con OnPercepcive ni con Triggers soy capaz), pues entonces ya se marcha al otro waypoint, el del vestibulo de vuelta. Y lo cojonudo es ke no se keda allí… sino ke empieza a hacer los 2 waypoints tol rato :S Kizás si pongo este ultimo ocmo un POST…. no se…
Espero k alguien entienda un poco esto… kes un K.A.O.S. y pueda ayudarme (porke sigo los consejos de Gonar de intentarlo por mi mismo, y muxas cosas las consigo pero otras… aun no
U)
Un saludo a todos.
Imrishale N´her Orbdrin
No nombres los waypoint con el formato “WP_tag_xx” porque de ese modo el muñeco seguirá esa ruta continuamente.
Crea en primer lugar uno delante de la puerta llamado por ejemplo “pepito_01”, que es donde se para a abrir. Y luego crea otro al otro lado de la puerta llamado “pepito_02”. Entre medio de la puerta y el waypoint crea el segundo trigger para que se te acerque y te hable de nuevo. En teoría no debería de haber problemas con esto. Para que mire en una dirección determinada lo puedes hacer con la función “setfacing” o “setfacingpoint”, pero de todas formas te esté mirando o no, al entrar en el trigger se te va a dirigir hacia tí.
A ver si así te funciona.
Lo del trigger me funciona la primera vez, pero en la segunda no. ¿Kizás porke solo puede hacer una por conversación? No lo se… en fin, a ver si lo saco, luego te cuento.
Por cierto, me gusta tu módulo.
Esta tarde he cambiado la mecánica cuántica por nwn scripting y he hecho el script que comentas. A mí me ha funcionado perfectamente. Te cuento cómo lo he hecho.
Primero he hecho a un personaje llamado “juancho” y dos conversaciones llamadas “juancho1” y “juancho2”. Luego hice un trigger para que juancho se te acercara y te hablara.
object oPC = GetEnteringObject();
object oJu = GetObjectByTag(“juancho”);
if (GetIsPC(oPC))
{
AssignCommand(oJu, ActionMoveToObject(oPC));
AssignCommand(oJu, ActionStartConversation(oPC, “juancho1”));
}
(sería coveniente meter alguna variable para que no se repita esta acción. Yo no lo hice porque no tenía ganas)
Al terminar la conversación juancho1, se ejecuta el siguiente script:
void main()
{
object oDoor = GetObjectByTag(“puerta”);
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
object oWay1 = GetWaypointByTag(“way1”);
object oWay2 = GetWaypointByTag(“way2”);
ActionMoveToObject(oWay1);
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 1.5);
AssignCommand(oDoor, ActionUnlockObject(oDoor));
ActionOpenDoor(oDoor);
ActionMoveToObject(oWay2);
}
(no le metí el sonido de cerradura porque no me acuerdo cómo se llamaba. También es posible añadir al final un comando para que el pnj se quede mirando a una dirección concreta con setfacing).
Más adelante, ya en la otra habitación, puse otro trigger igual que el primero, solo que ahora se inicia la conversación “juancho2”:
object oPC = GetEnteringObject();
object oJu = GetObjectByTag(“juancho”);
if (GetIsPC(oPC))
{
AssignCommand(oJu, ActionMoveToObject(oPC));
AssignCommand(oJu, ActionStartConversation(oPC, “juancho2”));
}
Ya te digo, a mí me ha funcionado así. Los dos trigger funcionan correctamente y el juancho se comporta como un hombre y hace todo lo que se le dice.
Quizá ya tú lo hayas conseguido a tu manera, en caso contrario espero que esto te sirva de ayuda.
Un saludo.
Te juro que al leer tu mensaje… me a pasado como matrix… lo he visto todo… entendía las variables… los comandos…
Ahora solo espero que me rule
Voy a probar lo que me has dicho, a ver que tal, ya que a mi me falta lo de la puerta y conv2 aun 
Lo que no entendí bien es eso de tener 2 conversaciones, es decir, que al mayordomo no le pongo ninguna, y luego en los triggers, pongo ambas… y entonces si saldrán… no se, voy a probarlo ahora mismo, asiass.
Imrishale N´her Orbdrin
Matrix 2 para el 2003!!!
Hombre lo de las conversaciones ya es a gusto de cada uno. Piensa que de todas formas el mayordomo debe tener una conversación que sea la que sale por defecto. Todo esto lo puedes hacer haciendo 3 diferentes: la de por defecto y las de los 2 triggers. O bien se puede hacer una sola y asignar variables.
Yo es que con la cabeza que tengo siempre me lío con tantas variables y prefiero poner cuantas menos mejor. Pero cada cual lo puede hacer de la manera que mejor le parezca.
Veamos, este es mi script:
void main()
{
object oDoor = GetObjectByTag(“puertaprueba”);
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
object oWay1 = GetWaypointByTag(“Mayordomo_way1”);
object oWay2 = GetWaypointByTag(“Mayordomo_way2”);
ActionMoveToObject(oWay1);
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 2.5);
AssignCommand(oDoor, ActionUnlockObject(oDoor));
ActionOpenDoor(oDoor);
ActionMoveToObject(oWay2);
SetFacing(float 90.0f=North);
}
Todo me rula, excepto en dos cositas. La primera es que, el comando de SetFacing no me lo compila, y no se porqué. El comando, según el scripter, es:
// Cause the caller to face fDirection.
// - fDirection is expressed as anticlockwise degrees from Due East.
// DIRECTION_EAST, DIRECTION_NORTH, DIRECTION_WEST and DIRECTION_SOUTH are
// predefined. (0.0f=East, 90.0f=North, 180.0f=West, 270.0f=South)
void SetFacing(float fDirection)
Por ello, yo he puesto como fDirection de todo, y no consigo que se me compile
El otro punto que quería comentarte era el siguiente; cuando no pongo el SetFacing, mi mayordormo va hasta el punto 1, abre la puerta cerrada, pasa por ella y va hasta el otro waypoint, pero en vez de quedarse al final en el, se da la media vuelta y se va a vivir la vida loca (todo lo loca que pueda tenerla un mayordomo eneuco). Estoy tratando de ver como hacer para que se me esté quietecito. Si lo consigo, ya te lo diré. Un saludo.
mmmmm. Pos el mío se quedaba bien quietecito. A lo mejor puede ser porque has puesto el script en el sitio equivocado. Yo lo metí el la ficha que hay más a la derecha de lo de las acciones de las conversaciones. En ésa que puedes meter dos scripts: uno para cuando la conversación termina y otro para cuando la cortas.
Lo de setfacing no te funciona porque no tienes que meter lo de “f=norte”
SetFacing(float 90.0f=North); Éso es solo una aclaración para saber que según el número que metas mirará en un sentido o en otro. Los float son sólo números. Escribe sólo setfacing(90.0); No olvides poner los decimales (lo que va detrás del punto, aunque sea cero). Ni tampoco el punto y coma al final de la sentencia, porque si no no te compila.
A unas malas, si no te va, háblame por el msn y lo intentamos en tiempo real
. Así lo arreglamos más rápido.
Mi error era que, en vez de poner 90.0, ponía 90,0 (…) Falta de atención, seguramente. Pos muxas asias por las molestias. Ya te pillaré por banda yo con otro de mis mensajes
Por cierto, tengo otra petición hecha por allí abajo, la de la sala magica, a ver k podemos hacerle
(anda k no tengo cara ni nada
).
Muxas asias.
Aunke no me da error, el maldito mayordomo sigue mirando hacia donde siempre
Problabemente te pase por que todas las acciones anteriores las estás metiendo en la cola de acciones, y en cambio el SetFacing lo estas poniendo a “pelo”, prueba a cambiar la linea de SetFacing(…) por ActionDoCommand(SetFacing(…));
Un saludo