Ir para conteúdo
Propaganda

Posts Recomendados

Criei esse autoloot com a ajuda do chatgpt e vim compartilhar com alguns que não conseguem adicionar um autoloot ao seu otserv de forma simples.

Como funciona?

  • Adiciona drops personalizados por monstro, sem usar loot.xml

  • Executa automaticamente quando um monstro é morto (onKill)

  • Só aplica o drop se o monstro estiver configurado na lista customDrops

  • Sorteia cada item individualmente com base na chance definida

  • Sorteia a quantidade mínima e máxima de cada item

  • Envia o loot diretamente para a mochila do jogador

  • Se o jogador estiver em party, o loot vai para o leader

  • O leader só recebe o loot se estiver:

    • No mesmo andar (z)

    • A até 8 SQMs de distância

  • Empilha gold coins corretamente (máximo de 100 por stack)

  • Envia mensagem de loot no formato padrão:

    Loot of a rat: 3 gold coin e 1 cheese

  • Envia a mensagem para todos os membros da party

  • Mostra efeito mágico azul na posição do jogador que recebeu o loot

  • Detecta mochila cheia

  • Remove o item se não couber na mochila

  • Avisa o jogador quando algum item é perdido por falta de espaço

  • Não cria itens no chão

  • Não interfere no drop padrão do monstro (se existir)

  • Não depende de banco de dados

  • Compatível com TFS 1.x


Como adicionar ao serv?
Procure pela pasta, data\creaturescripts
Dentro da pasta, data\creaturescripts, abra o arquivo, creaturescripts.xml e cole isso:

Spoiler

<event type="kill" name="autoloot" script="autoloot.lua"/>

Procure pela pasta, data\creaturescripts\scripts\others
Dentro da pasta, data\creaturescripts\scripts\others, abra o arquivo, login.lua e cole isso nos registros abaixo:

 

Spoiler

player:registerEvent("autoloot")

Ficando mais ou menos assim:
    player:registerEvent("Idle")
    player:registerEvent("Recompensa")
    player:registerEvent("SoulWarBosses")
    player:registerEvent("AdventurerBlessings")
    player:registerEvent("vortexSpawnCarlin")
    player:registerEvent("PlayerDeath")
    player:registerEvent("autoloot")

Procure pela pasta, data\creaturescripts\scripts
Dentro da pasta, data\creaturescripts\scripts, crie um arquivo chamado autoloot.lua e cole o script dentro do arquivo e depois salve-o:

 

Spoiler
-- LISTA DE DROPS PERSONALIZADOS
local customDrops = {
    ["rat"] = {
        { itemId = 2148, chance = 100, minCount = 1, maxCount = 4 }, -- gold coin
        { itemId = 2696, chance = 50,  minCount = 1, maxCount = 1 }, -- cheese
    },
}
 
