Olá pessoal, estou tentando criar um script de caçador de recompensas, onde a cabeça do jogador é um prêmio, mas não consigo fazer funcionar. Se alguém puder me dar uma mão para fazer funcionar.
-- Configurações locais
local baseBountyReward = 10000 -- Recompensa base em ouro
local checkInterval = 30 -- Intervalo em minutos para verificar o jogador com o nível mais alto
local rewardItemID = 14257 -- ID do item que será dado como recompensa
-- Variáveis globais
local bountyPlayer = nil -- Jogador com a cabeça a prêmio
local bountyLogs = {} -- Logs de eventos
local currentCheckInterval = checkInterval -- Intervalo de verificação atual (pode ser ajustado)
-- Função para registrar logs
função local logEvent(mensagem)
table.insert(bountyLogs, os.date("%Y-%m-%d %H:%M:%S") .. " - " .. mensagem)
print("[Bounty Log] " .. message) -- Exibe o log no console
fim
-- Função para encontrar o jogador com o nível mais alto
função local findHighestLevelPlayer()
nível mais alto local = 0
jogador-alvo local = nulo
para _, jogador em ipairs(Game.getPlayers()) faça
se jogador e jogador:getLevel() > highestLevel e jogador ~= bountyPlayer então
highestLevel = jogador
bterNível()
targetPlayer = jogador
fim
fim
logEvent("Jogador com maior nível encontrado: " .. (targetPlayer and targetPlayer:getName() or "Nenhum jogador encontrado"))
retornar targetPlayer
fim
-- Função chamada ao jogador morrer
função onDeath(criatura, cadáver, assassino, mostDamageKiller)
se não criatura:isPlayer() então
return true -- Ignorar criaturas que não são jogadores
fim
-- Verifique se a cabeça a prêmio morreu
se criatura == bountyPlayer então
logEvent(string.format("O jogador com a cabeça a prêmio (%s) foi morto por %s.", criatura:getName(), killer e killer:getName() or "desconhecido"))
-- Verifique se o killer é um jogador válido
se assassino e assassino:isPlayer() então
logEvent(string.format("Recompensa sendo atribuída a %s por matar o bounty.", killer:getName()))
giveItemToGroup(assassino)
elseif mostDamageKiller e mostDamageKiller:isPlayer() então
logEvent(string.format("Recompensa sendo atribuída a %s por maior dano no bounty.", mostDamageKiller:getName()))
giveItemToGroup(matarmaisdanos)
outro
logEvent("Nenhum jogador identificado como responsável pela morte do bounty.")
fim
-- Resetar a cabeça ao prêmio
bountyPlayer = nulo
-- Procurar e definir um novo bountyPlayer
atualizarRecompensa()
outro
logEvent(string.format("O jogador %s morreu, mas não era a cabeça a prêmio.", criatura:getName()))
fim
retornar verdadeiro
fim
-- Função para anunciar a cabeça a prêmio
função announceBounty(jogador)
se jogador e jogador:isPlayer() então
Game.broadcastMessage(string.format("[Bounty Hunter] A nova cabeça a prêmio é %s (Level %d).", player:getName(), player:getLevel()))
logEvent(string.format("Nova recompensa anunciada: %s (Nível %d)", player:getName(), player:getLevel()))
outro
logEvent("Não foi possível anunciar a cabeça a prêmio, jogador inválido.")
fim
fim
- Função para atualizar a cabeça a prêmio
função local updateBounty()
-- Verifique se a cabeça a prêmio já foi definido
se bountyPlayer então
-- Verifique se bountyPlayer é um jogador válido antes de chamar isOnline
se bountyPlayer:isPlayer() então
-- Se o jogador da cabeça a prêmio estiver desconectado, resetamos
se não bountyPlayer:isOnline() então
logEvent("A cabeça a prêmio " .. bountyPlayer:getName() .. " saiu do jogo. Resetando a cabeça a prêmio.")
bountyPlayer = nulo
outro
logEvent("Nenhuma mudança na cabeça a prêmio.")
return -- Nenhuma mudança, já que o bountyPlayer ainda está online
fim
outro
logEvent("A cabeça do prêmio não é mais um jogador válido, redefinindo.")
bountyPlayer = nulo
fim
outro
logEvent("A cabeça do prêmio não está definida. Procurando um novo jogador.")
fim
-- Encontrar o novo jogador com maior nível
local newBountyPlayer = findHighestLevelPlayer()
-- Verifique se encontramos um novo jogador válido para ser a cabeça a prêmio
se newBountyPlayer e newBountyPlayer:isPlayer() então
-- Se o jogador encontrado for diferente do atual, atualizamos a cabeça a prêmio
se newBountyPlayer ~= bountyPlayer então
bountyPlayer = novoBountyPlayer
anunciaBounty(bountyPlayer) -- Anuncia o novo bounty
outro
logEvent("O jogador com maior nível já é a cabeça a prêmio.")
fim
outro
logEvent("Nenhum jogador encontrado para ser a cabeça a prêmio.")
fim
fim
-- Função para dar um item e ouro para cada membro do grupo
função local giveItemToGroup(jogador)
grupo local = player:getGroup()
se grupo e #group:getMembers() > 1 então
para _, membro em ipairs(group:getMembers()) faça
se membro:getFreeCapacity() >= ItemType(rewardItemID):getWeight() então
-- Dar o item
item localAdded = membro:addItem(rewardItemID, 1)
se itemAdicionado então
member:sendTextMessage(MESSAGE_INFO_DESCR, "Você recebeu um item especial pela recompensa!")
logEvent("Item dado com sucesso: " .. member:getName() .. " recebeu 1 item (ID " .. RewardItemID .. ").")
outro
member:sendTextMessage(MESSAGE_INFO_DESCR, "Erro ao tentar adicionar o item ao seu inventário.")
logEvent("Falha ao adicionar item: " .. member:getName() .. " não recebeu o item (ID " .. rewardItemID .. ").")
fim
-- Dar ouro
membro:addMoney(baseBountyReward)
member:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Você recebeu %d de ouro pela recompensa!", baseBountyReward))
logEvent("Ouro dado com sucesso: " .. member:getName() .. " recebido " .. baseBountyReward .. " de ouro.")
outro
member:sendTextMessage(MESSAGE_INFO_DESCR, "Você não tem espaço suficiente no inventário para receber o item.")
logEvent("Falha ao dar item: " .. member:getName() .. " sem espaço no inventário.")
fim
fim
outro
se jogador:getFreeCapacity() >= ItemType(rewardItemID):getWeight() então
-- Dar o item
item localAdded = jogador:addItem(rewardItemID, 1)
se itemAdicionado então
player:sendTextMessage(MESSAGE_INFO_DESCR, "Você recebeu um item especial pela recompensa!")
logEvent("Item dado com sucesso: " .. player:getName() .. " recebeu 1 item (ID " .. recompenseItemID .. ").")
outro
player:sendTextMessage(MESSAGE_INFO_DESCR, "Erro ao tentar adicionar o item ao seu inventário.")
logEvent("Falha ao adicionar item: " .. player:getName() .. " não recebeu o item (ID " .. RewardItemID .. ").")
fim
-- Dar ouro
jogador:addMoney(baseBountyReward)
player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Você recebeu %d de ouro pela recompensa!", baseBountyReward))
logEvent("Ouro dado com sucesso: " .. player:getName() .. " recebido " .. baseBountyReward .. " de ouro.")
outro
player:sendTextMessage(MESSAGE_INFO_DESCR, "Você não tem espaço suficiente no inventário para receber o item.")
logEvent("Falha ao dar item: " .. player:getName() .. " sem espaço no inventário.")
fim
fim
fim
-- Função chamada ao jogador morrer
função onDeath(criatura, cadáver, assassino, mostDamageKiller)
se não criatura:isPlayer() então
return true -- Ignorar criaturas que não são jogadores
fim
se criatura == bountyPlayer então
logEvent(string.format("O jogador com a cabeça a prêmio (%s) foi morto por %s.", criatura:getName(), killer e killer:getName() or "desconhecido"))
-- Verifique se o killer é um jogador válido
se assassino e assassino:isPlayer() então
logEvent(string.format("Recompensa sendo atribuída a %s por matar o bounty.", killer:getName()))
giveItemToGroup(assassino)
elseif mostDamageKiller e mostDamageKiller:isPlayer() então
logEvent(string.format("Recompensa sendo atribuída a %s por maior dano no bounty.", mostDamageKiller:getName()))
giveItemToGroup(matarmaisdanos)
outro
logEvent("Nenhum jogador identificado como responsável pela morte do bounty.")
fim
bountyPlayer = nulo
atualizarRecompensa()
outro
logEvent(string.format("O jogador %s morreu, mas não era a cabeça a prêmio.", criatura:getName()))
fim
retornar verdadeiro
fim
-- Configure o intervalo para verificar o jogador com o nível mais alto
função onThink(intervalo)
logEvent("Intervalo de seleção iniciado.")
atualizarRecompensa()
retornar verdadeiro
fim
-- Registrar os eventos
função onStartup()
logEvent("Sistema Bounty Hunter iniciado.")
addEvent(onThink, intervalo de verificação atual * 60 * 1000, intervalo de verificação atual * 60 * 1000)
fim
-- Iniciar o sistema
na inicialização()
_G.updateBounty = atualizarBounty
_G.setCheckInterval = função(novoIntervalo)
currentCheckInterval = novoIntervalo
logEvent("Intervalo de seleção alterado para " .. newInterval .. " minutos.")
fim
-- Configurações locais
local baseBountyReward = 10000 -- Recompensa base em ouro
local checkInterval = 30 -- Intervalo em minutos para verificar o jogador com o nível mais alto
local rewardItemID = 14257 -- ID do item que será dado como recompensa
-- Variáveis globais
local bountyPlayer = nil -- Jogador com a cabeça a prêmio
local bountyLogs = {} -- Logs de eventos
local currentCheckInterval = checkInterval -- Intervalo de verificação atual (pode ser ajustado)
-- Função para registrar logs
função local logEvent(mensagem)
table.insert(bountyLogs, os.date("%Y-%m-%d %H:%M:%S") .. " - " .. mensagem)
print("[Bounty Log] " .. message) -- Exibe o log no console
fim
-- Função para encontrar o jogador com o nível mais alto
função local findHighestLevelPlayer()
nível mais alto local = 0
jogador-alvo local = nulo
para _, jogador em ipairs(Game.getPlayers()) faça
se jogador e jogador:getLevel() > highestLevel e jogador ~= bountyPlayer então
highestLevel = jogador

