Ir para conteúdo

[Encerrado] [BUG] Auto Loot


Alkimista

Posts Recomendados

Estou usando um autoloot que peguei aqui no forum, mais todos que eu testei ta com o mermo erro

quando adiciona 100 item, ele para de adiciona, tem que tira da bag, se nao ele nao adiciona mais,

e tem hora que ele falha, decha escapa uma, duas stone, treis stone, da esse erro tamem:

 

[15/10/2013 18:04:49] data/lib/050-function.lua:239: attempt to index a boolean value
[15/10/2013 18:04:49] stack traceback:
[15/10/2013 18:04:49] data/lib/050-function.lua:239: in function 'getItemName'
[15/10/2013 18:04:49] data/creaturescripts/scripts/aloot.lua:57: in function <data/creaturescripts/scripts/aloot.lua:8>
Servidor: PDA 1.9 Sem sem lvl by Slicer
Creature Scripts:

function onLogin(cid)
registerCreatureEvent(cid, "aloot_kill")
return true
end
local stor = 7575
function autoloot(cid, target, pos)
local function doStack(cid, itemid, new)
local count = getPlayerItemCount(cid, itemid)
if (count > 100) then
count = count - math.floor(count / 100) * 1
end
local newCount = count + new
if (count ~= 0) then
local find = getPlayerItemById(cid, true, itemid, count).uid
if (find > 0) then
doRemoveItem(find)
else
newCount = new
end
end
local item = doCreateItemEx(itemid, newCount)
doPlayerAddItemEx(cid, item, true)
end
local function scanContainer(cid, uid, list)
for k = (getContainerSize(uid) - 1), 0, -1 do
local tmp = getContainerItem(uid, k)
if (isInArray(list, tmp.itemid)) then
if isItemStackable(tmp.itemid) and (getPlayerItemCount(cid, tmp.itemid) > 0) then
doStack(cid, tmp.itemid, tmp.type)
else
local item = doCreateItemEx(tmp.itemid, tmp.type)
doPlayerAddItemEx(cid, item, true)
end
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Looted ' .. tmp.type .. ' ' .. getItemNameById(tmp.itemid) .. '.')
doRemoveItem(tmp.uid)
elseif isContainer(tmp.uid) then
scanContainer(cid, tmp.uid, list)
end
end
end
local items = {}
for i = getTileInfo(pos).items, 1, -1 do
pos.stackpos = i
table.insert(items, getThingFromPos(pos))
end
if (#items == 0) then
return
end
local corpse = -1
for _, item in ipairs(items) do
local name = getItemName(item.uid):lower()
if name:find(target:lower()) then
corpse = item.uid
break
end
end
if (corpse ~= -1) and isContainer(corpse) then
scanContainer(cid, corpse, tostring(getPlayerStorageValue(cid, stor)):gsub('_', ''):explode(','))
end
end
function onKill(cid, target, lastHit)
if not isPlayer(target) then
local infos = getPlayerStorageValue(cid, stor)
if (infos == -1) then
return true
end
local list = tostring(infos):explode(',')
if (#list == 0) then
return true
end
addEvent(autoloot, 150, cid, getCreatureName(target), getCreaturePosition(target))
end
return true
end

Talkactions:

local stor, limit = 7575, 50000 --storage, limit to add.
local allow_container = false --empty! not looted with items, atleast for now.
function onSay(cid, words, param)
local expl = param:explode(':')
local action, rst = expl[1], expl[2]
if (action:lower() == 'check') then
local infos, list = getPlayerStorageValue(cid, stor), {}
if (infos ~= -1) then
list = tostring(infos):explode(',')
end
local txt = 'Autoloot List:\n'
if (#list > 0) then
for k, id in ipairs(list) do
id = id:gsub('_', '')
if tonumber(id) then
txt = txt .. getItemNameById(tonumber(id)) .. ((k < #list) and '\n' or '')
end
end
else
txt = 'Empty'
end
doPlayerPopupFYI(cid, txt)
elseif (action:lower() == 'add') then
local infos, list = getPlayerStorageValue(cid, stor), {}
if (infos ~= -1) then
list = tostring(infos):gsub('_', ''):explode(',')
end
if (#list >= limit) then
return doPlayerSendCancel(cid, 'You already have ' .. limit .. ' autolooting items.')
end
local item = tonumber(rst)
if not item then
item = getItemIdByName(rst, false)
if not item then
return doPlayerSendCancel(cid, 'Esse item nao existe.')
end
end
if not allow_container and isItemContainer(item) then
return doPlayerSendCancel(cid, 'this item can not be autolooted.')
end
local attrs = getItemInfo(item)
if not attrs then
return doPlayerSendCancel(cid, 'Esse item nao existe.')
elseif not attrs.movable or not attrs.pickupable then
return doPlayerSendCancel(cid, 'this item can not be autolooted.')
end
if isInArray(list, item) then
return doPlayerSendCancel(cid, 'Ja foi adicionado.')
end
table.insert(list, tostring(item))
local new = ''
for v, id in ipairs(list) do
new = new .. '_' .. id:gsub('_' ,'') .. ((v < #list) and ',' or '')
end
doPlayerSetStorageValue(cid, stor, tostring(new))
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Item >>' .. getItemNameById(item) .. '<< has been added to the autoloot list.')
elseif (action:lower() == 'remove') then
local infos, list = getPlayerStorageValue(cid, stor), {}
if (infos ~= -1) then
list = tostring(infos):gsub('_', ''):explode(',')
end
if (#list == 0) then
return doPlayerSendCancel(cid, 'You dont have any item added.')
end
local item = tonumber(rst)
if not item then
item = getItemIdByName(rst, false)
if not item then
return doPlayerSendCancel(cid, 'not valid item.')
end
end
if not isInArray(list, item) then
return doPlayerSendCancel(cid, 'This item is not in the list.')
end
local new = ''
for v, id in ipairs(list) do
if (tonumber(id) ~= item) then
new = new .. '_' .. id:gsub('_' ,'') .. ((v < #list) and ',' or '')
end
end
doPlayerSetStorageValue(cid, stor, tostring(new))
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Item >>' .. getItemNameById(item) .. '<< removed from the autoloot list.')
end
return true
end

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

Palavras do slicer sobre esse erro:

oia... aparentemente, a funçao interna da getItemName ta retornando false e dai ta dando esse erro... isso acontece quando...

if(thing.itemid < 100) then
return false
end

no caso, caso ele ache um item com id < 100 o.O -nem sei se isso eh possivel de fazer sei la-

 

tem 2 jeitos de 'contornar' esse erro...

 

1* trocando essa parte...

local corpse = -1
for _, item in ipairs(items) do
local name = getItemName(item.uid):lower()
if name:find(target:lower()) then
corpse = item.uid
break
end
end

por essa..

local corpse = -1
for _, item in ipairs(items) do
if item and item.itemid >= 100 then
local name = getItemName(item.uid):lower()
if name:find(target:lower()) then
corpse = item.uid
break
end
end
end

2* indo em lib/050-functions.lua e achando essa funçao..

function getItemDescriptions(uid)

e tirando aquela parte ali de thing.itemid < 100...

 

-mas realmente deve ter um motivo para ter essa proteçao entao recomendo fazer a 1* opçao... ou clr, tentar achar o item com id < 100 e mudar o id dele...-

Eu ainda não adicionei autoloot aqui no meu servidor e conferi se o que o slicer disse funciona mesmo, mas se quiser tentar ae e ver se funciona..
Link para o comentário
Compartilhar em outros sites

vlw pela força manin, vo testa aqui


Ae, Funciono vei, mai o bug de para de adiciona item depois que junta 100, e o de as veis falha, e nao adiciona o item, continua,

mais mermo assim, REP+ ae, vlw

Link para o comentário
Compartilhar em outros sites

De nada cara, fico feliz em ter ajudado \o

Algum moderador já pode mover o tópico para a seção de pedidos resolvidos, ou você gostaria de esperar alguém conseguir uma solução para estes bugs e postar aqui?

Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...
  • 4 years later...
A questão neste tópico de suporte foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Suporte - Tópicos Sem Resposta.

+ Caso a dúvida não tenha sido resolvida você poderá criar outro tópico solicitando ajuda.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado.
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...