o tema despertou meu interesse, Vou ver o que posso fazer e então eu vou editar este post
Talkaction Verificando item X na data base
Por Mazynho, 09 de dez. de 2013 em Scripts
info
Grupo: Conde
Registrado: 16/09/07
Posts: 600
Reputação: +151
Gênero: Masculino
Char no Tibia: NãoJogoMais

Se não me engano, recentemente criaram este script, vou ver se acho aqui.
-edit-
Não achei o post exato, mas este script do nosso amigo, Jhon992, pode te ajudar.
function onSay(cid, words, param, channel)
if(param == '') then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.")
return true
end
local t = string.explode(param, ",")
local player = getPlayerByNameWildcard(tostring(t[1]))
local item_id = tonumber(t[2])
local quant = tonumber(t[3])
if(not isPlayer(player)) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player nao existe.")
return true
elseif (getPlayerItemCount(player, item_id) <= 0) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O player nao possui este item.")
return true
elseif (getPlayerItemCount(player, item_id) < quant) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O player nao possui essa quantidade de item.")
return true
end
doPlayerRemoveItem(player, item_id, quant)
return true
end
Lembre-se de usar o comando da seguinte maneira:
/removeitem nome_do_player, id_do_item, quantidade
Boa sorte.
Editado Dezembro 10 por Adriano Swatt
Adriano esse script funciona só para remover e não verifica e ele só funciona se o player estiver on, você poderia fazer um para verificar por meio da data base? (Como disse no primeiro post)
Editado Dezembro 10 por Mazynho
info
Grupo: Conde
Registrado: 16/09/07
Posts: 600
Reputação: +151
Gênero: Masculino
Char no Tibia: NãoJogoMais

Tem certeza disso?
Pois se não me engano estava dizendo no tópico que funcionava para players Offline.
Você testou?
info
Grupo: Marquês
Registrado: 16/06/07
Posts: 1.2k
Reputação: +377
Gênero: Masculino
Char no Tibia: Nenhum

