From 156cca1b6618d64c5093a38712d7e4604c1f31c2 Mon Sep 17 00:00:00 2001 From: mrkubax10 Date: Sun, 2 Apr 2023 18:07:56 +0200 Subject: [PATCH] Implement Water Mill --- api.lua | 33 ++ compatibility.lua | 4 + crafts.lua | 26 + machines.lua | 557 ++++++++++++-------- textures/SOURCES.md | 2 + textures/industrialtest_gui_river_water.png | Bin 0 -> 590 bytes textures/industrialtest_gui_water.png | Bin 0 -> 253 bytes 7 files changed, 388 insertions(+), 234 deletions(-) create mode 100644 textures/industrialtest_gui_river_water.png create mode 100644 textures/industrialtest_gui_water.png diff --git a/api.lua b/api.lua index 5e05a8f..bab209c 100644 --- a/api.lua +++ b/api.lua @@ -21,6 +21,7 @@ industrialtest.api.maceratorRecipes={} industrialtest.api.compressorRecipes={} industrialtest.api.extractorRecipes={} industrialtest.api.geothermalGeneratorFuels={} +industrialtest.api.waterMillFuels={} industrialtest.api.lvPowerFlow=600 industrialtest.api.mvPowerFlow=2400 @@ -441,3 +442,35 @@ industrialtest.api.getGeothermalGeneratorFuelByItem=function(name) end return nil end +-- \brief Registers fuel that can be used in water mill +-- \param fuel Table with following keys: , , +-- which is a table containing items which are tables with following keys: , +-- \returns nil +industrialtest.api.registerWaterMillFuel=function(config) + local definition={ + name=config.name or "", + calorificValue=config.calorificValue or 0, + texture=config.texture or "industrialtest_gui_fluid_bg.png", + storageItems=config.storageItems or {} + } + industrialtest.api.waterMillFuels[definition.name]=definition +end +-- \brief Returns water mill fuel information +-- \param name Name of fuel +-- \returns Table with following keys: name, calorificValue, storageItems +industrialtest.api.getWaterMillFuel=function(name) + return industrialtest.api.waterMillFuels[name] +end +-- \brief Returns water mill fuel information by item name +-- \param name ID of item +-- \returns Table with following keys: name, calorificValue, storageItems or nil in case of failure +industrialtest.api.getWaterMillFuelByItem=function(name) + for _,value in pairs(industrialtest.api.waterMillFuels) do + for _,item in ipairs(value.storageItems) do + if item.name==name then + return value + end + end + end + return nil +end diff --git a/compatibility.lua b/compatibility.lua index 2a36045..ad23fd9 100644 --- a/compatibility.lua +++ b/compatibility.lua @@ -502,6 +502,7 @@ if industrialtest.mclAvailable then industrialtest.elementKeys.diamond="mcl_core:diamond" industrialtest.elementKeys.bucket="mcl_buckets:bucket_empty" industrialtest.elementKeys.bucketWithLava="mcl_buckets:bucket_lava" + industrialtest.elementKeys.bucketWithWater="mcl_buckets:bucket_water" industrialtest.elementKeys.glowstone="mcl_nether:glowstone_dust" industrialtest.elementKeys.glass="mcl_core:glass" industrialtest.elementKeys.powerCarrier="mesecons:mesecon" @@ -527,6 +528,7 @@ if industrialtest.mclAvailable then industrialtest.elementKeys.copperBlock="mcl_copper:block" industrialtest.elementKeys.stoneWithCopper="mcl_copper:stone_with_copper" industrialtest.elementKeys.lavaSource="mcl_core:lava_source" + industrialtest.elementKeys.waterSource="mcl_core:water_source" -- register required minerals that are not available in MCL industrialtest.registerMetal("tin","Tin",3,3) @@ -706,6 +708,7 @@ elseif industrialtest.mtgAvailable then industrialtest.elementKeys.snowball="default:snow" industrialtest.elementKeys.bucket="bucket:bucket_empty" industrialtest.elementKeys.bucketWithLava="bucket:bucket_lava" + industrialtest.elementKeys.bucketWithWater="bucket:bucket_water" industrialtest.elementKeys.string="farming:string" industrialtest.elementKeys.junglePlanks="default:junglewood" industrialtest.elementKeys.glowstone="dye:yellow" @@ -736,6 +739,7 @@ elseif industrialtest.mtgAvailable then industrialtest.elementKeys.stoneWithTin="default:stone_with_tin" industrialtest.elementKeys.bronzeBlock="default:bronzeblock" industrialtest.elementKeys.lavaSource="default:lava_source" + industrialtest.elementKeys.waterSource="default:water_source" else error("No compatible games found!") end diff --git a/crafts.lua b/crafts.lua index 4876ac8..1c13916 100644 --- a/crafts.lua +++ b/crafts.lua @@ -87,3 +87,29 @@ industrialtest.api.registerGeothermalGeneratorFuel({ } } }) + +-- Water Mill fuels +industrialtest.api.registerWaterMillFuel({ + name=industrialtest.elementKeys.waterSource, + calorificValue=industrialtest.api.lvPowerFlow, + texture="industrialtest_gui_water.png", + storageItems={ + { + name=industrialtest.elementKeys.bucketWithWater, + leftover=industrialtest.elementKeys.bucket + } + } +}) +if industrialtest.mtgAvailable then + industrialtest.api.registerWaterMillFuel({ + name="default:river_water_source", + calorificValue=industrialtest.api.lvPowerFlow, + texture="industrialtest_gui_river_water.png", + storageItems={ + { + name="bucket:bucket_river_water", + leftover=industrialtest.elementKeys.bucket + } + } + }) +end diff --git a/machines.lua b/machines.lua index b15dafe..9732efe 100644 --- a/machines.lua +++ b/machines.lua @@ -447,257 +447,346 @@ minetest.register_craft({ } }) -local function geothermalGeneratorFormspec(fluidPercent,powerPercent,fluid) - local formspec - local fuel=industrialtest.api.getGeothermalGeneratorFuel(fluid) - local tile=(fuel and fuel.texture or "industrialtest_gui_fluid_bg.png") - if industrialtest.mtgAvailable then - formspec={ - "formspec_version[4]", - "size[10.8,12]", - "label[0.5,0.5;"..S("Geothermal Generator").."]", - "list[context;fluid;2,1.8;1,1]", - "listring[context;fluid]", - (fluidPercent>0 and "image[2,3;1,1;industrialtest_gui_fluid_bg.png^[lowpart:"..fluidPercent..":"..tile.."]" or "image[2,3;1,1;industrialtest_gui_fluid_bg.png]"), - "list[context;leftover;2,4.2;1,1]", - "listring[context;leftover]", - "list[context;charged;6,3;1,1]", - "listring[context;charged]", - "box[9,1;0.3,4.8;#202020]", - (powerPercent>0 and "box[9,"..(1+4.8-(powerPercent*4.8))..";0.3,"..(powerPercent*4.8)..";#FF1010]" or ""), - "list[current_player;main;0.5,6.25;8,1]list[current_player;main;0.5,7.5;8,3;8]" - } - elseif industrialtest.mclAvailable then - formspec={ - "size[10.04,12]", - "label[0.25,0.25;"..S("Geothermal Generator").."]", - "list[context;fluid;2,1.8;1,1]", - mcl_formspec.get_itemslot_bg(2,1.8,1,1), - "listring[context;fluid]", - (fluidPercent>0 and "image[2,3;1,1;industrialtest_gui_fluid_bg.png^[lowpart:"..fluidPercent..":"..tile.."]" or "image[2,3;1,1;industrialtest_gui_fluid_bg.png]"), - "list[context;leftover;2,4.2;1,1]", - mcl_formspec.get_itemslot_bg(2,4.2,1,1), - "listring[context;leftover]", - "list[context;charged;6,3;1,1]", - mcl_formspec.get_itemslot_bg(6,3,1,1), - "listring[context;charged]", - "box[9,1;0.3,4.8;#202020]", - (powerPercent>0 and "box[9,"..(1+4.8-(powerPercent*4.8))..";0.3,"..(powerPercent*4.8)..";#FF1010]" or ""), - "list[current_player;main;0.5,7;9,3;9]", - mcl_formspec.get_itemslot_bg(0.5,7,9,3), - "list[current_player;main;0.5,10.24;9,1]", - mcl_formspec.get_itemslot_bg(0.5,10.24,9,1) - } +local function registerFluidGenerator(config) + local function getFormspec(fluidPercent,powerPercent,fluid) + local formspec + local fuel=config.getFuel(fluid) + local tile=(fuel and fuel.texture or "industrialtest_gui_fluid_bg.png") + if industrialtest.mtgAvailable then + formspec={ + "formspec_version[4]", + "size[10.8,12]", + "label[0.5,0.5;"..S(config.displayName).."]", + "list[context;fluid;2,1.8;1,1]", + "listring[context;fluid]", + (fluidPercent>0 and "image[2,3;1,1;industrialtest_gui_fluid_bg.png^[lowpart:"..fluidPercent..":"..tile.."]" or "image[2,3;1,1;industrialtest_gui_fluid_bg.png]"), + "list[context;leftover;2,4.2;1,1]", + "listring[context;leftover]", + "list[context;charged;6,3;1,1]", + "listring[context;charged]", + "box[9,1;0.3,4.8;#202020]", + (powerPercent>0 and "box[9,"..(1+4.8-(powerPercent*4.8))..";0.3,"..(powerPercent*4.8)..";#FF1010]" or ""), + "list[current_player;main;0.5,6.25;8,1]list[current_player;main;0.5,7.5;8,3;8]" + } + elseif industrialtest.mclAvailable then + formspec={ + "size[10.04,12]", + "label[0.25,0.25;"..S(config.displayName).."]", + "list[context;fluid;2,1.8;1,1]", + mcl_formspec.get_itemslot_bg(2,1.8,1,1), + "listring[context;fluid]", + (fluidPercent>0 and "image[2,3;1,1;industrialtest_gui_fluid_bg.png^[lowpart:"..fluidPercent..":"..tile.."]" or "image[2,3;1,1;industrialtest_gui_fluid_bg.png]"), + "list[context;leftover;2,4.2;1,1]", + mcl_formspec.get_itemslot_bg(2,4.2,1,1), + "listring[context;leftover]", + "list[context;charged;6,3;1,1]", + mcl_formspec.get_itemslot_bg(6,3,1,1), + "listring[context;charged]", + "box[9,1;0.3,4.8;#202020]", + (powerPercent>0 and "box[9,"..(1+4.8-(powerPercent*4.8))..";0.3,"..(powerPercent*4.8)..";#FF1010]" or ""), + "list[current_player;main;0.5,7;9,3;9]", + mcl_formspec.get_itemslot_bg(0.5,7,9,3), + "list[current_player;main;0.5,10.24;9,1]", + mcl_formspec.get_itemslot_bg(0.5,10.24,9,1) + } + end + return table.concat(formspec,"") end - return table.concat(formspec,"") -end -definition={ - description=S("Geothermal Generator"), - tiles={ - "industrialtest_machine_block.png", - "industrialtest_machine_block.png", - "industrialtest_machine_block.png", - "industrialtest_machine_block.png", - "industrialtest_machine_block.png", - "industrialtest_machine_block.png^industrialtest_geothermal_generator_front.png", - }, - paramtype2="facedir", - legacy_facedir_simple=true, - drop="industrialtest:machine_block", - on_construct=function(pos) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - inv:set_size("charged",1) - inv:set_size("fluid",1) - inv:set_size("leftover",1) - meta:set_float("fluidAmount",0) - meta:set_string("fluid","") - meta:set_string("formspec",geothermalGeneratorFormspec(0,0,"")) - industrialtest.api.addPowerStorage(meta,7000,industrialtest.api.lvPowerFlow,"oooooo") - end, - on_timer=function(pos,elapsed) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local fluidSlot=inv:get_stack("fluid",1) - local chargedSlot=inv:get_stack("charged",1) - local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) - local shouldUpdateFormspec=false - local shouldRerunTimer=(afterFlow and meta:get_int("industrialtest.powerAmount")>0) + definition={ + description=S(config.displayName), + tiles={ + "industrialtest_machine_block.png"..(config.customTopTexture and "^"..config.customTopTexture or ""), + "industrialtest_machine_block.png"..(config.customBottomTexture and "^"..config.customBottomTexture or ""), + "industrialtest_machine_block.png"..(config.customRightTexture and "^"..config.customRightTexture or ""), + "industrialtest_machine_block.png"..(config.customLeftTexture and "^"..config.customLeftTexture or ""), + "industrialtest_machine_block.png"..(config.customBackTexture and "^"..config.customBackTexture or ""), + "industrialtest_machine_block.png"..(config.customFrontTexture and "^"..config.customFrontTexture or "") + }, + paramtype2="facedir", + legacy_facedir_simple=true, + drop="industrialtest:machine_block", + on_construct=function(pos) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + inv:set_size("charged",1) + inv:set_size("fluid",1) + inv:set_size("leftover",1) + meta:set_float("fluidAmount",0) + meta:set_string("fluid","") + meta:set_string("formspec",getFormspec(0,0,"")) + industrialtest.api.addPowerStorage(meta,7000,industrialtest.api.lvPowerFlow,"oooooo") + end, + on_timer=function(pos,elapsed) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local fluidSlot=inv:get_stack("fluid",1) + local chargedSlot=inv:get_stack("charged",1) + local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) + local shouldUpdateFormspec=false + local shouldRerunTimer=(afterFlow and meta:get_int("industrialtest.powerAmount")>0) - if fluidSlot:get_count()>0 and meta:get_float("fluidAmount")<=9000 then - local fuel=industrialtest.api.getGeothermalGeneratorFuelByItem(fluidSlot:get_name()) - if fuel and (fuel.name==meta:get_string("fluid") or meta:get_string("fluid")=="") then - local leftover=false - local leftoverAddingSucceeded=false - for _,item in ipairs(fuel.storageItems) do - if item.name==fluidSlot:get_name() and item.leftover then - if inv:room_for_item("leftover",ItemStack(item.leftover)) then - inv:add_item("leftover",ItemStack(item.leftover)) - leftoverAddingSucceeded=true + if fluidSlot:get_count()>0 and meta:get_float("fluidAmount")<=9000 then + local fuel=config.getFuelByItem(fluidSlot:get_name()) + if fuel and (fuel.name==meta:get_string("fluid") or meta:get_string("fluid")=="") then + local leftover=false + local leftoverAddingSucceeded=false + for _,item in ipairs(fuel.storageItems) do + if item.name==fluidSlot:get_name() and item.leftover then + if inv:room_for_item("leftover",ItemStack(item.leftover)) then + inv:add_item("leftover",ItemStack(item.leftover)) + leftoverAddingSucceeded=true + end + leftover=true end - leftover=true + end + if not leftover or leftoverAddingSucceeded then + fluidSlot:take_item() + inv:set_stack("fluid",1,fluidSlot) + meta:set_string("fluid",fuel.name) + meta:set_float("fluidAmount",meta:get_float("fluidAmount")+1000) + shouldUpdateFormspec=true + shouldRerunTimer=false end end - if not leftover or leftoverAddingSucceeded then - fluidSlot:take_item() - inv:set_stack("fluid",1,fluidSlot) - meta:set_string("fluid",fuel.name) - meta:set_float("fluidAmount",meta:get_float("fluidAmount")+1000) + end + if meta:get_float("fluidAmount")>=50 and not industrialtest.api.isFullyCharged(meta) then + meta:set_float("fluidAmount",meta:get_int("fluidAmount")-50*elapsed) + local toAdd=math.ceil(config.getFuel(meta:get_string("fluid")).calorificValue*elapsed) + industrialtest.api.addPower(meta,toAdd) + shouldUpdateFormspec=true + if config.registerActiveVariant then + minetest.swap_node(pos,{ + name="industrialtest:"..config.name.."_active", + param2=minetest.get_node(pos).param2 + }) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + else + shouldRerunTimer=true + end + end + if chargedSlot:get_count()>0 and meta:get_int("industrialtest.powerAmount")>0 then + if industrialtest.api.transferPowerToItem(meta,chargedSlot,industrialtest.api.lvPowerFlow)>0 then + inv:set_stack("charged",1,chargedSlot) shouldUpdateFormspec=true - shouldRerunTimer=false + shouldRerunTimer=true + end + end + if flowTransferred then + shouldUpdateFormspec=true + end + + if shouldUpdateFormspec then + meta:set_string("formspec",getFormspec(meta:get_float("fluidAmount")/100,meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity"),meta:get_string("fluid"))) + end + + return shouldRerunTimer + end, + allow_metadata_inventory_move=function(pos,fromList,fromIndex,toList,toIndex,count) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local itemstack=inv:get_stack(fromList,fromIndex) + if toList=="charged" and not industrialtest.api.hasPowerStorage(itemstack:get_meta()) then + return 0 + end + return count + end, + allow_metadata_inventory_put=function(pos,listname,index,stack) + if toList=="charged" and not industrialtest.api.hasPowerStorage(stack:get_meta()) then + return 0 + end + return stack:get_count() + end, + on_metadata_inventory_move=function(pos) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end, + on_metadata_inventory_put=function(pos) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end, + _industrialtest_updateFormspec=function(meta) + meta:set_string("formspec",getFormspec(meta:get_float("fluidAmount")/100,meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity"),meta:get_string("fluid"))) + end + } + if industrialtest.mtgAvailable then + definition.groups={ + cracky=1, + level=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("fluid")[1]:get_count()>0) + end + elseif industrialtest.mclAvailable then + definition.after_dig_node=function(pos,oldnode,oldmeta) + mclAfterDigNode(pos,oldmeta,{"charged","fluid"}) + end + definition.groups={pickaxey=1} + definition.sounds=mcl_sounds.node_sound_metal_defaults() + definition._mcl_blast_resistance=3 + definition._mcl_hardness=3.5 + end + definition.groups._industrialtest_hasPowerOutput=1 + definition.groups._industrialtest_wrenchUnmountable=1 + minetest.register_node("industrialtest:"..config.name,definition) + if config.registerActiveVariant then + definition=table.copy(definition) + definition.description=nil + definition.tiles={ + "industrialtest_machine_block.png"..(config.customTopTexture and "^"..config.customTopTextureActive or ""), + "industrialtest_machine_block.png"..(config.customBottomTexture and "^"..config.customBottomTextureActive or ""), + "industrialtest_machine_block.png"..(config.customRightTexture and "^"..config.customRightTextureActive or ""), + "industrialtest_machine_block.png"..(config.customLeftTexture and "^"..config.customLeftTextureActive or ""), + "industrialtest_machine_block.png"..(config.customBackTexture and "^"..config.customBackTextureActive or ""), + "industrialtest_machine_block.png"..(config.customFrontTexture and "^"..config.customFrontTextureActive or "") + } + definition.on_timer=function(pos,elapsed) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local fluidSlot=inv:get_stack("fluid",1) + local chargedSlot=inv:get_stack("charged",1) + local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) + local shouldUpdateFormspec=false + local shouldRerunTimer=(afterFlow and meta:get_int("industrialtest.powerAmount")>0) + + if fluidSlot:get_count()>0 and meta:get_float("fluidAmount")<=9000 then + local fuel=config.getFuelByItem(fluidSlot:get_name()) + if fuel and (fuel.name==meta:get_string("fluid") or meta:get_string("fluid")=="") then + local leftover=false + local leftoverAddingSucceeded=false + for _,item in ipairs(fuel.storageItems) do + if item.name==fluidSlot:get_name() and item.leftover then + if inv:room_for_item("leftover",ItemStack(item.leftover)) then + inv:add_item("leftover",ItemStack(item.leftover)) + leftoverAddingSucceeded=true + end + leftover=true + end + end + if not leftover or leftoverAddingSucceeded then + fluidSlot:take_item() + inv:set_stack("fluid",1,fluidSlot) + meta:set_string("fluid",fuel.name) + meta:set_float("fluidAmount",meta:get_float("fluidAmount")+1000) + minetest.chat_send_all(meta:get_float("fluidAmount")) + shouldUpdateFormspec=true + shouldRerunTimer=false + end + end + end + if meta:get_float("fluidAmount")>=50 and not industrialtest.api.isFullyCharged(meta) then + meta:set_float("fluidAmount",meta:get_int("fluidAmount")-50*elapsed) + local toAdd=math.ceil(industrialtest.api.getGeothermalGeneratorFuel(meta:get_string("fluid")).calorificValue*elapsed) + industrialtest.api.addPower(meta,toAdd) + shouldUpdateFormspec=true + shouldRerunTimer=true + else + minetest.swap_node(pos,{ + name="industrialtest:"..config.name, + param2=minetest.get_node(pos).param2 + }) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end + if chargedSlot:get_count()>0 and meta:get_int("industrialtest.powerAmount")>0 then + if industrialtest.api.transferPowerToItem(meta,chargedSlot,industrialtest.api.lvPowerFlow)>0 then + inv:set_stack("charged",1,chargedSlot) + shouldUpdateFormspec=true + shouldRerunTimer=true + end + end + if flowTransferred then + shouldUpdateFormspec=true + end + + if shouldUpdateFormspec then + meta:set_string("formspec",getFormspec(meta:get_float("fluidAmount")/100,meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity"),meta:get_string("fluid"))) + end + + return shouldRerunTimer + end + if industrialtest.mclAvailable then + definition.groups.not_in_creative_inventory=1 + definition._doc_items_create_entry=false + end + definition.light_source=8 + minetest.register_node("industrialtest:"..config.name.."_active",definition) + end +end + +registerFluidGenerator({ + name="geothermal_generator", + displayName="Geothermal Generator", + customFrontTexture="industrialtest_geothermal_generator_front.png", + customFrontTextureActive="industrialtest_geothermal_generator_front_active.png", + getFuel=industrialtest.api.getGeothermalGeneratorFuel, + getFuelByItem=industrialtest.api.getGeothermalGeneratorFuelByItem, + registerActiveVariant=true, + reactsToNeighbouringNodes=false +}) + +registerFluidGenerator({ + name="water_mill", + displayName="Water Mill", + customLeftTexture="industrialtest_water_mill_side.png", + customRightTexture="industrialtest_water_mill_side.png", + customFrontTexture="industrialtest_water_mill_side.png", + customBackTexture="industrialtest_water_mill_side.png", + getFuel=industrialtest.api.getWaterMillFuel, + getFuelByItem=industrialtest.api.getWaterMillFuelByItem, + registerActiveVariant=false +}) +local neighbors={} +for key,_ in pairs(industrialtest.api.waterMillFuels) do + table.insert(neighbors,key) +end +minetest.register_abm({ + label="Water Mill generating", + nodenames={"industrialtest:water_mill"}, + neighbors=neighbors, + interval=industrialtest.updateDelay, + chance=1, + action=function(pos,node) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local chargedSlot=inv:get_stack("charged",1) + local powerToAdd=0 + local neighbourPositions={ + vector.offset(pos,-1,0,0), + vector.offset(pos,1,0,0), + vector.offset(pos,0,-1,0), + vector.offset(pos,0,1,0), + vector.offset(pos,0,0,-1), + vector.offset(pos,0,0,1) + } + for _,value in ipairs(neighbourPositions) do + local node=minetest.get_node_or_nil(value) + if node then + local fuel=industrialtest.api.getWaterMillFuel(node.name) + if fuel then + powerToAdd=powerToAdd+fuel.calorificValue*0.2 end end end - if meta:get_float("fluidAmount")>=50 and not industrialtest.api.isFullyCharged(meta) then - meta:set_float("fluidAmount",meta:get_int("fluidAmount")-50*elapsed) - local toAdd=math.ceil(industrialtest.api.getGeothermalGeneratorFuel(meta:get_string("fluid")).calorificValue*elapsed) - industrialtest.api.addPower(meta,toAdd) - shouldUpdateFormspec=true - minetest.swap_node(pos,{ - name="industrialtest:geothermal_generator_active", - param2=minetest.get_node(pos).param2 - }) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) + if industrialtest.api.addPower(meta,powerToAdd)>0 then + local def=minetest.registered_nodes[node.name] + def._industrialtest_updateFormspec(meta) end if chargedSlot:get_count()>0 and meta:get_int("industrialtest.powerAmount")>0 then if industrialtest.api.transferPowerToItem(meta,chargedSlot,industrialtest.api.lvPowerFlow)>0 then inv:set_stack("charged",1,chargedSlot) - shouldUpdateFormspec=true - shouldRerunTimer=true end end - - if shouldUpdateFormspec then - meta:set_string("formspec",geothermalGeneratorFormspec(meta:get_float("fluidAmount")/100,meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity"),meta:get_string("fluid"))) - end - - return shouldRerunTimer - end, - allow_metadata_inventory_move=function(pos,fromList,fromIndex,toList,toIndex,count) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local itemstack=inv:get_stack(fromList,fromIndex) - if toList=="charged" and not industrialtest.api.hasPowerStorage(itemstack:get_meta()) then - return 0 - end - return count - end, - allow_metadata_inventory_put=function(pos,listname,index,stack) - if toList=="charged" and not industrialtest.api.hasPowerStorage(stack:get_meta()) then - return 0 - end - return stack:get_count() - end, - on_metadata_inventory_move=function(pos) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end, - on_metadata_inventory_put=function(pos) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end, - _industrialtest_updateFormspec=function(meta) - meta:set_string("formspec",geothermalGeneratorFormspec(meta:get_float("fluidAmount")/100,meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity"),meta:get_string("fluid"))) end -} -if industrialtest.mtgAvailable then - definition.groups={ - cracky=1, - level=2 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:water_mill", + recipe={ + {"",industrialtest.elementKeys.stick,""}, + {industrialtest.elementKeys.stick,"industrialtest:generator",industrialtest.elementKeys.stick}, + {"",industrialtest.elementKeys.stick,""} } - 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("fluid")[1]:get_count()>0) - end -elseif industrialtest.mclAvailable then - definition.after_dig_node=function(pos,oldnode,oldmeta) - mclAfterDigNode(pos,oldmeta,{"charged","fluid"}) - end - definition.groups={pickaxey=1} - definition.sounds=mcl_sounds.node_sound_metal_defaults() - definition._mcl_blast_resistance=3 - definition._mcl_hardness=3.5 -end -definition.groups._industrialtest_hasPowerOutput=1 -definition.groups._industrialtest_wrenchUnmountable=1 -minetest.register_node("industrialtest:geothermal_generator",definition) -definition=table.copy(definition) -definition.description=nil -definition.tiles={ - "industrialtest_machine_block.png", - "industrialtest_machine_block.png", - "industrialtest_machine_block.png", - "industrialtest_machine_block.png", - "industrialtest_machine_block.png", - "industrialtest_machine_block.png^industrialtest_geothermal_generator_front_active.png", -} -definition.on_timer=function(pos,elapsed) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local fluidSlot=inv:get_stack("fluid",1) - local chargedSlot=inv:get_stack("charged",1) - local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) - local shouldUpdateFormspec=false - local shouldRerunTimer=(afterFlow and meta:get_int("industrialtest.powerAmount")>0) - - if fluidSlot:get_count()>0 and meta:get_float("fluidAmount")<=9000 then - local fuel=industrialtest.api.getGeothermalGeneratorFuelByItem(fluidSlot:get_name()) - if fuel and (fuel.name==meta:get_string("fluid") or meta:get_string("fluid")=="") then - local leftover=false - local leftoverAddingSucceeded=false - for _,item in ipairs(fuel.storageItems) do - if item.name==fluidSlot:get_name() and item.leftover then - if inv:room_for_item("leftover",ItemStack(item.leftover)) then - inv:add_item("leftover",ItemStack(item.leftover)) - leftoverAddingSucceeded=true - end - leftover=true - end - end - if not leftover or leftoverAddingSucceeded then - fluidSlot:take_item() - inv:set_stack("fluid",1,fluidSlot) - meta:set_string("fluid",fuel.name) - meta:set_float("fluidAmount",meta:get_float("fluidAmount")+1000) - minetest.chat_send_all(meta:get_float("fluidAmount")) - shouldUpdateFormspec=true - shouldRerunTimer=false - end - end - end - if meta:get_float("fluidAmount")>=50 and not industrialtest.api.isFullyCharged(meta) then - meta:set_float("fluidAmount",meta:get_int("fluidAmount")-50*elapsed) - local toAdd=math.ceil(industrialtest.api.getGeothermalGeneratorFuel(meta:get_string("fluid")).calorificValue*elapsed) - industrialtest.api.addPower(meta,toAdd) - shouldUpdateFormspec=true - shouldRerunTimer=true - else - minetest.swap_node(pos,{ - name="industrialtest:geothermal_generator", - param2=minetest.get_node(pos).param2 - }) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - if chargedSlot:get_count()>0 and meta:get_int("industrialtest.powerAmount")>0 then - if industrialtest.api.transferPowerToItem(meta,chargedSlot,industrialtest.api.lvPowerFlow)>0 then - inv:set_stack("charged",1,chargedSlot) - shouldUpdateFormspec=true - shouldRerunTimer=true - end - end - - if shouldUpdateFormspec then - meta:set_string("formspec",geothermalGeneratorFormspec(meta:get_float("fluidAmount")/100,meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity"),meta:get_string("fluid"))) - end - - return shouldRerunTimer -end -if industrialtest.mclAvailable then - definition.groups.not_in_creative_inventory=1 - definition._doc_items_create_entry=false -end -definition.light_source=8 -minetest.register_node("industrialtest:geothermal_generator_active",definition) +}) -- Item processing machines local function registerSimpleElectricItemProcessor(config) diff --git a/textures/SOURCES.md b/textures/SOURCES.md index 829183f..6ab7cc5 100644 --- a/textures/SOURCES.md +++ b/textures/SOURCES.md @@ -1,4 +1,6 @@ # Texture sources - `industrialtest_gui_lava.png` was taken from Minetest Game (by Cisoun licensed with CC BY-SA 3.0) +- `industrialtest_gui_water.png` was taken from Minetest Game (by Cisoun licensed with CC BY-SA 3.0) +- `industrialtest_gui_river_water.png` was taken from Minetest Game (by paramat licensed with CC BY-SA 3.0) ... rest was made either by LuanHawk, mrkubax10 or Migdyn and is licensed with CC BY 4.0 International \ No newline at end of file diff --git a/textures/industrialtest_gui_river_water.png b/textures/industrialtest_gui_river_water.png new file mode 100644 index 0000000000000000000000000000000000000000..be57575b0a4a0c8d5229b1b0100619e77b6c1a8d GIT binary patch literal 590 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf)c~ImSFvRm#8zAqTXjWj-7T>V zcf?m-7GHH$e9d+7bvMP=-xl9^SA5fb@huM}R$Y#PipHUsU6RxH{X}u@lSq-T&O|zzg#O z&n@;p3pn;dI7Mz9(1Y$JL4Lstr~_=d3l{;6eCX-o7$PCbdXU@ckO2?Fg@$b=b5$~3 zdu!A>7Ay+>V{BzE@#=5?lj;XDUO|cJJ7;<}E{JmxS{XHOxfOrFkr^-ZDl|F-oogGs zEb{BqPkY^vSnYjd`4qoLX&dLynOwSy;cExm^WI%L-G-(P6?b0p)hNWjN|t2aaN?$B z)RTzq_LfQ!b=T(XKDKY2+_sM=8j3Z3zM6K&RYlLcX;shV+2^M(+x0lke@kQGoxio! zp2_v4H@7P?Ca!sZcx#Zq8sBxUwu&wJ^ACI|iQa3-5Oja~!SWA(lkJ{tWp*+C@hQi! e$IRLNn|#V8so8pmHyZ;z%i!ti=d#Wzp$P!}Qzhj9 literal 0 HcmV?d00001 diff --git a/textures/industrialtest_gui_water.png b/textures/industrialtest_gui_water.png new file mode 100644 index 0000000000000000000000000000000000000000..47253db5b574aa0a94778b789f5058d50523986d GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a6|cA=UUOTb_O3+3L&@f+ zO6|||`ktFieBnR;rK3Ze6HpmvNswRgei-T5F+)Gp);Zni{?T^#xJd?|+ZEW`zuKlLh*mxQrW|zFMtObImHiiYG3%5R8^>H^ rn5iFrQ{|YO&z|1hd@Al?VV~t0bEQ)v56^lFbQ6Q8tDnm{r-UW|4oPDt literal 0 HcmV?d00001