forked from VoxeLibre/VoxeLibre
Regularily damage and delete entities in void
This commit is contained in:
parent
ab38d55646
commit
48b7191af2
|
@ -0,0 +1,2 @@
|
||||||
|
mcl_worlds
|
||||||
|
mcl_death_messages
|
|
@ -0,0 +1 @@
|
||||||
|
Deal damage to entities stuck in the deep void
|
|
@ -0,0 +1,43 @@
|
||||||
|
local voidtimer = 0
|
||||||
|
|
||||||
|
minetest.register_globalstep(function(dtime)
|
||||||
|
voidtimer = voidtimer + dtime
|
||||||
|
if voidtimer > 0.5 then
|
||||||
|
voidtimer = 0
|
||||||
|
local objs = minetest.object_refs
|
||||||
|
local enable_damage = minetest.settings:get_bool("enable_damage")
|
||||||
|
for id, obj in pairs(objs) do
|
||||||
|
local pos = obj:get_pos()
|
||||||
|
local void, void_deadly = mcl_worlds.is_in_void(pos)
|
||||||
|
if void_deadly then
|
||||||
|
local is_player = obj:is_player()
|
||||||
|
local ent = obj:get_luaentity()
|
||||||
|
local immortal_val = obj: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 is_player then
|
||||||
|
-- If damage is disabled, we can't kill players.
|
||||||
|
-- So we just teleport the player back to spawn.
|
||||||
|
local spawn = mcl_spawn.get_spawn_pos(obj)
|
||||||
|
obj:set_pos(spawn)
|
||||||
|
mcl_worlds.dimension_change(obj, mcl_worlds.pos_to_dimension(spawn))
|
||||||
|
minetest.chat_send_player(obj:get_player_name(), "The void is off-limits to you!")
|
||||||
|
else
|
||||||
|
obj:remove()
|
||||||
|
end
|
||||||
|
elseif enable_damage and not is_immortal then
|
||||||
|
-- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds)
|
||||||
|
if obj:get_hp() > 0 then
|
||||||
|
if is_player then
|
||||||
|
mcl_death_messages.player_damage(obj, string.format("%s fell into the endless void.", obj:get_player_name()))
|
||||||
|
end
|
||||||
|
obj:set_hp(obj:get_hp() - 4)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
|
@ -0,0 +1 @@
|
||||||
|
name = mcl_void_damage
|
|
@ -3,8 +3,10 @@ minetest.register_on_dieplayer(function(player)
|
||||||
if keep == false then
|
if keep == false then
|
||||||
-- Drop inventory, crafting grid and armor
|
-- Drop inventory, crafting grid and armor
|
||||||
local inv = player:get_inventory()
|
local inv = player:get_inventory()
|
||||||
local pos = player:getpos()
|
local pos = player:get_pos()
|
||||||
local name, player_armor_inv, armor_armor_inv, pos = armor:get_valid_player(player, "[on_dieplayer]")
|
local name, player_armor_inv, armor_armor_inv, pos = armor:get_valid_player(player, "[on_dieplayer]")
|
||||||
|
-- No item drop if in deep void
|
||||||
|
local void, void_deadly = mcl_worlds.is_in_void(pos)
|
||||||
local lists = {
|
local lists = {
|
||||||
{ inv = inv, listname = "main", drop = true },
|
{ inv = inv, listname = "main", drop = true },
|
||||||
{ inv = inv, listname = "craft", drop = true },
|
{ inv = inv, listname = "craft", drop = true },
|
||||||
|
@ -21,7 +23,7 @@ minetest.register_on_dieplayer(function(player)
|
||||||
local z = math.random(0, 9)/3
|
local z = math.random(0, 9)/3
|
||||||
pos.x = pos.x + x
|
pos.x = pos.x + x
|
||||||
pos.z = pos.z + z
|
pos.z = pos.z + z
|
||||||
if drop then
|
if not void_deadly and drop then
|
||||||
minetest.add_item(pos, stack)
|
minetest.add_item(pos, stack)
|
||||||
end
|
end
|
||||||
stack:clear()
|
stack:clear()
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
mcl_init
|
mcl_init
|
||||||
mcl_worlds
|
|
||||||
mcl_core
|
mcl_core
|
||||||
mcl_particles
|
mcl_particles
|
||||||
mcl_hunger
|
mcl_hunger
|
||||||
|
|
|
@ -141,25 +141,6 @@ minetest.register_globalstep(function(dtime)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Deal Void damage
|
|
||||||
local void, void_deadly = mcl_worlds.is_in_void(pos)
|
|
||||||
if void_deadly then
|
|
||||||
-- Player is deep into the void, deal void damage
|
|
||||||
if minetest.settings:get_bool("enable_damage") then
|
|
||||||
if player:get_hp() > 0 then
|
|
||||||
mcl_death_messages.player_damage(player, string.format("%s fell into the endless void.", name))
|
|
||||||
player:set_hp(player:get_hp() - 4)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
-- If damge is disabled, we can't kill the player.
|
|
||||||
-- So we just teleport the player back to spawn.
|
|
||||||
local spawn = mcl_spawn.get_spawn_pos(player)
|
|
||||||
player:set_pos(spawn)
|
|
||||||
mcl_worlds.dimension_change(player, mcl_worlds.pos_to_dimension(spawn))
|
|
||||||
minetest.chat_send_player(name, "The void is off-limits to you!")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--[[ Swimming: Cause exhaustion.
|
--[[ Swimming: Cause exhaustion.
|
||||||
NOTE: As of 0.4.15, it only counts as swimming when you are with the feet inside the liquid!
|
NOTE: As of 0.4.15, it only counts as swimming when you are with the feet inside the liquid!
|
||||||
Head alone does not count. We respect that for now. ]]
|
Head alone does not count. We respect that for now. ]]
|
||||||
|
|
Loading…
Reference in New Issue