Saltar al contenido

Más en DLAN: Nuestras Traducciones | Otras Traducciones | Mods y modding | Revisiones y Guías | Videojuegos | Arte | Literatura | Rol y Rol por foro e IRC | Mapa de la web
Foto

PNJ no duerme ... (SOLUCIONADO)


2 respuestas al tema

#1 Gonarin

Gonarin

    Humano

  • Miembro
  • Pip
  • 69 posts

Posteado 13 August 2018 - 11:02 AM

Veréis este script hasta ayer funcionaba, no tenía problemas (Dormir me refiero PNJs), pero cual mi sorpresa hoy que ha dejado de funcionar.

 

#include "nw_i0_generic"
#include "go_inc_populatio"
void main()
{
    if (GetAILevel() == AI_LEVEL_VERY_LOW) // Con inteligencia baja, se interrumpe el script.
        return;
    if(GetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY) && TalentAdvancedBuff(40.0)) // Ni idea, forma parte de la IA basica.
    {
        SetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY, FALSE);
        return;
    }
    int iTipo = GetLocalInt(OBJECT_SELF, "TIPO_PNJ"); // Recogemos el tipo de PNJ.
    location lInicio = GetLocalLocation(OBJECT_SELF, "Inicio"); // Recogemos su ubicacion inicial.
    if(GetHasEffect(EFFECT_TYPE_SLEEP) && (GetLocalInt(OBJECT_SELF, "DormidoNatural") == 0 && !GetIsNight() ||
       GetLocalInt(OBJECT_SELF, "DormidoNatural") == 1 && GetIsNight()))
    // Si tiene efecto dormido y es de dia (Sin efecto sueno) o es de noche (Con efecto sueno).
    {
        ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_IMP_SLEEP), OBJECT_SELF, 6.5);
        ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSleep(), OBJECT_SELF, 6.5);
    }
    else if(GetLocalInt(OBJECT_SELF, "DORMIR") == 1 && GetLocalInt(OBJECT_SELF, "DormidoNatural") != 1 && GetIsNight() &&
            (GetLocalInt(OBJECT_SELF, "TIPO_PNJ") == 10 || GetLocalInt(OBJECT_SELF, "TIPO_PNJ") == 11 ||
             GetLocalInt(OBJECT_SELF, "TIPO_PNJ") == 12 || GetLocalInt(OBJECT_SELF, "TIPO_PNJ") == 20 ||
             GetLocalInt(OBJECT_SELF, "TIPO_PNJ") == 21)) // Si es tipo de PNJ apropiado, variable para dormir y no esta dormido.
    {
        string sDormir = "DORM_" + GetTag(OBJECT_SELF); // Variable de zona para dormir personalizada.
        object oDormir = GetWaypointByTag(sDormir); // Waypoint para dormir.
        if(GetIsObjectValid(GetLocalObject(OBJECT_SELF, "oDormir"))) // Si tiene ya un Waypoint asignado.
            oDormir = GetLocalObject(OBJECT_SELF, "oDormir"); // Cambiar Waypoint para dormir.
        else if(!GetIsObjectValid(oDormir)) // Si el Waypoint de dormir no existe.
        {
            oDormir = GetNearestObjectByTag("DORM_CASA", OBJECT_SELF, d3()); // Asignarle al azar uno de los 3 waypoint para dormir mas cercanos.
            SetLocalObject(OBJECT_SELF, "oDormir", oDormir);
        }
        if(GetDistanceBetween(oDormir, OBJECT_SELF) >= 2.0) // Ver si esta lejos del Waypoint de dormir.
            ActionMoveToObject(oDormir, TRUE, 1.0); // Correr hacia el Waypoint de dormir.
        else if(GetDistanceBetween(oDormir, OBJECT_SELF) < 2.0) // En caso de estar a la distancia apropiada del punto de dormir.
        {
        // Aqui falla, no aplica el efecto dormir, lo he probado aplicando EffectSleep();
SendMessageToPC(GetFirstPC(), "Aqui deberia aplicarse el efecto dormir por primera vez");
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_IMP_SLEEP), OBJECT_SELF, 6.5);
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSleep(), OBJECT_SELF, 6.5);
            SetLocalInt(OBJECT_SELF, "DormidoNatural", 1); // Cambiamos la variable a dormirdo.
        }
    }
    else if(GetLocalInt(OBJECT_SELF, "DormidoNatural") == 1 && GetIsNight() == FALSE) // Si no es de noche y esta dormido.
    {
        RemoveEffect(OBJECT_SELF, EffectVisualEffect(VFX_IMP_SLEEP)); // Anular el dormir.
        RemoveEffect(OBJECT_SELF, EffectSleep()); // Anular el dormir.
        SetLocalInt(OBJECT_SELF, "DormidoNatural", 2); // Cambiamos la variable a despierto, pero no en su sitio.
    }
    else if(GetLocalInt(OBJECT_SELF, "DormidoNatural") == 2 &&
            GetDistanceBetweenLocations(lInicio, GetLocation(OBJECT_SELF)) >= 2.0) // Si esta despierto y no en su sitio.
    {
        ActionMoveToLocation(lInicio, TRUE); // Mover hacia su posicion inicial.
        if(GetDistanceBetweenLocations(lInicio, GetLocation(OBJECT_SELF)) <= 2.0) // Si llega a la posicion.
            SetLocalInt(OBJECT_SELF, "DormidoNatural", 0); // Resetear dormido, ya esta listo para la siguiente noche.
    }
    else if(GetWalkCondition(NW_WALK_FLAG_CONSTANT)) // Si tiene rutas asignadas POST_ NIGHT_ WP_ WN_ etc...
        WalkWayPoints(); // Seguir puntos de ruta.
    else if(!GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()) &&
            !GetIsPostOrWalking() && !GetIsObjectValid(GetNearestSeenEnemy())) // Si no tiene objetivo de combate, no tiene objetivo de conjuro, no tiene puntos de ruta y sin enmmigos.
    {
        if(!IsInConversation(OBJECT_SELF)) // Si no esta en conversacin.
        {
            object oGrupo = GetNearestObjectByTag("PTO_GRUPO"); // Establecer waypoint de grupo cercano.
            if(GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) || GetIsEncounterCreature() || iTipo == 11) // Si es ambientacion animacion mobile, criatura de encuentro o tipo 11.
                PlayMobileAmbientAnimations(); // Animaciones mobile.
            else if(GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) || iTipo == 10) // Si es ambientacion inmovil o tipo 10.
                PlayImmobileAmbientAnimations(); // Animacion inmovil.
            else if(iTipo == 12) // Si es tipo 12.
                ActionRandomWalk(); // Animacion andar al azar.
            else if(iTipo == 21 && GetDistanceBetween(oGrupo, OBJECT_SELF) >= 10.0) // Si es tipo 21 y est lejos de su grupo.
                ActionMoveToObject(oGrupo, Random(2)); // Acercarse a su grupo.
            else if(iTipo == 21) // Si es tipo 21 (Se supone cerca, salto el condicional anterior).
            {
                SetFacingPoint(GetPosition(oGrupo)); // orientarse al grupo.
                PlayMobileAmbientAnimations(); // Animacion mobile.
            }
            else if(iTipo == 20) // Si es tipo 20.
            {
                SetFacingPoint(GetPosition(oGrupo)); // Orientarse al grupo.
                PlayImmobileAmbientAnimations(); // Animacion inmovil.
            }
        }
    }
    SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_HEARTBEAT)); // Siempre se lanza el evento Hearbeat, para analizar otros factores desde userdefined
}

 

