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 que no se viste ...


13 respuestas al tema

#1 Gonarin

Gonarin

    Humano

  • Miembro
  • Pip
  • 68 posts

Posteado 31 August 2018 - 04:42 PM

Voy a ir exponiendo los pnjs (Uno funciona, el otro no) y cual es el problema.

 

Script de evento Spawn, común a ambos PNJs.

 

#include "x2_inc_switches"
#include "x0_i0_anims"
#include "x0_i0_treasure"
#include "go_inc_general"
void main()
{
    int iTipo = GetLocalInt(OBJECT_SELF, "TIPO_PNJ"); // Recogemos el tipo de PNJ que es.

    // CONFIGURACION Y PERSONALIZACION BASICA DE CADA PNJ
    NivelMinimo(OBJECT_SELF); // Establece nivel minimo segun su TAG.
    SetLocalLocation(OBJECT_SELF, "Inicio", GetLocation(OBJECT_SELF)); // Guarda su posicion inicial
    EstablecerPelo(OBJECT_SELF); // Establece un pelo al azar
    EstablecerPiel(OBJECT_SELF); // Establece una piel al azar
    // Si tiene ropas al azar, exceptuando el tipo 4 que usa su propio sistema, se le genera
    // la ropa y se la equipa.
    if((iTipo != 4) && GetLocalInt(OBJECT_SELF, "ROPAS") == 1)
        CrearRopaAzar(OBJECT_SELF, 15);
    // Genera un nombre al azar, exceptuando que sea tipo 4 que usa su propio sistema
    // y si tiene la variable nombre para recibir nombre al azar.
    if((iTipo != 4) && GetLocalInt(OBJECT_SELF, "NOMBRE") == 1)
        GenerarNombre(OBJECT_SELF);
    // Aplica cambio de cabeza, exceptuando que sea tipo 4 que usa su propio sistema
    // y si tiene la variable cabeza para recibir cabeza al azar.
    if((iTipo != 4) && GetLocalInt(OBJECT_SELF, "CABEZA") == 1)
        GenerarCabeza(OBJECT_SELF);
    // Generamos un minimo tesoro.
    CTG_GenerateNPCTreasure(TREASURE_TYPE_MONSTER, OBJECT_SELF);

    // EFECTOS SECUNDARIOS DE LA APARICION DEL PNJ
    // Los PNJs ambientales por script, es decir los tipo 4, si aparecen de un edificio abren
    // la puerta de dicho edificio, es decir la mas cercana a su posicion, si esta a 2 metros
    // o menos. Si esta a mas, es por que vino por otro tipo de transicion de area.
    if(iTipo == 4)
    {
        object oDoor = GetNearestObject(OBJECT_TYPE_DOOR, OBJECT_SELF);
        if(GetDistanceBetween(oDoor, OBJECT_SELF) <= 2.0 && GetIsDoorActionPossible(oDoor, DOOR_ACTION_OPEN))
            ActionOpenDoor(oDoor);
    }

    // CONFIGURACION BASICA DE LA IA PARA TODOS LOS DE PNJs
    // SI se usan las variables (Opciones) de COMBATE, solo se puede tener una
    // activa en cada PNJ; no usar mas de una o la IA podra fallar.
    // Ayudara a sus aliados si le piden ayuda.
    SetSpawnInCondition(NW_FLAG_SHOUT_ATTACK_MY_TARGET);
    // Si tiene la opcion oculto, usara habilidades de ocultacion.
    if(GetLocalInt(OBJECT_SELF, "OCULTO") == 1)
        SetSpawnInCondition(NW_FLAG_STEALTH);
    // Si tiene la opcion buscar, usara sus habilidades de buscar.
    if(GetLocalInt(OBJECT_SELF, "BUSCAR") == 1)
        SetSpawnInCondition(NW_FLAG_SEARCH);
    // Conversacion especial cuando ve a un personaje, para usarlo su conversacion debe ser
    // personalizada y no generica. Poner nw_d2_gen_check en el nodo de la frase que debe
    // decir al ver a los personajes.
    if(GetLocalInt(OBJECT_SELF, "CONVERS_ESPECIAL") == 1)
        SetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION);
    // Conversacion especial cuando lucha con un personaje, para usarlo su conversacion debe ser
    // personalizada y no generica. Poner nw_d2_gen_combat en el nodo de la frase que debe
    // decir al combatir al personaje.
    if(GetLocalInt(OBJECT_SELF, "CONVERS_COMBATE") == 1)
        SetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION);
    // COMBATE: Opcion de combate, el PNJ intentara usar armas a distancia y permancer a
    // distancia cuando entra en combate.
    if(GetLocalInt(OBJECT_SELF, "DISTANCIA") == 1)
        SetCombatCondition(X0_COMBAT_FLAG_RANGED);
    // COMBATE: Usara habilidades de parada y dotes de defensa, cuando entre en combate.
    if(GetLocalInt(OBJECT_SELF, "DEFENSIVA") == 1)
        SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE);
    // COMBATE: Permanecer siempre que pueda oculto o invisible y atacara. Despues se alejara
    // para intentar una nueva maniobra igual.
    if(GetLocalInt(OBJECT_SELF, "EMBOSCAR") == 1)
        SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER);
    // COMBATE: Siempre intentara huir lejos de sus enemigos para evitar combatir.
    if(GetLocalInt(OBJECT_SELF, "COBARDE") == 1)
        SetCombatCondition(X0_COMBAT_FLAG_COWARDLY);

    // CONFIGURACION ESPECIFICA DE LA IA PARA CADA TIPO DE PERSONAJE
    if(iTipo == 10 || iTipo == 20) // Inmobiles
    {
        SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);
        SetAnimationCondition(NW_ANIM_FLAG_IS_CIVILIZED);
        SetAnimationCondition(NW_ANIM_FLAG_CONSTANT);
        SetAnimationCondition(NW_ANIM_FLAG_CHATTER);
        WalkWayPoints();
    }
    else if(iTipo == 11 || iTipo == 21) // Mobiles
    {
        SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);
        SetAnimationCondition(NW_ANIM_FLAG_IS_CIVILIZED);
        SetAnimationCondition(NW_ANIM_FLAG_CONSTANT);
        SetAnimationCondition(NW_ANIM_FLAG_CHATTER);
    }
    else if(iTipo == 12) // RandomWalk
        ActionRandomWalk();
    else if(iTipo == 30 || iTipo == 31) // Ruta igual dia y noche
    {
        // Nada en especial.
    }
    else if(iTipo == 32 || iTipo == 33) // Ruta distinta dia y noche
        SetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING);
    else if(iTipo == 4) // Ambiental
    {
        // Nada en especial.
    }
    else if(iTipo == 99) // Bailarina exotica
    {
        // Nada en especial.
    }
    // FINALIZADA LA CONFIGURACION, TOCA INICIAR LA IA
    // Establece relacion de la IA con sus talentos o clase que debe usar.
    SetListeningPatterns();
    // Inicia el recorrido de puntos de ruta si los tiene, basico para
    // las clases 30, 31, 32, 33, aprovechable para otras.
    WalkWayPoints();
}

 

