Ir para conteúdo
Banner com Efeitos

Tadelho

Membro
  • Registro em

  • Última visita

Tudo que Tadelho postou

  1. @Farathor Joguei no gugol e achei a fórmula, é bem simples: (x³ + 5x + 6) : 6 Só que há 2 observações: 1) Essa tabela aí está deslocada em 2 termos. Quero dizer: se você substituir o valor de X por, vamos dizer, "4", você vai obter o resultado do termo 6. Se substituir X por 9, vai obter o resultado do termo 11, e daí por diante. 2) o resultado ao final é multiplicado por 10. --- Edit --- Ajustando isso que comentei acima, a fórmula é: {[(x-2)³ + 5 * (x-2) + 6] / 6} * 10 Se você não entendeu... points = {[(skill-2)³ + 5 * (skill-2) + 6] / 6} * 10
  2. Cara, essa é uma sequência que você pode procurar chamada "cake number" (não sei se posso publicar links externos aqui). Se quiser procurar na enciclopédia de sequência de inteiros, o código é A000125. Os points são os números dessa sequência multiplicados por 10.
  3. Com esse código o erro persiste o mesmo e o efeito da magia nem sai. Estou tentando resolver aqui, já coloquei verificação de isCreature na função da sendFlamingSphere, já tentei colocar a verificação dentro do script da spell no onSay, já tentei verificar se o targetPos era igual e/ou diferente nil e false, etc... enfim, não consigo resolver.
  4. @DboExplorer, valeu por tentar ajudar, mas o erro persiste igual. Acho que o problema é porque a repetição do efeito já é disparada toda de uma vez, aí a partir do ponto em que ele não encontra mais o monstro dá o erro.
  5. Há o Critical System do Night Wolf que faz exatamente isso, dá para adaptar. 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: monstro.xml: 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.
  6. Olá, fiz eu mesmo o script para uma spell em TFS 0.4.0 mas estou enfrentando um erro. O código funciona perfeitamente, o efeito é como eu queria e o dano também, mas quando a criatura morre a função continua buscando a posição do Target (posTarget) e como não encontra (já que o monstro está morto), ele me retorna um erro no console. Obs: enquanto a criatura está viva não há erro algum. Eu sei que o erro é causado por esse motivo: a CreaturePosition não retornar um valor válido já que o monstro morreu, mas como eu faço para interromper essa verificação depois do bicho morto e evitar o erro no console? Já tentei comparar posTarget com "nil", "false", mas não faço ideia de como resolver isso, apesar de parecer simples. Segue imagem do erro e em seguida o código da spell: Erro:
  7. @OmegaZero Cara, eu não sei qual a versão de servidor que você está utilizando. Eu vou te fazer aqui um script para TFS 0.4.0, é bem simples. Crie um arquivo .lua na pasta ...weapons/scripts (escolha o nome do arquivo, ex: "script.lua") Dentro do arquivo insira o seguinte código: Explicando o script: toda vez que você atacar com a arma, ele irá sortear um número de 1 a 100. Se este número for maior que a chance que você determinou, o ataque ocorrerá normalmente. Se for menor, a arma fará um ataque adicional 500 milissegundos depois do primeiro (ataque duplo). Agora vá em weapons.xml e registre este script na arma que você quer que tenha esse comportamento. Ex: Obs: melee id = o ID number da arma que você quer. Para TFS 0.4.0 é isso. Se você estiver usando outra versão, não saberei ajudar.
  8. Meu problema foi resolvido. Obrigado, @Kydrai.
  9. Caraca, eu estava suspeitando mas não tinha entendido isso. Muito obrigado. Só uma coisa: eu achei o código desse pequeno sistema lógico que você descreveu para estabelecer se o player tem defesa ou não, mas onde eu encontro que o ataque sofrido soma -1 no blockCount? Obs: Para quem quiser achar, o trecho de código é esse em creature.cpp E depois:
  10. Olá a todos. Gostaria de saber em que parte da source (TFS 0.4.0) eu encontro a determinação de que players e monstros (creatures em geral, portanto) são capazes de bloquear apenas 2 ataques por vez - como vocês sabem, uma terceira, quarta (etc) criatura ao atacar pega o inimigo sem descontar a "def" do ataque, apenas o "armor", e eu gostaria de saber que trecho de código se refere a isso, pois pretendo fazer alterações. Andei procurando em creature.cpp, weapon.cpp, combat.cpp, condition.cpp, creatueevent.cpp, game.cpp, player.cpp e não estou sabendo identificar qual é o mecanismo que determina essa limitação de defender-se apenas 2 ataques por turno. Se alguém souber me informar ou tiver uma ideia de como mudar esse mecanismo, ficarei grato. Obrigado, até mais!
  11. Eu não sei qual versão você está utilizando, mas não é complicado. No caso do TFS 0.4.0, acima do "onCastSpell" crie uma condition (darei o nome "speed") com os seguintes parâmetros: Pronto, quando o combat for executado o alvo da spell receberá condição de "haste" e uma certa velocidade a mais por 10 segundos. No caso, vai receber apenas +30 de speed, o que não é muito, mas isso você configura ali no "setConditionFormula".
  12. Olá a todos. É possível criar uma spell para os players que atribuam condições de "debuff" nos monstros, reduzindo temporariamente seu ataque, defesa, resistências, etc? Basicamente a força deles está condicionada nesta parte do monster.xml: <attacks> <attack name="melee" interval="2000" skill="40" attack="10"/> </attacks> <defenses armor="100" defense="600"/> <elements> <element earthPercent="20"/> </elements> Eu criei uma spell que funciona para reduzir as skills dos players, com o seguinte código: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_STUN) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLHOLY) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, 6000) setConditionParam(condition, CONDITION_PARAM_SKILL_MELEE, -20) setCombatCondition(combat, condition) function onCastSpell(cid, var) local target = getCreatureTarget(cid) doCombat(cid, combat, var) doAddCondition(target, condition) return true end Funciona perfeitamente com players, mas contra os monstros ela é inútil. Tem algum jeito de fazer isso - criar condições temporárias que acessem "attacks", "defense" e "resistances" dos monstros.xml com as constantes e parâmetros já existentes no tfs0.4? Ou qual seria a maneira de se fazer isso? Obrigado, desde já.
  13. Salve, pessoas. Recentemente criei esse script para meu servidor particular e, embora simples, dá uma margem legal para a criatividade de vocês. Trata-se de um script para dar uma função especial a uma weapon qualquer do seu servidor quando você enfrenta uma criatura específica (ou mesmo um tipo de criatura). Para isso utilizarmos uma função que pega o nome da criatura que você está atacando e verifica se ela pertence à sua tabela de verificação. Caso positivo, sua arma agirá de um modo diferente contra essa criatura específica. O feitio é simples: criar um script no diretório .../weapons/scripts com o nome à sua escolha. Ex: "nome.lua" Darei primeiro o conteúdo do meu script como exemplo: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1.0, 0, 1.0, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat2, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat2, COMBAT_FORMULA_SKILL, 2.0, 0, 2.0, 0) local creatures = {"x", "y", "z"} function onUseWeapon(cid, var) local target = getCreatureTarget(cid) local nome = getCreatureName(target) if (not isInArray (creatures, nome)) then doCombat(cid, combat, var) else doCombat(cid, combat2, var) end end Explicando o código: combat e combat2 são, respectivamente, os diferentes efeitos que eu desejo que minha arma tenha, e aqui podemos configurar uma série de possibilidades diferentes. No caso, "combat" está configurado para que seja uma arma normal como qualquer outra. O "combat2" está configurado para que esta arma dê um dano x2 (listado na fórmula) Obs: nesta parte podemos brincar com as fórmulas e o tipo de dano conforme o gosto. Podemos adicionar um efeito secundário de algum elemento, como fogo, gelo, ou mesmo um lifedrain. Só não se esqueça de balancear a fórmula. IMPORTANTE: "Creatures" é onde vou listar as criaturas para as quais quero que minha arma tenha um comportamento diferente, separadas por vírgula. Dentro da função onUseWeapon temos um código que será executado ao utilizarmos a arma em questão para um ataque. Em "target" verificamos qual a criatura alvo do meu ataque, em seguida "nome" recebe o valor do nome da criatura em questão e temos uma condicional (if) que verifica se o nome da criatura que estamos atacando está inserida em "Creatures". Caso não esteja, ela assumirá o comportamento de "combat", ou seja, será uma arma com a fórmula e dano físico padrão do servidor; caso o nome esteja na minha lista especial, a arma assumirá "Combar2" e terá uma fórmula de dano x2, será uma arma poderosa contra essa criatura listada. Uma vez feito o script, não se esqueça de registrá-lo na arma de sua preferência no weapons.xml. Ex: <melee id="2397" event="script" value="nome.lua"> Algumas ideias de como você pode utilizar a base do código: - Quests e bosses; podemos fazer um boss que só seja derrotado com uma arma específica, por exemplo. - Podemos brincar com mais recursos, como getPlayerVocation ou getPlayerLevel e com mais condicionais fazer armas que só liberem seu poder oculto nas mãos de alguma vocação, em um certo level, contra um tipo de criatura, etc. - Eu utilizei no meu servidor que é baseado em Dungeons & Dragons para fazer com que mortos vivos tomem dano integral de ataques com club mas tomem metade do dano contra ataques de sword/axe (neste universo mortos-vivos são melhor esmagados do que cortados ou perfurados). Enfim, um exemplo prático: crio uma quest com a recompensa de uma espada conhecida por "exterminar dragões". Registro no weapons.xml esta arma com um script.lua do meu gosto, como: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1.0, 0, 1.0, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatFormula(combat2, COMBAT_FORMULA_SKILL, 0, -60, 0, -90) local creatures = {"Dragon", "Dragon Lord", "Frost Dragon"} function onUseWeapon(cid, var) local target = getCreatureTarget(cid) local nome = getCreatureName(target) if (not isInArray (creatures, nome)) then doCombat(cid, combat, var) else doCombat(cid, combat, var) doCombat(cid, combat2, var) end end Neste caso coloquei para, no caso de ser um dos dragões listados, ocorrer tanto o combat como o combat2, ou seja, a espada não só atacar como também drenar uma certa quantidade de vida da criatura (60-90). E no resto do tempo, ela será uma espada normal. É isso ai, espero ter contribuído. Até a próxima.
  14. @xWhiteWolf Há, verdade! Escrevi "combat" ao invés de "combat2" no segundo script. Obrigado, a dúvida foi sanada. Farei um tutorial com algumas ideias para o pessoal depois e atualizo aqui. --- UPDATE: Fiz um tutorial demonstrando como criar diferentes combats para acertar monstros específicos:
  15. Olá a todos. Como eu faço para desabilitar alguma skill da lista no OTClient sem bugar o resto do client? Criei uma nova variedade de skills para o meu servidor e consegui editar o OTClient para mostrá-los, como vocês podem ver na imagem a seguir (alterações feitas em module/game_skills/skills.otui). Neste mesmo arquivo (skills.otui) eu consigo fazer sumir apenas o nome das skills que já não existem no meu servidor (Fist e Fishing), mas sempre que eu apago o código desses skills da lista de buttons para fazê-los sumirem de verdade o Combat Controls fica bugado e as opções de "Full Defense/Balanced/Offensive Fighting" somem, sendo substituídas por aqueles outros modos de combate (aqueles com as pombinhas, sei lá o nome). Eu já cacei pelos arquivos aqui no módulo de combate para tentar entender o porquê de mexer nos skills afetar o outro módulo, mas não encontrei nada que me parecesse responder o caso. Resumindo: alguém faz ideia de como eu posso eliminar completamente esses skills irrelevantes da minha aba de skills? Toda alteração no número de skills visíveis que tentei no modules/game_skills/skills.lua também resultou neste bug no módulo de combate. (Sim, minha "solução" mostrada na imagem foi simplesmente apagar o nome da skill, mas ela continua ali ocupando uma linha e tendo valor "10", o que não é o ideal.)
  16. @xWhiteWolf percebi que eu não conseguiria resolver da maneira que queria pelos motivos que você listou aqui. PORÉM, consegui resolver da minha forma, invertendo a lógica e criando um script para as armas que, para minha surpresa, "funcionou". Criei e registrei devidamente um arquivo.lua com o seguinte script: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1.0, 0, 1.0, 0) local combat2 = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 2.0, 0, 2.0, 0) local creatures = {"Demon Skeleton"} function onUseWeapon(cid, var) local target = getCreatureTarget(cid) local nome = getCreatureName(target) if (not isInArray (creatures, nome)) then doCombat(cid, combat, var) doPlayerSendTextMessage (cid,22,"TESTE1") else doCombat(cid, combat2, var) doPlayerSendTextMessage (cid,22,"TESTE2") end end O script funciona perfeitamente, eu obtenho a mensagem "teste1" e "teste2" quando alterno o target entre o demon skeleton e as outras criaturas, mas especificamente o "combat2" não é executado, não ataco a criatura. Alguma ideia do motivo?
  17. Olá novamente. Estou utilizando um TFS 0.4.0 e gost gostaria de formular um script com o seguinte objetivo: dobrar o dano em determinadas criaturas quando a arma do player for do tipo "club". Pensei em duas hipóteses para resolver o caso: 1) criar um creaturescript e registrá-lo nas criaturas em questão, ou 2) criar um weaponscript, registrar nas armas de club e adicionar manualmente a tabela com o nome das criaturas assim afetadas pela arma. Pergunto para quem já tem mais experiência: conhecendo as funções disponíveis no TFS 0.4.0, qual ideia vocês acham melhor? E principalmente: poderiam em ajudar na elaboração do script? Eu tentei criar um script para o caso 1 (creaturescripts) que me parecia mais fácil e registrei tanto no creaturescript.xml quanto no xml de um demon skeleton para testar, mas não funciona (nenhum erro na distro). Minha ideia foi: local mult = 2 local arma = getItemWeaponType(uid) function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS and isCreature(attacker) then if arma == 1 then dano = math.ceil(dano*(mult)) doTargetCombatHealth(attacker, cid, combat, -dano, -dano, 255) doSendAnimatedText(getCreaturePos(cid), "TESTE", 20) return false end end return true end Mas eu realmente sou leigo em programação como um todo, e não sei se estou utilizando as funções corretamente. Pelo que entendi, o getItemWeaponType(uid) retorna o tipo da arma (0 = fist, 1 = club, etc), é isso? Neste caso, já que estou utilizando club no teste, o dano não deveria estar sendo substituído por esta nova fórmula e soltando uma mensagem de confirmação "TESTE" (que pretendo apagar depois)? Se alguém puder me ajudar a elaborar tal script, seja registrando o weapon e adicionando manualmente o nome das criaturas afetadas ou direto pelo creaturescript, ficarei grato. Obrigado pela ajuda desde já.
  18. @Luis360 Tentei a substituição, mas infelizmente não é isso. --- UPDATE, SOLUCIONADO! --- Pessoal, consegui corrigir. Coloquei da seguinte forma: base = getThingFromPos({x=toPosition.x, y=toPosition.y, z=toPosition.z, stackpos=2}) if base.itemid == 2555 then Resumindo: retirei o "local posicao" (não era necessário) e coloquei .itemid ao invés de .id ou .uid. Está funcionando, mas caso alguém utilize esse código no futuro tome muito cuidado com o "stackpos", este código não funcionará caso o item que você deseja utilizar como referência esteja em empilhado em outra posição. Procure por como funciona o stackpos (tem aqui no fórum bem explicado: http://www.tibiaking.com/forum/forums/topic/19261-entendendo-o-stackpos/ ) para maiores detalhes. Obrigado, abraços!
  19. -- UPDATE, SOLUÇÃO ABAIXO! -- Olá, estou utilizando o sistema do Killua de refinamento de armas no meu servidor TFS 0.4.0 (este: http://www.tibiaking.com/forum/forums/topic/34708-sistema-de-upgrade-bronson-server-refinar/? ) que possui o seguinte código: --- Sistema de Upgrade de itens feito por Killua. --- Sistema feito com base no do Bronson Server. local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados local controle = { {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso {level = 1, quantOre = 2, chance = 90}, {level = 2, quantOre = 3, chance = 80}, {level = 3, quantOre = 4, chance = 70}, {level = 4, quantOre = 5, chance = 60}, {level = 5, quantOre = 6, chance = 50}, {level = 6, quantOre = 7, chance = 40}, {level = 7, quantOre = 8, chance = 30}, {level = 8, quantOre = 9, chance = 20}, {level = 9, quantOre = 10, chance = 10} } function getItemLevel(uid) if uid > 0 then return getItemAttribute(uid, "lvl") or 0 end return false end function doItemAddLevel(uid, count) if uid > 0 and tonumber(count) > 0 then return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count) end return false end function onUse(cid, item, fromPosition, itemEx, toPosition) if not isInArray(vocations, getPlayerVocation(cid)) then return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.") elseif isInArray(ids_bloqueados, itemEx.uid) then return doPlayerSendCancel(cid, "Este item nao pode ser refinado.") end if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then for _, upgrade in pairs(controle) do local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor local chance = math.random(1, 100) if getItemLevel(itemEx.uid) == upgrade.level then if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS) if chance <= upgrade.chance then if getItemLevel(itemEx.uid) == 0 then doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid)) end doItemAddLevel(itemEx.uid, 1) doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid)) if getItemInfo(itemEx.itemid).attack > 0 then doItemSetAttribute(itemEx.uid, "attack", atk + 1) return true elseif getItemInfo(itemEx.itemid).armor > 0 then doItemSetAttribute(itemEx.uid, "armor", arm + 1) return true elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then doItemSetAttribute(itemEx.uid, "defense", def + 1) return true end else doTransformItem(itemEx.uid, 2256) doItemSetAttribute(itemEx.uid, 'name', "metal trash") doItemSetAttribute(itemEx.uid, 'attack', 0) doItemSetAttribute(itemEx.uid, 'armor', 0) doItemSetAttribute(itemEx.uid, 'defense', 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.") return true end else doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.") end end end else doPlayerSendCancel(cid, "Esse item nao pode ser refinado.") end return true end O sistema funciona perfeitamente, mas funciona em qualquer lugar do mapa. Gostaria de adicionar uma condição para que a reforja dos itens só fosse possível quando o item a ser refinado estiver em cima de uma bigorna (anvil), que no caso tem id 2555. Eu tentei eu mesmo inserir o seguinte código: {...} function onUse(cid, item, fromPosition, itemEx, toPosition) if not isInArray(vocations, getPlayerVocation(cid)) then return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.") elseif isInArray(ids_bloqueados, itemEx.uid) then return doPlayerSendCancel(cid, "Este item nao pode ser refinado.") end local posicao = {x=toPosition.x, y=toPosition.y, z=toPosition.z, stackpos=2} local base = getThingFromPos(posicao) if base.id == 2555 then if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then for _, upgrade in pairs(controle) do local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor {...} else doPlayerSendCancel(cid, "You must find an appropriate place to reforge your item.") end return true end Eu não sou programador nem nada, mas pelo que entendo, a minha lógica foi: local posicao = {x=toPosition.x, y=toPosition.y, z=toPosition.z, stackpos=2} <--- Pegar a posição em que o player usou o martelo da forja, sendo o stackpos=2 a posição relativa da bigorna naquele sqm. local base = getThingFromPos(posicao) <--- Identificar o que há naquela posição Depois em: if base.id == 2555 then <--- verificar se o ID do item é o 2555 (bigorna) para executar todo o código da forja E ao final, o else: else doPlayerSendCancel(cid, "You must find an appropriate place to reforge your item.") <--- caso não seja uma bigorna, nada ocorre e há uma mensagem confirmando isso. end Em suma: este meu código não está funcionando. Não há erros na distro, e sempre que tento reforjar o item recebo este mensagem contida no "else", indicando que não estou achando o id da bigorna (2555) na minha verificação de posição. O que fiz de errado?Alguém pode me ajudar? Desde já, grato!
  20. Olá, a todos. Estou trabalhando em um projeto particular onde recrio muitos elementos do D&D clássico usando como base um TFS 0.4.0 e me surgiu uma dúvida: é possível condicionar o HP máximo das criaturas através de script? Imaginei algo como criar um creaturescript para, ao nascer, estabelecer uma fórmula para redefinir qual será o HP máximo do monstro, fazendo com que monstros iguais não necessariamente tenham o mesmo tanto de vida. A questão é: Isso é possível, ou estarei sempre preso ao HP definido no arquivo do monstro.xml (health max="xxx")? Como fazer? Ou, se alguém ainda tiver outra ideia... enfim, aguardo e agradeço desde já!
  21. EDIT: PQP, ACABEI DE REPARAR NO MEU ERRO, ALGO TOLO. A FUNÇÃO É "getCreatureOutfit" e não "PlayerOutfit". O Código estava correto, no resto. Se eu tivesse reparado antes não teria criado o tópico, lamento. Olá, estou tendo dificuldades de fazer esse script funcionar (TFS 0.4). A ideia é que o player, ao utilizar um baú: 1) receba uma backpack com alguns itens, 2) receba uma vocação 3) receba uma outfit específica que vai variar conforme a outfit atual Elaborei esse script, mas ele está funcionando parcialmente. O jogador recebe a backpack, e até o "doPlayerSetPromotionLevel(cid,1)" o script é executado, mas as condições de "if" outfit não estão sendo executadas, (a storage não recebe o valor 2, a janela de outfit não abre, etc). O que eu posso estar fazendo de errado? Obs: sim, o looktype do outfit do jogador é um dos previstos no código (146, 159 e 160) Código: function onUse(cid, item, frompos, item2, topos) local queststatus = getPlayerStorageValue(cid,9500) local outfit = getPlayerOutfit(cid) if item.uid == 9500 and queststatus == 1 then if getPlayerVocation(cid) == 0 then doPlayerSendTextMessage (cid,22,"Você encontrou a backpack com os equipamentos.") bp = doPlayerAddItem(cid,1988,1) doAddContainerItem(bp,2642,1) doAddContainerItem(bp,2649,1) doSendMagicEffect(getCreaturePosition(cid), 9) doPlayerSetPromotionLevel(cid, 1) if outfit.lookType == 159 then doPlayerAddOutfitId(cid, 2, 0) doPlayerRemoveOutfitId(cid, 26, 0) setPlayerStorageValue(cid,9500,2) doPlayerSendOutfitWindow(cid) elseif outfit.lookType == 146 then doPlayerAddOutfitId(cid, 10, 0) doPlayerRemoveOutfitId(cid, 28, 0) setPlayerStorageValue(cid,9500,2) doPlayerSendOutfitWindow(cid) elseif outfit.lookType == 160 then doPlayerAddOutfitId(cid, 18, 0) doPlayerRemoveOutfitId(cid, 27, 0) setPlayerStorageValue(cid,9500,2) doPlayerSendOutfitWindow(cid) else return true end else return true end else doPlayerSendTextMessage(cid,22,"Você não tem o que pegar aqui.") end return true end Obrigado pela atenção de todos novamente.
  22. Opa, fiz a mesma pergunta em um outro fórum e lá me responderam, então resolvi compartilhar a informação aqui. Em "creature.cpp" há uma sessão onde é estabelecida a fórmula de defesa do atributo "Arm" dos seus equipamentos. No meu caso, TFS 0.4, fica no seguinte trecho: if(checkArmor) { int32_t armorValue = getArmor(), minArmorReduction = 0, maxArmorReduction = 0; if(armorValue > 1) { minArmorReduction = (int32_t)std::ceil(armorValue * 0.475); maxArmorReduction = (int32_t)std::ceil( ((armorValue * 0.475) - 1) + minArmorReduction); } else if(armorValue == 1) { minArmorReduction = 1; maxArmorReduction = 1; } Para as outras versões, o trecho de código é parecido, basta dar um "Ctrl + F" na palavra armor em creature.cpp.
  23. Olá a todos. Estou fazendo algumas alterações na source do meu servidor (baseado em TFS 0.4.0) e gostaria de saber se alguém pode me dizer em que parte do código eu encontro os cálculos de "Armor" das armaduras na defesa do personagem. Já alterei o ataque, o ataque à distância, o "defense", e agora gostaria de fazer um ajuste fino no quanto cada +1 de Arm absorverá o dano. Andei caçando pelos arquivos, e o máximo que encontrei foi em player.cpp o código a seguir, mas imagino que isso seja definido em algum outro trecho de código. int32_t Player::getArmor() const { int32_t i = SLOT_FIRST, armor = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) armor += item->getArmor(); } if(vocation->getMultiplier(MULTIPLIER_ARMOR) != 1.0) return int32_t(armor * vocation->getMultiplier(MULTIPLIER_ARMOR)); return armor; } Obrigado pela ajuda desde já.
  24. @Wakon, acho que entendi agora... eu preciso setar um "talkstate" para diferenciar os diferentes estágios da conversa, e também não havia colocado para receber o valor do "msg". Aparentemente está funcionando, obrigado.
  25. Olá novamente. Como vocês sabem, eu sou um completo asno em programação e estou tendo problemas mais uma vez com um script que bolei aqui para ser uma espécie de "oráculo" específico de uma vocação (id = 1). Não há erros no console do servidor, o NPC é invocado normalmente, ele reconhece minha saudação "hi" (referente ao trecho do código: 'Cuidado, |PLAYERNAME|, isto não é lugar para crianças. Apenas um {guerreiro} deveria estar aqui.'), mas nenhuma das outras palavras-chave surtem algum efeito, o que me faz pensar que minha função esteja errada, mas minha ignorância não me permite dizer algo mais do que isso. Segue o script.lua: Obs: Utilizo o TFS 0.4.0 local npcHandler = NpcHandler:new(keywordHandler) local keywordHandler = KeywordHandler:new() NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end npcHandler:setMessage(MESSAGE_GREET, 'Cuidado, |PLAYERNAME|, isto não é lugar para crianças. Apenas um {guerreiro} deveria estar aqui.') function creatureSayCallback(cid, type, msg) local pos = getCreaturePosition(getNpcCid()) local West = {x=pos.x-1,y=pos.y,z=pos.z} if not npcHandler:isFocused(cid) then return false elseif msgcontains(msg, 'guerreiro') then npcHandler:say('Você está interessado em se tornar um guerreiro? Uma vez iniciado, você não poderá voltar atrás.', cid) if msgcontains(msg, 'sim') then if (getPlayerVocation(cid) == 0) then if getPlayerStorageValue(cid,9500) == -1 then npcHandler:say('Você deve antes provar seu valor de combate. Me mostre se é capaz de destruir isto...', cid) doSummonCreature('Training Target', West) else npcHandler:say('Você parece levar jeito e será iniciado na classe de guerreiro. Veja, há um baú no posto logo acima. Tenho certeza que ali ainda deve haver algum equipamento básico de guerreiro para você.') setPlayerSetVocation(cid,1) setPlayerStorageValue(cid,9500,1) if getPlayerStorageValue(cid,8415,1) then SetPlayerStorageValue(cid,8412,1) SetPlayerStorageValue(cid,8415,0) elseif getPlayerStorageValue(cid,8410,1) then SetPlayerStorageValue(cid,8411,1) SetPlayerStorageValue(cid,8410,0) elseif getPlayerStorageValue(cid,8416,1) then SetPlayerStorageValue(cid,8403,1) SetPlayerStorageValue(cid,8416,0) end end else npcHandler:say('Você já foi iniciado em uma classe.') return true end else npcHandler:say('Então não tome meu tempo, estamos ocupados.', cid) return true end elseif msgcontains(msg, 'mágica') then npcHandler:say('Huh? A habilidade com uma espada ou um machado não se comparam com esses truques baratos.') elseif msgcontains(msg, 'comprar', 'vender') then npcHandler:say('Não estou vendendo ou comprando coisa alguma. Minha função é preparar novos guerreiros.') end return true end npcHandler:addModule(FocusModule:new()) Alguém pode me ajudar?

Informação Importante

Confirmação de Termo