forked from VoxeLibre/VoxeLibre
mcl_util player globalstep API rewrite
This commit is contained in:
parent
79e1e2fa8f
commit
19ded9650b
|
@ -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)`
|
|
@ -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)
|
|
@ -1,3 +1,5 @@
|
||||||
|
local modpath = minetest.get_modpath("mcl_util")
|
||||||
|
|
||||||
mcl_util = {}
|
mcl_util = {}
|
||||||
|
|
||||||
-- Updates all values in t using values from to*.
|
-- Updates all values in t using values from to*.
|
||||||
|
@ -569,3 +571,5 @@ function mcl_util.replace_mob(obj, mob)
|
||||||
obj:set_yaw(rot)
|
obj:set_yaw(rot)
|
||||||
return obj
|
return obj
|
||||||
end
|
end
|
||||||
|
|
||||||
|
dofile(modpath.."/globalstep.lua")
|
|
@ -51,37 +51,40 @@ minetest.register_on_mods_loaded(function()
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- Hurt players or teleport them back to spawn if they are too deep in the void
|
|
||||||
minetest.register_globalstep(function(dtime)
|
mcl_util.register_player_globalstep({
|
||||||
voidtimer = voidtimer + dtime
|
before = function(dtime)
|
||||||
if voidtimer > VOID_DAMAGE_FREQ then
|
voidtimer = voidtimer + dtime
|
||||||
voidtimer = 0
|
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 enable_damage = minetest.settings:get_bool("enable_damage")
|
||||||
local players = get_connected()
|
local _, void_deadly = is_in_void(player.object:get_pos())
|
||||||
for p=1, #players do
|
if void_deadly then
|
||||||
local player = players[p]
|
local immortal_val = player.object:get_armor_groups().immortal
|
||||||
local pos = player:get_pos()
|
local is_immortal = false
|
||||||
local _, void_deadly = is_in_void(pos)
|
if immortal_val and immortal_val > 0 then
|
||||||
if void_deadly then
|
is_immortal = true
|
||||||
local immortal_val = player:get_armor_groups().immortal
|
end
|
||||||
local is_immortal = false
|
if is_immortal or not enable_damage then
|
||||||
if immortal_val and immortal_val > 0 then
|
-- If damage is disabled, we can't kill players.
|
||||||
is_immortal = true
|
-- So we just teleport the player back to spawn.
|
||||||
end
|
local spawn = get_spawn_pos(player.object)
|
||||||
if is_immortal or not enable_damage then
|
player.object:set_pos(spawn)
|
||||||
-- If damage is disabled, we can't kill players.
|
dim_change(player.object, pos_to_dim(spawn))
|
||||||
-- So we just teleport the player back to spawn.
|
send_chat(player.name, S("The void is off-limits to you!"))
|
||||||
local spawn = get_spawn_pos(player)
|
elseif enable_damage and not is_immortal then
|
||||||
player:set_pos(spawn)
|
-- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds)
|
||||||
dim_change(player, pos_to_dim(spawn))
|
if player.object:get_hp() > 0 then
|
||||||
send_chat(player:get_player_name(), S("The void is off-limits to you!"))
|
mcl_util.deal_damage(player.object, VOID_DAMAGE, {type = "out_of_world"})
|
||||||
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
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
end)
|
--after = function(dtime) return true end,
|
||||||
|
})
|
|
@ -1,4 +1,4 @@
|
||||||
name = mcl_void_damage
|
name = mcl_void_damage
|
||||||
author = Wuzzy
|
author = Wuzzy
|
||||||
description = Deal damage to entities stuck in the deep void
|
description = Deal damage to entities stuck in the deep void
|
||||||
depends = mcl_worlds
|
depends = mcl_worlds, mcl_util
|
||||||
|
|
Loading…
Reference in New Issue