Add immobility detection
parent
22ee214912
commit
f611843dbb
|
@ -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
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue