Jump to content
  • 1

ADPATANDO SYSTEMA


IOWeenI

Question

Galera to quase fazendo uma magica, um sistema de auto loot que não precisa ficar catando o loot ele cai direto da bag, porem estou com um probleminha, preciso que o loot vai pra outras bags e não fique so na que está na base, tentei configurar mas não consegui

Spoiler

-- // AUTO LOOT SEM CLICK // --
                if isPremium(getCreatureMaster(cid)) and isCollectAll(getCreatureMaster(cid)) then
                    if getContainerSlotsFree(getPlayerSlotItem(getCreatureMaster(cid), 3).uid) >= 1 and getContainerSlotsFree(getPlayerSlotItem(getCreatureMaster(cid), 3).uid) ~= 333 then
                        doCorpseAddLoot(getCreatureName(target), getPlayerSlotItem(getCreatureMaster(cid), 3).uid, getCreatureMaster(cid), target, corpse)
                    else
                        doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse)
                    end
                else
                    doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse)
                end
            end
        end
        
-- // AUTO LOOT SEM CLICK // --

 

O que eu preciso basicamente e que ele encontre outras bags automaticamente e vai colocando, tipo se eu colocar ali 3 bags uma dentro da outra ele ir seguindo o ritimo até encher todas.... Quem ajudar eu compartilho o script e como configurei VALENDO REP

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0
-- Função para adicionar o loot em uma das bags disponíveis
function addToAvailableBags(loot, player)
    local playerSlotItem = getPlayerSlotItem(player, 3) -- Obtém a mochila do jogador
    local bags = {} -- Lista para armazenar as bags disponíveis

    -- Adiciona a mochila do jogador à lista de bags
    table.insert(bags, playerSlotItem.uid)

    -- Verifica se a mochila do jogador está dentro de outra bag
    local container = playerSlotItem.uid
    while container ~= 0 do
        container = getContainerParent(container)
        if container ~= 0 then
            table.insert(bags, container) -- Adiciona a bag à lista de bags
        end
    end

    -- Tenta adicionar o loot em cada bag disponível
    for _, bag in ipairs(bags) do
        local freeSlots = getContainerSlotsFree(bag)
        if freeSlots >= 1 and freeSlots ~= 333 then
            doCorpseAddLoot(getCreatureName(loot), bag, player, loot, loot) -- Adiciona o loot na bag
            return true -- Retorna true para indicar que o loot foi adicionado com sucesso
        end
    end

    return false -- Retorna false se não foi possível adicionar o loot em nenhuma bag
end

-- Verifica se o jogador é premium e está usando o auto loot
if isPremium(getCreatureMaster(cid)) and isCollectAll(getCreatureMaster(cid)) then
    -- Tenta adicionar o loot em uma das bags disponíveis
    if not addToAvailableBags(target, getCreatureMaster(cid)) then
        doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se não houver outras disponíveis
    end
else
    doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se o jogador não for premium ou não estiver usando o auto loot
end

 

Link to comment
Share on other sites

  • 0
Em 10/04/2024 em 23:22, Holograma disse:
-- Função para adicionar o loot em uma das bags disponíveis
function addToAvailableBags(loot, player)
    local playerSlotItem = getPlayerSlotItem(player, 3) -- Obtém a mochila do jogador
    local bags = {} -- Lista para armazenar as bags disponíveis

    -- Adiciona a mochila do jogador à lista de bags
    table.insert(bags, playerSlotItem.uid)

    -- Verifica se a mochila do jogador está dentro de outra bag
    local container = playerSlotItem.uid
    while container ~= 0 do
        container = getContainerParent(container)
        if container ~= 0 then
            table.insert(bags, container) -- Adiciona a bag à lista de bags
        end
    end

    -- Tenta adicionar o loot em cada bag disponível
    for _, bag in ipairs(bags) do
        local freeSlots = getContainerSlotsFree(bag)
        if freeSlots >= 1 and freeSlots ~= 333 then
            doCorpseAddLoot(getCreatureName(loot), bag, player, loot, loot) -- Adiciona o loot na bag
            return true -- Retorna true para indicar que o loot foi adicionado com sucesso
        end
    end

    return false -- Retorna false se não foi possível adicionar o loot em nenhuma bag
