Neverwinter Nights, modding - scripts - manuales, todo sobre el NWN
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.


Pulse Control+D para no olvidar este enlace.
 
Pagina principalÍndicePortalÚltimas imágenesBuscarRegistrarseConectarsePagina principal

 

 "Muro invisible que impide el paso"

Ir abajo 
AutorMensaje
Xiulito
Administrador/a
Administrador/a
Xiulito


Masculino
Edad : 44
Localización : Vivo aqui
Puntos de Actividad : 6815

Cantidad de envíos : 101
Fecha de inscripción : 22/03/2008

Nº. de Miembro : 1
Respeto por el Foro :
"Muro invisible que impide el paso" Left_bar_bleue100 / 100100 / 100"Muro invisible que impide el paso" Right_bar_bleue


"Muro invisible que impide el paso" Empty
MensajeTema: "Muro invisible que impide el paso"   "Muro invisible que impide el paso" I_icon_minitimeVie 28 Mar 2008, 3:36 am

"Muro invisible que impide el paso"

Creara un muro invisible que impedirá el paso a todo aquel que no cumpla los requisitos del Script.
Primero crearemos un Desencadenante y pondremos el script en el evento OnEnter del desencadenante.

En el script hay en el final de algunas líneas unos apuntes como estos "//1, //2" esto marcara el tipo de prohibición que queremos que tenga el script, solo tienes que elegir una prohibición y borrar las líneas que no correspondan con la prohibición que queremos.

//1 - Impedir el paso por SubRaza del PJ, solo tienes que cambiar donde dice SUBRAZA_A_ELEGIR por el tipo de SubRaza a la que quieres que se le permita el paso. (Asegúrate de poner las restricciones habituales a la entrada del modulo en un script para que nadie se ponga la SubRaza al crear el PC)

Ejemplo: Poner en el OnEnter del Módulo, quitara cualquier Subraza que eligió el Jugador dejando por defecto la Raza de Humano.
Código:
//OnEnter del Módulo
void main()
{
object oPC = GetEnteringObject();
SetSubRace(oPC,"");//También puedes coger esta línea y ponerla en el script que ya tengas en el OnEnter del Módulo.
}

//2 - Impedir el paso por posesión de objeto, solo tienes que sustituir TAG_ITEM por la etiqueta del objeto en cuestión, esto dejara pasar a todo aquel que posea el objeto. (Poco fiable por traspaso de objetos entre Jugadores)

Si dejas el script tal y como esta tendrá dos restricciones, la de SubRaza y el objeto, es ma fiable.
Si quitaras //1 y //2 no pasaría nadie mas que PNJ y DMs.

Código:
//OnEnter
void main()
{
object oPC = GetEnteringObject();

string sSubRaza = GetSubRace(oPC);//1
string sSubRazaAceptada = "SUBRAZA_A_ELEGIR";//1
string sTag = "TAG_ITEM";//2

if (!GetIsPC(oPC)) return;

if (sSubRaza==sSubRazaAceptada){return;}//1
if (GetIsObjectValid(GetItemPossessedBy(oPC, sTag))){return;}//2

FloatingTextStringOnCreature("Mensaje de aviso para los que tengan el paso prohibido", oPC);

float fFacing = GetFacing(oPC);
float fReverseFacing = IntToFloat(FloatToInt(fFacing + 180.0f) % 360);
location lLoc = GetLocation(oPC);

vector v = GetPositionFromLocation(lLoc);
v.x += 1.0f * cos(fReverseFacing);
v.y += 1.0f * sin(fReverseFacing);
lLoc = Location(GetArea(oPC), v, fFacing);

AssignCommand(oPC, ClearAllActions(TRUE));
AssignCommand(oPC, ActionJumpToLocation(lLoc));
effect eEfecto = EffectVisualEffect(VFX_IMP_BREACH);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eEfecto, oPC, 1.0f);
}


Este otro script hace lo mismo pero en puertas, poner en el evento OnAreaTransitionClick de la puerta.

El PJ podrá abrir la puerta normalmente pero no podrá cruzarla, es decir, el mensaje de prohibición saldrá al hacer click sobre la zona azul que se ilumina cuando queremos entrar en alguna puerta, este script tiene las dos prohibiciones y habría que retocarlo para que solo admita una o ninguna, no te olvides de ponerle una transación de área a la puerta para elegir el destino del PJ.


Código:
//OnAreaTransitionClick
void main()
{
object oPC = GetClickingObject();
object oTransition = GetTransitionTarget(OBJECT_SELF);

string sSubRaza = GetSubRace(oPC);
string sSubRazaAceptada = "SUBRAZA_A_ELEGIR";
string sTag = "TAG_ITEM";

if (!GetIsPC(oPC)) return;

if ((!GetIsObjectValid(GetItemPossessedBy(oPC, sTag)))||
    (sSubRaza!=sSubRazaAceptada))
    {
    FloatingTextStringOnCreature("Mensaje de aviso para los que tengan el paso prohibido", oPC);
    return;
    }
SetAreaTransitionBMP(AREA_TRANSITION_RANDOM);
AssignCommand(oPC,JumpToObject(oTransition));
}