Script evento Hearbeat, común a ambos PNJs.

 

#include "nw_i0_generic"
#include "go_inc_general"
void main()
{
    int iTipo = GetLocalInt(OBJECT_SELF, "TIPO_PNJ");
    if(/*GetLocalInt(OBJECT_SELF, "ROPAS") == 1 &&*/ !GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CHEST)))
        ActionEquipMostEffectiveArmor(); // Si no creo ropa en el Spawn, crearla ahora.
    if(GetLocalInt(OBJECT_SELF, "Bailando") == 1)
        return;
    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;
    }
    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() && (iTipo == 10 || iTipo == 11 || iTipo == 12 || iTipo == 20 || iTipo == 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();
            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.
            object oSilla = GetNearestObjectByTag("GO_SILLA_INVISIBLE");
            if(GetLocalInt(OBJECT_SELF, "SENTARSE") == 1 && GetSittingCreature(oSilla) != OBJECT_SELF)
                AssignCommand(OBJECT_SELF, ActionSit(oSilla));
            else if((GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) || GetIsEncounterCreature() || iTipo == 11) &&
                     GetLocalInt(OBJECT_SELF, "SENTARSE") != 1) // Si es ambientacion animacion mobile, criatura de encuentro o tipo 11.
                PlayMobileAmbientAnimations(); // Animaciones mobile.
            else if((GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) || iTipo == 10) &&
                     GetLocalInt(OBJECT_SELF, "SENTARSE") != 1) // Si es ambientacion inmovil o tipo 10.
                PlayImmobileAmbientAnimations(); // Animacion inmovil.
            else if(iTipo == 12 &&  GetLocalInt(OBJECT_SELF, "SENTARSE") != 1) // 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 && GetLocalInt(OBJECT_SELF, "SENTARSE") != 1) // Si es tipo 21 (Se supone cerca, salto el condicional anterior).
            {
                SetFacingPoint(GetPosition(oGrupo)); // orientarse al grupo.
                PlayMobileAmbientAnimations(); // Animacion mobile.
            }
            else if(iTipo == 20 && GetLocalInt(OBJECT_SELF, "SENTARSE") != 1) // 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
}

 