end

-- Verifica se o jogador é premium e está usando o auto loot
if isPremium(getCreatureMaster(cid)) and isCollectAll(getCreatureMaster(cid)) then
    -- Tenta adicionar o loot em uma das bags disponíveis
    if not addToAvailableBags(target, getCreatureMaster(cid)) then
        doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se não houver outras disponíveis
    end
else
    doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se o jogador não for premium ou não estiver usando o auto loot
end

 

Manin não pegou, deu erro no final, 

 

[Error - CreatureScript Interface]
data/creaturescripts/scripts/player/statsChange.lua:onStatsChange
Description:
data/lib/Death System.lua:1816: attempt to call global 'getContainerParent' (a nil value)
stack traceback:
        data/lib/Death System.lua:1816: in function 'addToAvailableBags'
        data/lib/Death System.lua:1837: in function 'doKillWildPoke'
        data/creaturescripts/scripts/player/statsChange.lua:878: in function <data/creaturescripts/scripts/player/statsChange.lua:6>

Link to comment
Share on other sites

  • 0

Isso pode acontecer se a função não estiver disponível no arquivo de biblioteca onde está o seu script.
Vamos tentar fazer isso localmente:
 

-- Função para obter o contêiner pai de um item
function getContainerParent(container)
    local items = getContainerItems(container)
    if items then
        for i = 1, #items do
            local item = items[i]
            if isInContainer(item.uid) then
                return container
            end
        end
    end
    return 0
end

-- Função para adicionar o loot em uma das bags disponíveis
function addToAvailableBags(loot, player)
    local playerSlotItem = getPlayerSlotItem(player, 3) -- Obtém a mochila do jogador
    local bags = {} -- Lista para armazenar as bags disponíveis

    -- Adiciona a mochila do jogador à lista de bags
    table.insert(bags, playerSlotItem.uid)

    -- Verifica se a mochila do jogador está dentro de outra bag
    local container = playerSlotItem.uid
    while container ~= 0 do
        container = getContainerParent(container)
        if container ~= 0 then
            table.insert(bags, container) -- Adiciona a bag à lista de bags
        end
    end

    -- Tenta adicionar o loot em cada bag disponível
    for _, bag in ipairs(bags) do
        local freeSlots = getContainerSlotsFree(bag)
        if freeSlots >= 1 and freeSlots ~= 333 then
            doCorpseAddLoot(getCreatureName(loot), bag, player, loot, loot) -- Adiciona o loot na bag
            return true -- Retorna true para indicar que o loot foi adicionado com sucesso
        end
    end

    return false -- Retorna false se não foi possível adicionar o loot em nenhuma bag
end

-- Verifica se o jogador é premium e está usando o auto loot
if isPremium(getCreatureMaster(cid)) and isCollectAll(getCreatureMaster(cid)) then
    -- Tenta adicionar o loot em uma das bags disponíveis
    if not addToAvailableBags(target, getCreatureMaster(cid)) then
        doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se não houver outras disponíveis
    end
else
    doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se o jogador não for premium ou não estiver usando o auto loot
end



 

Link to comment
Share on other sites

  • 0
1 hora atrás, Holograma disse:

Isso pode acontecer se a função não estiver disponível no arquivo de biblioteca onde está o seu script.
Vamos tentar fazer isso localmente:
 

-- Função para obter o contêiner pai de um item
function getContainerParent(container)
    local items = getContainerItems(container)
    if items then
        for i = 1, #items do
            local item = items[i]
            if isInContainer(item.uid) then
                return container
            end
        end
    end
    return 0
end

-- Função para adicionar o loot em uma das bags disponíveis
function addToAvailableBags(loot, player)
    local playerSlotItem = getPlayerSlotItem(player, 3) -- Obtém a mochila do jogador
    local bags = {} -- Lista para armazenar as bags disponíveis

    -- Adiciona a mochila do jogador à lista de bags
    table.insert(bags, playerSlotItem.uid)

    -- Verifica se a mochila do jogador está dentro de outra bag
    local container = playerSlotItem.uid
    while container ~= 0 do
        container = getContainerParent(container)
        if container ~= 0 then
            table.insert(bags, container) -- Adiciona a bag à lista de bags
        end
    end

    -- Tenta adicionar o loot em cada bag disponível
    for _, bag in ipairs(bags) do
        local freeSlots = getContainerSlotsFree(bag)
        if freeSlots >= 1 and freeSlots ~= 333 then
            doCorpseAddLoot(getCreatureName(loot), bag, player, loot, loot) -- Adiciona o loot na bag
            return true -- Retorna true para indicar que o loot foi adicionado com sucesso
        end
    end

    return false -- Retorna false se não foi possível adicionar o loot em nenhuma bag