DATOS IMPORTANTES: Este ultimo es mas fiable ya que el otro me daba fallos a la hora de el persistir de los PJ, si a un Jugador le da por darle rápido y repetidas veces al otro lado del muro al final acaba creando un bug que hace que falle el script y le permite el paso o simplemente utilizando el avance persistente del teclado también termina pasando.


Otro ejemplo de Muro es este, tiene mas efectos y aunque no lo he probado mucho parece que no va mal.

Se debe crear una o varias runas (opcional) para darle vistosidad, en el ejemplo tienen de etiqueta: "Piedra1", "Piedra2" y "Piedra3", puedes añadir tantas como quieras.
También (opcional) se puede colocar un nodo central, símbolo, cartel advertencia, pilar, dibujo en el suelo... de etiqueta "Central" en el ejemplo.
El script tiene varios efectos visuales, funciona sin ello, pero pierde bastante, ya que es un script meramente visual en conjunto.

Y por último colocamos un punto de ruta hacia donde te repele el script, en el ejemplo es: "WP_Destino"

También puedes añadir un Guardián cerca del WP el cual dará una voz de alerta al PJ e iniciara una conversación, esto viene entre /**/ y solo tienes que quitar estos símbolos y dar las etiquetas oportunas.

Este es el script, inspirado en el laboratorio del enano Drogan de la Expansión 1 del Neverwinter.

(Viene detalladamente explicado para mayor comprensión.)

Código:
//Inicializamos el futuro subprograma SaltoJugador
void SaltoJugador(object oPC);

//Cuerpo Principal.
void main()
{
object oTeleportacion = GetWaypointByTag("WP_Destino");
object oPC = GetEnteringObject();
SignalEvent(OBJECT_SELF, EventUserDefined(1350));

//Limpiamos la cola de acciones del jugador.
AssignCommand(oPC, ClearAllActions());
//Ejecutamos programa salto.
SaltoJugador(oPC);

//Si es un jugador y no esta hablando.
if (GetIsPC(oPC) == TRUE && IsInConversation(oPC) == FALSE)
    {
    //Applicar los efectos al Jugador
    effect eTeleportacion = EffectVisualEffect(VFX_IMP_HEALING_G);
    vector vPC = GetPosition(oPC);
    vPC = Vector(vPC.x, vPC.y, vPC.z + 1.5);
    location lSitioEquivocado = Location(GetArea(oPC), vPC, 0.0);
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eTeleportacion, GetLocation(oPC));
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eTeleportacion, lSitioEquivocado);

    //Aplicar efectos al Centro, se podra anular.
    object oCentral = GetObjectByTag("Central");
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_BREACH), GetLocation(oCentral));

    //Aplicar efectos a la Piedras de Runa Guardianas.
    object oPiedra1 = GetObjectByTag("Piedra1");
    object oPiedra2 = GetObjectByTag("Piedra2");
    object oPiedra3 = GetObjectByTag("Piedra3");
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_AC_BONUS), GetLocation(oPiedra1));
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_AC_BONUS), GetLocation(oPiedra2));
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_AC_BONUS), GetLocation(oPiedra3));

    //Atontar Jugador.
    DelayCommand(0.6, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneParalyze(), oPC, 2.5));
    //Aplicar evectos a la teleportacion
    vector vTeleportacion = GetPosition(oTeleportacion);
    vTeleportacion = Vector(vTeleportacion.x, vTeleportacion.y, vTeleportacion.z + 1.5);
    location lTelepad1 = Location(GetArea(oPC), vTeleportacion, 0.0);
    DelayCommand(0.5, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eTeleportacion, GetLocation(oTeleportacion)));
    DelayCommand(0.5, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eTeleportacion, lTelepad1));

    DelayCommand(0.6, SignalEvent(OBJECT_SELF, EventUserDefined(1350)));

        /*
        object oGuardian = GetObjectByTag("Guardian");
        AssignCommand(oGuardian, ActionSpeakString("¡Alto! ¡No... puedes... pasar...!"));
        AssignCommand(oGuardian, ClearAllActions());
        DelayCommand(1.0, AssignCommand(oGuardian, ActionStartConversation(oPC)));
        */

    }//
}//Fin del Cuerpo Principal.

//Subprograma SaltoJugador
void SaltoJugador(object oPC)
{
object oDestino = GetWaypointByTag("WP_Destino");
AssignCommand(oPC, JumpToObject(oDestino));
}//Fin del Subprograma SaltoJugador


Última edición por Xiulito el Jue 03 Abr 2008, 10:48 pm, editado 2 veces (Razón : Añadir Script: El laboratorio del enano Drogan de la Expansión 1 del Neverwinter.)
Volver arriba Ir abajo
http://nwnforo.com
 
"Muro invisible que impide el paso"
Volver arriba 
Página 1 de 1.
 Temas similares
-
» "Cerrar puertas con llave durante la noche"
» Scripts para el baul "Esposas y Rastreo"

Permisos de este foro:No puedes responder a temas en este foro.
Neverwinter Nights, modding - scripts - manuales, todo sobre el NWN :: NWToolSet (Aurora) :: Scripting NWN :: Baul de Scripts-
Cambiar a: