Ir para conteúdo
  • Cadastre-se

(Resolvido)Verificar posição de um player


Ir para solução Resolvido por Storm,

Posts Recomendados

Olá galera do TibiaKing, venho aqui pedir a vocês que me ajudem em um scripting de verificar a posição de um Player, vou resumir abaixo.

 

 

Eu quero que o script cheque se tem um player ao redor do Player que executou x ação (qualquer ação), exemplo:

 

If playerpos.x=x-1 then

executar ação

end

 

Ele deveria checar se tem 1 Player na posx -1, mas não sei muito bem como funciona os checkin de Position

 

Link para o post
Compartilhar em outros sites

@Joaovettor 

function checkPlayersAround(uid)
    local players = {} -- Deixe vazio
    local pos = getCreaturePosition(uid)
    local positions = { 
        [1] = {x = pos.x -1, y = pos.y, z = pos.z},
        [2] = {x = pos.x +1, y = pos.y, z = pos.z},
        [3] = {x = pos.x, y = pos.y +1, z = pos.z},
        [4] = {x = pos.x, y = pos.y -1, z = pos.z}
        
    }
    for _, var in pairs(positions) do
        for i = 0, 255 do
            var.stackpos = i
            tile = getTileThingByPos(var)
            if tile.uid > 0 and isPlayer(tile.uid) then
                table.insert(players, tile.uid)
            end
        end
    end
    if not players then return false end 
    return players
end

 

Link para o post
Compartilhar em outros sites
33 minutos atrás, Storm disse:

@Joaovettor 


function checkPlayersAround(uid)
    local players = {} -- Deixe vazio
    local pos = getCreaturePosition(uid)
    local positions = { 
        [1] = {x = pos.x -1, y = pos.y, z = pos.z},
        [2] = {x = pos.x +1, y = pos.y, z = pos.z},
        [3] = {x = pos.x, y = pos.y +1, z = pos.z},
        [4] = {x = pos.x, y = pos.y -1, z = pos.z}
        
    }
    for _, var in pairs(positions) do
        for i = 0, 255 do
            var.stackpos = i
            tile = getTileThingByPos(var)
            if tile.uid > 0 and isPlayer(tile.uid) then
                table.insert(players, tile.uid)
            end
        end
    end
    if not players then return false end 
    return players
end

 


Script show! Mas em minha opinião, caso esteja aberto para sugestões claro: uma boa prática seria invés de você colocar para retornar um booleano falso (please, sem one-line) seria você colocar para retornar uma tabela vazia - manter um padrão! Se o script retorna uma tabela, então retorna uma tabela vazia, caso não tenha nenhum valor.

discord.pngDiscord: vankk #7765

Precisando de ajuda? Entre em contato comigo via Discord.

 

Muitos vêm seus muitos dias de glória, mas poucos vêm seus muitos dias de luta.

Link para o post
Compartilhar em outros sites
2 horas atrás, Storm disse:

@Joaovettor 


function checkPlayersAround(uid)
    local players = {} -- Deixe vazio
    local pos = getCreaturePosition(uid)
    local positions = { 
        [1] = {x = pos.x -1, y = pos.y, z = pos.z},
        [2] = {x = pos.x +1, y = pos.y, z = pos.z},
        [3] = {x = pos.x, y = pos.y +1, z = pos.z},
        [4] = {x = pos.x, y = pos.y -1, z = pos.z}
        
    }
    for _, var in pairs(positions) do
        for i = 0, 255 do
            var.stackpos = i
            tile = getTileThingByPos(var)
            if tile.uid > 0 and isPlayer(tile.uid) then
                table.insert(players, tile.uid)
            end
        end
    end
    if not players then return false end 
    return players
end

 

 

Opa mano, obrigado pela ajuda, mas deu esse seguinte erro V

 

[29/1/2019 13:37:54] [Error - Action Interface] 
[29/1/2019 13:37:54] data/actions/scripts/testeitem.lua:onUse
[29/1/2019 13:37:54] Description: 
[29/1/2019 13:37:54] data/actions/scripts/testeitem.lua:5: attempt to index a boolean value
[29/1/2019 13:37:54] stack traceback:
[29/1/2019 13:37:54]     data/actions/scripts/testeitem.lua:5: in function 'checkPlayersAround'
[29/1/2019 13:37:54]     data/actions/scripts/testeitem.lua:27: in function <data/actions/scripts/testeitem.lua:26>

Eu deixei o script dessa maneira V

 

