Compare commits
10 Commits
fbe8c70971
...
6696e9ae09
Author | SHA1 | Date | |
---|---|---|---|
|
6696e9ae09 | ||
|
0de1209966 | ||
|
1c220e4d4b | ||
|
38ddab6045 | ||
|
c3a8a5da9f | ||
|
e9dd0aee6a | ||
|
68fff7c074 | ||
|
7ac306d9d3 | ||
|
71a5129952 | ||
|
8f87c142ae |
@ -1 +0,0 @@
|
||||
Pova gives mod makers a set of functions to safely apply overrides for player speed, jump height and gravity.
|
122
init.lua
122
init.lua
@ -1,15 +1,20 @@
|
||||
|
||||
-- global
|
||||
pova = {}
|
||||
|
||||
pova = {debug = false}
|
||||
|
||||
-- local
|
||||
|
||||
local pova_list = {}
|
||||
local min, max = math.min, math.max
|
||||
|
||||
-- time each override loop runs, 0 to disable
|
||||
-- override loop interval, 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
|
||||
-- when higher than 0, activate main loop that totals override list on a timer,
|
||||
-- incase we have any rogue mods that don't play well with player physics.
|
||||
|
||||
if pova_loop > 0 then
|
||||
|
||||
local timer = 0
|
||||
@ -18,32 +23,28 @@ if pova_loop > 0 then
|
||||
|
||||
timer = timer + dtime
|
||||
|
||||
if timer < pova_loop then
|
||||
return
|
||||
end
|
||||
if timer < pova_loop then return end
|
||||
|
||||
timer = 0
|
||||
|
||||
-- loop through players and apply overrides
|
||||
for _,player in ipairs(minetest.get_connected_players()) do
|
||||
for _,player in pairs(minetest.get_connected_players()) do
|
||||
pova.do_override(player)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
-- global functions
|
||||
pova.add_override = function(name, item, def)
|
||||
|
||||
-- nil check
|
||||
function pova.add_override(name, item, def)
|
||||
|
||||
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
|
||||
if pova_list[name][item] and pova_list[name][item].priority
|
||||
and pova_list[name][item].priority > def.priority then
|
||||
return
|
||||
end
|
||||
@ -51,108 +52,109 @@ pova.add_override = function(name, item, def)
|
||||
pova_list[name][item] = def
|
||||
end
|
||||
|
||||
pova.get_override = function(name, item)
|
||||
function pova.get_override(name, item)
|
||||
return pova_list[name][item]
|
||||
end
|
||||
|
||||
pova.del_override = function(name, item)
|
||||
pova_list[name][item] = nil
|
||||
function pova.del_override(name, item)
|
||||
if name and item and pova_list[name] then
|
||||
pova_list[name][item] = nil
|
||||
end
|
||||
end
|
||||
|
||||
pova.do_override = function(player)
|
||||
function pova.do_override(player)
|
||||
|
||||
local name = player:get_player_name()
|
||||
local name = player and player:get_player_name()
|
||||
|
||||
-- somehow player list is missing
|
||||
if not pova_list[name] then
|
||||
return
|
||||
end
|
||||
-- somehow player is missing on list
|
||||
if not name or not pova_list[name] then return end
|
||||
|
||||
-- store player override list
|
||||
local list = pova_list[name]
|
||||
|
||||
-- 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
|
||||
if list["default"] then
|
||||
speed = list["default"].speed or 1
|
||||
jump = list["default"].jump or 1
|
||||
gravity = list["default"].gravity or 1
|
||||
end
|
||||
|
||||
-- loop through list of named overrides
|
||||
for id, var in pairs(pova_list[name]) do
|
||||
for id, var in pairs(list) do
|
||||
|
||||
-- skip any custom names
|
||||
if var
|
||||
and id ~= "default"
|
||||
and id ~= "min"
|
||||
and id ~= "max"
|
||||
and id ~= "force" then
|
||||
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)
|
||||
speed = speed + (list[id].speed or 0)
|
||||
jump = jump + (list[id].jump or 0)
|
||||
gravity = gravity + (list[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)
|
||||
if list["min"] then
|
||||
speed = max(list["min"].speed or 0, speed)
|
||||
jump = max(list["min"].jump or 0, jump)
|
||||
gravity = max(list["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)
|
||||
if list["max"] then
|
||||
speed = min(list["max"].speed or speed, speed)
|
||||
jump = min(list["max"].jump or jump, jump)
|
||||
gravity = min(list["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
|
||||
if list["force"] then
|
||||
speed = list["force"].speed or speed
|
||||
jump = list["force"].jump or jump
|
||||
gravity = list["force"].gravity or gravity
|
||||
end
|
||||
|
||||
-- for testing only
|
||||
if name == "singleplayer" then
|
||||
if pova.debug and name == "singleplayer" then
|
||||
print ("speed: " .. speed .. " / jump: " .. jump .. " / gravity: " .. gravity)
|
||||
end
|
||||
|
||||
-- set new overrides
|
||||
-- player:set_physics_override(speed, jump, gravity)
|
||||
player:set_physics_override({
|
||||
speed = speed,
|
||||
jump = jump,
|
||||
gravity = gravity
|
||||
})
|
||||
player:set_physics_override({speed = speed, jump = jump, gravity = 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)
|
||||
if player then
|
||||
pova_list[ player:get_player_name() ] = {}
|
||||
pova.do_override(player)
|
||||
end
|
||||
end)
|
||||
|
||||
-- blank player table on leave
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
pova_list[ player:get_player_name() ] = nil
|
||||
if player then
|
||||
pova_list[ player:get_player_name() ] = nil
|
||||
end
|
||||
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",
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
|
||||
@ -197,5 +199,7 @@ minetest.register_craftitem("pova:axe", {
|
||||
|
||||
-- apply override
|
||||
pova.do_override(user)
|
||||
end,
|
||||
end
|
||||
})
|
||||
|
||||
print("[MOD] Pova loaded")
|
||||
|
Loading…
x
Reference in New Issue
Block a user