Agregar efectos al NPC Interlude (La base es lo mismo para todas las versiones)

Iniciado por Flavio, Ene 25, 2025, 02:35 PM

Tema anterior - Siguiente tema
Guía para añadir un efecto al NPC



Voy a usar Lineageeffect.u como base para añadir el efecto al NPC.
Primero, buscaremos el ID del NPC al que queremos agregar el efecto (que será un efecto de aura). No tengo un servidor conectado, así que no tengo idea del ID del NPC. Entra en modo dev y obtén la siguiente información:



Entonces, lo que voy a buscar en NPCGRP.DAT con el L2FILE EDIT es:
"LineageNPCs.a_sanctuary_teacher_MHuman_m00", que sería la malla del NPC.

Lo que encontré fue:

7022 LineageNPC.a_sanctuary_teacher_MHuman LineageNPCs.a_sanctuary_teacher_MHuman_m00 4 LineageNPCsTex.a_sanctuary_teacher_MHuman_m00_t00_b00

Lo que necesitamos editar para añadir el efecto es LineageNPC.a_sanctuary_teacher_MHuman, que sería el script básico.

¿Y dónde lo encontramos? Vamos a la carpeta System y buscamos el archivo LineageNPC.u, que es donde se empaquetaría el script.

Luego, abriríamos el WOTgreal Package Exporter (puedes descargarlo aquí: enlace de descarga) y buscaríamos "a_sanctuary_teacher_MHuman". Eso es lo que necesitamos para continuar.



El mismo programa, WOTgreal Package Exporter, también debe exportar los scripts.

Después de buscar "a_sanctuary_teacher_MHuman", el programa te permitirá exportar los scripts asociados a ese NPC. Estos scripts incluirán los datos necesarios para agregar el efecto al NPC.



Al lado del nombre a_sanctuary_teacher_MHuman, hay una caja para marcar. Selecciónala y elige exportar .uc o descompilar, ya que es lo mismo.

Se creará una carpeta llamada LineageNPC, con una subcarpeta llamada Classes, y el archivo .uc se guardará dentro de esta.

Para la carpeta LineageNPC, cambiamos el nombre a lo que queramos, por ejemplo, "MyNpcEfecto".

Ahora, vamos al archivo .uc dentro de lo que exportamos.

Tendríamos algo así:

class a_sanctuary_teacher_MHuman extends LineagePawn;

defaultproperties
{
    bFaceRotation=True
    GroundSpeed=120.00
    ControllerClass=Class'HerdNpc'
    CollisionRadius=8.00
    CollisionHeight=23.00
}

Agregaríamos lo siguiente:

var Emitter SGERfjs;

simulated function PostBeginPlay()
{
Super.PostBeginPlay();

SGERfjs = Spawn(class'PACKAGE.SCRIPT',self);
  if ( SGERfjs != None )
  {
SGERfjs.SetBase(self);
}
}


simulated event Detach(Actor Other )
{
if(SGERfjs == Other)
SGERfjs = None;

Super.Detach(Other);
}

simulated event ClearL2Game()
{
if(SGERfjs != None)
{
SGERfjs.NDestroy();
SGERfjs=None;
}
}

simulated function Destroyed()
{
Super.Destroyed();
ClearL2Game();
}

simulated event LostChild( Actor Other )
{
if(SGERfjs == Other)
SGERfjs = None;
}

Quedaría entonces así:

class a_sanctuary_teacher_MHuman extends LineagePawn;

var Emitter SGERfjs;

simulated function PostBeginPlay()
{
Super.PostBeginPlay();

SGERfjs = Spawn(class'FX_NPC00.h_g_ranking_archerr_ta',self);
  if ( SGERfjs != None )
  {
SGERfjs.SetBase(self);
    SGERfjs.SetRelativeLocation(vect(0.00,0.00,-25.00));
}
}


simulated event Detach(Actor Other )
{
if(SGERfjs == Other)
SGERfjs = None;

Super.Detach(Other);
}

simulated event ClearL2Game()
{
if(SGERfjs != None)
{
SGERfjs.NDestroy();
SGERfjs=None;
}
}

simulated function Destroyed()
{
Super.Destroyed();
ClearL2Game();
}

simulated event LostChild( Actor Other )
{
if(SGERfjs == Other)
SGERfjs = None;
}

defaultproperties
{
    bFaceRotation=True
    GroundSpeed=120.00
    ControllerClass=Class'LineageNpc.HerdNpc'
    CollisionRadius=8.00
    CollisionHeight=23.00
}

"SGERfjs" es una variable que puedes crear, y puedes cambiarla al nombre que desees.

SGERfjs = Spawn(class'PACKAGE.SCRIPT',self);

