use this patch for hide empty space between buttons http://nemo.herc.ws/patches/SkipHiddenMenuButtons
for reduce window size, edit background image size. i not remember how it named.
so far I have never failed to convert anything into plugin
mainly due to plugin allow function overload
https://github.com/HerculesWS/Hercules/wiki/Hercules-Plugin-Manager
although I still recommend using hooking instead of overloading as much as possible,
as having 2 plugins overloading the same function might cause problems for your server
EDIT: example of overload a function
https://github.com/AnnieRuru/Release/blob/master/plugins/branch_displayname.c
wait, I thought I answered this on rathena forum already ? https://rathena.org/board/topic/126009-deadbloody-branch-timer/
same user name, I actually thought I helped a rathena member there
if you come here and ask the same question again it means you are actually hercules user ?
anyway hercules has plugin system that rathena don't, and rathena still hasn't implement plugin system yet, so here goes
https://github.com/AnnieRuru/Release/blob/master/plugins/deadbranch_timerdelete/deadbranch_timerdelete.c
You can hook into the chat and whisper-related functions with a HPM plugin and then call the Google Cloud Translation API but this will be very costly because you have to translate every single message into the local language of every listening player so if you have a player speaking English and there's 50 players around them and they all use a different language you end up sending 50 translation requests to the API. You could do the translation client-side but you would have to build your google translate logic directly into the RO client. Keep in mind that this will also increase lag because you wait on API responses before displaying the message.
You'd want to do the translation offline (not on a live server, on-the-fly) using a HPM plugin (such as generate-translations) to generate your po files and then you would use a script (maybe in python, so you could use that python lib you linked) to call the google "cloud translation" api and translate your po file. You could also put both the po generator and translation routine in the same HPM plugin (using generate-translations as base and expanding from there)
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
Yes you do (for developer positions). There is no fixed number, just go about making fixes and submit your application for the team to decide whether you're suitable or not for the position.
Sprites don't appear on the end map. It's possible to recover your map, but I'd start by just deleting/renaming your .extra file and see if that's enough to load it up.
But there is no any ready diff for mob id range (only headgear) so you need to hex your client manually and seek for the mob sprite id range.
Hex the client without a diff patcher is a hard work to do, but not impossible.
@EDIT
I edited and was the easiest thing in the world. for those who want to make a system Anti -Run PvP edit this
Search src/map/skill.c and find:
case TF_BACKSLIDING:
clif->skill_nodamage(src,bl,skill_id,skill_lv,1);
skill->blown(src,bl,skill->get_blewcount(skill_id,skill_lv),unit->getdir(bl),0);
clif->fixpos(bl);
break;
and add after clif->fixpos(bl);
case TF_BACKSLIDING:
clif->skill_nodamage(src,bl,skill_id,skill_lv,1);
skill->blown(src,bl,skill->get_blewcount(skill_id,skill_lv),unit->getdir(bl),0);
clif->fixpos(bl);
sd->canlog_tick = timer->gettick();
break;
So you can no longer logout when using this skill.
Encontrei um servidor que utiliza, baixei , tentei usar algumas ferramentas e fui barrado.
Na questão de bot's ainda não tentei, mas por ser um servidor com pouquíssimos players , acredito que não estão usando.
Julio sou o Fou-lu do NeoRagnarok e estou pensando seriamente em sair do Harmony e passar pra algum shield novo que está em desenvolvimento como o Gepard. O Harmony está sem atualização desde 2013 e não tem nada que mostre que o projeto voltará, por este motivo dele está desatualizado você não pode utilizar hexeds acima de 2012-04-10 pq o sistema não aceita.
Não pretendo o HaShield pq já foi anunciado a descontinuação dele e estou saindo do Harmony pelo fato de está descontinuado. E venho pesquisando sobre o Gepard Shield e o Husky Shield.
Gepard Shield:
O Gepard é mais famoso, ou pelo menos mais conhecido aqui no ocidente. Já pude testar ele em servidores que possuem este shield e realmente o Bot passa por ele. Mas é aquilo que já falaram, qualquer shield é possível passar Bot e tbm existe vários tipos de Bot.
Obs: Tive contato com o dono e tive retorno dele dizendo que o projeto é pra longo prazo e que ele trabalha para a criação do site e painel de controle dos usuários.
Husky Shield:
O Husky apresenta já um site e segundo ele o sistema do shield está todo pronto (informação do site), mas ainda não encontrei nenhum servidor que utilize ele, talvez ele seja mais famoso lá na Tailândia, pois o desenvolvedor dele é de lá. https://huskyshield.org/
Obs: Tentei contato com o dono por Skype e FaceBook e não tive retorno.
Experiência com Harmony:
Quando comecei usar ele já estava descontinuado por final de 2013. Desde então o seu desenvolvedor nunca deu a cara no Fórum interno do Harmony. O ambiente é bem abandonado e vazio e creio eu que ele não vai responder seu contato nunca. Maioria dos Hacks já ultrapassam o Harmony, nunca peguei um bot nele, mas acredito existir sim Bots especiais para ultrapassar ele.