targetPlayer = jogador
fim
fim
logEvent("Jogador com maior nível encontrado: " .. (targetPlayer and targetPlayer:getName() or "Nenhum jogador encontrado"))
retornar targetPlayer
fim
-- Função chamada ao jogador morrer
função onDeath(criatura, cadáver, assassino, mostDamageKiller)
se não criatura:isPlayer() então
return true -- Ignorar criaturas que não são jogadores
fim
-- Verifique se a cabeça a prêmio morreu
se criatura == bountyPlayer então
logEvent(string.format("O jogador com a cabeça a prêmio (%s) foi morto por %s.", criatura:getName(), killer e killer:getName() or "desconhecido"))
-- Verifique se o killer é um jogador válido
se assassino e assassino:isPlayer() então
logEvent(string.format("Recompensa sendo atribuída a %s por matar o bounty.", killer:getName()))
giveItemToGroup(assassino)
elseif mostDamageKiller e mostDamageKiller:isPlayer() então
logEvent(string.format("Recompensa sendo atribuída a %s por maior dano no bounty.", mostDamageKiller:getName()))
giveItemToGroup(matarmaisdanos)
outro
logEvent("Nenhum jogador identificado como responsável pela morte do bounty.")
fim
-- Resetar a cabeça ao prêmio
bountyPlayer = nulo
-- Procurar e definir um novo bountyPlayer
atualizarRecompensa()
outro
logEvent(string.format("O jogador %s morreu, mas não era a cabeça a prêmio.", criatura:getName()))
fim
retornar verdadeiro
fim
-- Função para anunciar a cabeça a prêmio
função announceBounty(jogador)
se jogador e jogador:isPlayer() então
Game.broadcastMessage(string.format("[Bounty Hunter] A nova cabeça a prêmio é %s (Level %d).", player:getName(), player:getLevel()))
logEvent(string.format("Nova recompensa anunciada: %s (Nível %d)", player:getName(), player:getLevel()))
outro
logEvent("Não foi possível anunciar a cabeça a prêmio, jogador inválido.")
fim
fim
- Função para atualizar a cabeça a prêmio
função local updateBounty()
-- Verifique se a cabeça a prêmio já foi definido
se bountyPlayer então
-- Verifique se bountyPlayer é um jogador válido antes de chamar isOnline
se bountyPlayer:isPlayer() então
-- Se o jogador da cabeça a prêmio estiver desconectado, resetamos
se não bountyPlayer:isOnline() então
logEvent("A cabeça a prêmio " .. bountyPlayer:getName() .. " saiu do jogo. Resetando a cabeça a prêmio.")
bountyPlayer = nulo
outro
logEvent("Nenhuma mudança na cabeça a prêmio.")
return -- Nenhuma mudança, já que o bountyPlayer ainda está online
fim
outro
logEvent("A cabeça do prêmio não é mais um jogador válido, redefinindo.")
bountyPlayer = nulo
fim
outro
logEvent("A cabeça do prêmio não está definida. Procurando um novo jogador.")
fim
-- Encontrar o novo jogador com maior nível
local newBountyPlayer = findHighestLevelPlayer()
-- Verifique se encontramos um novo jogador válido para ser a cabeça a prêmio
se newBountyPlayer e newBountyPlayer:isPlayer() então
-- Se o jogador encontrado for diferente do atual, atualizamos a cabeça a prêmio
se newBountyPlayer ~= bountyPlayer então
bountyPlayer = novoBountyPlayer
anunciaBounty(bountyPlayer) -- Anuncia o novo bounty
outro
logEvent("O jogador com maior nível já é a cabeça a prêmio.")
fim
outro
logEvent("Nenhum jogador encontrado para ser a cabeça a prêmio.")
fim
fim
-- Função para dar um item e ouro para cada membro do grupo
função local giveItemToGroup(jogador)
grupo local = player:getGroup()
se grupo e #group:getMembers() > 1 então
para _, membro em ipairs(group:getMembers()) faça
se membro:getFreeCapacity() >= ItemType(rewardItemID):getWeight() então
-- Dar o item
item localAdded = membro:addItem(rewardItemID, 1)
se itemAdicionado então
member:sendTextMessage(MESSAGE_INFO_DESCR, "Você recebeu um item especial pela recompensa!")
logEvent("Item dado com sucesso: " .. member:getName() .. " recebeu 1 item (ID " .. RewardItemID .. ").")
outro
member:sendTextMessage(MESSAGE_INFO_DESCR, "Erro ao tentar adicionar o item ao seu inventário.")
logEvent("Falha ao adicionar item: " .. member:getName() .. " não recebeu o item (ID " .. rewardItemID .. ").")
fim
-- Dar ouro
membro:addMoney(baseBountyReward)
member:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Você recebeu %d de ouro pela recompensa!", baseBountyReward))
logEvent("Ouro dado com sucesso: " .. member:getName() .. " recebido " .. baseBountyReward .. " de ouro.")
outro
member:sendTextMessage(MESSAGE_INFO_DESCR, "Você não tem espaço suficiente no inventário para receber o item.")
logEvent("Falha ao dar item: " .. member:getName() .. " sem espaço no inventário.")
fim
fim
outro
se jogador:getFreeCapacity() >= ItemType(rewardItemID):getWeight() então
-- Dar o item
item localAdded = jogador:addItem(rewardItemID, 1)
se itemAdicionado então
player:sendTextMessage(MESSAGE_INFO_DESCR, "Você recebeu um item especial pela recompensa!")
logEvent("Item dado com sucesso: " .. player:getName() .. " recebeu 1 item (ID " .. recompenseItemID .. ").")
outro
player:sendTextMessage(MESSAGE_INFO_DESCR, "Erro ao tentar adicionar o item ao seu inventário.")
logEvent("Falha ao adicionar item: " .. player:getName() .. " não recebeu o item (ID " .. RewardItemID .. ").")
fim
-- Dar ouro
jogador:addMoney(baseBountyReward)
player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Você recebeu %d de ouro pela recompensa!", baseBountyReward))
logEvent("Ouro dado com sucesso: " .. player:getName() .. " recebido " .. baseBountyReward .. " de ouro.")
outro
player:sendTextMessage(MESSAGE_INFO_DESCR, "Você não tem espaço suficiente no inventário para receber o item.")
logEvent("Falha ao dar item: " .. player:getName() .. " sem espaço no inventário.")
fim
fim
fim
-- Função chamada ao jogador morrer
função onDeath(criatura, cadáver, assassino, mostDamageKiller)
se não criatura:isPlayer() então
return true -- Ignorar criaturas que não são jogadores
fim
se criatura == bountyPlayer então
logEvent(string.format("O jogador com a cabeça a prêmio (%s) foi morto por %s.", criatura:getName(), killer e killer:getName() or "desconhecido"))
-- Verifique se o killer é um jogador válido
se assassino e assassino:isPlayer() então
logEvent(string.format("Recompensa sendo atribuída a %s por matar o bounty.", killer:getName()))
giveItemToGroup(assassino)
elseif mostDamageKiller e mostDamageKiller:isPlayer() então
logEvent(string.format("Recompensa sendo atribuída a %s por maior dano no bounty.", mostDamageKiller:getName()))
giveItemToGroup(matarmaisdanos)
outro
logEvent("Nenhum jogador identificado como responsável pela morte do bounty.")
fim
bountyPlayer = nulo
atualizarRecompensa()
outro
logEvent(string.format("O jogador %s morreu, mas não era a cabeça a prêmio.", criatura:getName()))
fim
retornar verdadeiro
fim
-- Configure o intervalo para verificar o jogador com o nível mais alto
função onThink(intervalo)
logEvent("Intervalo de seleção iniciado.")
atualizarRecompensa()
retornar verdadeiro
fim
-- Registrar os eventos
função onStartup()
logEvent("Sistema Bounty Hunter iniciado.")
addEvent(onThink, intervalo de verificação atual * 60 * 1000, intervalo de verificação atual * 60 * 1000)
fim
-- Iniciar o sistema
na inicialização()
_G.updateBounty = atualizarBounty
_G.setCheckInterval = função(novoIntervalo)
currentCheckInterval = novoIntervalo
logEvent("Intervalo de seleção alterado para " .. newInterval .. " minutos.")
fim
Attachments
-
bounty_hunter.lua9.3 KB · Views: 0 · VirusTotal