From c326eae353e1efb7c5b771db9d44612136d37228 Mon Sep 17 00:00:00 2001 From: TenPlus1 Date: Thu, 26 Apr 2018 10:14:25 +0100 Subject: [PATCH] make 'pova_loop' number for loop seconds, tweak and optimize code --- README.md | 7 +- init.lua | 227 ++++++++++++++++++++++++++---------------------------- 2 files changed, 117 insertions(+), 117 deletions(-) diff --git a/README.md b/README.md index bc64bd1..d6aea9d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Pova gives mod makers a set of easy to use functions that safely apply overrides ## Settings -'pova_loop' setting is true by default and will calculate and set overrides once a second for each player. +'pova_loop' setting is 1.0 by default and will calculate and set overrides once a second for each player, set to 0.5 for every half a second etc. ## Functions @@ -45,3 +45,8 @@ pova.do_override(player) - Added custom override names for special functions "default", "min", "max", "force" - Tweaked test axe to use new settings. + +### 0.4 + + - 'pova_loop' now contains loop timer in seconds, 0 to disable + - tweak and optimize code diff --git a/init.lua b/init.lua index f1cff7b..3f0f21b 100644 --- a/init.lua +++ b/init.lua @@ -4,33 +4,35 @@ pova = {} -- local local pova_list = {} +local min, max = math.min, math.max --- do we want override loop enabled to apply changes every second? -local pova_loop = minetest.settings:get_bool("pova_loop") ~= false - - --- set player table and defaults on join -minetest.register_on_joinplayer(function(player) - pova_list[ player:get_player_name() ] = { - default = {speed = 1, jump = 1, gravity = 1}, - min = {speed = 0, jump = 0, gravity = 0}} - pova.do_override(player) -end) - --- reset player table and defaults on respawn -minetest.register_on_respawnplayer(function(player) - pova_list[ player:get_player_name() ] = { - default = {speed = 1, jump = 1, gravity = 1}, - min = {speed = 0, jump = 0, gravity = 0}} - pova.do_override(player) -end) - --- blank player table on leave -minetest.register_on_leaveplayer(function(player) - pova_list[ player:get_player_name() ] = nil -end) +-- time each override loop runs, 0 to disable +local pova_loop = minetest.settings:get_bool("pova_loop") or 1.0 + +-- main loop that runs and totals override list +if pova_loop ~= 0 then + + local timer = 0 + + minetest.register_globalstep(function(dtime) + + timer = timer + dtime + + if timer < pova_loop then + return + end + + timer = 0 + + -- loop through players and apply overrides + for _,player in ipairs(minetest.get_connected_players()) do + pova.do_override(player) + end + end) +end +-- global functions pova.add_override = function(name, item, def) pova_list[name][item] = def end @@ -47,115 +49,114 @@ pova.do_override = function(player) local name = player:get_player_name() - if name and pova_list[name] then - - -- check for new defaults - local speed = pova_list[name]["default"].speed or 1 - local jump = pova_list[name]["default"].jump or 1 - local gravity = pova_list[name]["default"].gravity or 1 - - -- loop through list of added overrides - for id, var in pairs(pova_list[name]) do - - -- skip any custom sets - if var - and id ~= "default" - and id ~= "min" - and id ~= "max" - and id ~= "force" then - - -- add any additional changes - speed = speed + (pova_list[name][id].speed or 0) - jump = jump + (pova_list[name][id].jump or 0) - gravity = gravity + (pova_list[name][id].gravity or 0) - end - end - - -- minimum checks - if pova_list[name]["min"] then - speed = math.max(pova_list[name]["min"].speed or speed, speed) - jump = math.max(pova_list[name]["min"].jump or jump, jump) - gravity = math.max(pova_list[name]["min"].gravity or gravity, gravity) - end - - -- maximum checks - if pova_list[name]["max"] then - speed = math.min(pova_list[name]["max"].speed or speed, speed) - jump = math.min(pova_list[name]["max"].jump or jump, jump) - gravity = math.min(pova_list[name]["max"].gravity or gravity, gravity) - end - - -- force values (for things like sleeping in bed) - if pova_list[name]["force"] then - speed = pova_list[name]["force"].speed or speed - jump = pova_list[name]["force"].jump or jump - gravity = pova_list[name]["force"].gravity or gravity - end - - -- for testing only - if name == "singleplayer" then - print ("speed: " .. speed .. " / jump: " .. jump .. " / gravity: " .. gravity) - end - - -- set new overrides - player:set_physics_override(speed, jump, gravity) + -- somehow player list is missing + if not pova_list[name] then + return end + + -- set base defaults + local speed, jump, gravity = 1, 1, 1 + + -- check for new defaults + if pova_list[name]["default"] then + speed = pova_list[name]["default"].speed or 1 + jump = pova_list[name]["default"].jump or 1 + gravity = pova_list[name]["default"].gravity or 1 + end + + -- loop through list of named overrides + for id, var in pairs(pova_list[name]) do + + -- skip any custom names + if var + and id ~= "default" + and id ~= "min" + and id ~= "max" + and id ~= "force" then + + -- add any additional changes + speed = speed + (pova_list[name][id].speed or 0) + jump = jump + (pova_list[name][id].jump or 0) + gravity = gravity + (pova_list[name][id].gravity or 0) + end + end + + -- make sure total doesn't go below minimum values + if pova_list[name]["min"] then + speed = max(pova_list[name]["min"].speed or 0, speed) + jump = max(pova_list[name]["min"].jump or 0, jump) + gravity = max(pova_list[name]["min"].gravity or 0, gravity) + end + + -- make sure total doesn't go above maximum values + if pova_list[name]["max"] then + speed = min(pova_list[name]["max"].speed or speed, speed) + jump = min(pova_list[name]["max"].jump or jump, jump) + gravity = min(pova_list[name]["max"].gravity or gravity, gravity) + end + + -- force values (for things like sleeping in bed when speed is 0) + if pova_list[name]["force"] then + speed = pova_list[name]["force"].speed or speed + jump = pova_list[name]["force"].jump or jump + gravity = pova_list[name]["force"].gravity or gravity + end + + -- for testing only + if name == "singleplayer" then + print ("speed: " .. speed .. " / jump: " .. jump .. " / gravity: " .. gravity) + end + + -- set new overrides + player:set_physics_override(speed, jump, gravity) end --- main counter that runs every second and totals override list (if enabled) -if pova_loop then +-- set player table on join +minetest.register_on_joinplayer(function(player) + pova_list[ player:get_player_name() ] = {} + pova.do_override(player) +end) - local timer = 0 - minetest.register_globalstep(function(dtime) +-- reset player table on respawn +minetest.register_on_respawnplayer(function(player) + pova_list[ player:get_player_name() ] = {} + pova.do_override(player) +end) - timer = timer + dtime - - -- every 1 second - if timer < 1 then - return - end - - -- reset time for next check - timer = 0 - - -- loop through players and apply overrides - for _,player in ipairs(minetest.get_connected_players()) do - pova.do_override(player) - end - end) -end +-- blank player table on leave +minetest.register_on_leaveplayer(function(player) + pova_list[ player:get_player_name() ] = nil +end) --- axe tool to change defaults and add changes to table +-- axe tool to showcase features minetest.register_craftitem("pova:axe", { description = "Test Axe (left to apply, right to remove effects)", inventory_image = "default_tool_steelaxe.png", - liquids_pointable = true, on_use = function(itemstack, user, pointed_thing) local name = user:get_player_name() -- set new defaults - pova.add_override(name, "default", { - speed = 2, jump = 3, gravity = 1.0}) + pova.add_override(name, "default", {speed = 2, jump = 3, gravity = 1}) -- define changes that are added onto defaults - pova.add_override(name, "test", { - speed = 1, jump = -1, gravity = 0.5}) + pova.add_override(name, "test", {speed = 1, jump = -1, gravity = 0.5}) + +--= speed is now 3, jump is 2 and gravity is 1.5 -- set new minimum for jump - pova.add_override(name, "min", { - jump = 3}) + pova.add_override(name, "min", {jump = 3}) -- add new maximum for speed - pova.add_override(name, "max", { - speed = 2}) + pova.add_override(name, "max", {speed = 2}) -- add force value for gravity - pova.add_override(name, "force", { - gravity = 1.2}) + pova.add_override(name, "force", {gravity = 1.2}) + +--= speed is now max 2, jump is min 3 and gravity forced to 1.2 -- apply override pova.do_override(user) @@ -166,17 +167,11 @@ minetest.register_craftitem("pova:axe", { local name = user:get_player_name() -- remove changes + pova.del_override(name, "min") pova.del_override(name, "max") pova.del_override(name, "force") pova.del_override(name, "test") - - -- reset min for jump - pova.add_override(name, "min", { - jump = 0}) - - -- reset defaults - pova.add_override(name, "default", { - speed = 1, jump = 1, gravity = 1}) + pova.del_override(name, "default") -- apply override pova.do_override(user)