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

Que un PNJ abra una puerta

Saludos a to la banda. Planteo la situacion:Al terminar una conversacion con un PNJ, este valla y abra una puerta cerrada con llave que tiene al lado mismo. Pues bien, este es el script que hago y pongo en “acciones emprendidas” del final de la conversacion: void main() { // define que puerta hay que abrir object oPuertaPrincipal = GetObjectByTag(“Puerta_Principal”); // Accion ActionOpenDoor(object oPuertaPrincipal); } La etiqueta de la puerta es “Puerta_Principal”, en sus propiedades esta seleccionada “trama” , “cerrada con llave” y “llave necesaria para echar o abrir el cierre” y puesta la etiqueta necesaria de la llave que abre la puerta, y que esta en el inventario del PNJ. Puede alguien decirme por que no me funciona?, ¿donde esta el fallo? GRACIAS.DeVellon.

void main()
{
// define que puerta hay que abrir
object oPuertaPrincipal = GetObjectByTag(“Puerta_Principal”);
// Accion
ActionMovetoObject(oPuertaPrincipal);
AssignActiontoObject(oPuertaPrincipal, ActionOpenDoor(oPuertaPrincipal));
}

A mí me funciona así.

Se me olvidaba decirte que los pnj no usan las llaves o al menos yo no sé hacerlo. De la manera que yo te he dicho se abre siempre aunque el pnj no lleve la llave. De todas formas déjasela en el inventario por si hay algún pj caótico malvado que prefiera abrirla él, tú ya me entiendes .

Hola amigo Atary. Cuando le doy para grabar tu script en el compilador, me sale ERROR: IDENTIFICADOR NO DEFINIDO y me señala esta linea.

   ActionMovetoObject(oPuertaPrincipal);

¿Cual puede ser el motivo?

                                                                DeVellon

Pues que está mal escrito . Es que el script lo escribí de memoria sin fijarme en si las funciones eran correctas. A ver, creo que como diox manda es así:
void main()
{
// define que puerta hay que abrir
object oPuertaPrincipal = GetObjectByTag(“Puerta_Principal”);
// Accion
ActionMoveToObject(oPuertaPrincipal);
AssignCommand(oPuertaPrincipal, ActionOpenDoor(oPuertaPrincipal));
}
De todas formas, puedes comprobarlo tí mismo. Para ello debes irte a la casillita superior derecha del editor de scripts. Escribe ahí las dos o tres letras de la palabra clave y te van saliendo todas las funciones correspondientes.

A ver si así te va .

Creo que quedaría más realista si además le metes una animación al pnj como si estuviera abriendo la puerta. La animación que le viene bien creo que es la looping_get_mid o algo así.

Os comento solo un pequeño detalle con el que veo que no jugais y seria interesante y muy util :

ActionUnlockObject(object oTarget);

ActionLockObject(object oTarget);

Creo aunque no estoy muy seguro pues no lo he usado en puerta bloqueadas con llave, que el pnj precisa de la llave para abrir la puerta y si la tiene en el inventario la usara con asignandole la orden unlock y un vez atraviese la puerta, supongo que querras blockearla

Si no os aclarais con esto cuando pueda os pongo un ejemplo.

Ahora si ke lo has clavao
Le he añadido:

//…y la cierra despues de 20 segundos
AssignCommand(oPuertaPrincipal, DelayCommand(20.0, ActionCloseDoor (oPuertaPrincipal)));

…para que el PJ que venga detrás no se la encuentre abierta.
(no si al final aprenderé)

Agradecido te estoy caballero Atary.

DeVellon

[code:1:da2dab880b]
void main()
{
// Define las variables a usar.
// Procuarar usar variables mas simples.
object oPuerta1 = GetObjectByTag("Puerta_Principal");
object oWPPuerta1 = GetWayPointByTag("Wp_Puerta_Principal");
// Acciones del pnj.
AssignCommand(OBJECT_SELF, ActionMoveToObject(oPuerta1));
DelayCommand(10.0, AssignCommand(OBJECT_SELF, ActionUnlockObject(oPuerta1)));
DelayCommand(13.0, AssignCommand(OBJECT_SELF, ActionOpenDoor(oPuerta1)));
DelayCommand(16.0, AssignCommand(OBJECT_SELF, ActionMoveToObject(oWPPuerta1)));
AssignCommand(oPuerta1, DelayCommand(20.0, ActionCloseDoor (oPuerta1)));
AssignCommand(oPuerta1, DelayCommand(21.0, ActionLockObject(oPuerta1)));
}
[/code:1:da2dab880b]

Bien haber esta preparado para una conversacion, el pnj andara hacia la puerta, la desbloqueara, abrira y luego andara hacia un WayPoint con el tag Wp_Puerta_Principal. Si este se encuentra atravesando la puerta o en otra area que requiera atravesar la puerta, pues pasara por ella.

Esta es la teoria prueba haber si te sirve.

Saludos Gonar.

Con el script de Atary y añadiendo la linea que comento luego, y con la llave en el inventario del PNJ, la puerta quedará cerrada con llave (que sí era lo que quería).
De todas formas voy a practicar con las Funciones que comentas para ver las diferencias que puedan tener, y de paso aprender un poco más.
Agradezco tu intervención, honorable Gonar.

                                                          DeVellon

Gonar, la función de unlockobject, no es necesaria si le asignas a la propia puerta (o a cualquier objeto que no sea un personaje) la función de abrirse, aunque la puerta esté bloqueada y requiera llave para abrirse. En todo caso se le puede meter el sonido de cerradura o algo para que quede mejor. Yo lo uso así y me va bien. Lo que ya no estoy seguro es si asignándole la función de unlock al pnj, éste usa la llave que tenga en el inventario. Yo creo que lo probé así una vez (porque es lo más lógico) y no me funcionó, aunque quizá me pude haber equivocado en algo. De todas formas como de la manera que te digo me va bien, siempre lo hago así y no seguí intentándolo de la otra.

Hombre yo no lo he probado, me baso en suposiciones de como funciona Teoricamente.

Aunque tomo nota de lo que comentas que me servira mas adelante

Gracias igualmente a ambos por esto, es algo que tendre que tocar en breve en una zona del mapeado y partire con una base

Por cierto, se me ha olvidado decir, que de la forma que te digo no es preciso que los pnj tengan llave en el inventario para “unlock” o “lock” las puertas.

Los más activos en Scripting