123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- -- global
- pova = {}
- -- local
- local pova_list = {}
- local min, max = math.min, math.max
- -- time each override loop runs, 0 to disable
- local pova_loop = minetest.settings:get_bool("pova_loop") or 1.0
- -- if enabled activate main loop that totals override list on timer
- 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)
- -- nil check
- if not name or not item then return end
- -- priority defaults to 50 when not included
- def.priority = tonumber(def.priority) or 50
- -- if same item is assigned with lower priority then change ignored
- if pova_list[name][item]
- and pova_list[name][item].priority
- and pova_list[name][item].priority > def.priority then
- return
- end
- pova_list[name][item] = def
- end
- pova.get_override = function(name, item)
- return pova_list[name][item]
- end
- pova.del_override = function(name, item)
- pova_list[name][item] = nil
- end
- pova.do_override = function(player)
- local name = player:get_player_name()
- -- 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
- -- set player table on join
- minetest.register_on_joinplayer(function(player)
- pova_list[ player:get_player_name() ] = {}
- pova.do_override(player)
- end)
- -- reset player table on respawn
- minetest.register_on_respawnplayer(function(player)
- pova_list[ player:get_player_name() ] = {}
- pova.do_override(player)
- end)
- -- blank player table on leave
- minetest.register_on_leaveplayer(function(player)
- pova_list[ player:get_player_name() ] = nil
- end)
- -- 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",
- 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})
- -- define changes that are added onto defaults
- 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})
- -- add new maximum for speed
- pova.add_override(name, "max", {speed = 2})
- -- add force value for gravity
- pova.add_override(name, "force", {gravity = 1.2})
- --= speed is now max 2, jump is min 3 and gravity forced to 1.2
- -- this wont get applied because priority is lower than 50
- pova.add_override(name, "force", {speed = 8, priority = 10})
- -- apply override
- pova.do_override(user)
- end,
- on_place = function(itemstack, user, pointed_thing)
- 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")
- pova.del_override(name, "default")
- -- apply override
- pova.do_override(user)
- end,
- })
|