Autor Tema: IL Como agregar EFECTOS a un NPC.  (Leído 172 veces)

Febrero 19, 2022, 11:36:32 am
Esta guía les diré como agregar un efectos a el NPC. Usare de base Lineageeffect.u para agregarle al NPC el efecto.
Primero que nada buscaremos el ID al NPC que queramos agregar el efecto (que sera un aura el efecto), yo no tengo un server on, así que ni idea el ID del NPC, entre en modo dev y saque la siguiente info:


todo fachero facherito

Entonces lo que buscare en el NPCGRP.DAT con el L2FILE EDIT es
"LineageNPCs.a_sanctuary_teacher_MHuman_m00" que seria la mesh 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   LineageNPCsTex.a_sanctuary_teacher_MHuman_m00_t00_b01   LineageNPCsTex.a_sanctuary_teacher_MHuman_m00_t00_f   LineageNPCsTex.a_sanctuary_teacher_MHuman_m00_t00_h      0         1   0                        1.00000000   0   3   ItemSound.fist_1   ItemSound.fist_2   ItemSound.fist_3   5   ItemSound.armor_leather_1   ItemSound.armor_leather_3   ItemSound.armor_leather_4   ItemSound.armor_leather_6   ItemSound.armor_leather_8   3   ChrSound.MNpc_Fighter_Dmg_1   ChrSound.MNpc_Fighter_Dmg_2   ChrSound.MNpc_Fighter_Dmg_3   1   1   0                                                      19   19   LineageEffect.p_u002_a   0   50.00000000   250.00000000   70.00000000   1   0

Lo que necesitamos editar para agregar el efecto es LineageNPC.a_sanctuary_teacher_MHuman que seria el script básico para que el personaje tenga "vida".
Y donde lo encontramos?
Vamos a System y buscamos el archivo LineageNPC.u que seria donde estaría empaquetado el script.
Luego abrimos el WOTgreal Package Exporter https://mega.nz/file/1pcS2JJB#kqR98ofaetRNRi9ZIAOX6k2GcEniNvEYtWf8SIBJLYI y buscaríamos "a_sanctuary_teacher_MHuman". Asi:

1. Elegimos la ruta del system
2. Nos muestra los .u que tenemos y buscamos en particular nuestro .u
3. Muestra los scripts que tenga el .u
4. Seleccionamos el que queremos
5. Muestra lo que tiene el script
El mismo programa tiene para exportar los script

Al lado del nombre de a_sanctuary_teacher_MHuman trae un cuadrito para marcar, lo seleccionan y eligen export .uc o decompile, es lo mismo.
Se nos creara una carpeta llamada LineageNPC con una subcarpeta llamada Classes y dentro se guardaría el archivo .uc
A la carpeta LineageNPC le cambiamos el nombre que queramos yo puse "MyNpcEfecto"
Vamos al .uc dentro de lo que exportamos.
Nos saldría algo así:

Código: [Seleccionar]
class a_sanctuary_teacher_MHuman extends LineagePawn;

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

Nosotros agregaríamos lo siguiente:

Código: [Seleccionar]
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;
}

Entonces, quedaría:

Código: [Seleccionar]
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 la variable que cree, pueden cambiar a la que quieran.
SGERfjs = Spawn(class'PACKAGE.SCRIPT',self); "PACKAGE.SCRIPT" es donde iría nuestro efecto en mi caso seria "Lineageeffect.e_u091_aura" que es el efecto del Hero.
También cambie ControllerClass=Class'HerdNpc' por ControllerClass=Class'LineageNpc.HerdNpc'
Guardaríamos el archivo .uc.
Descargamos el siguiente compilador:
https://mega.nz/file/IxNGGZyY#bWHsYzyE7aYVF_PM9qsclNS6POjQcTTqaytmN247fDk
Lo descomprimen en su cliente de interlude en una subcarpeta llamada "L2CompilerU" o el nombre que quieran, pero no dentro del propia carpeta de L2 sino dentro de una subcarpeta.
Vamos a L2CompilerU\system y modificamos L2.ini
Buscamos EditPackages=MyNpcEfecto y cambiamos MyNpcEfecto por el nombre de su carpeta donde esta guardado el .uc
Luego vamos a _make.bat y damos click y empezara a compilar todo.
Se nos compila todo OK.

Se crea un archivo en el system .u, el nuestro, lo moveríamos al system de nuestro cliente y en NPCGRP.DAT cambiaríamos
LineageNPC.a_sanctuary_teacher_MHuman por MyNpcEfecto.a_sanctuary_teacher_MHuman
El resultado seria:
RE DURO EL NPC
Para mover a efecto al estomago y quede como centrado iríamos a nuestro .uc y agregaríamos:
SGERfjs.SetRelativeLocation(vect(0.00,0.00,0.00));
lo agregamos debajo de SGERfjs.SetBase(self);
modificaríamos el tercera valor vect(0.00,0.00,0.00) que seria la flecha verde en la imagen.
Con 23 creo que se vería bien en mi NPC.
Volveríamos a compilar todo, teniendo en cuenta que borramos el .u del L2CompilerU\system porque sino no se guardan los cambios.
Y para que no se vea duro el NPC crearíamos un archivo .int con el nombre del .u, en mi caso, MyNpcEfecto.int y dentro deberíamos agregar:
Código: [Seleccionar]
[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

Esto lo saque del lineagenpc.int
El resultado seria:

quedo el efecto arriba de la cabeza xD, supongo que con la mitad de 23 quedaría bien.



Respuesta #1 Febrero 25, 2022, 04:55:19 pm
Si queremos agregar mas de un efecto en el mismo eje deberíamos de crear un variable y duplicar las expresiones y condiciones por ejemplo:

Código: [Seleccionar]
class a_sanctuary_teacher_MHuman extends LineagePawn;

var Emitter efectoUno;
var Emitter efectoDos;

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

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

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


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

Super.Detach(Other);
}

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

if(efectoDos != None)
{
efectoDos.NDestroy();
efectoDos=None;
}
}

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

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

if(efectoDos == Other)
efectoDos = None;
}

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


Respuesta #2 Febrero 25, 2022, 05:02:26 pm
En el caso que queramos que el efecto en empiece en un determinado lugar, es decir, asignar para que empiece en un hueso seria cambiar esto:
Código: [Seleccionar]
efectoUno = Spawn(class'FX_NPC00.h_g_ranking_archerr_ta',self);
  if ( efectoUno != None )
  {
efectoUno.SetBase(self);
    efectoUno.SetRelativeLocation(vect(0.00,0.00,-25.00));
}

por esto:

Código: [Seleccionar]
Effect0 = Spawn(Class'viRUS_Effect08',self,'None',Location,Rotation);
if ( Effect0 != None )
{
AttachToBone(Effect0,'Aca_iria_el_nombre_del_hueso');
Effect0.SetRelativeLocation(vect(0.00,0.00,0.00));
}
Y si queremos que aparezcan mas efectos en diferentes huesos es duplicar las expresiones y condiciones, cambiándole por una variable nueva.


Respuesta #3 Marzo 29, 2022, 06:56:03 pm
thank you!! i work fine with (0.00,0.00, 13.00)