Add immobility detection

master
upsilon 2017-05-18 19:58:32 +02:00
parent 22ee214912
commit f611843dbb
No known key found for this signature in database
GPG Key ID: A80DAE1F266E1C3C
4 changed files with 54 additions and 1 deletions

View File

@ -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

View File

@ -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")

View File

@ -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

24
tournament_motionless.lua Normal file
View File

@ -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)