Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Adicionar efecto a un Npc

Iniciado por mikado, Ago 18, 2022, 08:40 PM

Tema anterior - Siguiente tema

mikado



Usaré Lineageeffect.u como base para agregar el efecto al NPC.
Primero busquemos el ID del NPC al que le 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 dev modo y obtener la siguiente información:




Entonces, lo que voy a buscar en NPCGRP.DAT con L2FILE EDIT es "LineageNPCs.a_sanctuary_teacher_MHuman_m00" , que es 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 agregar el efecto es LineageNPC.a_sanctuary_teacher_MHuman, que sería el script básico.

¿Y dónde lo encontramos? Vamos a System y buscamos el archivo LineageNPC.u, que sería donde estaría empaquetado el script.

Luego abriríamos el exportador de paquetes WOTgreal
Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

y buscaríamos 'a_sanctuary_teacher_MHuman'. Por eso:


El mismo programa tiene que exportar los scripts.


Junto al nombre de a_sanctuary_teacher_MHuman hay una casilla de verificación, selecciónela y elija exportar .uc o descompilar, es lo mismo.

Se creará una carpeta llamada LineageNPC con una subcarpeta llamada Clases y el archivo .uc se guardará dentro

Para la carpeta LineageNPC le cambiamos el nombre que le queremos poner 'MyNpcEfecto'

Vamos al .uc dentro de lo que exportamos.

Tendríamos algo como esto:

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;
}

Así sería:

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 creas, pueden cambiarla a lo que quieran.

SGERfjs = Spawn(class'PACKAGE.SCRIPT',self); 'PACKAGE.SCRIPT' es donde iría nuestro efecto, en mi caso sería 'Lineageeffect.e_u091_aura' que es el efecto Hero.

También cambie ControllerClass=Class'HerdNpc' a ControllerClass=Class'LineageNpc.HerdNpc'

Guardaríamos el archivo .uc.

Descargamos el siguiente compilador Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Lo descomprimen en su cliente intermedio en una subcarpeta llamada 'L2CompilerU' o el nombre que quieran, pero no dentro de la carpeta L2 en sí, sino dentro de una subcarpeta.

Vaya a L2CompilerUsystem y modifique L2.ini

Buscamos EditPackages=MyNpcEfecto y cambiamos MyNpcEfecto por el nombre de la carpeta donde se guarda el .uc

Así que vamos a _make.bat y hacemos clic y comenzará a compilar todo.



Se crea el archivo '.u', lo movemos al sistema de nuestro cliente y en NPCGRP.DAT cambiaríamos LineageNPC.a_sanctuary_teacher_MHuman a MyNpcEffect.a_sanctuary_teacher_MHuman

El resultado sería:



Para mover el efecto al estómago y hacerlo centrado iríamos a nuestro .uc y agregaríamos:
SGERfjs.SetRelativeLocation(vect(0.00,0.00,0.00)); lo hemos agregado debajo de SGERfjs.SetBase(self);

Modifiquemos el tercer vector de valor (0.00,0.00,0.00) que sería la flecha verde en la imagen.

Con 12 o 23 aproximadamente creo que quedaría bien en el NPC.

Volvemos a compilar todo, teniendo en cuenta que excluimos los .u del L2CompilerUsystem porque sino no se guardan los cambios.

Y para que el NPC no sea estático, crearíamos un archivo .int con el nombre del .u, en mi caso, Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate y dentro debemos agregar:

[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

Tomé esto de Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Dejé el efecto arriba de la cabeza xD, creo que con la mitad de 23 estaría bien.



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

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
}

En caso de que queramos que el efecto comience en una ubicación determinada, es decir, asignarlo para que comience en un hueso cambiaría esto:

  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

        Effect0 = Spawn(Class'effect.my_effect',self,'None',Location,Rotation);
if ( Effect0 != None )
{
AttachToBone(Effect0,'name_of_bone');
Effect0.SetRelativeLocation(vect(0.00,0.00,0.00));
}


Y si queremos que aparezcan más efectos sobre diferentes huesos es duplicar las expresiones y condiciones, reemplazándolas por una nueva variable.


CREDITOS:
SGERfjs