1 local S
= minetest
.get_translator("mcl_void_damage")
2 local enable_damage
= minetest
.settings
:get_bool("enable_damage")
5 local VOID_DAMAGE_FREQ
= 0.5
8 -- Remove entities that fall too deep into the void
9 minetest
.register_on_mods_loaded(function()
10 -- We do this by overwriting on_step of all entities
11 for entitystring
, def
in pairs(minetest
.registered_entities
) do
12 local on_step_old
= def
.on_step
13 if not on_step_old
then
14 on_step_old
= function() end
16 local on_step
= function(self
, dtime
, moveresult
)
17 on_step_old(self
, dtime
, moveresult
)
18 local obj
= self
.object
19 local pos
= obj
:get_pos()
20 -- Old on_step function might have deleted object,
26 if not self
._void_timer
then
29 self
._void_timer
= self
._void_timer
+ dtime
30 if self
._void_timer
<= VOID_DAMAGE_FREQ
then
35 local pos
= obj
:get_pos()
36 local void
, void_deadly
= mcl_worlds
.is_in_void(pos
)
38 local ent
= obj
:get_luaentity()
44 minetest
.register_entity(":"..entitystring
, def
)
48 -- Hurt players or teleport them back to spawn if they are too deep in the void
49 minetest
.register_globalstep(function(dtime
)
50 voidtimer
= voidtimer
+ dtime
51 if voidtimer
> VOID_DAMAGE_FREQ
then
53 local enable_damage
= minetest
.settings
:get_bool("enable_damage")
54 local players
= minetest
.get_connected_players()
56 local player
= players
[p
]
57 local pos
= player
:get_pos()
58 local void
, void_deadly
= mcl_worlds
.is_in_void(pos
)
60 local immortal_val
= player
:get_armor_groups().immortal
61 local is_immortal
= false
62 if immortal_val
and immortal_val
> 0 then
65 if is_immortal
or not enable_damage
then
66 -- If damage is disabled, we can't kill players.
67 -- So we just teleport the player back to spawn.
68 local spawn
= mcl_spawn
.get_spawn_pos(player
)
70 mcl_worlds
.dimension_change(player
, mcl_worlds
.pos_to_dimension(spawn
))
71 minetest
.chat_send_player(player
:get_player_name(), S("The void is off-limits to you!"))
72 elseif enable_damage
and not is_immortal
then
73 -- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds)
74 if player
:get_hp() > 0 then
75 mcl_death_messages
.player_damage(player
, S("@1 fell into the endless void.", player
:get_player_name()))
76 player
:set_hp(player
:get_hp() - VOID_DAMAGE
)