Ir para conteúdo
  • 0

Descobrir o "uid" de um certo item que o player possui


Mazynho

Pergunta

Galera como que faço para descobrir o "uid" de um certo item que o player possui.

Ex:

QntItem = getPlayerItemCount(cid, itemID_X)

 

Digamos que o player possua o itemID_X que coloquei no método.

Por exemplo o retorno dessa função foi 3, então preciso saber o "uid" desses 3 itens, pois em outra função ele precisa do "uid" do item.

 

Lembrando que este "uid" não é o unique id que coloco em algum item do mapa e sim o código que é gerado, não sei como, dos itens players e etc.

 

Se puderem min dizer como esse código é gerado também será de grande valia.

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

não entendi direito mais creio que essa duvida seja pq vc quer usar uma função e não sabe chamar o item por uid

 

vou te dar um exemplo com a função doRemoveItem(uid, pos)

 

uid = item

pos = posição

 

você pode definir o item(uid) numa variável e chamar a variável na função , exemplo :

local item1 = getTileItemById({x = 1, y = 2, z = 3}, 1015)

if item1.uid > 0 then
  return doRemoveItem(item1.uid, 1)
end

no caso a função vai removeur um item(uid) que está na posição X.

 

ou

function onUse(cid, item, fromPosition, itemEx, toPosition)

na função contém os valores de armazenamento do item e do itemEx

 

item = item que o player está usando

itemEx = item(local) onde o player está usando o item

 

no caso você define os valores na variável, ou no caso do item você define na própria tag

doRemoveItem(item.uid, 1) -- vai remover o item que o player "usou" .
doRemoveItem(itemEx.uid, 1) -- vai remover o itemEx .

Abraços .

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

  • 0

se ele uso getPlayerItemCount ele deve ta querendo pegar os uids da bag do player...

 

achu q oq ele quer eh essa funçao...

 

function getItemsInContainerById(container, itemid) -- Function By Kydrai
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
   for slot=0, (getContainerSize(container)-1) do
       local item = getContainerItem(container, slot)
       if isContainer(item.uid) then
          local itemsbag = getItemsInContainerById(item.uid, itemid)
          for i=0, #itemsbag do
              table.insert(items, itemsbag[i])
          end
       else
          if itemid == item.itemid then
             table.insert(items, item.uid)
          end
       end
   end
end
return items
end

 

exemplo de uso:

 

local uids = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
for _, uid in ipairs(uids) do
   doRemoveItem(uid, 1)
end

 

nesse caso vai remover todos os itens com o 'itemid' do player...

Link para o comentário
Compartilhar em outros sites

  • 0

não entendi direito mais creio que essa duvida seja pq vc quer usar uma função e não sabe chamar o item por uid

 

vou te dar um exemplo com a função doRemoveItem(uid, pos)

 

uid = item

pos = posição

 

você pode definir o item(uid) numa variável e chamar a variável na função , exemplo :

local item1 = getTileItemById({x = 1, y = 2, z = 3}, 1015)

if item1.uid > 0 then
  return doRemoveItem(item1.uid, 1)
end

no caso a função vai removeur um item(uid) que está na posição X.

 

ou

function onUse(cid, item, fromPosition, itemEx, toPosition)

na função contém os valores de armazenamento do item e do itemEx

 

item = item que o player está usando

itemEx = item(local) onde o player está usando o item

 

no caso você define os valores na variável, ou no caso do item você define na própria tag

doRemoveItem(item.uid, 1) -- vai remover o item que o player "usou" .
doRemoveItem(itemEx.uid, 1) -- vai remover o itemEx .

Abraços .

 

Valeu pela ajuda, mas não é isso, da forma que você disse sei como pegar o uid do item, mas quero pegar o uid de um item que o player possua.

Como tinha dito com a função getPlayerItemCount que irá retornar a quantidade de um item X, sabendo da quantidade iria fazer um for e pegar o uid de cada item.

 

Apenas ressaltando o player não irá clicar em algo ou o item estará em uma pos no mapa, ele está na bp/slots do player

se ele uso getPlayerItemCount ele deve ta querendo pegar os uids da bag do player...

 

achu q oq ele quer eh essa funçao...

function getItemsInContainerById(container, itemid) -- Function By Kydrai
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
   for slot=0, (getContainerSize(container)-1) do
       local item = getContainerItem(container, slot)
       if isContainer(item.uid) then
          local itemsbag = getItemsInContainerById(item.uid, itemid)
          for i=0, #itemsbag do
              table.insert(items, itemsbag[i])
          end
       else
          if itemid == item.itemid then
             table.insert(items, item.uid)
          end
       end
   end
end
return items
end

exemplo de uso:

local uids = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
for _, uid in ipairs(uids) do
   doRemoveItem(uid, 1)
end

nesse caso vai remover todos os itens com o 'itemid' do player...

 

É isso mesmo que estou querendo. Muito Obrigado!

 

Agora você pode fazer uma adaptação para verificar em todo o player, digo nos demais slots, pois pelo que entendi ele só irá verificar os itens que estão na BP.

Link para o comentário
Compartilhar em outros sites

  • 0

 

 

function getItemsInContainerById(container, itemid) -- Function By Kydrai
   local items = {}
   if isContainer(container) and getContainerSize(container) > 0 then
      for slot=0, (getContainerSize(container)-1) do
         local item = getContainerItem(container, slot)
         if isContainer(item.uid) then
            local itemsbag = getItemsInContainerById(item.uid, itemid)
            for i = 0, #itemsbag do
               table.insert(items, itemsbag[i])
            end
         else
            if itemid == item.itemid then
               table.insert(items, item.uid)
            end
         end
      end
   end
   return items
