Administrador gutinha 1.286 Postado 28 de Setembro 2023 Administrador Compartilhar Postado 28 de Setembro 2023 APRENDA PELO EXEMPLO! Neste tópico postarei o script que migrei do antigo TFS para o TFS 1.1+. Eles não são um sistema pronto para ser executado, então não posso publicá-los em Recursos, mas tenho certeza de que muitas pessoas podem aprender como escrever 'novos scripts LUA' a partir dele. 1. onStatsChange(cid, attacker, type, combat, value) evento em 1.x é dividido em 2 eventos: onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin) onManaChange(creature, attacker, manaChange, origin) No TFS antigo você tinha que usar 'return false' para bloquear os danos, no novo você precisa definir os valores dos danos como 0 - as variáveis LUA estão vinculadas às variáveis C++ As variáveis vinculadas no TFS 1.1+ são: primaryDamage primaryType secondaryDamage secondaryType manaChange Se você modificar o valor de qualquer um deles, isso mudará nos cálculos do TFS C++! Agora você pode não apenas bloquear o dano, mas também reduzi-lo em porcentagem ou valor. 1° exemplo, reduza o dano de mana [e cura, poções?] em 25%: function onManaChange(creature, attacker, manaChange, origin) -- verifica se o atacante é Jogador, 'criatura' é sempre Jogador, pois 'registerEvent' é apenas para jogadores if attacker:isPlayer() then -- alterar manaChange para 75% do valor inicial manaChange = (manaChange * 75) / 100 end return true end 2° exemplo, alguma arena PvP (teletransporte para o templo quando o HP estiver abaixo de 0) e proteção de loot para níveis baixos: --// SCRIPT ANTIGO TFS 0.3.6 local Arena = { frompos = {x=1173,y=1390,z=7}, topos = {x=1250,y=1422,z=7} } local TemploArenas = {x=1429, y=1242, z=7, stackpos=1} function onStatsChange(cid, attacker, type, combat, value) if isInRange(getCreaturePosition(cid), Arena.frompos, Arena.topos) then if type == 1 then if getCreatureHealth(cid) <= value then if isPlayer(cid) then doSendMagicEffect(TemploArenas, 10) doTeleportThing(cid, TemploArenas, true) doCreatureAddHealth(cid, getCreatureMaxHealth(cid), true) if isPlayer(attacker) then doPlayerSetPzLocked(attacker, true) end end return false end end end if isPlayer(cid) and type == 1 and getCreatureHealth(cid) <= value then if getPlayerLevel(cid) <= 100 then if (getCreatureSkullType(cid) ~= SKULL_RED) and (getCreatureSkullType(cid) ~= SKULL_BLACK) then doCreatureSetDropLoot(cid, false) end end end return true end --// SCRIPT NOVO PARA TFS 1.1 local Arena = { frompos = {x=1173,y=1390,z=7}, topos = {x=1250,y=1422,z=7} } local TemploArenas = Position(1429, 1242, 7) --// config as Position object --// acertar na mana não pode matar o jogador, apenas acertar no HP, então não precisamos do evento onManaChange function onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin) local player = Player(creature) if player then --// não nulo = é um jogador, não um monstro/npc if isInRange(player:getPosition(), Arena.frompos, Arena.topos) then if primaryDamage < 0 then --// é ataque, não cura --// se o primário estiver abaixo de 0, o secundário também estará abaixo de 0 local totalDamage = -(primaryDamage + secondaryDamage) --// somar o dano e alterá-lo para um número positivo if player:getHealth() <= totalDamage then --// doSendMagicEffect(TemploArenas, 10) TemploArenas:sendMagicEffect(10) --// doTeleportThing(cid, TemploArenas, true) player:teleportTo(TemploArenas, true) --// doCreatureAddHealth(cid, getCreatureMaxHealth(cid), true) player:addHealth(player:getMaxHealth() - player:getHealth()) local attackerPlayer = Player(attacker) if attackerPlayer then --//doPlayerSetPzLocked(attacker, true --// WTF, não há função para definir o bloqueio PZ no TFS 1.1 (e 1.2)! --// Bug reportado: https://github.com/otland/forgottenserver/issues/1874 end --// return false - old code to block dmg primaryDamage = 0 secondaryDamage = 0 end end end if primaryDamage < 0 then --// é ataque, não cura local totalDamage = -(primaryDamage + secondaryDamage) --// somar o dano e alterá-lo para um número positivo if player:getHealth() <= totalDamage then if player:getLevel() <= 100 then if player:getSkull() ~= SKULL_RED) and player:getSkull() ~= SKULL_BLACK then --// doCreatureSetDropLoot(cid, false) player:setDropLoot(false) end end end end end return true end Créditos: Gesior.pl 1 Link para o comentário https://tibiadevs.com/forums/topic/165-lua-como-migrar-scripts-do-tfs-0x-para-o-tfs-1x/ Compartilhar em outros sites Mais opções de compartilhamento...
Administrador TELASKO 2.949 Postado 28 de Setembro 2023 Administrador Compartilhar Postado 28 de Setembro 2023 tu me acredita que eu tava querendo isso ? kk valeu dms ! 1 Link para o comentário https://tibiadevs.com/forums/topic/165-lua-como-migrar-scripts-do-tfs-0x-para-o-tfs-1x/#findComment-696 Compartilhar em outros sites Mais opções de compartilhamento...
Posts Recomendados
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora