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?
Define drops personalizados por monstro, com chance e quantidade configuráveis.
Entrega automaticamente os itens para o jogador que matou a criatura ou para o líder da party se ele estiver próximo e visível.
Se a mochila do destinatário estiver cheia, os itens são colocados no chão no tile da criatura, em tiles livres próximos ou na posição do jogador.
Todos os membros da party recebem uma mensagem detalhando os itens dropados, formatada de forma legível.
Um efeito visual azul é aplicado no jogador que recebe o drop.
Funções auxiliares cuidam de:
Encontrar tiles livres ao redor do drop.
Formatar a lista de itens para mensagem.
Verificar a proximidade do líder.
Evita duplicidade de mensagem para membros da party.


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 = 0, maxCount = 4 }, -- gold coin
        { itemId = 2696, chance = 50, minCount = 1, maxCount = 1 }, -- cheese
    },
}

-- Procura tile livre ao redor
local function getFreeTileAround(position)
    local directions = {
        {x =  1, y =  0}, {x = -1, y =  0},
        {x =  0, y = 1}, {x =  0, y = -1},
        {x =  1, y = 1}, {x = -1, y = 1},
        {x =  1, y = -1}, {x = -1, y = -1},
    }
    for _, dir in ipairs(directions) do
        local pos = Position(position.x + dir.x, position.y + dir.y, position.z)
        local tile = Tile(pos)
        if tile and tile:getGround() then
            return pos
        end
    end
    return nil
end

-- Formata lista com vírgulas e "e"
local function formatDropList(parts)
    if #parts == 1 then return parts[1] end
    if #parts == 2 then return parts[1] .. " e " .. parts[2] end
    local text = table.concat(parts, ", ", 1, #parts - 1)
    return text .. " e " .. parts[#parts]
end

-- Verifica se o líder está "visível" para algum membro (mesmo andar e distância <= 😎
local function isLeaderVisible(members, leader)
    if not leader then return false end
    for _, member in ipairs(members) do
        local posM = member:getPosition()
        local posL = leader:getPosition()
        if posM.z == posL.z and posM:getDistance(posL) <= 8 then
            return true
        end
    end
    return false
end

-- Verifica se um valor existe na tabela
local function tableContains(tbl, val)
    for _, v in ipairs(tbl) do
        if v == val then return true end
    end
    return false
end

function onKill(player, creature)
    if not player or not creature then return true end

    local name = creature:getName():lower()
    local dropList = customDrops[name]
    if not dropList then return true end

    local corpsePos = creature:getPosition()
    local messageParts = {}

    -- Party ou apenas o player
    local members = {player}
    local dropPlayer = player
    local leader = nil

    if player:getParty() then
        local party = player:getParty()
        members = party:getMembers()
        leader = party:getLeader()
        -- Só dá o drop para o líder se ele estiver "visível" (mesmo andar e distância <= 😎 para algum membro
        if leader and isLeaderVisible(members, leader) then
            dropPlayer = leader
        end
    end

    local backpack = dropPlayer:getSlotItem(CONST_SLOT_BACKPACK)

    for _, drop in ipairs(dropList) do
        if math.random(1, 100) <= drop.chance then
            local amount = math.random(drop.minCount, drop.maxCount)
            local item = Game.createItem(drop.itemId, amount)
            if not item then goto continue end

            local addedToBackpack = false
            if backpack then
                if backpack:addItemEx(item) == RETURNVALUE_NOERROR then
                    addedToBackpack = true
                end
            end

            if not addedToBackpack then
                local tile = Tile(corpsePos)
                if tile and tile:getGround() then
                    item:moveTo(corpsePos)
                else
                    local freeTile = getFreeTileAround(corpsePos)
                    if freeTile then
                        item:moveTo(freeTile)
                    else
                        item:moveTo(dropPlayer:getPosition())
                    end
                end
            end

            local itemName = ItemType(drop.itemId):getName()
            table.insert(messageParts, amount .. " " .. itemName)

            ::continue::
        end
    end

    if #messageParts > 0 then
        local finalText = formatDropList(messageParts)

        -- Garante que todos os membros recebam a mensagem
        local messageRecipients = members
        if leader and not tableContains(messageRecipients, leader) then
            table.insert(messageRecipients, leader)
        end

        for _, member in ipairs(messageRecipients) do
            member:sendTextMessage(MESSAGE_INFO_DESCR, "[LOOT]: " .. finalText)
        end

        -- Efeito de brilho azul no dropPlayer (líder se estiver visível)
        doSendMagicEffect(dropPlayer:getPosition(), CONST_ME_MAGIC_BLUE)
    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-13/
Compartilhar em outros sites

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...