From 1aecdeb752865f78e3fec669a1603d5a9f35ce21 Mon Sep 17 00:00:00 2001 From: trans_soup <> Date: Fri, 13 Oct 2023 08:48:11 +0200 Subject: [PATCH] refactor: create general player interface. create utility function for acting on player properties, and refactor code for running and step height to make use of this. --- mods/bg_player/run.lua | 54 ++++++++++++++++------------------ mods/bg_player/step_height.lua | 9 +++--- mods/bg_player/util_misc.lua | 20 +++++++++++++ 3 files changed, 50 insertions(+), 33 deletions(-) create mode 100644 mods/bg_player/util_misc.lua diff --git a/mods/bg_player/run.lua b/mods/bg_player/run.lua index ad0846e..297c46a 100644 --- a/mods/bg_player/run.lua +++ b/mods/bg_player/run.lua @@ -1,3 +1,5 @@ +local utils = load_file("util_misc") + local walk_speed = 1 local walk_time = 2 local speedup_time = 6 @@ -9,40 +11,34 @@ local jump_factor = 1.5 local speed_data = {} local function handle_speed (player, delta_time) - speed_data[player] = speed_data[player] or {} - local data = speed_data[player] + utils.handle_player(player, function (player, p_data) + speed_data[player] = speed_data[player] or {} + local data = speed_data[player] - -- data.start = data.start or minetest.get_gametime() - data.duration = (data.duration or 0) + delta_time + data.duration = (data.duration or 0) + delta_time - local control = player:get_player_control() + local control = p_data.control + local moving = control.up or control.down or control.left or control.right + if not moving then + data.duration = data.duration - delta_time * (slowdown_factor + 1) + end + if data.duration < 0 then data.duration = 0 end + if data.duration > walk_time + speedup_time then data.duration = walk_time + speedup_time end - local moving = control.up or control.down or control.left or control.right - if not moving then - data.duration = data.duration - delta_time * (slowdown_factor + 1) - end - if data.duration < 0 then data.duration = 0 end - if data.duration > walk_time + speedup_time then data.duration = walk_time + speedup_time end + if data.duration < walk_time then + p_data.physics.speed = walk_speed + p_data.physics.jump = jump_height + else + local run_time = data.duration - walk_time + local t = run_time / speedup_time - local duration = data.duration + local factor = (run_factor - 1) * t + 1 + if factor > run_factor then factor = run_factor end - local physics = player:get_physics_override() - - if duration < walk_time then - physics.speed = walk_speed - physics.jump = jump_height - else - local run_time = duration - walk_time - local t = run_time / speedup_time - - local factor = (run_factor - 1) * t + 1 - if factor > run_factor then factor = run_factor end - - physics.speed = walk_speed * factor - physics.jump = jump_height + (jump_height * jump_factor - 1) * t - end - - player:set_physics_override(physics) + p_data.physics.speed = walk_speed * factor + p_data.physics.jump = jump_height + (jump_height * jump_factor - 1) * t + end + end) end minetest.register_globalstep(function(delta_time) diff --git a/mods/bg_player/step_height.lua b/mods/bg_player/step_height.lua index 54f643f..a1bc651 100644 --- a/mods/bg_player/step_height.lua +++ b/mods/bg_player/step_height.lua @@ -1,8 +1,9 @@ +local utils = load_file("util_misc") + minetest.register_globalstep(function(delta_time) for _, player in pairs(minetest.get_connected_players()) do - local control = player:get_player_control() - local properties = player:get_properties() - properties.stepheight = control.sneak and 0.01 or 1.05 - player:set_properties(properties) + utils.handle_player(player, function (_, data) + data.properties.stepheight = data.control.sneak and 0.01 or 1.05 + end) end end) diff --git a/mods/bg_player/util_misc.lua b/mods/bg_player/util_misc.lua new file mode 100644 index 0000000..03f44c2 --- /dev/null +++ b/mods/bg_player/util_misc.lua @@ -0,0 +1,20 @@ +local function handle_player (player, fn) + local data = {} + + data.control = player:get_player_control() + data.properties = player:get_properties() + data.physics = player:get_physics_override() + + local result = fn(player, data) + + player:set_properties(data.properties) + player:set_physics_override(data.physics) + + return result +end + + + +return { + handle_player = handle_player, +}