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? 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. 2 Link para o comentário https://tibiadevs.com/forums/topic/1310-autoloot-por-creaturescript-860-tfs-13/ 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