Add moveresult variable passing to on_step() of mob entity, https://git.minetest...
[MineClone/MineClone2.git] / mods / ENVIRONMENT / mcl_void_damage / init.lua
blobbdd60508f65346a6d919dd35039ccc103b1864ac
1 local S = minetest.get_translator("mcl_void_damage")
2 local enable_damage = minetest.settings:get_bool("enable_damage")
4 local voidtimer = 0
5 local VOID_DAMAGE_FREQ = 0.5
6 local VOID_DAMAGE = 4
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
15 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,
21 -- so we delete it
22 if not pos then
23 return
24 end
26 if not self._void_timer then
27 self._void_timer = 0
28 end
29 self._void_timer = self._void_timer + dtime
30 if self._void_timer <= VOID_DAMAGE_FREQ then
31 return
32 end
33 self._void_timer = 0
35 local pos = obj:get_pos()
36 local void, void_deadly = mcl_worlds.is_in_void(pos)
37 if void_deadly then
38 local ent = obj:get_luaentity()
39 obj:remove()
40 return
41 end
42 end
43 def.on_step = on_step
44 minetest.register_entity(":"..entitystring, def)
45 end
46 end)
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
52 voidtimer = 0
53 local enable_damage = minetest.settings:get_bool("enable_damage")
54 local players = minetest.get_connected_players()
55 for p=1, #players do
56 local player = players[p]
57 local pos = player:get_pos()
58 local void, void_deadly = mcl_worlds.is_in_void(pos)
59 if void_deadly then
60 local immortal_val = player:get_armor_groups().immortal
61 local is_immortal = false
62 if immortal_val and immortal_val > 0 then
63 is_immortal = true
64 end
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)
69 player:set_pos(spawn)
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)
77 end
78 end
79 end
80 end
81 end
82 end)