Ir para conteúdo
Entre para seguir isso  
Socket

Damage Lib v2.5.2

Recommended Posts

Socket    0
Socket
Autor = "Socket",

Nome = "Damage Lib"

Versão = "2.5.2",

Servidor testado = "TFS 0.3.6"

  • Certo, o que é Damage Lib?

 

A Damage Lib é uma biblioteca criada por mim, com algumas funções editadas de Dark Billie. Ela nada mais é que uma biblioteca, que simula ataques, tanto físicos como mágicos. Não é apenas uma função que tira a vida da criatura, mas qual a diferença?

 

Ela mostra o dano, de acordo com a cor do hit normal, todos estão corretos, pois eu os peguei diretamente das sources do TFS, caso ao usarem a biblioteca, se reparem com alguma coisa errada, postem aqui e eu irei verificar. Caso for melee e o monstro seja da espécie Blood ou Venom, ele também cria o splash, que no caso é o sangue no chão.

 

O dano, caso seja físico, é calculado de acordo com a armor/defense do player, ou monstro. A fórmula também foi pegada das sources do TFS, caso queiram conferir. Agora, caso o dano seja mágico, ele pega a fraqueza do monstro àquele elemento e calcula o dano, essa feature ainda não está disponível caso o alvo seja um player.

 

Caso use a função doPlayerDamageCreature, a cada hit do player no monstro, é adcionada a experiência equivalente ao player.

 

Se a criatura alvo estiver de mana shield (utamo vita), o dano é retirado da mana, e caso a mana for insuficiente para absorver o dano, o resto é retirado da health, normalmente.

 

Agora que já respondi algumas possíveis dúvidas, e esclareci algumas coisas. Vamos ao script, lembrando que é recomendado baixar o script anexado no final do tópico.

 

[spoiler=Script]

Damage = {
       _VERSION     = "2.5.2",
       author       = "Socket, from OTBR",
       information    = "Damage lib by Socket",

       monstersDir = "data/monster/monsters.xml"
}

local monsterXml

do
   local monsterHandler = assert(io.open(Damage.monstersDir, "r"), "Unable to load monster.xml")
   local monsterContent = monsterHandler:read(-1)
   monsterHandler:close(); monsterHandler = nil; collectgarbage()

   monsterXml = monsterContent
end

RACE_NONE   = 0
RACE_VENOM  = 1
RACE_BLOOD  = 2
RACE_UNDEAD = 3
RACE_FIRE    = 4
RACE_ENERGY    = 5

function number(s)
   if not (s) then return 0 end
   if not (tostring(s):match("%-")) then
       return tonumber(s)
   else
       return - tonumber(s:match("%-(%d+)"))
   end
end

function loadMonsterFile(uid)
   local monsterName = getCreatureName(uid)

   local monsterScript = monsterXml:match("<monster name=\"".. monsterName .."\" file=\"(.-)\"/>")

   if not (monsterScript) then
       return nil
   end

   local monsterFile = io.open("data/monster/" .. monsterScript)
   if not (monsterFile) then
       return nil
   end

   local content = monsterFile:read(-1)
   monsterFile:close(); monsterFile = nil; collectgarbage()

   return content
end

function getPlayerArmor(cid)
   local total = 0
   for i = CONST_SLOT_FIRST, CONST_SLOT_LAST do
       local item = getPlayerSlotItem(cid, i)
       if (item.itemid > 0) then
           local value = getItemArmor(item.uid)
           if (value ~= nil) then
               total = total + value
           end
       end
   end
   return total
end

function getPlayerDefense(cid)
   local total = 0
   for i = CONST_SLOT_FIRST, CONST_SLOT_LAST do
       local item = getPlayerSlotItem(cid, i)
       if (item.itemid > 0) then
           local defense = getItemDefense(item.uid)
           local extDefense = getItemExtraDefense(item.uid)
           total = total + ((defense or 0) + (extDefense or 0))
       end
   end
   return total
end


function getMonsterElementPercent(uid, combatType)
   local elements = {
                   [COMBAT_ENERGYDAMAGE]    = "energyPercent",
                   [COMBAT_EARTHDAMAGE]    = "earthPercent",
                   [COMBAT_FIREDAMAGE]        = "firePercent",
                   [COMBAT_LIFEDRAIN]        = "lifeDrainPercent",
                   [COMBAT_MANADRAIN]        = "manaDrainPercent",
                   [COMBAT_DROWNDAMAGE]    = "drownPercent",
                   [COMBAT_ICEDAMAGE]        = "icePercent",
                   [COMBAT_HOLYDAMAGE]        = "holyPercent",
                   [COMBAT_DEATHDAMAGE]    = "deathPercent"
   }

   if not (elements[combatType]) then
       return false
   end

   local content = loadMonsterFile(uid)

   if not (content) then
       return 0
   end

   return number(content:match(string.format("%s=\"%s\"", elements[combatType], "(%w-)")))
end

