From 6c62b8d4a37e6a711d89739ba0074fbcc675b233 Mon Sep 17 00:00:00 2001 From: mrkubax10 Date: Wed, 1 Mar 2023 15:05:34 +0200 Subject: [PATCH] Don't destroy generator that has items inside --- machines.lua | 57 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/machines.lua b/machines.lua index 9f14b90..791eba5 100644 --- a/machines.lua +++ b/machines.lua @@ -32,6 +32,21 @@ local function generatorFormspec(fuelPercent) } return table.concat(formspec,"") end +local function generatorMclAfterDigNode(pos,oldnode,oldmeta,digger) + -- Taken from https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_furnaces/init.lua#L538 + local meta=minetest.get_meta(pos) + local meta2=meta + meta:from_table(oldmeta) + local inv=meta:get_inventory() + for _,listname in ipairs({"src", "dst", "fuel"}) do + local stack=inv:get_stack(listname,1) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2:to_table()) +end local definition={ description=S("Generator"), tiles={"industrialtest_iron_furnace.png"}, @@ -51,18 +66,22 @@ local definition={ local fuelTime=meta:get_int("fuelTime") local fuelList=inv:get_list("fuel") local chargedList=inv:get_list("charged") - if fuelTime==0 and not industrialtest.api.isFullyCharged(meta) then - local fuel,after=minetest.get_craft_result({ - method="fuel", - width=1, - items=fuelList - }) - if fuel.time>0 then - inv:set_stack("fuel",1,after.items[1]) - fuelTime=fuel.time - meta:set_int("maxFuelTime",fuelTime) - else - return false + if industrialtest.api.isFullyCharged(meta) then + return false + else + if fuelTime==0 then + local fuel,after=minetest.get_craft_result({ + method="fuel", + width=1, + items=fuelList + }) + if fuel.time>0 then + inv:set_stack("fuel",1,after.items[1]) + fuelTime=fuel.time + meta:set_int("maxFuelTime",fuelTime) + else + return false + end end end fuelTime=fuelTime-elapsed @@ -72,9 +91,10 @@ local definition={ meta:set_int("fuelTime",fuelTime) meta:set_string("formspec",generatorFormspec(fuelTime/meta:get_int("maxFuelTime")*100)) industrialtest.api.addPower(meta,100) - if fuelTime>0 then + if fuelTime>0 or fuelList[1]:get_count()>0 then return true end + return false end, allow_metadata_inventory_put=function(pos,listname,index,stack,player) if listname=="charged" and not industrialtest.api.hasPowerStorage(stack:get_meta()) then @@ -90,7 +110,16 @@ local definition={ end } if industrialtest.mtgAvailable then - definition.groups={cracky=1} + definition.groups={cracky=2} definition.sounds=default.node_sound_metal_defaults() + definition.can_dig=function(pos) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + return not (inv:get_list("charged")[1]:get_count()>0 or inv:get_list("fuel")[1]:get_count()>0) + end +elseif industrialtest.mclAvailable then + definition.after_dig_node=generatorMclAfterDigNode + definition._mcl_blast_resistance=3.5 + definition._mcl_hardness=3.9 end minetest.register_node("industrialtest:generator",definition)