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:
<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:
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:
-- 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
Busque por:
["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!
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!
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:
1 entre 100
if math.random(1, 100) <= drop.chance then
1 entre 1000 ou mais
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.