Deu um trabalho, mas achei legal o comando. Mas dividi em 2:
- /itemlist itemid
- /itemcount playername, itemid
O primeiro retorna a lista de todos os jogadores que tem o item e o segundo retorna a quantidade que o jogador tem do item.
<talkaction words="/itemlist;/itemcount" access="5" event="script" value="itemlist.lua"/>
function onSay(cid, words, param)
if words == "/itemlist" then
local itemid = tonumber(param) or false
if not itemid then
return true
end
local query1 = db.getResult("SELECT name FROM players WHERE id IN (SELECT owner FROM houses WHERE id IN (SELECT house_id FROM tiles WHERE id IN (SELECT tile_id FROM tile_items WHERE itemtype = "..itemid..")))")
local str = " Players who have "..getItemNameById(itemid) .. "\n"
local list = {}
if query1:getID() > -1 then
repeat
local name = query1:getDataString("name")
table.insert(list, name)
until not query1:next()
end
query1:free()
local query2 = db.getResult("SELECT name FROM players WHERE id IN (SELECT player_id FROM player_items WHERE itemtype = "..itemid..")")
if query2:getID() > -1 then
repeat
local name = query2:getDataString("name")
if not isInArray(list, name) then
table.insert(list, name)
end
until not query2:next()
end
query2:free()
local query3 = db.getResult("SELECT name FROM players WHERE id IN (SELECT player_id FROM player_depotitems WHERE itemtype = "..itemid..")")
repeat
local name = query3:getDataString("name")
if not isInArray(list, name) then
table.insert(list, name)
end
until not query3:next()
query3:free()
if type(list) == "table" and #list == 0 then
return true
end
for _, name in ipairs(list) do
str = str.. '\n' .. name
end
doShowTextDialog(cid, itemid, str)
elseif words == "/itemcount" then
local param = string.explode(param, ',')
local playername = param[1]
local itemid = tonumber(param[2])
if not playername or not itemid then
doPlayerSendTextMessage(cid, 27, "Command syntax: /itemcount playername, itemid")
return true
end
local GUID = getPlayerGUIDByName(playername)
if not GUID then
doPlayerSendTextMessage(cid, 27, "Unable to retrieve info about that player.")
return true
end
local query1 = db.getResult("SELECT count FROM tile_items WHERE itemtype = "..itemid.." AND tile_id IN (SELECT id FROM tiles WHERE house_id = (SELECT id FROM houses WHERE owner = "..GUID.."))")
local query2 = db.getResult("SELECT count FROM player_items WHERE itemtype = "..itemid.." AND player_id = "..GUID)
local query3 = db.getResult("SELECT count FROM player_depotitems WHERE itemtype = "..itemid.." AND player_id = "..GUID)
local count = 0
if query1:getID() > -1 then
repeat
local count_ = query1:getDataInt("count")
count = count + count_
until not query1:next()
query1:free()
end
if query2:getID() > -1 then
repeat
local count_ = query2:getDataInt("count")
count = count + count_
until not query2:next()
query2:free()
end
if query3:getID() > -1 then
repeat
local count_ = query3:getDataInt("count")
count = count + count_
until not query3:next()
query3:free()
end
if count == 0 then
doPlayerSendTextMessage(cid, 27, "Player doesn't have the specified item.")
else
doPlayerSendTextMessage(cid, 27, playername.." has "..count.." "..getItemNameById(itemid)..".")
end
end
return true
end
Deu um trabalho, mas achei legal o comando. Mas dividi em 2:
- /itemlist itemid
- /itemcount playername, itemid
O primeiro retorna a lista de todos os jogadores que tem o item e o segundo retorna a quantidade que o jogador tem do item.
<talkaction words="/itemlist;/itemcount" access="5" event="script" value="itemlist.lua"/>
function onSay(cid, words, param) if words == "/itemlist" then local itemid = tonumber(param) or false if not itemid then return true end local query1 = db.getResult("SELECT name FROM players WHERE id IN (SELECT owner FROM houses WHERE id IN (SELECT house_id FROM tiles WHERE id IN (SELECT tile_id FROM tile_items WHERE itemtype = "..itemid..")))") local str = " Players who have "..getItemNameById(itemid) .. "\n" local list = {} if query1:getID() > -1 then repeat local name = query1:getDataString("name") table.insert(list, name) until not query1:next() end query1:free() local query2 = db.getResult("SELECT name FROM players WHERE id IN (SELECT player_id FROM player_items WHERE itemtype = "..itemid..")") if query2:getID() > -1 then repeat local name = query2:getDataString("name") if not isInArray(list, name) then table.insert(list, name) end until not query2:next() end query2:free() local query3 = db.getResult("SELECT name FROM players WHERE id IN (SELECT player_id FROM player_depotitems WHERE itemtype = "..itemid..")") repeat local name = query3:getDataString("name") if not isInArray(list, name) then table.insert(list, name) end until not query3:next() query3:free() if type(list) == "table" and #list == 0 then return true end for _, name in ipairs(list) do str = str.. '\n' .. name end doShowTextDialog(cid, itemid, str) elseif words == "/itemcount" then local param = string.explode(param, ',') local playername = param[1] local itemid = tonumber(param[2]) if not playername or not itemid then doPlayerSendTextMessage(cid, 27, "Command syntax: /itemcount playername, itemid") return true end local GUID = getPlayerGUIDByName(playername) if not GUID then doPlayerSendTextMessage(cid, 27, "Unable to retrieve info about that player.") return true end local query1 = db.getResult("SELECT count FROM tile_items WHERE itemtype = "..itemid.." AND tile_id IN (SELECT id FROM tiles WHERE house_id = (SELECT id FROM houses WHERE owner = "..GUID.."))") local query2 = db.getResult("SELECT count FROM player_items WHERE itemtype = "..itemid.." AND player_id = "..GUID) local query3 = db.getResult("SELECT count FROM player_depotitems WHERE itemtype = "..itemid.." AND player_id = "..GUID) local count = 0 if query1:getID() > -1 then repeat local count_ = query1:getDataInt("count") count = count + count_ until not query1:next() query1:free() end if query2:getID() > -1 then repeat local count_ = query2:getDataInt("count") count = count + count_ until not query2:next() query2:free() end if query3:getID() > -1 then repeat local count_ = query3:getDataInt("count") count = count + count_ until not query3:next() query3:free() end if count == 0 then doPlayerSendTextMessage(cid, 27, "Player doesn't have the specified item.") else doPlayerSendTextMessage(cid, 27, playername.." has "..count.." "..getItemNameById(itemid)..".") end end return true end
Omega deu erro no primeiro comando.
Testei /itemlist 2160 e depois /itemlist 2495 e deu o mesmo erro:
[12/12/2013 02:00:08] [Error - TalkAction Interface] [12/12/2013 02:00:08] data/talkactions/scripts/itemlist.lua:onSay [12/12/2013 02:00:08] Description: [12/12/2013 02:00:08] data/lib/004-database.lua:100: [Result:free] Result not set! [12/12/2013 02:00:08] stack traceback: [12/12/2013 02:00:08] [C]: in function 'error' [12/12/2013 02:00:08] data/lib/004-database.lua:100: in function 'free' [12/12/2013 02:00:08] data/talkactions/scripts/itemlist.lua:16: in function <data/talkactions/scripts/itemlist.lua:1>
Já o segundo comando funcionou de boa.
Valeu mesmo assim, se poder resolver esse problema ficarei ainda mais satisfeito.
Um conhecido meu min indicou um post do Oneshot, creio que ele faz a mesma função que o seu deve fazer, porém ele não faz o segundo comando que o seu faz. Qualquer coisa junta o seu com o dele pra ficar ainda melhor .
Você poderia fazer um terceiro comando nesse script, que seria /remove itemID, quantidade, NomeDoPlayer
lembrando que esse comando deverá remover através da data base, e não dos players que estiverem on
Você poderiam min dizer se ao usar esse comando ele verifica, no depot e na casa do player?
Em que parte da data base, em sql lite, fica salvo os itens que são colocados nas houses?
Editado Dezembro 12 por Mazynho
Try this:
function onSay(cid, words, param)
if words == "/itemlist" then
local itemid = tonumber(param) or false
if not itemid then
return true
end
local query1 = db.getResult("SELECT name FROM players WHERE id IN (SELECT owner FROM houses WHERE id IN (SELECT house_id FROM tiles WHERE id IN (SELECT tile_id FROM tile_items WHERE itemtype = "..itemid..")))")
local str = " Players who have "..getItemNameById(itemid) .. "\n"
local list = {}
if query1:getID() > -1 then
repeat
local name = query1:getDataString("name")
table.insert(list, name)
until not query1:next()
query1:free()
end
local query2 = db.getResult("SELECT name FROM players WHERE id IN (SELECT player_id FROM player_items WHERE itemtype = "..itemid..")")
if query2:getID() > -1 then
repeat
local name = query2:getDataString("name")
if not isInArray(list, name) then
table.insert(list, name)
end
until not query2:next()
query2:free()
end
local query3 = db.getResult("SELECT name FROM players WHERE id IN (SELECT player_id FROM player_depotitems WHERE itemtype = "..itemid..")")
if query3:getID() > -1 then
repeat
local name = query3:getDataString("name")
if not isInArray(list, name) then
table.insert(list, name)
end
until not query3:next()
query3:free()
end
if type(list) == "table" and #list == 0 then
return true
end
for _, name in ipairs(list) do
str = str.. '\n' .. name
end
doShowTextDialog(cid, itemid, str)
elseif words == "/itemcount" then
local param = string.explode(param, ',')
local playername = param[1]
local itemid = tonumber(param[2])
if not playername or not itemid then
doPlayerSendTextMessage(cid, 27, "Command syntax: /itemcount playername, itemid")
return true
end
local GUID = getPlayerGUIDByName(playername)
if not GUID then
doPlayerSendTextMessage(cid, 27, "Unable to retrieve info about that player.")
return true
end
local query1 = db.getResult("SELECT count FROM tile_items WHERE itemtype = "..itemid.." AND tile_id IN (SELECT id FROM tiles WHERE house_id = (SELECT id FROM houses WHERE owner = "..GUID.."))")
local query2 = db.getResult("SELECT count FROM player_items WHERE itemtype = "..itemid.." AND player_id = "..GUID)
local query3 = db.getResult("SELECT count FROM player_depotitems WHERE itemtype = "..itemid.." AND player_id = "..GUID)
local count = 0
if query1:getID() > -1 then
repeat
local count_ = query1:getDataInt("count")
count = count + count_
until not query1:next()
query1:free()
end
if query2:getID() > -1 then
repeat
local count_ = query2:getDataInt("count")
count = count + count_
until not query2:next()
query2:free()
end
if query3:getID() > -1 then
repeat
local count_ = query3:getDataInt("count")
count = count + count_
until not query3:next()
query3:free()
end
if count == 0 then
doPlayerSendTextMessage(cid, 27, "Player doesn't have the specified item.")
else
doPlayerSendTextMessage(cid, 27, playername.." has "..count.." "..getItemNameById(itemid)..".")
end
end
return true
end
It's the same but with a correction attempt. Hope this works.
info
Grupo: Marquês
Registrado: 16/06/07
Posts: 1.2k
Reputação: +377
Gênero: Masculino
Char no Tibia: Nenhum

