Ir para conteúdo

Featured Replies

Postado

O TFS é 0.4 e eu estou tendo problemas com esse sistema, onde preciso que, dado um valor x de um storage y, toda vez que um player aplicar dano num monstro, o monstro sofrerá, por exemplo, x*10 de dano a mais. 

Não sei se a source do meu tfs está bugada, mas quando tentei usar a funçao onStatsChange, onAttack ou msm onCombat, eu não consigo retorno algum.
Há alguma outra forma de fazer esse script? Vocês acham melhor eu trocar a source?

Postado

Há o Critical System do Night Wolf que faz exatamente isso, dá para adaptar. 

 

Spoiler

--[[Critical System
-------------------------  By Night Wolf]]


local lvlcrit = 48913
local multiplier = 1.5


function onStatsChange(cid, attacker, type, combat, value)
if isPlayer(attacker) and (not (attacker == cid)) and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS)  then
if (getPlayerStorageValue(attacker, lvlcrit)*3) >= math.random (0,1000) then
dano = math.ceil(value*(multiplier))
doTargetCombatHealth(attacker, cid, combat, -dano, -dano, 255)
doSendAnimatedText(getCreaturePos(attacker), "CRITICAL!!", 144)
return false
end
end
return true
end

 

 

Bastaria mudar o multiplicador para 10 e adicionar mais uma storage para fazer essa verificação que você quer. Se o dano aumentado ocorrer sempre, tire a verificação de probabilidade e só verifique o valor da storage, como você quer. "Se o valor da storage for tanto, faça o dano x tanto."

 

 

 

Depois seria necessário registrar o script no creaturescripts.xml e no xml dos monstros.

 

creaturescript:

Spoiler

<event value="nomedoscript.lua" event="script" name="nomedoevento" type="statschange"/>

 

 

monstro.xml:

 

Spoiler

<script>
<event name="nomedoevento"/>
</script>

 

 

E se você não tiver essas funções... aí sim, uma outra source seria interessante, não imagino como fazer dano crítico sem isso. 

Editado por Tadelho (veja o histórico de edições)

Postado
Citar

local storage = xxx
local damage_bonus = xx

function onStatsChange(cid, attacker, type, combat, value)
  if isMonster(cid) and isPlayer(attacker) and (not (attacker == cid)) and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS)  then
    if (getPlayerStorageValue(attacker, storage) ) >= 1 then
      dano = math.ceil(value*(damage_bonus))
      addEvent(doTargetCombatHealth,1,attacker, cid, combat, -dano, -dano, 255)
      return false
    end
  end
  return true
end

 

 

Precisa registrar nos monstros e no player.

 

Te ajudei ?? Que tal fazer uma contribuição ?

Doar

Postado
  • Autor

o código que eu adaptei é o seguinte:

 

function onStatsChange(cid, attacker, type, combat, value)
local m = mob[getCreatureName(cid)]
if m and isPlayer(attacker) and (not (attacker == cid)) and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS)  then
dano = math.random(getPlayerStorageValue(attacker,m.strc)*10, (getPlayerStorageValue(attacker,m.strc)+3)*10)
doTargetCombatHealth(attacker, cid, combat, -dano, -dano, 255)
return false
end
return true
end

Estou tendo o seguinte problema com o codigo que voces me passaram: primeiro que quando eu uso o return false, ele nao gera dano no monstro. E se eu mudo para true, ele me da a seguinte mensagem no executável e ainda mata o monstro, pq a função é chamada novamente repetidas vzs: 

  

[Error - CreatureEvent::executeStatsChange] Call stack overflow.

 

O problema é o codigo, a source, eu, Jesus ou o que? AUHSUAHSUAHS

 

 

@edit eu resolvi o problema gastando um monte de memoria, da seguinte maneira:

 

function setGlobal(cid)
db.executeQuery("DELETE FROM `global_storage` WHERE `key` = " .. cid)
end 

function onStatsChange(cid, attacker, type, combat, value)
local m = mob[getCreatureName(cid)]
if m and isPlayer(attacker) and (not (attacker == cid)) and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) and (getPlayerStorageValue(attacker,m.strc)) >= 1  then
if getGlobalStorageValue(cid) ~= 1 then
setGlobalStorageValue(cid, 1)
dano = math.random(getPlayerStorageValue(attacker,m.strc)*10, (getPlayerStorageValue(attacker,m.strc)+3)*10)
doTargetCombatHealth(attacker, cid, combat, -dano, -dano, 255)
doPlayerSendTextMessage(attacker, MESSAGE_STATUS_CONSOLE_BLUE, "dano = ".. dano )
addEvent(setGlobal, 1, cid)
return true
end
end
return true
end 

fazendo esse controle com o globalstorage, é possivel evitar o bug. Mas isso consome muita memoria e processamento, acredito eu... e.e'

Editado por SoulSarti (veja o histórico de edições)

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo