From f611843dbb7d2af218e79cc37c481e159b32649d Mon Sep 17 00:00:00 2001 From: upsilon Date: Thu, 18 May 2017 19:58:32 +0200 Subject: [PATCH] Add immobility detection --- README.md | 1 + tournament.lua | 24 ++++++++++++++++++++++++ tournament_commands.lua | 6 +++++- tournament_motionless.lua | 24 ++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 tournament_motionless.lua diff --git a/README.md b/README.md index e5e5cc4..8bef7b4 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ pvpplus.teleport_engaged_players() -- Teleport engaged players to the tournament pvpplus.remove_from_tournament(player_name) -- Remove a player from the current tournament pvpplus.add_to_tournament(player_name) -- Add a player to the current tournament pvpplus.is_playing_tournament(player_name) -- Is this player playing in the current tournament ? +pvpplus.get_tournament_players() -- Return tournament players, engaged players or nil, depending on the tournament state pvpplus.is_running_tournament() -- Is there a tournament currently running ? pvpplus.get_score(player_name) -- Returns the player current score diff --git a/tournament.lua b/tournament.lua index 589a47e..6c3fd58 100644 --- a/tournament.lua +++ b/tournament.lua @@ -14,6 +14,8 @@ pvpplus.tournament = { sound_handles = {}, starting_infos = {starter = nil, open_time = nil, start_time = nil, initially_engaged_players = nil}, broadcast_messages = false, + damage_motionless = false, + motion_table = {}, } local tournament = pvpplus.tournament -- Shortcut reference @@ -115,6 +117,7 @@ function pvpplus.start_tournament() tournament.sent_damages[player] = 0 tournament.received_damages[player] = 0 tournament.kills[player] = 0 + tournament.motion_table[player] = {pos = minetest.get_player_by_name(player):get_pos(), time = os.time()} chat_message = chat_message .. player .. ", " @@ -261,6 +264,8 @@ function pvpplus.stop_tournament() sound_handles = {}, starting_infos = {starter = nil, open_time = nil, start_time = nil, initially_engaged_players = nil}, broadcast_messages = false, + damage_motionless = false, + motion_table = {}, } -- Change the player transfer distance back @@ -339,6 +344,7 @@ function pvpplus.add_to_tournament(player_name) tournament.received_damages[player_name] = 0 tournament.kills[player_name] = 0 tournament.previous_pvp_states[player_name] = pvpplus.is_pvp(player_name) + tournament.motion_table[player] = {pos = minetest.get_player_by_name(player):get_pos(), time = os.time()} -- Enable PvP pvpplus.pvp_enable(player_name) @@ -358,6 +364,23 @@ function pvpplus.is_playing_tournament(player_name) end end +function pvpplus.get_tournament_players() + local t = {} + if pvpplus.is_running_tournament() then + for name, _ in pairs(tournament.players) do + table.insert(t, minetest.get_player_by_name(name)) + end + elseif pvpplus.is_engaging_players() then + for name, _ in pairs(tournament.engaged_players) do + table.insert(t, minetest.get_player_by_name(name)) + end + else + t = nil + end + + return t +end + function pvpplus.is_running_tournament() return tournament.running_tournament end @@ -417,3 +440,4 @@ end) dofile(minetest.get_modpath(minetest.get_current_modname()).."/tournament_commands.lua") dofile(minetest.get_modpath(minetest.get_current_modname()).."/tournament_hud.lua") +dofile(minetest.get_modpath(minetest.get_current_modname()).."/tournament_motionless.lua") diff --git a/tournament_commands.lua b/tournament_commands.lua index 89b1531..732e80c 100644 --- a/tournament_commands.lua +++ b/tournament_commands.lua @@ -120,7 +120,8 @@ minetest.register_chatcommand("tournament_info", { "\nThe tournament will start in: " .. os.difftime(tournament.starting_infos.start_time, os.time()) .. " seconds\n" .. "The tournament is open since: " .. os.date("%c", tournament.starting_infos.open_time) .. (tournament.engagement_position and "\nEngaged players will be teleported before the tournament starts.\n" or "\nEngaged players won't be teleported.\n") .. - "Currently engaged players are: " + (tournament.damage_motionless and "Motionless players will be automatically damaged." or "Motionless players won't be damaged.") .. + "\nCurrently engaged players are: " for player, _ in pairs(tournament.engaged_players) do str = str .. player .. ", " end @@ -131,6 +132,7 @@ minetest.register_chatcommand("tournament_info", { local str = "There is a currrently running tournament.\n" .. "The tournament was open by: " .. tournament.starting_infos.starter .. "\nThe tournament is running since: " .. os.date("%c", tournament.starting_infos.start_time) .. + (tournament.damage_motionless and "\nMotionless players are automatically damaged." or "\nMotionless players are not damaged.") .. "\nInitially engaged players were: " for player, _ in pairs(tournament.starting_infos.initially_engaged_players) do str = str .. player .. ", " @@ -180,6 +182,7 @@ local param_list = { noteleport = {false, nil}, start_delay = {false, "number"}, broadcast = {true, nil}, + damage_motionless = {false, nil}, } local function parse_params(param, name) @@ -241,6 +244,7 @@ minetest.register_chatcommand("tournament", { end local teleport = params.noteleport ~= true tournament.broadcast_messages = params.broadcast or false + tournament.damage_motionless = params.damage_motionless or false -- Fill start infos tournament.starting_infos.starter = name diff --git a/tournament_motionless.lua b/tournament_motionless.lua new file mode 100644 index 0000000..ca6f28f --- /dev/null +++ b/tournament_motionless.lua @@ -0,0 +1,24 @@ +local MAX_TIME_MOTIONLESS = 7 -- seconds +local HP_PER_HIT = 2 + +minetest.register_globalstep(function(dtime) + if not pvpplus.is_running_tournament() or not pvpplus.tournament.damage_motionless then + return + end + + for _, player in ipairs(pvpplus.get_tournament_players()) do + local pos = vector.round(player:get_pos()) + local table_entry = pvpplus.tournament.motion_table[player:get_player_name()] + print(dump(table_entry)) + if vector.equals(pos, table_entry.pos) then + if os.difftime(os.time(), table_entry.time) > MAX_TIME_MOTIONLESS then + minetest.chat_send_player(player:get_player_name(), "Move!") + player:set_hp(player:get_hp() - HP_PER_HIT) + table_entry.time = table_entry.time + 1 -- hit each second + end + else + table_entry.pos = pos + table_entry.time = os.time() + end + end +end)