From e36d3209773f3e33a95c6c76863ccfe50a4a897e Mon Sep 17 00:00:00 2001 From: Zughy <4279489-marco_a@users.noreply.gitlab.com> Date: Fri, 13 Nov 2020 20:41:32 +0000 Subject: [PATCH] Bugfix: LMB release wasn't being tracked when pressed too fast --- bl_weapons/weapons.lua | 45 ++++++++++++++++++++++++++++++++++++++++-- input_manager.lua | 15 ++++---------- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/bl_weapons/weapons.lua b/bl_weapons/weapons.lua index 6e2737e..58a0396 100644 --- a/bl_weapons/weapons.lua +++ b/bl_weapons/weapons.lua @@ -132,6 +132,30 @@ end +function block_league.shoot_end(player, weapon) + + local p_name = player:get_player_name() + local arena = arena_lib.get_arena_by_player(p_name) + local p_meta = player:get_meta() + + p_meta:set_int("bl_is_shooting", 0) + + minetest.after(0.5, function() + if not arena_lib.is_player_in_arena(p_name, "block_league") + or arena.players[p_name].energy == 0 + or p_meta:get_int("bl_reloading") == 1 + or p_meta:get_int("bl_is_shooting") == 1 + then return end + + player:set_physics_override({ + speed = block_league.SPEED, + jump = 1.5 + }) + end) +end + + + -- ritorna un array di giocatori con il numero di giocatori trovati a indice 1. -- Se non trova giocatori diversi da se stesso ritorna nil function block_league.get_pointed_players(head_pos, dir, range, user, particle, has_piercing) @@ -317,6 +341,24 @@ function weapon_left_click(weapon, player, pointed_thing) jump = 1.5 }) end + + if weapon.type ~= 3 then + player:get_meta():set_int("bl_is_shooting", 1) + end + + -- controls.register_on_release non funziona se un tasto viene premuto E rilasciato + -- sullo stesso step. Quindi, quando questo fallisce (perché il giocatore è stato + -- troppo veloce), interviene l'after seguente che ricontrolla lo stato del tasto sx + -- sullo step subito successivo. Il metadato bl_is_shooting è usato come sistema di + -- verifica (attivato quando si spara con successo e disattivato quando si rilascia). + -- Se il tasto sx è stato rilasciato ma bl_is_shooting è ancora 1, vuol dire che + -- register_on_release ha fallito e c'è bisogno di intervenire chiamando la funzione + -- di rilascio + minetest.after(0.1, function() + if not player:get_player_control().LMB and player:get_meta():get_int("bl_is_shooting") == 1 then + block_league.shoot_end(player, weapon) + end + end) end @@ -471,12 +513,11 @@ end function check_weapon_type_and_attack(player, weapon, pointed_thing) if weapon.weapon_type ~= 3 then - local bullet = weapon.bullet or nil if weapon.weapon_type == 1 then block_league.shoot_hitscan(player, weapon, pointed_thing) elseif weapon.weapon_type == 2 then - block_league.shoot_bullet(player, bullet, pointed_thing) + block_league.shoot_bullet(player, weapon.bullet, pointed_thing) end else diff --git a/input_manager.lua b/input_manager.lua index 85c8c91..693165e 100644 --- a/input_manager.lua +++ b/input_manager.lua @@ -43,17 +43,10 @@ controls.register_on_release(function(player, key) elseif key == "LMB" then local weapon_name = player:get_wielded_item():get_name() - local weap_def = minetest.registered_nodes[weapon_name] - local arena = arena_lib.get_arena_by_player(p_name) + local weapon = minetest.registered_nodes[weapon_name] - if not weap_def or not weap_def.slow_down_when_firing then return end + if not weapon.type or weapon.type == 3 or player:get_meta():get_int("bl_is_shooting") == 0 then return end - minetest.after(0.5, function() - if not arena_lib.is_player_in_arena(p_name, "block_league") or arena.players[p_name].energy == 0 or player:get_meta():get_int("bl_reloading") == 1 then return end - player:set_physics_override({ - speed = block_league.SPEED, - jump = 1.5 - }) - end) - end + block_league.shoot_end(player, weapon) + end end)