end

function getPlayerItemsById(cid, itemid)
   if not isCreature(cid) or type(itemid) ~= "number" then return {} end
   local items = {}
   for i = 1, 10 do --passar por todos os slots
      local item = getPlayerSlotItem(cid, i)  
      if i == 3 then --slot da bag
         local itemsbag = getItemsInContainerById(item.uid, itemid)
         for _, itemBag in ipairs(itemsbag) do
            table.insert(items, itemBag)
         end
      else
         if item.itemid == itemid then
            table.insert(items, item.uid)
         end
      end
   end
   return items
end

 

bota essas duas funçoes na tua lib e dai usa a 2* pra pegar os itens...

 

exemplo:

local uids = getPlayerItemsById(cid, itemid)
for _, uid in ipairs(uids) do
   doRemoveItem(uid, 1)
end

 

soh uma duvida... vais usar essas funçoes para procurar por bags? se for, vai ter q alterar elas um bucadin... ;p

Link para o comentário
Compartilhar em outros sites

  • 0

 

 

function getItemsInContainerById(container, itemid) -- Function By Kydrai
   local items = {}
   if isContainer(container) and getContainerSize(container) > 0 then
      for slot=0, (getContainerSize(container)-1) do
         local item = getContainerItem(container, slot)
         if isContainer(item.uid) then
            local itemsbag = getItemsInContainerById(item.uid, itemid)
            for i = 0, #itemsbag do
               table.insert(items, itemsbag[i])
            end
         else
            if itemid == item.itemid then
               table.insert(items, item.uid)
            end
         end
      end
   end
   return items
end

function getPlayerItemsById(cid, itemid)
   if not isCreature(cid) or type(itemid) ~= "number" then return {} end
   local items = {}
   for i = 1, 10 do --passar por todos os slots
      local item = getPlayerSlotItem(cid, i)  
      if i == 3 then --slot da bag
         local itemsbag = getItemsInContainerById(item.uid, itemid)
         for _, itemBag in ipairs(itemsbag) do
            table.insert(items, itemBag)
         end
      else
         if item.itemid == itemid then
            table.insert(items, item.uid)
         end
      end
   end
   return items
end

 

bota essas duas funçoes na tua lib e dai usa a 2* pra pegar os itens...

 

exemplo:

local uids = getPlayerItemsById(cid, itemid)
for _, uid in ipairs(uids) do
   doRemoveItem(uid, 1)
end

soh uma duvida... vais usar essas funçoes para procurar por bags? se for, vai ter q alterar elas um bucadin... ;p

 

É queria que ele verificasse se tem o item em todas as bps e slots do player.

Link para o comentário
Compartilhar em outros sites

  • 0

isso ela vai fazer... oq to perguntando eh se tu vai procurar por BPs usando as funçoes? -como itemid- pq a funçao vai entrando nas bps do player mas n olha o id delas... dai se for procurar por bps tem q editar a funçao pra verificar o id das bps antes de 'entrar' nelas para procurar pelo item...

Link para o comentário
Compartilhar em outros sites

  • 0

isso ela vai fazer... oq to perguntando eh se tu vai procurar por BPs usando as funçoes? -como itemid- pq a funçao vai entrando nas bps do player mas n olha o id delas... dai se for procurar por bps tem q editar a funçao pra verificar o id das bps antes de 'entrar' nelas para procurar pelo item...

 

Não, o que estou procurando não é uma bp.

 

Obrigado.

 

Agora uma duvida estou verificando com 3 itens, e estou colocando para exibir os uid's e todos os 3 ganham o mesmo uid então como faço para diferencia-los?

Link para o comentário
Compartilhar em outros sites

  • 0

n intendi muito bem oq tu quis dizer... tas tentando verificar varios ids ao ms tempo?

 

Não, estou verificando apenas um item. No player que estou verificando ele possui uma quantia equivalente a 3 unidades desse item, o problema que estou tendo é que utilizo essa função para pegar o uid desses 3 itens, e ele min retorna uma tabela com 3 elementos. Ex: {4395, 4395, 4395}, ou seja está min retornando um mesmo uid para os 3 itens, então queria saber como faço para obter um código uid diferente para cada um desses 3?

Link para o comentário
Compartilhar em outros sites

  • 0

engraçado.. fiz varios testes aki e todos retornaram UIDs diferentes... como q tas fazendo pra printar o resultado da tabela? e tpw, ele vai retornar soh o uid de itens distintos...

por exemplo:

tenhu 3 pizzas stackadas na minha bp... vai retornar 1 uid soh...

tenhu 3 pizzas na minha bp mas elas tao sepadas, cada uma com 1 stack, vai retornar 3 uids...

Link para o comentário
Compartilhar em outros sites

  • 0

engraçado.. fiz varios testes aki e todos retornaram UIDs diferentes... como q tas fazendo pra printar o resultado da tabela? e tpw, ele vai retornar soh o uid de itens distintos...

por exemplo:

tenhu 3 pizzas stackadas na minha bp... vai retornar 1 uid soh...

tenhu 3 pizzas na minha bp mas elas tao sepadas, cada uma com 1 stack, vai retornar 3 uids...

 

 

Mas o item que estou testando não é agrupável, e ele retorna uma tabela com 3 uids iguais.

 

Estou colocando para exibir com um for:

local msg = ""

for X = 1, #uids do

msg = msg ..", ".. uids[X]

end

 

ai coloco para exibir essa msg para o player.

 

Da uma olhada nesse meu post aqui: http://www.xtibia.com/forum/topic/228906-projeto-tutores-de-scripting/?p=1639134

 

Estou modificando meu script para ficar mais facil, mas se puder ajudar nesse também agradeço.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...