Ir para conteúdo
  • 0

skill fist ter influência no dano de certa magia


nbb147

Pergunta

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.

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

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

  • TIPO DE DAMAGE:

local combat = createCombatObject()setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)

  • EFEITO:

setCombatParam(combat, COMBAT_PARAM_EFFECT, 30)

  • AREA:

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)


--------- COM ESSAS INFORMAÇÕES, VAMOS COMEÇAR NOSSO CÓDIGO ------

Agora vá em data/lib/constant.lua e vc primeiramente irá procurar uma tabela parecida com essa daqui:

 

COMBAT_NONE = 0
COMBAT_PHYSICALDAMAGE = 1
COMBAT_ENERGYDAMAGE = 2
COMBAT_EARTHDAMAGE = 4
COMBAT_POISONDAMAGE = 4
COMBAT_FIREDAMAGE = 8
COMBAT_UNDEFINEDDAMAGE = 16
COMBAT_LIFEDRAIN = 32
COMBAT_MANADRAIN = 64
COMBAT_HEALING = 128
COMBAT_DROWNDAMAGE = 256
COMBAT_ICEDAMAGE = 512
COMBAT_HOLYDAMAGE = 1024
COMBAT_DEATHDAMAGE = 2048

 



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..

Link para o comentário
Compartilhar em outros sites

  • 0


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

Link para o comentário
Compartilhar em outros sites

  • 0

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+

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...