From 1d28a8e4acd02be3c86b225934951c68b226d296 Mon Sep 17 00:00:00 2001 From: ancientmarinerdev Date: Sat, 2 Sep 2023 01:39:11 +0100 Subject: [PATCH] Convert campfire particle spawning from ABM to particle spawner --- mods/ITEMS/mcl_campfires/api.lua | 139 +++++++++++++++++++++---------- 1 file changed, 95 insertions(+), 44 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 9d7766822..137fc9a0c 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -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, })