diff --git a/mods/CORE/mcl_util/API.md b/mods/CORE/mcl_util/API.md new file mode 100644 index 000000000..3fd5577fb --- /dev/null +++ b/mods/CORE/mcl_util/API.md @@ -0,0 +1,9 @@ +# mcl_util + +This mod provide several helper functions + +## Player Globalsteps + +This API aims to simplificate and speedup the creation of globalsteps itterating over online players. + +## `mcl_util.register_player_globalstep(def)` \ No newline at end of file diff --git a/mods/CORE/mcl_util/globalstep.lua b/mods/CORE/mcl_util/globalstep.lua new file mode 100644 index 000000000..36429e9c0 --- /dev/null +++ b/mods/CORE/mcl_util/globalstep.lua @@ -0,0 +1,42 @@ +local pairs = pairs +local table = table + +mcl_util.registered_player_globalsteps = {} + +local player_globalsteps = mcl_util.registered_player_globalsteps + +local function do_nothing() return true end + +function mcl_util.register_player_globalstep(def) + if not def.before then + def.before = do_nothing + end + if not def.after then + def.after = do_nothing + end + + table.insert(mcl_util.registered_player_globalsteps, {before=def.before, func=def.func, after=def.after}) +end + +minetest.register_globalstep(function(dtime) + local players_ref = minetest.get_connected_players() + local players = {} + for i = 1, #players_ref do + local player = players_ref[i] + table.insert(players, { + object = player, + inventory = player:get_inventory(), + name = player:get_player_name(), + controls = player:get_player_control(), + }) + end + + for i = 1, #player_globalsteps do + if player_globalsteps[i].before(dtime) then + for p = 1, #players do + player_globalsteps[i].func(players[p], dtime) + end + player_globalsteps[i].after(dtime) + end + end +end) \ No newline at end of file diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index d91c86f09..d9180eb8b 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -1,3 +1,5 @@ +local modpath = minetest.get_modpath("mcl_util") + mcl_util = {} -- Updates all values in t using values from to*. @@ -569,3 +571,5 @@ function mcl_util.replace_mob(obj, mob) obj:set_yaw(rot) return obj end + +dofile(modpath.."/globalstep.lua") \ No newline at end of file diff --git a/mods/ENVIRONMENT/mcl_void_damage/init.lua b/mods/ENVIRONMENT/mcl_void_damage/init.lua index 084028dd1..66d18508a 100644 --- a/mods/ENVIRONMENT/mcl_void_damage/init.lua +++ b/mods/ENVIRONMENT/mcl_void_damage/init.lua @@ -51,37 +51,40 @@ minetest.register_on_mods_loaded(function() end end) --- Hurt players or teleport them back to spawn if they are too deep in the void -minetest.register_globalstep(function(dtime) - voidtimer = voidtimer + dtime - if voidtimer > VOID_DAMAGE_FREQ then - voidtimer = 0 + +mcl_util.register_player_globalstep({ + before = function(dtime) + voidtimer = voidtimer + dtime + if voidtimer > VOID_DAMAGE_FREQ then + voidtimer = 0 + return true + else + return false + end + end, + func = function(player, dtime) local enable_damage = minetest.settings:get_bool("enable_damage") - local players = get_connected() - for p=1, #players do - local player = players[p] - local pos = player:get_pos() - local _, void_deadly = is_in_void(pos) - if void_deadly then - local immortal_val = player:get_armor_groups().immortal - local is_immortal = false - if immortal_val and immortal_val > 0 then - is_immortal = true - end - if is_immortal or not enable_damage then - -- If damage is disabled, we can't kill players. - -- So we just teleport the player back to spawn. - local spawn = get_spawn_pos(player) - player:set_pos(spawn) - dim_change(player, pos_to_dim(spawn)) - send_chat(player:get_player_name(), S("The void is off-limits to you!")) - elseif enable_damage and not is_immortal then - -- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds) - if player:get_hp() > 0 then - mcl_util.deal_damage(player, VOID_DAMAGE, {type = "out_of_world"}) - end + local _, void_deadly = is_in_void(player.object:get_pos()) + if void_deadly then + local immortal_val = player.object:get_armor_groups().immortal + local is_immortal = false + if immortal_val and immortal_val > 0 then + is_immortal = true + end + if is_immortal or not enable_damage then + -- If damage is disabled, we can't kill players. + -- So we just teleport the player back to spawn. + local spawn = get_spawn_pos(player.object) + player.object:set_pos(spawn) + dim_change(player.object, pos_to_dim(spawn)) + send_chat(player.name, S("The void is off-limits to you!")) + elseif enable_damage and not is_immortal then + -- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds) + if player.object:get_hp() > 0 then + mcl_util.deal_damage(player.object, VOID_DAMAGE, {type = "out_of_world"}) end end end - end -end) + end, + --after = function(dtime) return true end, +}) \ No newline at end of file diff --git a/mods/ENVIRONMENT/mcl_void_damage/mod.conf b/mods/ENVIRONMENT/mcl_void_damage/mod.conf index 1358e5217..ee26fda65 100644 --- a/mods/ENVIRONMENT/mcl_void_damage/mod.conf +++ b/mods/ENVIRONMENT/mcl_void_damage/mod.conf @@ -1,4 +1,4 @@ name = mcl_void_damage author = Wuzzy description = Deal damage to entities stuck in the deep void -depends = mcl_worlds +depends = mcl_worlds, mcl_util