Jump to content



Adicionar efeito NPC


SGERfjs

Recommended Posts

800px-Google_Translate_logo.svg.png    Guia para adicionar um efeito no NPC:

 Dlrdds0.gif

Vou usar Lineageeffect.u como base para adicionar o efeito ao NPC.
Primeiramente vamos procurar o ID do NPC ao qual queremos adicionar o efeito (que será um efeito de aura), não tenho um servidor ligado, então não tenho ideia do ID do NPC, entre em modo dev e obtenha as seguintes informações:

aioEUv9.png

Então o que vou procurar no NPCGRP.DAT com o L2FILE EDIT é
"LineageNPCs.a_sanctuary_teacher_MHuman_m00" que seria a malha do NPC.

O que encontrei foi:

7022   LineageNPC.a_sanctuary_teacher_MHuman   LineageNPCs.a_sanctuary_teacher_MHuman_m00   4   LineageNPCsTex.a_sanctuary_teacher_MHuman_m00_t00_b00

O que precisamos editar para adicionar o efeito é LineageNPC.a_sanctuary_teacher_MHuman que seria o script básico.

E onde encontramos? Vamos para System e procuramos o arquivo LineageNPC.u, que seria onde o script seria empacotado.

Em seguida, abriríamos o WOTgreal Package Exporter 

https://mega.nz/file/1pcS2JJB#kqR98ofaetRNRi9ZIAOX6k2GcEniNvEYtWf8SIBJLYI 

e procuraríamos por "a_sanctuary_teacher_MHuman". Por isso:

h1Vj9XR.png

O mesmo programa tem que exportar os scripts

rzde4Yz.png

Ao lado do nome de a_sanctuary_teacher_MHuman há uma caixa para marcar, selecione-a e escolha exportar .uc ou descompilar, é a mesma coisa.

Uma pasta chamada LineageNPC será criada com uma subpasta chamada Classes e o arquivo .uc será salvo dentro

Para a pasta LineageNPC mudamos o nome que queremos coloco "MyNpcEfecto"

Vamos para o .uc dentro do que exportamos.

Teríamos algo assim:

class a_sanctuary_teacher_MHuman extends LineagePawn;

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

Acrescentaríamos o seguinte:

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

Então, seria:

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" é a variável que você cria, eles podem mudar para o que quiserem.

SGERfjs = Spawn(class'PACKAGE.SCRIPT',self); "PACKAGE.SCRIPT" é onde nosso efeito iria, no meu caso seria "Lineageeffect.e_u091_aura" que é o efeito do Herói.

Altere também ControllerClass=Class'HerdNpc' para ControllerClass=Class'LineageNpc.HerdNpc'

Salvaríamos o arquivo .uc.

Baixamos o seguinte compilador https://mega.nz/file/IxNGGZyY#bWHsYzyE7aYVF_PM9qsclNS6POjQcTTqaytmN247fDk

Eles o descompactam em seu cliente interlude em uma subpasta chamada "L2CompilerU" ou o nome que quiserem, mas não dentro da própria pasta L2, mas dentro de uma subpasta.

Vamos para L2CompilerU\system e modificamos L2.ini

Procuramos EditPackages=MyNpcEfecto e alteramos MyNpcEfecto para o nome da pasta onde o .uc está salvo

Então vamos para _make.bat e clicamos e ele começará a compilar tudo.

wFcMv2x.png

O arquivo ".u" é criado, nós o movemos para o sistema do nosso cliente e no NPCGRP.DAT mudaríamos LineageNPC.a_sanctuary_teacher_MHuman por MyNpcEffect.a_sanctuary_teacher_MHuman

O resultado seria:

jGAl2in.png

Para mover o efeito para o estômago e torná-lo centralizado, iríamos ao nosso .uc e adicionaríamos:
SGERfjs.SetRelativeLocation(vect(0.00,0.00,0.00)); nós o adicionamos abaixo de SGERfjs.SetBase(self);

Vamos modificar o terceiro valor vector(0.00,0.00,0.00) que seria a seta verde na imagem.

Com 12 ou 23 aproximadamente acho que ficaria bem no NPC.

Compilamos tudo novamente, levando em conta que excluímos o .u do L2CompilerU\system porque senão as alterações não são salvas.

E para que o NPC não fique estático, criaríamos um arquivo .int com o nome do .u, no meu caso, MyNpcEfecto.int e dentro devemos adicionar:

[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

Eu tirei isso do lineagenpc.int

Deixei o efeito acima da cabeça xD, acho que com metade de 23 ficaria bom.

Dlrdds0.gif

Se quisermos adicionar mais de um efeito no mesmo eixo, devemos criar uma variável e duplicar as expressões e condições, por exemplo:

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
}

No caso de querermos que o efeito comece em um determinado local, ou seja, atribuí-lo para iniciar em um osso mudaria isso:

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 isto:

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

E se quisermos que mais efeitos apareçam em ossos diferentes, é duplicar as expressões e condições, trocando-as por uma nova variável.

  • Like 3
  • I love it 1
Link to comment
Share on other sites

2 horas atrás, SGERfjs disse:

 

Muito obrigado SGERfjs, pelos tutoriais amigo, são de grande valor para a comunidade!

Se possível, faça um sobre como adaptar NPC's de outras crônicas para interlude, pois eu acredito que falte um BOM tutorial sobre isso na forum!

 

Edited by Marlon
  • Like 1
Link to comment
Share on other sites

  • Join now

    Be part of the largest and oldest communities about Lineage2 in Latin America.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.