make 'pova_loop' number for loop seconds, tweak and optimize code

This commit is contained in:
TenPlus1 2018-04-26 10:14:25 +01:00
parent 510a675175
commit c326eae353
2 changed files with 117 additions and 117 deletions

View File

@ -4,7 +4,7 @@ Pova gives mod makers a set of easy to use functions that safely apply overrides
## Settings ## 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 ## Functions
@ -45,3 +45,8 @@ pova.do_override(player)
- Added custom override names for special functions "default", "min", "max", "force" - Added custom override names for special functions "default", "min", "max", "force"
- Tweaked test axe to use new settings. - Tweaked test axe to use new settings.
### 0.4
- 'pova_loop' now contains loop timer in seconds, 0 to disable
- tweak and optimize code

227
init.lua
View File

@ -4,33 +4,35 @@ pova = {}
-- local -- local
local pova_list = {} local pova_list = {}
local min, max = math.min, math.max
-- do we want override loop enabled to apply changes every second? -- time each override loop runs, 0 to disable
local pova_loop = minetest.settings:get_bool("pova_loop") ~= false local pova_loop = minetest.settings:get_bool("pova_loop") or 1.0
-- main loop that runs and totals override list
-- set player table and defaults on join if pova_loop ~= 0 then
minetest.register_on_joinplayer(function(player)
pova_list[ player:get_player_name() ] = { local timer = 0
default = {speed = 1, jump = 1, gravity = 1},
min = {speed = 0, jump = 0, gravity = 0}} minetest.register_globalstep(function(dtime)
pova.do_override(player)
end) timer = timer + dtime
-- reset player table and defaults on respawn if timer < pova_loop then
minetest.register_on_respawnplayer(function(player) return
pova_list[ player:get_player_name() ] = { end
default = {speed = 1, jump = 1, gravity = 1},
min = {speed = 0, jump = 0, gravity = 0}} timer = 0
pova.do_override(player)
end) -- loop through players and apply overrides
for _,player in ipairs(minetest.get_connected_players()) do
-- blank player table on leave pova.do_override(player)
minetest.register_on_leaveplayer(function(player) end
pova_list[ player:get_player_name() ] = nil end)
end) end
-- global functions
pova.add_override = function(name, item, def) pova.add_override = function(name, item, def)
pova_list[name][item] = def pova_list[name][item] = def
end end
@ -47,115 +49,114 @@ pova.do_override = function(player)
local name = player:get_player_name() local name = player:get_player_name()
if name and pova_list[name] then -- somehow player list is missing
if not pova_list[name] then
-- check for new defaults return
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)
end 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 end
-- main counter that runs every second and totals override list (if enabled) -- set player table on join
if pova_loop then minetest.register_on_joinplayer(function(player)
pova_list[ player:get_player_name() ] = {}
pova.do_override(player)
end)
local timer = 0 -- reset player table on respawn
minetest.register_globalstep(function(dtime) minetest.register_on_respawnplayer(function(player)
pova_list[ player:get_player_name() ] = {}
pova.do_override(player)
end)
timer = timer + dtime -- blank player table on leave
minetest.register_on_leaveplayer(function(player)
-- every 1 second pova_list[ player:get_player_name() ] = nil
if timer < 1 then end)
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
-- axe tool to change defaults and add changes to table -- axe tool to showcase features
minetest.register_craftitem("pova:axe", { minetest.register_craftitem("pova:axe", {
description = "Test Axe (left to apply, right to remove effects)", description = "Test Axe (left to apply, right to remove effects)",
inventory_image = "default_tool_steelaxe.png", inventory_image = "default_tool_steelaxe.png",
liquids_pointable = true,
on_use = function(itemstack, user, pointed_thing) on_use = function(itemstack, user, pointed_thing)
local name = user:get_player_name() local name = user:get_player_name()
-- set new defaults -- set new defaults
pova.add_override(name, "default", { pova.add_override(name, "default", {speed = 2, jump = 3, gravity = 1})
speed = 2, jump = 3, gravity = 1.0})
-- define changes that are added onto defaults -- define changes that are added onto defaults
pova.add_override(name, "test", { pova.add_override(name, "test", {speed = 1, jump = -1, gravity = 0.5})
speed = 1, jump = -1, gravity = 0.5})
--= speed is now 3, jump is 2 and gravity is 1.5
-- set new minimum for jump -- set new minimum for jump
pova.add_override(name, "min", { pova.add_override(name, "min", {jump = 3})
jump = 3})
-- add new maximum for speed -- add new maximum for speed
pova.add_override(name, "max", { pova.add_override(name, "max", {speed = 2})
speed = 2})
-- add force value for gravity -- add force value for gravity
pova.add_override(name, "force", { pova.add_override(name, "force", {gravity = 1.2})
gravity = 1.2})
--= speed is now max 2, jump is min 3 and gravity forced to 1.2
-- apply override -- apply override
pova.do_override(user) pova.do_override(user)
@ -166,17 +167,11 @@ minetest.register_craftitem("pova:axe", {
local name = user:get_player_name() local name = user:get_player_name()
-- remove changes -- remove changes
pova.del_override(name, "min")
pova.del_override(name, "max") pova.del_override(name, "max")
pova.del_override(name, "force") pova.del_override(name, "force")
pova.del_override(name, "test") pova.del_override(name, "test")
pova.del_override(name, "default")
-- reset min for jump
pova.add_override(name, "min", {
jump = 0})
-- reset defaults
pova.add_override(name, "default", {
speed = 1, jump = 1, gravity = 1})
-- apply override -- apply override
pova.do_override(user) pova.do_override(user)