Ir para conteúdo
Propaganda

Posts Recomendados

  • Administrador

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

  • Thanks 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

  • Administrador

tu me acredita que eu tava querendo isso ? kk valeu dms !

  • Like 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

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 conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
  • Criar Novo...