Faaaaala galerinha! A pedido do usuário PsyMcKenzie estou aqui para postar este tutorial. Espero que seja útil para todos que tem alguma dúvida quanto ao Stackpos. Eu sinceramente não domino completamente a magia dos stackpos, mas espero poder tirar algumas dúvidas de quem sabe e ensinar quem ainda não sabe. Vamos logo ao tutorial:
Stackpos
• Introdução
Stackpos é um dos index da tabela que guarda posições. Toda posição é uma tabela, exemplo: {x=160, y=50, z=7}, mas o que pouca gente sabe, é que o stackpos também faz parte desta tabela. Todos sabem que em uma unica posição podem haver vários itens, formando uma pilha de itens, portanto, para diferenciar a posição de um item da pilha para o outro foi criado o stackpos, que é o número que diz em qual lugar da pilha está o item.
• Descobrindo o Stackpos
O stackpos segue um padrão, ou seja, uma ordem. Vou mostrar primeiramente os stackpos especiais:
0 - O stackpos 0 de uma posição é sempre o tile, ou seja, o chão.
253 - Este número refere-se ao stackpos das criaturas que estão na posição, sejam monstros, players ou npcs.
255 - O item mais alto de um pilha tem o stackpos 255, além do stackpos normal dela.
Agora vou mostrar como descobrir o stackpos de um item apenas olhando para a pilha. Considere a seguinte pilha:
Primeiro vamos contar quantos itens tem a pilha. Neste caso, em um total de 4 itens (tile, table, chair, coin).
Tile sempre terá o stackpos 0.
Agora os outros recebem o stackpos contrário da ordem deles acima do chão.
Coin receberá o stackpos 1 e 255.
Chair receberá o stackpos 2.
Table receberá o stackpos 3.
Simples não? É sempre ao contrário da ordem deles acima do chão. Vamos a mais um exemplo para ficar bem claro, considere a seguinte pilha:
Tile receberá o stackpos 0.
Ring receberá o stackpos 1 e 255.
Hammer receberá o stackpos 2.
Coin receberá o stackpos 3.
Chair receberá o stackpos 4.
Table receberá o stackpos 5.
• Montando uma Tabela com Stackpos
Eu havia tido anteriormente que toda posição é uma tabela. Para montarmos uma posição com o index stackpos, simplesmente adicionamos ele no final, exemplo:
{x=160, y=50, z=7, stackpos=253}
Simples, não é mesmo?
• Funções Auxiliares
Sempre que preciso descobrir o stackpos através de um script, uso as seguintes funções:
Pegar o stackpos pela posição e id do item.
function getItemStackpos(position, id)
if getTileItemById(position, id).itemid == 0 then return nil end
for i = 0, 255 do
local pos = getThingFromPos({x=position.x, y=position.y, z=position.z, stackpos=i})
if pos.itemid == id then
return i
end
end
end
Para pegar o stackpos pelo uid do item, usamos a função getThingPos(uid), a qual já retorna uma tabela com o stackpos do item.
É isso galera, qualquer dúvida só perguntar. Até mais.