From 721290085d00152569d8d5ed866f679b4adedf0a Mon Sep 17 00:00:00 2001 From: ANAND Date: Sun, 17 Mar 2019 07:20:27 +0530 Subject: [PATCH] Add physics modifiers wrapper mod for player physics overrides (#289) Closes #288 --- mods/other/sprint/depends.txt | 1 + mods/other/sprint/init.lua | 13 ++++++---- mods/physics/init.lua | 47 +++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 mods/physics/init.lua diff --git a/mods/other/sprint/depends.txt b/mods/other/sprint/depends.txt index 9f63eba..d594589 100644 --- a/mods/other/sprint/depends.txt +++ b/mods/other/sprint/depends.txt @@ -1,2 +1,3 @@ medkits +physics hudbars? diff --git a/mods/other/sprint/init.lua b/mods/other/sprint/init.lua index e9e5851..99747ea 100644 --- a/mods/other/sprint/init.lua +++ b/mods/other/sprint/init.lua @@ -7,10 +7,6 @@ local MOD_JUMP = tonumber(minetest.settings:get("sprint_jump") or 1.1) local STAMINA_MAX = tonumber(minetest.settings:get("sprint_stamina") or 20) local HEAL_RATE = tonumber(minetest.settings:get("sprint_heal_rate") or 0.5) local MIN_SPRINT = tonumber(minetest.settings:get("sprint_min") or 0.5) -local SPRINT_MODIFIERS = { - [true] = { speed = MOD_WALK, jump = MOD_JUMP }, - [false] = { speed = 1.0, jump = 1.0 }, -} if minetest.get_modpath("hudbars") ~= nil then hb.register_hudbar("sprint", 0xFFFFFF, "Stamina", @@ -27,7 +23,14 @@ local players = {} local function setSprinting(player, info, sprinting) if info.sprinting ~= sprinting then - player:set_physics_override(SPRINT_MODIFIERS[sprinting]) + if sprinting then + physics.set(player:get_player_name(), "sprint:sprint", { + speed = MOD_WALK, + jump = MOD_JUMP + }) + else + physics.remove(player:get_player_name(), "sprint:sprint") + end info.sprinting = sprinting end end diff --git a/mods/physics/init.lua b/mods/physics/init.lua new file mode 100644 index 0000000..f57bc30 --- /dev/null +++ b/mods/physics/init.lua @@ -0,0 +1,47 @@ +physics = {} + +local players = {} + +minetest.register_on_joinplayer(function(player) + players[player:get_player_name()] = {} +end) + +minetest.register_on_leaveplayer(function(player) + players[player:get_player_name()] = nil +end) + +local function update(name) + assert(players[name]) + local player = minetest.get_player_by_name(name) + local override = { + speed = 1, + jump = 1, + gravity = 1 + } + + for _, layer in pairs(players[name]) do + for attr, val in pairs(layer) do + override[attr] = override[attr] * val + end + end + + player:set_physics_override(override) +end + +function physics.set(pname, name, modifiers) + assert(players[pname] and not players[pname][name]) + players[pname][name] = modifiers + update(pname) +end + +function physics.change(pname, name, modifier) + assert(players[pname] and players[pname][name]) + players[pname][name] = modifier + update(pname) +end + +function physics.remove(pname, name) + assert(players[pname] and players[pname][name]) + players[pname][name] = nil + update(pname) +end