quadeffects/fire.lua

142 lines
3.6 KiB
Lua

local fire_mod_found = false
local fire_sound
local fire_sound_gain = 1.0
local fire_extinguish_sound
if minetest.get_modpath("fire") then
fire_mod_found = true
fire_sound = "fire_fire"
fire_extinguish_sound = "fire_extinguish_flame"
elseif minetest.get_modpath("nc_fire") then
fire_sound_gain = 4
qeffects.fire.dps_multiplier = 1.5
fire_mod_found = true
fire_sound = "nc_fire_flamy"
fire_extinguish_sound = "nc_fire_snuff"
end
function qeffects.fire.apply(name, dps, time)
local player = minetest.get_player_by_name(name)
local pos = vector.new(0, 0.5, 0)
if not player then
minetest.log("warning", "[QEffects:Fire] Player "..name.." not found. Aborting apply()...")
return
end
local hudkey = player:hud_add({
hud_elem_type = "image",
name = "quadeffects_firehud",
position = {x = 0.5, y = 0.75},
offset = {x = 0, y = 0},
text = "quadeffects_fire_hud.png",
alignment = {x = 0, y = 0},
scale = {x = -100, y = -75},
})
local particles = minetest.add_particlespawner({
time = 0,
amount = dps * 30,
minpos = vector.subtract(pos, 0.5),
maxpos = vector.add(pos, 0.5),
minvel = {x = -1, y = 3, z = -1},
maxvel = {x = 1, y = 4, z = 1},
minacc = {x = 0, y = 3, z = 0},
maxacc = {x = 0, y = 5, z = 0},
minexptime = 0.2,
maxexptime = 0.3,
minsize = 4,
maxsize = 5,
texture = "quadeffects_fire_particle.png",
collisiondetection = true,
collision_removal = false,
attached = player,
})
local soundkey
if fire_mod_found then
soundkey = minetest.sound_play(fire_sound, {
to_player = name,
loop = true,
})
end
qeffects.fire.players[name] = {dps = dps, time = time, hud = hudkey, sound = soundkey, pkey = particles}
end
function qeffects.fire.remove(name)
local player = minetest.get_player_by_name(name)
if player then
player:hud_remove(qeffects.fire.players[name].hud)
minetest.delete_particlespawner(qeffects.fire.players[name].pkey)
else
minetest.log("warning", "[QEffects:Fire] Player "..name.." not found. Finishing remove()...")
end
if fire_mod_found then
minetest.sound_stop(qeffects.fire.players[name].sound)
if player then minetest.sound_play(fire_extinguish_sound, {to_player = name, pitch = fire_sound_gain}) end
end
qeffects.fire.players[name] = nil
end
function qeffects.fire.on_step()
for _, player in ipairs(minetest.get_connected_players()) do
local name = player:get_player_name()
local node = minetest.get_node(player:get_pos()).name
--
--- Fire Effect
--
if qeffects.fire.players[name] then
if minetest.get_item_group(node, "water") ~= 0 or minetest.get_item_group(node, "snowy") ~= 0 then
qeffects.fire.remove(name)
end
else
if minetest.get_item_group(node, "lava") ~= 0 or minetest.get_item_group(node, "igniter") ~= 0 then
qeffects.fire.apply(name, 0.7 * qeffects.fire.dps_multiplier, 7)
end
end
end
if qeffects.fire.players ~= {} then
for name, effect in pairs(qeffects.fire.players) do
local player = minetest.get_player_by_name(name)
if player then
player:set_hp(player:get_hp() - effect.dps, {quadeffect = "fire"})
else
qeffects.fire.remove(name)
effect = false
end
if effect and effect.time <= 0 then
qeffects.fire.remove(name)
elseif effect then
qeffects.fire.players[name].time = effect.time - 1
end
end
end
end
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
if qeffects.fire.players[name] then
qeffects.fire.remove(name)
end
end)
minetest.register_on_respawnplayer(function(player)
local name = player:get_player_name()
if qeffects.fire.players[name] then
qeffects.fire.remove(name)
end
end)