Función para crear ropa, extracto de la biblioteca de personalización, no voy a poner toda la biblioteca, puesto que solo hace falta analizar esta función:

 

void CrearRopaAzar(object oPNJ, int iCantidad = 9)
{
    int    iLargo       = GetStringLength(GetLocalString(oPNJ, "sROPAS")) -2;
    string sRopasResRef = GetSubString(GetLocalString(oPNJ, "sROPAS"), 0, iLargo);
    int iTirada = Random(iCantidad) + 1;
    if(iTirada < 10)
        sRopasResRef = sRopasResRef + "00" + IntToString(iTirada);
    else if(iTirada < 100 && iTirada > 9)
        sRopasResRef = sRopasResRef + "0" + IntToString(iTirada);
    else if(iTirada > 99)
        sRopasResRef = sRopasResRef + IntToString(iTirada);
    object oRopa = CreateItemOnObject(GetStringLowerCase(sRopasResRef), oPNJ);
    if(GetTag(oPNJ) == "GUPO_MA_06_N_002")
    {
        SendMessageToPC(GetFirstPC(), "Ropa creada " + GetName(oRopa) + " en el PNJ " + GetName(oPNJ) + " con etiqueta " + GetTag(oPNJ));
    }
    SetIdentified(oRopa, TRUE);
    AssignCommand(oPNJ, ActionEquipItem(oRopa, INVENTORY_SLOT_CHEST));
}

En está ultima función tengo un debug especifico lineas 102 a 105, para analizar un PNJ concreto.

 

Ahora paso a poner los datos relevantes de cada PNJ y como funcionan. Las variables están configuradas por defecto en la pestaña avanzada variables:

 

Tipo 1 - 2 burgués. Este PNJ funciona correctamente en todo, animaciones, cabeza al azar, colores de pelo y piel, ropajes, etc...

CABEZA    int     1
NOMBRE    int     1
ROPAS     int     1
sROPAS    string  burg_ma_ropa_00
TIPO_PNJ  int     21

Guardia privado. Este PNJ funciona correctamente en casí todo, animaciones, cabeza al azar, colores de pelo y piel, pero falla en los ropajes.

He comprobado que posee todas las dotes, he comprobado las etiquetas y ResRef, del pnj, de los objetos de armadura, etc...

BUSCAR    int     1
CABEZA    int     1
NOMBRE    int     1
ROPAS     int     1
sROPAS    string  gusg_ma_def_00
TIPO_PNJ  int     30

 

No entiendo porque el guardia, no se pone la armadura, llevo 3 días y repasando esto, variables, resref, etiquetas, etc... y no veo nada.

 

¿A alguien se le ocurre algo.?


Editado por Gonarin, 01 September 2018 - 05:33 PM.

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
  • 68 posts

Posteado 31 August 2018 - 04:44 PM

Añadir los tipos de PNJs que tengo que funcionan y no:

 

Ciudadano

Ciudadana

Campesino

Campesina

Mendigo

Mendiga

Prostituo 

Prostitua

Cocinera

Camarera

Cliente

Clienta

Sereno

Burgues

Burgues femenina

Noble

Noble femenina

Todos estos funcionan correctamente.

 

Guardia privado

Guardia privado femenino

Tendero

Tendera

Estos no funcionan correctamente.

 

Al igual que puse arriba, comprobadas etiquetas, resref y variables, así como dotes para poder ponerse armaduras.

Tendera


JG8WpNH.jpg

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


#3 MenemDoIt

MenemDoIt

    Antediluvian

  • Miembro
  • PipPipPipPipPip
  • 1213 posts

Posteado 31 August 2018 - 04:53 PM

no me he leido los scripts pero entiendo que un NPC se equipa la ropa que deseas y el otro no, ¿verdad?

 

de ser asi creo que el problema debe estar en que un NPC usa una apariencia fisica valida para equipar dicho item y el otro no, cambiale la apariencia fisica por una valida y deberia solucionarse.


10016077DS1515734551.gif


#4 Gonarin

Gonarin

    Humano

  • Miembro
  • Pip
  • 68 posts

Posteado 31 August 2018 - 05:22 PM

Usan la misma apariencia física, en verdad al crearlos en la paleta son Editar copia unos de otros.

 

Después cambio etiqueta, resref, ajusto variables, nivel, dotes, descripción, nombre, etc...

 

Por eso tienen mismo scripts, misma apariencia.

 

Lo primero que pensé fue en el resref de las armaduras, pero he comprobado que están bien.


JG8WpNH.jpg

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