end

-- Verifica se o jogador é premium e está usando o auto loot
if isPremium(getCreatureMaster(cid)) and isCollectAll(getCreatureMaster(cid)) then
    -- Tenta adicionar o loot em uma das bags disponíveis
    if not addToAvailableBags(target, getCreatureMaster(cid)) then
        doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se não houver outras disponíveis
    end
else
    doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se o jogador não for premium ou não estiver usando o auto loot
end


Nada, Continua acusando erro, coloquei tudo no sistema, 


[Error - CreatureScript Interface]
data/creaturescripts/scripts/player/statsChange.lua:onStatsChange
Description:
data/lib/101 - Drazyn Lib.lua:28: attempt to call global 'isInContainer' (a nil value)
stack traceback:
        data/lib/101 - Drazyn Lib.lua:28: in function 'getContainerParent'
        data/lib/101-some functions.lua:1936: in function 'addToAvailableBags'
        data/lib/Death System.lua:1807: in function 'doKillWildPoke'
        data/creaturescripts/scripts/player/statsChange.lua:878: in function <data/creaturescripts/scripts/player/statsChange.lua:6>

 

Com Bag na Principal acusou esse erro e sem a Bag o Abaixo

 

[Error - CreatureScript Interface]
data/creaturescripts/scripts/player/statsChange.lua:onStatsChange
Description:
data/lib/101-some functions.lua:1946: attempt to call global 'doCorpseAddLoot' (a nil value)
stack traceback:
        data/lib/101-some functions.lua:1946: in function 'addToAvailableBags'
        data/lib/Death System.lua:1807: in function 'doKillWildPoke'
        data/creaturescripts/scripts/player/statsChange.lua:878: in function <data/creaturescripts/scripts/player/statsChange.lua:6>

 

 

Link to comment
Share on other sites

  • 0

qual função do seu servidor adicina loot na bag e os parametros dela? deixei pra tu adaptar com comentarios no script dq deve ser alterado:

 

-- Função para obter o contêiner pai de um item
function getContainerParent(container)
    local items = getContainerItems(container)
    if items then
        for i = 1, #items do
            local item = items[i]
            if item.uid ~= container then
                return container
            end
        end
    end
    return 0
end

-- Função para adicionar o loot em uma das bags disponíveis
function addToAvailableBags(loot, player)
    local playerSlotItem = getPlayerSlotItem(player, 3) -- Obtém a mochila do jogador
    local bags = {} -- Lista para armazenar as bags disponíveis

    -- Adiciona a mochila do jogador à lista de bags
    table.insert(bags, playerSlotItem.uid)

    -- Verifica se a mochila do jogador está dentro de outra bag
    local container = playerSlotItem.uid
    while container ~= 0 do
        container = getContainerParent(container)
        if container ~= 0 then
            table.insert(bags, container) -- Adiciona a bag à lista de bags
        end
    end

    -- Tenta adicionar o loot em cada bag disponível
    for _, bag in ipairs(bags) do
        local freeSlots = getContainerSlotsFree(bag)
        if freeSlots >= 1 and freeSlots ~= 333 then
            -- Aqui você deve substituir 'doCorpseAddLoot' pela função adequada para adicionar loot na bag
            -- Certifique-se de que a função esteja corretamente definida e acessível no contexto do seu script
            -- doCorpseAddLoot(getCreatureName(loot), bag, player, loot, loot) -- Adiciona o loot na bag
            return true -- Retorna true para indicar que o loot foi adicionado com sucesso
        end
    end

    return false -- Retorna false se não foi possível adicionar o loot em nenhuma bag
end

