New immunity system

This commit is contained in:
Zughy 2020-11-06 23:35:31 +01:00
parent 1d5f7a736b
commit af7f4e20a1
6 changed files with 21 additions and 40 deletions

View File

@ -27,14 +27,8 @@ end)
arena_lib.on_start("block_league", function(arena) arena_lib.on_start("block_league", function(arena)
for pl_name, stats in pairs(arena.players) do
minetest.get_player_by_name(pl_name):set_armor_groups({immortal = nil})
end
block_league.round_start(arena) block_league.round_start(arena)
block_league.energy_refill_loop(arena) block_league.energy_refill_loop(arena)
end) end)
@ -46,8 +40,6 @@ arena_lib.on_join("block_league", function(p_name, arena)
create_and_show_HUD(arena, p_name) create_and_show_HUD(arena, p_name)
block_league.refill_weapons(arena, p_name) block_league.refill_weapons(arena, p_name)
minetest.get_player_by_name(p_name):set_armor_groups({immortal = nil})
minetest.sound_play("bl_voice_fight", {to_player = p_name}) minetest.sound_play("bl_voice_fight", {to_player = p_name})
minetest.after(0.01, function() minetest.after(0.01, function()
@ -64,7 +56,7 @@ arena_lib.on_celebration("block_league", function(arena, winner_name)
arena.weapons_disabled = true arena.weapons_disabled = true
for pl_name, stats in pairs(arena.players) do for pl_name, stats in pairs(arena.players) do
minetest.get_player_by_name(pl_name):set_armor_groups({immortal=1}) minetest.get_player_by_name(pl_name):get_meta():set_int("bl_immunity", 1)
panel_lib.get_panel(pl_name, "bl_scoreboard"):show() panel_lib.get_panel(pl_name, "bl_scoreboard"):show()
end end
end) end)
@ -76,7 +68,7 @@ arena_lib.on_end("block_league", function(arena, players)
for pl_name, stats in pairs(players) do for pl_name, stats in pairs(players) do
remove_HUD(pl_name) remove_HUD(pl_name)
minetest.get_player_by_name(pl_name):set_armor_groups({immortal = nil}) reset_meta(pl_name)
block_league.update_storage(pl_name) block_league.update_storage(pl_name)
end end
@ -101,13 +93,8 @@ end)
arena_lib.on_quit("block_league", function(arena, p_name) arena_lib.on_quit("block_league", function(arena, p_name)
remove_HUD(p_name) remove_HUD(p_name)
reset_meta(p_name)
local player = minetest.get_player_by_name(p_name)
player:set_armor_groups({immortal = nil})
player:get_meta():set_int("bl_has_ball", 0)
end) end)
@ -120,14 +107,15 @@ end)
function reset_meta(p_name) function reset_meta(p_name)
local player = minetest.get_player_by_name(p_name) local p_meta = minetest.get_player_by_name(p_name):get_meta()
player:get_meta():set_int("bl_has_ball", 0) p_meta:set_int("bl_has_ball", 0)
player:get_meta():set_int("bl_weap_delay", 0) p_meta:set_int("bl_weap_delay", 0)
player:get_meta():set_int("bl_weap_secondary_delay", 0) p_meta:set_int("bl_weap_secondary_delay", 0)
player:get_meta():set_int("bl_bouncer_delay", 0) p_meta:set_int("bl_bouncer_delay", 0)
player:get_meta():set_int("bl_death_delay", 0) p_meta:set_int("bl_death_delay", 0)
player:get_meta():set_int("bl_reloading", 0) p_meta:set_int("bl_immunity", 0)
p_meta:set_int("bl_reloading", 0)
end end

View File

@ -1,23 +1,15 @@
function block_league.immunity(player) function block_league.immunity(player)
local p_name = player:get_player_name() local p_name = player:get_player_name()
local p_meta = player:get_meta()
local immunity_time = arena_lib.get_arena_by_player(p_name).immunity_time local immunity_time = arena_lib.get_arena_by_player(p_name).immunity_time
local immunity_ID = 0
player:set_armor_groups({immortal=1}) p_meta:set_int("bl_immunity", 1)
-- in caso uno spari, perda l'immunità, muoia subito e resusciti, il tempo d'immunità riparte da capo.
-- Ne tengo traccia con un metadato che comparo nell'after
immunity_ID = player:get_meta():get_int("bl_immunity_ID") + 1
player:get_meta():set_int("bl_immunity_ID", immunity_ID)
minetest.after(immunity_time, function() minetest.after(immunity_time, function()
if not arena_lib.is_player_in_arena(p_name, "block_league") then return end if not arena_lib.is_player_in_arena(p_name, "block_league") then return end
if immunity_ID == player:get_meta():get_int("bl_immunity_ID") then if p_meta:get_int("bl_immunity") == 1 then
if player:get_armor_groups().immortal and player:get_armor_groups().immortal == 1 then p_meta:set_int("bl_immunity", 0)
player:set_armor_groups({immortal = nil})
end
player:get_meta():set_int("bl_immunity_ID", 0)
end end
end) end)

View File

@ -33,7 +33,7 @@ minetest.register_tool("block_league:bouncer", {
local knockback = user:get_player_velocity().y < 1 and -15 or -10 local knockback = user:get_player_velocity().y < 1 and -15 or -10
user:add_player_velocity(vector.multiply(dir, knockback)) user:add_player_velocity(vector.multiply(dir, knockback))
minetest.sound_play("bl_bouncer", {to_player = p_name, max_hear_distance = 5}) minetest.sound_play("bl_bouncer", {to_player = p_name})
arena.players[p_name].energy = arena.players[p_name].energy - 20 arena.players[p_name].energy = arena.players[p_name].energy - 20
end, end,

View File

@ -229,6 +229,7 @@ function block_league.apply_damage(user, targets, damage, knockback, decrease_da
for _, target in pairs(targets) do for _, target in pairs(targets) do
if target:get_hp() <= 0 then return end if target:get_hp() <= 0 then return end
if target:get_meta():get_int("bl_immunity") == 1 then return end
local t_name = target:get_player_name() local t_name = target:get_player_name()
@ -423,8 +424,8 @@ end
function check_immunity(player) function check_immunity(player)
if player:get_armor_groups().immortal and player:get_armor_groups().immortal == 1 then if player:get_meta():get_int("bl_immunity") == 1 then
player:set_armor_groups({immortal = nil}) player:get_meta():set_int("bl_immunity", 0)
end end
end end

View File

@ -29,7 +29,7 @@ arena_lib.register_minigame("block_league", {
sneak_glitch = true, sneak_glitch = true,
new_move = true new_move = true
}, },
disabled_damage_types = {"fall"}, disabled_damage_types = {"fall", "punch"},
properties = { properties = {
-- 1 = Touchdown -- 1 = Touchdown

View File

@ -33,6 +33,7 @@ minetest.register_on_dieplayer(function(player)
if not arena_lib.is_player_in_arena(player:get_player_name(), "block_league") then return end if not arena_lib.is_player_in_arena(player:get_player_name(), "block_league") then return end
player:get_meta():set_int("bl_death_delay", 1) player:get_meta():set_int("bl_death_delay", 1)
block_league.immunity(player)
minetest.after(6, function() minetest.after(6, function()
if not player or not player:get_meta() then return end if not player or not player:get_meta() then return end
@ -57,7 +58,6 @@ minetest.register_on_respawnplayer(function(player)
block_league.energy_update(arena, p_name) block_league.energy_update(arena, p_name)
block_league.refill_weapons(arena, p_name) block_league.refill_weapons(arena, p_name)
block_league.immunity(player)
player:set_physics_override({ player:set_physics_override({
speed = block_league.SPEED, speed = block_league.SPEED,