Deu um trabalho, mas achei legal o comando. Mas dividi em 2:
- /itemlist itemid
- /itemcount playername, itemid
O primeiro retorna a lista de todos os jogadores que tem o item e o segundo retorna a quantidade que o jogador tem do item.
<talkaction words="/itemlist;/itemcount" access="5" event="script" value="itemlist.lua"/>
function onSay(cid, words, param) if words == "/itemlist" then local itemid = tonumber(param) or false if not itemid then return true end local query1 = db.getResult("SELECT name FROM players WHERE id IN (SELECT owner FROM houses WHERE id IN (SELECT house_id FROM tiles WHERE id IN (SELECT tile_id FROM tile_items WHERE itemtype = "..itemid..")))") local str = " Players who have "..getItemNameById(itemid) .. "\n" local list = {} if query1:getID() > -1 then repeat local name = query1:getDataString("name") table.insert(list, name) until not query1:next() end query1:free() local query2 = db.getResult("SELECT name FROM players WHERE id IN (SELECT player_id FROM player_items WHERE itemtype = "..itemid..")") if query2:getID() > -1 then repeat local name = query2:getDataString("name") if not isInArray(list, name) then table.insert(list, name) end until not query2:next() end query2:free() local query3 = db.getResult("SELECT name FROM players WHERE id IN (SELECT player_id FROM player_depotitems WHERE itemtype = "..itemid..")") repeat local name = query3:getDataString("name") if not isInArray(list, name) then table.insert(list, name) end until not query3:next() query3:free() if type(list) == "table" and #list == 0 then return true end for _, name in ipairs(list) do str = str.. '\n' .. name end doShowTextDialog(cid, itemid, str) elseif words == "/itemcount" then local param = string.explode(param, ',') local playername = param[1] local itemid = tonumber(param[2]) if not playername or not itemid then doPlayerSendTextMessage(cid, 27, "Command syntax: /itemcount playername, itemid") return true end local GUID = getPlayerGUIDByName(playername) if not GUID then doPlayerSendTextMessage(cid, 27, "Unable to retrieve info about that player.") return true end local query1 = db.getResult("SELECT count FROM tile_items WHERE itemtype = "..itemid.." AND tile_id IN (SELECT id FROM tiles WHERE house_id = (SELECT id FROM houses WHERE owner = "..GUID.."))") local query2 = db.getResult("SELECT count FROM player_items WHERE itemtype = "..itemid.." AND player_id = "..GUID) local query3 = db.getResult("SELECT count FROM player_depotitems WHERE itemtype = "..itemid.." AND player_id = "..GUID) local count = 0 if query1:getID() > -1 then repeat local count_ = query1:getDataInt("count") count = count + count_ until not query1:next() query1:free() end if query2:getID() > -1 then repeat local count_ = query2:getDataInt("count") count = count + count_ until not query2:next() query2:free() end if query3:getID() > -1 then repeat local count_ = query3:getDataInt("count") count = count + count_ until not query3:next() query3:free() end if count == 0 then doPlayerSendTextMessage(cid, 27, "Player doesn't have the specified item.") else doPlayerSendTextMessage(cid, 27, playername.." has "..count.." "..getItemNameById(itemid)..".") end end return true end
Omega deu erro no primeiro comando.
Testei /itemlist 2160 e depois /itemlist 2495 e deu o mesmo erro:
[12/12/2013 02:00:08] [Error - TalkAction Interface] [12/12/2013 02:00:08] data/talkactions/scripts/itemlist.lua:onSay [12/12/2013 02:00:08] Description: [12/12/2013 02:00:08] data/lib/004-database.lua:100: [Result:free] Result not set! [12/12/2013 02:00:08] stack traceback: [12/12/2013 02:00:08] [C]: in function 'error' [12/12/2013 02:00:08] data/lib/004-database.lua:100: in function 'free' [12/12/2013 02:00:08] data/talkactions/scripts/itemlist.lua:16: in function <data/talkactions/scripts/itemlist.lua:1>Já o segundo comando funcionou de boa.
Valeu mesmo assim, se poder resolver esse problema ficarei ainda mais satisfeito.
Um conhecido meu min indicou um post do Oneshot, creio que ele faz a mesma função que o seu deve fazer, porém ele não faz o segundo comando que o seu faz. Qualquer coisa junta o seu com o dele pra ficar ainda melhor .
Você poderia fazer um terceiro comando nesse script, que seria /remove itemID, quantidade, NomeDoPlayer
lembrando que esse comando deverá remover através da data base, e não dos players que estiverem on
Você poderiam min dizer se ao usar esse comando ele verifica, no depot e na casa do player?
Em que parte da data base, em sql lite, fica salvo os itens que são colocados nas houses?
Meu comando tá funcionando direitinho, só deixei esse erro bobo de fora. Ah, mas vai dar erro se você colocar pra procurar um item que não existe (outro erro).
function onSay(cid, words, param)
if words == "/itemlist" then
local itemid = tonumber(param) or false
if not itemid then
return true
end
local query1 = db.getResult("SELECT name FROM players WHERE id IN (SELECT owner FROM houses WHERE id IN (SELECT house_id FROM tiles WHERE id IN (SELECT tile_id FROM tile_items WHERE itemtype = "..itemid..")))")
local str = " Players who have "..getItemNameById(itemid) .. "\n"
local list = {}
if query1:getID() > -1 then
repeat
local name = query1:getDataString("name")
table.insert(list, name)
until not query1:next()
query1:free()
end
local query2 = db.getResult("SELECT name FROM players WHERE id IN (SELECT player_id FROM player_items WHERE itemtype = "..itemid..")")
if query2:getID() > -1 then
repeat
local name = query2:getDataString("name")
if not isInArray(list, name) then
table.insert(list, name)
end
until not query2:next()
query2:free()
end
local query3 = db.getResult("SELECT name FROM players WHERE id IN (SELECT player_id FROM player_depotitems WHERE itemtype = "..itemid..")")
if query3:getID() > -1 then
repeat
local name = query3:getDataString("name")
if not isInArray(list, name) then
table.insert(list, name)
end
until not query3:next()
query3:free()
end
if type(list) == "table" and #list == 0 then
return doShowTextDialog(cid, itemid, "No players with designated item.")
end
for _, name in ipairs(list) do
str = str.. '\n' .. name
end
doShowTextDialog(cid, itemid, str)
elseif words == "/itemcount" then
local param = string.explode(param, ',')
local playername = param[1]
local itemid = tonumber(param[2])
if not playername or not itemid then
doPlayerSendTextMessage(cid, 27, "Command syntax: /itemcount playername, itemid")
return true
end
local GUID = getPlayerGUIDByName(playername)
if not GUID then
doPlayerSendTextMessage(cid, 27, "Unable to retrieve info about that player.")
return true
end
local query1 = db.getResult("SELECT count FROM tile_items WHERE itemtype = "..itemid.." AND tile_id IN (SELECT id FROM tiles WHERE house_id = (SELECT id FROM houses WHERE owner = "..GUID.."))")
local query2 = db.getResult("SELECT count FROM player_items WHERE itemtype = "..itemid.." AND player_id = "..GUID)
local query3 = db.getResult("SELECT count FROM player_depotitems WHERE itemtype = "..itemid.." AND player_id = "..GUID)
local count = 0
if query1:getID() > -1 then
repeat
local count_ = query1:getDataInt("count")
count = count + count_
until not query1:next()
query1:free()
end
if query2:getID() > -1 then
repeat
local count_ = query2:getDataInt("count")
count = count + count_
until not query2:next()
query2:free()
end
if query3:getID() > -1 then
repeat
local count_ = query3:getDataInt("count")
count = count + count_
until not query3:next()
query3:free()
end
if count == 0 then
doPlayerSendTextMessage(cid, 27, "Player doesn't have the specified item.")
else
doPlayerSendTextMessage(cid, 27, playername.." has "..count.." "..getItemNameById(itemid)..".")
end
end
return true
end
E como eu disse, esse comando verifica itens na casa, no jogador e no depot. Os itens das casas ficam em tile_items.
Pra tirar item das casas dos outros não adianta com o servidor ligado. Assim que der o próximo save, vai voltar tudo. Pra fazer isso, tem que desligar o servidor e executar a query no banco de dados.
Valeu Omega, ta rodando suave. Agora você falou que se o item estiver na house não da pra remover, com o server on, mas e os itens do depot e os que ele estiver equipando ou na bp? se der pra remover itens do dp e do player faz um comando por favor.
Teria como você da uma incrementada nesses script, colocando uma mensagem dizendo onde o item estar, digo isso ao usar o comando /itemlist itemid.
Ex: /itemlist 2160
Irá aparecer aquela caixa de texto, com os nomes de quem tem este item e, ao lado teria um hífen seguido de Depot, (Caso esteja no Depot, House, (Caso esteja na house e Char, (Caso esteja equipando ou na bp), se o item estiver em mais de um lugar aparece em quais ele se encontra.
Se não for pedir muito uma função interessante que tem no script do Oneshot é que exibe, ao lado do nome do player, uma mensagem dizendo se o player está ou não online. Isso ajudaria, bastante, pois sabendo que o player está off posso abrir a DB e remover algum item.
Editado Dezembro 12 por Mazynho





info
Grupo: Campones
Registrado: 06/11/13
Posts: 99
Reputação: +2
Olá galera tibiana, queria que vocês fizessem uma talkaction que ao usar o comando /item 2160 (ID 2160 é apenas um exemplo) mostrasse uma lista com todos os players que tem este item, mostrando o nome do player que possui o item e a quantidade.
OBS:
Apenas GODs podem usar este comando.
Quero que isso seja exibido dentro uma caixa de texto de livro, aquela que ao clicar em um spellbook para ver as magias aparece, (doShowTextDialog).
Outro ponto importante é que ao usar esse comando ele verifique na data base e não apenas nos players online.
Se puderem incrementar o script com um /removeitem 2160, quantidade, nomedoplayer
ficaria ainda mais agradecido.
Tenho uma duvida quanto aos itens de house e queria que vocês min esclarecessem onde que fica salvo os itens que são guardados em casas, qual o local da data base? É na aba Items player? onde fica salvo com o ID do dono da casa.
Se não for pedir de mais já pedindo, caso o script solicitado a cima não verifique os itens que tem nas houses, poderiam fazer outro em que usasse o comando /itemhouse 2160
seria a mesma função basicamente, só que neste queria que mostrasse a quantidade, o ID da house e o nome do dono da casa.
E para ficar perfeito poderiam fazer este tambem:
/removeitemhouse 2160, quantidade, ID da house
ele teria a mesma função do /removeitem citado a cima, só que ele iria remover X quantidade do item (2160 por exemplo) da house de ID Y.
Bom galera é isso.