-- Verifica se o jogador é premium e está usando o auto loot
if isPremium(getCreatureMaster(cid)) and isCollectAll(getCreatureMaster(cid)) then
    -- Tenta adicionar o loot em uma das bags disponíveis
    if not addToAvailableBags(target, getCreatureMaster(cid)) then
        -- Aqui você deve substituir 'doCorpseAddLoot' pela função adequada para adicionar loot na bag
        -- Certifique-se de que a função esteja corretamente definida e acessível no contexto do seu script
        -- doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se não houver outras disponíveis
    end
else
    -- Aqui você deve substituir 'doCorpseAddLoot' pela função adequada para adicionar loot na bag
    -- Certifique-se de que a função esteja corretamente definida e acessível no contexto do seu script
    -- doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se o jogador não for premium ou não estiver usando o auto loot
end

 

Link to comment
Share on other sites

  • 0
Em 23/04/2024 em 20:17, Holograma disse:

qual função do seu servidor adicina loot na bag e os parametros dela? deixei pra tu adaptar com comentarios no script dq deve ser alterado:

 

-- Função para obter o contêiner pai de um item
function getContainerParent(container)
    local items = getContainerItems(container)
    if items then
        for i = 1, #items do
            local item = items[i]
            if item.uid ~= container then
                return container
            end
        end
    end
    return 0
end

-- Função para adicionar o loot em uma das bags disponíveis
function addToAvailableBags(loot, player)
    local playerSlotItem = getPlayerSlotItem(player, 3) -- Obtém a mochila do jogador
    local bags = {} -- Lista para armazenar as bags disponíveis

    -- Adiciona a mochila do jogador à lista de bags
    table.insert(bags, playerSlotItem.uid)

    -- Verifica se a mochila do jogador está dentro de outra bag
    local container = playerSlotItem.uid
    while container ~= 0 do
        container = getContainerParent(container)
        if container ~= 0 then
            table.insert(bags, container) -- Adiciona a bag à lista de bags
        end
    end

    -- Tenta adicionar o loot em cada bag disponível
    for _, bag in ipairs(bags) do
        local freeSlots = getContainerSlotsFree(bag)
        if freeSlots >= 1 and freeSlots ~= 333 then
            -- Aqui você deve substituir 'doCorpseAddLoot' pela função adequada para adicionar loot na bag
            -- Certifique-se de que a função esteja corretamente definida e acessível no contexto do seu script
            -- doCorpseAddLoot(getCreatureName(loot), bag, player, loot, loot) -- Adiciona o loot na bag
            return true -- Retorna true para indicar que o loot foi adicionado com sucesso
        end
    end

    return false -- Retorna false se não foi possível adicionar o loot em nenhuma bag
end

-- Verifica se o jogador é premium e está usando o auto loot
if isPremium(getCreatureMaster(cid)) and isCollectAll(getCreatureMaster(cid)) then
    -- Tenta adicionar o loot em uma das bags disponíveis
    if not addToAvailableBags(target, getCreatureMaster(cid)) then
        -- Aqui você deve substituir 'doCorpseAddLoot' pela função adequada para adicionar loot na bag
        -- Certifique-se de que a função esteja corretamente definida e acessível no contexto do seu script
        -- doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se não houver outras disponíveis
    end
else
    -- Aqui você deve substituir 'doCorpseAddLoot' pela função adequada para adicionar loot na bag
    -- Certifique-se de que a função esteja corretamente definida e acessível no contexto do seu script
    -- doCorpseAddLoot(getCreatureName(target), corpse, getCreatureMaster(cid), target, corpse) -- Adiciona o loot na bag original se o jogador não for premium ou não estiver usando o auto loot
end

 

No caso ele não tem uma função que pega o loot ali o que fazia com que o loot fosse direto pra bag sem ir pro corpse é esse codigo

                    if getContainerSlotsFree(getPlayerSlotItem(getCreatureMaster(cid), 3).uid) >= 1 and getContainerSlotsFree(getPlayerSlotItem(getCreatureMaster(cid), 3).uid) ~= 333 then
                        doCorpseAddLoot(getCreatureName(target), getPlayerSlotItem(getCreatureMaster(cid), 3).uid, getCreatureMaster(cid), target, corpse)

