From da892007ccb5ed91fabf21ad1796d9e7f41de6b3 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 1 Apr 2018 12:58:17 +0100 Subject: [PATCH] Add bounties --- mods/ctf_bounties/depends.txt | 2 + mods/ctf_bounties/init.lua | 95 +++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 mods/ctf_bounties/depends.txt create mode 100644 mods/ctf_bounties/init.lua diff --git a/mods/ctf_bounties/depends.txt b/mods/ctf_bounties/depends.txt new file mode 100644 index 0000000..8b6a399 --- /dev/null +++ b/mods/ctf_bounties/depends.txt @@ -0,0 +1,2 @@ +ctf_stats +irc? diff --git a/mods/ctf_bounties/init.lua b/mods/ctf_bounties/init.lua new file mode 100644 index 0000000..a98762c --- /dev/null +++ b/mods/ctf_bounties/init.lua @@ -0,0 +1,95 @@ +local bountied_player = nil + +local function announce(name) + minetest.chat_send_player(name, + minetest.colorize("#fff326", "The next person to kill " .. bountied_player .. + " will receive 150 points!")) +end + +local function announce_all() + if bountied_player then + for _, player in pairs(minetest.get_connected_players()) do + if bountied_player ~= player:get_player_name() then + announce(player:get_player_name()) + end + end + end +end + +local function bounty_player(target) + if bountied_player then + minetest.chat_send_all("Player " .. bountied_player .. " no longer has a bounty on their head!") + end + + bountied_player = target + + if minetest.global_exists("irc") then + irc:say("Player " .. bountied_player .. " has a bounty on their head!") + end + minetest.after(0.1, announce_all) +end + +local function bounty_find_new_target() + local players = {} + for _, player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local pstat, mstat = ctf_stats.player(name) + pstat.name = name + pstat.color = nil + if pstat.score > 1000 and pstat.kills > pstat.deaths * 1.5 then + table.insert(players, pstat) + end + end + + if #players > 0 then + bounty_player(players[math.random(1, #players)].name) + end + + minetest.after(math.random(500, 1000), bounty_find_new_target) +end +minetest.after(math.random(500, 1000), bounty_find_new_target) + +minetest.register_on_leaveplayer(function(player) + if bountied_player == player:get_player_name() then + bountied_player = nil + end +end) + +minetest.register_on_joinplayer(function(player) + if bountied_player then + announce(player:get_player_name()) + end +end) + +ctf.register_on_killedplayer(function(victim, killer) + if victim == bountied_player then + local main, match = ctf_stats.player(killer) + if main and match then + main.score = main.score + 150 + match.score = match.score + 150 + ctf.needs_save = true + end + bountied_player = nil + + local msg = killer .. " has killed " .. victim .. " and received the prize!" + if minetest.global_exists("irc") then + irc:say(msg) + end + minetest.chat_send_all(msg) + end +end) + +minetest.register_privilege("bounty_admin") + +minetest.register_chatcommand("place_bounty", { + privs = { bounty_admin = true }, + func = function(name, target) + target = target:trim() + if not minetest.get_player_by_name(target) then + return false, target .. " is not online" + end + + bounty_player(target) + return true, "Put bounty on " .. target + end +})