function checkPlayersAround(uid)
    local players = {} -- Deixe vazio
    local pos = getCreaturePosition(uid)
    local positions = { 
        [1] = {x = pos.x -1, y = pos.y, z = pos.z},
        [2] = {x = pos.x +1, y = pos.y, z = pos.z},
        [3] = {x = pos.x, y = pos.y +1, z = pos.z},
        [4] = {x = pos.x, y = pos.y -1, z = pos.z}
        
    }
    for _, var in pairs(positions) do
        for i = 0, 255 do
            var.stackpos = i
            tile = getTileThingByPos(var)
            if tile.uid > 0 and isPlayer(tile.uid) then
                table.insert(players, tile.uid)
            end
        end
    end
    if not players then return false end 
    return players
end



function onUse(cid, item, frompos, item2, topos)
if checkPlayersAround(uid) then
doSendMagicEffect(getCreaturePos(cid), 17)
end
return true
end

 

Link para o post
Compartilhar em outros sites

@vankk Obrigado pela dica!! 

@Joaovettor 

function checkPlayersAround(uid)
    local players = {} -- Deixe vazio
    local pos = getCreaturePosition(uid)
    local positions = { 
        [1] = {x = pos.x -1, y = pos.y, z = pos.z},
        [2] = {x = pos.x +1, y = pos.y, z = pos.z},
        [3] = {x = pos.x, y = pos.y +1, z = pos.z},
        [4] = {x = pos.x, y = pos.y -1, z = pos.z}
        
    }
    for _, var in pairs(positions) do
        for i = 0, 255 do
            var.stackpos = i
            tile = getTileThingByPos(var)
            if tile.uid > 0 and isPlayer(tile.uid) then
                table.insert(players, tile.uid)
            end
        end
    end
    return players
end

function onUse(cid, item, frompos, item2, topos)
    if checkPlayersAround(cid) then
        doSendMagicEffect(getCreaturePosition(cid), 17)
    end
    return true
end

 

Link para o post
Compartilhar em outros sites
7 horas atrás, Storm disse:

@vankk Obrigado pela dica!! 

@Joaovettor 


function checkPlayersAround(uid)
    local players = {} -- Deixe vazio
    local pos = getCreaturePosition(uid)
    local positions = { 
        [1] = {x = pos.x -1, y = pos.y, z = pos.z},
        [2] = {x = pos.x +1, y = pos.y, z = pos.z},
        [3] = {x = pos.x, y = pos.y +1, z = pos.z},
        [4] = {x = pos.x, y = pos.y -1, z = pos.z}
        
    }
    for _, var in pairs(positions) do
        for i = 0, 255 do
            var.stackpos = i
            tile = getTileThingByPos(var)
            if tile.uid > 0 and isPlayer(tile.uid) then
                table.insert(players, tile.uid)
            end
        end
    end
    return players
end

function onUse(cid, item, frompos, item2, topos)
    if checkPlayersAround(cid) then
        doSendMagicEffect(getCreaturePosition(cid), 17)
    end
    return true
end

 

 

Opa amigo agora não está dando erro, porém ele executa a ação a todo momento, mesmo se não tiver players em volta de mim

Link para o post
Compartilhar em outros sites
  • Solução

@Joaovettor 

function checkPlayersAround(uid)
    local players = {} -- Deixe vazio
    local pos = getCreaturePosition(uid)
    local positions = { 
        [1] = {x = pos.x -1, y = pos.y, z = pos.z},
        [2] = {x = pos.x +1, y = pos.y, z = pos.z},
        [3] = {x = pos.x, y = pos.y +1, z = pos.z},
        [4] = {x = pos.x, y = pos.y -1, z = pos.z}
        
    }
    for _, var in pairs(positions) do
        for i = 0, 255 do
            var.stackpos = i
            tile = getTileThingByPos(var)
            if tile.uid > 0 and isPlayer(tile.uid) then
                table.insert(players, tile.uid)
            end
        end
    end
    return players
end

function onUse(cid, item, frompos, item2, topos)
    if table.maxn(checkPlayersAround(cid)) > 0 then
        doSendMagicEffect(getCreaturePosition(cid), 17)
    end
    return true
end

 

Link para o post
Compartilhar em outros sites
function onUse(cid, item, frompos, item2, topos)
local pos = getCreaturePosition(cid)
   local t = getSpectators(pos, 2, 2, false) -- area 2x2 em volta do player
            if t then
                for _, ret in ipairs(t) do
                    if isPlayer(ret) then
                        doSendMagicEffect(getCreaturePosition(ret), 17) -- vai sair um efeito para teste em quem tiver perto dele
                    end
                end
            end
    return true
end

 

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo