Postado Fevereiro 8, 2018 7 anos 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 Fevereiro 11, 2018 7 anos 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 Fevereiro 11, 2018 7 anos por Tadelho (veja o histórico de edições)
Postado Fevereiro 11, 2018 7 anos 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 ?
Postado Fevereiro 12, 2018 7 anos 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 Fevereiro 12, 2018 7 anos 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.