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

 

 Sistema de descanso, muy completo, util y facil ...

Ir abajo 
AutorMensaje
Gonar
Patos@
Patos@



Masculino
Edad : 47
Puntos de Actividad : 5199

Cantidad de envíos : 19
Fecha de inscripción : 10/02/2011

Nº. de Miembro : 132
Respeto por el Foro :
Sistema de descanso, muy completo, util y facil ... Left_bar_bleue100 / 100100 / 100Sistema de descanso, muy completo, util y facil ... Right_bar_bleue


Sistema de descanso, muy completo, util y facil ... Empty
MensajeTema: Sistema de descanso, muy completo, util y facil ...   Sistema de descanso, muy completo, util y facil ... I_icon_minitimeJue 10 Feb 2011, 1:26 am

Bueno aqui van mis scripts de descanso.

En el evento OnPlayerRest del modulo, iria el siguiente script:

Código:
//::///////////////////////////////////////////////
//:: go_mod_def_rest
//:: Copyright (c) 2011 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Este es un sistema mas completo que el basico
    de bioware para descansos, tanto en modulos,
    como en servidores.
    Entre sus caracteristicas esta:
    1.- No se puede descansar con armaduras de
        CA 2 o superior. Son muy rigidas.
    2.- No se puede descansar si se tiene en la
        mano una antorcha, escudo o arma.
    3.- Solo se puede descansar en zonas que se
        hallan definido como seguras.
    4.- Deben de haber pasado 8 horas desde el
        ultimo descanso del personaje.
    5.- No se puede descansar montado, esto es
        solo aplicable para el parche 1.69.
    6.- Se recuperaran solo un punto de vida por
        nivel total del personaje, mas uno extra
        y siempre y cuando se complete todo el
        tiempo de descanso.
    7.- No se recupera vida si se cancela el
        descanso.
    8.- Efectos visuales cuando se duerme.
*/
//:://////////////////////////////////////////////
//:: Creado por Gonar.
//:: Creado el 07 de febrero del 2011.
//:://////////////////////////////////////////////

// includes necesarios.
#include "x2_inc_restsys"
#include "x2_inc_switches"
// El siguiente include solo debe de ponerse si se usa el parche 1.69, en caso contrario borrar las lineas 36 y 37.
#include "x3_inc_horse"
// Variable que recoge el momento actual.
int HoraActual = GetTimeHour() + GetCalendarDay() * 24 + GetCalendarMonth() * 672 + GetCalendarYear() * 8064;
void main()
{
    // Declaracion de variables necesarias.
    object oPC        = GetLastPCRested();
    int    HoraUltima = GetLocalInt(oPC, "Durmio");
    effect eDormir, eSueno;
    int iNivel, iAntes, iActual, iDano;
    // Analizamos si lleva armadura puesta, si la lleva no podra descansar y lo notificamos.
    if(GetItemACValue(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC)) >= 2)
    {
        AssignCommand(oPC, ClearAllActions(TRUE));
        FloatingTextStringOnCreature("No puedes dormir con armaduras cuyo valor de CA sea superior a 1.", oPC, TRUE);
        return;
    }
    // Analizamos si porta algun objeto en la mano dercha o izquierda, si lleva algo no podra descansar y lo notificamos.
    else if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC)) || GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC)))
    {
        AssignCommand(oPC, ClearAllActions(TRUE));
        FloatingTextStringOnCreature("No puedes dormir con escudo, antorcha o arma alguna en tus manos.", oPC, TRUE);
        return;
    }
    // Analizamos si esta en zona segura, si no lo esta no podra descansar y lo notificamos.
    else if(GetLocalInt(oPC, "LugarSeguro") != 1)
    {
        AssignCommand(oPC, ClearAllActions(TRUE));
        FloatingTextStringOnCreature("Busca un lugar apropiado para dormir, esta zona no es segura.", oPC, TRUE);
        return;
    }
    // Analizamos si han pasado 8 horas desde el ultimo descanso, si no han pasado no podra descansar y lo notificamos.
    // El valor de hora para el ultimo descanso se guarda al dormir, y la primera vez como se vera despues, funciona mediante el evento
    // del modulo OnEnter.
    else if(HoraUltima >= HoraActual)
    {
        AssignCommand(oPC, ClearAllActions(TRUE));
        FloatingTextStringOnCreature("No puedes dormir aun, han de pasar " + IntToString(HoraUltima - HoraActual) + " horas para que puedas descansar.", oPC, TRUE);
        return;
    }
    // Analizamos si esta montado, en caso afirmativo no podra descansar y lo notificamos.
    // Esto solo es aplicable con el parche 1.69, si no es el caso borrar desde la linea 77, hasta la linea 84.
    else if(HorseGetIsMounted(oPC))
    {
        AssignCommand(oPC, ClearAllActions(TRUE));
        FloatingTextStringOnCreature("No puedes descansar estando montado.", oPC, TRUE);
        return;
    }
    // Si todos los requisitos se cumplen, se inicia el descanso y ahora tendremos que valorar las tres opciones distintas de
    // descanso. Cuando empieza, cuando se cancela y cuando se acaba.
    if(GetLastRestEventType()==REST_EVENTTYPE_REST_STARTED)
    {
        // Esto se ejecutara cuando se inicie el descanso. Se aplicaran los efectos visuales y se guardara la vida poseida al
        // iniciar el descanso.
        eDormir = EffectVisualEffect(VFX_DUR_DARKNESS);
        eSueno  = EffectVisualEffect(VFX_IMP_SLEEP);
        SetLocalInt(oPC, "VidaAntes", GetCurrentHitPoints(oPC));
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDormir, oPC);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSueno, oPC);
    }
    else if (GetLastRestEventType()==REST_EVENTTYPE_REST_CANCELLED)
    {
        // Esto se ejecutara cuando se cancele el descanso. Se anularan los efectos visuales, se cancelara la recuperacion de
        // vida, y se guardara la hora de inicio de descanso +2 horas. Como no se completo el descanso, no se aplican las 8
        // horas entre descansos, pero se aplican 2 horas de penalizacion.
        eDormir = EffectVisualEffect(VFX_DUR_DARKNESS);
        eSueno  = EffectVisualEffect(VFX_IMP_SLEEP);
        iAntes  = GetLocalInt(oPC, "VidaAntes");
        iActual = GetMaxHitPoints(oPC);
        iDano  = (iActual - iAntes);
        RemoveEffect(oPC, eDormir);
        RemoveEffect(oPC, eSueno);
        SetLocalInt(oPC, "Durmio", HoraActual + 2);
        ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(iDano), oPC);
    }
    else if (GetLastRestEventType()==REST_EVENTTYPE_REST_FINISHED)
    {
        // Esto se ejecutara cuando finalize un descanso completo. Se anularan los efectos visuales, se aplicara la recuperacion
        // de un punto de vida por nivel mas uno de bonificacion, se guardara la hora de inicio de descanso mas las 8 respectivas
        // de entre descansos.
        eDormir = EffectVisualEffect(VFX_DUR_DARKNESS);
        eSueno  = EffectVisualEffect(VFX_IMP_SLEEP);
        iNivel  = GetHitDice(oPC) + 1;
        iAntes  = GetLocalInt(oPC, "VidaAntes");
        iActual = GetMaxHitPoints(oPC);
        iDano  = (iActual - iAntes) - iNivel;
        RemoveEffect(oPC, eDormir);
        RemoveEffect(oPC, eSueno);
        SetLocalInt(oPC, "Durmio", HoraActual + 8);
        // Debug necesario para si el calculo da negativos no le quite dano cuando no deberia.
        if(iDano <= 0)
            iDano = 0;
        // Fin del Debug.
        ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(iDano), oPC);
    }
}

