Convert campfire particle spawning from ABM to particle spawner

This commit is contained in:
ancientmarinerdev 2023-09-02 01:39:11 +01:00
parent c32e88e910
commit 1d28a8e4ac
1 changed files with 95 additions and 44 deletions

View File

@ -161,6 +161,75 @@ function mcl_campfires.cook_item(pos, elapsed)
end
end
local function destroy_particle_spawner (pos)
local meta = minetest.get_meta(pos)
local part_spawn_id = meta:get_int("particle_spawner_id")
if part_spawn_id and part_spawn_id > 0 then
minetest.delete_particlespawner(part_spawn_id)
end
end
local function create_smoke_partspawner (pos, constructor)
if not constructor then
destroy_particle_spawner (pos)
end
local haybale = false
local node_below = vector.offset(pos, 0, -1, 0)
if minetest.get_node(node_below).name == "mcl_farming:hay_block" then
haybale = true
end
local smoke_timer
if haybale then
smoke_timer = 8
else
smoke_timer = 4.75
end
local spawner_id = minetest.add_particlespawner({
amount = 3,
time = 0,
minpos = vector.add(pos, vector.new(-0.25, 0, -0.25)),
maxpos = vector.add(pos, vector.new( 0.25, 0, 0.25)),
minvel = vector.new(-0.2, 0.5, -0.2),
maxvel = vector.new(0.2, 1, 0.2),
minacc = vector.new(0, 0.5, 0),
maxacc = vector.new(0, 0.5, 0),
minexptime = smoke_timer,
maxexptime = smoke_timer * 2,
minsize = 6,
maxsize = 8,
collisiondetection = true,
vertical = false,
texture = "mcl_campfires_particle_1.png",
texpool = {
"mcl_campfires_particle_1.png";
{ name = "mcl_campfires_particle_1.png", fade = "out" },
{ name = "mcl_campfires_particle_2.png" },
{ name = "mcl_campfires_particle_3.png" },
{ name = "mcl_campfires_particle_4.png" },
{ name = "mcl_campfires_particle_5.png" },
{ name = "mcl_campfires_particle_6.png" },
{ name = "mcl_campfires_particle_7.png" },
{ name = "mcl_campfires_particle_8.png" },
{ name = "mcl_campfires_particle_9.png" },
{ name = "mcl_campfires_particle_10.png" },
{ name = "mcl_campfires_particle_11.png" },
{ name = "mcl_campfires_particle_11.png" },
{ name = "mcl_campfires_particle_12.png" },
}
})
local meta = minetest.get_meta(pos)
meta:set_int("particle_spawner_id", spawner_id)
end
function mcl_campfires.register_campfire(name, def)
-- Define Campfire
minetest.register_node(name, {
@ -207,22 +276,25 @@ function mcl_campfires.register_campfire(name, def)
drawtype = "mesh",
mesh = "mcl_campfires_campfire.obj",
tiles = {
{name=def.fire_texture,
animation={
type="vertical_frames",
aspect_w=32,
aspect_h=16,
length=2.0
}}
{
name=def.fire_texture,
animation={
type="vertical_frames",
aspect_w=32,
aspect_h=16,
length=2.0
}}
},
overlay_tiles = {{
name=def.lit_logs_texture,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 16,
length = 2.0,
}},
overlay_tiles = {
{
name=def.lit_logs_texture,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 16,
length = 2.0,
}
},
},
use_texture_alpha = "clip",
groups = { handy=1, axey=1, material_wood=1, lit_campfire=1 },
@ -232,6 +304,10 @@ function mcl_campfires.register_campfire(name, def)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("main", 4)
create_smoke_partspawner (pos, true)
end,
on_destruct = function(pos)
destroy_particle_spawner (pos)
end,
on_rightclick = function (pos, node, player, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
@ -312,37 +388,12 @@ minetest.register_globalstep(function(dtime)
end
end)
function mcl_campfires.generate_smoke(pos, haybale)
local smoke_timer
if haybale then
smoke_timer = 8
else
smoke_timer = 4.75
end
minetest.add_particle({
pos = vector.offset(pos, math.random(-0.5, 0.5), 0, math.random(-0.5, 0.5)),
velocity = vector.new(0, 1, 0),
texture = "mcl_campfires_particle_" .. math.random(1, 12) .. ".png",
size = 10,
acceleration = vector.new(0, 0.5, 0),
collisiondetection = true,
expirationtime = smoke_timer,
})
end
minetest.register_abm({
minetest.register_lbm({
label = "Campfire Smoke",
name = "mcl_campfires:campfire_smoke",
nodenames = {"group:lit_campfire"},
interval = 2,
chance = 2,
run_at_every_load = true,
action = function(pos, node)
local node_below = vector.offset(pos, 0, -1, 0)
local haybale = false
if minetest.get_node(node_below).name == "mcl_farming:hay_block" then
haybale = true
end
mcl_campfires.generate_smoke(pos, haybale)
create_smoke_partspawner (pos)
end,
})