Ir para conteúdo

[Encerrado] [Pedido] Comando !fly


FlamesAdmin

Posts Recomendados

Infelizmente, não encontrei uma maneira funcional de o jogador continuar andando "infinitamente". As que encontrei, geravam algum tipo de bug (travavam o servidor e etc). Para evitar tais erros, fiz assim: após x segundos (configuráveis, claro), o jogador "se cansa". Ou seja, o comando !fly é desativado. Espero que mesmo assim o código lhe satisfaça.

PS: Como informado no script, não coloque valores muito altos nos segundos, pois o servidor pode travar.

 

local cfg = {
    storage = 918311,
    fly_storage = 17000,
    seconds = 20,       --Quantos segundos até o jogador "cansar". Recomendo não colocar um valor muito alto.
}
function isWalkable(pos)-- by Nord / editado por Omega
    if isCreature(getTopCreature(pos).uid) then
        return false
    elseif getTileInfo(pos).protection then
        return false
    else
        if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid ~= 0 then 
            if hasProperty(getThingFromPos(pos).uid, 3) or hasProperty(getThingFromPos(pos).uid, 7) then
                return false
            end
        end
    end
return true
end
function autoWalk(cid, id)
local a = 0
    for i = 1, (cfg.seconds * 2) do
        if getPlayerStorageValue(cid, cfg.storage) < 1 then
            break
        end
        if a == (cfg.seconds * 2) then
            setPlayerStorageValue(cid, cfg.storage, -1)
            doPlayerSendTextMessage(cid, 27, "Your character is exausted.") 
            doCreatureSay(cid, "*Puff*", TALKTYPE_MONSTER)
            break
        end
        addEvent(function()
            if not isCreature(cid) then 
                if id then
                    return db.executeQuery("UPDATE player_storage SET value = -1 WHERE key = 918311 AND player_id = "..id)
                end
            end
            local tab = {
                [0] = {x = getThingPos(cid).x, y = getThingPos(cid).y - 1, z = getThingPos(cid).z},
                [1] = {x = getThingPos(cid).x + 1, y = getThingPos(cid).y, z = getThingPos(cid).z},
                [2] = {x = getThingPos(cid).x, y = getThingPos(cid).y + 1, z = getThingPos(cid).z},
                [3] = {x = getThingPos(cid).x - 1, y = getThingPos(cid).y, z = getThingPos(cid).z},
            }
            local lookdir = getCreatureLookDir(cid)
            local topos = tab[lookdir]
            if getPlayerStorageValue(cid, cfg.storage) < 1 then
                return true
            elseif isWalkable(topos) then
                if getTileThingByPos({x = topos.x, y = topos.y, z = topos.z, stackpos = 0}).itemid == 0 then
                    doCombatAreaHealth(cid, 0, topos, 0, 0, 0, CONST_ME_NONE)
                    doCreateItem(11676, 1, topos)
                end
                doTeleportThing(cid, topos)
                a = a + 1
            else
                setPlayerStorageValue(cid, cfg.storage, -1)
                doPlayerSendTextMessage(cid, 27, "Há algum objeto à sua frente impedindo a passagem.")
                return true
            end
        end, i * 500)
    end
end
function onSay(cid, words)
    if getPlayerStorageValue(cid, cfg.fly_storage) < 1 then
        return doPlayerSendCancel(cid, "Para usar este comando, você deve estar em Fly.")
    elseif getPlayerStorageValue(cid, cfg.storage) >= 1 then
        return setPlayerStorageValue(cid, cfg.storage, -1) and doPlayerSendTextMessage(cid, 27, "Comando !fly desativado.")
    else
        doPlayerSendTextMessage(cid, 27, "Comando !fly ativado.")
        setPlayerStorageValue(cid, cfg.storage, 1)
        autoWalk(cid, getPlayerGUID(cid))
    end
    return true
end
Editado por zipter98
Link para o comentário
Compartilhar em outros sites

Vlw mano, ta bom desse jeito msm.

Você já atingiu seu limite de reputações positivas para hoje

Jaja te dou Rep.

 

--EDIT--

Só tem um probleminha, qnd eu dou !fly no andar acima, aparece isso:

