160 lines
4.7 KiB
Lua
160 lines
4.7 KiB
Lua
|
|
local function smoke(pos, node, clicker, enable)
|
|
local meta = minetest.get_meta(pos)
|
|
local handler = meta:get_int("sound")
|
|
local particle = meta:get_int("smoke")
|
|
|
|
if particle ~= 0 or enable ~= true then
|
|
if handler then
|
|
minetest.sound_stop(handler)
|
|
end
|
|
minetest.delete_particlespawner(particle)
|
|
meta:set_int("smoke", 0)
|
|
meta:set_int("sound", 0)
|
|
return
|
|
end
|
|
|
|
if minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name ~= "air" or particle ~= 0 then
|
|
return
|
|
end
|
|
|
|
particle = minetest.add_particlespawner({
|
|
amount = 4,
|
|
time = 0,
|
|
collisiondetection = true,
|
|
minpos = {x = pos.x - 0.25, y = pos.y + 0.4, z = pos.z-0.25},
|
|
maxpos = {x = pos.x + 0.25, y = pos.y + 5, z = pos.z + 0.25},
|
|
minvel = {x = -0.2, y = 0.3, z = -0.2},
|
|
maxvel = {x = 0.2, y = 1, z = 0.2},
|
|
minacc = {x = 0, y = 0, z = 0},
|
|
maxacc = {x = 0, y = 0.5, z = 0},
|
|
minexptime = 1,
|
|
maxexptime = 3,
|
|
minsize = 4,
|
|
maxsize = 8,
|
|
texture = "smoke_particle.png",
|
|
})
|
|
|
|
handler = minetest.sound_play("fire_small", {
|
|
pos = pos,
|
|
max_hear_distance = 5,
|
|
loop = true
|
|
})
|
|
|
|
meta:set_int("smoke", particle)
|
|
meta:set_int("sound", handler)
|
|
end
|
|
|
|
|
|
-- flame types
|
|
local flame_types = {
|
|
"green", "yellow", "black", "orange", "cyan",
|
|
"magenta", "purple", "blue", "red", "frosted"
|
|
}
|
|
|
|
for _, f in pairs(flame_types) do
|
|
minetest.register_node("abriflame:" .. f .. "_fire", {
|
|
inventory_image = f .. "_fire_inv.png",
|
|
wield_image = f .. "_fire_inv.png",
|
|
description = f .. " fire",
|
|
drawtype = "firelike",
|
|
paramtype = "light",
|
|
groups = {dig_immediate = 3, not_in_creative_inventory = 1, abriflame_fire = 1},
|
|
sunlight_propagates = true,
|
|
buildable_to = true,
|
|
walkable = false,
|
|
light_source = 14,
|
|
waving = 1,
|
|
drop = "",
|
|
tiles = {{
|
|
name = f .. "_fire_animated.png",
|
|
animation = {
|
|
type = "vertical_frames",
|
|
aspect_w = 16,
|
|
aspect_h = 16,
|
|
length = 1.5
|
|
},
|
|
}},
|
|
|
|
on_rightclick = function (pos, node, clicker)
|
|
smoke(pos, node, clicker, true)
|
|
end,
|
|
|
|
on_destruct = function (pos)
|
|
smoke(pos, nil, nil, false)
|
|
minetest.sound_play("fire_extinguish_flame", {
|
|
pos = pos,
|
|
max_hear_distance = 5,
|
|
gain = 0.25
|
|
})
|
|
end,
|
|
})
|
|
end
|
|
|
|
if minetest.features.particlespawner_tweenable then
|
|
minetest.register_abm({
|
|
nodenames = { "group:abriflame_fire" },
|
|
interval = 1,
|
|
chance = 1,
|
|
catch_up = false,
|
|
action = function(pos, node)
|
|
local color = node.name:split(":")[2]:split("_")[1]
|
|
if color=="frosted" then
|
|
color = "white"
|
|
end
|
|
minetest.add_particlespawner({
|
|
pos = { min = vector.add(pos, vector.new(-0.5, -0.5, -0.5)), max = vector.add(pos, vector.new(0.5, 0.5, 0.5)) },
|
|
vel = { min = vector.new(-0.5, 0.5, -0.5), max = vector.new( 0.5, 0.5, 0.5) },
|
|
acc = vector.new(0, 0.1, 0),
|
|
time = 1,
|
|
amount = 100,
|
|
exptime = 1,
|
|
collisiondetection = true,
|
|
collision_removal = true,
|
|
glow = 14,
|
|
texpool = {
|
|
{ name = "flame_spark.png^[multiply:"..color, alpha_tween = { 1, 0 }, scale_tween = { 0.5, 0 }, blend = "screen" },
|
|
{ name = "flame_spark.png^[multiply:#c00", alpha_tween = { 1, 0 }, scale_tween = { 0.5, 0 }, blend = "screen" },
|
|
{ name = "flame_spark.png^[multiply:#800", alpha_tween = { 1, 0 }, scale_tween = { 0.5, 0 }, blend = "screen" },
|
|
{ name = "flame_spark.png^[multiply:#ff0", alpha_tween = { 1, 0 }, scale_tween = { 0.5, 0 }, blend = "screen" },
|
|
{ name = "flame_spark.png^[multiply:#fc0", alpha_tween = { 1, 0 }, scale_tween = { 0.5, 0 }, blend = "screen" },
|
|
{ name = "flame_spark.png^[multiply:#cc0", alpha_tween = { 1, 0 }, scale_tween = { 0.5, 0 }, blend = "screen" },
|
|
{ name = "flame_spark.png^[multiply:#f80", alpha_tween = { 1, 0 }, scale_tween = { 0.5, 0 }, blend = "screen" },
|
|
}
|
|
})
|
|
end
|
|
})
|
|
end
|
|
|
|
local old_on_use = minetest.registered_items["fire:flint_and_steel"].on_use
|
|
-- fire starter tool
|
|
minetest.override_item("fire:flint_and_steel", {
|
|
on_use = function(itemstack, user, pointed_thing)
|
|
if pointed_thing.type ~= "node" then
|
|
return itemstack
|
|
end
|
|
|
|
local pos = ({x = pointed_thing.under.x,
|
|
y = pointed_thing.under.y + 1,
|
|
z = pointed_thing.under.z})
|
|
|
|
if minetest.get_node(pos).name ~= "air" or
|
|
minetest.is_protected(pos, user:get_player_name()) or
|
|
minetest.is_protected(pointed_thing.above, user:get_player_name()) then
|
|
return itemstack
|
|
end
|
|
|
|
local node = minetest.get_node(pointed_thing.under).name
|
|
local nodesplit, namesplit = node:split(":"), {}
|
|
if #nodesplit == 2 then
|
|
namesplit = nodesplit[2]:split("_")
|
|
end
|
|
|
|
if nodesplit[1] == "abriglass" and #namesplit == 3 and namesplit[1] == "stained" then
|
|
minetest.set_node(pos, {name = "abriflame:" .. namesplit[3] .. "_fire"})
|
|
end
|
|
|
|
return old_on_use(itemstack, user, pointed_thing)
|
|
end,
|
|
})
|
|
minetest.register_alias("abriflame:flint", "fire:flint_and_steel") |