Llega a entrar en el bucle especificado, recibo el Msg, pero no duermen los pnjs, siguen haciendo animaciones.

 

Le echare una ojeada esta noche de nuevo, pero vamos no lo entiendo, ayer por la noche funcionaba y no he cambiado nada.


Editado por Gonarin, 13 August 2018 - 11:44 AM.

JG8WpNH.jpg

¿No se puede?, Abre el Aurora Toolset o pídenos ayuda en NWN_ EE - España, grupo de Steam.


#2 Gonarin

Gonarin

    Humano

  • Miembro
  • Pip
  • 69 posts

Posteado 13 August 2018 - 11:33 AM

Las lineas 41 a 43 se aplican, pero luego se levantan y no se aplica las 18 y 19, pero el efecto lo tienen, es de noche y la variable está a 1


JG8WpNH.jpg

¿No se puede?, Abre el Aurora Toolset o pídenos ayuda en NWN_ EE - España, grupo de Steam.


#3 Gonarin

Gonarin

    Humano

  • Miembro
  • Pip
  • 69 posts

Posteado 13 August 2018 - 11:46 AM

Vale ya lo localice, no tuve en cuenta que PNJs inmortales no se lo aplicaría. He aprovechado para optimizar el condicional de la linea 14.

 

#include "nw_i0_generic"
#include "go_inc_populatio"
void main()
{
    if (GetAILevel() == AI_LEVEL_VERY_LOW) // Con inteligencia baja, se interrumpe el script.
        return;
    if(GetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY) && TalentAdvancedBuff(40.0)) // Ni idea, forma parte de la IA basica.
    {
        SetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY, FALSE);
        return;
    }
    int iTipo = GetLocalInt(OBJECT_SELF, "TIPO_PNJ"); // Recogemos el tipo de PNJ.
    location lInicio = GetLocalLocation(OBJECT_SELF, "Inicio"); // Recogemos su ubicacion inicial.
    if(GetLocalInt(OBJECT_SELF, "DormidoNatural") == 1 && GetIsNight())
    // Si tiene efecto dormido y es de dia (Sin efecto sueno) o es de noche (Con efecto sueno).
    {
        SetImmortal(OBJECT_SELF, FALSE);
        ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_IMP_SLEEP), OBJECT_SELF, 7.0);
        ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSleep(), OBJECT_SELF, 7.0);
        SetImmortal(OBJECT_SELF, TRUE);
    }
    else if(GetLocalInt(OBJECT_SELF, "DORMIR") == 1 && GetLocalInt(OBJECT_SELF, "DormidoNatural") != 1 && GetIsNight() &&
            (GetLocalInt(OBJECT_SELF, "TIPO_PNJ") == 10 || GetLocalInt(OBJECT_SELF, "TIPO_PNJ") == 11 ||
             GetLocalInt(OBJECT_SELF, "TIPO_PNJ") == 12 || GetLocalInt(OBJECT_SELF, "TIPO_PNJ") == 20 ||
             GetLocalInt(OBJECT_SELF, "TIPO_PNJ") == 21)) // Si es tipo de PNJ apropiado, variable para dormir y no esta dormido.
    {
        string sDormir = "DORM_" + GetTag(OBJECT_SELF); // Variable de zona para dormir personalizada.
        object oDormir = GetWaypointByTag(sDormir); // Waypoint para dormir.
        if(GetIsObjectValid(GetLocalObject(OBJECT_SELF, "oDormir"))) // Si tiene ya un Waypoint asignado.
            oDormir = GetLocalObject(OBJECT_SELF, "oDormir"); // Cambiar Waypoint para dormir.
        else if(!GetIsObjectValid(oDormir)) // Si el Waypoint de dormir no existe.
        {
            oDormir = GetNearestObjectByTag("DORM_CASA", OBJECT_SELF, d3()); // Asignarle al azar uno de los 3 waypoint para dormir mas cercanos.
            SetLocalObject(OBJECT_SELF, "oDormir", oDormir);
        }
        if(GetDistanceBetween(oDormir, OBJECT_SELF) >= 2.0) // Ver si esta lejos del Waypoint de dormir.
            ActionMoveToObject(oDormir, TRUE, 1.0); // Correr hacia el Waypoint de dormir.
        else if(GetDistanceBetween(oDormir, OBJECT_SELF) < 2.0) // En caso de estar a la distancia apropiada del punto de dormir.
        {
            SetImmortal(OBJECT_SELF, FALSE);
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_IMP_SLEEP), OBJECT_SELF, 7.0);
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSleep(), OBJECT_SELF, 7.0);
            SetLocalInt(OBJECT_SELF, "DormidoNatural", 1); // Cambiamos la variable a dormirdo.
            SetImmortal(OBJECT_SELF, TRUE);
        }
    }
    else if(GetLocalInt(OBJECT_SELF, "DormidoNatural") == 1 && GetIsNight() == FALSE) // Si no es de noche y esta dormido.
    {
        RemoveEffect(OBJECT_SELF, EffectVisualEffect(VFX_IMP_SLEEP)); // Anular el dormir.
        RemoveEffect(OBJECT_SELF, EffectSleep()); // Anular el dormir.
        SetLocalInt(OBJECT_SELF, "DormidoNatural", 2); // Cambiamos la variable a despierto, pero no en su sitio.
    }
    else if(GetLocalInt(OBJECT_SELF, "DormidoNatural") == 2 &&
            GetDistanceBetweenLocations(lInicio, GetLocation(OBJECT_SELF)) >= 2.0) // Si esta despierto y no en su sitio.
    {
        ActionMoveToLocation(lInicio, TRUE); // Mover hacia su posicion inicial.
        if(GetDistanceBetweenLocations(lInicio, GetLocation(OBJECT_SELF)) <= 2.0) // Si llega a la posicion.
            SetLocalInt(OBJECT_SELF, "DormidoNatural", 0); // Resetear dormido, ya esta listo para la siguiente noche.
    }
    else if(GetWalkCondition(NW_WALK_FLAG_CONSTANT)) // Si tiene rutas asignadas POST_ NIGHT_ WP_ WN_ etc...
        WalkWayPoints(); // Seguir puntos de ruta.
    else if(!GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()) &&
            !GetIsPostOrWalking() && !GetIsObjectValid(GetNearestSeenEnemy())) // Si no tiene objetivo de combate, no tiene objetivo de conjuro, no tiene puntos de ruta y sin enmmigos.
    {
        if(!IsInConversation(OBJECT_SELF)) // Si no esta en conversacin.
        {
            object oGrupo = GetNearestObjectByTag("PTO_GRUPO"); // Establecer waypoint de grupo cercano.
            if(GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) || GetIsEncounterCreature() || iTipo == 11) // Si es ambientacion animacion mobile, criatura de encuentro o tipo 11.
                PlayMobileAmbientAnimations(); // Animaciones mobile.
            else if(GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) || iTipo == 10) // Si es ambientacion inmovil o tipo 10.
                PlayImmobileAmbientAnimations(); // Animacion inmovil.
            else if(iTipo == 12) // Si es tipo 12.
                ActionRandomWalk(); // Animacion andar al azar.
            else if(iTipo == 21 && GetDistanceBetween(oGrupo, OBJECT_SELF) >= 10.0) // Si es tipo 21 y est lejos de su grupo.
                ActionMoveToObject(oGrupo, Random(2)); // Acercarse a su grupo.
            else if(iTipo == 21) // Si es tipo 21 (Se supone cerca, salto el condicional anterior).
            {
                SetFacingPoint(GetPosition(oGrupo)); // orientarse al grupo.
                PlayMobileAmbientAnimations(); // Animacion mobile.
            }
            else if(iTipo == 20) // Si es tipo 20.
            {
                SetFacingPoint(GetPosition(oGrupo)); // Orientarse al grupo.
                PlayImmobileAmbientAnimations(); // Animacion inmovil.
            }
        }
    }
    SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_HEARTBEAT)); // Siempre se lanza el evento Hearbeat, para analizar otros factores desde userdefined
}

JG8WpNH.jpg

¿No se puede?, Abre el Aurora Toolset o pídenos ayuda en NWN_ EE - España, grupo de Steam.




Responder



  


A Bragol. Tus amigos te echan de menos.