Filipe Carvalho 2 Postado 19 de Novembro Compartilhar Postado 19 de Novembro 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. 2 Link para o comentário https://tibiadevs.com/forums/topic/1310-autoloot-por-creaturescript-860-tfs-1x/ Compartilhar em outros sites Mais opções de compartilhamento...
Posts Recomendados
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 contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora