9e06fa33d3
* support for 3d_armor fire protection Adds support for 3d_armor fire protection. * Update depends.txt * Update mod.conf
126 lines
3.1 KiB
Lua
126 lines
3.1 KiB
Lua
local armor_mod = minetest.get_modpath("3d_armor")
|
|
|
|
-- Replace min/max table with random value from min to max
|
|
local function get_val(val)
|
|
if type(val) == "table" then
|
|
val = math.random(val.min or 1, val.max or 5)
|
|
end
|
|
|
|
return val
|
|
end
|
|
|
|
function fire_plus.burn_player(player, burns, damage, not_initial)
|
|
if not player then
|
|
minetest.log("warning", "[Fire Plus] (burn_player): player is nil")
|
|
end
|
|
|
|
local name = player
|
|
if type(player) == "string" then
|
|
player = minetest.get_player_by_name(player)
|
|
end
|
|
|
|
if not player or player:get_hp() <= 0 then
|
|
fire_plus.extinguish_player(name)
|
|
return
|
|
end
|
|
|
|
name = player:get_player_name()
|
|
|
|
-- 3d_armor fire protection puts out flames
|
|
if armor_mod and armor.def[name].fire > 1 then
|
|
fire_plus.extinguish_player(name)
|
|
end
|
|
|
|
-- Fire was extinguished
|
|
if not fire_plus.burning[name] and not_initial then
|
|
return
|
|
end
|
|
|
|
if not fire_plus.burning[name] then
|
|
burns = get_val(burns)
|
|
|
|
fire_plus.burning[name] = {
|
|
burns_left = burns,
|
|
hud_id = player:hud_add({
|
|
hud_elem_type = "image",
|
|
position = {x = 0.5, y = 0.95},
|
|
offset = {x = 0, y = 0},
|
|
text = "fire_basic_flame.png",
|
|
alignment = -1,
|
|
scale = {x = 100, y = 32},
|
|
number = 0xFFFFFF,
|
|
}),
|
|
sound_id = minetest.sound_play("fire_fire", {
|
|
to_player = name,
|
|
gain = 1.0,
|
|
loop = true,
|
|
}),
|
|
particlespawner_id = minetest.add_particlespawner({
|
|
amount = 10,
|
|
time = 0,
|
|
minpos = vector.new(-0.3, 0.5, -0.3),
|
|
maxpos = vector.new( 0.3, 2, 0.3),
|
|
minvel = {x = -1, y = 0, z = -1},
|
|
maxvel = {x = 1, y = 1, z = 1},
|
|
minacc = {x = 0, y = 2, z = 0},
|
|
maxacc = {x = 0, y = 3, z = 0},
|
|
minexptime = 0.5,
|
|
maxexptime = 1,
|
|
minsize = 3,
|
|
maxsize = 3,
|
|
texture = "fire_basic_flame.png",
|
|
collisiondetection = true,
|
|
glow = minetest.LIGHT_MAX,
|
|
attached = player,
|
|
})
|
|
}
|
|
else
|
|
player:set_hp(player:get_hp() - get_val(damage), {type = "set_hp", fire_plus = true})
|
|
|
|
if minetest.get_modpath("tnt") then
|
|
local tntpos = minetest.find_node_near(player:get_pos(), fire_plus.tnt_explode_radius, {"tnt:tnt"}, true)
|
|
|
|
if tntpos then
|
|
tnt.boom(tntpos, {radius = fire_plus.tnt_explode_radius, damage_radius = fire_plus.tnt_explode_radius})
|
|
end
|
|
end
|
|
|
|
if not_initial then
|
|
fire_plus.burning[name].burns_left = fire_plus.burning[name].burns_left - 1
|
|
else
|
|
fire_plus.burning[name].burns_left = burns
|
|
end
|
|
end
|
|
|
|
if fire_plus.burning[name].burns_left > 0 then
|
|
minetest.after(fire_plus.burn_interval, function()
|
|
fire_plus.burn_player(name, burns, damage, true)
|
|
end)
|
|
else
|
|
fire_plus.extinguish_player(name)
|
|
end
|
|
end
|
|
|
|
function fire_plus.extinguish_player(player)
|
|
local name = player
|
|
|
|
if player then
|
|
if type(name) ~= "string" then
|
|
name = player:get_player_name()
|
|
else
|
|
player = minetest.get_player_by_name(name)
|
|
end
|
|
end
|
|
|
|
if not fire_plus.burning[name] then return end
|
|
|
|
if player then
|
|
player:hud_remove(fire_plus.burning[name].hud_id)
|
|
minetest.sound_fade(fire_plus.burning[name].sound_id, 1, 0)
|
|
end
|
|
|
|
minetest.delete_particlespawner(fire_plus.burning[name].particlespawner_id)
|
|
|
|
fire_plus.burning[name] = nil
|
|
end
|