SK
tfs 0.3.6

Alguma função

Por Skymagnum, 06 de mai. de 2016 em Scripts

11
3.3k
SkymagnumS
06 de maio de 2016 às 15:16

Bom dia eu estava afastado de Tibia, e resolvi voltar e fazer um script, porém eu não me recordo da função que pega os itens que tem no tile, então eu queria saber se alguém ai se lembra da função que pegaria um item que esta no tile(eu não sei o id do item, pq é aleatorio, só queria pegar aquele item lá)

	local positions = {		{x = 1052, y = 1056, z = 7},		{x = 1052, y = 1057, z = 7},		{x = 1052, y = 1058, z = 7},		{x = 1052, y = 1059, z = 7},		{x = 1052, y = 1060, z = 7},		{x = 1052, y = 1051, z = 7}	}		local rep = math.random(1, 20)	local count = 1	local cc = 1	local lastPos = nil		for i = 1, rep do		addEvent(doSendMagicEffect, count * 150, positions[cc], 6)		count = count + 1		cc = cc + 1		if cc > #positions then			cc = 1		end		lastPos = positions[cc]	end		local getItem = aqui iria a função que vai pegar o item da lastPos

 

PoccnnP
06 de maio de 2016 às 15:34

getTileItemById (pos, itemid)

dalvorsnD
06 de maio de 2016 às 16:25
local info = getTileInfo(pos)info.things -- todos os things( items + creatures )info.items -- todos os itemsinfo.creatures -- creatures no tileinfo.topItems info.downItems

Sem o id e sem o stackpos o melhor que da pra fazer é puxar a lista de todos no tile

 

 

Caso voce saiba o stack pos, tu pode usar esse aqui:

getThingFromPosition(pos)

Editado Maio 6 por dalvorsn

SlicerS
06 de maio de 2016 às 18:37
2 horas atrás, dalvorsn disse:
local info = getTileInfo(pos)info.things -- todos os things( items + creatures )info.items -- todos os itemsinfo.creatures -- creatures no tileinfo.topItems info.downItems

Sem o id e sem o stackpos o melhor que da pra fazer é puxar a lista de todos no tile

 

 

Caso voce saiba o stack pos, tu pode usar esse aqui:

getThingFromPosition(pos)

 

setField(L, "things", tile->getThingCount());setField(L, "creatures", tile->getCreatureCount());setField(L, "items", tile->getItemCount());setField(L, "topItems", tile->getTopItemCount());setField(L, "downItems", tile->getDownItemCount());

 

acho que soh retorna a qntdade heim... o.O

dalvorsnD
06 de maio de 2016 às 18:41
1 minute ago, nogenem45 said:

 

setField(L, "things", tile->getThingCount());setField(L, "creatures", tile->getCreatureCount());setField(L, "items", tile->getItemCount());setField(L, "topItems", tile->getTopItemCount());setField(L, "downItems", tile->getDownItemCount());

 

acho que soh retorna a qntdade heim... o.O

Sim, mas a ordem dele é baseada na quantidade, o stack é diretamente o numero de things.

Aqueles 255 253 são apenas padrões pra função lua buscar, o item não está de fato no stack 255, ele ta la no inicio

se tu fizer um loop com stack variando ate a quantidade do things, tu pega todos os things do tile

só nao me recordo se ele começa de 0 ou de 1

SlicerS
06 de maio de 2016 às 18:54

/\ algu assim?

local function getItemInPos(pos)   local info = getTileInfo(pos)   local p = {x=pos.x, y=pos.y, z=pos.z}      for i = info.things, 1, -1 do      p.stackpos = i      local item = getTileThingByPos(p)      if item.itemid > 0 and not isCreature(item.uid) then         return item      end   end   return {itemid = 0, uid = 0}endlocal positions = {  {x = 1052, y = 1056, z = 7},  {x = 1052, y = 1057, z = 7},  {x = 1052, y = 1058, z = 7},  {x = 1052, y = 1059, z = 7},  {x = 1052, y = 1060, z = 7},  {x = 1052, y = 1051, z = 7}}local lastPos = nilfor i = 0, math.random(0, 19) do   lastPos = positions[(i%#positions)+1]     addEvent(doSendMagicEffect, i*150, lastPos, 6)   endlocal item = getItemInPos(lastPos)--agora podes usar item.itemid e item.uid

 

Editado Maio 6 por nogenem45

dalvorsnD
06 de maio de 2016 às 19:09
15 minutes ago, nogenem45 said:

/\ algu assim?

local function getItemInPos(pos)   local info = getTileInfo(pos)   local p = {x=pos.x, y=pos.y, z=pos.z}      for i = info.things, 1, -1 do      p.stackpos = i      local item = getTileThingByPos(p)      if item.itemid > 0 and not isCreature(item.uid) then         return item      end   end   return {itemid = 0, uid = 0}endlocal positions = {  {x = 1052, y = 1056, z = 7},  {x = 1052, y = 1057, z = 7},  {x = 1052, y = 1058, z = 7},  {x = 1052, y = 1059, z = 7},  {x = 1052, y = 1060, z = 7},  {x = 1052, y = 1051, z = 7}}local lastPos = nilfor i = 0, math.random(0, 19) do   lastPos = positions[(i%#positions)+1]     addEvent(doSendMagicEffect, i*150, lastPos, 6)   endlocal item = getItemInPos(lastPos)--agora podes usar item.itemid e item.uid

 

Yep, mas podem haver mais items, nesse caso tem que ver o que ele precisa, como ele vai identificar qual item certo. O que tu fez retornaria sempre apenas um item, o primeiro mais acima.

@Skymagnum Qual o metodo de identificação do item correto? Ou basta ser o topitem?

Editado Maio 6 por dalvorsn

SlicerS
06 de maio de 2016 às 19:12

/\ eh fiquei nessa duvida tb, tem hora q ele fla 'os items' e tem hora q ele fla 'o item'... tava esperando ele flar algu ;p

SkymagnumS
07 de maio de 2016 às 00:02

Desculpem a demora, só vai haver um item no tile, é tipo uma "roleta" vai sair soltando os effects e parar em uma posição e dar o item que tiver nela para o jogador.

 

-- essa do @nogenem45 vai me servir, muito obrigado aos 2

Editado Maio 7 por Skymagnum

Night WolfN
07 de maio de 2016 às 04:42

posso dar uma opinião? se vc vai usar roleta então provavelmente os itens são muito bem definidos, vc pode usar getTileItemById (pos, itemid) q nem o @Poccnn bem colocou.
Pra mim é a função mais "confiável" de se usar, as outras vc vai ter que ficar checando possiveis bugs e falhas no sistema o tempo todo e isso acaba sendo mais pesado pro número de execuções do que a própria definição da função via source. Qualquer dúvida tamo aí

SkymagnumS
07 de maio de 2016 às 13:24
8 horas atrás, Night Wolf disse:

posso dar uma opinião? se vc vai usar roleta então provavelmente os itens são muito bem definidos, vc pode usar getTileItemById (pos, itemid) q nem o @Poccnn bem colocou.

Pra mim é a função mais "confiável" de se usar, as outras vc vai ter que ficar checando possiveis bugs e falhas no sistema o tempo todo e isso acaba sendo mais pesado pro número de execuções do que a própria definição da função via source. Qualquer dúvida tamo aí

Sim pensei em colocar todos os itens em um array e checar se eles estão lá, vou ver qual fica melhor.

Editado Maio 7 por Skymagnum