[Guia] Custom Skills
Ya, que a la mayoria le interesa, el como crear nuevas skills, aqui les dejo esta pequeña guia que ire ampliando poco a poco.
Realizada por: CrislexDescriptcion.-Esta guia explica, de una forma censilla el como crear nuevas skill(se hara una Skill Cencilla pero funcional), para un entendimiento mas practico, la guia se dividira en tres Partes:
- Agregando la Skill en el Codigo fuente del emulador
- Agregando la Skill a los archivos del servidor
- Implementacion de la Skill en el Cliente
Requisitos y Materiales a usar.-Los requisitos y Materiales seran expuestos, al inicio de cada Parte.
[Parte 1] Agregando la Skill en el Codigo fuente del EmuladorRequisitos.-- Conocimientos Basicos de programacion
- Conocimientos de Compilacion en Cygwing
- Pasiencia y Dedicacion
Materiales.-- Compilador Cygwin
- Visual C++, para editar el codigo fuente(aunque cualquier editor de texto sirve)
Nota: Si no tienes Conocimientos en Programacion, o Compilacion con Cygwin pero aun asi te interesa el Tema. checa este par de enlaces:
Tutorial basico de C++Guia de Compilacion en Cygwing Introduccion.-Agregar una nueva Skill, no es mas complicado que agregar un NPC, o una Clase Custom, basta con seguir la guia.
[Parte 1.1] Skill Summon SlayerHuum, pues la Skill tiene un nombre interesante(esperemos les agrade su funcion), primero que nada, vamos a ampliar el Numero maximo de la
Skill_db, para esto abriremos el archivo
skill.h.
Ruta: Src\map\skill.hEn este archivo buscamos la siguiente linea:
[COLOR=Red]#define MAX_SKILL_DB 1100[/COLOR]
y le agregamos unos cuantos espacios mas(no me gusta quedarme sin espacio):
[COLOR=Blue] #define MAX_SKILL_DB 1300[/COLOR]
En el mismo archivo Buscamos lo Siguiente:
[B] KN_CHARGEATK = 1001,
CR_SHRINK,
AS_SONICACCEL,
AS_VENOMKNIFE,
RG_CLOSECONFINE,
WZ_SIGHTBLASTER,
SA_CREATECON,
SA_ELEMENTWATER,
HT_PHANTASMIC,
BA_PANGVOICE,
DC_WINKCHARM,
BS_UNFAIRLYTRICK,
BS_GREED,
PR_REDEMPTIO,
MO_KITRANSLATION,
MO_BALKYOUNG,
SA_ELEMENTGROUND,
SA_ELEMENTFIRE,[/B]
[COLOR=Red][B] SA_ELEMENTWIND, [/B][/COLOR]
y despues del elemento Señalado con
Rojo, agregamos nuestra nueva Skill:
[B] KN_CHARGEATK = 1001,
CR_SHRINK,
AS_SONICACCEL,
AS_VENOMKNIFE,
RG_CLOSECONFINE,
WZ_SIGHTBLASTER,
SA_CREATECON,
SA_ELEMENTWATER,
HT_PHANTASMIC,
BA_PANGVOICE,
DC_WINKCHARM,
BS_UNFAIRLYTRICK,
BS_GREED,
PR_REDEMPTIO,
MO_KITRANSLATION,
MO_BALKYOUNG,
SA_ELEMENTGROUND,
SA_ELEMENTFIRE,
[COLOR=Red] SA_ELEMENTWIND,[/COLOR]
[COLOR=Blue] NSC_SUMMONSLAYER,[/COLOR][/B] [COLOR=DarkGreen]//El numero de nuestra Skill es 1020[/COLOR]
Nota: NSC(Nueva Skill Custom), no es mas ke un identificador que le doy, para que no cause conflictos, en caso de haber otra Skill llamada
SUMMONSLAYER, ademas suelen ser las iniciales del job al que pertenece la Skill).
Con esto ya dimos de alta el identificador de nuestra Custom Skill y el numero que tendra es
1020 que es el consecutivo de
SA_ELEMENTWIND(
1019), ahora solo Guardamos y cerramos el archivo.
Nota: Usar un id de Skill Consecutivo como el que semuestra [Parte 1.2] Que hace SummonSlayer?Summon Slayer, es una Skill de 5 niveles que invocara un mob(Mob segun nivel de la skill), para ayudar al player.
Para hacer posible esta skill, añadiremos una varible a la structura
map_session_data.Abrimos el archivo
map.h,
Ruta: src\map\map.hy Buscamos lo siguiente:
[B][COLOR=Red]char away_message[128];[/COLOR][/B]
Este es el ultimo elemento de la Estructura map_session_data, y debajo debajo de este pondremos nuestra variable asi:
[COLOR=Red][B] char away_message[128];[/B][/COLOR]
[B][COLOR=Blue] struct mob_data *Slayer;[/COLOR][/B]
La Varibale Slayer, sera la contenedora de nuestro mob, (sin esta variable no es posible determinar a que player pertenece, cada mob invocado, pormedio de la skill) guardamos y cerramos el archivo
map.h.
Ahora se hara la funcion que invocara a nuestro mob, para esto abriremos el archivo
skill.c Ruta: src\map\skill.cAñadimos la Skill Custom, a la Lista de Skills(
skill_name_db skill_names[]) para que el emulador la reconosca, para eso buscamos la siguiente linea:
[B][COLOR=Red] { SA_SUMMONMONSTER, "SA_SUMMONMONSTER", "Monster_Chant" } ,[/COLOR][/B]
Y debajo de esa linea, añadimos nuestra Skill:
[COLOR=Red][B] { SA_SUMMONMONSTER, "SA_SUMMONMONSTER", "Monster_Chant" } ,[/B][/COLOR]
[B][COLOR=Blue] { NSC_SUMMONSLAYER, "NSC_SUMMONSLAYER", "Summon_Slayer" } ,[/COLOR][/B]
En el mismo archivo pondremos el Codigo de nuestra skill en esta Funcion
skill_castend_nodamage_id(ya que nuestra skill no hace daño, solo invoca a un mob), buscamos el siguiente codigo:
Codigo:
[B][COLOR=Red][COLOR=Black] case SA_COMA:
clif_skill_nodamage(src,bl,skillid,skilllv,sc_start(bl,type,100,skilllv,skill_get_time2(skillid,skilllv)));[/COLOR]
break;[/COLOR][/B]
y Justo despues del
break; ponemos el codigo de nuestra skill
Codigo:
[COLOR=Blue] case NSC_SUMMONSLAYER:[/COLOR]
[COLOR=Red][B] {[/B][/COLOR] [COLOR=DarkGreen]/*Se abre llave de codigo para poder declarar Variables*/[/COLOR]
[COLOR=Blue] int duration=30;[/COLOR] [COLOR=DarkGreen]/*Duracion de nuetro mob invocado, en minutos*/[/COLOR]
[COLOR=Blue] int Slayers[5] = { 1031, 1193, 1275, 1716, 1219 };[/COLOR] [COLOR=DarkGreen]/*Ids de los mob que puede invocar la skill*/[/COLOR]
[COLOR=Blue]clif_skill_nodamage(src,bl,skillid,skilllv,1);[/COLOR] [COLOR=DarkGreen]/*Configuracion de parametros de la skill*/[/COLOR]
[COLOR=Blue]if (&sd->Slayer->bl==0)[/COLOR] [COLOR=DarkGreen]/*Verifica si hay un mob invocado*/[/COLOR]
[COLOR=Blue][B]{}[/B][/COLOR]
[COLOR=Blue][B]else[/B]
[B]{[/B][/COLOR]
[COLOR=Blue]status_zap(&sd->Slayer->bl,sd->Slayer->status.hp, 0);[/COLOR] [COLOR=DarkGreen]/*Si ya hay un mob invocado lo matamos*/[/COLOR]
[B][COLOR=Blue]}[/COLOR][/B]
[COLOR=DarkGreen] /*Cargamos en la variable Slayer datos de spawn del mob(mapa, cordenadas, nombre,etc)*/[/COLOR]
[COLOR=Blue]sd->Slayer = mob_once_spawn_sub(&sd->bl, sd->bl.m, -1, -1, "Slayer", [/COLOR][COLOR=Blue]Slayers[skilllv-1][/COLOR][COLOR=Blue], "");[/COLOR]
[COLOR=Blue] if(sd->Slayer)[/COLOR]
[COLOR=Blue][B]{ [/B][/COLOR] [COLOR=DarkGreen]/*Carga de Datos del mob*/[/COLOR]
[COLOR=Blue]sd->Slayer->master_id=sd->bl.id;[/COLOR] [COLOR=DarkGreen]/*Se indica el Id del invocador*/[/COLOR]
[COLOR=DarkGreen]/*Se indica Inteligencia del mob*/[/COLOR]
[COLOR=Blue]sd->Slayer->special_state.ai=1;[/COLOR]
[COLOR=DarkGreen]/*Se inicializa el contador de tiempo de vida del mob*/ [/COLOR]
[COLOR=Blue]sd->Slayer->deletetimer=add_timer(gettick()+(duration*60000),mob_timer_delete,sd->Slayer->bl.id,0);[/COLOR]
[COLOR=Blue]clif_misceffect2(&sd->Slayer->bl,344);[/COLOR] [COLOR=DarkGreen]/*Se usa efecto de invocacion*/[/COLOR]
[COLOR=Blue]mob_spawn(sd->Slayer); [/COLOR][COLOR=DarkGreen]/*Invocamos al mob, usando los datos que estan cargados en Slayer*/[/COLOR]
[COLOR=Blue]sc_start4(&sd->Slayer->bl, SC_MODECHANGE, 100, 1, 0,[/COLOR] [COLOR=Blue]MD_AGGRESSIVE, 0, (duration*60000));[/COLOR] [COLOR=DarkGreen]/*Cargamos los modos de la ia del Mob*/[/COLOR]
[B][COLOR=Blue]}[/COLOR][/B]
[COLOR=Red][B] }[/B][/COLOR] [COLOR=DarkGreen]/*Se cierra la llave de codigo*/[/COLOR]
[COLOR=Blue] break;[/COLOR]
Con este pequeño codigo invocamos a nuestro Slayer que ayudara a su invocador, Solo se podra invocar 1 a la vez(
los mobs invocados, Dropearan items cuando mueran, asi que recomiendo usen mobs que no tengan dropeo, o Copias de los mobs sin dropeo, para evitar abusos de los players).
Guardamos y Cerramos el archivo, Con esto termina la
parte 1, ya solo se Compila para que los cambios sean efectivos.
[Parte 2] Agregando la Skill a los archivos del servidorBien ya que creamos la Skill en el codigo fuente y compilamos, ahora tenemos que dar de alta la skill en las bases de datos del emulador, para asi poder asignarla a un Job.
Requisitos.-- Conocimiento del archivo skill_require_db.txt
- Conocimiento del archivo skill_tree.txt
- Conocimiento del archivo skill_db.txt
Materiales.- [Parte 2.1] Configurar los requisitos de uso de la SkillLa Skill ha sido creada Exitosamente pero aun nos falta una parte importante, Agregarla al Archivo:
skill_db.txt Ruta: db\skill_db.txtBuscamos la siguiente linea:
[COLOR=Red]1019,9,6,1,4,1,0,1,1,yes,0,1,0,magic,0 [/COLOR][COLOR=DarkGreen]//SA_ELEMENTWIND#Elemental Change Wind#[/COLOR]
y debajo de ella agregamos nuestra skill:
[COLOR=Red]1019,9,6,1,4,1,0,1,1,yes,0,1,0,magic,0[/COLOR] [COLOR=DarkGreen]//SA_ELEMENTWIND#Elemental Change Wind#[/COLOR]
[COLOR=Blue]1020,0,6,4,0,1,0,5,1,yes,0,2,0,magic,0 [/COLOR]
ahora vamos a configurar sus requisitos de uso(
consumo de SP,Catalizadores, Cast,etc.), para configurar sus Requisitos de uso abriremos el archivo
skill_require_db.txt. Ruta: db\skill_require_db.txtBuscamos la siguiente linea:
[COLOR=Red] 1019,0,0,30,0,0,0,99,0,0,none,0,12117,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0[/COLOR] [COLOR=DarkGreen]//SA_ELEMENTWIND[/COLOR]
y debajo de esa ponemos lo que la skill requiere para su uso:
[COLOR=Red] 1019,0,0,30,0,0,0,99,0,0,none,0,12117,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0[/COLOR] //SA_ELEMENTWIND
[COLOR=Blue] 1020,[B][COLOR=DarkRed]1000:900:800:700:600[/COLOR][/B],[/COLOR][COLOR=Blue]0,[/COLOR][COLOR=Blue][B][COLOR=DarkGreen]60:70:80:90:100[/COLOR][/B],0,0,0,0,0,0,none,0,[B][COLOR=Purple]604:604:604:604:604[/COLOR][/B],[B][COLOR=DarkOrange]1:1:1:1:1[/COLOR][/B],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0[/COLOR] [COLOR=DarkGreen]//Summon Slayer[/COLOR]
Las partes
Multicolor, son los requisitos que pide la skill para poder ser usada los cuales se descriven acontinuacion:
- 1000:900:800:700:600.-Sacrificio de Hp, Segun el nivel de la Skill(a lvl1:1000 de Hp,,,,,lvl5:600 de hp)
- 60:70:80:90:100.-coste de SP segun el nivel de la Skill( a lvl1:60 de Sp,,,,,lvl5:100 de Sp)
- 604:604:604:604:604.- Item que consume la Skill segun su nivel(para todos los niveles consume Deaht Branch)
- 1:1:1:1:1.- Cantidad del Item que consume la skill(para todos los niveles consume 1 item)
Guardamos y cerramos, con esto ya se ha configurado los requisitos de la skill, bien ahora a que Job le pondremos la Skill???
Abrimos el archivo
skill_tree.txt Ruta db\skill_tree.txtBuscamos el siguiente codigo:
[COLOR=Black][B] 4009,79,10,12,1,78,1,77,3,0,0,0,0 //PR_MAGNUS#Magnus Exorcismus#
4009,1014,1,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#Redemptio#
4009,361,5,33,1,9,3,66,3,0,0,0,0 //HP_ASSUMPTIO#Assumptio#
4009,362,5,75,2,9,1,73,3,0,0,0,0 //HP_BASILICA#Basilica#
4009,363,10,68,3,9,5,76,5,0,0,0,0 //HP_MEDITATIO#Meditatio#
4009,481,5,65,10,23,10,0,0,0,0,0,0 //HP_MANARECHARGE#Mana Recharge#[/B][/COLOR]
[COLOR=Red][B] 4009,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#[/B][/COLOR]
y debajo de la ultima linea pondremos la de nuestra skill:
[B] 4009,79,10,12,1,78,1,77,3,0,0,0,0 //PR_MAGNUS#Magnus Exorcismus#
4009,1014,1,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#Redemptio#
4009,361,5,33,1,9,3,66,3,0,0,0,0 //HP_ASSUMPTIO#Assumptio#
4009,362,5,75,2,9,1,73,3,0,0,0,0 //HP_BASILICA#Basilica#
4009,363,10,68,3,9,5,76,5,0,0,0,0 //HP_MEDITATIO#Meditatio#
4009,481,5,65,10,23,10,0,0,0,0,0,0 //HP_MANARECHARGE#Mana Recharge#
[COLOR=Red] 4009,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#[/COLOR]
[COLOR=Blue] 4009,[COLOR=DarkRed]1020[/COLOR],[COLOR=Purple]5[/COLOR],0,0,0,0,0,0,0,0,0,0 //NSC_SUMMONSLAYER#SUMMON SLAYER#[/COLOR][/B]
las modificaciones fueron las siguientes:
4010.- Id del Job(HighPriest)
1020.- Id de la skill
5 .- Maximo lvl de la Skill
De esta forma el high Priest tiene una nueva skill a su disposicion.
[Parte 3] Implementacion de la Skill en el ClienteCon los 2 pasos anteriores, se creo la skill, se configuraron los requisitos de uso y se le asigno a un Job, bien ahora como paso final haremos que el cliente reconosca suestra skill, para asi poder usarla y que no le cause error a los demas.
Requisitos.-- Conocimiento de uso de X-Ray
- Conocimiento de creacion de Sprites
Materiales.-- Cliente X-Ray
- Programa Sprite Conview
- Programa Actor
- Imagen de la Skill en BMP de 24x24 pixeles
- Sprite y Act de la Skill
[Parte 3.1] Agregar Skill y su descripcionPara agregar la skill al Cliente abrimos los archivos:
ability_player_tab.txt y
ability_tab.txt Ruta: Data\ability_player_tab.txt y
Data\ability_tab.txtBuscamos la siguiente linea:
[COLOR=Red]SA_ELEMENTWIND[/COLOR]
y debajo de ella ponemos nuestra skill:
[COLOR=Red]SA_ELEMENTWIND[/COLOR]
[COLOR=Blue] NSC_SUMMONSLAYER[/COLOR]
Con esto agregamos la skill, usando el X-Ray, ahora abrimos el archivo:
skilldesctable.txt Ruta: Data\skilldesctable.txtvamos al final del archivo y agregamos lo siguiente:
[B][COLOR=Blue] NSC_SUMMONSLAYER#[/COLOR][/B]
[B][COLOR=Black] Summon Slayer
Max Level:^777777 5^000000
Type:^777777 Invocacion^000000
SP Cost:^777777 50+SkillLvl*10^000000
HP Cost:^777777 1000-SkillLvl*100^000000
Target:^777777 ninguno^000000
Range:^777777 ninguno^000000
ATK Type:^777777 Summon Monster^000000
Cast Time:^777777 0 sec^000000
Cool Down:^777777 0 sec^000000
Duration:^777777 30 min^000000
Effect:^777777 Invoca un Slayer^000000[/COLOR][/B]
[B][COLOR=Blue] #[/COLOR][/B]
Con esto agregamos la descripcion de nuestra skill.
[Parte 3.2] Agregar el texto de la SkillPara agregar el texto que aparece cuando usamos la Skill, abriremos el siguiente archivo:
skillnametable.txt Ruta: Data\skillnametable.txtVamos al Final del archivo y agregamos la siguiente linea:
[B][COLOR=Blue]NSC_SUMMONSLAYER#[COLOR=Black]Invocar Slayer[/COLOR]#[/COLOR][/B]
[Parte 3.3] Skill de Lvl seleccionable
Como la Skill es de 5 lvl y cada lvl invoca a un Mob diferente, vamos a hacer que se pueda seleccionar libremente el lvl de la skill que se desea usar,
Para hacer esto vamos al archivo: leveluseskillspamount.txt
Ruta Data\leveluseskillspamount.txt
Vamos al final del archivo y ponemos lo siguiente:
[COLOR=Black][B][COLOR=Blue]NSC_SUMMONSLAYER#[/COLOR][/B]
[B]60#
70#
80#
90#
100#
@[/B][/COLOR]
Con esto se podra seleccionar el nivel de la skill(Igual que los Bolts del mago, o el Heal del Priest).
[Parte 3.4] Agregar Imagenes de la skillAhora como paso final pondremos las imagenes de la Skill,(las que se veran en la ventana de skills y cuando la arrastres a la barra de acceso rapido)
Primero vamos a la catpeta
item Ruta Data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\itemahi pondremos la Imagen bmp de la skill, tiene que ser una imagen de 24x24 pixeles, y com nombre de archivo deve llevar el nombre de la Skill ejemplo:
[B][COLOR=Blue] NSC_SUMMONSLAYER.bmp[/COLOR][/B]
ahora vamos a la carpeta
¾ÆÀÌÅÛ Ruta: Data\sprite\¾ÆÀÌÅÛAhi pondrmos el archivo de Sprite y act de la Skill, para que a a la hora de arrastrarla fuera de la ventana de skills, no nos cause error.
[B][COLOR=Blue]NSC_SUMMONSLAYER.spr[/COLOR][/B]
[B][COLOR=Blue] NSC_SUMMONSLAYER.act[/COLOR][/B]
Asi de censillo tenemos una nueva skill, Customizada y funcional.
De esta forma llegamos al final de esta guia, espero les sirva de base, para la creacion de nuevas skills que agan lo que ustedes les preogramen xD, Suerte.
Agrego un archivo Rar, con la imagen, que use para la Skill asi como los archivos que modifique en el cliente.
Guia en archivo .doc, Sprite y Act