Ir para conteúdo

Tadelho

Membro
  • Registro em

  • Última visita

Tudo que Tadelho postou

  1. Na verdade até tem, mas daria um bom trabalho e provavelmente te faria reescrever uma porção de magias, items que dão skill, etc. A ideia seria trabalhar com os buffs em storages voltadas só para isso. Por exemplo: na storage 9999 nós guardaremos todas modificações de skill de Sword. Sempre que uma magia, item ou efeito de algo mudar o skill, você deve passar o valor para a storage e trabalhar com ele a partir de lá (e isso dá um certo trabalho, mas é possível). Isso permite não só a verificação do valor, mas também trabalhá-los de diversas formas. Eu uso um sistema desses em meu servidor.
  2. @Guilherme HP , vou te dar uma ideia adaptando um script que uso no meu servidor. Crie um creaturescript chamado "playerdodge.lua", por exemplo. (o nome você escolhe). Nele, vamos montar um script que, sempre que o jogador for receber um dano, fará uma verificação afim de anular ou não o dano recebido. O script ficaria mais ou menos como: local dodgechance = 20 -- chance em % do sistema dodge funcionar local multiplier = 0 -- valor pelo qual o dano será multiplicado function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS then if isPlayer(attacker) or isCreature(attacker) then if dodgechance >= math.random (0, 100) then value = math.ceil(value*multiplier) doTargetCombatHealth(attacker, cid, combat, -value, -value, 255) doSendAnimatedText(getCreaturePos(cid), "Dodge", 19) return false end end end return true end Explicando o script: a variável "dodgechance" determinará em quantos % das vezes o golpe cairá na condição de ser anulado. Fiz em base centesimal (baseado em uma divisão por 100), mas isso pode ser mudado conforme o gosto do usuário. A variável "multiplier" dirá por quanto o dano que seria recebido será multiplicado, isto é, se deixarmos o valor em "1", o dano será recebido integralmente. Para o valor "2", receberíamos o dano em dobro. Como queremos anular o dano por completo, vamos multiplicar por "0". A seguir, a função onStatsChange fará a verificação sempre que houver uma alteração no status do personagem; no caso, sempre que ele perca vida, para que possamos anular o dano vindo de criaturas e jogadores e tenhamos o resultado que você pediu. Dentro dela temos a verificação matemática da chance, a atualização do dano e a aplicação do mesmo. Ao final, a mensagem também está configurada como "Dodge", mas você pode alterar se quiser. -- Feito isso, você deverá registrar esse creatuerscript em todos os players. Faremos da seguinte maneira: no creaturescripts.xml, adicione o evento para que seja reconhecido. <event type="statschange" name="playerdodge" event="script" value="playerdodge.lua"/> Obs: preencha em "value" o nome do arquivo.lua que você escolhe lá em cima. Agora basta registrar o evento nos jogadores. Há algumas formas de fazer isso, uma fácil é registrar todos os players assim que fizerem o login. Ainda na pasta creaturescripts/scripts, vá em login.lua e dentro da função onLogin(cid) adicione o código; registerCreatureEvent(cid, "playerdodge") Obs: o nome entre aspas deverá ser o mesmo nome que você colocou como valor de "name" no arquivo creaturescripts.xml. Pronto, está feito.
  3. Tadelho postou uma resposta no tópico em Suporte Tibia OTServer
    @BruniinBR Tente assim: local tempo = 30 local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo * 900) setConditionParam(condition, CONDITION_PARAM_BUFF, true) setCombatCondition(combat, condition) function heal(cid) local formula = 30 * getPlayerLevel(cid) for i = 1, tempo do addEvent(doCreatureAddHealth, 200 * i, cid, (formula / tempo)) end end function onCastSpell(cid, var) heal(cid) return doCombat(cid, combat, var) end
  4. Cara, eu não sei qual servidor e qual versão você está utilizando, mas talvez a solução passe pelo mesmo método encontrado neste tópico que deixarei ao final; isto é, uma pequena edição no código fonte do seu servidor (que deverá ser compilado novamente a partir da modificação). Infelizmente eu não sei exatamente qual é o trecho de código que condiciona isso que você quer.
  5. Eu não mais um consumidor de OTs há bastante tempo, mas aqueles com os quais mais me envolvi e joguei mais tempo sempre foram OTs com perspectivas de um longo-prazo. Em geral, RPG, de preferência com conteúdo original. PVP, para mim, era completamente descartável. Entretanto, eu digo isso com consciência de que eu não represento o interesse geral da média dos jogadores - esses sim parecem gostar do jogo pelo seu aspecto de briga de gangues. O barato das pessoas me parece estar em "dominar o servidor" ou coisa do gênero (assim como nos servidores globais). Outro fator a ser considerado que também vai na contra-mão desse meu gosto por propostas duradouras: a oferta e a dinâmica de tantos outros jogos que vão concorrer com o tempo do seu player. Hoje em dia o padrão dos jogos é a satisfação imediata e o jogo casual, nada que exija um comprometimento um pouco maior vai atrair as massas. Se isso é bom ou ruim, decidam por vocês, mas é a tendência (vide jogos de celular). Aliás, foi o caminho que o próprio jogo global tomou.
  6. Conforme tive uma dúvida outro dia, consegui obter uma solução satisfatória e, sabendo que pode ser a dúvida de mais gente, resolvi compartilhar na forma deste pequeno tutorial. A ideia é muito simples: fazer com que uma spell de área atinga apenas alguns alvos conforme uma característica específica. Isso pode ser bastante útil para diversas ideias, além do script base servir para tantos outros efeitos interessantes. Atenção, fiz os scripts para: TFS 0.4.0 Teremos como base para esse exemplo a magia "divine caldera", o famoso "exevo mas san". Nela teremos o seguinte script: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4, 6) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end Desta forma, a magia atingirá todos os alvos em sua área de alcance. Mas queremos mudar isso, queremos que ela atinja alvos específicos, e aqui entram algumas ideias, por exemplo: podemos fazer com que ela acerte apenas players de um determinado level, players de uma determinada vocação, players com um determinado access, ou mesmo uma storage, ou ainda, como no exemplo que darei a seguir, fazer com que a magia acerte apenas alvos com um determinado nome (no caso, serão criaturas e não players). Para isso, utilizaremos uma função, "onTargetCreature(cid, target)" e depois a chamaremos como parâmetro de um "setCombatCallback(combat, key, function_name)". Na função onTargetCreature nós faremos a verificação desejada. Por exemplo, no código a seguir eu quero que a minha spell atinja apenas criaturas com o nome de "rat" ou "cave rat", então ficaria assim: function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Traduzindo: eu criei uma tabela local com os nomes desejados, verifiquei se o alvo era um monstro e se o nome do monstro constava na minha tabela recém criada. Sendo verdadeiro, acionei a função doTargetCombatHealth(cid, target, type, min, max, effect). -- Lembrando que conforme o tipo da sua magia você vai alterar os parâmetros dessa função para que ela tenha as animações e o dano compatíveis com o seu gosto/objetivo. Outro detalhe é que nesse trecho de código acima é que é feita a verificação que eu desejo. Eu poderia ao invés disso verificar se é um jogador e se a vocação dele tem o id 1 ou 2, por exemplo. Ficaria: function onTargetCreature(cid, target) local vocations = {1, 2} if isPlayer(target) and isInArray(vocations, getPlayerVocation(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Ou verificar um level, para que a magia só funcione em alvos acima do level X, etc. Exemplo: function onTargetCreature(cid, target) local level = 80 if isPlayer(target) and getPlayerLevel(target) >= 80 then doTargetCombatHealth(cid, target, type, min, max, effect) end end Feita a função, faremos aquilo que mencionei: a chamaremos como parâmetro da função "setCombatCallback" para o nosso "combat". Fica assim: setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") Feito isso, pronto! Basta chamarmos a spell normalmente. Exemplo de tudo pronto para uma magia "exevo mas san" que só acerte os ratos e tira de 10 a 20 de vida: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, COMBAT_HOLYDAMAGE, -10, -20, CONST_ME_HOLYAREA) end end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") function onCastSpell(cid, var) return doCombat(cid, combat, var) end Agora é com a criatividade de vocês! Até a próxima!
  7. @KillerWatts O problema é que eu precisaria saber qual a fórmula de dano que você está utilizando aí no seu servidor... supondo que você esteja utilizando a fórmula original do TFS 0.3.6, ficaria assim: local level = getPlayerLevel(cid) local attack = x -- insira o valor de atk que você quer simular local distance = getPlayerSkill(cid, SKILL_DISTANCE, false) local min = math.ceil(level * 0.2) local max = math.ceil((2 * (attack * (distance + 5.8) / 25 + (level - 1) / 10.)) OBS1: Você só precisa substituir ali no lugar do "x" o atk que você quer simular, por exemplo, "65" (igual uma assassin star), ou "300", enfim, o que você quiser. OBS2: Isso estará simulando golpes sempre no modo "full attack".
  8. Cara, pelo que entendi você não está calculando o dano por uma fórmula, está apenas configurando ali na primeira linha do código os valores para o dano mínimo e o dano máximo: "min, max". Nesse caso, você pode simplesmente alterar isso para a fórmula desejada. Por exemplo: local level = getPlayerLevel(cid) local distance = getPlayerSkill(cid, SKILL_DISTANCE, false) local min = (level * 1 + distance * 2.5) - 15 local max = (level * 2 + distance * 3.2) + 30 Sacou a ideia? Ali é só um exemplo, você colocaria a fórmula que você quer, seja ela qual for.
  9. @EDIT -- EU MESMO CONSEGUI SOLUCIONAR O CASO! VEJA EM: Diga em poucas palavras a base utilizada (Nome do servidor ou nome do website). TFS 0.4.0 Qual erro está surgindo/O que você procura? Fala, pessoal. Gostaria que vocês me dessem ideias de como seria possível fazer uma spell de área que só dê dano nas criaturas com um determinado nome. Vamos tomar como exemplo a magia divine caldera (exevo mas san, no código abaixo), e apenas as criaturas "rat" e "cave rat". Como eu faria para que essa magia só desse dano nos ratos e ignorasse os demais monstros? Eu preciso de alguma forma verificar o nome de todas as criaturas afetadas na área de atuação da magia e executar um doCombat() ou um doAddCreatureHealth() especificamente nelas, mas não estou conseguindo imaginar como fazer isso. Alguém sugere alguma ideia? Vamos começar com um esboço... a magia normal e uma tabela com a lista de criaturas. Você tem o código disponível? Se tiver publique-o aqui: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4, 6) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) local creatureList = {'rat', 'cave rat'} function onCastSpell(cid, var) return doCombat(cid, combat, var) end Daqui para frente, que ideias vocês sugerem? Como eu faço um getCreatureName() dessas criaturas na área de ação da magia? Outra ideia: seria preciso criar mais uma tabela (por exemplo: "affectedList = {}"), a princípio vazia, e inserir o creature.uid dessas criaturas checadas, certo? Quem puder dar uma força, agradeço!
  10. @leozincorsair Substitui o seguinte: local chance1, chance2, chance3 = math.random(1,100) Por: local chance1 = math.random(1,100) local chance2 = math.random(1,100) local chance3 = math.random(1,100) Testei no TFS 0.4.0 e funcionou.
  11. Fala, pessoal! Algum de vocês tem sprites diferentes de dragões além das do próprio jogo ou sabe onde eu poderia encontrar alguma? Estava querendo fazer alguns novos dragões... andei procurando mas só encontrei essa: Se vocês souberem de alguma que possam compartilhar, eu agradeço!
  12. Sim, eu entendi isso. O problema é que com essa disposição de 50%-30%-10%, em 10% das vezes não acontecerá do jogador ganhar qualquer um dos itens listados. Mesmo que o sorteio dos itens seja independente, ainda há o risco também de nenhum dos itens ser sorteado, então eu assumi que ele simplesmente perderá em 10% das vezes. @leozincorsair Sorteio para ganhar um item ou outro, 1° script. Sorteio independente de cada item, 2° script. -- CONFIGURAÇÕES -- PR = {11413, 11414, 11467} -- ID dos itens que será sorteado. money = {9970, 'Royal Coins'} -- ID do crystal coin e nome. count = 50 -- Quantidade de dinheiro. cast = "[Cassino]" function onUse(cid, item, fromPosition, itemEx, toPosition) local chance = math.random(1,100) local CB = { doSendAnimatedText, doSendMagicEffect, doPlayerAddItem, doPlayerRemoveItem} if not CB[4](cid, money[1], count) then doPlayerSendCancel(cid, "Você precisa de "..count.." "..money[2].." pra apostar.") CB[2](getThingPos(cid), CONST_ME_POFF) else if chance <= 50 then CB[3](cid, PR[1], 2) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[1]).."", 22) elseif chance > 50 and <= 80 then CB[3](cid, PR[2], 1) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[2]).."", 22) elseif chance > 80 and <= 90 then CB[3](cid, PR[3], 1) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[3]).."", 22) elseif chance > 90 then doBroadcastMessage(""..cast.." Você perdeu sua aposta.", 22) return TRUE end return TRUE end -- CONFIGURAÇÕES -- PR = {11413, 11414, 11467} -- ID dos itens que será sorteado. money = {9970, 'Royal Coins'} -- ID do crystal coin e nome. count = 50 -- Quantidade de dinheiro. cast = "[Cassino]" function onUse(cid, item, fromPosition, itemEx, toPosition) local chance1, chance2, chance3 = math.random(1,100) local CB = { doSendAnimatedText, doSendMagicEffect, doPlayerAddItem, doPlayerRemoveItem} if not CB[4](cid, money[1], count) then doPlayerSendCancel(cid, "Você precisa de "..count.." "..money[2].." pra apostar.") CB[2](getThingPos(cid), CONST_ME_POFF) else if chance1 <= 50 then CB[3](cid, PR[1], 2) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[1]).."", 22) end if chance2 <= 30 then CB[3](cid, PR[2], 1) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[2]).."", 22) end if chance3 <= 10 then CB[3](cid, PR[3], 1) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[3]).."", 22) end if chance1 > 50 and chance2 > 30 and chance3 > 10 then doBroadcastMessage(""..cast.." Você perdeu sua aposta.", 22) end return TRUE end return TRUE end
  13. @leozincorsair Só tem um problema: 50 + 30 + 10 = 90%. Os outros 10% serão o quê? O jogador não ganha coisa alguma?
  14. Diga a chance que você quer para cada item. {11413, 11414, 11467}. (Algo como: 11413 = 20%, 11414 = 30% e 11467 = 50%, por exemplo).
  15. @elielder duas coisas a serem consideradas: 1°, você deu reload na configuração e nos monstros após aplicar as alterações? Do contrário, elas não surtirão efeito. 2°, a probabilidade é para cada item individualmente, então digamos que você listou nesse caso 5 itens diferentes com 0,9% de chance de drop para cada. Estatisticamente, a cada 100 criaturas que o jogador matar, ele obterá "4,5" (entre 4 e 5) itens, sendo 1 de cada. Se entre esses 5 itens, como um todo, você quiser que apenas 1 item venha de loot a cada 100 criaturas, você deve colocar neles a chance de 0,2%, que no caso seria chance="200" (0,2% x 5 = 1%).
  16. @Vodkart , exatamente. Só descobri isso porque executei um serversave, até então eu não tinha recebido qualquer mensagem de erro. Consegui resolver, aparentemente! Eu simplesmente adicionei a coluna "world_id" na tabela "global_storage" e agora está funcionando. Fechei e abri o servidor e agora o script original funciona da maneira esperada e novos jogadores não ativam mais o script. O evento ocorre apenas uma vez! Ficou assim: Obrigado a todos que deram atenção ao tópico! O problema não era no script, mas sim no meu database. Obs: eu coloquei o valor padrão do world_id como "0" porque este é valor configurado no meu config.lua. Se alguém que estiver lendo isso utilizar um valor diferente, terá de adaptar.
  17. @Vodkart irei testar logo menos e já respondo. É que este padrão se repetirá muitas vezes com outras actions e conforme a história da quest avança. O valor da tabela mudará muitas vezes por isso eu estava tentando lidar com as storages com as quais sou mais familiarizado e sei que funcionam bem para gerenciar isso. A propósito, eu fiz um teste aqui: tentei executar a função pronta de "doServerSave" logo após mudar o valor da globalstorage para ver se assim salvava, e obtive uma mensagem de erro no console. setGlobalStorageValue(9000, 1) doSaveServer() Isso explicaria o porquê da globalstorage não salvar?
  18. @Vodkart, se você puder, leia a resposta anterior que deixei. Eu preciso registrar o evento do NPC ter aparecido alguma vez para seguir uma quest válida para todos os players. Não estou tendo problemas em duplicar o NPC nem nada. Enquanto o servidor está rodando o script funciona perfeitamente conforme o planejado. O problema é que ao fechar/reiniciar o servidor a globalstorage perde o valor e aí tudo recomeça, o que eu não quero que aconteça. Para solucionar isso eu preciso ou manter o valor da globalstorage, que eu não sei por que diabos some, ou atualizar o valor de uma storage dos players (o que consumiria mais processamento e memória, mas estou disposto a tentar ). Edit: vou deixar de lado o código e explicar com palavras a mecânica esperada. Talvez ajude. -> Se o NPC ainda não apareceu na história do servidor, um jogador pode fazê-lo aparecer ao pisar em um sqm. -> Se o NPC já apareceu alguma vez na história, ele não deve aparecer jamais, em hipótese alguma, mesmo que o servidor seja reiniciado e etc. Para solucionar isso eu imaginei que a globalstorage servisse, ou um registro geral em todos os players.
  19. @lordzetros o problema é que eu quero que seja um evento único ao longo de todo o jogo, entende? Esse NPC inclusive irá sumir depois de outro acontecimento. Preciso que o aparecimento dele fique registrado mesmo depois do servidor ser fechado/reiniciado. Eu pretendia utilizar as storages porque depois as usarei como andamento de uma quest que vale para todo e qualquer jogador. Eu sei que isso será possível da seguinte forma: 1) a globalstorage 9000 recebe o valor 1 e isso fica salvo, mesmo quando o servidor reiniciar (seria o ideal, acredito), ou... 2) todos os players recebem o valor 1 na player_storage 9000.
  20. Base: TFS 0.4.0 Qual erro está surgindo/O que você procura? Resolvi fazer um script para quando o player pisasse em um determinado SQM, surgisse um NPC em certo ponto do mapa. A minha ideia era que o npc surgisse apenas uma vez, então resolvi utilizar uma globalstorage para que assim que o primeiro player acionasse o evento, todos os demais não conseguissem. O script funcionou perfeitamente, e de fato apenas o primeiro player consegue trazer o NPC para o local desejado. O problema é que a global storage não fica salva no valor que eu determinei (no caso, "1") e quando o servidor é fechado/reinicia, os outros jogadores conseguem acionar o evento - o que eu não quero que aconteça. Gostaria de saber se as globalstorage permanecessem salvas, ou o que fazer para que elas fiquem salvas. Notei que no config.lua há a seguinte opção: "saveGlobalStorage = true", mas ela já está configurada como "true", então não creio que seja isso. Acho que não é a opção ideal, mas para solucionar o caso, também seria possível atualizar a storage de todos os players do servidor (ao invés de utilizar a global storage). Se alguém puder me ajudar com o script, eu agradeço. Imagino que ficaria algo como: "for (id do primeiro ao último player do banco de dados) atualizar o value de uma key da tabela player_storage", mas eu não faço ideia de como isso fica em código. Você tem o código disponível? Se tiver publique-o aqui: local pos = {x=875,y=398,z=7} -- Local do NPC function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) if getGlobalStorageValue(9000) <= 0 then if isPlayer(cid) and getPlayerAccess(cid) < 3 and getPlayerStorageValue(cid, 9000) <= 0 then doCreateNpc("GoblinAssustadoOesteCidade", pos) end setGlobalStorageValue(9000, 1) end return true end
  21. Pode postar o conteúdo do seu vocations.xml aqui?
  22. @egyptPOWER , sim, eu copiei como padrão outros itens que eu sei que são "useable" como picaretas, cordas e runas. Mudei tanto no ObjectBuilder quanto no OTItemEditor. --- EDIT --- Eu refiz tudo do começo, refiz o dat e o otb e agora funcionou com o código do Sttorm. Não vejo muito motivo, porque eu já tinha atualizado-os antes no ObjBuilder e no OTItemEditor, mas sei lá... talvez alguma desatenção? Haha. Obrigado aos que tentaram me ajudar.
  23. @Sttorm obrigado por tentar ajudar, mas com este código simplesmente nada acontece. Nenhum erro na distro, nenhuma mensagem de retorno, nem nada.
  24. Gostaria de fazer uma action para um item que eu pudesse utilizar em outro player e, ao fazê-lo, fizesse o valor de uma storage (3999) desse player alvo mudar para 3. OBS: TFS 0.4.0 Eu tentei fazer eu mesmo, mas percebi que eu não sei como fazer isso por completo. Criei uma action.lua, registrei no actions.xml para o id do item e com itemeditor/objectbuilder ainda editei os atributos desse item específico para que fosse utilizável e etc... Pois bem, o código funciona e eu consigo utilizar o item normalmente, mas o meu problema é: O item só pode ser utilizado pelo próprio jogador, (como se fosse uma food, por exemplo), eu não consigo fazer a action com crosshair (como se fosse uma runa, por exemplo) que eu consigo mirar e posso escolher o alvo. Como fazer isso? Eu tentei alguns outros códigos aqui, mas não deram certo.. A estrutura e a lógica do código base é essa:
  25. @Hokograma , a verdade é que a forma como você lê isso vai depender do código base que você utilizou na source. Supondo que seja o padrão, a leitura é feita desta forma: Vou chamar esses 4 termos aí dentro dos parênteses de "a", "b", "c" e "d" a = multiplicador mínimo da fórmula base de dano mágico b = constante adicionada ao dano mínimo c = multiplicador máximo da fórmula base de dano mágico d = constante adicionada ao dano máximo Lembrando que o dano vai variar entre "min" e "max". Traduzindo: se eu coloco (-2, -15, -3, - 60) O dano será algo entre a fórmula base de dano mágico multiplicado por 2, e mais 15. Já o dano máximo será a fórmula base de dano mágico multiplicado por 3 e mais 60. Obs1: lembrando que se for para cura, utilizamos números positivos. No caso de magias de ataque, como queremos dano, os números são negativos. Obs2: essa "fórmula base" determinada na source sobre a qual aplicaremos esses novos parâmetros também pode ser alterada nesse parêntese. A fórmula original eu não me lembro de cabeça, mas é algo como level/5 (tanto para dano mínimo quanto máximo) + maglevel*um multiplicador para mínimo e outro para máximo que eu não me lembro agora. Resumindo, naquele parênteses você pode colocar os termos "e", "f", "g" e "h", cada um deles significando: e = número pelo qual o level será dividido e adicionado ao dano mínimo f = número pelo qual o level será dividido e adicionado ao dano máximo g = multiplicador do magic level a ser adicionado no dano mínimo h = multiplicador do magic level a ser adicionado no dano máximo Traduzindo: se eu coloco (-2, -15, -3, -60, 5, 5, 0.8, 1.8) O dano será: mínimo: -2 * (level/5 + magiclevel*0.8) - 15 máximo: -3 * (level/5 + magiclevel*1.8) - 60 Se um player Level 50, magiclevel 50 utilizar a magia, teremos: mínimo: -2 * (50/5 + 50*0.8) - 15 -> -115 máximo: -3 * (50/5 + 50*1.8) - 60 -> -360 Essa magia faria um dano entre 115 e 360. E POR FIM, se você quiser sobrescrever todas essas fórmulas, você pode criar uma função própria na sua spell para determinar seu próprio dano. Exemplo: Depois basta setar esse CombatCallback conforme o nome que você deu para a função. Ex:

Informação Importante

Confirmação de Termo