function getMonsterArmor(uid)
   local content = loadMonsterFile(uid)

   if not (content) then
       return 0
   end

   return number(content:match("<defenses armor=\"(%d-)\" defense=\"%d-\"/>"))
end

function getMonsterDefense(uid)
   local content = loadMonsterFile(uid)

   if not (content) then
       return 0
   end

   return number(content:match("<defenses armor=\"%d-\" defense=\"(%d-)\""))
end

function doDamageCreature(uid, combatType, damage)
   local effectInfo = {
                       [COMBAT_PHYSICALDAMAGE] = {
                                               [RACE_VENOM]     = {66, 16, doCreateItemEx(2019, 4)},
                                               [RACE_BLOOD]     = {180, 0, doCreateItemEx(2019, 2)},
                                               [RACE_UNDEAD]     = {129, 9},
                                               [RACE_FIRE]        = {192, 0},
                                               [RACE_ENERGY]     = {154, 47}
                       },

                       [COMBAT_ENERGYDAMAGE]     = {154, 11},
                       [COMBAT_EARTHDAMAGE]    = {66,      8},
                       [COMBAT_DROWNDAMAGE]    = {89,   1},
                       [COMBAT_FIREDAMAGE]        = {192, 15},
                       [COMBAT_ICEDAMAGE]        = {35,  43},
                       [COMBAT_HOLYDAMAGE]        = {210, 39},
                       [COMBAT_DEATHDAMAGE]    = {144, 38},
                       [COMBAT_LIFEDRAIN]        = {180, 13},
                       [COMBAT_MANADRAIN]        = {5,    1}
   }

   local textColor, magicEffect, splash

   if not (combatType) then
       print("[[ doDamageCreature(uid, combatType, damage) ]] Unknow combatType '".. combatType .."'")
       return false
   end

   if (combatType == COMBAT_PHYSICALDAMAGE) then
       local armor, defense

       if (isMonster(uid)) then
           armor, defense = getMonsterArmor(uid), getMonsterDefense(uid)
       elseif (isPlayer(uid)) then
           armor, defense = getPlayerArmor(uid), getPlayerDefense(uid)
       end

       local minArmor, maxArmor = 0, 0

       if (armor > 1) then
           minArmor = math.ceil(armor * 0.475)
           maxArmor = math.ceil(((armor * 0.475) - 1) + minArmor)
       elseif (armor == 1) then
           minArmor, maxArmor = 1, 1
       end

       if (defense > 0) then
           damage = damage - math.random((defense / 2), defense)
       end

       damage = damage - math.random(minArmor, maxArmor)

       local race = isPlayer(uid) and RACE_BLOOD or (getMonsterInfo(getCreatureName(uid)).race)
       local info = effectInfo[COMBAT_PHYSICALDAMAGE][race]

       textColor     = info[1]
       magicEffect = info[2]
       splash         = info[3]
   else
       if (isMonster(uid)) then
           damage = math.ceil(damage - (getMonsterElementPercent(uid, combatType) * damage / 100))
       end

       local info = effectInfo[combatType]

       textColor     = info[1]
       magicEffect = info[2]
   end

   local position    = getCreaturePosition(uid)

   if (splash) then
       doTileAddItemEx(position, splash)
   end

   if ((getCreatureHealth(uid) - damage) <= 0) then
       damage = getCreatureHealth(uid)
   end

   if (damage > 0) then
       if (hasCondition(uid, CONDITION_MANASHIELD)) then
           if (damage <= getCreatureMana(uid)) then
               doCreatureAddMana(uid, - damage)

               return damage
           else
               local mana = getCreatureMana(uid)

               doCreatureAddMana(uid, - mana)

               damage = damage - mana
           end
       end

       doSendAnimatedText(position, damage, textColor)
       doSendMagicEffect(position, magicEffect)
       doCreatureAddHealth(uid, - damage)
   else
       doSendMagicEffect(position, 3)
   end

   return damage
end

function doDistanceDamageCreature(position, uid, combatType, damage, distEffect)
   local creaturePosition = getCreaturePosition(uid)

   doSendDistanceShoot(position, creaturePosition, distEffect)

   return doDamageCreature(uid, combatType, damage)
end

function doCreatureDamageCreature(cid, uid, combatType, damage, distEffect)
   local creaturePosition     = getCreaturePosition(cid)
   local targetPosition    = getCreaturePosition(uid)

   local damage

   if (distEffect) then
       damage = doDistanceDamageCreature(creaturePosition, uid, combatType, damage, distEffect)
   else
       damage = doDamageCreature(uid, combatType, damage)
   end

   if (isPlayer(cid)) then
       if (damage and (damage > 0)) then
           if (isMonster(uid)) then
               doPlayerAddExperience(cid, ((damage * getMonsterInfo(getCreatureName(uid)).experience) / getMonsterInfo(getCreatureName(uid)).health))
           end
       end
   end

   return true
end

 

 

 

  • Instalação