Al evento OnClientEnter habria que añadir, el siguiente codigo:

Código:
    SetLocalInt(oPC, "Durmio", (GetTimeHour() + (GetCalendarDay() * 24) + (GetCalendarMonth() * 672) + (GetCalendarYear() * 8064)) - 8);

Para hacer zonas seguras concretas, se debería utilizar desencadenantes genericos dentro de un area y usar sus eventos OnEner y OnExit.
Para hacer zonas seguras totales, es decir toda un area, se deberia de usar los eventos OnEnter y OnExit del area.

En los eventos OnEnter, se debe de usar el siguiente script:

Código:
//::///////////////////////////////////////////////
//:: go_ent_area
//:: Copyright (c) 2011 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Designa un area entera o la zona que cubre un
    desencadenante como area segura.
*/
//:://////////////////////////////////////////////
//:: Creado por Gonar.
//:: Creado el 07 de febrero del 2011.
//:://////////////////////////////////////////////

void main()
{
    SetLocalInt(GetEnteringObject(), "LugarSeguro", 1);
    FloatingTextStringOnCreature("Estas en un area segura de descanso", GetEnteringObject());
}

Y en el evento OnExit, se deberia de poner el siguiente script:

Código:
//::///////////////////////////////////////////////
//:: go_ext_area
//:: Copyright (c) 2011 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Estipula que se sale de un area segura de
    descanso, sea area o desencadenante.
*/
//:://////////////////////////////////////////////
//:: Creado por Gonar.
//:: Creado el 07 de febrero del 2011.
//:://////////////////////////////////////////////
void main()
{
    SetLocalInt(GetEnteringObject(), "LugarSeguro", 0);
    FloatingTextStringOnCreature("Estas saliendo de un area segura de descanso", GetEnteringObject());
}

El sistema es el que uso yo y lo he testeado, funciona correctamente, si no te va, mira haber que has echo mal. Si aun asi sigue sin funcionarte, planteame tus dudas aqui mismo.

En el sistema no he añadido comidas, bebidas, etc ... por que ya existen bastantes requisitos, pero se podria ampliar a esto y complicar mucho mas.
Volver arriba Ir abajo
 
Sistema de descanso, muy completo, util y facil ...
Volver arriba 
Página 1 de 1.
 Temas similares
-
» Descanso !!!XD

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: