From a7b78c1a6b16d560663e4bae49c5c388a9d178e8 Mon Sep 17 00:00:00 2001 From: DonBatman Date: Sun, 4 Jan 2026 15:12:02 -0800 Subject: [PATCH] Code cleanup --- init.lua | 352 +++++++++++++++++++++---------------------------------- 1 file changed, 133 insertions(+), 219 deletions(-) diff --git a/init.lua b/init.lua index 24aab9d..e7fad0b 100644 --- a/init.lua +++ b/init.lua @@ -1,238 +1,152 @@ -local modname = minetest.get_current_modname() +local modname = core.get_current_modname() -local mysponge_table = { - {"sponge_dry", "Dry Sponge", "mysponge_sponge.png", 0.5, {dig_immediate=2, flammable=1}, 3}, - {"sponge_moist", "Moist Sponge", "mysponge_sponge2.png", 0.7, {dig_immediate=2, not_in_creative_inventory=1}, 2}, - {"sponge_wet", "Wet Sponge", "mysponge_sponge3.png", 0.85, {dig_immediate=2, not_in_creative_inventory=1}, 1}, - {"sponge_soaked", "Soaked Sponge", "mysponge_sponge3.png", 1.0, {dig_immediate=2, not_in_creative_inventory=1}, 0}, +local states = { + {id = "dry", desc = "Dry Sponge", tex = "mysponge_sponge.png", size = 0.5, inv = true}, + {id = "moist", desc = "Moist Sponge", tex = "mysponge_sponge2.png", size = 0.7, inv = false}, + {id = "wet", desc = "Wet Sponge", tex = "mysponge_sponge3.png", size = 0.85, inv = false}, + {id = "soaked", desc = "Soaked Sponge", tex = "mysponge_sponge3.png", size = 1.0, inv = false}, } -local function absorb_water(pos, current_item) - local radius = 0 - for _, data in ipairs(mysponge_table) do - if data[1] == current_item then - radius = data[6] - break - end - end - - if radius <= 0 and current_item ~= "sponge_soaked" then radius = 0 end - if current_item == "sponge_soaked" then return false end - - local adjacent_min = {x = pos.x - 1, y = pos.y - 1, z = pos.z - 1} - local adjacent_max = {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1} - local trigger_nodes = minetest.find_nodes_in_area(adjacent_min, adjacent_max, {"group:water"}) - - if #trigger_nodes > 0 then - local soak_min = {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius} - local soak_max = {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius} - local all_water = minetest.find_nodes_in_area(soak_min, soak_max, {"group:water"}) - - for _, wpos in ipairs(all_water) do - minetest.set_node(wpos, {name = "mysponge:air1"}) - end - - minetest.set_node(pos, {name = "mysponge:sponge_soaked"}) - minetest.sound_play("default_water_footstep", {pos = pos, gain = 0.5}) - return true - end - return false +local function dry_nearby_leaves(pos) + local radius = 1 + local found = false + for x = -radius, radius do + for y = -radius, radius do + for z = -radius, radius do + local p = {x=pos.x+x, y=pos.y+y, z=pos.z+z} + local node = core.get_node(p).name + if core.get_item_group(node, "leaves") > 0 then + core.set_node(p, {name = modname .. ":dry_leaves"}) + found = true + end + end + end + end + return found end -for _, data in ipairs(mysponge_table) do - local item, desc, image, scale, nodegroup = unpack(data) - local half_width = scale / 2 - local height_top = -0.5 + scale - - minetest.register_node(modname .. ":" .. item, { - description = desc, - tiles = {image}, - drawtype = "nodebox", - paramtype = "light", - groups = nodegroup, - node_box = { - type = "fixed", - fixed = {-half_width, -0.5, -half_width, half_width, height_top, half_width}, - }, - selection_box = { - type = "fixed", - fixed = {-half_width, -0.5, -half_width, half_width, height_top, half_width}, - }, - after_place_node = function(pos, placer, itemstack, pointed_thing) - absorb_water(pos, item) - end, - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if itemstack:get_name() == "bucket:bucket_empty" and node.name ~= modname .. ":sponge_dry" then - local inv = clicker:get_inventory() - local leftover = inv:add_item("main", "bucket:bucket_water") - - if not leftover:is_empty() then - minetest.add_item(clicker:get_pos(), leftover) - end - - itemstack:take_item() - - minetest.add_particlespawner({ - amount = 20, - time = 0.1, - minpos = {x=pos.x-0.2, y=pos.y, z=pos.z-0.2}, - maxpos = {x=pos.x+0.2, y=pos.y+0.2, z=pos.z+0.2}, - minvel = {x=-3, y=1, z=-3}, maxvel = {x=3, y=4, z=3}, - minacc = {x=0, y=-9.8, z=0}, maxacc = {x=0, y=-9.8, z=0}, - minexptime = 0.4, maxexptime = 0.8, - minsize = 1, maxsize = 3, - texture = "mysponge_drop.png", - }) - - minetest.set_node(pos, {name = modname .. ":sponge_dry"}) - minetest.sound_play("default_water_footstep", {pos = pos, gain = 0.8}) - return itemstack - end - end, - }) +local function absorb_water(pos) + local radius = 5 + local minp = vector.subtract(pos, radius) + local maxp = vector.add(pos, radius) + local nodes = core.find_nodes_in_area(minp, maxp, {"group:water"}) + + if #nodes > 0 then + for _, p in ipairs(nodes) do + core.set_node(p, {name = modname .. ":air_temp"}) + end + core.sound_play("default_water_footstep", {pos = pos, gain = 0.5}) + return true + end + return false end -minetest.register_abm({ - label = "Sponge Particles", - nodenames = {modname .. ":sponge_soaked", modname .. ":sponge_wet", modname .. ":sponge_moist"}, - interval = 1.0, - chance = 1, - action = function(pos, node) - if node.name == modname .. ":sponge_soaked" or node.name == modname .. ":sponge_wet" then - local below = {x=pos.x, y=pos.y-1, z=pos.z} - local b_node = minetest.get_node(below) - local def = minetest.registered_nodes[b_node.name] - - if def and (not def.walkable or b_node.name == "air") then - minetest.add_particlespawner({ - amount = 3, - time = 1, - minpos = {x = pos.x - 0.3, y = pos.y - 0.45, z = pos.z - 0.3}, - maxpos = {x = pos.x + 0.3, y = pos.y - 0.5, z = pos.z + 0.3}, - minvel = {x = 0, y = -1, z = 0}, - maxvel = {x = 0, y = -2, z = 0}, - minacc = {x = 0, y = -9.8, z = 0}, - maxacc = {x = 0, y = -9.8, z = 0}, - minexptime = 1, maxexptime = 2, - minsize = 1.5, maxsize = 2.5, - texture = "mysponge_drop.png", - vertical = true, - }) - end - elseif node.name == modname .. ":sponge_moist" then - minetest.add_particlespawner({ - amount = 2, - time = 1, - minpos = {x = pos.x - 0.2, y = pos.y + 0.1, z = pos.z - 0.2}, - maxpos = {x = pos.x + 0.2, y = pos.y + 0.4, z = pos.z + 0.2}, - minvel = {x = -0.1, y = 0.1, z = -0.1}, - maxvel = {x = 0.1, y = 0.3, z = 0.1}, - minexptime = 1.5, maxexptime = 2.5, - minsize = 1, maxsize = 2, - texture = "mysponge_drop.png^[opacity:80", - }) - end - end, -}) +for _, state in ipairs(states) do + local box_size = state.size / 2 + local groups = {dig_immediate = 2} + if not state.inv then groups.not_in_creative_inventory = 1 end -local air_nodes = {"air1", "air2", "air3"} -for i, airnode in ipairs(air_nodes) do - local next_node = air_nodes[i+1] and (modname .. ":" .. air_nodes[i+1]) or "air" - minetest.register_node(modname .. ":" .. airnode, { - description = "Air", - drawtype = "airlike", - walkable = false, - pointable = false, - buildable_to = true, - paramtype = "light", - sunlight_propagates = true, - groups = {not_in_creative_inventory = 1}, - on_construct = function(pos) - minetest.get_node_timer(pos):start(0.5) - end, - on_timer = function(pos) - minetest.set_node(pos, {name = next_node}) - end, - }) + core.register_node(modname .. ":sponge_" .. state.id, { + description = state.desc, + tiles = {state.tex}, + drawtype = "nodebox", + paramtype = "light", + groups = groups, + node_box = { + type = "fixed", + fixed = {-box_size, -0.5, -box_size, box_size, -0.5 + state.size, box_size}, + }, + after_place_node = function(pos, placer, itemstack) + local leaves_dried = dry_nearby_leaves(pos) + local water_absorbed = absorb_water(pos) + + if water_absorbed then + core.set_node(pos, {name = modname .. ":sponge_soaked"}) + elseif leaves_dried and state.id == "dry" then + core.set_node(pos, {name = modname .. ":sponge_moist"}) + end + end, + on_rightclick = function(pos, node, clicker, itemstack) + if itemstack:get_name() == "bucket:bucket_empty" and state.id ~= "dry" then + local inv = clicker:get_inventory() + if inv:room_for_item("main", "bucket:bucket_water") then + itemstack:take_item() + inv:add_item("main", "bucket:bucket_water") + core.set_node(pos, {name = modname .. ":sponge_dry"}) + core.sound_play("default_water_footstep", {pos = pos, gain = 0.7}) + end + end + end, + }) end -minetest.register_node(modname .. ":dry_leaves", { - description = "Dry Leaves", - tiles = {"mysponge_dry_leaves.png"}, - drawtype = "allfaces_optional", - paramtype = "light", - groups = {dig_immediate = 2, oddly_breakable_by_hand = 1, leaves = 1}, +core.register_node(modname .. ":dry_leaves", { + description = "Dry Leaves", + tiles = {"mysponge_dry_leaves.png"}, + drawtype = "allfaces_optional", + paramtype = "light", + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, }) -minetest.register_abm({ - label = "Sponge Leaf Drying", - nodenames = {"group:leaves"}, - neighbors = {modname .. ":sponge_dry"}, - interval = 5.0, - chance = 2, - action = function(pos, node) - local below = {x=pos.x, y=pos.y-1, z=pos.z} - local b_node = minetest.get_node(below) - - if b_node.name == modname .. ":sponge_dry" and node.name ~= modname .. ":dry_leaves" then - minetest.set_node(pos, {name = modname .. ":dry_leaves"}) - minetest.set_node(below, {name = modname .. ":sponge_moist"}) - minetest.sound_play("default_dry_grass_footstep", {pos = pos, gain = 0.5}) - end - end, +core.register_node(modname .. ":air_temp", { + drawtype = "airlike", + walkable = false, + pointable = false, + buildable_to = true, + sunlight_propagates = true, + paramtype = "light", + groups = {not_in_creative_inventory = 1}, + on_construct = function(pos) + core.get_node_timer(pos):start(1.0) + end, + on_timer = function(pos) + core.set_node(pos, {name = "air"}) + end, }) -minetest.register_abm({ - label = "Sponge Water Absorption", - nodenames = {modname .. ":sponge_dry", modname .. ":sponge_moist", modname .. ":sponge_wet"}, - neighbors = {"group:water"}, - interval = 1.0, - chance = 1, - action = function(pos, node) - local item_name = node.name:split(":")[2] - absorb_water(pos, item_name) - end, +core.register_abm({ + label = "Sponge Effects", + nodenames = {modname .. ":sponge_moist", modname .. ":sponge_wet", modname .. ":sponge_soaked"}, + interval = 1, + chance = 2, + action = function(pos, node) + if node.name == modname .. ":sponge_moist" then + core.add_particle({ + pos = {x=pos.x + math.random(-2,2)/10, y=pos.y+0.2, z=pos.z + math.random(-2,2)/10}, + velocity = {x=0, y=0.5, z=0}, + expirationtime = 2, + size = 3, + texture = "mysponge_drop.png^[opacity:40", + }) + else + core.add_particle({ + pos = {x=pos.x + math.random(-3,3)/10, y=pos.y-0.4, z=pos.z + math.random(-3,3)/10}, + velocity = {x=0, y=-2, z=0}, + acceleration = {x=0, y=-9, z=0}, + expirationtime = 0.8, + size = 1.5, + collisiondetection = true, + texture = "mysponge_drop.png", + }) + end + end, }) -local drying_chain = { - [modname .. ":sponge_soaked"] = modname .. ":sponge_wet", - [modname .. ":sponge_wet"] = modname .. ":sponge_moist", - [modname .. ":sponge_moist"] = modname .. ":sponge_dry", -} - -minetest.register_abm({ - label = "Sponge Drying", - nodenames = {modname .. ":sponge_soaked", modname .. ":sponge_wet", modname .. ":sponge_moist"}, - neighbors = {"air"}, - interval = 45, - chance = 1, - action = function(pos, node) - local next_stage = drying_chain[node.name] - if next_stage then - minetest.set_node(pos, {name = next_stage}) - end - end, +core.register_craft({ + output = modname .. ":sponge_dry", + recipe = { + {"farming:string", "wool:yellow", "farming:string"}, + {"wool:yellow", "default:mese_crystal_fragment", "wool:yellow"}, + {"farming:string", "wool:yellow", "farming:string"}, + } }) -local function register_sponge_drying(input_item, water_yield) - minetest.register_craft({ - type = "cooking", - output = "default:water_source " .. tostring(water_yield), - recipe = input_item, - cooktime = 5, - replacements = {{input_item, modname .. ":sponge_dry"}}, - }) +local wet_types = {"moist", "wet", "soaked"} +for _, t in ipairs(wet_types) do + core.register_craft({ + type = "cooking", + recipe = modname .. ":sponge_" .. t, + output = modname .. ":sponge_dry", + cooktime = 3, + }) end - -register_sponge_drying(modname .. ":sponge_soaked", 3) -register_sponge_drying(modname .. ":sponge_wet", 2) -register_sponge_drying(modname .. ":sponge_moist", 1) - -minetest.register_craft({ - output = modname .. ":sponge_dry 1", - recipe = { - {"farming:string", "wool:yellow", "farming:string"}, - {"wool:yellow", "default:mese_crystal_fragment", "wool:yellow"}, - {"farming:string", "wool:yellow", "farming:string"}, - }, -})