A mod is born
This commit is contained in:
parent
14c387dea5
commit
c9eabc811c
176
init.lua
Normal file
176
init.lua
Normal file
@ -0,0 +1,176 @@
|
||||
fire_plus = {
|
||||
tnt_explode_radius = 1.5,
|
||||
}
|
||||
|
||||
fire_plus.ignition_nodes = {
|
||||
"default:lava",
|
||||
"fire:",
|
||||
}
|
||||
|
||||
fire_plus.put_outs = { -- Couldn't thnk of a better name
|
||||
"default:water",
|
||||
"default:river_water",
|
||||
"default:snow"
|
||||
}
|
||||
|
||||
local firehud = {}
|
||||
local firesound = {}
|
||||
local callbacks = {}
|
||||
|
||||
local function make_registration()
|
||||
local registerfunc = function(func)
|
||||
callbacks[#callbacks + 1] = func
|
||||
end
|
||||
|
||||
return(registerfunc)
|
||||
end
|
||||
|
||||
minetest.register_on_player_hpchange(function(player, hp_change)
|
||||
local pos = player:get_pos()
|
||||
local node = minetest.get_node(pos)
|
||||
|
||||
for id, string in ipairs(fire_plus.ignition_nodes) do
|
||||
if node.name:find(string) then
|
||||
fire_plus.burnplayer(player)
|
||||
break
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_respawnplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
|
||||
if firehud[name] then
|
||||
player:hud_remove(firehud[name])
|
||||
firehud[name] = nil
|
||||
end
|
||||
|
||||
if firesound[name] then
|
||||
minetest.sound_stop(firesound[name])
|
||||
firesound[name] = nil
|
||||
end
|
||||
end)
|
||||
|
||||
fire_plus.on_burn = make_registration()
|
||||
|
||||
function fire_plus.get_burn_dmg(player)
|
||||
local dmg = 1
|
||||
|
||||
for id, func in ipairs(callbacks) do
|
||||
local rval = callbacks[k](player)
|
||||
|
||||
if type(rval) == "number" then
|
||||
dmg = rval
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return(dmg)
|
||||
end
|
||||
|
||||
function fire_plus.burnplayer(player)
|
||||
if not player then return end
|
||||
|
||||
local name = player:get_player_name()
|
||||
|
||||
if firehud[name] then
|
||||
return
|
||||
end
|
||||
|
||||
firehud[name] = 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,
|
||||
})
|
||||
|
||||
firesound[name] = minetest.sound_play("fire_fire", {
|
||||
to_player = name,
|
||||
gain = 1.0,
|
||||
loop = true,
|
||||
})
|
||||
|
||||
for i=1, 4, 1 do
|
||||
minetest.after(i, function()
|
||||
if not player or firehud[player:get_player_name()] == nil then
|
||||
return
|
||||
end
|
||||
|
||||
local pos = player:get_pos()
|
||||
local pname = player:get_player_name()
|
||||
local name = minetest.get_node(pos).name
|
||||
local remove_burn = false
|
||||
|
||||
for id, string in ipairs(fire_plus.put_outs) do
|
||||
if name:find(string) then
|
||||
remove_burn = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if remove_burn == true then
|
||||
player:hud_remove(firehud[pname])
|
||||
minetest.sound_stop(firesound[pname])
|
||||
firehud[pname] = nil
|
||||
firesound[pname] = nil
|
||||
|
||||
minetest.sound_play("fire_extinguish_flame", {
|
||||
to_player = pname,
|
||||
gain = 1.0,
|
||||
})
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
-- Detonate any nearby TNT if player is on fire
|
||||
|
||||
local tntpos = minetest.find_node_near(player:get_pos(), fire_plus.tnt_explode_radius, {"tnt:tnt"}, true)
|
||||
|
||||
if player:get_hp() > 0 then
|
||||
player:set_hp(player:get_hp()-fire_plus.get_burn_dmg(player))
|
||||
end
|
||||
|
||||
if tntpos then
|
||||
tnt.boom(tntpos, {radius = tnt_radius, damage_radius = tnt_radius})
|
||||
end
|
||||
|
||||
minetest.add_particlespawner({
|
||||
amount = 20,
|
||||
time = 0.1,
|
||||
minpos = vector.subtract(pos, 0.5),
|
||||
maxpos = vector.add(pos, 0.5),
|
||||
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 = 5 * 0.66,
|
||||
maxsize = 5 * 0.66,
|
||||
texture = "fire_basic_flame.png",
|
||||
collisiondetection = true,
|
||||
})
|
||||
end)
|
||||
end
|
||||
|
||||
minetest.after(4.5, function()
|
||||
if not player then
|
||||
return
|
||||
end
|
||||
|
||||
local name = player:get_player_name()
|
||||
|
||||
if firehud[name] then
|
||||
player:hud_remove(firehud[name])
|
||||
firehud[name] = nil
|
||||
end
|
||||
|
||||
if firesound[name] then
|
||||
minetest.sound_stop(firesound[name])
|
||||
firesound[name] = nil
|
||||
end
|
||||
end)
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user