Pessoal, gostaria de saber se Ă© possĂvel fazer com que o dano de uma magia seja definida por uma outra skill sem ser o magic level propriamente dita, por exemplo o nivel da skill first aumentando o dano da magia.
Pessoal, gostaria de saber se Ă© possĂvel fazer com que o dano de uma magia seja definida por uma outra skill sem ser o magic level propriamente dita, por exemplo o nivel da skill first aumentando o dano da magia.
ter tem, mas teria que fazer a fórmula sem utilizar as predefiniçÔes da source, fazendo tudo manualmente via código.

/NW
vocĂȘ saberia fazer isso?
sim.. me manda alguma magia que vc queira que eu coloque o dano dela baseada em fist que eu faço

/NW
local combat = createCombatObject()setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 30)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, -300, -1.5, -450)
arr = {
{0, 0, 0, 0, 0},
{0, 1, 1, 1, 0},
{0, 1, 3, 1, 0},
{0, 1, 1, 1, 0},
{0, 0, 0, 0, 0},
}
local area = createCombatArea(arr)
setCombatArea(combat, area)
function onCastSpell(cid, var)
return doCombat(cid, combat, var)
end
vou fazer algo melhor do que simplesmente te dar a resposta, vou te ensinar como fazer isso pra qualquer spell que vc queira;
Primeiramente vc tem que extrair as informaçÔes que vocĂȘ tem na sua spell, isso significa essas 3 coisinhas aqui (pro seu caso):
local combat = createCombatObject()setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 30)
arr = {
{0, 0, 0, 0, 0},
{0, 1, 1, 1, 0},
{0, 1, 3, 1, 0},
{0, 1, 1, 1, 0},
{0, 0, 0, 0, 0},
}
Agora vĂĄ em data/lib/constant.lua e vc primeiramente irĂĄ procurar uma tabela parecida com essa daqui:
Se vocĂȘ olhar o Ășltimo item dessa tabela podemos ver COMBAT_DEATHDAMAGE = 2048 agora olhando praquela primeira informação que nĂłs temos "tipo de damage" iremos ver que esse COMBAT_DEATHDAMAGE tambĂ©m estĂĄ presente:
local combat = createCombatObject()setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
Certo, agora precisamos definir nosso efeito.. os efeitos ficam convenientemente no mesmo arquivo constant.lua, vimos ali no seu cĂłdigo que vc usa o efeito de nĂșmero 30
setCombatParam(combat, COMBAT_PARAM_EFFECT, 30)
Certo, a årea iremos usar a mesma.. agora vamos ao chamado "CORE" do script, também conhecido como corpo ou escopo principal, vou utilizar um aqui que ja foi criado pensando em spells que utilizem skills/mana/vida para tirar dano:
"AREA DA SPELL"
function onCastSpell(cid, var)
"SKILLS QUE SERAO USADAS"
local formula = {
min = ("alguma formula louca aqui dentro"),
max = ("alguma formula louca aqui dentro")
}
doAreaCombatHealth(cid, "TIPO DE DAMAGE", getCreaturePosition(cid), "AREA DA SPELL", -formula.min, -formula.max, "EFEITO")
return true
end
Certo, agora vamos por partes:
Por enquanto tudo que sabemos Ă© que o "EFEITO" Ă© 30, o "TIPO DE DAMAGE" Ă© o 2048 e a "AREA DA SPELL" Ă© igual aquela ĂĄrea desenhada.
Substituindo oque a gente sabe fica assim:
arr = {
{0, 0, 0, 0, 0},
{0, 1, 1, 1, 0},
{0, 1, 3, 1, 0},
{0, 1, 1, 1, 0},
{0, 0, 0, 0, 0},
}
local area = createCombatArea(arr) -- define a variavel area como a area de combat acima (pra usar na funcao la embaixo)
function onCastSpell(cid, var)
"SKILLS QUE SERAO USADAS"
local formula = {
min = ("alguma formula louca aqui dentro"),
max = ("alguma formula louca aqui dentro")
}
doAreaCombatHealth(cid, 2048, getCreaturePosition(cid), area, -formula.min, -formula.max, 30)
return true
end
Perceba que a Ășnica coisa que falta na nossa função sĂŁo as fĂłrmulas..
VocĂȘ pode literalmente definir QUALQUER coisa como fĂłrmula, se eu colocar apenas 50 ali no min e no max minha magia sempre vai tirar 50. Se eu colocar 50 no min e 100 no max ela sempre vai tirar algo entre esses dois nĂșmeros... mas nĂłs nĂŁo queremos que a magia hite um numero constante, nĂłs queremos que ela dependa da skill da pessoa, do nĂvel dela, do ml. Do contrĂĄrio, ela ia ser extremamente podre pois nĂŁo possui uma evolução junto com o player.
"tĂĄ lobo, mas como vou saber que fĂłrmula usar?"
Essa Ă© uma pergunta muito delicada, temos sempre que considerar os casos extremos, se uma magia pode ser usada no nv 10 por exemplo, e a formula dela Ă© level * ml temos que checar os dois casos abaixo:
- Caso 1 Player nivel 10, ml 1 irĂĄ arrancar 10 de life na magia.. parece justo - Caso 2 Player nivel 300, ml 90 irĂĄ arrancar 27.000 de life na magia.. nĂŁo parece tĂŁo justo hahaha
Existe uma dica que o prĂłprio tibia nos dĂĄ de como montar fĂłrmulas justas, que Ă© usar constantes de proporcionalidade. "Meu deus, Lobo, que caralhas Ă© isso?" bem, o nome Ă© bem mais complicado do que a coisa em si.
Acompanhe cmg -> eu quero que minha magia tire 200 +- entĂŁo eu coloco como min sendo 150 + (A * fist) e o max sendo 200 + (B * fist);
Com isso eu defino A e B de forma a nem prejudicar os niveis baixos e nem deixar os niveis altos extremamente apelÔes. Nesse caso eu faço maior skill que alguém pode chegar no meu sv (vou considerar 110) e o skill inicial (10).
Chamarei a diferença de skills no meu server de difskill
difskill é a diferença entre o nivel måximo de skill q alguem costuma ter no meu server e o inicial;
Divididos difskill pelo que falta pra completar o numero que queremos na constante.
No min nĂłs temos 150 na constante e queremos um dano em torno de 200, entĂŁo divideremos 50 por difskill ficando com
150 + (A * fist) onde A Ă© (50/difskill). No final chegamos que um A "bom" seria (0.5 OU 1/2).
Agora vamos aplicar a fĂłrmula que chegamos pro nosso min e ver se estĂĄ compatĂvel
150 + (skill/2)
com 10 de skill vc tira 155, com 100 vc tira 200, estĂĄ muito compatĂvel.
Agora podemos achar B a partir de A simplesmente achando valores ligeiramente maiores que se enquadrem dentro do nosso range de dano.
Nesse caso eu diria que um bom B Ă© 3 * (skill/2)
Vamos aplicar a formula
200 + (3 * (skill/2))
com 10 de skill vc tira 215 no max, com 100 de skill vc tira 350. Parece plausĂvel.
Finalizando as fĂłrmulas, temos
min = (150 + (skill /2)) e max = (200 + (3 * (skill/2)))
TĂĄ, mas como ensinar pro nosso script oque Ă© "skill" e que ela representa o fist fighting? bem, Ă© nessa hr que olhamos pra aquele pequeno espaço no script dizendo "SKILLS QUE SERĂO USADAS".
Ali vocĂȘ deve criar uma variĂĄvel skill que irĂĄ ler a skill do player, atravĂ©s da função getPlayerSkillLevel(cid, "cĂłdigo da skill")
"Mas como eu sei o cĂłdigo da skill?", muito simples meu caro.. lembra que eu falei pra vocĂȘ ir em data/lib/constant? Esse documento tem todas as informaçÔes que vocĂȘ precisa pra fazer qualquer cĂłdigo, e Ă© justamente nele que iremos procurar qual Ă© o cĂłdigo da skill fist.
Depois de uma rĂĄpida procura eu me deparei com esta tabela>
SKILL_FIST = 0 SKILL_CLUB = 1 SKILL_SWORD = 2 SKILL_AXE = 3 SKILL_DISTANCE = 4 SKILL_SHIELD = 5 SKILL_FISHING = 6 SKILL__MAGLEVEL = 7 SKILL__LEVEL = 8
e nela podemos ver que o código para a skill fist é 0. Declaro ali naquele espaço do script
local fist = getPlayerSkillLevel(cid, 0)
e a partir de agora no lugar de skill nas minhas fĂłrmulas eu sĂł escreverei fist e o server irĂĄ entender o que eu quero.
O script final fica:
arr = {
{0, 0, 0, 0, 0},
{0, 1, 1, 1, 0},
{0, 1, 3, 1, 0},
{0, 1, 1, 1, 0},
{0, 0, 0, 0, 0},
}
local area = createCombatArea(arr) -- define a variavel area como a area de combat acima (pra usar na funcao la embaixo)
local factor = 1
function onCastSpell(cid, var)
local fist = getPlayerSkillLevel(cid, 0)
local formula = {
min = factor * (150 + (fist /2)), -- nao esqueca dessa virgula pra separar o min do max
max = factor * (200 + (3 * (fist/2)))
}
doAreaCombatHealth(cid, 2048, getCreaturePosition(cid), area, -formula.min, -formula.max, 30)
return true
end
Aquele factor que eu coloquei é uma coisinha (fator de correção de erro) que é sempre bom colocar pois nem sempre as formulas na pråtica tiram oque elas tiram na teoria, o dano varia de acordo com o combat que nós escolhemos e as vezes é bom adicionar esse factor para podermos ajustar a fórmula mais facilmente.
Espero que nĂŁo tenha preguiça de ler tudo, se vocĂȘ entender como isso funciona garanto que conseguirĂĄ fazer magias que se baseiam em somas de skills e criar fĂłrmulas ultra realistas para magias nĂŁo sĂł baseadas em skills como baseadas em cap, mana, vida, velocidade e qualquer outra coisa que vocĂȘ conseguir pensar..

/NW
Nossa cara, ótima explicação fiquei surpreso, embora eu tenha tido um pouco de dificuldade para compreender talvez seja por conta do meu entender sobre scripts que é pouco, obrigado pela ajuda, rep+
TĂłpico movido para dĂșvidas / pedidos resolvidos.
Não respondo PMs solicitando suporte. Jå existem seçÔes no fórum para isto.
Bela explicação, me fez entender de uma forma completamente intuitiva, muito bom mesmo. REP+
Te Ajudei? Rep 