Link to comment
Share on other sites

  • 0

creio que em todo servidor tenha a função de pegar loot ja imbutida de forma global amigo, geralmente não é algo que é feito dentro de scripts locais visto que é algo muito usado..

 

-- Função para obter o contêiner pai de um item
function getContainerParent(container)
    local items = getContainerItems(container)
    if items then
        for i = 1, #items do
            local item = items[i]
            if item.uid ~= container then
                return container
            end
        end
    end
    return 0
end

-- Função para adicionar o loot em uma das bags disponíveis
function addToAvailableBags(loot, player)
    local playerSlotItem = getPlayerSlotItem(player, 3) -- Obtém a mochila do jogador
    local mainBag = playerSlotItem.uid -- UID da mochila principal

    -- Verifica se há espaço na mochila principal
    local freeSlotsMainBag = getContainerSlotsFree(mainBag)
    if freeSlotsMainBag >= 1 and freeSlotsMainBag ~= 333 then
        -- Adiciona o loot na mochila principal
        doCorpseAddLoot(getCreatureName(loot), mainBag, player, loot, loot)
        return true -- Retorna true para indicar que o loot foi adicionado com sucesso
    else
        -- Se não houver espaço na mochila principal, envia uma mensagem ao jogador
        player:sendTextMessage(MESSAGE_INFO_DESCR, "Não há espaço disponível na mochila principal para coletar o loot.") 
        return false -- Retorna false para indicar que o loot não foi adicionado
    end
end

-- Tenta adicionar o loot na mochila principal
addToAvailableBags(target, getCreatureMaster(cid))

 

Link to comment
Share on other sites

  • 0

Entendi, tipo assim pelo que vi do código, ele coloca o Loot que droparia do monstro na bag principal direto no lugar de colocar no corpse, vou dar uma procurada nas infos, até por que eu coloquei esses codigos todos nos devidos lugares e não pegou

Link to comment
Share on other sites

  • 0
Em 25/04/2024 em 22:01, Holograma disse:

creio que em todo servidor tenha a função de pegar loot ja imbutida de forma global amigo, geralmente não é algo que é feito dentro de scripts locais visto que é algo muito usado..

 

-- Função para obter o contêiner pai de um item
function getContainerParent(container)
    local items = getContainerItems(container)
    if items then
        for i = 1, #items do
            local item = items[i]
            if item.uid ~= container then
                return container
            end
        end
    end
    return 0
end

-- Função para adicionar o loot em uma das bags disponíveis
function addToAvailableBags(loot, player)
    local playerSlotItem = getPlayerSlotItem(player, 3) -- Obtém a mochila do jogador
    local mainBag = playerSlotItem.uid -- UID da mochila principal

    -- Verifica se há espaço na mochila principal
    local freeSlotsMainBag = getContainerSlotsFree(mainBag)
    if freeSlotsMainBag >= 1 and freeSlotsMainBag ~= 333 then
        -- Adiciona o loot na mochila principal
        doCorpseAddLoot(getCreatureName(loot), mainBag, player, loot, loot)
        return true -- Retorna true para indicar que o loot foi adicionado com sucesso
    else
        -- Se não houver espaço na mochila principal, envia uma mensagem ao jogador
        player:sendTextMessage(MESSAGE_INFO_DESCR, "Não há espaço disponível na mochila principal para coletar o loot.") 
        return false -- Retorna false para indicar que o loot não foi adicionado
    end
end

-- Tenta adicionar o loot na mochila principal
addToAvailableBags(target, getCreatureMaster(cid))

 

por fim acabei achando isso fuçando aqui

Spoiler

function getContainerSlotsFree(container) -- by vodka
    return getContainerCap(container)-getContainerSize(container)
end

function getAllContainerFree(container)  -- by vodka

    local containers, soma = {}, 0
        
    for i = 0, getContainerSize(container) do
    local item = getContainerItem(container, i)
        if isContainer(item.uid) then
            soma = soma + getAllContainerFree(item.uid)
        end
    end
        
    for _, check in pairs(containers) do
        soma = soma + getContainerSlotsFree(check)
    end

return (soma + getContainerSlotsFree(container))
end

 

Link to comment
Share on other sites

×
×
  • Create New...