#5 MenemDoIt

MenemDoIt

    Antediluvian

  • Miembro
  • PipPipPipPipPip
  • 1213 posts

Posteado 31 August 2018 - 05:42 PM

deberias empezar por ir sacandole todos los scripts de los eventos al NPC y dejar unicamente el que equipa la ropa, y despues ir agregandolos uno por uno y ver donde esta el problema.

 

por cierto, ¿que evento ejecuta el script que equipa la ropa? si es el OnSpawn puede que sea ese el problema.


Editado por MenemDoIt, 31 August 2018 - 05:43 PM.

10016077DS1515734551.gif


#6 Gonarin

Gonarin

    Humano

  • Miembro
  • Pip
  • 68 posts

Posteado 31 August 2018 - 06:54 PM

Bueno, pues nada, he repasado las áreas que llevo realizadas, PNJs en ellas, etc... y tengo claro:

 

Los pnjs de ruta POST_ WP_ WN_ NIGHT_ etc... es decir iTipo 30, 31, 32 y 33 son los que no se ponen la ropa.

 

He repasado los scripts que afectan a esto, spawn y hearbeat, no encuentro ningún error.

 

Solución fácil y ha seguir el modulo, como estos pnjs tampoco es importante que tengan distintas ropas, llevan por defecto la ropa puesta.

 

Si alguien ve algo en los scripts (Vistos al inicio), revisare lo que e sugieran.


Editado por Gonarin, 31 August 2018 - 07:52 PM.

JG8WpNH.jpg

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


#7 AlthorDeMalavir

AlthorDeMalavir

    Neonato

  • Miembro
  • PipPip
  • 115 posts

Posteado 01 September 2018 - 09:58 AM

Pon el contenido de la función CrearRopaAzar que es la que equipa la ropa.

 

En el script del heartbeat, donde pone esto

 

    if(/*GetLocalInt(OBJECT_SELF, "ROPAS") == 1 &&*/ !GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CHEST)))
        ActionEquipMostEffectiveArmor(); // Si no creo ropa en el Spawn, crearla ahora.

No me parece buena idea dejar al juego decidir que poner, sería mejor equiparla directamente la que tenga en el inventario, pero de todas formas en el onheratbeat no es donde se crea y equipa, así que tampoco importa demasiado.


YourServerList.com Listado de servidores de Minecraft, Neverwinter Nights 1 y 2 y Terraria.


#8 Gonarin

Gonarin

    Humano

  • Miembro
  • Pip
  • 68 posts

Posteado 01 September 2018 - 10:30 AM

En teoría en ese punto, el único equipo que tiene para poner en el SLOT del pecho, es la armadura creada en el spawn y que no se equipo, por lo cual no puede decidir mucho.

 

El comentario

// si no creo ropa en el Spawn, crearla ahora.

Es anterior a probar este método, ahí sería más apropiado:

// Si no equipo la ropa creada, ahora la equipa.

 

De todas maneras, tampoco funciona con eso.


JG8WpNH.jpg

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


#9 MenemDoIt

MenemDoIt

    Antediluvian

  • Miembro
  • PipPipPipPipPip
  • 1213 posts

Posteado 01 September 2018 - 10:40 AM

yo creo que deberias agregar un DelayCommand para crear y equipar la ropa en el evento OnSpawn, de esa forma no deberia hacer falta el OnHeartBeat y la AI por defecto no andaria aplicando los ClearAllActions que evitan que los NPC equipen la ropa.


10016077DS1515734551.gif


#10 Gonarin

Gonarin

    Humano

  • Miembro
  • Pip
  • 68 posts

Posteado 01 September 2018 - 11:06 AM

  • He probado a usar el postspawn y prespawn, para equipar la ropa antes de ejecutar el spwan o después de este. No ha funcionado.
  • He probado a poner un delaycommand de 5.8 y luego 6.2, haciendo en ambos un clearactions primero y luego el equipar. No ha funcionado.
  • He probado a que esos pnjs, en vez de equiparla desde el spawn, lo hagan desde el hbt con variable para lanzarlo una única vez. No ha funcionado.
  • He probado a que esos pnjs, en vez de equiparlo desde el spawn, lo hagan desde el hbt si no tienen nada equipado en pecho, una unica vez. No ha funcionado.
  • He probado que tengan ya la ropa en el inventario y por spawn o hbt, hagan una selección al azar para equipar una. No ha funcionado.
  • He revisado todas las ResRef, Variables, Etiquetas, etc... Todo correcto.
  • He probado a usar ese tipo de ropas en otros PNJs. Si lo equipan y funciona correcto.
  • He probado los iTipo 10, 11, 12, 20, 21, 4 y 99 (Son los valores que uso en otros PNJs) y pasándolos a 30, 31, 32 o 33. Funcionaban bien, pero al cambiarles el iTipo, también fallan.
  • He probado más cosas, pero ya van tantas que no recuerdo todas.

 

Prueba y error, me cansado de ello.

 

:lol:  :D  :lol:  :D

 

El caso es que solo pasa a los iTipos que he indicado (30, 31, 32 y 33), pero por más que repaso todos los scripts de todos los eventos, no tiene nada que condicione a esos PNJs. Nada lo soluciono como puse más arriba, puesto que en estos PNJs era por aprovechar el sistema, en verdad no precisan ropas o armaduras al azar.

 

PD Idea: Mientras escribo esto se me ocurre otra cosa y uso el foro como recordatorio. Los declaro como iTipo 10 mientras se equipan, una vez se equipen, los hago iTipo 30, 31, etc... el que precisen. Haber que pasa, debería funcionar. Esta tarde-noche me pongo con eso, que ahora estoy con otra cosa.

 

PD2: Seguro que lo miro después de dejarlo 2 semanas en el olvido y es una chumina que localizo enseguida. Esto es lo que más me jode.


Editado por Gonarin, 01 September 2018 - 11:09 AM.

JG8WpNH.jpg

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


#11 Gonarin

Gonarin

    Humano

  • Miembro
  • Pip
  • 68 posts

Posteado 01 September 2018 - 11:23 AM

Por cierto los iTipo, para entenderlo mejor, los uso en eventos (HearBeat por ejemplo) para que usando un solo template de la paleta y cambiando su variable iTipo haga una cosa u otra. Son:

 

  • 10 animación inmóvil a su rollo.
  • 11 animación móvil a su rollo.
  • 12 anda al azar.
  • 20 animación inmóvil con un wp de punto central. (Es decir un grupo alrededor de dicho WP)
  • 21 animación móvil como el 20, en un punto central. Si se aleja mucho del WP en vez de animación anda hacia el mismo.
  • 30 usa ruta WP
  • 31 usa ruta POST
  • 32 usa ruta WP y WN
  • 33 usa ruta POST y NIGHT
  • 4 pnjs que son controlados por el hbt del área. Aparecen, hacen una ruta andando y desaparecen. Son puramente ambientales para zonas exteriores y algunas interiores.
  • 99 usos varios a través del evento User Defined o scripts propios.

 

Además uso variables como SENTADO, DORMIR, CHEF (Esta ultima por ejemplo para diferenciar con 0 ayudante, 1 jefe de cocina) para cuestiones obvias.

 

Todo el sistema bien usado me esta dejando una villa, posada-prostibulo, almacenes, tiendas, casas, etc... muy chulos y llenos de vida. Voy probando y ajustando para no recargar el modulo, o que funcionen lo más optimo posible y el único fallo que ha tenido hasta ahora es que estamos viendo en este post.

 

Como estoy de vacaciones, en breve pondré un Post con información, capturas, etc... del modulo.


JG8WpNH.jpg

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


#12 MenemDoIt

MenemDoIt

    Antediluvian

  • Miembro
  • PipPipPipPipPip
  • 1213 posts

Posteado 01 September 2018 - 02:40 PM

en mi opinion el problema esta en los scripts y no en el NWN o en los NPC en este caso en particular, seria cosa de revisar una y otra vez los scripts, ir reduciendolos en numero y funciones y realizar pruebas hasta dar con el problema.


Editado por MenemDoIt, 01 September 2018 - 02:41 PM.

10016077DS1515734551.gif


#13 CrazyMoai

CrazyMoai

    Humano

  • Miembro
  • Pip
  • 53 posts

Posteado 01 September 2018 - 05:09 PM

    if(iTirada < 10)
        sRopasResRef = sRopasResRef + "00" + IntToString(iTirada);
    else if(iTirada < 100 && iTirada > 9)
        sRopasResRef = sRopasResRef + "0" + IntToString(iTirada);
    else if(iTirada > 100)
        sRopasResRef = sRopasResRef + IntToString(iTirada);

Tienes un bug aquí. No cubres que iTirada tenga valor 100.

Por lo demás no se porqué te ocurre lo que te ocurre y apostaria por que el problema está en otros scripts que se llaman despues de crearopas.



#14 Gonarin

Gonarin

    Humano

  • Miembro
  • Pip
  • 68 posts

Posteado 01 September 2018 - 05:32 PM

Gracias, es cierto, debería ser iTirada > 99)

 

Luego lo arreglo en nwn, ahora lo cambio en el post arriba del todo.


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.