Jump to content

Like it~*

Members
  • Content Count

    175
  • Joined

  • Last visited

  • Days Won

    1

Reputation Activity

  1. Upvote
    Like it~* reacted to bWolfie in How to rotate event npcs?   
    Yup, basically this. You can use an arrangement of donpcevent() commands to activate events for your set times.
     
    Example:
     
      -     script     event 1     FAKE_NPC,{   OnAtCommand: OnEventOne: announce "Event 1 started.", bc_all; initnpctimer; end;   OnTimer10000: announce "Event 1 ended." bc_all; end;   OnTimer15000: donpcevent("event 2::OnEventTwo"); stopnpctimer; end;   OnInit: bindatcmd("event1","event 1::OnAtCommand"); end;   }   -     script     event 2     FAKE_NPC,{   OnEventTwo: announce "Event 2 started.", bc_all; initnpctimer; end;   OnTimer10000: announce "Event 2 ended.", bc_all; end;   OnTimer15000: donpcevent("event 1::OnEventTwo"); stopnpctimer; end;   }  
    You can start the loop by typing @event1, then it would loop the announcements every 10/15 seconds.
  2. Upvote
    Like it~* reacted to bWolfie in How to allow one ip use on an NPC   
    Yeah. In mine, I changed guildpack to lottery
  3. Upvote
    Like it~* reacted to Mhalicot in Costume Item Plugins   
    File Name: Costume Item Plugins
    File Submitter: Mhalicot
    File Submitted: 10 Feb 2014
    File Category: Plugins
     
    HPM @costumeitem complete package.
     
    Compatible with Windows System Only
     
    if you are using Linux, ignore other files and use only afk.c
    Instruction.
     
    1. Download and extract files using 7z or any application that can extract it.
    2. extract it in your server directory ex: C:/RO Server/Hercules/
    2.1. edit conf/plugins.conf and add costumeitem
    3. Your done. you can now try your plugins
     
    if you are using VS2010/VS2009/vs2013 or whatsoever and you are failing to compile because of platform issue.
    this is what you need to do.
     
    In Recompiling:
    If you are using other MSVS/C
    Quote
     
    Note: Recompile if you modify the script.
     
    If you have any questions feel free to drop a comment.
     
    NOTE: You done have to edit your src to add this custom features(Less conflict when you want to update your server). Thanks to Mr. Ind for making this Plugins possible, This Plugins will convert your items to costume(item stats/combos/bonuses will also copied)
     
    for more info on how to to use HPM visit Here
    (Tested on Hercules rev. 146**)
    Script Release: Costume System
     
    Click here to download this file
  4. Upvote
    Like it~* reacted to Functor in @partybuff / @spb   
    Also we can see this bug, when someone enters to the party.   It is caused by sending of 0x1E9 packet, which adds one specific party member to the list on the client side.   To fix bug of this plugin, we can disable sending of this packet.   Because in any case server always sends full list of party members in 0xFB packet.  
    before:
     
    HPExport void plugin_init (void) {
    add:
     
    void clif_party_member_info_overload(struct party_data* p, struct map_session_data* sd) { return; }  
    after:

    HPExport void plugin_init (void) {
    add:

    clif->party_member_info = &clif_party_member_info_overload;
  5. Upvote
    Like it~* reacted to Mhalicot in rentitem2 plugins   
    File Name: rentitem2 plugins
    File Submitter: Mhalicot
    File Submitted: 04 Jan 2014
    File Category: Plugins
     
    HPM (Script command: rentitem2) (AtCommand: @rentitem) complete package.
     
    Compatible with Windows System Only
     
    if you are using Linux, ignore other files and use only rentitem2.c
     
    Instruction.
     
    1. Download and extract files using 7z or any application that can extract it.
    2. extract it in your server directory ex: C:/RO Server/Hercules/
    2.1. edit conf/plugins.conf and add rentitem2
    3. find rentitem2/rentitem2.sln and recompile it.
    4. You can now start using your ready made plugins
     
    if you are using VS2010/VS2009/vs2013 or whatsoever and you are failing to compile because of platform issue.
    this is what you need to do.
    Note: Recompile if you modify the script.

    Sample Script:
    // Structure*rentitem2 <Item_ID>,<time>, <identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>;*rentitem2 "<Item_Name>",<time>, <identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>;// Scriptrentitem2 @inventorylist_id[.@item],.rentime,@inventorylist_identify[.@item],@inventorylist_refine[.@item],@inventorylist_attribute[.@item],@inventorylist_card1[.@item],@inventorylist_card2[.@item],@inventorylist_card3[.@item],@inventorylist_card4[.@item];

    Note: cannot rent pet eggs/armor, stackable items.
    // AtCommand Structureusage: @rentitem <item name/ID> <Minutes>

    *getequipexpiretick(<equipment slot>)
    Returns the number of seconds before the item expires.0 means it never expires (not a rental item)-1 means no item is equipped
    Sample Script:
    if (getequipexpiretick(.@part)) { mes "Sorry. I don't sign rental items."; emotion e_sry; close; }
    If you have any questions feel free to drop a comment.
     
    for more info on how to to use HPM visit Here
    (Tested on Hercules rev. 137**)
    Credit: Original file by Brian and converted by Me
     
    Click here to download this file
  6. Upvote
    Like it~* reacted to Legend in Plugin errors   
    For noitem.c, look for this line:
    HPExport void plugin_init (void) { addHookPre( "map->flags_init", map_flags_init_pre ); addHookPre( "npc->parse_unknown_mapflag", npc_parse_unknown_mapflag_pre ); addHookPost( "pc->isequip", pc_isequip_post ); addHookPost( "pc->isUseitem", pc_isUseitem_post ); addHookPost( "pc->checkitem", pc_checkitem_post ); } and replace it with:
    HPExport void plugin_init (void) { addHookPre( map, flags_init, map_flags_init_pre ); addHookPre( npc, parse_unknown_mapflag, npc_parse_unknown_mapflag_pre ); addHookPost( pc, isequip, pc_isequip_post ); addHookPost( pc, isUseitem, pc_isUseitem_post ); addHookPost( pc, checkitem, pc_checkitem_post ); }  
     
    For maintenance.c, look for this line:
    addHookPre( "pc->authok", pc_authok_pre ); addHookPre( "clif->pLoadEndAck", clif_parse_LoadEndAck_pre ); replace it with:
    addHookPre( pc, authok, pc_authok_pre ); addHookPre( clif, pLoadEndAck, clif_parse_LoadEndAck_pre );
  7. Upvote
    Like it~* reacted to Habilis in Plugin errors   
    remove this 
    #define safestrncpy(dst,src,n) (strlib->safestrncpy((dst),(src),(n))) from 
    partyscript.c
  8. Upvote
    Like it~* reacted to JulioCF in Ajuda/Suporte Sistema VIP e Cash   
    Você usa  um script vip "antigo" sem os devidos créditos.
    Você não coloca seu script em um PASTE que é correto ao se postar.
    Você posta em 'n' comunidades só pedindo pra resolverem seu problemas.
    Você nem deve ter tido o trabalho de pesquisar como resolver.
    Você nem se quer, se preocupou em procurar usar um sistema mais novo, ou até, você mesmo faze-lo.. não tem conhecimento? Estude.
     
    Aqui, não damos nada na mão.
    Fique a vontade em usar o fórum por inteiro e a Wiki.
     
    Desejo sorte.
  9. Upvote
    Like it~* reacted to Litro in Rental NPC (with PAYMENT)   
    @@Quazi try this script: http://upaste.me/7bbc2166170cb9962
     
    - shop rental_shop -1,501:50prontera,150,150,4 script Rentals Shop 100,{ callshop "rental_shop", 1; npcshopattach "rental_shop"; end;OnBuyItem: dispbottom "Rentals Shop: You can only buy one item at once."; setarray .@q[0], @bought_nameid[0], @bought_quantity[0]; for (.@i = 0; .@i < getarraysize(.items_list); .@i++) { if (.@q[0] == .items_list[.@i]) { .@q[2] = .price_list[.@i]; } } mes .@npc_name$ = "[Rentals Shop]"; mes "Rental Item: "+getitemname(.@q[0]); mes "Rental Cost: "+.@q[2]+"x "+getitemname(.currency)+" for one day."; mes " "; mes "How many days do you want to rent it ?"; next; if (input(.@day, 1, 365)) { mes .@npc_name$; mes "Invalid input days.."; callsub ClearBought; close; } .@q[3] = .@day * .@q[2]; mes .@npc_name$; mes "Rental Item: "+getitemname(.@q[0]); mes "Rental Cost: "+.@q[3]+"x "+getitemname(.currency)+" for "+.@day+" day"+((.@day > 1) ? "s" : "")+"."; mes " "; mes "Still want to make the rent ?"; next; if (select("Yes:No") == 2) { mes .@npc_name$; mes "All right, "+callfunc("F_Bye"); callsub ClearBought; close; } if (countitem(.currency) < .@q[3]) { mes .@npc_name$; mes "I'm sorry, you haven't enought "+getitemname(.currency)+" to pay the rental"; callsub ClearBought; close; } if (!checkweight(.@q[0], .@q[1])) { mes .@npc_name$; mes "You need more space in your inventory."; callsub ClearBought; close; } delitem .currency, .@q[3]; // delete items rentitem .@q[0], .@day * 86400; // rent an items. 86400 = 1 day in seconds callsub ClearBought; end; ClearBought: deletearray @bought_quantity, getarraysize(@bought_quantity); deletearray @bought_nameid, getarraysize(@bought_nameid); return;OnInit: // Configuration setarray .items_list, 1201, 1201, 1201; // items list that you want to sell. setarray .price_list, 100, 200, 300; // itens price that item you sell in the shop. .currency = 7227; // items that will be used as exchange currency // do not touch from here!! npcshopdelitem "rental_shop", 501; for (.@i = 0; .@i < getarraysize(.items_list); .@i++) npcshopadditem "rental_shop", .items_list[.@i], .price_list[.@i]; end;}
  10. Upvote
    Like it~* reacted to jaBote in Oktoberfest ACT and SPR files   
    File Name: Oktoberfest ACT and SPR files
    File Submitter: jaBote
    File Submitted: 31 Dec 2013
    File Category: Sprites & Palettes
     
    These are the Oktoberfest ACT and SPR files available at fRO server GRF, just for these who don't have them, along with their correct location inside the GRF.
     
    I will provide no support for these since I didn't make them and the fact that I'm not quite good on client-side.
     
    You only have to download one of two files offered here:
     
    File 1 (data.zip) provides the content extracted from the GRF, while file 2 (oktoberfest.zip) contains an oktoberfest.grf file with the same contents, for easy management and merging with existing GRFs. It's not necessary to download both of them.
     
    Click here to download this file
  11. Upvote
    Like it~* reacted to Dastgir in Auraset   
    File Name: Auraset
    File Submitter: Dastgir
    File Submitted: 24 Mar 2014
    File Category: Plugins
     
    For Building Plugins:
    Windows: http://herc.ws/wiki/Building_HPM_Plugin_for_MSVC
    Linux: http://herc.ws/wiki/Building_HPM_Plugin_for_gcc
     
    Usage:
    Atcommand:
    (usage: @aura <aura1> {<aura2> <aura3>})
    (aura1,aura2 are optional)
     
    ScriptCommand:
    (usage: aura aura1{,aura2,aura3}
    aura1 is compulsory, while aura2,aura3 are optional.
     
    aura1,aura2,aura3 are AuraID's
     
    NOTE: 1) This effects are permanent(unless the effect is not, which is clientside) and if you want to remove it, either do "@aura 0 0 0" or by Script (aura(0,0,0))
    2) If you type aura(586,-1,240), the 2nd aura will remain same, while first and third aura will change.
     
    You can check/set User's AuraID's by following variables
    USERAURA - Aura1
    USERAURA1 - Aura2
    USERAURA2 - Aura3
     
    You can also change aura by changing these variables.
     
    Some Useful aura Combinations:
    { 586, -1, -1 },{ 586, 362, -1 },{ 586, 362, 240 },{ 418, -1, -1 },{ 486, -1, -1 },{ 485, -1, -1 },{ 239, -1, -1 },{ 240, -1, -1 },{ 241, -1, -1 },{ 620, -1, -1 },{ 202, -1, -1 },{ 362, -1, -1 },{ 678, -1, -1 },{ 679, -1, -1 },{ 680, -1, -1 },{ 239, 418, -1 },{ 239, 486, -1 },{ 239, 485, -1 },{ 240, 418, -1 },{ 240, 486, -1 },{ 240, 485, -1 },{ 241, 418, -1 },{ 241, 486, -1 },{ 241, 485, -1 },{ 620, 418, -1 },{ 620, 486, -1 },{ 620, 485, -1 },{ 239, 418, 202 },{ 239, 486, 202 },{ 239, 485, 202 },{ 240, 418, 202 },{ 240, 486, 202 },{ 240, 485, 202 },{ 241, 418, 202 },{ 241, 486, 202 },{ 241, 485, 202 },{ 620, 418, 202 },{ 620, 486, 202 },{ 620, 485, 202 },{ 239, 418, 362 },{ 239, 486, 362 },{ 239, 485, 362 },{ 240, 418, 362 },{ 240, 486, 362 },{ 240, 485, 362 },{ 241, 418, 362 },{ 241, 486, 362 },{ 241, 485, 362 },{ 620, 418, 362 },{ 620, 486, 362 },{ 620, 485, 362 },{ 239, 418, 678 },{ 239, 486, 678 },{ 239, 485, 678 },{ 240, 418, 678 },{ 240, 486, 678 },{ 240, 485, 678 },{ 241, 418, 678 },{ 241, 486, 678 },{ 241, 485, 678 },{ 620, 418, 678 },{ 620, 486, 678 },{ 620, 485, 678 },{ 680, 679, 678 },
    I guess no further explanation is needed.
     
    Click here to download this file
  12. Upvote
    Like it~* reacted to Habilis in Plugin errors   
    For example autopot.c
     
     
    Replace top of file by
     
    #include <stdio.h> #include <stdlib.h> #include <string.h> #include "common/hercules.h" /* Should always be the first Hercules file included! (if you don't make it first, you won't be able to use interfaces) */ #include "common/HPMi.h" #include "common/timer.h" #include "map/script.h" #include "map/pc.h" #include "map/map.h" #include "map/unit.h" #include "map/atcommand.h" #include "map/itemdb.h" #include "plugins/HPMHooking.h" #include "common/HPMDataCheck.h"/* should always be the last file included! (if you don't make it last, it'll intentionally break compile time) */ #define OPTION_AUTOPOTS 0x40000000  
      Then,
     
    remove 
    clif = GET_SYMBOL("clif"); script = GET_SYMBOL("script"); pc = GET_SYMBOL("pc"); atcommand = GET_SYMBOL("atcommand"); map = GET_SYMBOL("map"); unit = GET_SYMBOL("unit"); timer = GET_SYMBOL("timer"); itemdb = GET_SYMBOL("itemdb"); from 
     
    HPExport void plugin_init (void) {    
    Recompile..
     
    samme principle apply to others...
     
     
     
    UPD : Maintenance.c
     
    add
    #include "plugins/HPMHooking.h" before
    #include "common/HPMDataCheck.h"
  13. Upvote
    Like it~* got a reaction from ColdDiablo in [Guia e orientação] Criando habilidades. PT-BR   
    Criando habilidades ou clonando-as   Introdução   Uma grande área onde os jogadores têm dificuldade é adicionar novas habilidades para a fonte e o cliente. Abaixo será documentado como implementar essas novas habilidades.   A habilidade   A habilidade que estaremos trabalhando é simples.  
    Nome: Earth Bolt Level Máx: 10 Tipo: Ativa Custo de SP: 20 + 5*SkillLV Alvo: 1 inimigo Tempo de conjuração: 2 seg Delay: 1 seg Duração: Instantânea Descrição: Causa dano mágico de elemento terra ao inimigo, conforme level da habilidade, a 150% MATK por hit. Basicamente, essa habilidade deve atingir 1 inimigo e lidar com 10 hits de 150% MATK, propriedade elemental da Terra e deve ser baseada em dano mágico.    
    Abra /src/map/skill.h Role para baixo até encontrar  
    EL_STONE_HAMMER, EL_ROCK_CRUSHER, EL_ROCK_CRUSHER_ATK, EL_STONE_RAIN,    
    Depois daqui é onde nós adicionamos quaisquer habilidades adicionais. É melhor dar às habilidades um ID personalizado para começar. Então, vamos adicionar a nossa habilidade "Earth Bolt". Depois disso, adicione MG_EARTHBOLT = 8443,    
    MG_ definição significa "Mago", você vai trabalhar para fora as siglas como você percorrer as habilidades. Definimos a base da habilidade. Como você pode ver, o id de habilidade é definido como '8443' desde Stone Elemental's Stone Rain é definido como 8442 (e é o última habilidade de jogador acessível).   Abra /src/map/skill.c   Esse arquivo é onde definimos as implementações de habilidades reais. Para habilidades de alvo único, todo o processamento dessa habilidade irá em skill_castend_damage_id (para habilidades prejudiciais) ou skill_castend_nodamage_id (para skills que não causam danos).   Habilidades baseadas em mágica ou mágia.   Como o Earth Bolt é baseado em danos, encontre a função skill_castend_damage_id e localize:  
        case AB_RENOVATIO:     case AB_HIGHNESSHEAL:     case AB_DUPLELIGHT_MAGIC:     case WM_METALICSOUND:     case MH_ERASER_CUTTER:     case KO_KAIHOU:    
    A razão pela qual estaremos colocando a case para Earth Bolt aqui é porque:    
           skill->attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);    
    A definição BF_MAGIC significa que a habilidade é baseada em magia e deve ser calculada sob cálculos de batalha mágica. Assim, após a case NJ_HUUJIN adicionar:  
        case MG_EARTHBOLT:    
    Habilidades baseadas em armas   No caso de querer adicionar uma habilidade que é baseada em Arma, em vez de Magia, encontre:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:    
    E adicione a case depois disso. Se quiséssemos que o Earth Bolt fosse baseado em armas, ficaria assim:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:     case MG_EARTHBOLT:    
    No entanto, vamos manter a função Magic em vez disso.   Abra /src/map/battle.c   Nesta função, todos os cálculos de danos principais são realizados. E em funções separadas, as % modificadoras para as habilidades são armazenados. Portanto, para os nossos danos de 150%, adicionamos o extra de 50% (já que 100% é o padrão) na função apropriada. Ataques baseado em mágica Para ataques baseados em Magia, os modificadores são encontrados em battle_calc_magic_attack. Basta encontrar:  
    case NPC_EARTHQUAKE:     skillratio += 100 +100*skill_lv +100*(skill_lv/2);     break;    
    E adicione o modificador de danos abaixo. Como Earth Bolt é baseado em magia, nós adicionaremos-a aqui.  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    Isso agora significa que o Earth Bolt causará dano mágico de 150% MATK.   Átaques baseado em armas   Para ataques baseados em armas, os modificadores são encontrados em battle_calc_weapon_attack. Basta encontrar:  
        case NPC_VAMPIRE_GIFT:         skillratio += ((skill_lv-1)%5+1)*100;         break;    
    E adicione seu modificador de dano lá. Por exemplo, se o Earth Bolt fosse baseado em Weapon, acrescentaríamos:  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    O + = 50 significa simplesmente "Adicionar 50% ao 100%" para danos de ATK de 150%.   Suporte a banco de dados de habilidades   Tecnicamente falando, a base da habilidade está agora correta. Claro, se você quiser implementar habilidades mais complexas, há muito mais para isso. A seção separada será criada no futuro para isso. Mas, por enquanto, precisamos implementar as entradas do banco de dados de habilidades. Os arquivos abaixo podem ser encontrados em db / (pre / re) /. Apenas um de ambos (pre / re) precisa ser atualizado, é o qual você usa em seu servidor.   Nessa parte é sempre aconselhável que você tenha alguma habilidade escolhida para se utilizar como base, pois facilitará muito a criação e/ou clonagem de sua habilidade. Aqui há diferenças, então dependendo do emulador usado, cada forma será de um jeito, caso o seu emulador seja alguns dos abaixos, continue. Caso não, pule para a parte: ** p/ Hercules.   ** p/ rAthena, brAthena, Cronus.   Skill_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,5,8,1,2,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic, 0, MG_EARTHBOLT, Earth Bolt    
    Isso define que: Earth Bolt tem um intervalo de 5 células, bate várias vezes, é elemento da Terra e alvos 1 inimigo. Ele pode ser interrompido, e é de dano de tipo mágico. A quantidade de acessos aumenta em 1 em cada nível, com um nível máximo de 10.   Skill_cast_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,2000,1,000,0,0,0    
    Isso define que: Earth Bolt tem um segundo tempo de ligação e um tempo de atraso de 1 segundo. Não há atraso de caminhada após o lançamento.   Skill_require_db.txt   Para o nosso Earth Bolt, podemos agora digitar o seguinte: Estrutura:
     
    8443,0,0,25: 30: 35: 40: 45: 50: 55: 60: 65: 70,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
    Isso define que: Earth Bolt requer 25 SP no nível 1, 30 SP no nível 2 .. 70 SP no nível 10. Pode ser lançado com qualquer arma, não requer nenhum estado e não requer nenhum item para ser consumido. =========================================================================== ** p/ Hercules.   Skill_db.txt  
     
     
     
    ===========================================================================   Skill_tree.txt   Esta parte do banco de dados não é necessária se não for lida por uma classe. No entanto, se você quiser que uma classe aprenda uma habilidade, você deve fazer uma entrada em skill_tree.txt. Um exemplo abaixo:
     
    MG_EARTHBOLT: { MaxLevel: 10 MG_FIREBOLT: 5 MG_LIGHTNINGBOLT: 5 }   Isso define que: Earth Bolt pode ser aprendido por Mago, tem um nível máximo de 10 (para esta classe), e requer habilidade MG_FIREBOLT no nível 5 e habilidade MG_LIGHTNINGBOLT no nível 5. Tecnicamente, estas são as partes geralmente utilizas com arquivos de banco de dados de habilidade. Há mais, mas isso ficará pra vocês explorarem.   Arquivos .lua e .lub   As seguintes implementações estão de acordo com a Revisão 228 do Projeto Lua (2012-05-23). A implementação é diferente entre muitas versões de cliente, mas geralmente há 2 implementações:   Sem arquivos skillinfoz   Em data/lua files/skillinfo/skilltreeview.lua encontre: {"MG_FIREWALL", 18; Pos = 19, MaxLv = 10, NeedSkillList = {6, 12}} Adicione a baixo:
    {"MG_EARTHBOLT",8443; Pos = 20, MaxLv = 10, NeedSkillList = {19,20}}  
    Com arquivos skillinfoz   Em skillid.lua encontre: ECLAGE_RECALL = 3035, Depois adicione:
    MG_EARTHBOLT = 8443, in data/lua files/skillinfo/skilldescript.lua localize:
    [SKID.MG_THUNDERSTORM] = { "Thunder Storm", "Max Level:^777777 10 ^000000", "Type:^777777 Offensive ^000000", "SP Cost:^777777 24 + 5*SkillLV ^000000", "Target:^777777 cell ^000000", "Range:^777777 9 cells ^000000", "Cast Time:^777777 1*SkillLV sec ^000000", "Cool Down:^777777 2 sec ^000000", "Duration:^777777 0.2*SkillLV sec ^000000", "Effect:^777777 Hits every Enemy in a 5x5 area around the targeted cell with 1 Wind Element Bolt per level at a rate of 1 bolt every 0.2 seconds. Each bolt does 0.8*MATK Wind element damage. ^000000", "[LV 1]^777777 1 Bolt ^000000", "[LV 2]^777777 2 Bolts ^000000", "[LV 3]^777777 3 Bolts ^000000", "[LV 4]^777777 4 Bolts ^000000", "[LV 5]^777777 5 Bolts ^000000", "[LV 6]^777777 6 Bolts ^000000", "[LV 7]^777777 7 Bolts ^000000", "[LV 8]^777777 8 Bolts ^000000", "[LV 9]^777777 9 Bolts ^000000", "[LV 10]^777777 10 Bolts ^000000", }, Depois adicione:
    [SKID.MG_EARTHBOLT] = { "Earth Bolt", "Max Level:^777777 10 ^000000" "Type:^77777 Active ^000000" "SP Cost:^777777 20 + 5*SkillLV ^000000" "Target:^777777 1 Enemy ^000000" "Cast Time:^777777 2 sec ^000000" "Cool Down:^777777 1 sec ^000000" "Duration:^777777 Instant ^000000" "Effect: ^777777 Deals SkillLV bolts of Earth magic damage to one enemy, at 150% MATK per hit.^000000", }, skilltreeview.lua mude:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL },  para:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL, [20] = SKID.MG_EARTHBOLT }, skillinfolist.lua Mude:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, } Para:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, }, [SKID.MG_EARTHBOLT] = { "MG_EARTHBOLT"; SkillName = "Earth Bolt", MaxLv = 10, SpAmount = { 25, 30, 35, 40, 45, 50, 55, 60, 65, 70 }, _NeedSkillList = { { SKID.MG_FIREBOLT, 5}, { SKID.MG_LIGHTNINGBOLT, 5} } Finalizando   Não se esqueça que você precisará de adicionar o arquivo Sprite e BMP apropriado para a habilidade. Use o nome MG_EARTHBOLT como o nome do arquivo em: data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item data\sprite\¾ÆÀÌÅÛ   Efeitos   Vá a src/map/skill.h, Procure a skill que deseja adicionar/editar o efeito:
     
            case WE_BABY:             if(sd) {                 struct map_session_data *f_sd = pc->get_father(sd);                 struct map_session_data *m_sd = pc->get_mother(sd);                 bool we_baby_parents = false;                 if(m_sd && check_distance_bl(bl,&m_sd->bl,AREA_SIZE)) {                     sc_start(src,&m_sd->bl,type,100,skill_lv,skill->get_time(skill_id,skill_lv));                     clif->specialeffect(&m_sd->bl,408,AREA);                     we_baby_parents = true;                 }     Aqui está sendo utilizado como exemplo a habilidade de convocação das classes bebês. Onde 408 é o efeito adicionado para que seja mostrado ao utilizar a skill. Para a sua habilidade customizada, como ela é uma habilidade nova, não há nenhum efeito, então você terá que adicioná-lo ao arquivo, seguindo de exemplo a mesma forma mostrada acima. Para saber a lista de todos os efeitos, basta utilizar doc/effect_list.txt.     Fontes e créditos   https://github.com/HerculesWS/ https://github.com/Cronus-Emulator/ https://github.com/brAthena/ https://github.com/rAthena/ http://forum.cronus-emulator.com/ https://forum.brathena.org/ http://herc.ws/wiki/Adding_new_skills http://herc.ws/ https://google.com/   Comentários   Decidi fazer esse tutorial pois percebi que ainda não há nenhum guia com esse assunto em PT-BR e havia uma grande demanda de pessoas procurando. Tinha dado uma olhada no Hercules e percebi que é um bom tutorial, mas ainda estava incompleto e bem desatualizado, então decidi usa-lo como base e também pensei, por que não criar um? Espero que esteja de boa compreensão, caso estiver faltando algo que eu esqueci ou que eu não saiba, por favor me informe para torná-lo o melhor possível. Estou aberto a sugestões e críticas construtivas. Façam um bom proveito 
  14. Upvote
    Like it~* got a reaction from Merekin in [Guia e orientação] Criando habilidades. PT-BR   
    Criando habilidades ou clonando-as   Introdução   Uma grande área onde os jogadores têm dificuldade é adicionar novas habilidades para a fonte e o cliente. Abaixo será documentado como implementar essas novas habilidades.   A habilidade   A habilidade que estaremos trabalhando é simples.  
    Nome: Earth Bolt Level Máx: 10 Tipo: Ativa Custo de SP: 20 + 5*SkillLV Alvo: 1 inimigo Tempo de conjuração: 2 seg Delay: 1 seg Duração: Instantânea Descrição: Causa dano mágico de elemento terra ao inimigo, conforme level da habilidade, a 150% MATK por hit. Basicamente, essa habilidade deve atingir 1 inimigo e lidar com 10 hits de 150% MATK, propriedade elemental da Terra e deve ser baseada em dano mágico.    
    Abra /src/map/skill.h Role para baixo até encontrar  
    EL_STONE_HAMMER, EL_ROCK_CRUSHER, EL_ROCK_CRUSHER_ATK, EL_STONE_RAIN,    
    Depois daqui é onde nós adicionamos quaisquer habilidades adicionais. É melhor dar às habilidades um ID personalizado para começar. Então, vamos adicionar a nossa habilidade "Earth Bolt". Depois disso, adicione MG_EARTHBOLT = 8443,    
    MG_ definição significa "Mago", você vai trabalhar para fora as siglas como você percorrer as habilidades. Definimos a base da habilidade. Como você pode ver, o id de habilidade é definido como '8443' desde Stone Elemental's Stone Rain é definido como 8442 (e é o última habilidade de jogador acessível).   Abra /src/map/skill.c   Esse arquivo é onde definimos as implementações de habilidades reais. Para habilidades de alvo único, todo o processamento dessa habilidade irá em skill_castend_damage_id (para habilidades prejudiciais) ou skill_castend_nodamage_id (para skills que não causam danos).   Habilidades baseadas em mágica ou mágia.   Como o Earth Bolt é baseado em danos, encontre a função skill_castend_damage_id e localize:  
        case AB_RENOVATIO:     case AB_HIGHNESSHEAL:     case AB_DUPLELIGHT_MAGIC:     case WM_METALICSOUND:     case MH_ERASER_CUTTER:     case KO_KAIHOU:    
    A razão pela qual estaremos colocando a case para Earth Bolt aqui é porque:    
           skill->attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);    
    A definição BF_MAGIC significa que a habilidade é baseada em magia e deve ser calculada sob cálculos de batalha mágica. Assim, após a case NJ_HUUJIN adicionar:  
        case MG_EARTHBOLT:    
    Habilidades baseadas em armas   No caso de querer adicionar uma habilidade que é baseada em Arma, em vez de Magia, encontre:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:    
    E adicione a case depois disso. Se quiséssemos que o Earth Bolt fosse baseado em armas, ficaria assim:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:     case MG_EARTHBOLT:    
    No entanto, vamos manter a função Magic em vez disso.   Abra /src/map/battle.c   Nesta função, todos os cálculos de danos principais são realizados. E em funções separadas, as % modificadoras para as habilidades são armazenados. Portanto, para os nossos danos de 150%, adicionamos o extra de 50% (já que 100% é o padrão) na função apropriada. Ataques baseado em mágica Para ataques baseados em Magia, os modificadores são encontrados em battle_calc_magic_attack. Basta encontrar:  
    case NPC_EARTHQUAKE:     skillratio += 100 +100*skill_lv +100*(skill_lv/2);     break;    
    E adicione o modificador de danos abaixo. Como Earth Bolt é baseado em magia, nós adicionaremos-a aqui.  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    Isso agora significa que o Earth Bolt causará dano mágico de 150% MATK.   Átaques baseado em armas   Para ataques baseados em armas, os modificadores são encontrados em battle_calc_weapon_attack. Basta encontrar:  
        case NPC_VAMPIRE_GIFT:         skillratio += ((skill_lv-1)%5+1)*100;         break;    
    E adicione seu modificador de dano lá. Por exemplo, se o Earth Bolt fosse baseado em Weapon, acrescentaríamos:  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    O + = 50 significa simplesmente "Adicionar 50% ao 100%" para danos de ATK de 150%.   Suporte a banco de dados de habilidades   Tecnicamente falando, a base da habilidade está agora correta. Claro, se você quiser implementar habilidades mais complexas, há muito mais para isso. A seção separada será criada no futuro para isso. Mas, por enquanto, precisamos implementar as entradas do banco de dados de habilidades. Os arquivos abaixo podem ser encontrados em db / (pre / re) /. Apenas um de ambos (pre / re) precisa ser atualizado, é o qual você usa em seu servidor.   Nessa parte é sempre aconselhável que você tenha alguma habilidade escolhida para se utilizar como base, pois facilitará muito a criação e/ou clonagem de sua habilidade. Aqui há diferenças, então dependendo do emulador usado, cada forma será de um jeito, caso o seu emulador seja alguns dos abaixos, continue. Caso não, pule para a parte: ** p/ Hercules.   ** p/ rAthena, brAthena, Cronus.   Skill_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,5,8,1,2,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic, 0, MG_EARTHBOLT, Earth Bolt    
    Isso define que: Earth Bolt tem um intervalo de 5 células, bate várias vezes, é elemento da Terra e alvos 1 inimigo. Ele pode ser interrompido, e é de dano de tipo mágico. A quantidade de acessos aumenta em 1 em cada nível, com um nível máximo de 10.   Skill_cast_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,2000,1,000,0,0,0    
    Isso define que: Earth Bolt tem um segundo tempo de ligação e um tempo de atraso de 1 segundo. Não há atraso de caminhada após o lançamento.   Skill_require_db.txt   Para o nosso Earth Bolt, podemos agora digitar o seguinte: Estrutura:
     
    8443,0,0,25: 30: 35: 40: 45: 50: 55: 60: 65: 70,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
    Isso define que: Earth Bolt requer 25 SP no nível 1, 30 SP no nível 2 .. 70 SP no nível 10. Pode ser lançado com qualquer arma, não requer nenhum estado e não requer nenhum item para ser consumido. =========================================================================== ** p/ Hercules.   Skill_db.txt  
     
     
     
    ===========================================================================   Skill_tree.txt   Esta parte do banco de dados não é necessária se não for lida por uma classe. No entanto, se você quiser que uma classe aprenda uma habilidade, você deve fazer uma entrada em skill_tree.txt. Um exemplo abaixo:
     
    MG_EARTHBOLT: { MaxLevel: 10 MG_FIREBOLT: 5 MG_LIGHTNINGBOLT: 5 }   Isso define que: Earth Bolt pode ser aprendido por Mago, tem um nível máximo de 10 (para esta classe), e requer habilidade MG_FIREBOLT no nível 5 e habilidade MG_LIGHTNINGBOLT no nível 5. Tecnicamente, estas são as partes geralmente utilizas com arquivos de banco de dados de habilidade. Há mais, mas isso ficará pra vocês explorarem.   Arquivos .lua e .lub   As seguintes implementações estão de acordo com a Revisão 228 do Projeto Lua (2012-05-23). A implementação é diferente entre muitas versões de cliente, mas geralmente há 2 implementações:   Sem arquivos skillinfoz   Em data/lua files/skillinfo/skilltreeview.lua encontre: {"MG_FIREWALL", 18; Pos = 19, MaxLv = 10, NeedSkillList = {6, 12}} Adicione a baixo:
    {"MG_EARTHBOLT",8443; Pos = 20, MaxLv = 10, NeedSkillList = {19,20}}  
    Com arquivos skillinfoz   Em skillid.lua encontre: ECLAGE_RECALL = 3035, Depois adicione:
    MG_EARTHBOLT = 8443, in data/lua files/skillinfo/skilldescript.lua localize:
    [SKID.MG_THUNDERSTORM] = { "Thunder Storm", "Max Level:^777777 10 ^000000", "Type:^777777 Offensive ^000000", "SP Cost:^777777 24 + 5*SkillLV ^000000", "Target:^777777 cell ^000000", "Range:^777777 9 cells ^000000", "Cast Time:^777777 1*SkillLV sec ^000000", "Cool Down:^777777 2 sec ^000000", "Duration:^777777 0.2*SkillLV sec ^000000", "Effect:^777777 Hits every Enemy in a 5x5 area around the targeted cell with 1 Wind Element Bolt per level at a rate of 1 bolt every 0.2 seconds. Each bolt does 0.8*MATK Wind element damage. ^000000", "[LV 1]^777777 1 Bolt ^000000", "[LV 2]^777777 2 Bolts ^000000", "[LV 3]^777777 3 Bolts ^000000", "[LV 4]^777777 4 Bolts ^000000", "[LV 5]^777777 5 Bolts ^000000", "[LV 6]^777777 6 Bolts ^000000", "[LV 7]^777777 7 Bolts ^000000", "[LV 8]^777777 8 Bolts ^000000", "[LV 9]^777777 9 Bolts ^000000", "[LV 10]^777777 10 Bolts ^000000", }, Depois adicione:
    [SKID.MG_EARTHBOLT] = { "Earth Bolt", "Max Level:^777777 10 ^000000" "Type:^77777 Active ^000000" "SP Cost:^777777 20 + 5*SkillLV ^000000" "Target:^777777 1 Enemy ^000000" "Cast Time:^777777 2 sec ^000000" "Cool Down:^777777 1 sec ^000000" "Duration:^777777 Instant ^000000" "Effect: ^777777 Deals SkillLV bolts of Earth magic damage to one enemy, at 150% MATK per hit.^000000", }, skilltreeview.lua mude:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL },  para:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL, [20] = SKID.MG_EARTHBOLT }, skillinfolist.lua Mude:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, } Para:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, }, [SKID.MG_EARTHBOLT] = { "MG_EARTHBOLT"; SkillName = "Earth Bolt", MaxLv = 10, SpAmount = { 25, 30, 35, 40, 45, 50, 55, 60, 65, 70 }, _NeedSkillList = { { SKID.MG_FIREBOLT, 5}, { SKID.MG_LIGHTNINGBOLT, 5} } Finalizando   Não se esqueça que você precisará de adicionar o arquivo Sprite e BMP apropriado para a habilidade. Use o nome MG_EARTHBOLT como o nome do arquivo em: data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item data\sprite\¾ÆÀÌÅÛ   Efeitos   Vá a src/map/skill.h, Procure a skill que deseja adicionar/editar o efeito:
     
            case WE_BABY:             if(sd) {                 struct map_session_data *f_sd = pc->get_father(sd);                 struct map_session_data *m_sd = pc->get_mother(sd);                 bool we_baby_parents = false;                 if(m_sd && check_distance_bl(bl,&m_sd->bl,AREA_SIZE)) {                     sc_start(src,&m_sd->bl,type,100,skill_lv,skill->get_time(skill_id,skill_lv));                     clif->specialeffect(&m_sd->bl,408,AREA);                     we_baby_parents = true;                 }     Aqui está sendo utilizado como exemplo a habilidade de convocação das classes bebês. Onde 408 é o efeito adicionado para que seja mostrado ao utilizar a skill. Para a sua habilidade customizada, como ela é uma habilidade nova, não há nenhum efeito, então você terá que adicioná-lo ao arquivo, seguindo de exemplo a mesma forma mostrada acima. Para saber a lista de todos os efeitos, basta utilizar doc/effect_list.txt.     Fontes e créditos   https://github.com/HerculesWS/ https://github.com/Cronus-Emulator/ https://github.com/brAthena/ https://github.com/rAthena/ http://forum.cronus-emulator.com/ https://forum.brathena.org/ http://herc.ws/wiki/Adding_new_skills http://herc.ws/ https://google.com/   Comentários   Decidi fazer esse tutorial pois percebi que ainda não há nenhum guia com esse assunto em PT-BR e havia uma grande demanda de pessoas procurando. Tinha dado uma olhada no Hercules e percebi que é um bom tutorial, mas ainda estava incompleto e bem desatualizado, então decidi usa-lo como base e também pensei, por que não criar um? Espero que esteja de boa compreensão, caso estiver faltando algo que eu esqueci ou que eu não saiba, por favor me informe para torná-lo o melhor possível. Estou aberto a sugestões e críticas construtivas. Façam um bom proveito 
  15. Upvote
    Like it~* got a reaction from Fou-lu in [Guia e orientação] Criando habilidades. PT-BR   
    Criando habilidades ou clonando-as   Introdução   Uma grande área onde os jogadores têm dificuldade é adicionar novas habilidades para a fonte e o cliente. Abaixo será documentado como implementar essas novas habilidades.   A habilidade   A habilidade que estaremos trabalhando é simples.  
    Nome: Earth Bolt Level Máx: 10 Tipo: Ativa Custo de SP: 20 + 5*SkillLV Alvo: 1 inimigo Tempo de conjuração: 2 seg Delay: 1 seg Duração: Instantânea Descrição: Causa dano mágico de elemento terra ao inimigo, conforme level da habilidade, a 150% MATK por hit. Basicamente, essa habilidade deve atingir 1 inimigo e lidar com 10 hits de 150% MATK, propriedade elemental da Terra e deve ser baseada em dano mágico.    
    Abra /src/map/skill.h Role para baixo até encontrar  
    EL_STONE_HAMMER, EL_ROCK_CRUSHER, EL_ROCK_CRUSHER_ATK, EL_STONE_RAIN,    
    Depois daqui é onde nós adicionamos quaisquer habilidades adicionais. É melhor dar às habilidades um ID personalizado para começar. Então, vamos adicionar a nossa habilidade "Earth Bolt". Depois disso, adicione MG_EARTHBOLT = 8443,    
    MG_ definição significa "Mago", você vai trabalhar para fora as siglas como você percorrer as habilidades. Definimos a base da habilidade. Como você pode ver, o id de habilidade é definido como '8443' desde Stone Elemental's Stone Rain é definido como 8442 (e é o última habilidade de jogador acessível).   Abra /src/map/skill.c   Esse arquivo é onde definimos as implementações de habilidades reais. Para habilidades de alvo único, todo o processamento dessa habilidade irá em skill_castend_damage_id (para habilidades prejudiciais) ou skill_castend_nodamage_id (para skills que não causam danos).   Habilidades baseadas em mágica ou mágia.   Como o Earth Bolt é baseado em danos, encontre a função skill_castend_damage_id e localize:  
        case AB_RENOVATIO:     case AB_HIGHNESSHEAL:     case AB_DUPLELIGHT_MAGIC:     case WM_METALICSOUND:     case MH_ERASER_CUTTER:     case KO_KAIHOU:    
    A razão pela qual estaremos colocando a case para Earth Bolt aqui é porque:    
           skill->attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);    
    A definição BF_MAGIC significa que a habilidade é baseada em magia e deve ser calculada sob cálculos de batalha mágica. Assim, após a case NJ_HUUJIN adicionar:  
        case MG_EARTHBOLT:    
    Habilidades baseadas em armas   No caso de querer adicionar uma habilidade que é baseada em Arma, em vez de Magia, encontre:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:    
    E adicione a case depois disso. Se quiséssemos que o Earth Bolt fosse baseado em armas, ficaria assim:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:     case MG_EARTHBOLT:    
    No entanto, vamos manter a função Magic em vez disso.   Abra /src/map/battle.c   Nesta função, todos os cálculos de danos principais são realizados. E em funções separadas, as % modificadoras para as habilidades são armazenados. Portanto, para os nossos danos de 150%, adicionamos o extra de 50% (já que 100% é o padrão) na função apropriada. Ataques baseado em mágica Para ataques baseados em Magia, os modificadores são encontrados em battle_calc_magic_attack. Basta encontrar:  
    case NPC_EARTHQUAKE:     skillratio += 100 +100*skill_lv +100*(skill_lv/2);     break;    
    E adicione o modificador de danos abaixo. Como Earth Bolt é baseado em magia, nós adicionaremos-a aqui.  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    Isso agora significa que o Earth Bolt causará dano mágico de 150% MATK.   Átaques baseado em armas   Para ataques baseados em armas, os modificadores são encontrados em battle_calc_weapon_attack. Basta encontrar:  
        case NPC_VAMPIRE_GIFT:         skillratio += ((skill_lv-1)%5+1)*100;         break;    
    E adicione seu modificador de dano lá. Por exemplo, se o Earth Bolt fosse baseado em Weapon, acrescentaríamos:  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    O + = 50 significa simplesmente "Adicionar 50% ao 100%" para danos de ATK de 150%.   Suporte a banco de dados de habilidades   Tecnicamente falando, a base da habilidade está agora correta. Claro, se você quiser implementar habilidades mais complexas, há muito mais para isso. A seção separada será criada no futuro para isso. Mas, por enquanto, precisamos implementar as entradas do banco de dados de habilidades. Os arquivos abaixo podem ser encontrados em db / (pre / re) /. Apenas um de ambos (pre / re) precisa ser atualizado, é o qual você usa em seu servidor.   Nessa parte é sempre aconselhável que você tenha alguma habilidade escolhida para se utilizar como base, pois facilitará muito a criação e/ou clonagem de sua habilidade. Aqui há diferenças, então dependendo do emulador usado, cada forma será de um jeito, caso o seu emulador seja alguns dos abaixos, continue. Caso não, pule para a parte: ** p/ Hercules.   ** p/ rAthena, brAthena, Cronus.   Skill_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,5,8,1,2,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic, 0, MG_EARTHBOLT, Earth Bolt    
    Isso define que: Earth Bolt tem um intervalo de 5 células, bate várias vezes, é elemento da Terra e alvos 1 inimigo. Ele pode ser interrompido, e é de dano de tipo mágico. A quantidade de acessos aumenta em 1 em cada nível, com um nível máximo de 10.   Skill_cast_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,2000,1,000,0,0,0    
    Isso define que: Earth Bolt tem um segundo tempo de ligação e um tempo de atraso de 1 segundo. Não há atraso de caminhada após o lançamento.   Skill_require_db.txt   Para o nosso Earth Bolt, podemos agora digitar o seguinte: Estrutura:
     
    8443,0,0,25: 30: 35: 40: 45: 50: 55: 60: 65: 70,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
    Isso define que: Earth Bolt requer 25 SP no nível 1, 30 SP no nível 2 .. 70 SP no nível 10. Pode ser lançado com qualquer arma, não requer nenhum estado e não requer nenhum item para ser consumido. =========================================================================== ** p/ Hercules.   Skill_db.txt  
     
     
     
    ===========================================================================   Skill_tree.txt   Esta parte do banco de dados não é necessária se não for lida por uma classe. No entanto, se você quiser que uma classe aprenda uma habilidade, você deve fazer uma entrada em skill_tree.txt. Um exemplo abaixo:
     
    MG_EARTHBOLT: { MaxLevel: 10 MG_FIREBOLT: 5 MG_LIGHTNINGBOLT: 5 }   Isso define que: Earth Bolt pode ser aprendido por Mago, tem um nível máximo de 10 (para esta classe), e requer habilidade MG_FIREBOLT no nível 5 e habilidade MG_LIGHTNINGBOLT no nível 5. Tecnicamente, estas são as partes geralmente utilizas com arquivos de banco de dados de habilidade. Há mais, mas isso ficará pra vocês explorarem.   Arquivos .lua e .lub   As seguintes implementações estão de acordo com a Revisão 228 do Projeto Lua (2012-05-23). A implementação é diferente entre muitas versões de cliente, mas geralmente há 2 implementações:   Sem arquivos skillinfoz   Em data/lua files/skillinfo/skilltreeview.lua encontre: {"MG_FIREWALL", 18; Pos = 19, MaxLv = 10, NeedSkillList = {6, 12}} Adicione a baixo:
    {"MG_EARTHBOLT",8443; Pos = 20, MaxLv = 10, NeedSkillList = {19,20}}  
    Com arquivos skillinfoz   Em skillid.lua encontre: ECLAGE_RECALL = 3035, Depois adicione:
    MG_EARTHBOLT = 8443, in data/lua files/skillinfo/skilldescript.lua localize:
    [SKID.MG_THUNDERSTORM] = { "Thunder Storm", "Max Level:^777777 10 ^000000", "Type:^777777 Offensive ^000000", "SP Cost:^777777 24 + 5*SkillLV ^000000", "Target:^777777 cell ^000000", "Range:^777777 9 cells ^000000", "Cast Time:^777777 1*SkillLV sec ^000000", "Cool Down:^777777 2 sec ^000000", "Duration:^777777 0.2*SkillLV sec ^000000", "Effect:^777777 Hits every Enemy in a 5x5 area around the targeted cell with 1 Wind Element Bolt per level at a rate of 1 bolt every 0.2 seconds. Each bolt does 0.8*MATK Wind element damage. ^000000", "[LV 1]^777777 1 Bolt ^000000", "[LV 2]^777777 2 Bolts ^000000", "[LV 3]^777777 3 Bolts ^000000", "[LV 4]^777777 4 Bolts ^000000", "[LV 5]^777777 5 Bolts ^000000", "[LV 6]^777777 6 Bolts ^000000", "[LV 7]^777777 7 Bolts ^000000", "[LV 8]^777777 8 Bolts ^000000", "[LV 9]^777777 9 Bolts ^000000", "[LV 10]^777777 10 Bolts ^000000", }, Depois adicione:
    [SKID.MG_EARTHBOLT] = { "Earth Bolt", "Max Level:^777777 10 ^000000" "Type:^77777 Active ^000000" "SP Cost:^777777 20 + 5*SkillLV ^000000" "Target:^777777 1 Enemy ^000000" "Cast Time:^777777 2 sec ^000000" "Cool Down:^777777 1 sec ^000000" "Duration:^777777 Instant ^000000" "Effect: ^777777 Deals SkillLV bolts of Earth magic damage to one enemy, at 150% MATK per hit.^000000", }, skilltreeview.lua mude:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL },  para:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL, [20] = SKID.MG_EARTHBOLT }, skillinfolist.lua Mude:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, } Para:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, }, [SKID.MG_EARTHBOLT] = { "MG_EARTHBOLT"; SkillName = "Earth Bolt", MaxLv = 10, SpAmount = { 25, 30, 35, 40, 45, 50, 55, 60, 65, 70 }, _NeedSkillList = { { SKID.MG_FIREBOLT, 5}, { SKID.MG_LIGHTNINGBOLT, 5} } Finalizando   Não se esqueça que você precisará de adicionar o arquivo Sprite e BMP apropriado para a habilidade. Use o nome MG_EARTHBOLT como o nome do arquivo em: data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item data\sprite\¾ÆÀÌÅÛ   Efeitos   Vá a src/map/skill.h, Procure a skill que deseja adicionar/editar o efeito:
     
            case WE_BABY:             if(sd) {                 struct map_session_data *f_sd = pc->get_father(sd);                 struct map_session_data *m_sd = pc->get_mother(sd);                 bool we_baby_parents = false;                 if(m_sd && check_distance_bl(bl,&m_sd->bl,AREA_SIZE)) {                     sc_start(src,&m_sd->bl,type,100,skill_lv,skill->get_time(skill_id,skill_lv));                     clif->specialeffect(&m_sd->bl,408,AREA);                     we_baby_parents = true;                 }     Aqui está sendo utilizado como exemplo a habilidade de convocação das classes bebês. Onde 408 é o efeito adicionado para que seja mostrado ao utilizar a skill. Para a sua habilidade customizada, como ela é uma habilidade nova, não há nenhum efeito, então você terá que adicioná-lo ao arquivo, seguindo de exemplo a mesma forma mostrada acima. Para saber a lista de todos os efeitos, basta utilizar doc/effect_list.txt.     Fontes e créditos   https://github.com/HerculesWS/ https://github.com/Cronus-Emulator/ https://github.com/brAthena/ https://github.com/rAthena/ http://forum.cronus-emulator.com/ https://forum.brathena.org/ http://herc.ws/wiki/Adding_new_skills http://herc.ws/ https://google.com/   Comentários   Decidi fazer esse tutorial pois percebi que ainda não há nenhum guia com esse assunto em PT-BR e havia uma grande demanda de pessoas procurando. Tinha dado uma olhada no Hercules e percebi que é um bom tutorial, mas ainda estava incompleto e bem desatualizado, então decidi usa-lo como base e também pensei, por que não criar um? Espero que esteja de boa compreensão, caso estiver faltando algo que eu esqueci ou que eu não saiba, por favor me informe para torná-lo o melhor possível. Estou aberto a sugestões e críticas construtivas. Façam um bom proveito 
  16. Upvote
    Like it~* got a reaction from fxfreitas in [Guia e orientação] Criando habilidades. PT-BR   
    Criando habilidades ou clonando-as   Introdução   Uma grande área onde os jogadores têm dificuldade é adicionar novas habilidades para a fonte e o cliente. Abaixo será documentado como implementar essas novas habilidades.   A habilidade   A habilidade que estaremos trabalhando é simples.  
    Nome: Earth Bolt Level Máx: 10 Tipo: Ativa Custo de SP: 20 + 5*SkillLV Alvo: 1 inimigo Tempo de conjuração: 2 seg Delay: 1 seg Duração: Instantânea Descrição: Causa dano mágico de elemento terra ao inimigo, conforme level da habilidade, a 150% MATK por hit. Basicamente, essa habilidade deve atingir 1 inimigo e lidar com 10 hits de 150% MATK, propriedade elemental da Terra e deve ser baseada em dano mágico.    
    Abra /src/map/skill.h Role para baixo até encontrar  
    EL_STONE_HAMMER, EL_ROCK_CRUSHER, EL_ROCK_CRUSHER_ATK, EL_STONE_RAIN,    
    Depois daqui é onde nós adicionamos quaisquer habilidades adicionais. É melhor dar às habilidades um ID personalizado para começar. Então, vamos adicionar a nossa habilidade "Earth Bolt". Depois disso, adicione MG_EARTHBOLT = 8443,    
    MG_ definição significa "Mago", você vai trabalhar para fora as siglas como você percorrer as habilidades. Definimos a base da habilidade. Como você pode ver, o id de habilidade é definido como '8443' desde Stone Elemental's Stone Rain é definido como 8442 (e é o última habilidade de jogador acessível).   Abra /src/map/skill.c   Esse arquivo é onde definimos as implementações de habilidades reais. Para habilidades de alvo único, todo o processamento dessa habilidade irá em skill_castend_damage_id (para habilidades prejudiciais) ou skill_castend_nodamage_id (para skills que não causam danos).   Habilidades baseadas em mágica ou mágia.   Como o Earth Bolt é baseado em danos, encontre a função skill_castend_damage_id e localize:  
        case AB_RENOVATIO:     case AB_HIGHNESSHEAL:     case AB_DUPLELIGHT_MAGIC:     case WM_METALICSOUND:     case MH_ERASER_CUTTER:     case KO_KAIHOU:    
    A razão pela qual estaremos colocando a case para Earth Bolt aqui é porque:    
           skill->attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);    
    A definição BF_MAGIC significa que a habilidade é baseada em magia e deve ser calculada sob cálculos de batalha mágica. Assim, após a case NJ_HUUJIN adicionar:  
        case MG_EARTHBOLT:    
    Habilidades baseadas em armas   No caso de querer adicionar uma habilidade que é baseada em Arma, em vez de Magia, encontre:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:    
    E adicione a case depois disso. Se quiséssemos que o Earth Bolt fosse baseado em armas, ficaria assim:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:     case MG_EARTHBOLT:    
    No entanto, vamos manter a função Magic em vez disso.   Abra /src/map/battle.c   Nesta função, todos os cálculos de danos principais são realizados. E em funções separadas, as % modificadoras para as habilidades são armazenados. Portanto, para os nossos danos de 150%, adicionamos o extra de 50% (já que 100% é o padrão) na função apropriada. Ataques baseado em mágica Para ataques baseados em Magia, os modificadores são encontrados em battle_calc_magic_attack. Basta encontrar:  
    case NPC_EARTHQUAKE:     skillratio += 100 +100*skill_lv +100*(skill_lv/2);     break;    
    E adicione o modificador de danos abaixo. Como Earth Bolt é baseado em magia, nós adicionaremos-a aqui.  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    Isso agora significa que o Earth Bolt causará dano mágico de 150% MATK.   Átaques baseado em armas   Para ataques baseados em armas, os modificadores são encontrados em battle_calc_weapon_attack. Basta encontrar:  
        case NPC_VAMPIRE_GIFT:         skillratio += ((skill_lv-1)%5+1)*100;         break;    
    E adicione seu modificador de dano lá. Por exemplo, se o Earth Bolt fosse baseado em Weapon, acrescentaríamos:  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    O + = 50 significa simplesmente "Adicionar 50% ao 100%" para danos de ATK de 150%.   Suporte a banco de dados de habilidades   Tecnicamente falando, a base da habilidade está agora correta. Claro, se você quiser implementar habilidades mais complexas, há muito mais para isso. A seção separada será criada no futuro para isso. Mas, por enquanto, precisamos implementar as entradas do banco de dados de habilidades. Os arquivos abaixo podem ser encontrados em db / (pre / re) /. Apenas um de ambos (pre / re) precisa ser atualizado, é o qual você usa em seu servidor.   Nessa parte é sempre aconselhável que você tenha alguma habilidade escolhida para se utilizar como base, pois facilitará muito a criação e/ou clonagem de sua habilidade. Aqui há diferenças, então dependendo do emulador usado, cada forma será de um jeito, caso o seu emulador seja alguns dos abaixos, continue. Caso não, pule para a parte: ** p/ Hercules.   ** p/ rAthena, brAthena, Cronus.   Skill_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,5,8,1,2,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic, 0, MG_EARTHBOLT, Earth Bolt    
    Isso define que: Earth Bolt tem um intervalo de 5 células, bate várias vezes, é elemento da Terra e alvos 1 inimigo. Ele pode ser interrompido, e é de dano de tipo mágico. A quantidade de acessos aumenta em 1 em cada nível, com um nível máximo de 10.   Skill_cast_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,2000,1,000,0,0,0    
    Isso define que: Earth Bolt tem um segundo tempo de ligação e um tempo de atraso de 1 segundo. Não há atraso de caminhada após o lançamento.   Skill_require_db.txt   Para o nosso Earth Bolt, podemos agora digitar o seguinte: Estrutura:
     
    8443,0,0,25: 30: 35: 40: 45: 50: 55: 60: 65: 70,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
    Isso define que: Earth Bolt requer 25 SP no nível 1, 30 SP no nível 2 .. 70 SP no nível 10. Pode ser lançado com qualquer arma, não requer nenhum estado e não requer nenhum item para ser consumido. =========================================================================== ** p/ Hercules.   Skill_db.txt  
     
     
     
    ===========================================================================   Skill_tree.txt   Esta parte do banco de dados não é necessária se não for lida por uma classe. No entanto, se você quiser que uma classe aprenda uma habilidade, você deve fazer uma entrada em skill_tree.txt. Um exemplo abaixo:
     
    MG_EARTHBOLT: { MaxLevel: 10 MG_FIREBOLT: 5 MG_LIGHTNINGBOLT: 5 }   Isso define que: Earth Bolt pode ser aprendido por Mago, tem um nível máximo de 10 (para esta classe), e requer habilidade MG_FIREBOLT no nível 5 e habilidade MG_LIGHTNINGBOLT no nível 5. Tecnicamente, estas são as partes geralmente utilizas com arquivos de banco de dados de habilidade. Há mais, mas isso ficará pra vocês explorarem.   Arquivos .lua e .lub   As seguintes implementações estão de acordo com a Revisão 228 do Projeto Lua (2012-05-23). A implementação é diferente entre muitas versões de cliente, mas geralmente há 2 implementações:   Sem arquivos skillinfoz   Em data/lua files/skillinfo/skilltreeview.lua encontre: {"MG_FIREWALL", 18; Pos = 19, MaxLv = 10, NeedSkillList = {6, 12}} Adicione a baixo:
    {"MG_EARTHBOLT",8443; Pos = 20, MaxLv = 10, NeedSkillList = {19,20}}  
    Com arquivos skillinfoz   Em skillid.lua encontre: ECLAGE_RECALL = 3035, Depois adicione:
    MG_EARTHBOLT = 8443, in data/lua files/skillinfo/skilldescript.lua localize:
    [SKID.MG_THUNDERSTORM] = { "Thunder Storm", "Max Level:^777777 10 ^000000", "Type:^777777 Offensive ^000000", "SP Cost:^777777 24 + 5*SkillLV ^000000", "Target:^777777 cell ^000000", "Range:^777777 9 cells ^000000", "Cast Time:^777777 1*SkillLV sec ^000000", "Cool Down:^777777 2 sec ^000000", "Duration:^777777 0.2*SkillLV sec ^000000", "Effect:^777777 Hits every Enemy in a 5x5 area around the targeted cell with 1 Wind Element Bolt per level at a rate of 1 bolt every 0.2 seconds. Each bolt does 0.8*MATK Wind element damage. ^000000", "[LV 1]^777777 1 Bolt ^000000", "[LV 2]^777777 2 Bolts ^000000", "[LV 3]^777777 3 Bolts ^000000", "[LV 4]^777777 4 Bolts ^000000", "[LV 5]^777777 5 Bolts ^000000", "[LV 6]^777777 6 Bolts ^000000", "[LV 7]^777777 7 Bolts ^000000", "[LV 8]^777777 8 Bolts ^000000", "[LV 9]^777777 9 Bolts ^000000", "[LV 10]^777777 10 Bolts ^000000", }, Depois adicione:
    [SKID.MG_EARTHBOLT] = { "Earth Bolt", "Max Level:^777777 10 ^000000" "Type:^77777 Active ^000000" "SP Cost:^777777 20 + 5*SkillLV ^000000" "Target:^777777 1 Enemy ^000000" "Cast Time:^777777 2 sec ^000000" "Cool Down:^777777 1 sec ^000000" "Duration:^777777 Instant ^000000" "Effect: ^777777 Deals SkillLV bolts of Earth magic damage to one enemy, at 150% MATK per hit.^000000", }, skilltreeview.lua mude:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL },  para:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL, [20] = SKID.MG_EARTHBOLT }, skillinfolist.lua Mude:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, } Para:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, }, [SKID.MG_EARTHBOLT] = { "MG_EARTHBOLT"; SkillName = "Earth Bolt", MaxLv = 10, SpAmount = { 25, 30, 35, 40, 45, 50, 55, 60, 65, 70 }, _NeedSkillList = { { SKID.MG_FIREBOLT, 5}, { SKID.MG_LIGHTNINGBOLT, 5} } Finalizando   Não se esqueça que você precisará de adicionar o arquivo Sprite e BMP apropriado para a habilidade. Use o nome MG_EARTHBOLT como o nome do arquivo em: data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item data\sprite\¾ÆÀÌÅÛ   Efeitos   Vá a src/map/skill.h, Procure a skill que deseja adicionar/editar o efeito:
     
            case WE_BABY:             if(sd) {                 struct map_session_data *f_sd = pc->get_father(sd);                 struct map_session_data *m_sd = pc->get_mother(sd);                 bool we_baby_parents = false;                 if(m_sd && check_distance_bl(bl,&m_sd->bl,AREA_SIZE)) {                     sc_start(src,&m_sd->bl,type,100,skill_lv,skill->get_time(skill_id,skill_lv));                     clif->specialeffect(&m_sd->bl,408,AREA);                     we_baby_parents = true;                 }     Aqui está sendo utilizado como exemplo a habilidade de convocação das classes bebês. Onde 408 é o efeito adicionado para que seja mostrado ao utilizar a skill. Para a sua habilidade customizada, como ela é uma habilidade nova, não há nenhum efeito, então você terá que adicioná-lo ao arquivo, seguindo de exemplo a mesma forma mostrada acima. Para saber a lista de todos os efeitos, basta utilizar doc/effect_list.txt.     Fontes e créditos   https://github.com/HerculesWS/ https://github.com/Cronus-Emulator/ https://github.com/brAthena/ https://github.com/rAthena/ http://forum.cronus-emulator.com/ https://forum.brathena.org/ http://herc.ws/wiki/Adding_new_skills http://herc.ws/ https://google.com/   Comentários   Decidi fazer esse tutorial pois percebi que ainda não há nenhum guia com esse assunto em PT-BR e havia uma grande demanda de pessoas procurando. Tinha dado uma olhada no Hercules e percebi que é um bom tutorial, mas ainda estava incompleto e bem desatualizado, então decidi usa-lo como base e também pensei, por que não criar um? Espero que esteja de boa compreensão, caso estiver faltando algo que eu esqueci ou que eu não saiba, por favor me informe para torná-lo o melhor possível. Estou aberto a sugestões e críticas construtivas. Façam um bom proveito 
  17. Upvote
    Like it~* reacted to Cretino in PK Mode and Job Restrictions   
    Hey there!
    I think is it you want:
     
    battle.c.patch
     
    It exclude first and second class non high.
     
    Exeptions:
     
    Super Novice Star Gladiator Rebellion Kagerou&Oboro Gunslinger Ninja Soul Linker  
    If you want to add more or remove, follow the 'example' I used.
  18. Upvote
    Like it~* got a reaction from Senos in [Guia e orientação] Criando habilidades. PT-BR   
    Criando habilidades ou clonando-as   Introdução   Uma grande área onde os jogadores têm dificuldade é adicionar novas habilidades para a fonte e o cliente. Abaixo será documentado como implementar essas novas habilidades.   A habilidade   A habilidade que estaremos trabalhando é simples.  
    Nome: Earth Bolt Level Máx: 10 Tipo: Ativa Custo de SP: 20 + 5*SkillLV Alvo: 1 inimigo Tempo de conjuração: 2 seg Delay: 1 seg Duração: Instantânea Descrição: Causa dano mágico de elemento terra ao inimigo, conforme level da habilidade, a 150% MATK por hit. Basicamente, essa habilidade deve atingir 1 inimigo e lidar com 10 hits de 150% MATK, propriedade elemental da Terra e deve ser baseada em dano mágico.    
    Abra /src/map/skill.h Role para baixo até encontrar  
    EL_STONE_HAMMER, EL_ROCK_CRUSHER, EL_ROCK_CRUSHER_ATK, EL_STONE_RAIN,    
    Depois daqui é onde nós adicionamos quaisquer habilidades adicionais. É melhor dar às habilidades um ID personalizado para começar. Então, vamos adicionar a nossa habilidade "Earth Bolt". Depois disso, adicione MG_EARTHBOLT = 8443,    
    MG_ definição significa "Mago", você vai trabalhar para fora as siglas como você percorrer as habilidades. Definimos a base da habilidade. Como você pode ver, o id de habilidade é definido como '8443' desde Stone Elemental's Stone Rain é definido como 8442 (e é o última habilidade de jogador acessível).   Abra /src/map/skill.c   Esse arquivo é onde definimos as implementações de habilidades reais. Para habilidades de alvo único, todo o processamento dessa habilidade irá em skill_castend_damage_id (para habilidades prejudiciais) ou skill_castend_nodamage_id (para skills que não causam danos).   Habilidades baseadas em mágica ou mágia.   Como o Earth Bolt é baseado em danos, encontre a função skill_castend_damage_id e localize:  
        case AB_RENOVATIO:     case AB_HIGHNESSHEAL:     case AB_DUPLELIGHT_MAGIC:     case WM_METALICSOUND:     case MH_ERASER_CUTTER:     case KO_KAIHOU:    
    A razão pela qual estaremos colocando a case para Earth Bolt aqui é porque:    
           skill->attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);    
    A definição BF_MAGIC significa que a habilidade é baseada em magia e deve ser calculada sob cálculos de batalha mágica. Assim, após a case NJ_HUUJIN adicionar:  
        case MG_EARTHBOLT:    
    Habilidades baseadas em armas   No caso de querer adicionar uma habilidade que é baseada em Arma, em vez de Magia, encontre:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:    
    E adicione a case depois disso. Se quiséssemos que o Earth Bolt fosse baseado em armas, ficaria assim:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:     case MG_EARTHBOLT:    
    No entanto, vamos manter a função Magic em vez disso.   Abra /src/map/battle.c   Nesta função, todos os cálculos de danos principais são realizados. E em funções separadas, as % modificadoras para as habilidades são armazenados. Portanto, para os nossos danos de 150%, adicionamos o extra de 50% (já que 100% é o padrão) na função apropriada. Ataques baseado em mágica Para ataques baseados em Magia, os modificadores são encontrados em battle_calc_magic_attack. Basta encontrar:  
    case NPC_EARTHQUAKE:     skillratio += 100 +100*skill_lv +100*(skill_lv/2);     break;    
    E adicione o modificador de danos abaixo. Como Earth Bolt é baseado em magia, nós adicionaremos-a aqui.  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    Isso agora significa que o Earth Bolt causará dano mágico de 150% MATK.   Átaques baseado em armas   Para ataques baseados em armas, os modificadores são encontrados em battle_calc_weapon_attack. Basta encontrar:  
        case NPC_VAMPIRE_GIFT:         skillratio += ((skill_lv-1)%5+1)*100;         break;    
    E adicione seu modificador de dano lá. Por exemplo, se o Earth Bolt fosse baseado em Weapon, acrescentaríamos:  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    O + = 50 significa simplesmente "Adicionar 50% ao 100%" para danos de ATK de 150%.   Suporte a banco de dados de habilidades   Tecnicamente falando, a base da habilidade está agora correta. Claro, se você quiser implementar habilidades mais complexas, há muito mais para isso. A seção separada será criada no futuro para isso. Mas, por enquanto, precisamos implementar as entradas do banco de dados de habilidades. Os arquivos abaixo podem ser encontrados em db / (pre / re) /. Apenas um de ambos (pre / re) precisa ser atualizado, é o qual você usa em seu servidor.   Nessa parte é sempre aconselhável que você tenha alguma habilidade escolhida para se utilizar como base, pois facilitará muito a criação e/ou clonagem de sua habilidade. Aqui há diferenças, então dependendo do emulador usado, cada forma será de um jeito, caso o seu emulador seja alguns dos abaixos, continue. Caso não, pule para a parte: ** p/ Hercules.   ** p/ rAthena, brAthena, Cronus.   Skill_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,5,8,1,2,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic, 0, MG_EARTHBOLT, Earth Bolt    
    Isso define que: Earth Bolt tem um intervalo de 5 células, bate várias vezes, é elemento da Terra e alvos 1 inimigo. Ele pode ser interrompido, e é de dano de tipo mágico. A quantidade de acessos aumenta em 1 em cada nível, com um nível máximo de 10.   Skill_cast_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,2000,1,000,0,0,0    
    Isso define que: Earth Bolt tem um segundo tempo de ligação e um tempo de atraso de 1 segundo. Não há atraso de caminhada após o lançamento.   Skill_require_db.txt   Para o nosso Earth Bolt, podemos agora digitar o seguinte: Estrutura:
     
    8443,0,0,25: 30: 35: 40: 45: 50: 55: 60: 65: 70,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
    Isso define que: Earth Bolt requer 25 SP no nível 1, 30 SP no nível 2 .. 70 SP no nível 10. Pode ser lançado com qualquer arma, não requer nenhum estado e não requer nenhum item para ser consumido. =========================================================================== ** p/ Hercules.   Skill_db.txt  
     
     
     
    ===========================================================================   Skill_tree.txt   Esta parte do banco de dados não é necessária se não for lida por uma classe. No entanto, se você quiser que uma classe aprenda uma habilidade, você deve fazer uma entrada em skill_tree.txt. Um exemplo abaixo:
     
    MG_EARTHBOLT: { MaxLevel: 10 MG_FIREBOLT: 5 MG_LIGHTNINGBOLT: 5 }   Isso define que: Earth Bolt pode ser aprendido por Mago, tem um nível máximo de 10 (para esta classe), e requer habilidade MG_FIREBOLT no nível 5 e habilidade MG_LIGHTNINGBOLT no nível 5. Tecnicamente, estas são as partes geralmente utilizas com arquivos de banco de dados de habilidade. Há mais, mas isso ficará pra vocês explorarem.   Arquivos .lua e .lub   As seguintes implementações estão de acordo com a Revisão 228 do Projeto Lua (2012-05-23). A implementação é diferente entre muitas versões de cliente, mas geralmente há 2 implementações:   Sem arquivos skillinfoz   Em data/lua files/skillinfo/skilltreeview.lua encontre: {"MG_FIREWALL", 18; Pos = 19, MaxLv = 10, NeedSkillList = {6, 12}} Adicione a baixo:
    {"MG_EARTHBOLT",8443; Pos = 20, MaxLv = 10, NeedSkillList = {19,20}}  
    Com arquivos skillinfoz   Em skillid.lua encontre: ECLAGE_RECALL = 3035, Depois adicione:
    MG_EARTHBOLT = 8443, in data/lua files/skillinfo/skilldescript.lua localize:
    [SKID.MG_THUNDERSTORM] = { "Thunder Storm", "Max Level:^777777 10 ^000000", "Type:^777777 Offensive ^000000", "SP Cost:^777777 24 + 5*SkillLV ^000000", "Target:^777777 cell ^000000", "Range:^777777 9 cells ^000000", "Cast Time:^777777 1*SkillLV sec ^000000", "Cool Down:^777777 2 sec ^000000", "Duration:^777777 0.2*SkillLV sec ^000000", "Effect:^777777 Hits every Enemy in a 5x5 area around the targeted cell with 1 Wind Element Bolt per level at a rate of 1 bolt every 0.2 seconds. Each bolt does 0.8*MATK Wind element damage. ^000000", "[LV 1]^777777 1 Bolt ^000000", "[LV 2]^777777 2 Bolts ^000000", "[LV 3]^777777 3 Bolts ^000000", "[LV 4]^777777 4 Bolts ^000000", "[LV 5]^777777 5 Bolts ^000000", "[LV 6]^777777 6 Bolts ^000000", "[LV 7]^777777 7 Bolts ^000000", "[LV 8]^777777 8 Bolts ^000000", "[LV 9]^777777 9 Bolts ^000000", "[LV 10]^777777 10 Bolts ^000000", }, Depois adicione:
    [SKID.MG_EARTHBOLT] = { "Earth Bolt", "Max Level:^777777 10 ^000000" "Type:^77777 Active ^000000" "SP Cost:^777777 20 + 5*SkillLV ^000000" "Target:^777777 1 Enemy ^000000" "Cast Time:^777777 2 sec ^000000" "Cool Down:^777777 1 sec ^000000" "Duration:^777777 Instant ^000000" "Effect: ^777777 Deals SkillLV bolts of Earth magic damage to one enemy, at 150% MATK per hit.^000000", }, skilltreeview.lua mude:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL },  para:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL, [20] = SKID.MG_EARTHBOLT }, skillinfolist.lua Mude:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, } Para:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, }, [SKID.MG_EARTHBOLT] = { "MG_EARTHBOLT"; SkillName = "Earth Bolt", MaxLv = 10, SpAmount = { 25, 30, 35, 40, 45, 50, 55, 60, 65, 70 }, _NeedSkillList = { { SKID.MG_FIREBOLT, 5}, { SKID.MG_LIGHTNINGBOLT, 5} } Finalizando   Não se esqueça que você precisará de adicionar o arquivo Sprite e BMP apropriado para a habilidade. Use o nome MG_EARTHBOLT como o nome do arquivo em: data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item data\sprite\¾ÆÀÌÅÛ   Efeitos   Vá a src/map/skill.h, Procure a skill que deseja adicionar/editar o efeito:
     
            case WE_BABY:             if(sd) {                 struct map_session_data *f_sd = pc->get_father(sd);                 struct map_session_data *m_sd = pc->get_mother(sd);                 bool we_baby_parents = false;                 if(m_sd && check_distance_bl(bl,&m_sd->bl,AREA_SIZE)) {                     sc_start(src,&m_sd->bl,type,100,skill_lv,skill->get_time(skill_id,skill_lv));                     clif->specialeffect(&m_sd->bl,408,AREA);                     we_baby_parents = true;                 }     Aqui está sendo utilizado como exemplo a habilidade de convocação das classes bebês. Onde 408 é o efeito adicionado para que seja mostrado ao utilizar a skill. Para a sua habilidade customizada, como ela é uma habilidade nova, não há nenhum efeito, então você terá que adicioná-lo ao arquivo, seguindo de exemplo a mesma forma mostrada acima. Para saber a lista de todos os efeitos, basta utilizar doc/effect_list.txt.     Fontes e créditos   https://github.com/HerculesWS/ https://github.com/Cronus-Emulator/ https://github.com/brAthena/ https://github.com/rAthena/ http://forum.cronus-emulator.com/ https://forum.brathena.org/ http://herc.ws/wiki/Adding_new_skills http://herc.ws/ https://google.com/   Comentários   Decidi fazer esse tutorial pois percebi que ainda não há nenhum guia com esse assunto em PT-BR e havia uma grande demanda de pessoas procurando. Tinha dado uma olhada no Hercules e percebi que é um bom tutorial, mas ainda estava incompleto e bem desatualizado, então decidi usa-lo como base e também pensei, por que não criar um? Espero que esteja de boa compreensão, caso estiver faltando algo que eu esqueci ou que eu não saiba, por favor me informe para torná-lo o melhor possível. Estou aberto a sugestões e críticas construtivas. Façam um bom proveito 
  19. Upvote
    Like it~* got a reaction from JulioCF in [Guia e orientação] Criando habilidades. PT-BR   
    Criando habilidades ou clonando-as   Introdução   Uma grande área onde os jogadores têm dificuldade é adicionar novas habilidades para a fonte e o cliente. Abaixo será documentado como implementar essas novas habilidades.   A habilidade   A habilidade que estaremos trabalhando é simples.  
    Nome: Earth Bolt Level Máx: 10 Tipo: Ativa Custo de SP: 20 + 5*SkillLV Alvo: 1 inimigo Tempo de conjuração: 2 seg Delay: 1 seg Duração: Instantânea Descrição: Causa dano mágico de elemento terra ao inimigo, conforme level da habilidade, a 150% MATK por hit. Basicamente, essa habilidade deve atingir 1 inimigo e lidar com 10 hits de 150% MATK, propriedade elemental da Terra e deve ser baseada em dano mágico.    
    Abra /src/map/skill.h Role para baixo até encontrar  
    EL_STONE_HAMMER, EL_ROCK_CRUSHER, EL_ROCK_CRUSHER_ATK, EL_STONE_RAIN,    
    Depois daqui é onde nós adicionamos quaisquer habilidades adicionais. É melhor dar às habilidades um ID personalizado para começar. Então, vamos adicionar a nossa habilidade "Earth Bolt". Depois disso, adicione MG_EARTHBOLT = 8443,    
    MG_ definição significa "Mago", você vai trabalhar para fora as siglas como você percorrer as habilidades. Definimos a base da habilidade. Como você pode ver, o id de habilidade é definido como '8443' desde Stone Elemental's Stone Rain é definido como 8442 (e é o última habilidade de jogador acessível).   Abra /src/map/skill.c   Esse arquivo é onde definimos as implementações de habilidades reais. Para habilidades de alvo único, todo o processamento dessa habilidade irá em skill_castend_damage_id (para habilidades prejudiciais) ou skill_castend_nodamage_id (para skills que não causam danos).   Habilidades baseadas em mágica ou mágia.   Como o Earth Bolt é baseado em danos, encontre a função skill_castend_damage_id e localize:  
        case AB_RENOVATIO:     case AB_HIGHNESSHEAL:     case AB_DUPLELIGHT_MAGIC:     case WM_METALICSOUND:     case MH_ERASER_CUTTER:     case KO_KAIHOU:    
    A razão pela qual estaremos colocando a case para Earth Bolt aqui é porque:    
           skill->attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);    
    A definição BF_MAGIC significa que a habilidade é baseada em magia e deve ser calculada sob cálculos de batalha mágica. Assim, após a case NJ_HUUJIN adicionar:  
        case MG_EARTHBOLT:    
    Habilidades baseadas em armas   No caso de querer adicionar uma habilidade que é baseada em Arma, em vez de Magia, encontre:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:    
    E adicione a case depois disso. Se quiséssemos que o Earth Bolt fosse baseado em armas, ficaria assim:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:     case MG_EARTHBOLT:    
    No entanto, vamos manter a função Magic em vez disso.   Abra /src/map/battle.c   Nesta função, todos os cálculos de danos principais são realizados. E em funções separadas, as % modificadoras para as habilidades são armazenados. Portanto, para os nossos danos de 150%, adicionamos o extra de 50% (já que 100% é o padrão) na função apropriada. Ataques baseado em mágica Para ataques baseados em Magia, os modificadores são encontrados em battle_calc_magic_attack. Basta encontrar:  
    case NPC_EARTHQUAKE:     skillratio += 100 +100*skill_lv +100*(skill_lv/2);     break;    
    E adicione o modificador de danos abaixo. Como Earth Bolt é baseado em magia, nós adicionaremos-a aqui.  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    Isso agora significa que o Earth Bolt causará dano mágico de 150% MATK.   Átaques baseado em armas   Para ataques baseados em armas, os modificadores são encontrados em battle_calc_weapon_attack. Basta encontrar:  
        case NPC_VAMPIRE_GIFT:         skillratio += ((skill_lv-1)%5+1)*100;         break;    
    E adicione seu modificador de dano lá. Por exemplo, se o Earth Bolt fosse baseado em Weapon, acrescentaríamos:  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    O + = 50 significa simplesmente "Adicionar 50% ao 100%" para danos de ATK de 150%.   Suporte a banco de dados de habilidades   Tecnicamente falando, a base da habilidade está agora correta. Claro, se você quiser implementar habilidades mais complexas, há muito mais para isso. A seção separada será criada no futuro para isso. Mas, por enquanto, precisamos implementar as entradas do banco de dados de habilidades. Os arquivos abaixo podem ser encontrados em db / (pre / re) /. Apenas um de ambos (pre / re) precisa ser atualizado, é o qual você usa em seu servidor.   Nessa parte é sempre aconselhável que você tenha alguma habilidade escolhida para se utilizar como base, pois facilitará muito a criação e/ou clonagem de sua habilidade. Aqui há diferenças, então dependendo do emulador usado, cada forma será de um jeito, caso o seu emulador seja alguns dos abaixos, continue. Caso não, pule para a parte: ** p/ Hercules.   ** p/ rAthena, brAthena, Cronus.   Skill_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,5,8,1,2,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic, 0, MG_EARTHBOLT, Earth Bolt    
    Isso define que: Earth Bolt tem um intervalo de 5 células, bate várias vezes, é elemento da Terra e alvos 1 inimigo. Ele pode ser interrompido, e é de dano de tipo mágico. A quantidade de acessos aumenta em 1 em cada nível, com um nível máximo de 10.   Skill_cast_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,2000,1,000,0,0,0    
    Isso define que: Earth Bolt tem um segundo tempo de ligação e um tempo de atraso de 1 segundo. Não há atraso de caminhada após o lançamento.   Skill_require_db.txt   Para o nosso Earth Bolt, podemos agora digitar o seguinte: Estrutura:
     
    8443,0,0,25: 30: 35: 40: 45: 50: 55: 60: 65: 70,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
    Isso define que: Earth Bolt requer 25 SP no nível 1, 30 SP no nível 2 .. 70 SP no nível 10. Pode ser lançado com qualquer arma, não requer nenhum estado e não requer nenhum item para ser consumido. =========================================================================== ** p/ Hercules.   Skill_db.txt  
     
     
     
    ===========================================================================   Skill_tree.txt   Esta parte do banco de dados não é necessária se não for lida por uma classe. No entanto, se você quiser que uma classe aprenda uma habilidade, você deve fazer uma entrada em skill_tree.txt. Um exemplo abaixo:
     
    MG_EARTHBOLT: { MaxLevel: 10 MG_FIREBOLT: 5 MG_LIGHTNINGBOLT: 5 }   Isso define que: Earth Bolt pode ser aprendido por Mago, tem um nível máximo de 10 (para esta classe), e requer habilidade MG_FIREBOLT no nível 5 e habilidade MG_LIGHTNINGBOLT no nível 5. Tecnicamente, estas são as partes geralmente utilizas com arquivos de banco de dados de habilidade. Há mais, mas isso ficará pra vocês explorarem.   Arquivos .lua e .lub   As seguintes implementações estão de acordo com a Revisão 228 do Projeto Lua (2012-05-23). A implementação é diferente entre muitas versões de cliente, mas geralmente há 2 implementações:   Sem arquivos skillinfoz   Em data/lua files/skillinfo/skilltreeview.lua encontre: {"MG_FIREWALL", 18; Pos = 19, MaxLv = 10, NeedSkillList = {6, 12}} Adicione a baixo:
    {"MG_EARTHBOLT",8443; Pos = 20, MaxLv = 10, NeedSkillList = {19,20}}  
    Com arquivos skillinfoz   Em skillid.lua encontre: ECLAGE_RECALL = 3035, Depois adicione:
    MG_EARTHBOLT = 8443, in data/lua files/skillinfo/skilldescript.lua localize:
    [SKID.MG_THUNDERSTORM] = { "Thunder Storm", "Max Level:^777777 10 ^000000", "Type:^777777 Offensive ^000000", "SP Cost:^777777 24 + 5*SkillLV ^000000", "Target:^777777 cell ^000000", "Range:^777777 9 cells ^000000", "Cast Time:^777777 1*SkillLV sec ^000000", "Cool Down:^777777 2 sec ^000000", "Duration:^777777 0.2*SkillLV sec ^000000", "Effect:^777777 Hits every Enemy in a 5x5 area around the targeted cell with 1 Wind Element Bolt per level at a rate of 1 bolt every 0.2 seconds. Each bolt does 0.8*MATK Wind element damage. ^000000", "[LV 1]^777777 1 Bolt ^000000", "[LV 2]^777777 2 Bolts ^000000", "[LV 3]^777777 3 Bolts ^000000", "[LV 4]^777777 4 Bolts ^000000", "[LV 5]^777777 5 Bolts ^000000", "[LV 6]^777777 6 Bolts ^000000", "[LV 7]^777777 7 Bolts ^000000", "[LV 8]^777777 8 Bolts ^000000", "[LV 9]^777777 9 Bolts ^000000", "[LV 10]^777777 10 Bolts ^000000", }, Depois adicione:
    [SKID.MG_EARTHBOLT] = { "Earth Bolt", "Max Level:^777777 10 ^000000" "Type:^77777 Active ^000000" "SP Cost:^777777 20 + 5*SkillLV ^000000" "Target:^777777 1 Enemy ^000000" "Cast Time:^777777 2 sec ^000000" "Cool Down:^777777 1 sec ^000000" "Duration:^777777 Instant ^000000" "Effect: ^777777 Deals SkillLV bolts of Earth magic damage to one enemy, at 150% MATK per hit.^000000", }, skilltreeview.lua mude:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL },  para:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL, [20] = SKID.MG_EARTHBOLT }, skillinfolist.lua Mude:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, } Para:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, }, [SKID.MG_EARTHBOLT] = { "MG_EARTHBOLT"; SkillName = "Earth Bolt", MaxLv = 10, SpAmount = { 25, 30, 35, 40, 45, 50, 55, 60, 65, 70 }, _NeedSkillList = { { SKID.MG_FIREBOLT, 5}, { SKID.MG_LIGHTNINGBOLT, 5} } Finalizando   Não se esqueça que você precisará de adicionar o arquivo Sprite e BMP apropriado para a habilidade. Use o nome MG_EARTHBOLT como o nome do arquivo em: data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item data\sprite\¾ÆÀÌÅÛ   Efeitos   Vá a src/map/skill.h, Procure a skill que deseja adicionar/editar o efeito:
     
            case WE_BABY:             if(sd) {                 struct map_session_data *f_sd = pc->get_father(sd);                 struct map_session_data *m_sd = pc->get_mother(sd);                 bool we_baby_parents = false;                 if(m_sd && check_distance_bl(bl,&m_sd->bl,AREA_SIZE)) {                     sc_start(src,&m_sd->bl,type,100,skill_lv,skill->get_time(skill_id,skill_lv));                     clif->specialeffect(&m_sd->bl,408,AREA);                     we_baby_parents = true;                 }     Aqui está sendo utilizado como exemplo a habilidade de convocação das classes bebês. Onde 408 é o efeito adicionado para que seja mostrado ao utilizar a skill. Para a sua habilidade customizada, como ela é uma habilidade nova, não há nenhum efeito, então você terá que adicioná-lo ao arquivo, seguindo de exemplo a mesma forma mostrada acima. Para saber a lista de todos os efeitos, basta utilizar doc/effect_list.txt.     Fontes e créditos   https://github.com/HerculesWS/ https://github.com/Cronus-Emulator/ https://github.com/brAthena/ https://github.com/rAthena/ http://forum.cronus-emulator.com/ https://forum.brathena.org/ http://herc.ws/wiki/Adding_new_skills http://herc.ws/ https://google.com/   Comentários   Decidi fazer esse tutorial pois percebi que ainda não há nenhum guia com esse assunto em PT-BR e havia uma grande demanda de pessoas procurando. Tinha dado uma olhada no Hercules e percebi que é um bom tutorial, mas ainda estava incompleto e bem desatualizado, então decidi usa-lo como base e também pensei, por que não criar um? Espero que esteja de boa compreensão, caso estiver faltando algo que eu esqueci ou que eu não saiba, por favor me informe para torná-lo o melhor possível. Estou aberto a sugestões e críticas construtivas. Façam um bom proveito 
  20. Upvote
    Like it~* got a reaction from loki in [Guia e orientação] Criando habilidades. PT-BR   
    Criando habilidades ou clonando-as   Introdução   Uma grande área onde os jogadores têm dificuldade é adicionar novas habilidades para a fonte e o cliente. Abaixo será documentado como implementar essas novas habilidades.   A habilidade   A habilidade que estaremos trabalhando é simples.  
    Nome: Earth Bolt Level Máx: 10 Tipo: Ativa Custo de SP: 20 + 5*SkillLV Alvo: 1 inimigo Tempo de conjuração: 2 seg Delay: 1 seg Duração: Instantânea Descrição: Causa dano mágico de elemento terra ao inimigo, conforme level da habilidade, a 150% MATK por hit. Basicamente, essa habilidade deve atingir 1 inimigo e lidar com 10 hits de 150% MATK, propriedade elemental da Terra e deve ser baseada em dano mágico.    
    Abra /src/map/skill.h Role para baixo até encontrar  
    EL_STONE_HAMMER, EL_ROCK_CRUSHER, EL_ROCK_CRUSHER_ATK, EL_STONE_RAIN,    
    Depois daqui é onde nós adicionamos quaisquer habilidades adicionais. É melhor dar às habilidades um ID personalizado para começar. Então, vamos adicionar a nossa habilidade "Earth Bolt". Depois disso, adicione MG_EARTHBOLT = 8443,    
    MG_ definição significa "Mago", você vai trabalhar para fora as siglas como você percorrer as habilidades. Definimos a base da habilidade. Como você pode ver, o id de habilidade é definido como '8443' desde Stone Elemental's Stone Rain é definido como 8442 (e é o última habilidade de jogador acessível).   Abra /src/map/skill.c   Esse arquivo é onde definimos as implementações de habilidades reais. Para habilidades de alvo único, todo o processamento dessa habilidade irá em skill_castend_damage_id (para habilidades prejudiciais) ou skill_castend_nodamage_id (para skills que não causam danos).   Habilidades baseadas em mágica ou mágia.   Como o Earth Bolt é baseado em danos, encontre a função skill_castend_damage_id e localize:  
        case AB_RENOVATIO:     case AB_HIGHNESSHEAL:     case AB_DUPLELIGHT_MAGIC:     case WM_METALICSOUND:     case MH_ERASER_CUTTER:     case KO_KAIHOU:    
    A razão pela qual estaremos colocando a case para Earth Bolt aqui é porque:    
           skill->attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);    
    A definição BF_MAGIC significa que a habilidade é baseada em magia e deve ser calculada sob cálculos de batalha mágica. Assim, após a case NJ_HUUJIN adicionar:  
        case MG_EARTHBOLT:    
    Habilidades baseadas em armas   No caso de querer adicionar uma habilidade que é baseada em Arma, em vez de Magia, encontre:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:    
    E adicione a case depois disso. Se quiséssemos que o Earth Bolt fosse baseado em armas, ficaria assim:  
        case WM_GREAT_ECHO:     case GN_SLINGITEM_RANGEMELEEATK:     case KO_JYUMONJIKIRI:     case KO_SETSUDAN:     case GC_DARKCROW:     case LG_OVERBRAND_BRANDISH:     case LG_OVERBRAND:     case MG_EARTHBOLT:    
    No entanto, vamos manter a função Magic em vez disso.   Abra /src/map/battle.c   Nesta função, todos os cálculos de danos principais são realizados. E em funções separadas, as % modificadoras para as habilidades são armazenados. Portanto, para os nossos danos de 150%, adicionamos o extra de 50% (já que 100% é o padrão) na função apropriada. Ataques baseado em mágica Para ataques baseados em Magia, os modificadores são encontrados em battle_calc_magic_attack. Basta encontrar:  
    case NPC_EARTHQUAKE:     skillratio += 100 +100*skill_lv +100*(skill_lv/2);     break;    
    E adicione o modificador de danos abaixo. Como Earth Bolt é baseado em magia, nós adicionaremos-a aqui.  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    Isso agora significa que o Earth Bolt causará dano mágico de 150% MATK.   Átaques baseado em armas   Para ataques baseados em armas, os modificadores são encontrados em battle_calc_weapon_attack. Basta encontrar:  
        case NPC_VAMPIRE_GIFT:         skillratio += ((skill_lv-1)%5+1)*100;         break;    
    E adicione seu modificador de dano lá. Por exemplo, se o Earth Bolt fosse baseado em Weapon, acrescentaríamos:  
        case MG_EARTHBOLT:         skillratio += 50;         break;    
    O + = 50 significa simplesmente "Adicionar 50% ao 100%" para danos de ATK de 150%.   Suporte a banco de dados de habilidades   Tecnicamente falando, a base da habilidade está agora correta. Claro, se você quiser implementar habilidades mais complexas, há muito mais para isso. A seção separada será criada no futuro para isso. Mas, por enquanto, precisamos implementar as entradas do banco de dados de habilidades. Os arquivos abaixo podem ser encontrados em db / (pre / re) /. Apenas um de ambos (pre / re) precisa ser atualizado, é o qual você usa em seu servidor.   Nessa parte é sempre aconselhável que você tenha alguma habilidade escolhida para se utilizar como base, pois facilitará muito a criação e/ou clonagem de sua habilidade. Aqui há diferenças, então dependendo do emulador usado, cada forma será de um jeito, caso o seu emulador seja alguns dos abaixos, continue. Caso não, pule para a parte: ** p/ Hercules.   ** p/ rAthena, brAthena, Cronus.   Skill_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,5,8,1,2,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic, 0, MG_EARTHBOLT, Earth Bolt    
    Isso define que: Earth Bolt tem um intervalo de 5 células, bate várias vezes, é elemento da Terra e alvos 1 inimigo. Ele pode ser interrompido, e é de dano de tipo mágico. A quantidade de acessos aumenta em 1 em cada nível, com um nível máximo de 10.   Skill_cast_db.txt   Para a nossa habilidade Earth Bolt, podemos agora digitar o seguinte: Estrutura:
    8443,2000,1,000,0,0,0    
    Isso define que: Earth Bolt tem um segundo tempo de ligação e um tempo de atraso de 1 segundo. Não há atraso de caminhada após o lançamento.   Skill_require_db.txt   Para o nosso Earth Bolt, podemos agora digitar o seguinte: Estrutura:
     
    8443,0,0,25: 30: 35: 40: 45: 50: 55: 60: 65: 70,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
    Isso define que: Earth Bolt requer 25 SP no nível 1, 30 SP no nível 2 .. 70 SP no nível 10. Pode ser lançado com qualquer arma, não requer nenhum estado e não requer nenhum item para ser consumido. =========================================================================== ** p/ Hercules.   Skill_db.txt  
     
     
     
    ===========================================================================   Skill_tree.txt   Esta parte do banco de dados não é necessária se não for lida por uma classe. No entanto, se você quiser que uma classe aprenda uma habilidade, você deve fazer uma entrada em skill_tree.txt. Um exemplo abaixo:
     
    MG_EARTHBOLT: { MaxLevel: 10 MG_FIREBOLT: 5 MG_LIGHTNINGBOLT: 5 }   Isso define que: Earth Bolt pode ser aprendido por Mago, tem um nível máximo de 10 (para esta classe), e requer habilidade MG_FIREBOLT no nível 5 e habilidade MG_LIGHTNINGBOLT no nível 5. Tecnicamente, estas são as partes geralmente utilizas com arquivos de banco de dados de habilidade. Há mais, mas isso ficará pra vocês explorarem.   Arquivos .lua e .lub   As seguintes implementações estão de acordo com a Revisão 228 do Projeto Lua (2012-05-23). A implementação é diferente entre muitas versões de cliente, mas geralmente há 2 implementações:   Sem arquivos skillinfoz   Em data/lua files/skillinfo/skilltreeview.lua encontre: {"MG_FIREWALL", 18; Pos = 19, MaxLv = 10, NeedSkillList = {6, 12}} Adicione a baixo:
    {"MG_EARTHBOLT",8443; Pos = 20, MaxLv = 10, NeedSkillList = {19,20}}  
    Com arquivos skillinfoz   Em skillid.lua encontre: ECLAGE_RECALL = 3035, Depois adicione:
    MG_EARTHBOLT = 8443, in data/lua files/skillinfo/skilldescript.lua localize:
    [SKID.MG_THUNDERSTORM] = { "Thunder Storm", "Max Level:^777777 10 ^000000", "Type:^777777 Offensive ^000000", "SP Cost:^777777 24 + 5*SkillLV ^000000", "Target:^777777 cell ^000000", "Range:^777777 9 cells ^000000", "Cast Time:^777777 1*SkillLV sec ^000000", "Cool Down:^777777 2 sec ^000000", "Duration:^777777 0.2*SkillLV sec ^000000", "Effect:^777777 Hits every Enemy in a 5x5 area around the targeted cell with 1 Wind Element Bolt per level at a rate of 1 bolt every 0.2 seconds. Each bolt does 0.8*MATK Wind element damage. ^000000", "[LV 1]^777777 1 Bolt ^000000", "[LV 2]^777777 2 Bolts ^000000", "[LV 3]^777777 3 Bolts ^000000", "[LV 4]^777777 4 Bolts ^000000", "[LV 5]^777777 5 Bolts ^000000", "[LV 6]^777777 6 Bolts ^000000", "[LV 7]^777777 7 Bolts ^000000", "[LV 8]^777777 8 Bolts ^000000", "[LV 9]^777777 9 Bolts ^000000", "[LV 10]^777777 10 Bolts ^000000", }, Depois adicione:
    [SKID.MG_EARTHBOLT] = { "Earth Bolt", "Max Level:^777777 10 ^000000" "Type:^77777 Active ^000000" "SP Cost:^777777 20 + 5*SkillLV ^000000" "Target:^777777 1 Enemy ^000000" "Cast Time:^777777 2 sec ^000000" "Cool Down:^777777 1 sec ^000000" "Duration:^777777 Instant ^000000" "Effect: ^777777 Deals SkillLV bolts of Earth magic damage to one enemy, at 150% MATK per hit.^000000", }, skilltreeview.lua mude:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL },  para:
    [JOBID.JT_MAGICIAN] = { [1] = SKID.MG_STONECURSE, [2] = SKID.MG_COLDBOLT, [3] = SKID.MG_LIGHTNINGBOLT, [4] = SKID.MG_NAPALMBEAT, [5] = SKID.MG_FIREBOLT, [6] = SKID.MG_SIGHT, [8] = SKID.MG_SRECOVERY, [9] = SKID.MG_FROSTDIVER, [10] = SKID.MG_THUNDERSTORM, [11] = SKID.MG_SOULSTRIKE, [12] = SKID.MG_FIREBALL, [13] = SKID.MG_ENERGYCOAT, [18] = SKID.MG_SAFETYWALL, [19] = SKID.MG_FIREWALL, [20] = SKID.MG_EARTHBOLT }, skillinfolist.lua Mude:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, } Para:
    [SKID.ECL_SEQUOIADUST] = { "ECL_SEQUOIADUST"; SkillName = "Sequoia Dust", MaxLv = 1, SpAmount = { 0 }, bSeperateLv = false, AttackRange = { 7 }, }, [SKID.MG_EARTHBOLT] = { "MG_EARTHBOLT"; SkillName = "Earth Bolt", MaxLv = 10, SpAmount = { 25, 30, 35, 40, 45, 50, 55, 60, 65, 70 }, _NeedSkillList = { { SKID.MG_FIREBOLT, 5}, { SKID.MG_LIGHTNINGBOLT, 5} } Finalizando   Não se esqueça que você precisará de adicionar o arquivo Sprite e BMP apropriado para a habilidade. Use o nome MG_EARTHBOLT como o nome do arquivo em: data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item data\sprite\¾ÆÀÌÅÛ   Efeitos   Vá a src/map/skill.h, Procure a skill que deseja adicionar/editar o efeito:
     
            case WE_BABY:             if(sd) {                 struct map_session_data *f_sd = pc->get_father(sd);                 struct map_session_data *m_sd = pc->get_mother(sd);                 bool we_baby_parents = false;                 if(m_sd && check_distance_bl(bl,&m_sd->bl,AREA_SIZE)) {                     sc_start(src,&m_sd->bl,type,100,skill_lv,skill->get_time(skill_id,skill_lv));                     clif->specialeffect(&m_sd->bl,408,AREA);                     we_baby_parents = true;                 }     Aqui está sendo utilizado como exemplo a habilidade de convocação das classes bebês. Onde 408 é o efeito adicionado para que seja mostrado ao utilizar a skill. Para a sua habilidade customizada, como ela é uma habilidade nova, não há nenhum efeito, então você terá que adicioná-lo ao arquivo, seguindo de exemplo a mesma forma mostrada acima. Para saber a lista de todos os efeitos, basta utilizar doc/effect_list.txt.     Fontes e créditos   https://github.com/HerculesWS/ https://github.com/Cronus-Emulator/ https://github.com/brAthena/ https://github.com/rAthena/ http://forum.cronus-emulator.com/ https://forum.brathena.org/ http://herc.ws/wiki/Adding_new_skills http://herc.ws/ https://google.com/   Comentários   Decidi fazer esse tutorial pois percebi que ainda não há nenhum guia com esse assunto em PT-BR e havia uma grande demanda de pessoas procurando. Tinha dado uma olhada no Hercules e percebi que é um bom tutorial, mas ainda estava incompleto e bem desatualizado, então decidi usa-lo como base e também pensei, por que não criar um? Espero que esteja de boa compreensão, caso estiver faltando algo que eu esqueci ou que eu não saiba, por favor me informe para torná-lo o melhor possível. Estou aberto a sugestões e críticas construtivas. Façam um bom proveito 
  21. Upvote
    Like it~* reacted to Ridley in Clan System   
    There was no update here for quite a while, but clans is actually ready and full configurable. You can set an inactivity timer, buffs and also add custom clans. Adel made a small image pack for a custom clan (which I attach upon the release).
    There is some last testing and then we show it to Haru and hope for a quick merge. Afterwards I do a topic about how everything works.
  22. Upvote
    Like it~* reacted to Tokeiburu in GRF Editor   
    File Name: GRF Editor
    File Submitter: Tokeiburu
    File Submitted: 20 Jun 2014
    File Category: Client Resources
     
    ** This program has been orignally uploaded on rAthena; it's been uploaded on Hercules due to multiple requests. If you have suggestions or feedback and you want a quick response, please contact me via rAthena. I will respond on Hercules' forum as well, but it'll take a bit longer .
     
    Hey everyone,
     
    This is a GRF tool I started to develop for my own personnal use, but I thought I'd share it since I've upgraded the UI. Its primary goal is to be easy to use while offering a wide variety of options and customizations. The software is quite stable and can handle large operations easily.
     
    How to install
    Download the zip archive provided from the download link at the bottom of this description or directly from there : http://www.mediafire.com/?aflylbhblrzpz0h
    Install the application with GRF Editor Installer.exe; if you are missing a .NET Framework you will be prompted to download it.
    Once you are done, you can start the program from the link on your desktop.

    Key features
    Overall speed is faster (or at least equal) than any GRF tool.
    Common operations : add, delete, merge, extract, preview, save.
    Undo and redo for any operation.
    It can open any GRF file.
    Clean and very interactive interface.
    Saving formats supported : 0x200, 0x103 and 0x102 (through the Settings page).
    Instant filter and search options (example : "map .gat").
    File association and context menus integration for .grf, .gpf and .rgz (through the Settings page).
    Can rebuild separated images into one file easily.
    Lub decompilation (in beta, but it can decompile almost any lub file so far).
    Drag and drop (with the ALT key, can be modified in the Settings page). This is a big part of the software; most of the items can be moved around within the application itself or from/to Windows Explorer.

    Tools
    Sprite editor : a simple sprite editor with powerful features. Semi-transparent images can be added, you can easily change the order or replace images, etc. This tool can convert images in the wrong type by showing you multiple solutions (merging a new palette, dithering the image by using current palette, using the closest color, and a few more).
    Grf validation : allows you to validate a GRF with multiple settings. It can detect corrupted GRF entries, invalid sprites, empty files, non-GRF files, duplicate files and a lot more.
    Flat maps maker : generates flat maps from .gat and .rsw files. Useful to generate WoE maps or to fasten up the loading time.
    Patch maker : generates a GRF patch based on two different GRFs.
    Hash viewer : shows the hash code (both CRC32 and MD5) for files.
    Image converter : converts an image to any format requested (BMP, PNG, JPG, TGA).
    GrfCL : used to create batch files (.bat) which can automate tasks on GRF files. See the content in GrfCL.rar in the download for more information. This tool can be customized from the sources as well.
    Palette recolorer : creates new sprites by changing their colors (this tool is now deprecated).
    Client database editor : allows modifications of the database client files (txt and lua) with easy and simple tools. Work in progress.

    Grf encryption
     

    The encryption feature has been enabled again. It's similar to what it used to be and it has been tested on client versions ranging from 2012-08-01 to 2014-02-05. Some error messages will be displayed if necessary. If you have an issue, copy the error message (with the code, if there's one) and send me the client executable with the cps.dll file generated by GRF Editor. There shouldn't be compatibility issues anymore though!  
    Technical stuff
    Requires .Net Framework 3.5 (SP1) Client Profile to run (3.5 or more will work as well).
    Automatically converts file name encoding to their proper values (you can change the encoding).
    Data virtualization is used as much as possible to preview files, meaning the files aren't completely loaded.
    Right-clicking an item will bring up the available options with that file.
    Preview file formats : txt, log, xml, lua, lub, bmp, png, tga, jpp, db, ebm, pal, gnd, rsw, gat, rsm, str, spr, act, imf, fna and wav.
    Services are "crash ready", meaning that you will be warned about a failed operation and no work will be lost (the application won't close and crash). It tries to continue operating even if it meets unsual conditions.
    Operations can be cancelled by clicking on the button near the progress bar.
    The warning level can be changed to avoid messages like "Please select a folder first."
    When prompted with an error, use Ctrl-C to copy the current dialog's content.

    Some screenshots!
    1) Previewing an act file, while showing the search feature

     
    2) Preview of a model file (rsm)

     
    3) Preview of GrfCL with the MakeGrf command

     
    4) Preview of the Client Database Editor

     
    5) Preview of Grf validation

     
    6) Search feature (press Ctrl-F or Ctrl-H to bring up within a text editor)

    Sources : http://www.mediafire.com/download.php?7z6hkdag4ayj8rs
     
    Got a feedback? I'd gladly hear you out and fix issues you have with the program. If you want new features to be added, don't hesitate to ask!
     
    Click here to download this file
  23. Upvote
    Like it~* reacted to Ridley in Clan System   
    Just a side note. We all work here on a volunteer base, in our free time. For many of us this free time is limited. Most important, we do this without the intention of making money (and I claim for most people here, this is the exactly reason to host a server). 
     
    If people not comfortable of the amount of time we put into this, and you think you can do it faster and better, then go ahead and do it.
  24. Upvote
    Like it~* got a reaction from JulioCF in Utilizar multíplos iteminfo.lua   
    Acho que é isso que vc quer...
     
    http://herc.ws/board/topic/6376-dual-language/
  25. Upvote
    Like it~* reacted to Mhalicot in @identifyall   
    File Name: @identifyall
    File Submitter: sevenzz23
    File Submitted: 23 Oct 2013
    File Category: Plugins
     
    HPM @iall complete package.
     
    Compatible with Windows System Only
     
    if you are using Linux, ignore other files and use only identifyall.c
     
    Instruction.
     
    1. Download and extract files using 7z or any application that can extract it.
    2. extract it in your server directory ex: C:/RO Server/Hercules/
    2.1 then read "read me!.txt" or edit conf/plugins.conf and add identifyall
    3. Your done. you can now try your plugins
     
    If you have any questions feel free to drop a comment.
     
    for more info on how to to use HPM visit Here
     
    Click here to download this file
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.