skill fist ter influĂȘncia no dano de certa magia

nbb147
Por nbb147
em Scripts

nbb147

My sweet sadness, my favorite feeling. ♪♫
avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 06/04/11Posts: 350Char no Tibia: Mulekepirado

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.

 
 

 

Night Wolf

Coordenador de Desenvolvimento
avatar
HerĂłi
HerĂłi

INFOS

Grupo: HerĂłiRegistrado: 14/02/14Posts: 341GĂȘnero: MasculinoChar no Tibia: Night Wolf

ter tem, mas teria que fazer a fórmula sem utilizar as predefiniçÔes da source, fazendo tudo manualmente via código.

I9AtE9T.png
/NW

nbb147

My sweet sadness, my favorite feeling. ♪♫
avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 06/04/11Posts: 350Char no Tibia: Mulekepirado

vocĂȘ saberia fazer isso?

 
 

 

Night Wolf

Coordenador de Desenvolvimento
avatar
HerĂłi
HerĂłi

INFOS

Grupo: HerĂłiRegistrado: 14/02/14Posts: 341GĂȘnero: MasculinoChar no Tibia: Night Wolf

sim.. me manda alguma magia que vc queira que eu coloque o dano dela baseada em fist que eu faço

I9AtE9T.png
/NW

nbb147

My sweet sadness, my favorite feeling. ♪♫
avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 06/04/11Posts: 350Char no Tibia: Mulekepirado


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

 
 

 

Night Wolf

Coordenador de Desenvolvimento
avatar
HerĂłi
HerĂłi

INFOS

Grupo: HerĂłiRegistrado: 14/02/14Posts: 341GĂȘnero: MasculinoChar no Tibia: Night Wolf

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

I9AtE9T.png
/NW

nbb147

My sweet sadness, my favorite feeling. ♪♫
avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 06/04/11Posts: 350Char no Tibia: Mulekepirado

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+

 
 

 

zipter98

avatar
HerĂłi
HerĂłi

INFOS

Grupo: HerĂłiRegistrado: 20/09/12Posts: 2553GĂȘnero: Masculino

TĂłpico movido para dĂșvidas / pedidos resolvidos.

Não respondo PMs solicitando suporte. Jå existem seçÔes no fórum para isto.

onokamisama

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 15/12/10Posts: 39

Bela explicação, me fez entender de uma forma completamente intuitiva, muito bom mesmo. REP+

Te Ajudei? Rep add.png