Jump to content
Close

Tadelho

Member
  • Content Count

    60
  • Joined

  • Last visited

About Tadelho

  • Rank
    Blacksmith

Profile Information

  • Gender
    Masculino
  • I am
    Designer

Recent Profile Visitors

937 profile views
  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. @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%).

Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...