Ir para conteúdo
  • Cadastre-se

Posts Recomendados

.Qual servidor ou website você utiliza como base? 

Canary 3.11.2

 

Qual o motivo deste tópico? 

Olá a todos, estou com um problema. Estou usando a versão mais recente do Canary OpenTibiaBR e tenho esse script de autoloot. Porém, ele tem o seguinte problema: após adicionar um item, não permite adicionar mais itens, e o comando !autoloot simplesmente falha. Não exibe nenhum erro; simplesmente para de funcionar. No entanto, os itens que adicionei ao autoloot ainda funcionam, mas depois de um certo tempo param de funcionar também. Se conseguirem me ajudar com esse problema já é uma mão na roda.

 

Erro:

Depois que coloquei esse script começou a aparecer esse warning.
[2024-28-01 18:14:59.558] [warning] Skipping save for player because another save has been scheduled.



Adicional:

Se possível, gostaria que o script criasse uma bolsa dourada na caixa de entrada da loja do jogador, e todos os saques automáticos coletados fossem para a bolsa dourada.

 

 

Você tem o código disponível? Se tiver publique-o aqui: 

local autoloot = {
    talkaction = "!autoloot",
    storageBase = 50000,
    freeAccountLimit = 10,
    premiumAccountLimit = 20
}

local autolootCache = {}

local function getPlayerLimit(player)
    return player:isPremium() and autoloot.premiumAccountLimit or autoloot.freeAccountLimit
end

local function getPlayerAutolootItems(player)
    local limits = getPlayerLimit(player)
    local guid = player:getGuid()
    local itemsCache = autolootCache[guid]
    if itemsCache then
        if #itemsCache > limits then
            local newChache = {unpack(itemsCache, 1, limits)}
            autolootCache[guid] = newChache
            return newChache
        end
        return itemsCache
    end

    local items = {}
    for i = 1, limits do
        local itemType = ItemType(tonumber(player:getStorageValue(autoloot.storageBase + i)) or 0)
        if itemType and itemType:getId() ~= 0 then
            items[#items + 1] = itemType:getId()
        end
    end

    autolootCache[guid] = items
    return items
end

local function setPlayerAutolootItems(player, items)
    for i = 1, getPlayerLimit(player) do
        player:setStorageValue(autoloot.storageBase + i, (items[i] and items[i] or -1))
    end
    return true
end

local function addPlayerAutolootItem(player, itemId)
    local items = getPlayerAutolootItems(player)
    for _, id in pairs(items) do
        if itemId == id then
            return false
        end
    end
    items[#items + 1] = itemId
    return setPlayerAutolootItems(player, items)
end

local function removePlayerAutolootItem(player, itemId)
    local items = getPlayerAutolootItems(player)
    for i, id in pairs(items) do
        if itemId == id then
            table.remove(items, i)
            return setPlayerAutolootItems(player, items)
        end
    end
    return false
end

local function hasPlayerAutolootItem(player, itemId)
    for _, id in pairs(getPlayerAutolootItems(player)) do
        if itemId == id then
            return true
        end
    end
    return false
end

local ec = EventCallback()

function ec.monsterOnDropLoot(monster, corpse)
    if not corpse:getType():isContainer() then
        return
    end

    local corpseOwner = Player(corpse:getCorpseOwner())
    local items = corpse:getItems()
    for _, item in pairs(items) do
        if hasPlayerAutolootItem(corpseOwner, item:getId()) then
            if not item:moveTo(corpseOwner) then
                corpseOwner:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You no have capacity.")
                break
            end
        end
    end
end

ec:register(3)

local talkAction = TalkAction(autoloot.talkaction)

function talkAction.onSay(player, words, param, type)
    local split = param:splitTrimmed(",")
    local action = split[1]
    local items = getPlayerAutolootItems(player)
    local description = {string.format("~ Your autoloot list, capacity: %d/%d ~\n", #items, getPlayerLimit(player))}
    for i, itemId in pairs(items) do
        description[#description + 1] = string.format("%d) %s", i, ItemType(itemId):getName())
    end
    if not action then
        player:showTextDialog(
            23721,
            string.format(
                "Examples of use:\n%s add,gold coin\n%s remove,gold coin\n%s clear\n\n~Available slots~\nfreeAccount: %d\npremiumAccount: %d \n\n" ..table.concat(description, "\n"),
                words,
                words,
                words,
                autoloot.freeAccountLimit,
                autoloot.premiumAccountLimit
            ),
            false
        )
        return false
    end

    if action == "clear" then
        setPlayerAutolootItems(player, {})
        player:sendCancelMessage("Autoloot list cleaned.")
        return false
    end

    local function getItemType()
        local itemType = ItemType(split[2])
        if not itemType or itemType:getId() == 0 then
            itemType = ItemType(tonumber(split[2]) or 0)
            if not itemType or itemType:getId() == 0 then
                player:sendCancelMessage(string.format("The item %s does not exists!", split[2]))
                return false
            end
        end
        return itemType
    end

    if action == "add" then
        local itemType = getItemType()
        if itemType then
            local limits = getPlayerLimit(player)
            if #getPlayerAutolootItems(player) >= limits then
                player:sendCancelMessage(string.format("Your auto loot only allows you to add %d items.", limits))
                return false
            end

            if addPlayerAutolootItem(player, itemType:getId()) then
                player:sendCancelMessage(string.format("Perfect you have added to the list: %s", itemType:getName()))
            else
                player:sendCancelMessage(string.format("The item %s already exists!", itemType:getName()))
            end
        end
        return false
    elseif action == "remove" then
        local itemType = getItemType()
        if itemType then
            if removePlayerAutolootItem(player, itemType:getId()) then
                player:sendCancelMessage(
                    string.format("Perfect you have removed to the list the article: %s", itemType:getName())
                )
            else
                player:sendCancelMessage(string.format("The item %s does not exists in the list.", itemType:getName()))
            end
        end
        return false
    end

    return false
end

talkAction:separator(" ")
talkAction:groupType("normal")
talkAction:register()

local creatureEvent = CreatureEvent("autolootCleanCache")

function creatureEvent.onLogout(player)
    setPlayerAutolootItems(player, getPlayerAutolootItems(player))
    autolootCache[player:getGuid()] = nil
    return true
end

creatureEvent:register() 

 

 

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Estatísticas dos Fóruns

    96845
    Tópicos
    519606
    Posts
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo