koete 8 Postado Novembro 3, 2017 Share Postado Novembro 3, 2017 (editado) Como diz o Título, eu tenho um script que mostra um efeito em cima dos monstros quando dropa certos itens (configurável). Sendo que ele só mostra o efeito se o item dropar no corpo, se ele dropar dentro de uma bag o efeito não aparece. local config = { ids = {2238, 2239}, drop_effect = true } function examine(cid, position, corpse_id, name) if not isPlayer(cid) then return true end local corpse = getTileItemById(position, corpse_id).uid if corpse <= 1 or not isContainer(corpse) then return true end for slot = 0, getContainerSize(corpse) - 1 do local item = getContainerItem(corpse, slot) if item.uid <= 1 then return true end if isInArray(config.ids, item.itemid) then if config.drop_effect then doSendMagicEffect(position, 55, cid) end end end end function onKill(cid, target) if not isMonster(target) then return true end local monster_name = getCreatureName(target) local corpse_id = getMonsterInfo(monster_name).lookCorpse addEvent(examine, 5, cid, getThingPos(target), corpse_id, monster_name) return true end Editado Novembro 3, 2017 por koete Link para o comentário Compartilhar em outros sites More sharing options...
dalvorsn 268 Postado Novembro 3, 2017 Share Postado Novembro 3, 2017 Óbviamente, a função não é recursiva. Você tem que iterar sobre todos os containers para poder pegar todos os items. Use essa função para pegar os items dentro do container: function getItemsInContainer(uid) local items = {} if isContainer(uid) and getContainerSize(uid) > 0 then for slot=0, (getContainerSize(uid)-1) do local item = getContainerItem(uid, slot) if isContainer(item.uid) then local _items = getItemsInContainerById(item.uid) for i=0, #_items do table.insert(items, items[i]) end else table.insert(items, item) end end end return items end Irá lhe retornar uma tabela com todos os items dentro do container, exceto containers(não fazem diferença pro seu caso). Dai tu pode iterar sobre ela verificando pelo itemid. local items = getItemsInContainer(corpse) for _, thing in pairs(items) do if isInArray(config.ids, thing.itemid) then if config.drop_effect then doSendMagicEffect(position, 55, cid) end end end Link para o comentário Compartilhar em outros sites More sharing options...
koete 8 Postado Novembro 3, 2017 Autor Share Postado Novembro 3, 2017 (editado) 22 minutos atrás, dalvorsn disse: Óbviamente, a função não é recursiva. Você tem que iterar sobre todos os containers para poder pegar todos os items. Use essa função para pegar os items dentro do container: function getItemsInContainer(uid) local items = {} if isContainer(uid) and getContainerSize(uid) > 0 then for slot=0, (getContainerSize(uid)-1) do local item = getContainerItem(uid, slot) if isContainer(item.uid) then local _items = getItemsInContainerById(item.uid) for i=0, #_items do table.insert(items, items[i]) end else table.insert(items, item) end end end return items end Irá lhe retornar uma tabela com todos os items dentro do container, exceto containers(não fazem diferença pro seu caso). Dai tu pode iterar sobre ela verificando pelo itemid. local items = getItemsInContainer(corpse) for _, thing in pairs(items) do if isInArray(config.ids, thing.itemid) then if config.drop_effect then doSendMagicEffect(position, 55, cid) end end end Cara, confesso que to me sentindo um idiota. Porque eu não consegui entender muito bem o que eu devo fazer. eu jogo os dois scripts que vc digitou dentro do meu original? Editado Novembro 3, 2017 por koete Link para o comentário Compartilhar em outros sites More sharing options...
dalvorsn 268 Postado Novembro 3, 2017 Share Postado Novembro 3, 2017 16 minutos atrás, koete disse: Cara, confesso que to me sentindo um idiota. Porque eu não consegui entender muito bem o que eu devo fazer. eu jogo os dois scripts que vc digitou dentro do meu original? Sim, basicamente. Spoiler local config = { ids = {2238, 2239}, drop_effect = true } function examine(cid, position, corpse_id, name) if not isPlayer(cid) then return true end local corpse = getTileItemById(position, corpse_id).uid if corpse <= 1 or not isContainer(corpse) then return true end local items = getItemsInContainer(corpse) for _, thing in pairs(items) do if isInArray(config.ids, thing.itemid) then if config.drop_effect then doSendMagicEffect(position, 55, cid) end end end end function onKill(cid, target) if not isMonster(target) then return true end local monster_name = getCreatureName(target) local corpse_id = getMonsterInfo(monster_name).lookCorpse addEvent(examine, 5, cid, getThingPos(target), corpse_id, monster_name) return true end function getItemsInContainer(uid) local items = {} if isContainer(uid) and getContainerSize(uid) > 0 then for slot=0, (getContainerSize(uid)-1) do local item = getContainerItem(uid, slot) if isContainer(item.uid) then local _items = getItemsInContainerById(item.uid) for i=0, #_items do table.insert(items, items[i]) end else table.insert(items, item) end end end return items end Link para o comentário Compartilhar em outros sites More sharing options...
koete 8 Postado Novembro 3, 2017 Autor Share Postado Novembro 3, 2017 (editado) Não funcionou, não retorna erro nem nada, só não manda o efeito, nem quando dropa dentro e agora nem quando dropa fora da bp. Tenho aqui um script de autoloot feito em MOD pelo . Ele Certamente checka o drop antes para ver se da pra pegar o item, se conseguir usar isso. MOD AUTOLOOT: Spoiler <?xml version="1.0" encoding="ISO-8859-1"?> <mod name="Loot System" version="1.0" author="Vodkart And Mkalo" contact="none.com" enabled="yes"> <config name="Loot_func"><![CDATA[ info = { AutomaticDeposit = true, BlockMonsters = {}, BlockItemsList = {}, Max_Slots = {free = 5, premium = 5}, Storages = {27000,28001,28002} } function setPlayerStorageTable(cid, storage, tab) local tabstr = "&" for i,x in pairs(tab) do tabstr = tabstr .. i .. "," .. x .. ";" end setPlayerStorageValue(cid, storage, tabstr:sub(1, #tabstr-1)) end function getPlayerStorageTable(cid, storage) local tabstr = getPlayerStorageValue(cid, storage) local tab = {} if type(tabstr) ~= "string" then return {} end if tabstr:sub(1,1) ~= "&" then return {} end local tabstr = tabstr:sub(2, #tabstr) local a = string.explode(tabstr, ";") for i,x in pairs(a) do local b = string.explode(x, ",") tab[tonumber(b[1]) or b[1]] = tonumber(b[2]) or b[2] end return tab end function isInTable(cid, item) for _,i in pairs(getPlayerStorageTable(cid, info.Storages[1]))do if tonumber(i) == tonumber(item) then return true end end return false end function addItemTable(cid, item) local x = {} for i = 1,#getPlayerStorageTable(cid, info.Storages[1]) do table.insert(x,getPlayerStorageTable(cid, info.Storages[1])[i]) end if x ~= 0 then table.insert(x,tonumber(item)) setPlayerStorageTable(cid, info.Storages[1], x) else setPlayerStorageTable(cid, info.Storages[1], {item}) end end function removeItemTable(cid, item) local x = {} for i = 1,#getPlayerStorageTable(cid, info.Storages[1]) do table.insert(x,getPlayerStorageTable(cid, info.Storages[1])[i]) end for i,v in ipairs(x) do if tonumber(v) == tonumber(item) then table.remove(x,i) end end return setPlayerStorageTable(cid, info.Storages[1], x) end function ShowItemsTabble(cid) local n,str = 0,"[+] Auto Loot Commands [+]\n\n/loot item name --> To add ou Remove item from list.\n/loot money --> To collect gold automatically.\n/loot clear --> To clear the list.\n/loot on/off --> To enable or disable the collecting of items in the system.\n\n[+] Auto Loot Info [+]\n\nSystem: "..(getPlayerStorageValue(cid, info.Storages[3]) <= 0 and "Activated" or "Disabled")..".\nGold Collecting: "..(getPlayerStorageValue(cid, info.Storages[2]) > 0 and "Activated" or "Disabled")..".\nBalance Total: ["..getPlayerBalance(cid).."] gp's.\nMaximum Slots: ["..#getPlayerStorageTable(cid, info.Storages[1]).."/"..(isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free).."]\n\n[+] Auto Loot Slots [+]\n\n" for i = 1,#getPlayerStorageTable(cid, info.Storages[1]) do n = n + 1 str = str.."Slot "..n.." - "..getItemNameById(getPlayerStorageTable(cid, info.Storages[1])[i]).."\n" end return doPlayerPopupFYI(cid, str) end function getContainerItems(containeruid) local items = {} local containers = {} if type(getContainerSize(containeruid)) ~= "number" then return false end for slot = 0, getContainerSize(containeruid)-1 do local item = getContainerItem(containeruid, slot) if item.itemid == 0 then break end if isContainer(item.uid) then table.insert(containers, item.uid) end table.insert(items, item) end if #containers > 0 then for i,x in ipairs(getContainerItems(containers[1])) do table.insert(items, x) end table.remove(containers, 1) end return items end 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 doPlayerAddItemStacking(cid, itemid, amount) -- revisado local item, _G = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid), 0 if #item > 0 then for _ ,x in pairs(item) do local ret = getThing(x) if ret.type < 100 then doTransformItem(ret.uid, itemid, ret.type+amount) if ret.type+amount > 100 then doPlayerAddItem(cid, itemid, ret.type+amount-100) end break else _G = _G+1 end end if _G == #item then doPlayerAddItem(cid, itemid, amount) end else return doPlayerAddItem(cid, itemid, amount) end end function AutomaticDeposit(cid,item,n) local deposit = item == tonumber(2160) and (n*10000) or tonumber(item) == 2152 and (n*100) or (n*1) return doPlayerDepositMoney(cid, deposit) end function corpseRetireItems(cid, pos) local check = false for i = 0, 255 do pos.stackpos = i tile = getTileThingByPos(pos) if tile.uid > 0 and isCorpse(tile.uid) then check = true break end end if check == true then local items = getContainerItems(tile.uid) for i,x in pairs(items) do if isInArray(getPlayerStorageTable(cid, info.Storages[1]), tonumber(x.itemid)) or getPlayerStorageValue(cid, info.Storages[2]) > 0 and isInArray({2148,2152,2160},tonumber(x.itemid)) then if isItemStackable(x.itemid) then doPlayerAddItemStacking(cid, x.itemid, x.type) if info.AutomaticDeposit == true and isInArray({2148,2152,2160}, tonumber(x.itemid)) then AutomaticDeposit(cid,x.itemid,x.type) end else doPlayerAddItem(cid, x.itemid) end doRemoveItem(x.uid) end end end end ]]></config> <event type="login" name="LootLogin" event="script"><![CDATA[ function onLogin(cid) registerCreatureEvent(cid, "LootEventKIll") if isPremium(cid) and getPlayerStorageValue(cid, 27001) <= 0 then setPlayerStorageValue(cid, 27001, 1) elseif getPlayerStorageValue(cid, 27001) > 0 and not isPremium(cid) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[Auto Loot] You premium is Over, Start a new list!") setPlayerStorageValue(cid, 27001, -1) setPlayerStorageValue(cid, info.Storages[1], -1) end return true end]]></event> <event type="kill" name="LootEventKIll" event="script"><![CDATA[ domodlib('Loot_func') function onKill(cid, target, lastHit) if isPlayer(cid) and getPlayerStorageValue(cid, info.Storages[3]) <= 0 and isMonster(target) and not isInArray(info.BlockMonsters, getCreatureName(target):lower()) then addEvent(corpseRetireItems, 0, cid ,getThingPos(target)) end return true end]]></event> <talkaction words="/loot;!loot" event="buffer"><![CDATA[ domodlib('Loot_func') local param, slots = param:lower(), isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free if not param or param == "" then ShowItemsTabble(cid) return true elseif tonumber(param) then doPlayerSendCancel(cid, "enter commands: /loot item name [+] /loot clean [+] /loot money [+] /loot on/off") return true elseif isInArray({"clean","limpar", "clear"}, param) then setPlayerStorageValue(cid, info.Storages[1], -1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] Your list has been cleaned.") return true elseif isInArray({"start","stop","on","off"}, param) then setPlayerStorageValue(cid, info.Storages[3], getPlayerStorageValue(cid, info.Storages[3]) <= 0 and 1 or 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] "..(getPlayerStorageValue(cid, info.Storages[3]) > 0 and "Stopped" or "Started")..".") return true elseif isInArray({"money","gold","gps","dinheiro"}, param) then setPlayerStorageValue(cid, info.Storages[2], getPlayerStorageValue(cid, info.Storages[2]) <= 0 and 1 or 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] Gold Colleting "..(getPlayerStorageValue(cid, info.Storages[2]) > 0 and "Activated" or "disabled")..".") return true end local item = getItemIdByName(param, false) if not item then doPlayerSendCancel(cid, "This item does not exist.") return true end local var = isInTable(cid, item) if isInArray({2148,2152,2160},item) then doPlayerSendCancel(cid, "Enter /loot money to add money in your list!") return true elseif isInArray(info.BlockItemsList, item) then doPlayerSendCancel(cid, "You can not add this item in the list!") return true elseif not var and #getPlayerStorageTable(cid, info.Storages[1]) >= slots then doPlayerSendCancel(cid, "max "..slots.." from auto loot") return true end if not var then addItemTable(cid, item) else removeItemTable(cid, item) end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,not var and "you added the item "..param.." in the list" or "you removed the item "..param.." from the list") return true]]></talkaction> </mod> Editado Novembro 3, 2017 por koete Link para o comentário Compartilhar em outros sites More sharing options...
dalvorsn 268 Postado Novembro 3, 2017 Share Postado Novembro 3, 2017 Vai printando no script e ve ate onde ele vai Link para o comentário Compartilhar em outros sites More sharing options...
koete 8 Postado Novembro 3, 2017 Autor Share Postado Novembro 3, 2017 Editei a minha resposta acima citando um script de autoloot que ja funciona no meu servidor, poderia pegar a parte que ele checa os itens na bp (que eu não sei qual é). E juntar nesse de magiceffect. Link para o comentário Compartilhar em outros sites More sharing options...
Stigal 584 Postado Abril 19, 2018 Share Postado Abril 19, 2018 A questão neste tópico de suporte foi encerrada por falta de resposta. Este tópico está fechado e foi movido para Suporte - Tópicos Sem Resposta. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados