From 7793e76890ee6ab06623ff8f7a4f0b44a18d29ac Mon Sep 17 00:00:00 2001 From: ANAND Date: Tue, 22 Sep 2020 21:20:27 +0530 Subject: [PATCH] physics: Add sanity checks and minor optimizations (#650) - Throw error if an unsupported attribute is encountered. - Throw errors for invalid function arguments. - Optimize out attributes with a value of 1. --- mods/other/physics/init.lua | 47 +++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/mods/other/physics/init.lua b/mods/other/physics/init.lua index 0c4fbcf..d758c64 100644 --- a/mods/other/physics/init.lua +++ b/mods/other/physics/init.lua @@ -1,6 +1,11 @@ physics = {} local players = {} +local default_overrides = { + speed = 1, + jump = 1, + gravity = 1 +} minetest.register_on_joinplayer(function(player) players[player:get_player_name()] = {} @@ -13,11 +18,7 @@ end) local function update(name) assert(players[name]) local player = minetest.get_player_by_name(name) - local override = { - speed = 1, - jump = 1, - gravity = 1 - } + local override = table.copy(default_overrides) for _, layer in pairs(players[name]) do for attr, val in pairs(layer) do @@ -28,20 +29,40 @@ local function update(name) player:set_physics_override(override) end -function physics.set(pname, name, modifiers) - if not players[pname] then +function physics.set(name, layer, modifiers) + -- Basic sanity checks + assert( + type(name) == "string" and type(layer) == "string" and type(modifiers) == "table", + "physics.set: Invalid function arguments!" + ) + + if not players[name] then return end - players[pname][name] = modifiers - update(pname) + for attr, val in pairs(modifiers) do + -- Throw error if an unsupported attribute is encountered + assert(default_overrides[attr], "physics: Unsupported attribute!") + + -- Remove an attribute if its value is 1 + if val == 1 then + modifiers[attr] = nil + end + end + + players[name][layer] = modifiers + update(name) end -function physics.remove(pname, name) - if not players[pname] then +function physics.remove(name, layer) + -- Basic sanity checks + assert(type(name) == "string" and type(layer) == "string", + "physics.remove: Invalid function arguments!") + + if not players[name] then return end - players[pname][name] = nil - update(pname) + players[name][layer] = nil + update(name) end