2018-10-23 19:51:19 +03:00
|
|
|
playerphysics = {}
|
2018-05-07 20:40:30 +03:00
|
|
|
|
2019-02-11 19:45:42 +03:00
|
|
|
local function calculate_attribute_product(player, attribute)
|
2019-03-06 07:45:16 +03:00
|
|
|
local a = minetest.deserialize(player:get_meta():get_string("playerphysics:physics"))
|
2018-05-07 20:40:30 +03:00
|
|
|
local product = 1
|
2019-02-11 19:45:42 +03:00
|
|
|
if a == nil or a[attribute] == nil then
|
2018-05-07 20:40:30 +03:00
|
|
|
return product
|
|
|
|
end
|
2019-02-11 19:45:42 +03:00
|
|
|
local factors = a[attribute]
|
2018-05-07 20:40:30 +03:00
|
|
|
if type(factors) == "table" then
|
2019-02-11 19:45:42 +03:00
|
|
|
for _, factor in pairs(factors) do
|
2018-05-07 20:40:30 +03:00
|
|
|
product = product * factor
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return product
|
|
|
|
end
|
|
|
|
|
2019-02-11 19:45:42 +03:00
|
|
|
function playerphysics.add_physics_factor(player, attribute, id, value)
|
2019-03-06 07:45:16 +03:00
|
|
|
local meta = player:get_meta()
|
|
|
|
local a = minetest.deserialize(meta:get_string("playerphysics:physics"))
|
2018-05-07 20:40:30 +03:00
|
|
|
if a == nil then
|
2019-02-11 19:45:42 +03:00
|
|
|
a = { [attribute] = { [id] = value } }
|
|
|
|
elseif a[attribute] == nil then
|
|
|
|
a[attribute] = { [id] = value }
|
2018-05-07 20:40:30 +03:00
|
|
|
else
|
2019-02-11 19:45:42 +03:00
|
|
|
a[attribute][id] = value
|
2018-05-07 20:40:30 +03:00
|
|
|
end
|
2019-03-06 07:45:16 +03:00
|
|
|
meta:set_string("playerphysics:physics", minetest.serialize(a))
|
2019-02-11 19:45:42 +03:00
|
|
|
local raw_value = calculate_attribute_product(player, attribute)
|
|
|
|
player:set_physics_override({[attribute] = raw_value})
|
2018-05-07 20:40:30 +03:00
|
|
|
end
|
|
|
|
|
2019-02-11 19:45:42 +03:00
|
|
|
function playerphysics.remove_physics_factor(player, attribute, id)
|
2019-03-06 07:45:16 +03:00
|
|
|
local meta = player:get_meta()
|
|
|
|
local a = minetest.deserialize(meta:get_string("playerphysics:physics"))
|
2019-02-11 19:45:42 +03:00
|
|
|
if a == nil or a[attribute] == nil then
|
2018-05-07 20:40:30 +03:00
|
|
|
-- Nothing to remove
|
|
|
|
return
|
|
|
|
else
|
2019-02-11 19:45:42 +03:00
|
|
|
a[attribute][id] = nil
|
2018-05-07 20:40:30 +03:00
|
|
|
end
|
2019-03-06 07:45:16 +03:00
|
|
|
meta:set_string("playerphysics:physics", minetest.serialize(a))
|
2019-02-11 19:45:42 +03:00
|
|
|
local raw_value = calculate_attribute_product(player, attribute)
|
|
|
|
player:set_physics_override({[attribute] = raw_value})
|
2018-05-07 20:40:30 +03:00
|
|
|
end
|