Ir para conteúdo

[Encerrado] LootEffect não mostra efeito de itens dentro da BP.


koete

Posts Recomendados

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 por koete
Link para o comentário
Compartilhar em outros sites

Ó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

 

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 por koete
Link para o comentário
Compartilhar em outros sites

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

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 por koete
Link para o comentário
Compartilhar em outros sites

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

  • 5 months later...
Visitante
Este tópico está impedido de receber novos posts.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...