"PACKAGE.SCRIPT" es donde irá nuestro efecto, en mi caso sería "Lineageeffect.e_u091_aura", que es el efecto del héroe.

También debes cambiar: ControllerClass=Class'HerdNpc'
por: ControllerClass=Class'LineageNpc.HerdNpc'

Una vez hechos estos cambios, guarda el archivo .uc.

Luego, descarga el compilador desde el siguiente enlace: Descargar compilador.

Descomprime este compilador en tu cliente Interlude, en una subcarpeta llamada "L2CompilerU" (o el nombre que prefieras), pero no dentro de la carpeta L2. Debe ser dentro de una subcarpeta.

Después, vamos a la carpeta L2CompilerU\system y modificamos el archivo L2.ini.

Busca EditPackages=MyNpcEfecto y cambia MyNpcEfecto por el nombre de la carpeta donde guardaste el archivo .uc.

Luego, abre el archivo _make.bat, haz clic en él y comenzará a compilar todo.

Este proceso debería permitirte compilar y aplicar correctamente el efecto al NPC.



El archivo .u es creado, y lo movemos al sistema de nuestro cliente. Luego, en el NPCGRP.DAT, cambiamos LineageNPC.a_sanctuary_teacher_MHuman por MyNpcEffect.a_sanctuary_teacher_MHuman.

El resultado sería que el NPC ahora tiene asociado el efecto que hemos creado, y el script se aplicaría correctamente al NPC, mostrándolo con el efecto visual (como el aura, en este caso) cuando sea necesario dentro del juego.



Para mover el efecto hacia el estómago y hacerlo centralizado, iríamos al archivo .uc y agregaríamos la siguiente línea: SGERfjs.SetRelativeLocation(vect(0.00,0.00,0.00));
Colocamos esto debajo de: SGERfjs.SetBase(self);
Luego, modificamos el tercer valor del vector (0.00, 0.00, 0.00), que representa la posición en la que queremos mover el efecto (sería la flecha verde en la imagen).

Probemos con valores como 12 o 23 aproximadamente, que creo que quedarán bien ubicados en el NPC.

Después, volvemos a compilar todo, pero no olvidemos excluir el archivo .u de la carpeta L2CompilerU\system, porque si no lo hacemos, las modificaciones no se guardarán correctamente.

Para evitar que el NPC se quede estático, creamos un archivo .int con el mismo nombre que el .u, en mi caso, MyNpcEfecto.int, y dentro de este archivo debemos agregar lo siguiente:

[a_sanctuary_teacher_MHuman]
WaitAnimName[0]=wait_1HS
AtkWaitAnimName[0]=wait_1HS
RunAnimName[0]=run_1HS
WalkAnimName[0]=walk_1HS
DeathAnimName[0]=death_Hand
DeathWaitAnimName[0]=DeathWait_Hand
CastShortAnimName[0]=wait_1HS
CastEndAnimName[0]=wait_1HS
MagicShotAnimName[0]=magic02_1HS
MagicThrowAnimName[0]=magic02_1HS
MagicNoTargetAnimName[0]=magic02_1HS
CastMidAnimName[0]=wait_1HS
CastLongAnimName[0]=wait_1HS

WaitAnimName[1]=wait_1HS
AtkWaitAnimName[1]=wait_1HS
RunAnimName[1]=run_1HS
WalkAnimName[1]=walk_1HS
DeathAnimName[1]=death_Hand
DeathWaitAnimName[1]=DeathWait_Hand
CastShortAnimName[1]=wait_1HS
CastEndAnimName[1]=wait_1HS
MagicShotAnimName[1]=magic02_1HS
MagicThrowAnimName[1]=magic02_1HS
MagicNoTargetAnimName[1]=magic02_1HS
CastMidAnimName[1]=wait_1HS
CastLongAnimName[1]=wait_1HS

NpcSocialAnimName[0]=social01
NpcSocialAnimName[1]=spwait01
NpcSocialAnimName[2]=spwait01

Saqué esto del lineagenpc.int.
Puse el efecto encima de la cabeza xD, creo que con la mitad de 23 quedaría bien.



Si queremos agregar más de un efecto en el mismo eje, debemos crear una nueva variable y duplicar las expresiones y condiciones. Por ejemplo:

Creamos una nueva variable para el segundo efecto, como:
SGERfjs2 = Spawn(class'PACKAGE.SCRIPT2', self);
Añadimos las mismas condiciones que utilizamos para el primer efecto, pero usando la nueva variable SGERfjs2.

Modificamos las posiciones y los valores de SetRelativeLocation para que los efectos se ubiquen correctamente en el mismo eje o en posiciones cercanas.

Esto permite que varios efectos sean aplicados de manera simultánea, manteniendo la coherencia en las posiciones relativas y la sincronización en el NPC.