Para TFS 0.3.6:

Apenas crie um arquivo chamado com formato .lua, na pasta e data/lib do seu servidor, nomei-o para damage e depois copie/cole o script.

Ou apenas baixe o arquivo anexado no final do tópico e o coloque na pasta data/lib (Aconselhavel)

 

Para TFS de versão inferior à 0.3.6:

Crie um arquivo com formato .lua na pasta data/lib do seu servidor, nomei-o para damage e copie/cole o script.

Ou baixe o arquivo anexado no final do tópico e coloque na pasta data/lib (Aconselhavel)

Após completar uma dessas etapas, procure pelo arquivo data.lua, ou global.lua (será diferente de acordo com a versão do seu servidor) e adcione a seguinte linha no final do arquivo:

dofile(getDataDir() .. "lib/damage.lua")

 

Pronto, a Damage Lib está instalada no seu servidor.

 

 

  • Entendendo a Damage Lib

Neste tópico explicarei apenas as funções principais, e não as auxiliares.

 

doDamageCreature(uid, combatType, damage)

Parametros:

uid: unique id da criatura que vai receber o dano.

combatType: tipo do combat, os possíveis valores devem ser:

[spoiler=Valores]COMBAT_PHYSICALDAMAGE

COMBAT_ENERGYDAMAGE

COMBAT_EARTHDAMAGE

COMBAT_DROWNDAMAGE

COMBAT_FIREDAMAGE

COMBAT_ICEDAMAGE

COMBAT_HOLYDAMAGE

COMBAT_DEATHDAMAGE

COMBAT_LIFEDRAIN

COMBAT_MANADRAIN

 

Eles são auto-explicativos, portanto caso haja alguma dúvida me mande uma pm e eu responderei.

damage: O dano que a criatura receberá, lembrando que está suscetível a aumento ou diminuição de acordo com a fraqueza do monstro, como eu expliquei no começo do tópico.

Explicação:

Essa é a função principal, ela que possui todas as fórmulas dos danos, simplesmente da o dano a criatura com o unique id uid. Leia o início do tópico e o parametro damage para maiores explicações.

 

doCreatureDamageCreature(cid, uid, combatType, damage, distEffect)

Parametros:

cid: unique id de quem ataca, pode ser qualquer criatura.

uid: unique id de quem é atacado, pode ser qualquer criatura.

combatType: é o tipo do dano, leia a explicação da função doDamageCreature para maiores explicações.

damage: dano que uid receberá, leia o início do tópico e a função doDamageCreature para maiores explicações.

distEffect: é o efeito de distância que caso seja especificado, será lançado da posição de cid até a posição de uid.

 

 

 

Certo, é só isso, dúvidas, problemas ao instalar, erros, sugestões, postem aqui, se quiser agradecer, simplesmente clique no botão "Agradecer", por favor, não floodem aqui.

 

 

 

 

Editado por Socket

Compartilhar este post


Link para o post
Conde2    0
Conde2

Bom acho que sua lib não é nada útil ao meu ver.

Além de ser um POG dos grandes lendos o xml dos monstros

Ela poderia ser FÁCILMENTE substituida pelas funções abaixo:

 

 

doAreaCombatHealth(cid, type, pos, area, min, max, effect)

doTargetCombatHealth(cid, target, type, min, max, effect)

doAreaCombatMana(cid, pos, area, min, max, effect)

doTargetCombatMana(cid, target, min, max, effect)

doAreaCombatCondition(cid, pos, area, condition, effect)

doTargetCombatCondition(cid, target, condition, effect)

doAreaCombatDispel(cid, pos, area, type, effect)

doTargetCombatDispel(cid, target, type, effect)

 

 

Essas funções acima já fazem TODA a checagem de DamageType e 90% das outras coisas que contém na sua lib.

 

Não vejo então o porque de usar essa lib sendo que já existem funções que as substituem.

Porém muito legal da sua parte recriar os damges de um outro jeito =P

Compartilhar este post


Link para o post
Mock    32
Mock

otima lib :P

e vc ainda usou collectgarbage

Compartilhar este post


Link para o post
dz2    0
dz2

opa acho q precisava disso, por aki consigo adicionar novos elementos? acho q sim né

de qualquer forma obrigado

Compartilhar este post


Link para o post
Vítor Amaral    1
Vítor Amaral

[Error - Spell Interface]

data/spells/scripts/incendium.lua:onCastSpell

Description:

data/lib/damage.lua:204: attempt to perform arithmetic on a boolean value

stack traceback:

data/lib/damage.lua:204: in function <data/lib/damage.lua:129>

(tail call): ?

data/lib/damage.lua:248: in function 'doCreatureDamageCreature'

data/spells/scripts/incendium.lua:44: in function <data/spells/scripts/incendium.lua:25>

Compartilhar este post


Link para o post
josejunior23    2
josejunior23

Parabéns, pensar isso tudo não é mole não.

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×