-- Formata texto do loot
local function formatDropList(parts)
    if #parts == 1 then
        return parts[1]
    elseif #parts == 2 then
        return parts[1] .. " e " .. parts[2]
    end
    return table.concat(parts, ", ", 1, #parts - 1) .. " e " .. parts[#parts]
end
 
-- Verifica se o leader está próximo e no mesmo andar
local function isLeaderVisible(members, leader)
    if not leader then
        return false
    end
 
    local leaderPos = leader:getPosition()
    for _, member in ipairs(members) do
        local memberPos = member:getPosition()
        if memberPos.z == leaderPos.z and memberPos:getDistance(leaderPos) <= 8 then
            return true
        end
    end
    return false
end
 
function onKill(player, creature)
    if not player or not creature then
        return true
    end
 
    local dropList = customDrops[creature:getName():lower()]
    if not dropList then
        return true
    end
 
    -- Define quem recebe o loot
    local dropPlayer = player
    local members = { player }
    local leader
 
    local party = player:getParty()
    if party then
        members = party:getMembers()
        leader = party:getLeader()
        if leader and isLeaderVisible(members, leader) then
            dropPlayer = leader
        end
    end
 
    local backpack = dropPlayer:getSlotItem(CONST_SLOT_BACKPACK)
    local lootLost = false
    local messageParts = {}
 
    for _, drop in ipairs(dropList) do
        if math.random(100) <= drop.chance then
            local amount = math.random(drop.minCount, drop.maxCount)
 
            -- GOLD COINS (empilhamento até 100)
            if drop.itemId == 2148 then
                local remaining = amount
                local added = 0
 
                while remaining > 0 do
                    local stack = math.min(remaining, 100)
                    local item = Game.createItem(2148, stack)
 
                    if item and backpack and backpack:addItemEx(item) == RETURNVALUE_NOERROR then
                        added = added + stack
                    else
                        if item then
                            item:remove()
                        end
                        lootLost = true
                    end
 
                    remaining = remaining - stack
                end
 
                if added > 0 then
                    table.insert(messageParts, added .. " gold coin")
                end
            else
                local item = Game.createItem(drop.itemId, amount)
                if item and backpack and backpack:addItemEx(item) == RETURNVALUE_NOERROR then
                    table.insert(messageParts, amount .. " " .. ItemType(drop.itemId😞getName())
                else
                    if item then
                        item:remove()
                    end
                    lootLost = true
                end
            end
        end
    end
 
    -- Mensagem de loot
    if #messageParts > 0 then
        local text = formatDropList(messageParts)
        for _, member in ipairs(members) do
            member:sendTextMessage(
                MESSAGE_INFO_DESCR,
                "Loot of a " .. creature:getName():lower() .. ": " .. text
            )
        end
        dropPlayer:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE)
    end
 
    -- Aviso de mochila cheia
    if lootLost then
        dropPlayer:sendTextMessage(
            MESSAGE_INFO_DESCR,
            "Sua mochila está cheia, alguns itens foram perdidos."
        )
    end
 
    return true
end

Uma mensagem será exibido para todos da party sendo exibida no na tela e também no server log:
Loot of a slime lord: 1 gold coin

Caso queira adicionar algum novo monstro para drop automático:
Primeiro retire o corpse dos monstro que serão adicionados ao script na pasta data\monster, abra o xml do monstro em <look type="21" corpse=""/>, deixe assim, vazio entre "".
Pronto, agora vamos adicionar mais montros.


Procure pela pasta, data\creaturescripts\scripts
Dentro da pasta, data\creaturescripts\scripts, agora abra o arquivo chamado autoloot.lua

 

Spoiler

Busque por:

Spoiler

    ["rat"] = {
        { itemId = 2148, chance = 100, minCount = 0, maxCount = 4 }, -- gold coin
        { itemId = 2696, chance = 50, minCount = 1, maxCount = 1 }, -- cheese
    },


Copie o código acima até a e cole, ficando como no exemplo abaixo!
 

Spoiler

local customDrops = {
    ["rat"] = {
        { itemId = 2148, chance = 100, minCount = 0, maxCount = 4 }, -- gold coin
        { itemId = 2696, chance = 50, minCount = 1, maxCount = 1 }, -- cheese
    },

    ["rabbit"] = {
        { itemId = 2148, chance = 100, minCount = 0, maxCount = 4 }, -- gold coin
        { itemId = 2666, chance = 50, minCount = 1, maxCount = 1 }, -- meat
    },

}

E para adicionar um novo item a ser dropado faça assim!
 

Spoiler

local customDrops = {
    ["nomedomonstro"] = {
        { itemId = 2148, chance = 100, minCount = 0, maxCount = 4 }, -- gold coin
        { itemId = 2696, chance = 50, minCount = 1, maxCount = 1 }, -- cheese

         { itemId = iddoitem, chance = chancededropde1a100, minCount = quantidademinimadedrop, maxCount = quantidademaximadedrop }, -- nome do item para nao se perder
    },
}

 

Se quiser também aumentar a dificuldade de 1 para 100 pra 1 para 1000 só alterar essa parte:
 

Spoiler


1 entre 100

Spoiler

if math.random(1, 100) <= drop.chance then

1 entre 1000 ou mais
 

Spoiler

if math.random(1, 1000) <= drop.chance then

 

Pronto, agora só usar e ser feliz.
Qualquer dúvida deixe abaixo, estarei ajudando no que precisar.

 

  • Like 2
Link para o comentário
https://tibiadevs.com/forums/topic/1310-autoloot-por-creaturescript-860-tfs-1x/
Compartilhar em outros sites

  • Filipe Carvalho mudou o título para Autoloot por creaturescript, 8.60, tfs 1.x!

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
  • Criar Novo...