From b19a4522e9661eb861a3b73d8e55b93aac5ec02a Mon Sep 17 00:00:00 2001 From: Zughy <4279489-marco_a@users.noreply.gitlab.com> Date: Tue, 31 Jan 2023 00:16:18 +0100 Subject: [PATCH] Dynamic spectate mode when following the ball --- src/arena_lib/arena_manager.lua | 50 +++++++++++++++++++++++++++------ src/modes/TD/ball.lua | 5 ++++ src/modes/game_main.lua | 6 ++++ 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/arena_lib/arena_manager.lua b/src/arena_lib/arena_manager.lua index db39902..5268e7b 100644 --- a/src/arena_lib/arena_manager.lua +++ b/src/arena_lib/arena_manager.lua @@ -138,6 +138,13 @@ arena_lib.on_death("block_league", function(arena, p_name, reason) else ball:detach() end + + -- reindirizza sulla palla gli spettatori + for sp_name, _ in pairs(arena_lib.get_player_spectators(p_name)) do + if arena.spectators[sp_name].was_following_ball then + arena_lib.spectate_target("block_league", arena, sp_name, "entity", "Ball") + end + end break end end @@ -184,16 +191,41 @@ end) -arena_lib.on_change_spectated_target("block_league", function(arena, sp_name, t_type, t_name, prev_type, prev_spectated) - if t_type ~= "player" then return end - -- ritardo di 0.1 perché on_join non è ancora stato chiamato, quindi non hanno ancora la HUD - minetest.after(0.1, function() - for _, weap_name in pairs(block_league.get_player_weapons(t_name)) do - block_league.HUD_weapons_update(arena, t_name, weap_name) +arena_lib.on_change_spectated_target("block_league", function(arena, sp_name, t_type, t_name, prev_type, prev_spectated, is_forced) + local sp_data = arena.spectators[sp_name] + + if t_type == "player" then + if is_forced and prev_type == "entity" then + sp_data.was_following_ball = true + elseif not is_forced and sp_data.was_following_ball then + sp_data.was_following_ball = false end - block_league.HUD_skill_update(sp_name) - block_league.HUD_stamina_update(arena, t_name) - end) + + -- ritardo di 0.1 perché on_join non è ancora stato chiamato, quindi non hanno ancora la HUD + minetest.after(0.1, function() + for _, weap_name in pairs(block_league.get_player_weapons(t_name)) do + block_league.HUD_weapons_update(arena, t_name, weap_name) + end + block_league.HUD_skill_update(sp_name) + block_league.HUD_stamina_update(arena, t_name) + end) + + elseif t_type == "entity" then + -- se al seguire la palla questa è in testa a qualcunə, segui quel qualcunə + local parent = arena_lib.get_spectate_entities("block_league", arena.name)[t_name].object:get_attach() + + if not is_forced and not sp_data.was_following_ball and parent then + arena_lib.spectate_target("block_league", arena, sp_name, "player", parent:get_player_name()) + sp_data.was_following_ball = true + end + + elseif t_type == "area" then + if is_forced and prev_type == "entity" then + sp_data.was_following_ball = true + elseif not is_forced and sp_data.was_following_ball then + sp_data.was_following_ball = false + end + end end) diff --git a/src/modes/TD/ball.lua b/src/modes/TD/ball.lua index 479db5b..6850822 100644 --- a/src/modes/TD/ball.lua +++ b/src/modes/TD/ball.lua @@ -161,6 +161,11 @@ function ball:attach(player) ball_obj:set_properties({textures={team_texture}}) ball_obj:set_animation({x=120,y=160}, 20, 0, true) -- smette di oscillare quando presa + local ball_spectators = arena_lib.get_target_spectators("block_league", arena.name, "entity", "Ball") + + for sp_name, sp_data in pairs(ball_spectators) do + arena_lib.spectate_target("block_league", arena, sp_name, "player", p_name) + end end diff --git a/src/modes/game_main.lua b/src/modes/game_main.lua index fe87555..d864705 100644 --- a/src/modes/game_main.lua +++ b/src/modes/game_main.lua @@ -92,4 +92,10 @@ end function load_ball(arena) minetest.forceload_block(arena.ball_spawn, true) minetest.add_entity(arena.ball_spawn,"block_league:ball",arena.name) + + for sp_name, sp_data in pairs(arena.spectators) do + if sp_data.was_following_ball then + arena_lib.spectate_target("block_league", arena, sp_name, "entity", "Ball") + end + end end