init.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. -- global
  2. pova = {}
  3. -- local
  4. local pova_list = {}
  5. local min, max = math.min, math.max
  6. -- time each override loop runs, 0 to disable
  7. local pova_loop = minetest.settings:get_bool("pova_loop") or 1.0
  8. -- if enabled activate main loop that totals override list on timer
  9. if pova_loop > 0 then
  10. local timer = 0
  11. minetest.register_globalstep(function(dtime)
  12. timer = timer + dtime
  13. if timer < pova_loop then
  14. return
  15. end
  16. timer = 0
  17. -- loop through players and apply overrides
  18. for _,player in ipairs(minetest.get_connected_players()) do
  19. pova.do_override(player)
  20. end
  21. end)
  22. end
  23. -- global functions
  24. pova.add_override = function(name, item, def)
  25. -- nil check
  26. if not name or not item then return end
  27. -- priority defaults to 50 when not included
  28. def.priority = tonumber(def.priority) or 50
  29. -- if same item is assigned with lower priority then change ignored
  30. if pova_list[name][item]
  31. and pova_list[name][item].priority
  32. and pova_list[name][item].priority > def.priority then
  33. return
  34. end
  35. pova_list[name][item] = def
  36. end
  37. pova.get_override = function(name, item)
  38. return pova_list[name][item]
  39. end
  40. pova.del_override = function(name, item)
  41. pova_list[name][item] = nil
  42. end
  43. pova.do_override = function(player)
  44. local name = player:get_player_name()
  45. -- somehow player list is missing
  46. if not pova_list[name] then
  47. return
  48. end
  49. -- set base defaults
  50. local speed, jump, gravity = 1, 1, 1
  51. -- check for new defaults
  52. if pova_list[name]["default"] then
  53. speed = pova_list[name]["default"].speed or 1
  54. jump = pova_list[name]["default"].jump or 1
  55. gravity = pova_list[name]["default"].gravity or 1
  56. end
  57. -- loop through list of named overrides
  58. for id, var in pairs(pova_list[name]) do
  59. -- skip any custom names
  60. if var
  61. and id ~= "default"
  62. and id ~= "min"
  63. and id ~= "max"
  64. and id ~= "force" then
  65. -- add any additional changes
  66. speed = speed + (pova_list[name][id].speed or 0)
  67. jump = jump + (pova_list[name][id].jump or 0)
  68. gravity = gravity + (pova_list[name][id].gravity or 0)
  69. end
  70. end
  71. -- make sure total doesn't go below minimum values
  72. if pova_list[name]["min"] then
  73. speed = max(pova_list[name]["min"].speed or 0, speed)
  74. jump = max(pova_list[name]["min"].jump or 0, jump)
  75. gravity = max(pova_list[name]["min"].gravity or 0, gravity)
  76. end
  77. -- make sure total doesn't go above maximum values
  78. if pova_list[name]["max"] then
  79. speed = min(pova_list[name]["max"].speed or speed, speed)
  80. jump = min(pova_list[name]["max"].jump or jump, jump)
  81. gravity = min(pova_list[name]["max"].gravity or gravity, gravity)
  82. end
  83. -- force values (for things like sleeping in bed when speed is 0)
  84. if pova_list[name]["force"] then
  85. speed = pova_list[name]["force"].speed or speed
  86. jump = pova_list[name]["force"].jump or jump
  87. gravity = pova_list[name]["force"].gravity or gravity
  88. end
  89. -- for testing only
  90. if name == "singleplayer" then
  91. print ("speed: " .. speed .. " / jump: " .. jump .. " / gravity: " .. gravity)
  92. end
  93. -- set new overrides
  94. player:set_physics_override(speed, jump, gravity)
  95. end
  96. -- set player table on join
  97. minetest.register_on_joinplayer(function(player)
  98. pova_list[ player:get_player_name() ] = {}
  99. pova.do_override(player)
  100. end)
  101. -- reset player table on respawn
  102. minetest.register_on_respawnplayer(function(player)
  103. pova_list[ player:get_player_name() ] = {}
  104. pova.do_override(player)
  105. end)
  106. -- blank player table on leave
  107. minetest.register_on_leaveplayer(function(player)
  108. pova_list[ player:get_player_name() ] = nil
  109. end)
  110. -- axe tool to showcase features
  111. minetest.register_craftitem("pova:axe", {
  112. description = "Test Axe (left to apply, right to remove effects)",
  113. inventory_image = "default_tool_steelaxe.png",
  114. on_use = function(itemstack, user, pointed_thing)
  115. local name = user:get_player_name()
  116. -- set new defaults
  117. pova.add_override(name, "default", {speed = 2, jump = 3, gravity = 1})
  118. -- define changes that are added onto defaults
  119. pova.add_override(name, "test", {speed = 1, jump = -1, gravity = 0.5})
  120. --= speed is now 3, jump is 2 and gravity is 1.5
  121. -- set new minimum for jump
  122. pova.add_override(name, "min", {jump = 3})
  123. -- add new maximum for speed
  124. pova.add_override(name, "max", {speed = 2})
  125. -- add force value for gravity
  126. pova.add_override(name, "force", {gravity = 1.2})
  127. --= speed is now max 2, jump is min 3 and gravity forced to 1.2
  128. -- this wont get applied because priority is lower than 50
  129. pova.add_override(name, "force", {speed = 8, priority = 10})
  130. -- apply override
  131. pova.do_override(user)
  132. end,
  133. on_place = function(itemstack, user, pointed_thing)
  134. local name = user:get_player_name()
  135. -- remove changes
  136. pova.del_override(name, "min")
  137. pova.del_override(name, "max")
  138. pova.del_override(name, "force")
  139. pova.del_override(name, "test")
  140. pova.del_override(name, "default")
  141. -- apply override
  142. pova.do_override(user)
  143. end,
  144. })