23:59 Comando !fly ativado.
23:00 Há algum objeto à sua frente impedindo a passagem.

E tipo, teria como vc por pra qnd usar !fly, ficar com uma velocidade um pouco mais alta ?

Editado por FlamesAdmin
Link para o comentário
Compartilhar em outros sites

Sobre o primeiro caso, é porquê não é possível andar normalmente em pisos "vazios" (no caso do Fly, o "ar"). Como, no código, para teleportar o jogador é necessário que o piso seja "andável", retorna ao jogador esta mensagem, pelo motivo que citei. Como corrigir, é algo que vou pensar.

Sobre o segundo, logo edito o código com isso.

#EDIT: Primeiro erro, corrigido. Código alterado.

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

@Zipter98

 

Aqui não da pra usar o comando quando estiver no chão, só quando no ar, e quando ta no ar, fica dando esses erros sem parar:

 

 

 

[16/02/2014 17:47:59] [Error - TalkAction Interface] 
[16/02/2014 17:47:59] In a timer event called from: 
[16/02/2014 17:47:59] data/talkactions/scripts/fly.lua:onSay
[16/02/2014 17:47:59] Description: 
[16/02/2014 17:47:59] (luaHasItemProperty) Item not found
 
[16/02/2014 17:48:00] [Error - TalkAction Interface] 
[16/02/2014 17:48:00] In a timer event called from: 
[16/02/2014 17:48:00] data/talkactions/scripts/fly.lua:onSay
[16/02/2014 17:48:00] Description: 
[16/02/2014 17:48:00] (luaHasItemProperty) Item not found
 
[16/02/2014 17:48:00] [Error - TalkAction Interface] 
[16/02/2014 17:48:00] In a timer event called from: 
[16/02/2014 17:48:00] data/talkactions/scripts/fly.lua:onSay
[16/02/2014 17:48:00] Description: 
[16/02/2014 17:48:00] (luaHasItemProperty) Item not found

Link para o comentário
Compartilhar em outros sites

Infelizmente, não sei o quê pode estar causando o primeiro erro com você (o de não poder usar o comando no chão). Pelo menos aqui, está funcionando perfeitamente.

Sobre o segundo erro, foi falta de atenção minha. Corrigi ele e mais um "erro". Código alterado.

PS: Sobre o pedido de aumentar a velocidade neste comando, acontece o seguinte: na verdade, o jogador se teleporta, e não "anda", como parece na prática. E o intervalo de tempo entre estes teleportes é de 500 milésimos. Ou seja, a velocidade do jogador de nada altera nisto. Tanto um jogador com slow que anula 90% de sua velocidade, quanto um jogador com o triplo de sua real velocidade "voariam" na mesma velocidade.

Porém, se você quiser mesmo que a velocidade seja aumentada, pode ser feita um cálculo com a speed do jogador para altear o intervalo de tempo.

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

Infelizmente, não sei o quê pode estar causando o primeiro erro com você (o de não poder usar o comando no chão). Pelo menos aqui, está funcionando perfeitamente.

Sobre o segundo erro, foi falta de atenção minha. Corrigi ele e mais um "erro". Código alterado.

PS: Sobre o pedido de aumentar a velocidade neste comando, acontece o seguinte: na verdade, o jogador se teleporta, e não "anda", como parece na prática. E o intervalo de tempo entre estes teleportes é de 500 milésimos. Ou seja, a velocidade do jogador de nada altera nisto. Tanto um jogador com slow que anula 90% de sua velocidade, quanto um jogador com o triplo de sua real velocidade "voariam" na mesma velocidade.

Porém, se você quiser mesmo que a velocidade seja aumentada, pode ser feita um cálculo com a speed do jogador para altear o intervalo de tempo.

Bah, entao deixa sem esse bang de velocidade entao hehe. Ta pronto o código ?

Link para o comentário
Compartilhar em outros sites

  • 1 month later...
  • 4 years later...
A questão neste tópico de suporte foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Suporte - Tópicos Sem Resposta.

+ Caso a dúvida não tenha sido resolvida você poderá criar outro tópico solicitando ajuda.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado.
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...