diff --git a/init.lua b/init.lua index bdc363e..2eb6ed8 100644 --- a/init.lua +++ b/init.lua @@ -31,7 +31,21 @@ industrialtest.random=PseudoRandom(os.time()) dofile(modpath.."/compatibility.lua") dofile(modpath.."/api.lua") dofile(modpath.."/minerals.lua") -dofile(modpath.."/machines.lua") + +dofile(modpath.."/machines/common.lua") +dofile(modpath.."/machines/compressor.lua") +dofile(modpath.."/machines/electric_furnace.lua") +dofile(modpath.."/machines/extractor.lua") +dofile(modpath.."/machines/fluid_generator.lua") +dofile(modpath.."/machines/generator.lua") +dofile(modpath.."/machines/iron_furnace.lua") +dofile(modpath.."/machines/macerator.lua") +dofile(modpath.."/machines/power_storage.lua") +dofile(modpath.."/machines/recycler.lua") +dofile(modpath.."/machines/transformer.lua") +dofile(modpath.."/machines/solar_panel_generator.lua") +dofile(modpath.."/machines/wind_mill.lua") + dofile(modpath.."/craftitems.lua") dofile(modpath.."/nodes.lua") if industrialtest.developerMode then diff --git a/machines.lua b/machines.lua deleted file mode 100644 index 95eeb88..0000000 --- a/machines.lua +++ /dev/null @@ -1,1987 +0,0 @@ --- IndustrialTest --- Copyright (C) 2023 mrkubax10 - --- This program is free software: you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation, either version 3 of the License, or --- (at your option) any later version. - --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- You should have received a copy of the GNU General Public License --- along with this program. If not, see . - -local S=minetest.get_translator("industrialtest") - -local function mclAfterDigNode(pos,oldmeta,lists) - -- 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(lists) 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 function registerMachine(config) - local function getFormspec(pos) - local formspec - if industrialtest.mtgAvailable then - formspec={ - "formspec_version[4]", - "size[10.8,12]", - "label[0.5,0.5;"..S(config.displayName).."]", - (config.getFormspec and config.getFormspec(pos) 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).."]", - (config.getFormspec and config.getFormspec(pos) 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 - local definition={ - description=S(config.displayName), - on_construct=function(pos) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - meta:set_string("formspec",getFormspec(pos)) - if config.onConstruct then - config.onConstruct(pos,meta,inv) - end - industrialtest.api.addPowerStorage(meta,config.capacity,config.flow,config.ioConfig) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end, - on_timer=function(pos,elapsed) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local shouldRerunTimer=false - local shouldUpdateFormspec=false - - if config.onTimer then - shouldRerunTimer,shouldUpdateFormspec=config.onTimer(pos,elapsed,meta,inv) - end - - if shouldUpdateFormspec then - meta:set_string("formspec",getFormspec(pos)) - 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 movedItemStack=inv:get_stack(fromList,1) - local found=false - if config.powerSlots then - for _,value in ipairs(config.powerSlots) do - if value==toList then - found=true - break - end - end - end - if found and not industrialtest.api.hasPowerStorage(movedItemStack:get_meta()) then - return 0 - end - if config.allowMetadataInventoryMove then - return config.allowMetadataInventoryMove(pos,fromList,fromIndex,toList,toIndex,count) - end - return count - end, - allow_metadata_inventory_put=function(pos,listname,index,stack,player) - local found=false - if config.powerSlots then - for _,value in ipairs(config.powerSlots) do - if value==listname then - found=true - break - end - end - end - if found and not industrialtest.api.hasPowerStorage(stack:get_meta()) then - return 0 - end - if config.allowMetadataInventoryPut then - return config.allowMetadataInventoryPut(pos,listname,index,stack,player) - end - return stack:get_count() - end, - on_metadata_inventory_put=function(pos,listname,index,stack,player) - if config.onMetadataInventoryPut then - config.onMetadataInventoryPut(pos,listname,index,stack,player) - end - end, - on_metadata_inventory_move=function(pos,fromList,fromIndex,toList,toIndex,count) - if config.onMetadataInventoryPut then - config.onMetadataInventoryMove(pos,fromList,fromIndex,toList,toIndex,count) - end - end, - on_metadata_inventory_take=function(pos,listname,index,stack,player) - if config.onMetadataInventoryTake then - config.onMetadataInventoryTake(pos,listname,index,stack,player) - end - end, - _industrialtest_updateFormspec=function(pos) - local meta=minetest.get_meta(pos) - meta:set_string("formspec",getFormspec(pos)) - end - } - if industrialtest.mtgAvailable then - definition.groups={cracky=2} - if config.sounds=="metal" then - definition.sounds=default.node_sound_metal_defaults() - end - definition.can_dig=function(pos) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - for _,value in ipairs(config.storageSlots) do - if inv:get_stack(value,1):get_count()>0 then - return false - end - end - return true - end - elseif industrialtest.mclAvailable then - definition.after_dig_node=function(pos,oldnode,oldmeta) - mclAfterDigNode(pos,oldmeta,config.storageSlots) - end - if config.sounds=="metal" then - definition.sounds=mcl_sounds.node_sound_metal_defaults() - end - definition.groups={pickaxey=1} - definition._mcl_blast_resistance=3.5 - definition._mcl_hardness=3.9 - end - definition.groups._industrialtest_wrenchUnmountable=1 - if config.requiresWrench then - definition.drop="industrialtest:machine_block" - end - if config.customKeys then - for key,value in pairs(config.customKeys) do - definition[key]=value - end - end - if config.groups then - for key,value in pairs(config.groups) do - definition.groups[key]=value - end - end - minetest.register_node("industrialtest:"..config.name,definition) - if config.registerActiveVariant then - definition=table.copy(definition) - definition.description=nil - definition.on_timer=function(pos,elapsed) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local shouldRerunTimer=false - local shouldUpdateFormspec=false - - if config.onTimer then - shouldRerunTimer,shouldUpdateFormspec=config.activeOnTimer(pos,elapsed,meta,inv) - end - - if shouldUpdateFormspec then - meta:set_string("formspec",getFormspec(pos)) - end - - return shouldRerunTimer - end - if not definition.drop then - definition.drop="industrialtest:"..config.name - end - if config.activeCustomKeys then - for key,value in pairs(config.activeCustomKeys) do - definition[key]=value - end - end - if industrialtest.mclAvailable then - definition.groups.not_in_creative_inventory=1 - definition._doc_items_create_entry=false - end - minetest.register_node("industrialtest:"..config.name.."_active",definition) - end -end - --- Generators -local function generatorFormspec(pos) - local meta=minetest.get_meta(pos) - local fuelPercent=meta:get_int("fuelTime")/meta:get_int("maxFuelTime")*100 - local charged=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity") - local formspec - if industrialtest.mtgAvailable then - formspec={ - "list[context;charged;4.9,1.8;1,1]", - "listring[context;charged]", - (fuelPercent>0 and "image[4.9,2.8;1,1;default_furnace_fire_bg.png^[lowpart:"..fuelPercent..":default_furnace_fire_fg.png]" - or "image[4.9,2.8;1,1;default_furnace_fire_bg.png]"), - "list[context;fuel;4.9,3.9;1,1]", - "listring[context;fuel]", - "box[9,1;0.3,4.8;#202020]", - (charged>0 and "box[9,"..(1+4.8-(charged*4.8))..";0.3,"..(charged*4.8)..";#FF1010]" or "") - } - elseif industrialtest.mclAvailable then - formspec={ - "list[context;charged;4.7,1.8;1,1]", - mcl_formspec.get_itemslot_bg(4.7,1.8,1,1), - "listring[context;charged]", - (fuelPercent>0 and "image[4.7,2.8;1,1;default_furnace_fire_bg.png^[lowpart:"..fuelPercent..":default_furnace_fire_fg.png]" - or "image[4.7,2.8;1,1;default_furnace_fire_bg.png]"), - "list[context;fuel;4.7,3.9;1,1]", - mcl_formspec.get_itemslot_bg(4.7,3.9,1,1), - "listring[context;fuel]", - "box[9,1;0.3,4.8;#202020]", - (charged>0 and "box[9,"..(1+4.8-(charged*4.8))..";0.3,"..(charged*4.8)..";#FF1010]" or "") - } - end - return table.concat(formspec,"") -end -registerMachine({ - name="generator", - displayName="Generator", - getFormspec=generatorFormspec, - capacity=7000, - flow=industrialtest.api.lvPowerFlow, - ioConfig="oooooo", - registerActiveVariant=true, - powerSlots={"charged"}, - storageSlots={"charged","fuel"}, - sounds="metal", - groups={ - _industrialtest_hasPowerOutput=1 - }, - customKeys={ - 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_iron_furnace_front.png", - "industrialtest_machine_block.png" - }, - paramtype2="facedir", - legacy_facedir_simple=true - }, - activeCustomKeys={ - 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_iron_furnace_front_active.png", - "industrialtest_machine_block.png" - }, - light_source=8 - }, - onConstruct=function(pos,meta,inv) - inv:set_size("charged",1) - inv:set_size("fuel",1) - meta:set_int("fuelTime",0) - meta:set_int("maxFuelTime",1) - end, - onTimer=function(pos,elapsed,meta,inv) - local powerFlow=meta:get_int("industrialtest.powerFlow") - local chargedSlot=inv:get_stack("charged",1) - local fuelSlot=inv:get_stack("fuel",1) - local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) - local shouldUpdateFormspec=flowTransferred - local shouldRerunTimer=(afterFlow and meta:get_int("industrialtest.powerAmount")>0) - if chargedSlot:get_count()>0 and not industrialtest.api.isFullyCharged(chargedSlot:get_meta()) and meta:get_int("industrialtest.powerAmount")>0 then - industrialtest.api.transferPowerToItem(meta,chargedSlot,powerFlow) - inv:set_stack("charged",1,chargedSlot) - shouldUpdateFormspec=true - shouldRerunTimer=true - end - if fuelSlot:get_count()>0 and meta:get_int("fuelTime")<=0 and not industrialtest.api.isFullyCharged(meta) then - local output,after=minetest.get_craft_result({ - method="fuel", - width=1, - items={fuelSlot} - }) - if output.time>0 then - meta:set_int("fuelTime",output.time) - meta:set_int("maxFuelTime",output.time) - inv:set_stack("fuel",1,after.items[1]) - minetest.swap_node(pos,{ - name="industrialtest:generator_active", - param2=minetest.get_node(pos).param2 - }) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - end - return shouldRerunTimer,shouldUpdateFormspec - end, - activeOnTimer=function(pos,elapsed,meta,inv) - local chargedSlot=inv:get_stack("charged",1) - local fuelSlot=inv:get_stack("fuel",1) - local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) - local shouldUpdateFormspec=flowTransferred - local shouldRerunTimer=(afterFlow and meta:get_int("industrialtest.powerAmount")>0) - if chargedSlot:get_count()>0 and not industrialtest.api.isFullyCharged(chargedSlot:get_meta()) and meta:get_int("industrialtest.powerAmount")>0 then - industrialtest.api.transferPowerToItem(meta,chargedSlot,chargedSlot:get_meta():get_int("industrialtest.powerFlow")) - inv:set_stack("charged",1,chargedSlot) - shouldUpdateFormspec=true - shouldRerunTimer=true - end - if fuelSlot:get_count()>0 and meta:get_int("fuelTime")<=0 and not industrialtest.api.isFullyCharged(meta) then - local output,after=minetest.get_craft_result({ - method="fuel", - width=1, - items={fuelSlot} - }) - if output.time>0 then - meta:set_int("fuelTime",output.time) - meta:set_int("maxFuelTime",output.time) - inv:set_stack("fuel",1,after.items[1]) - end - end - if meta:get_int("fuelTime")>0 then - meta:set_int("fuelTime",meta:get_int("fuelTime")-elapsed) - industrialtest.api.addPower(meta,200) - shouldUpdateFormspec=true - shouldRerunTimer=true - else - minetest.swap_node(pos,{ - name="industrialtest:generator", - param2=minetest.get_node(pos).param2 - }) - end - return shouldRerunTimer,shouldUpdateFormspec - end, - onMetadataInventoryPut=function(pos) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end, - onMetadataInventoryMove=function(pos) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:generator", - recipe={ - {"industrialtest:re_battery"}, - {"industrialtest:machine_block"}, - {industrialtest.elementKeys.furnace} - } -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:generator", - recipe={ - {"","industrialtest:re_battery",""}, - {"industrialtest:refined_iron_ingot","industrialtest:refined_iron_ingot","industrialtest:refined_iron_ingot"}, - {"","industrialtest:iron_furnace",""} - } -}) - -local function registerSolarPanelGenerator(config) - local function getFormspec(pos) - local amount=minetest.get_natural_light(vector.offset(pos,0,1,0))/15.0 - local charging=amount>0.5 - local formspec - if industrialtest.mtgAvailable then - formspec={ - "list[context;charged;4.9,1.8;1,1]", - "listring[context;charged]", - (charging and "image[4.9,2.8;1,1;industrialtest_gui_sun_fg.png]" - or "image[4.9,2.8;1,1;industrialtest_gui_sun_bg.png]") - } - elseif industrialtest.mclAvailable then - formspec={ - "list[context;charged;4.7,1.8;1,1]", - mcl_formspec.get_itemslot_bg(4.7,1.8,1,1), - "listring[context;charged]", - (charging and "image[4.7,2.8;1,1;industrialtest_gui_sun_fg.png]" - or "image[4.7,2.8;1,1;industrialtest_gui_sun_bg.png]") - } - end - return table.concat(formspec,"") - end - registerMachine({ - name=config.name, - displayName=config.displayName, - getFormspec=getFormspec, - capacity=config.capacity, - flow=config.flow, - ioConfig="oooooo", - requiresWrench=true, - registerActiveVariant=false, - powerSlots={"charged"}, - storageSlots={"charged"}, - sounds="metal", - groups={ - _industrialtest_hasPowerOutput=1 - }, - customKeys={ - tiles={ - "industrialtest_machine_block.png^industrialtest_"..config.name.."_top.png", - "industrialtest_machine_block.png" - } - }, - onConstruct=function(pos,meta,inv) - inv:set_size("charged",1) - meta:set_float("prevAmount",0) - end, - onTimer=function(pos,elapsed,meta,inv) - local chargedSlot=inv:get_stack("charged",1) - local shouldUpdateFormspec=false - local amount=minetest.get_natural_light(vector.offset(pos,0,1,0))/15.0 - local charging=amount>0.5 - if charging then - industrialtest.api.addPower(meta,math.ceil(amount*config.flow*elapsed)) - end - if meta:get_int("industrialtest.powerAmount")>0 then - if chargedSlot:get_count()>0 and not industrialtest.api.isFullyCharged(chargedSlot:get_meta()) then - industrialtest.api.transferPowerToItem(meta,chargedSlot,math.ceil(config.flow*elapsed)) - inv:set_stack("charged",1,chargedSlot) - end - industrialtest.api.powerFlow(pos) - end - if amount~=meta:get_float("prevAmount") then - shouldUpdateFormspec=true - meta:set_float("prevAmount",amount) - end - return true,shouldUpdateFormspec - end - }) -end - -registerSolarPanelGenerator({ - name="solar_panel", - displayName="Solar Panel", - capacity=industrialtest.api.lvPowerFlow*2, - flow=industrialtest.api.lvPowerFlow -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:solar_panel", - recipe={ - {"industrialtest:coal_dust",industrialtest.elementKeys.glass,"industrialtest:coal_dust"}, - {industrialtest.elementKeys.glass,"industrialtest:coal_dust",industrialtest.elementKeys.glass}, - {"industrialtest:insulated_copper_cable","industrialtest:generator","industrialtest:insulated_copper_cable"} - } -}) - -registerSolarPanelGenerator({ - name="lv_solar_array", - displayName="LV Solar Array", - capacity=industrialtest.api.lvPowerFlow*4, - flow=industrialtest.api.lvPowerFlow*2 -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:lv_solar_array", - recipe={ - {"industrialtest:solar_panel","industrialtest:solar_panel","industrialtest:solar_panel"}, - {"industrialtest:solar_panel","industrialtest:lv_transformer","industrialtest:solar_panel"}, - {"industrialtest:solar_panel","industrialtest:solar_panel","industrialtest:solar_panel"} - } -}) - -registerSolarPanelGenerator({ - name="mv_solar_array", - displayName="MV Solar Array", - capacity=industrialtest.api.mvPowerFlow*2, - flow=industrialtest.api.mvPowerFlow -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:mv_solar_array", - recipe={ - {"industrialtest:lv_solar_array","industrialtest:lv_solar_array","industrialtest:lv_solar_array"}, - {"industrialtest:lv_solar_array","industrialtest:mv_transformer","industrialtest:lv_solar_array"}, - {"industrialtest:lv_solar_array","industrialtest:lv_solar_array","industrialtest:lv_solar_array"} - } -}) - -registerSolarPanelGenerator({ - name="hv_solar_array", - displayName="HV Solar Array", - capacity=industrialtest.api.hvPowerFlow*2, - flow=industrialtest.api.hvPowerFlow -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:hv_solar_array", - recipe={ - {"industrialtest:mv_solar_array","industrialtest:mv_solar_array","industrialtest:mv_solar_array"}, - {"industrialtest:mv_solar_array","industrialtest:hv_transformer","industrialtest:mv_solar_array"}, - {"industrialtest:mv_solar_array","industrialtest:mv_solar_array","industrialtest:mv_solar_array"} - } -}) - -local function registerFluidGenerator(config) - local function getFormspec(pos) - local meta=minetest.get_meta(pos) - local fluidPercent=meta:get_float("fluidAmount")/100 - local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity") - local fluid=meta:get_string("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={ - "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 "") - } - elseif industrialtest.mclAvailable then - formspec={ - "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 "") - } - end - return table.concat(formspec,"") - end - local definition={ - name=config.name, - displayName=config.displayName, - getFormspec=getFormspec, - capacity=7000, - flow=industrialtest.api.lvPowerFlow, - ioConfig="oooooo", - requiresWrench=true, - registerActiveVariant=config.registerActiveVariant, - powerSlots={"charged"}, - storageSlots={"fluid","fluidLeftover"}, - sounds="metal", - groups={ - _industrialtest_hasPowerOutput=1 - }, - customKeys={ - 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 - }, - onConstruct=function(pos,meta,inv) - inv:set_size("charged",1) - inv:set_size("fluid",1) - inv:set_size("leftover",1) - meta:set_float("fluidAmount",0) - meta:set_string("fluid","") - end, - onTimer=function(pos,elapsed,meta,inv) - 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) - 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(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=true - end - end - if flowTransferred then - shouldUpdateFormspec=true - end - return shouldRerunTimer,shouldUpdateFormspec - end, - onMetadataInventoryPut=function(pos) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end, - onMetadataInventoryMove=function(pos) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - } - if config.registerActiveVariant then - definition.activeCustomKeys={ - 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 "") - }, - light_source=8 - } - definition.activeOnTimer=function(pos,elapsed,meta,inv) - 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 - return shouldRerunTimer,shouldUpdateFormspec - end - end - registerMachine(definition) -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 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) - end - end - end -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:water_mill", - recipe={ - {"",industrialtest.elementKeys.stick,""}, - {industrialtest.elementKeys.stick,"industrialtest:generator",industrialtest.elementKeys.stick}, - {"",industrialtest.elementKeys.stick,""} - } -}) - -local function windMillFormspec(pos) - local meta=minetest.get_meta(pos) - local charging=meta:get_int("charging") - local formspec - if industrialtest.mtgAvailable then - formspec={ - "list[context;charged;4.9,1.8;1,1]", - "listring[context;charged]", - (charging>0 and "image[4.9,3;1,1;industrialtest_gui_wind_bg.png^[lowpart:"..charging..":industrialtest_gui_wind_fg.png]" - or "image[4.9,3;1,1;industrialtest_gui_wind_bg.png]") - } - elseif industrialtest.mclAvailable then - formspec={ - "list[context;charged;4.7,1.8;1,1]", - mcl_formspec.get_itemslot_bg(4.7,1.8,1,1), - "listring[context;charged]", - (charging>0 and "image[4.7,3;1,1;industrialtest_gui_wind_bg.png^[lowpart:"..charging..":industrialtest_gui_wind_fg.png]" - or "image[4.7,3;1,1;industrialtest_gui_wind_bg.png]") - } - end - return table.concat(formspec,"") -end -registerMachine({ - name="wind_mill", - displayName="Wind Mill", - getFormspec=windMillFormspec, - capacity=7000, - flow=industrialtest.api.lvPowerFlow, - ioConfig="oooooo", - requiresWrench=true, - registerActiveVariant=false, - powerSlots={"charged"}, - storageSlots={"charged"}, - sounds="metal", - groups={ - _industrialtest_hasPowerOutput=1 - }, - customKeys={ - tiles={ - "industrialtest_machine_block.png", - "industrialtest_machine_block.png", - "industrialtest_machine_block.png^industrialtest_wind_mill_side.png", - "industrialtest_machine_block.png^industrialtest_wind_mill_side.png", - "industrialtest_machine_block.png^industrialtest_wind_mill_side.png", - "industrialtest_machine_block.png^industrialtest_wind_mill_side.png" - } - }, - onConstruct=function(pos,meta,inv) - inv:set_size("charged",1) - meta:set_int("prevCharging",0) - meta:set_int("charging",0) - end, - onTimer=function(pos,elapsed,meta,inv) - local chargedSlot=inv:get_stack("charged",1) - local shouldUpdateFormspec=false - local charging - if industrialtest.mtgAvailable then - charging=math.min(math.max(pos.y,0)/150,1.0) - elseif industrialtest.mclAvailable then - local dimMax=31000 - local dim=mcl_worlds.pos_to_dimension(pos) - if dim=="overworld" then - dimMax=mcl_vars.mg_overworld_max - elseif dim=="nether" then - dimMax=mcl_vars.mg_nether_max - elseif dim=="end" then - dimMax=mcl_vars.mg_end_max - end - charging=math.max(mcl_worlds.layer_to_y(pos.y,dim),0)/dimMax - end - local neighbourPositions={ - vector.offset(pos,-1,0,0), - vector.offset(pos,1,0,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 and node.name~="air" then - charging=0 - break - end - end - industrialtest.api.addPower(meta,math.ceil(charging*elapsed*industrialtest.api.lvPowerFlow)) - if meta:get_int("prevCharging")~=charging then - shouldUpdateFormspec=true - 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) - end - end - industrialtest.api.powerFlow(pos) - meta:set_int("charging",charging*100) - return true,shouldUpdateFormspec - - end -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:wind_mill", - recipe={ - {"","industrialtest:refined_iron_ingot",""}, - {"industrialtest:refined_iron_ingot","industrialtest:generator","industrialtest:refined_iron_ingot"}, - {"","industrialtest:refined_iron_ingot",""} - } -}) - --- Item processing machines -local function registerSimpleElectricItemProcessor(config) - local function getFormspec(pos) - local meta=minetest.get_meta(pos) - local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100 - local srcPercent=meta:get_float("srcTime")/meta:get_float("maxSrcTime")*100 - local formspec - if industrialtest.mtgAvailable then - formspec={ - "list[context;src;3.4,1.8;1,1]", - "listring[context;src]", - (powerPercent>0 and "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]" - or "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png]"), - "list[context;powerStorage;3.4,3.9;1,1]", - "listring[context;powerStorage]", - (srcPercent>0 and "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[lowpart:"..srcPercent..":gui_furnace_arrow_fg.png^[transformR270]" - or "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[transformR270]"), - "list[context;dst;6.4,2.8;1,1]", - "listring[context;dst]", - "list[context;upgrades;9,0.9;1,4]", - "listring[context;upgrades]" - } - elseif industrialtest.mclAvailable then - formspec={ - "list[context;src;3.4,1.8;1,1]", - mcl_formspec.get_itemslot_bg(3.4,1.8,1,1), - "listring[context;src]", - (powerPercent>0 and "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]" - or "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png]"), - "list[context;powerStorage;3.4,3.9;1,1]", - mcl_formspec.get_itemslot_bg(3.4,3.9,1,1), - "listring[context;powerStorage]", - (srcPercent>0 and "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[lowpart:"..srcPercent..":gui_furnace_arrow_fg.png^[transformR270]" - or "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[transformR270]"), - "list[context;dst;6.4,2.8;1,1]", - mcl_formspec.get_itemslot_bg(6.4,2.8,1,1), - "listring[context;dst]", - "list[context;upgrades;9,0.9;1,4]", - mcl_formspec.get_itemslot_bg(9,0.9,1,4), - "listring[context;upgrades]" - } - end - return table.concat(formspec,"") - end - local function craftResultProxy(method,item) - if method=="cooking" then - local output,after=minetest.get_craft_result({ - method=method, - width=1, - items={item} - }) - return { - item=output.item, - time=output.time, - src=after.items[1] - } - elseif method=="industrialtest.macerating" then - local output=industrialtest.api.getMaceratorRecipeResult(item:get_name()) - if not output then - return { - item=ItemStack(), - time=0, - src=item - } - end - local srcAfter=ItemStack(item:get_name()) - srcAfter:set_count(item:get_count()-1) - return { - item=ItemStack(output.output), - time=output.time, - src=srcAfter - } - elseif method=="industrialtest.compressing" then - local output=industrialtest.api.getCompressorRecipeResult(item:get_name()) - if not output or item:get_count()0 then - local stackMeta=powerStorageSlot:get_meta() - if industrialtest.api.transferPower(stackMeta,meta,stackMeta:get_int("industrialtest.powerFlow"))>0 then - shouldUpdateFormspec=true - shouldRerunTimer=true - industrialtest.api.updateItemPowerText(powerStorageSlot) - inv:set_stack("powerStorage",1,powerStorageSlot) - end - end - if srcSlot:get_count()>0 and meta:get_int("industrialtest.powerAmount")>=requiredPower then - local output=craftResultProxy(config.method,srcSlot) - if output.time>0 and inv:room_for_item("dst",output.item) then - if meta:get_float("maxSrcTime")<=0 then - meta:set_float("srcTime",0) - meta:set_float("maxSrcTime",output.time*config.efficiency) - end - minetest.swap_node(pos,{ - name="industrialtest:"..config.name.."_active", - param2=minetest.get_node(pos).param2 - }) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - end - if not industrialtest.api.isFullyCharged(meta) then - industrialtest.api.triggerNeighbours(pos) - end - return shouldRerunTimer,shouldUpdateFormspec - end, - allowMetadataInventoryMove=function(pos,fromList,fromIndex,toList,count) - if toList=="dst" then - return 0 - elseif toList=="upgrades" then - -- TODO: Add support for upgrades when they will be added - return 0 - end - return count - end, - allowMetadataInventoryPut=function(pos,listname,index,stack) - if listname=="dst" then - return 0 - elseif listname=="src" then - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local srcSlot=inv:get_stack("src",1) - if srcSlot:get_name()~=stack:get_name() then - meta:set_float("srcTime",-1) - meta:set_float("maxSrcTime",0) - end - elseif listname=="upgrades" then - --TODO: See allow_metadata_inventory_move - return 0 - end - return stack:get_count() - end, - onMetadataInventoryPut=function(pos) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end, - onMetadataInventoryMove=function(pos,fromList,fromIndex,toList,toIndex,count) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local srcSlot=inv:get_stack("src",1) - local dstSlot=inv:get_stack("dst",1) - if fromList=="src" and count==srcSlot:get_count() then - meta:set_float("srcTime",-1) - meta:set_float("maxSrcTime",0) - if meta:get_int("industrialtest.powerAmount")>0 then - meta:set_string("formspec",getFormspec(pos)) - end - elseif fromList=="dst" and dstSlot:get_free_space()==0 then - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - end, - onMetadataInventoryTake=function(pos,listname,index,stack) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local srcSlot=inv:get_stack("src",1) - local dstSlot=inv:get_stack("dst",1) - if listname=="src" and stack:get_count()==srcSlot:get_count() then - meta:set_float("srcTime",-1) - meta:set_float("maxSrcTime",0) - if meta:get_int("industrialtest.powerAmount")>0 then - meta:set_string("formspec",getFormspec(pos)) - end - elseif listname=="dst" and dstSlot:get_free_space()==0 then - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - end, - activeOnTimer=function(pos,elapsed,meta,inv) - local srcSlot=inv:get_stack("src",1) - local powerStorageSlot=inv:get_stack("powerStorage",1) - local shouldUpdateFormspec=false - local shouldRerunTimer=false - local requiredPower=elapsed*config.opPower - - if powerStorageSlot:get_count()>0 then - local stackMeta=powerStorageSlot:get_meta() - if industrialtest.api.transferPower(stackMeta,meta,stackMeta:get_int("industrialtest.powerFlow"))>0 then - shouldUpdateFormspec=true - shouldRerunTimer=true - industrialtest.api.updateItemPowerText(powerStorageSlot) - inv:set_stack("powerStorage",1,powerStorageSlot) - end - end - if srcSlot:get_count()>0 and meta:get_float("maxSrcTime")<=0 and meta:get_int("industrialtest.powerAmount")>=requiredPower then - local output=craftResultProxy(config.method,srcSlot) - if output.time>0 and inv:room_for_item("dst",output.item) then - meta:set_float("srcTime",0) - meta:set_float("maxSrcTime",output.time*config.efficiency) - end - end - if srcSlot:get_count()==0 and meta:get_float("maxSrcTime")>0 then - meta:set_float("srcTime",-1) - meta:set_float("maxSrcTime",0) - shouldUpdateFormspec=true - end - if meta:get_float("maxSrcTime")>0 then - if meta:get_int("industrialtest.powerAmount")>=requiredPower then - meta:set_int("industrialtest.powerAmount",meta:get_int("industrialtest.powerAmount")-requiredPower) - meta:set_float("srcTime",meta:get_float("srcTime")+elapsed) - shouldRerunTimer=true - end - shouldUpdateFormspec=true - end - if meta:get_float("maxSrcTime")<=0 or meta:get_int("industrialtest.powerAmount")=meta:get_float("maxSrcTime") then - local output=craftResultProxy(config.method,srcSlot) - if output.item:get_count()>0 then - inv:add_item("dst",output.item) - meta:set_float("srcTime",-1) - meta:set_float("maxSrcTime",0) - end - inv:set_stack("src",1,output.src) - end - if not industrialtest.api.isFullyCharged(meta) then - industrialtest.api.triggerNeighbours(pos) - end - return shouldRerunTimer,shouldUpdateFormspec - end - }) -end - -local function ironFurnaceFormspec(fuelPercent,srcPercent) - local formspec - if industrialtest.mtgAvailable then - formspec={ - "formspec_version[4]", - "size[10.8,12]", - "label[0.5,0.5;"..S("Iron Furnace").."]", - "list[context;src;3.4,1.8;1,1]", - "listring[context;src]", - (fuelPercent>0 and "image[3.4,2.8;1,1;default_furnace_fire_bg.png^[lowpart:"..fuelPercent..":default_furnace_fire_fg.png]" - or "image[3.4,2.8;1,1;default_furnace_fire_bg.png]"), - "list[context;fuel;3.4,3.9;1,1]", - "listring[context;fuel]", - (srcPercent>0 and "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[lowpart:"..srcPercent..":gui_furnace_arrow_fg.png^[transformR270]" - or "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[transformR270]"), - "list[context;dst;6.4,2.8;1,1]", - "listring[context;dst]", - "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("Iron Furnace").."]", - "list[context;src;3.4,1.8;1,1]", - mcl_formspec.get_itemslot_bg(3.4,1.8,1,1), - "listring[context;src]", - (fuelPercent>0 and "image[3.4,2.8;1,1;default_furnace_fire_bg.png^[lowpart:"..fuelPercent..":default_furnace_fire_fg.png]" - or "image[3.4,2.8;1,1;default_furnace_fire_bg.png]"), - "list[context;fuel;3.4,3.9;1,1]", - mcl_formspec.get_itemslot_bg(3.4,3.9,1,1), - "listring[context;fuel]", - (srcPercent>0 and "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[lowpart:"..srcPercent..":gui_furnace_arrow_fg.png^[transformR270]" - or "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[transformR270]"), - "list[context;dst;6.4,2.8;1,1]", - mcl_formspec.get_itemslot_bg(6.4,2.8,1,1), - "listring[context;dst]", - "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 -definition={ - description=S("Iron Furnace"), - 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_iron_furnace_front.png", - "industrialtest_machine_block.png" - }, - paramtype2="facedir", - legacy_facedir_simple=true, - on_construct=function(pos,placer) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - inv:set_size("src",1) - inv:set_size("dst",1) - inv:set_size("fuel",1) - meta:set_string("formspec",ironFurnaceFormspec(0,0)) - meta:set_float("fuelTime",0) - meta:set_float("maxFuelTime",1) - meta:set_float("srcTime",-1) - meta:set_float("maxSrcTime",0) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end, - on_timer=function(pos,elapsed) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local srcSlot=inv:get_stack("src",1) - local fuelSlot=inv:get_stack("fuel",1) - local shouldUpdateFormspec=false - local shouldRerunTimer=false - - if fuelSlot:get_count()>0 and meta:get_float("fuelTime")<=0 then - local output,after=minetest.get_craft_result({ - method="cooking", - width=1, - items={srcSlot} - }) - if output.time>0 and inv:room_for_item("dst",output.item) then - output,after=minetest.get_craft_result({ - method="fuel", - width=1, - items={fuelSlot} - }) - if output.time>0 then - meta:set_float("fuelTime",output.time) - meta:set_float("maxFuelTime",output.time) - inv:set_stack("fuel",1,after.items[1]) - minetest.swap_node(pos,{ - name="industrialtest:iron_furnace_active", - param2=minetest.get_node(pos).param2 - }) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - end - end - - if shouldUpdateFormspec then - meta:set_string("formspec",ironFurnaceFormspec(meta:get_float("fuelTime")/meta:get_float("maxFuelTime")*100,meta:get_float("srcTime")/meta:get_float("maxSrcTime")*100)) - end - - return shouldRerunTimer - end, - allow_metadata_inventory_move=function(pos,fromList,fromIndex,toList,toIndex,count,player) - if toList=="dst" then - return 0 - end - return count - end, - allow_metadata_inventory_put=function(pos,listname,index,stack) - if listname=="dst" then - return 0 - elseif listname=="src" then - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local srcSlot=inv:get_stack("src",1) - if srcSlot:get_name()~=stack:get_name() then - meta:set_float("srcTime",-1) - meta:set_float("maxSrcTime",0) - end - end - return stack:get_count() - end, - on_metadata_inventory_move=function(pos,fromList,fromIndex,toList,toIndex,count) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local srcSlot=inv:get_stack("src",1) - local dstSlot=inv:get_stack("dst",1) - if fromList=="src" and count==srcSlot:get_count() then - meta:set_float("srcTime",-1) - meta:set_float("maxSrcTime",0) - if meta:get_float("maxFuelTime")>0 then - meta:set_string("formspec",ironFurnaceFormspec(meta:get_float("fuelTime")/meta:get_float("maxFuelTime")*100,0)) - end - elseif fromList=="dst" and dstSlot:get_free_space()==0 then - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - end, - on_metadata_inventory_put=function(pos,listname,index,stack) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end, - on_metadata_inventory_take=function(pos,listname,index,stack) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local srcSlot=inv:get_stack("src",1) - local dstSlot=inv:get_stack("dst",1) - if listname=="src" and stack:get_count()==srcSlot:get_count() then - meta:set_float("srcTime",-1) - meta:set_float("maxSrcTime",0) - if meta:get_float("maxFuelTime")>0 then - meta:set_string("formspec",ironFurnaceFormspec(meta:get_float("fuelTime")/meta:get_float("maxFuelTime")*100,0)) - end - elseif listname=="dst" and dstSlot:get_free_space()==0 then - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - 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("src")[1]:get_count()>0 or inv:get_list("fuel")[1]:get_count()>0 or inv:get_list("dst")[1]:get_count()>0) - end -elseif industrialtest.mclAvailable then - definition.after_dig_node=function(pos,oldnode,oldmeta) - mclAfterDigNode(pos,oldmeta,{"src","fuel","dst"}) - end - definition.sounds=mcl_sounds.node_sound_metal_defaults() - definition._mcl_blast_resistance=3 - definition._mcl_hardness=3.5 -end -minetest.register_node("industrialtest:iron_furnace",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_iron_furnace_front_active.png", - "industrialtest_machine_block.png" -} -definition.light_source=8 -definition.drop="industrialtest:iron_furnace" -definition.on_timer=function(pos,elapsed) - local meta=minetest.get_meta(pos) - local inv=meta:get_inventory() - local srcSlot=inv:get_stack("src",1) - local fuelSlot=inv:get_stack("fuel",1) - local shouldUpdateFormspec=false - local shouldRerunTimer=false - - if fuelSlot:get_count()>0 and meta:get_float("fuelTime")<=0 then - local output,after=minetest.get_craft_result({ - method="cooking", - width=1, - items={srcSlot} - }) - if output.time>0 and inv:room_for_item("dst",output.item) then - output,after=minetest.get_craft_result({ - method="fuel", - width=1, - items={fuelSlot} - }) - if output.time>0 then - meta:set_float("fuelTime",output.time) - meta:set_float("maxFuelTime",output.time) - inv:set_stack("fuel",1,after.items[1]) - end - end - end - if srcSlot:get_count()>0 and meta:get_float("maxSrcTime")<=0 and meta:get_float("fuelTime")>0 then - local output,after=minetest.get_craft_result({ - method="cooking", - width=1, - items={srcSlot} - }) - if output.time>0 and inv:room_for_item("dst",output.item) then - meta:set_float("srcTime",0) - meta:set_float("maxSrcTime",output.time*0.7) - end - end - if meta:get_float("fuelTime")>0 then - meta:set_float("fuelTime",meta:get_float("fuelTime")-elapsed) - shouldUpdateFormspec=true - shouldRerunTimer=true - end - if meta:get_float("maxSrcTime")>0 then - if meta:get_float("fuelTime")>0 then - meta:set_float("srcTime",meta:get_float("srcTime")+elapsed) - else - meta:set_float("srcTime",0) - minetest.swap_node(pos,{ - name="industrialtest:iron_furnace", - param2=minetest.get_node(pos).param2 - }) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - shouldUpdateFormspec=true - shouldRerunTimer=true - else - minetest.swap_node(pos,{ - name="industrialtest:iron_furnace", - param2=minetest.get_node(pos).param2 - }) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - if meta:get_float("srcTime")>=meta:get_float("maxSrcTime") then - local output,after=minetest.get_craft_result({ - method="cooking", - width=1, - items={srcSlot} - }) - if output.item:get_count()>0 then - inv:set_stack("src",1,after.items[1]) - inv:add_item("dst",output.item) - meta:set_float("srcTime",-1) - meta:set_float("maxSrcTime",0) - end - end - - if shouldUpdateFormspec then - meta:set_string("formspec",ironFurnaceFormspec(meta:get_float("fuelTime")/meta:get_float("maxFuelTime")*100,meta:get_float("srcTime")/meta:get_float("maxSrcTime")*100)) - end - - return shouldRerunTimer -end -if industrialtest.mclAvailable then - definition.groups={ - not_in_creative_inventory=1 - } - definition._doc_items_create_entry=false -end -minetest.register_node("industrialtest:iron_furnace_active",definition) -minetest.register_craft({ - type="shaped", - output="industrialtest:iron_furnace", - recipe={ - {industrialtest.elementKeys.ironIngot,industrialtest.elementKeys.ironIngot,industrialtest.elementKeys.ironIngot}, - {industrialtest.elementKeys.ironIngot,"",industrialtest.elementKeys.ironIngot}, - {industrialtest.elementKeys.ironIngot,industrialtest.elementKeys.ironIngot,industrialtest.elementKeys.ironIngot} - } -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:iron_furnace", - recipe={ - {"",industrialtest.elementKeys.ironIngot,""}, - {industrialtest.elementKeys.ironIngot,"",industrialtest.elementKeys.ironIngot}, - {industrialtest.elementKeys.ironIngot,industrialtest.elementKeys.furnace,industrialtest.elementKeys.ironIngot} - } -}) - -registerSimpleElectricItemProcessor({ - name="electric_furnace", - displayName="Electric Furnace", - customFrontTexture=true, - capacity=416, - flow=industrialtest.api.lvPowerFlow, - opPower=60, - method="cooking", - efficiency=0.5 -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:electric_furnace", - recipe={ - {"","industrialtest:electronic_circuit",""}, - {industrialtest.elementKeys.powerCarrier,"industrialtest:iron_furnace",industrialtest.elementKeys.powerCarrier} - } -}) - -registerSimpleElectricItemProcessor({ - name="macerator", - displayName="Macerator", - customFrontTexture=true, - requiresWrench=true, - capacity=1200, - flow=industrialtest.api.lvPowerFlow, - opPower=100, - method="industrialtest.macerating", - efficiency=1 -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:macerator", - recipe={ - {industrialtest.elementKeys.flint,industrialtest.elementKeys.flint,industrialtest.elementKeys.flint}, - {industrialtest.elementKeys.cobble,"industrialtest:machine_block",industrialtest.elementKeys.cobble}, - {"","industrialtest:electronic_circuit",""} - } -}) - -registerSimpleElectricItemProcessor({ - name="compressor", - displayName="Compressor", - customFrontTexture=true, - requiresWrench=true, - capacity=1400, - flow=industrialtest.api.lvPowerFlow, - opPower=120, - method="industrialtest.compressing", - efficiency=1 -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:compressor", - recipe={ - {industrialtest.elementKeys.stone,"",industrialtest.elementKeys.stone}, - {industrialtest.elementKeys.stone,"industrialtest:machine_block",industrialtest.elementKeys.stone}, - {industrialtest.elementKeys.stone,"industrialtest:electronic_circuit",industrialtest.elementKeys.stone} - } -}) - -registerSimpleElectricItemProcessor({ - name="extractor", - displayName="Extractor", - customFrontTexture=true, - requiresWrench=true, - capacity=900, - flow=industrialtest.api.lvPowerFlow, - opPower=100, - method="industrialtest.extracting", - efficiency=1 -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:extractor", - recipe={ - {"industrialtest:treetap","industrialtest:machine_block","industrialtest:treetap"}, - {"industrialtest:treetap","industrialtest:electronic_circuit","industrialtest:treetap"} - } -}) - -registerSimpleElectricItemProcessor({ - name="recycler", - displayName="Recycler", - customTopTexture=true, - requiresWrench=true, - capacity=80, - flow=industrialtest.api.lvPowerFlow, - opPower=40, - method="industrialtest.recycling", - efficiency=1 -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:recycler", - recipe={ - {"",industrialtest.elementKeys.glowstone,""}, - {industrialtest.elementKeys.dirt,"industrialtest:compressor",industrialtest.elementKeys.dirt}, - {"industrialtest:refined_iron_ingot",industrialtest.elementKeys.dirt,"industrialtest:refined_iron_ingot"} - } -}) - --- Transformers -local function registerTransformer(config) - definition={ - description=S(config.displayName), - tiles={ - config.machineBlockTexture.."^industrialtest_"..config.name.."_side.png", - config.machineBlockTexture.."^industrialtest_"..config.name.."_side.png", - config.machineBlockTexture.."^industrialtest_"..config.name.."_side.png", - config.machineBlockTexture.."^industrialtest_"..config.name.."_side.png", - config.machineBlockTexture.."^industrialtest_"..config.name.."_side.png", - config.machineBlockTexture.."^industrialtest_"..config.name.."_front.png" - }, - paramtype2="facedir", - legacy_facedir_simple=true, - drop=(config.requiresWrench and "industrialtest:machine_block" or "industrialtest:"..config.name), - on_construct=function(pos) - local meta=minetest.get_meta(pos) - industrialtest.api.addPowerStorage(meta,config.upperFlow,0,"aaaaaa") - end, - on_timer=function(pos,elapsed) - local meta=minetest.get_meta(pos) - local node=minetest.get_node(pos) - 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) - } - local upperPowerDistribution=0 - local lowerPowerDistribution=0 - - for key,value in ipairs(neighbourPositions) do - local normalized=industrialtest.api.normalizeSide(pos,key) - if industrialtest.api.hasPowerStorage(minetest.get_meta(value)) and industrialtest.api.isPowerOutput(meta,normalized) then - if normalized==5 then - upperPowerDistribution=config.upperFlow - else - lowerPowerDistribution=lowerPowerDistribution+1 - end - else - neighbourPositions[key]=0 - end - end - if lowerPowerDistribution>0 then - lowerPowerDistribution=math.floor(industrialtest.internal.clamp(math.min(config.upperFlow,meta:get_int("industrialtest.powerAmount"))/lowerPowerDistribution,0,config.lowerFlow)) - end - - local roomAvailable=false - for key,value in ipairs(neighbourPositions) do - if value~=0 then - local neighbourMeta=minetest.get_meta(value) - local normalized=industrialtest.api.normalizeSide(pos,key) - if normalized==5 then - if meta:get_int("industrialtest.powerAmount")==config.upperFlow then - industrialtest.api.transferPower(meta,neighbourMeta,config.upperFlow) - end - else - industrialtest.api.transferPower(meta,neighbourMeta,lowerPowerDistribution) - end - if not industrialtest.api.isFullyCharged(neighbourMeta) then - roomAvailable=true - end - end - end - - meta:set_string("industrialtest.ioConfig","aaaaaa") - - return (meta:get_int("industrialtest.powerAmount")>0 and roomAvailable) - end, - _industrialtest_onPowerFlow=function(pos,side) - industrialtest.api.changeIoConfig(minetest.get_meta(pos),industrialtest.api.normalizeSide(pos,side),"i") - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - } - if industrialtest.mtgAvailable then - definition.groups={cracky=2} - definition.sounds=(config.sounds=="metal" and default.node_sound_metal_defaults() or default.node_sound_wood_defaults()) - elseif industrialtest.mclAvailable then - definition.groups={pickaxey=1} - definition.sounds=(config.sounds=="metal" and mcl_sounds.node_sound_metal_defaults() or mcl_sounds.node_sound_wood_defaults()) - definition._mcl_blast_resistance=3 - definition._mcl_hardness=3.5 - end - definition.groups._industrialtest_hasPowerInput=1 - definition.groups._industrialtest_hasPowerOutput=1 - definition.groups._industrialtest_wrenchUnmountable=1 - minetest.register_node("industrialtest:"..config.name,definition) -end -registerTransformer({ - name="lv_transformer", - displayName="LV Transformer", - machineBlockTexture="industrialtest_wood_machine_block.png", - requiresWrench=false, - lowerFlow=industrialtest.api.lvPowerFlow, - upperFlow=industrialtest.api.mvPowerFlow, - sounds="wood" -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:lv_transformer", - recipe={ - {"group:wood","industrialtest:insulated_tin_cable","group:wood"}, - {industrialtest.elementKeys.copperIngot,industrialtest.elementKeys.copperIngot,industrialtest.elementKeys.copperIngot}, - {"group:wood","industrialtest:insulated_copper_cable","group:wood"} - } -}) - -registerTransformer({ - name="mv_transformer", - displayName="MV Transformer", - machineBlockTexture="industrialtest_machine_block.png", - requiresWrench=true, - lowerFlow=industrialtest.api.mvPowerFlow, - upperFlow=industrialtest.api.hvPowerFlow, - sounds="metal" -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:mv_transformer", - recipe={ - {"industrialtest:insulated_copper_cable"}, - {"industrialtest:machine_block"}, - {"industrialtest:insulated_gold_cable"} - } -}) - -registerTransformer({ - name="hv_transformer", - displayName="HV Transformer", - machineBlockTexture="industrialtest_machine_block.png", - requiresWrench=true, - lowerFlow=industrialtest.api.hvPowerFlow, - upperFlow=industrialtest.api.evPowerFlow, - sounds="metal" -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:hv_transformer", - recipe={ - {"","industrialtest:insulated_iron_cable",""}, - {"industrialtest:electronic_circuit","industrialtest:mv_transformer","industrialtest:energy_crystal"}, - {"","industrialtest:insulated_iron_cable",""} - } -}) - -registerTransformer({ - name="ev_transformer", - displayName="EV Transformer", - machineBlockTexture="industrialtest_machine_block.png", - requiresWrench=true, - lowerFlow=industrialtest.api.evPowerFlow, - upperFlow=industrialtest.api.ivPowerFlow, - sounds="metal" -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:ev_transformer", - recipe={ - {"","industrialtest:insulated_iron_cable",""}, - {"industrialtest:advanced_electronic_circuit","industrialtest:hv_transformer","industrialtest:lapotron_crystal"}, - {"","industrialtest:insulated_iron_cable",""} - } -}) - --- Power storage nodes -local function registerPowerStorageNode(config) - local function getFormspec(pos) - local meta=minetest.get_meta(pos) - local charged=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity") - local formspec - if industrialtest.mtgAvailable then - formspec={ - "list[context;charged;1,2.5;1,1]", - "listring[context;charged]", - "label[0.9,3.9;"..S("Charge").."]", - "list[context;discharged;3,2.5;1,1]", - "listring[context;discharged]", - "label[2.7,3.9;"..S("Discharge").."]", - "box[9,1;0.3,4.8;#202020]", - (charged>0 and "box[9,"..(1+4.8-(charged*4.8))..";0.3,"..(charged*4.8)..";#FF1010]" or "") - } - elseif industrialtest.mclAvailable then - formspec={ - "list[context;charged;1,2.5;1,1]", - "listring[context;charged]", - mcl_formspec.get_itemslot_bg(1,2.5,1,1), - "label[0.9,3.9;"..S("Charge").."]", - "list[context;discharged;3,2.5;1,1]", - "listring[context;discharged]", - mcl_formspec.get_itemslot_bg(3,2.5,1,1), - "label[2.7,3.9;"..S("Discharge").."]", - "box[9,1;0.3,4.8;#202020]", - (charged>0 and "box[9,"..(1+4.8-(charged*4.8))..";0.3,"..(charged*4.8)..";#FF1010]" or "") - } - end - return table.concat(formspec,"") - end - registerMachine({ - name=config.name, - displayName=config.displayName, - capacity=config.capacity, - flow=config.flow, - ioConfig="iiiioi", - sounds=config.sounds, - powerSlots={"charged","discharged"}, - storageSlots={"charged","discharged"}, - registerActiveVariant=false, - groups={ - _industrialtest_hasPowerOutput=1, - _industrialtest_hasPowerInput=1 - }, - customKeys={ - tiles={ - config.machineBlockTexture, - config.machineBlockTexture, - config.machineBlockTexture, - config.machineBlockTexture, - config.machineBlockTexture, - config.machineBlockTexture.."^industrialtest_"..config.name.."_front.png" - }, - paramtype2="facedir", - legacy_facedir_simple=true - }, - requiresWrench=config.requiresWrench, - getFormspec=getFormspec, - onConstruct=function(pos,meta,inv) - inv:set_size("charged",1) - inv:set_size("discharged",1) - end, - onTimer=function(pos,elapsed,meta,inv) - local chargedSlot=inv:get_stack("charged",1) - local dischargedSlot=inv:get_stack("discharged",1) - local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) - local shouldUpdateFormspec=flowTransferred - local shouldRerunTimer=(afterFlow and meta:get_int("industrialtest.powerAmount")>0) - - if chargedSlot:get_count()>0 and meta:get_int("industrialtest.powerAmount")>0 and industrialtest.api.transferPowerToItem(meta,chargedSlot,config.flow)>0 then - inv:set_stack("charged",1,chargedSlot) - shouldRerunTimer=true - shouldUpdateFormspec=true - end - if dischargedSlot:get_count()>0 and not industrialtest.api.isFullyCharged(meta) and industrialtest.api.transferPowerFromItem(dischargedSlot,meta,config.flow)>0 then - inv:set_stack("discharged",1,dischargedSlot) - shouldRerunTimer=true - shouldUpdateFormspec=true - end - if not industrialtest.api.isFullyCharged(meta) then - industrialtest.api.triggerNeighbours(pos) - end - - return shouldRerunTimer,shouldUpdateFormspec - end, - onMetadataInventoryPut=function(pos) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end, - onMetadataInventoryMove=function(pos) - minetest.get_node_timer(pos):start(industrialtest.updateDelay) - end - }) -end - -registerPowerStorageNode({ - name="batbox", - displayName="BatBox", - capacity=25000, - flow=industrialtest.api.lvPowerFlow, - sounds="wood", - machineBlockTexture="industrialtest_wood_machine_block.png", - requiresWrench=false -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:batbox", - recipe={ - {"group:wood","industrialtest:insulated_tin_cable","group:wood"}, - {"industrialtest:re_battery","industrialtest:re_battery","industrialtest:re_battery"}, - {"group:wood","group:wood","group:wood"} - } -}) - -registerPowerStorageNode({ - name="cesu", - displayName="CESU", - capacity=400000, - flow=industrialtest.api.mvPowerFlow, - sounds="metal", - machineBlockTexture="industrialtest_bronze_machine_block.png", - requiresWrench=false -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:cesu", - recipe={ - {"industrialtest:bronze_plate","industrialtest:insulated_copper_cable","industrialtest:bronze_plate"}, - {"industrialtest:advanced_re_battery","industrialtest:advanced_re_battery","industrialtest:advanced_re_battery"}, - {"industrialtest:bronze_plate","industrialtest:bronze_plate","industrialtest:bronze_plate"} - } -}) - -registerPowerStorageNode({ - name="mfe", - displayName="MFE", - capacity=3000000, - flow=industrialtest.api.hvPowerFlow, - sounds="metal", - machineBlockTexture="industrialtest_machine_block.png", - requiresWrench=true -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:mfe", - recipe={ - {"industrialtest:insulated_gold_cable","industrialtest:energy_crystal","industrialtest:insulated_gold_cable"}, - {"industrialtest:energy_crystal","industrialtest:machine_block","industrialtest:energy_crystal"}, - {"industrialtest:insulated_gold_cable","industrialtest:energy_crystal","industrialtest:insulated_gold_cable"} - } -}) - -registerPowerStorageNode({ - name="mfsu", - displayName="MFSU", - capacity=30000000, - flow=industrialtest.api.evPowerFlow, - sounds="metal", - machineBlockTexture="industrialtest_advanced_machine_block.png", - requiresWrench=false -}) -minetest.register_craft({ - type="shaped", - output="industrialtest:mfsu", - recipe={ - {"industrialtest:lapotron_crystal","industrialtest:advanced_electronic_circuit","industrialtest:lapotron_crystal"}, - {"industrialtest:lapotron_crystal","industrialtest:mfe","industrialtest:lapotron_crystal"}, - {"industrialtest:lapotron_crystal","industrialtest:advanced_machine_block","industrialtest:lapotron_crystal"} - } -}) diff --git a/machines/common.lua b/machines/common.lua new file mode 100644 index 0000000..a8ec308 --- /dev/null +++ b/machines/common.lua @@ -0,0 +1,562 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local simpleElectricItemProcessor={} + +function industrialtest.internal.mclAfterDigNode(pos,oldmeta,lists) + -- 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(lists) 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 + +function industrialtest.internal.registerMachine(config) + local function getFormspec(pos) + local formspec + if industrialtest.mtgAvailable then + formspec={ + "formspec_version[4]", + "size[10.8,12]", + "label[0.5,0.5;"..config.displayName.."]", + (config.getFormspec and config.getFormspec(pos) 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;"..config.displayName.."]", + (config.getFormspec and config.getFormspec(pos) 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 + local definition={ + description=config.displayName, + on_construct=function(pos) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + meta:set_string("formspec",getFormspec(pos)) + if config.onConstruct then + config.onConstruct(pos,meta,inv) + end + industrialtest.api.addPowerStorage(meta,config.capacity,config.flow,config.ioConfig) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end, + on_timer=function(pos,elapsed) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local shouldRerunTimer=false + local shouldUpdateFormspec=false + + if config.onTimer then + shouldRerunTimer,shouldUpdateFormspec=config.onTimer(pos,elapsed,meta,inv) + end + + if shouldUpdateFormspec then + meta:set_string("formspec",getFormspec(pos)) + 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 movedItemStack=inv:get_stack(fromList,1) + local found=false + if config.powerSlots then + for _,value in ipairs(config.powerSlots) do + if value==toList then + found=true + break + end + end + end + if found and not industrialtest.api.hasPowerStorage(movedItemStack:get_meta()) then + return 0 + end + if config.allowMetadataInventoryMove then + return config.allowMetadataInventoryMove(pos,fromList,fromIndex,toList,toIndex,count) + end + return count + end, + allow_metadata_inventory_put=function(pos,listname,index,stack,player) + local found=false + if config.powerSlots then + for _,value in ipairs(config.powerSlots) do + if value==listname then + found=true + break + end + end + end + if found and not industrialtest.api.hasPowerStorage(stack:get_meta()) then + return 0 + end + if config.allowMetadataInventoryPut then + return config.allowMetadataInventoryPut(pos,listname,index,stack,player) + end + return stack:get_count() + end, + on_metadata_inventory_put=function(pos,listname,index,stack,player) + if config.onMetadataInventoryPut then + config.onMetadataInventoryPut(pos,listname,index,stack,player) + end + end, + on_metadata_inventory_move=function(pos,fromList,fromIndex,toList,toIndex,count) + if config.onMetadataInventoryPut then + config.onMetadataInventoryMove(pos,fromList,fromIndex,toList,toIndex,count) + end + end, + on_metadata_inventory_take=function(pos,listname,index,stack,player) + if config.onMetadataInventoryTake then + config.onMetadataInventoryTake(pos,listname,index,stack,player) + end + end, + _industrialtest_updateFormspec=function(pos) + local meta=minetest.get_meta(pos) + meta:set_string("formspec",getFormspec(pos)) + end + } + if industrialtest.mtgAvailable then + definition.groups={cracky=2} + if config.sounds=="metal" then + definition.sounds=default.node_sound_metal_defaults() + end + definition.can_dig=function(pos) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + for _,value in ipairs(config.storageSlots) do + if inv:get_stack(value,1):get_count()>0 then + return false + end + end + return true + end + elseif industrialtest.mclAvailable then + definition.after_dig_node=function(pos,oldnode,oldmeta) + industrialtest.internal.mclAfterDigNode(pos,oldmeta,config.storageSlots) + end + if config.sounds=="metal" then + definition.sounds=mcl_sounds.node_sound_metal_defaults() + end + definition.groups={pickaxey=1} + definition._mcl_blast_resistance=3.5 + definition._mcl_hardness=3.9 + end + definition.groups._industrialtest_wrenchUnmountable=1 + if config.requiresWrench then + definition.drop="industrialtest:machine_block" + end + if config.customKeys then + for key,value in pairs(config.customKeys) do + definition[key]=value + end + end + if config.groups then + for key,value in pairs(config.groups) do + definition.groups[key]=value + end + end + minetest.register_node("industrialtest:"..config.name,definition) + if config.registerActiveVariant then + definition=table.copy(definition) + definition.description=nil + definition.on_timer=function(pos,elapsed) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local shouldRerunTimer=false + local shouldUpdateFormspec=false + + if config.onTimer then + shouldRerunTimer,shouldUpdateFormspec=config.activeOnTimer(pos,elapsed,meta,inv) + end + + if shouldUpdateFormspec then + meta:set_string("formspec",getFormspec(pos)) + end + + return shouldRerunTimer + end + if not definition.drop then + definition.drop="industrialtest:"..config.name + end + if config.activeCustomKeys then + for key,value in pairs(config.activeCustomKeys) do + definition[key]=value + end + end + if industrialtest.mclAvailable then + definition.groups.not_in_creative_inventory=1 + definition._doc_items_create_entry=false + end + minetest.register_node("industrialtest:"..config.name.."_active",definition) + end +end + +local function craftResultProxy(method,item) + if method=="cooking" then + local output,after=minetest.get_craft_result({ + method=method, + width=1, + items={item} + }) + return { + item=output.item, + time=output.time, + src=after.items[1] + } + elseif method=="industrialtest.macerating" then + local output=industrialtest.api.getMaceratorRecipeResult(item:get_name()) + if not output then + return { + item=ItemStack(), + time=0, + src=item + } + end + local srcAfter=ItemStack(item:get_name()) + srcAfter:set_count(item:get_count()-1) + return { + item=ItemStack(output.output), + time=output.time, + src=srcAfter + } + elseif method=="industrialtest.compressing" then + local output=industrialtest.api.getCompressorRecipeResult(item:get_name()) + if not output or item:get_count()0 and "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]" + or "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png]"), + "list[context;powerStorage;3.4,3.9;1,1]", + "listring[context;powerStorage]", + (srcPercent>0 and "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[lowpart:"..srcPercent..":gui_furnace_arrow_fg.png^[transformR270]" + or "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[transformR270]"), + "list[context;dst;6.4,2.8;1,1]", + "listring[context;dst]", + "list[context;upgrades;9,0.9;1,4]", + "listring[context;upgrades]" + } + elseif industrialtest.mclAvailable then + formspec={ + "list[context;src;3.4,1.8;1,1]", + mcl_formspec.get_itemslot_bg(3.4,1.8,1,1), + "listring[context;src]", + (powerPercent>0 and "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]" + or "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png]"), + "list[context;powerStorage;3.4,3.9;1,1]", + mcl_formspec.get_itemslot_bg(3.4,3.9,1,1), + "listring[context;powerStorage]", + (srcPercent>0 and "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[lowpart:"..srcPercent..":gui_furnace_arrow_fg.png^[transformR270]" + or "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[transformR270]"), + "list[context;dst;6.4,2.8;1,1]", + mcl_formspec.get_itemslot_bg(6.4,2.8,1,1), + "listring[context;dst]", + "list[context;upgrades;9,0.9;1,4]", + mcl_formspec.get_itemslot_bg(9,0.9,1,4), + "listring[context;upgrades]" + } + end + return table.concat(formspec,"") +end + +simpleElectricItemProcessor.onPowerFlow=function(pos) + -- FIXME: this probably will require refactor so node timer won't be started + -- just to test if machine can process item + minetest.get_node_timer(pos):start(industrialtest.updateDelay) +end + +simpleElectricItemProcessor.onConstruct=function(pos,meta,inv) + inv:set_size("src",1) + inv:set_size("dst",1) + inv:set_size("powerStorage",1) + inv:set_size("upgrades",4) + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) +end + +simpleElectricItemProcessor.onTimer=function(pos,elapsed,meta,inv,config) + local srcSlot=inv:get_stack("src",1) + local powerStorageSlot=inv:get_stack("powerStorage",1) + local shouldUpdateFormspec=false + local shouldRerunTimer=false + local requiredPower=elapsed*config.opPower + if powerStorageSlot:get_count()>0 then + local stackMeta=powerStorageSlot:get_meta() + if industrialtest.api.transferPower(stackMeta,meta,stackMeta:get_int("industrialtest.powerFlow"))>0 then + shouldUpdateFormspec=true + shouldRerunTimer=true + industrialtest.api.updateItemPowerText(powerStorageSlot) + inv:set_stack("powerStorage",1,powerStorageSlot) + end + end + if srcSlot:get_count()>0 and meta:get_int("industrialtest.powerAmount")>=requiredPower then + local output=craftResultProxy(config.method,srcSlot) + if output.time>0 and inv:room_for_item("dst",output.item) then + if meta:get_float("maxSrcTime")<=0 then + meta:set_float("srcTime",0) + meta:set_float("maxSrcTime",output.time*config.efficiency) + end + minetest.swap_node(pos,{ + name="industrialtest:"..config.name.."_active", + param2=minetest.get_node(pos).param2 + }) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end + end + if not industrialtest.api.isFullyCharged(meta) then + industrialtest.api.triggerNeighbours(pos) + end + return shouldRerunTimer,shouldUpdateFormspec +end + +simpleElectricItemProcessor.allowMetadataInventoryMove=function(pos,fromList,fromIndex,toList,count) + if toList=="dst" then + return 0 + elseif toList=="upgrades" then + -- TODO: Add support for upgrades when they will be added + return 0 + end + return count +end + +simpleElectricItemProcessor.allowMetadataInventoryPut=function(pos,listname,index,stack) + if listname=="dst" then + return 0 + elseif listname=="src" then + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local srcSlot=inv:get_stack("src",1) + if srcSlot:get_name()~=stack:get_name() then + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) + end + elseif listname=="upgrades" then + --TODO: See allow_metadata_inventory_move + return 0 + end + return stack:get_count() +end + +simpleElectricItemProcessor.onMetadataInventoryPut=function(pos) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) +end + +simpleElectricItemProcessor.onMetadataInventoryMove=function(pos,fromList,fromIndex,toList,toIndex,count) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local srcSlot=inv:get_stack("src",1) + local dstSlot=inv:get_stack("dst",1) + if fromList=="src" and count==srcSlot:get_count() then + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) + if meta:get_int("industrialtest.powerAmount")>0 then + meta:set_string("formspec",getFormspec(pos)) + end + elseif fromList=="dst" and dstSlot:get_free_space()==0 then + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end +end + +simpleElectricItemProcessor.onMetadataInventoryTake=function(pos,listname,index,stack) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local srcSlot=inv:get_stack("src",1) + local dstSlot=inv:get_stack("dst",1) + if listname=="src" and stack:get_count()==srcSlot:get_count() then + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) + if meta:get_int("industrialtest.powerAmount")>0 then + meta:set_string("formspec",getFormspec(pos)) + end + elseif listname=="dst" and dstSlot:get_free_space()==0 then + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end +end + +simpleElectricItemProcessor.activeOnTimer=function(pos,elapsed,meta,inv,config) + local srcSlot=inv:get_stack("src",1) + local powerStorageSlot=inv:get_stack("powerStorage",1) + local shouldUpdateFormspec=false + local shouldRerunTimer=false + local requiredPower=elapsed*config.opPower + + if powerStorageSlot:get_count()>0 then + local stackMeta=powerStorageSlot:get_meta() + if industrialtest.api.transferPower(stackMeta,meta,stackMeta:get_int("industrialtest.powerFlow"))>0 then + shouldUpdateFormspec=true + shouldRerunTimer=true + industrialtest.api.updateItemPowerText(powerStorageSlot) + inv:set_stack("powerStorage",1,powerStorageSlot) + end + end + if srcSlot:get_count()>0 and meta:get_float("maxSrcTime")<=0 and meta:get_int("industrialtest.powerAmount")>=requiredPower then + local output=craftResultProxy(config.method,srcSlot) + if output.time>0 and inv:room_for_item("dst",output.item) then + meta:set_float("srcTime",0) + meta:set_float("maxSrcTime",output.time*config.efficiency) + end + end + if srcSlot:get_count()==0 and meta:get_float("maxSrcTime")>0 then + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) + shouldUpdateFormspec=true + end + if meta:get_float("maxSrcTime")>0 then + if meta:get_int("industrialtest.powerAmount")>=requiredPower then + meta:set_int("industrialtest.powerAmount",meta:get_int("industrialtest.powerAmount")-requiredPower) + meta:set_float("srcTime",meta:get_float("srcTime")+elapsed) + shouldRerunTimer=true + end + shouldUpdateFormspec=true + end + if meta:get_float("maxSrcTime")<=0 or meta:get_int("industrialtest.powerAmount")=meta:get_float("maxSrcTime") then + local output=craftResultProxy(config.method,srcSlot) + if output.item:get_count()>0 then + inv:add_item("dst",output.item) + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) + end + inv:set_stack("src",1,output.src) + end + if not industrialtest.api.isFullyCharged(meta) then + industrialtest.api.triggerNeighbours(pos) + end + return shouldRerunTimer,shouldUpdateFormspec +end + +function industrialtest.internal.registerSimpleElectricItemProcessor(config) + industrialtest.internal.registerMachine({ + name=config.name, + displayName=config.displayName, + capacity=config.capacity, + getFormspec=getFormspec, + flow=config.flow, + ioConfig="iiiiii", + requiresWrench=config.requiresWrench, + registerActiveVariant=true, + sounds="metal", + powerSlots={"powerStorage"}, + storageSlots={"src","dst","powerStorage","upgrades"}, + groups={ + _industrialtest_hasPowerInput=1 + }, + customKeys={ + tiles={ + "industrialtest_machine_block.png"..(config.customTopTexture and "^industrialtest_"..config.name.."_top.png" or ""), + "industrialtest_machine_block.png"..(config.customBottomTexture and "^industrialtest_"..config.name.."_bottom.png" or ""), + "industrialtest_machine_block.png"..(config.customRightTexture and "^industrialtest_"..config.name.."_right.png" or ""), + "industrialtest_machine_block.png"..(config.customLeftTexture and "^industrialtest_"..config.name.."_left.png" or ""), + "industrialtest_machine_block.png"..(config.customBackTexture and "^industrialtest_"..config.name.."_back.png" or ""), + "industrialtest_machine_block.png"..(config.customFrontTexture and "^industrialtest_"..config.name.."_front.png" or "") + }, + paramtype2="facedir", + legacy_facedir_simple=true, + _industrialtest_onPowerFlow=simpleElectricItemProcessor.onPowerFlow + }, + activeCustomKeys={ + tiles={ + "industrialtest_machine_block.png"..(config.customTopTexture and "^industrialtest_"..config.name.."_top_active.png" or ""), + "industrialtest_machine_block.png"..(config.customBottomTexture and "^industrialtest_"..config.name.."_bottom_active.png" or ""), + "industrialtest_machine_block.png"..(config.customRightTexture and "^industrialtest_"..config.name.."_right_active.png" or ""), + "industrialtest_machine_block.png"..(config.customLeftTexture and "^industrialtest_"..config.name.."_left_active.png" or ""), + "industrialtest_machine_block.png"..(config.customBackTexture and "^industrialtest_"..config.name.."_back_active.png" or ""), + "industrialtest_machine_block.png"..(config.customFrontTexture and "^industrialtest_"..config.name.."_front_active.png" or "") + } + }, + onConstruct=simpleElectricItemProcessor.onConstruct, + onTimer=function(pos,elapsed,meta,inv) + simpleElectricItemProcessor.onTimer(pos,elapsed,meta,inv,config) + end, + allowMetadataInventoryMove=simpleElectricItemProcessor.allowMetadataInventoryMove, + allowMetadataInventoryPut=simpleElectricItemProcessor.allowMetadataInventoryPut, + onMetadataInventoryPut=simpleElectricItemProcessor.onMetadataInventoryPut, + onMetadataInventoryMove=simpleElectricItemProcessor.onMetadataInventoryMove, + onMetadataInventoryTake=simpleElectricItemProcessor.onMetadataInventoryTake, + activeOnTimer=function(pos,elapsed,meta,inv) + simpleElectricItemProcessor.activeOnTimer(pos,elapsed,meta,inv,config) + end + }) +end diff --git a/machines/compressor.lua b/machines/compressor.lua new file mode 100644 index 0000000..6ba7183 --- /dev/null +++ b/machines/compressor.lua @@ -0,0 +1,38 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") + +industrialtest.internal.registerSimpleElectricItemProcessor({ + name="compressor", + displayName=S("Compressor"), + customFrontTexture=true, + requiresWrench=true, + capacity=1400, + flow=industrialtest.api.lvPowerFlow, + opPower=120, + method="industrialtest.compressing", + efficiency=1 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:compressor", + recipe={ + {industrialtest.elementKeys.stone,"",industrialtest.elementKeys.stone}, + {industrialtest.elementKeys.stone,"industrialtest:machine_block",industrialtest.elementKeys.stone}, + {industrialtest.elementKeys.stone,"industrialtest:electronic_circuit",industrialtest.elementKeys.stone} + } +}) diff --git a/machines/electric_furnace.lua b/machines/electric_furnace.lua new file mode 100644 index 0000000..a59a43b --- /dev/null +++ b/machines/electric_furnace.lua @@ -0,0 +1,36 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") + +industrialtest.internal.registerSimpleElectricItemProcessor({ + name="electric_furnace", + displayName=S("Electric Furnace"), + customFrontTexture=true, + capacity=416, + flow=industrialtest.api.lvPowerFlow, + opPower=60, + method="cooking", + efficiency=0.5 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:electric_furnace", + recipe={ + {"","industrialtest:electronic_circuit",""}, + {industrialtest.elementKeys.powerCarrier,"industrialtest:iron_furnace",industrialtest.elementKeys.powerCarrier} + } +}) diff --git a/machines/extractor.lua b/machines/extractor.lua new file mode 100644 index 0000000..a7e86fc --- /dev/null +++ b/machines/extractor.lua @@ -0,0 +1,37 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") + +industrialtest.internal.registerSimpleElectricItemProcessor({ + name="extractor", + displayName=S("Extractor"), + customFrontTexture=true, + requiresWrench=true, + capacity=900, + flow=industrialtest.api.lvPowerFlow, + opPower=100, + method="industrialtest.extracting", + efficiency=1 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:extractor", + recipe={ + {"industrialtest:treetap","industrialtest:machine_block","industrialtest:treetap"}, + {"industrialtest:treetap","industrialtest:electronic_circuit","industrialtest:treetap"} + } +}) diff --git a/machines/fluid_generator.lua b/machines/fluid_generator.lua new file mode 100644 index 0000000..3591780 --- /dev/null +++ b/machines/fluid_generator.lua @@ -0,0 +1,315 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") +local fluidGenerator={} + +fluidGenerator.getFormspec=function(pos,getFuel) + local meta=minetest.get_meta(pos) + local fluidPercent=meta:get_float("fluidAmount")/100 + local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity") + local fluid=meta:get_string("fluid") + local formspec + local fuel=getFuel(fluid) + local tile=(fuel and fuel.texture or "industrialtest_gui_fluid_bg.png") + if industrialtest.mtgAvailable then + formspec={ + "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 "") + } + elseif industrialtest.mclAvailable then + formspec={ + "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 "") + } + end + return table.concat(formspec,"") +end + +fluidGenerator.onConstruct=function(pos,meta,inv) + inv:set_size("charged",1) + inv:set_size("fluid",1) + inv:set_size("leftover",1) + meta:set_float("fluidAmount",0) + meta:set_string("fluid","") +end + +fluidGenerator.onTimer=function(pos,elapsed,meta,inv,getFuel,getFuelByItem) + 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=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) + 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(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=true + end + end + if flowTransferred then + shouldUpdateFormspec=true + end + return shouldRerunTimer,shouldUpdateFormspec +end + +fluidGenerator.metadataChange=function(pos) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) +end + +fluidGenerator.activeOnTimer=function(pos,elapsed,meta,inv,getFuelByItem) + 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=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 + return shouldRerunTimer,shouldUpdateFormspec +end + +local function registerFluidGenerator(config) + local definition={ + name=config.name, + displayName=config.displayName, + getFormspec=function(pos) + return fluidGenerator.getFormspec(pos,config.getFuel) + end, + capacity=7000, + flow=industrialtest.api.lvPowerFlow, + ioConfig="oooooo", + requiresWrench=true, + registerActiveVariant=config.registerActiveVariant, + powerSlots={"charged"}, + storageSlots={"fluid","fluidLeftover"}, + sounds="metal", + groups={ + _industrialtest_hasPowerOutput=1 + }, + customKeys={ + 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 + }, + onConstruct=fluidGenerator.onConstruct, + onTimer=function(pos,elapsed,meta,inv) + return fluidGenerator.onTimer(pos,elapsed,meta,inv,config.getFuel,config.getFuelByItem) + end, + onMetadataInventoryPut=fluidGenerator.metadataChange, + onMetadataInventoryMove=fluidGenerator.metadataChange + } + if config.registerActiveVariant then + definition.activeCustomKeys={ + 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 "") + }, + light_source=8 + } + definition.activeOnTimer=fluidGenerator.activeOnTimer + end + industrialtest.internal.registerMachine(definition) +end + +registerFluidGenerator({ + name="geothermal_generator", + displayName=S("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=S("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 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) + end + end + end +}) + +minetest.register_craft({ + type="shaped", + output="industrialtest:water_mill", + recipe={ + {"",industrialtest.elementKeys.stick,""}, + {industrialtest.elementKeys.stick,"industrialtest:generator",industrialtest.elementKeys.stick}, + {"",industrialtest.elementKeys.stick,""} + } +}) diff --git a/machines/generator.lua b/machines/generator.lua new file mode 100644 index 0000000..5cdc291 --- /dev/null +++ b/machines/generator.lua @@ -0,0 +1,199 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") +local generator={} + +generator.getFormspec=function(pos) + local meta=minetest.get_meta(pos) + local fuelPercent=meta:get_int("fuelTime")/meta:get_int("maxFuelTime")*100 + local charged=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity") + local formspec + if industrialtest.mtgAvailable then + formspec={ + "list[context;charged;4.9,1.8;1,1]", + "listring[context;charged]", + (fuelPercent>0 and "image[4.9,2.8;1,1;default_furnace_fire_bg.png^[lowpart:"..fuelPercent..":default_furnace_fire_fg.png]" + or "image[4.9,2.8;1,1;default_furnace_fire_bg.png]"), + "list[context;fuel;4.9,3.9;1,1]", + "listring[context;fuel]", + "box[9,1;0.3,4.8;#202020]", + (charged>0 and "box[9,"..(1+4.8-(charged*4.8))..";0.3,"..(charged*4.8)..";#FF1010]" or "") + } + elseif industrialtest.mclAvailable then + formspec={ + "list[context;charged;4.7,1.8;1,1]", + mcl_formspec.get_itemslot_bg(4.7,1.8,1,1), + "listring[context;charged]", + (fuelPercent>0 and "image[4.7,2.8;1,1;default_furnace_fire_bg.png^[lowpart:"..fuelPercent..":default_furnace_fire_fg.png]" + or "image[4.7,2.8;1,1;default_furnace_fire_bg.png]"), + "list[context;fuel;4.7,3.9;1,1]", + mcl_formspec.get_itemslot_bg(4.7,3.9,1,1), + "listring[context;fuel]", + "box[9,1;0.3,4.8;#202020]", + (charged>0 and "box[9,"..(1+4.8-(charged*4.8))..";0.3,"..(charged*4.8)..";#FF1010]" or "") + } + end + return table.concat(formspec,"") +end + +generator.onConstruct=function(pos,meta,inv) + inv:set_size("charged",1) + inv:set_size("fuel",1) + meta:set_int("fuelTime",0) + meta:set_int("maxFuelTime",1) +end + +generator.onTimer=function(pos,elapsed,meta,inv) + local powerFlow=meta:get_int("industrialtest.powerFlow") + local chargedSlot=inv:get_stack("charged",1) + local fuelSlot=inv:get_stack("fuel",1) + local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) + local shouldUpdateFormspec=flowTransferred + local shouldRerunTimer=(afterFlow and meta:get_int("industrialtest.powerAmount")>0) + if chargedSlot:get_count()>0 and not industrialtest.api.isFullyCharged(chargedSlot:get_meta()) and meta:get_int("industrialtest.powerAmount")>0 then + industrialtest.api.transferPowerToItem(meta,chargedSlot,powerFlow) + inv:set_stack("charged",1,chargedSlot) + shouldUpdateFormspec=true + shouldRerunTimer=true + end + if fuelSlot:get_count()>0 and meta:get_int("fuelTime")<=0 and not industrialtest.api.isFullyCharged(meta) then + local output,after=minetest.get_craft_result({ + method="fuel", + width=1, + items={fuelSlot} + }) + if output.time>0 then + meta:set_int("fuelTime",output.time) + meta:set_int("maxFuelTime",output.time) + inv:set_stack("fuel",1,after.items[1]) + minetest.swap_node(pos,{ + name="industrialtest:generator_active", + param2=minetest.get_node(pos).param2 + }) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end + end + return shouldRerunTimer,shouldUpdateFormspec +end + +generator.activeOnTimer=function(pos,elapsed,meta,inv) + local chargedSlot=inv:get_stack("charged",1) + local fuelSlot=inv:get_stack("fuel",1) + local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) + local shouldUpdateFormspec=flowTransferred + local shouldRerunTimer=(afterFlow and meta:get_int("industrialtest.powerAmount")>0) + if chargedSlot:get_count()>0 and not industrialtest.api.isFullyCharged(chargedSlot:get_meta()) and meta:get_int("industrialtest.powerAmount")>0 then + industrialtest.api.transferPowerToItem(meta,chargedSlot,chargedSlot:get_meta():get_int("industrialtest.powerFlow")) + inv:set_stack("charged",1,chargedSlot) + shouldUpdateFormspec=true + shouldRerunTimer=true + end + if fuelSlot:get_count()>0 and meta:get_int("fuelTime")<=0 and not industrialtest.api.isFullyCharged(meta) then + local output,after=minetest.get_craft_result({ + method="fuel", + width=1, + items={fuelSlot} + }) + if output.time>0 then + meta:set_int("fuelTime",output.time) + meta:set_int("maxFuelTime",output.time) + inv:set_stack("fuel",1,after.items[1]) + end + end + if meta:get_int("fuelTime")>0 then + meta:set_int("fuelTime",meta:get_int("fuelTime")-elapsed) + industrialtest.api.addPower(meta,200) + shouldUpdateFormspec=true + shouldRerunTimer=true + else + minetest.swap_node(pos,{ + name="industrialtest:generator", + param2=minetest.get_node(pos).param2 + }) + end + return shouldRerunTimer,shouldUpdateFormspec +end + +generator.metadataChange=function(pos) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) +end + +industrialtest.internal.registerMachine({ + name="generator", + displayName=S("Generator"), + getFormspec=generator.getFormspec, + capacity=7000, + flow=industrialtest.api.lvPowerFlow, + ioConfig="oooooo", + registerActiveVariant=true, + powerSlots={"charged"}, + storageSlots={"charged","fuel"}, + sounds="metal", + groups={ + _industrialtest_hasPowerOutput=1 + }, + customKeys={ + 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_iron_furnace_front.png", + "industrialtest_machine_block.png" + }, + paramtype2="facedir", + legacy_facedir_simple=true + }, + activeCustomKeys={ + 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_iron_furnace_front_active.png", + "industrialtest_machine_block.png" + }, + light_source=8 + }, + onConstruct=generator.onConstruct, + onTimer=generator.onTimer, + activeOnTimer=generator.activeOnTimer, + onMetadataInventoryPut=generator.metadataChange, + onMetadataInventoryMove=generator.metadataChange +}) + +minetest.register_craft({ + type="shaped", + output="industrialtest:generator", + recipe={ + {"industrialtest:re_battery"}, + {"industrialtest:machine_block"}, + {industrialtest.elementKeys.furnace} + } +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:generator", + recipe={ + {"","industrialtest:re_battery",""}, + {"industrialtest:refined_iron_ingot","industrialtest:refined_iron_ingot","industrialtest:refined_iron_ingot"}, + {"","industrialtest:iron_furnace",""} + } +}) + diff --git a/machines/iron_furnace.lua b/machines/iron_furnace.lua new file mode 100644 index 0000000..0f8d400 --- /dev/null +++ b/machines/iron_furnace.lua @@ -0,0 +1,341 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") +local ironFurnace={} + +ironFurnace.getFormspec=function(fuelPercent,srcPercent) + local formspec + if industrialtest.mtgAvailable then + formspec={ + "formspec_version[4]", + "size[10.8,12]", + "label[0.5,0.5;"..S("Iron Furnace").."]", + "list[context;src;3.4,1.8;1,1]", + "listring[context;src]", + (fuelPercent>0 and "image[3.4,2.8;1,1;default_furnace_fire_bg.png^[lowpart:"..fuelPercent..":default_furnace_fire_fg.png]" + or "image[3.4,2.8;1,1;default_furnace_fire_bg.png]"), + "list[context;fuel;3.4,3.9;1,1]", + "listring[context;fuel]", + (srcPercent>0 and "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[lowpart:"..srcPercent..":gui_furnace_arrow_fg.png^[transformR270]" + or "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[transformR270]"), + "list[context;dst;6.4,2.8;1,1]", + "listring[context;dst]", + "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("Iron Furnace").."]", + "list[context;src;3.4,1.8;1,1]", + mcl_formspec.get_itemslot_bg(3.4,1.8,1,1), + "listring[context;src]", + (fuelPercent>0 and "image[3.4,2.8;1,1;default_furnace_fire_bg.png^[lowpart:"..fuelPercent..":default_furnace_fire_fg.png]" + or "image[3.4,2.8;1,1;default_furnace_fire_bg.png]"), + "list[context;fuel;3.4,3.9;1,1]", + mcl_formspec.get_itemslot_bg(3.4,3.9,1,1), + "listring[context;fuel]", + (srcPercent>0 and "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[lowpart:"..srcPercent..":gui_furnace_arrow_fg.png^[transformR270]" + or "image[4.9,2.8;1,1;gui_furnace_arrow_bg.png^[transformR270]"), + "list[context;dst;6.4,2.8;1,1]", + mcl_formspec.get_itemslot_bg(6.4,2.8,1,1), + "listring[context;dst]", + "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 + +ironFurnace.onConstruct=function(pos) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + inv:set_size("src",1) + inv:set_size("dst",1) + inv:set_size("fuel",1) + meta:set_string("formspec",ironFurnace.getFormspec(0,0)) + meta:set_float("fuelTime",0) + meta:set_float("maxFuelTime",1) + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) +end + +ironFurnace.onTimer=function(pos,elapsed) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local srcSlot=inv:get_stack("src",1) + local fuelSlot=inv:get_stack("fuel",1) + local shouldUpdateFormspec=false + local shouldRerunTimer=false + + if fuelSlot:get_count()>0 and meta:get_float("fuelTime")<=0 then + local output,after=minetest.get_craft_result({ + method="cooking", + width=1, + items={srcSlot} + }) + if output.time>0 and inv:room_for_item("dst",output.item) then + output,after=minetest.get_craft_result({ + method="fuel", + width=1, + items={fuelSlot} + }) + if output.time>0 then + meta:set_float("fuelTime",output.time) + meta:set_float("maxFuelTime",output.time) + inv:set_stack("fuel",1,after.items[1]) + minetest.swap_node(pos,{ + name="industrialtest:iron_furnace_active", + param2=minetest.get_node(pos).param2 + }) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end + end + end + + if shouldUpdateFormspec then + meta:set_string("formspec",ironFurnace.getFormspec(meta:get_float("fuelTime")/meta:get_float("maxFuelTime")*100,meta:get_float("srcTime")/meta:get_float("maxSrcTime")*100)) + end + + return shouldRerunTimer +end + +ironFurnace.activeOnTimer=function(pos,elapsed) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local srcSlot=inv:get_stack("src",1) + local fuelSlot=inv:get_stack("fuel",1) + local shouldUpdateFormspec=false + local shouldRerunTimer=false + + if fuelSlot:get_count()>0 and meta:get_float("fuelTime")<=0 then + local output,after=minetest.get_craft_result({ + method="cooking", + width=1, + items={srcSlot} + }) + if output.time>0 and inv:room_for_item("dst",output.item) then + output,after=minetest.get_craft_result({ + method="fuel", + width=1, + items={fuelSlot} + }) + if output.time>0 then + meta:set_float("fuelTime",output.time) + meta:set_float("maxFuelTime",output.time) + inv:set_stack("fuel",1,after.items[1]) + end + end + end + if srcSlot:get_count()>0 and meta:get_float("maxSrcTime")<=0 and meta:get_float("fuelTime")>0 then + local output,after=minetest.get_craft_result({ + method="cooking", + width=1, + items={srcSlot} + }) + if output.time>0 and inv:room_for_item("dst",output.item) then + meta:set_float("srcTime",0) + meta:set_float("maxSrcTime",output.time*0.7) + end + end + if meta:get_float("fuelTime")>0 then + meta:set_float("fuelTime",meta:get_float("fuelTime")-elapsed) + shouldUpdateFormspec=true + shouldRerunTimer=true + end + if meta:get_float("maxSrcTime")>0 then + if meta:get_float("fuelTime")>0 then + meta:set_float("srcTime",meta:get_float("srcTime")+elapsed) + else + meta:set_float("srcTime",0) + minetest.swap_node(pos,{ + name="industrialtest:iron_furnace", + param2=minetest.get_node(pos).param2 + }) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end + shouldUpdateFormspec=true + shouldRerunTimer=true + else + minetest.swap_node(pos,{ + name="industrialtest:iron_furnace", + param2=minetest.get_node(pos).param2 + }) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end + if meta:get_float("srcTime")>=meta:get_float("maxSrcTime") then + local output,after=minetest.get_craft_result({ + method="cooking", + width=1, + items={srcSlot} + }) + if output.item:get_count()>0 then + inv:set_stack("src",1,after.items[1]) + inv:add_item("dst",output.item) + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) + end + end + + if shouldUpdateFormspec then + meta:set_string("formspec",ironFurnace.getFormspec(meta:get_float("fuelTime")/meta:get_float("maxFuelTime")*100,meta:get_float("srcTime")/meta:get_float("maxSrcTime")*100)) + end + + return shouldRerunTimer +end + +ironFurnace.allowMetadataInventoryMove=function(pos,fromList,fromIndex,toList,toIndex,count) + if toList=="dst" then + return 0 + end + return count +end + +ironFurnace.allowMetadataInventoryPut=function(pos,listname,index,stack) + if listname=="dst" then + return 0 + elseif listname=="src" then + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local srcSlot=inv:get_stack("src",1) + if srcSlot:get_name()~=stack:get_name() then + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) + end + end + return stack:get_count() +end + +ironFurnace.onMetadataInventoryMove=function(pos,fromList,fromIndex,toList,toIndex,count) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local srcSlot=inv:get_stack("src",1) + local dstSlot=inv:get_stack("dst",1) + if fromList=="src" and count==srcSlot:get_count() then + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) + if meta:get_float("maxFuelTime")>0 then + meta:set_string("formspec",ironFurnaceFormspec(meta:get_float("fuelTime")/meta:get_float("maxFuelTime")*100,0)) + end + elseif fromList=="dst" and dstSlot:get_free_space()==0 then + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end +end + +ironFurnace.onMetadataInventoryPut=function(pos,listname,index,stack) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) +end + +ironFurnace.onMetadataInventoryTake=function(pos,listname,index,stack) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local srcSlot=inv:get_stack("src",1) + local dstSlot=inv:get_stack("dst",1) + if listname=="src" and stack:get_count()==srcSlot:get_count() then + meta:set_float("srcTime",-1) + meta:set_float("maxSrcTime",0) + if meta:get_float("maxFuelTime")>0 then + meta:set_string("formspec",ironFurnaceFormspec(meta:get_float("fuelTime")/meta:get_float("maxFuelTime")*100,0)) + end + elseif listname=="dst" and dstSlot:get_free_space()==0 then + minetest.get_node_timer(pos):start(industrialtest.updateDelay) + end +end + +local definition={ + description=S("Iron Furnace"), + 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_iron_furnace_front.png", + "industrialtest_machine_block.png" + }, + paramtype2="facedir", + legacy_facedir_simple=true, + on_construct=ironFurnace.onConstruct, + on_timer=ironFurnace.onTimer, + allow_metadata_inventory_move=ironFurnace.allowMetadataInventoryMove, + allow_metadata_inventory_put=ironFurnace.allowMetadataInventoryPut, + on_metadata_inventory_move=ironFurnace.onMetadataInventoryMove, + on_metadata_inventory_put=ironFurnace.onMetadataInventoryPut, + on_metadata_inventory_take=ironFurnace.onMetadataInventoryTake +} +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("src")[1]:get_count()>0 or inv:get_list("fuel")[1]:get_count()>0 or inv:get_list("dst")[1]:get_count()>0) + end +elseif industrialtest.mclAvailable then + definition.after_dig_node=function(pos,oldnode,oldmeta) + industrialtest.internal.mclAfterDigNode(pos,oldmeta,{"src","fuel","dst"}) + end + definition.sounds=mcl_sounds.node_sound_metal_defaults() + definition._mcl_blast_resistance=3 + definition._mcl_hardness=3.5 +end +minetest.register_node("industrialtest:iron_furnace",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_iron_furnace_front_active.png", + "industrialtest_machine_block.png" +} +definition.light_source=8 +definition.drop="industrialtest:iron_furnace" +definition.on_timer=ironFurnace.activeOnTimer +if industrialtest.mclAvailable then + definition.groups={ + not_in_creative_inventory=1 + } + definition._doc_items_create_entry=false +end +minetest.register_node("industrialtest:iron_furnace_active",definition) +minetest.register_craft({ + type="shaped", + output="industrialtest:iron_furnace", + recipe={ + {industrialtest.elementKeys.ironIngot,industrialtest.elementKeys.ironIngot,industrialtest.elementKeys.ironIngot}, + {industrialtest.elementKeys.ironIngot,"",industrialtest.elementKeys.ironIngot}, + {industrialtest.elementKeys.ironIngot,industrialtest.elementKeys.ironIngot,industrialtest.elementKeys.ironIngot} + } +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:iron_furnace", + recipe={ + {"",industrialtest.elementKeys.ironIngot,""}, + {industrialtest.elementKeys.ironIngot,"",industrialtest.elementKeys.ironIngot}, + {industrialtest.elementKeys.ironIngot,industrialtest.elementKeys.furnace,industrialtest.elementKeys.ironIngot} + } +}) diff --git a/machines/macerator.lua b/machines/macerator.lua new file mode 100644 index 0000000..1076f4c --- /dev/null +++ b/machines/macerator.lua @@ -0,0 +1,38 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") + +industrialtest.internal.registerSimpleElectricItemProcessor({ + name="macerator", + displayName=S("Macerator"), + customFrontTexture=true, + requiresWrench=true, + capacity=1200, + flow=industrialtest.api.lvPowerFlow, + opPower=100, + method="industrialtest.macerating", + efficiency=1 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:macerator", + recipe={ + {industrialtest.elementKeys.flint,industrialtest.elementKeys.flint,industrialtest.elementKeys.flint}, + {industrialtest.elementKeys.cobble,"industrialtest:machine_block",industrialtest.elementKeys.cobble}, + {"","industrialtest:electronic_circuit",""} + } +}) diff --git a/machines/power_storage.lua b/machines/power_storage.lua new file mode 100644 index 0000000..a872919 --- /dev/null +++ b/machines/power_storage.lua @@ -0,0 +1,201 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") +local powerStorage={} + +powerStorage.getFormspec=function(pos) + local meta=minetest.get_meta(pos) + local charged=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity") + local formspec + if industrialtest.mtgAvailable then + formspec={ + "list[context;charged;1,2.5;1,1]", + "listring[context;charged]", + "label[0.9,3.9;"..S("Charge").."]", + "list[context;discharged;3,2.5;1,1]", + "listring[context;discharged]", + "label[2.7,3.9;"..S("Discharge").."]", + "box[9,1;0.3,4.8;#202020]", + (charged>0 and "box[9,"..(1+4.8-(charged*4.8))..";0.3,"..(charged*4.8)..";#FF1010]" or "") + } + elseif industrialtest.mclAvailable then + formspec={ + "list[context;charged;1,2.5;1,1]", + "listring[context;charged]", + mcl_formspec.get_itemslot_bg(1,2.5,1,1), + "label[0.9,3.9;"..S("Charge").."]", + "list[context;discharged;3,2.5;1,1]", + "listring[context;discharged]", + mcl_formspec.get_itemslot_bg(3,2.5,1,1), + "label[2.7,3.9;"..S("Discharge").."]", + "box[9,1;0.3,4.8;#202020]", + (charged>0 and "box[9,"..(1+4.8-(charged*4.8))..";0.3,"..(charged*4.8)..";#FF1010]" or "") + } + end + return table.concat(formspec,"") +end + +powerStorage.onConstruct=function(pos,meta,inv) + inv:set_size("charged",1) + inv:set_size("discharged",1) +end + +powerStorage.onTimer=function(pos,elapsed,meta,inv,config) + local chargedSlot=inv:get_stack("charged",1) + local dischargedSlot=inv:get_stack("discharged",1) + local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) + local shouldUpdateFormspec=flowTransferred + local shouldRerunTimer=(afterFlow and meta:get_int("industrialtest.powerAmount")>0) + + if chargedSlot:get_count()>0 and meta:get_int("industrialtest.powerAmount")>0 and industrialtest.api.transferPowerToItem(meta,chargedSlot,config.flow)>0 then + inv:set_stack("charged",1,chargedSlot) + shouldRerunTimer=true + shouldUpdateFormspec=true + end + if dischargedSlot:get_count()>0 and not industrialtest.api.isFullyCharged(meta) and industrialtest.api.transferPowerFromItem(dischargedSlot,meta,config.flow)>0 then + inv:set_stack("discharged",1,dischargedSlot) + shouldRerunTimer=true + shouldUpdateFormspec=true + end + if not industrialtest.api.isFullyCharged(meta) then + industrialtest.api.triggerNeighbours(pos) + end + + return shouldRerunTimer,shouldUpdateFormspec +end + +powerStorage.onMetadataInventoryPut=function(pos) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) +end + +powerStorage.onMetadataInventoryMove=function(pos) + minetest.get_node_timer(pos):start(industrialtest.updateDelay) +end + +local function registerPowerStorageNode(config) + industrialtest.internal.registerMachine({ + name=config.name, + displayName=config.displayName, + capacity=config.capacity, + flow=config.flow, + ioConfig="iiiioi", + sounds=config.sounds, + powerSlots={"charged","discharged"}, + storageSlots={"charged","discharged"}, + registerActiveVariant=false, + groups={ + _industrialtest_hasPowerOutput=1, + _industrialtest_hasPowerInput=1 + }, + customKeys={ + tiles={ + config.machineBlockTexture, + config.machineBlockTexture, + config.machineBlockTexture, + config.machineBlockTexture, + config.machineBlockTexture, + config.machineBlockTexture.."^industrialtest_"..config.name.."_front.png" + }, + paramtype2="facedir", + legacy_facedir_simple=true + }, + requiresWrench=config.requiresWrench, + getFormspec=powerStorage.getFormspec, + onConstruct=powerStorage.onConstruct, + onTimer=function(pos,elapsed,meta,inv) + powerStorage.onTimer(pos,elapsed,meta,inv,config) + end, + onMetadataInventoryPut=powerStorage.onMetadataInventoryPut, + onMetadataInventoryMove=powerStorage.onMetadataInventoryMove + }) +end + +registerPowerStorageNode({ + name="batbox", + displayName=S("BatBox"), + capacity=25000, + flow=industrialtest.api.lvPowerFlow, + sounds="wood", + machineBlockTexture="industrialtest_wood_machine_block.png", + requiresWrench=false +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:batbox", + recipe={ + {"group:wood","industrialtest:insulated_tin_cable","group:wood"}, + {"industrialtest:re_battery","industrialtest:re_battery","industrialtest:re_battery"}, + {"group:wood","group:wood","group:wood"} + } +}) + +registerPowerStorageNode({ + name="cesu", + displayName=S("CESU"), + capacity=400000, + flow=industrialtest.api.mvPowerFlow, + sounds="metal", + machineBlockTexture="industrialtest_bronze_machine_block.png", + requiresWrench=false +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:cesu", + recipe={ + {"industrialtest:bronze_plate","industrialtest:insulated_copper_cable","industrialtest:bronze_plate"}, + {"industrialtest:advanced_re_battery","industrialtest:advanced_re_battery","industrialtest:advanced_re_battery"}, + {"industrialtest:bronze_plate","industrialtest:bronze_plate","industrialtest:bronze_plate"} + } +}) + +registerPowerStorageNode({ + name="mfe", + displayName=S("MFE"), + capacity=3000000, + flow=industrialtest.api.hvPowerFlow, + sounds="metal", + machineBlockTexture="industrialtest_machine_block.png", + requiresWrench=true +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:mfe", + recipe={ + {"industrialtest:insulated_gold_cable","industrialtest:energy_crystal","industrialtest:insulated_gold_cable"}, + {"industrialtest:energy_crystal","industrialtest:machine_block","industrialtest:energy_crystal"}, + {"industrialtest:insulated_gold_cable","industrialtest:energy_crystal","industrialtest:insulated_gold_cable"} + } +}) + +registerPowerStorageNode({ + name="mfsu", + displayName=S("MFSU"), + capacity=30000000, + flow=industrialtest.api.evPowerFlow, + sounds="metal", + machineBlockTexture="industrialtest_advanced_machine_block.png", + requiresWrench=false +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:mfsu", + recipe={ + {"industrialtest:lapotron_crystal","industrialtest:advanced_electronic_circuit","industrialtest:lapotron_crystal"}, + {"industrialtest:lapotron_crystal","industrialtest:mfe","industrialtest:lapotron_crystal"}, + {"industrialtest:lapotron_crystal","industrialtest:advanced_machine_block","industrialtest:lapotron_crystal"} + } +}) diff --git a/machines/recycler.lua b/machines/recycler.lua new file mode 100644 index 0000000..fb4971b --- /dev/null +++ b/machines/recycler.lua @@ -0,0 +1,38 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") + +industrialtest.internal.registerSimpleElectricItemProcessor({ + name="recycler", + displayName=S("Recycler"), + customTopTexture=true, + requiresWrench=true, + capacity=80, + flow=industrialtest.api.lvPowerFlow, + opPower=40, + method="industrialtest.recycling", + efficiency=1 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:recycler", + recipe={ + {"",industrialtest.elementKeys.glowstone,""}, + {industrialtest.elementKeys.dirt,"industrialtest:compressor",industrialtest.elementKeys.dirt}, + {"industrialtest:refined_iron_ingot",industrialtest.elementKeys.dirt,"industrialtest:refined_iron_ingot"} + } +}) diff --git a/machines/solar_panel_generator.lua b/machines/solar_panel_generator.lua new file mode 100644 index 0000000..4fa1e2b --- /dev/null +++ b/machines/solar_panel_generator.lua @@ -0,0 +1,161 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") +local solarPanel={} + +solarPanel.getFormspec=function(pos) + local amount=minetest.get_natural_light(vector.offset(pos,0,1,0))/15.0 + local charging=amount>0.5 + local formspec + if industrialtest.mtgAvailable then + formspec={ + "list[context;charged;4.9,1.8;1,1]", + "listring[context;charged]", + (charging and "image[4.9,2.8;1,1;industrialtest_gui_sun_fg.png]" + or "image[4.9,2.8;1,1;industrialtest_gui_sun_bg.png]") + } + elseif industrialtest.mclAvailable then + formspec={ + "list[context;charged;4.7,1.8;1,1]", + mcl_formspec.get_itemslot_bg(4.7,1.8,1,1), + "listring[context;charged]", + (charging and "image[4.7,2.8;1,1;industrialtest_gui_sun_fg.png]" + or "image[4.7,2.8;1,1;industrialtest_gui_sun_bg.png]") + } + end + return table.concat(formspec,"") +end + +solarPanel.onConstruct=function(pos,meta,inv) + inv:set_size("charged",1) + meta:set_float("prevAmount",0) +end + +solarPanel.onTimer=function(pos,elapsed,meta,inv,config) + local chargedSlot=inv:get_stack("charged",1) + local shouldUpdateFormspec=false + local amount=minetest.get_natural_light(vector.offset(pos,0,1,0))/15.0 + local charging=amount>0.5 + if charging then + industrialtest.api.addPower(meta,math.ceil(amount*config.flow*elapsed)) + end + if meta:get_int("industrialtest.powerAmount")>0 then + if chargedSlot:get_count()>0 and not industrialtest.api.isFullyCharged(chargedSlot:get_meta()) then + industrialtest.api.transferPowerToItem(meta,chargedSlot,math.ceil(config.flow*elapsed)) + inv:set_stack("charged",1,chargedSlot) + end + industrialtest.api.powerFlow(pos) + end + if amount~=meta:get_float("prevAmount") then + shouldUpdateFormspec=true + meta:set_float("prevAmount",amount) + end + return true,shouldUpdateFormspec +end + +local function registerSolarPanelGenerator(config) + industrialtest.internal.registerMachine({ + name=config.name, + displayName=config.displayName, + getFormspec=solarPanel.getFormspec, + capacity=config.capacity, + flow=config.flow, + ioConfig="oooooo", + requiresWrench=true, + registerActiveVariant=false, + powerSlots={"charged"}, + storageSlots={"charged"}, + sounds="metal", + groups={ + _industrialtest_hasPowerOutput=1 + }, + customKeys={ + tiles={ + "industrialtest_machine_block.png^industrialtest_"..config.name.."_top.png", + "industrialtest_machine_block.png" + } + }, + onConstruct=solarPanel.onConstruct, + onTimer=function(pos,elapsed,meta,inv) + solarPanel.onTimer(pos,elapsed,meta,inv,config) + end + }) +end + +registerSolarPanelGenerator({ + name="solar_panel", + displayName=S("Solar Panel"), + capacity=industrialtest.api.lvPowerFlow*2, + flow=industrialtest.api.lvPowerFlow +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:solar_panel", + recipe={ + {"industrialtest:coal_dust",industrialtest.elementKeys.glass,"industrialtest:coal_dust"}, + {industrialtest.elementKeys.glass,"industrialtest:coal_dust",industrialtest.elementKeys.glass}, + {"industrialtest:insulated_copper_cable","industrialtest:generator","industrialtest:insulated_copper_cable"} + } +}) + +registerSolarPanelGenerator({ + name="lv_solar_array", + displayName=S("LV Solar Array"), + capacity=industrialtest.api.lvPowerFlow*4, + flow=industrialtest.api.lvPowerFlow*2 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:lv_solar_array", + recipe={ + {"industrialtest:solar_panel","industrialtest:solar_panel","industrialtest:solar_panel"}, + {"industrialtest:solar_panel","industrialtest:lv_transformer","industrialtest:solar_panel"}, + {"industrialtest:solar_panel","industrialtest:solar_panel","industrialtest:solar_panel"} + } +}) + +registerSolarPanelGenerator({ + name="mv_solar_array", + displayName=S("MV Solar Array"), + capacity=industrialtest.api.mvPowerFlow*2, + flow=industrialtest.api.mvPowerFlow +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:mv_solar_array", + recipe={ + {"industrialtest:lv_solar_array","industrialtest:lv_solar_array","industrialtest:lv_solar_array"}, + {"industrialtest:lv_solar_array","industrialtest:mv_transformer","industrialtest:lv_solar_array"}, + {"industrialtest:lv_solar_array","industrialtest:lv_solar_array","industrialtest:lv_solar_array"} + } +}) + +registerSolarPanelGenerator({ + name="hv_solar_array", + displayName=S("HV Solar Array"), + capacity=industrialtest.api.hvPowerFlow*2, + flow=industrialtest.api.hvPowerFlow +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:hv_solar_array", + recipe={ + {"industrialtest:mv_solar_array","industrialtest:mv_solar_array","industrialtest:mv_solar_array"}, + {"industrialtest:mv_solar_array","industrialtest:hv_transformer","industrialtest:mv_solar_array"}, + {"industrialtest:mv_solar_array","industrialtest:mv_solar_array","industrialtest:mv_solar_array"} + } +}) diff --git a/machines/transformer.lua b/machines/transformer.lua new file mode 100644 index 0000000..9034ded --- /dev/null +++ b/machines/transformer.lua @@ -0,0 +1,190 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") +local transformer={} + +transformer.onConstruct=function(pos) + local meta=minetest.get_meta(pos) + industrialtest.api.addPowerStorage(meta,config.upperFlow,0,"aaaaaa") +end + +transformer.onTimer=function(pos,elapsed) + local meta=minetest.get_meta(pos) + local node=minetest.get_node(pos) + 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) + } + local upperPowerDistribution=0 + local lowerPowerDistribution=0 + + for key,value in ipairs(neighbourPositions) do + local normalized=industrialtest.api.normalizeSide(pos,key) + if industrialtest.api.hasPowerStorage(minetest.get_meta(value)) and industrialtest.api.isPowerOutput(meta,normalized) then + if normalized==5 then + upperPowerDistribution=config.upperFlow + else + lowerPowerDistribution=lowerPowerDistribution+1 + end + else + neighbourPositions[key]=0 + end + end + if lowerPowerDistribution>0 then + lowerPowerDistribution=math.floor(industrialtest.internal.clamp(math.min(config.upperFlow,meta:get_int("industrialtest.powerAmount"))/lowerPowerDistribution,0,config.lowerFlow)) + end + + local roomAvailable=false + for key,value in ipairs(neighbourPositions) do + if value~=0 then + local neighbourMeta=minetest.get_meta(value) + local normalized=industrialtest.api.normalizeSide(pos,key) + if normalized==5 then + if meta:get_int("industrialtest.powerAmount")==config.upperFlow then + industrialtest.api.transferPower(meta,neighbourMeta,config.upperFlow) + end + else + industrialtest.api.transferPower(meta,neighbourMeta,lowerPowerDistribution) + end + if not industrialtest.api.isFullyCharged(neighbourMeta) then + roomAvailable=true + end + end + end + + meta:set_string("industrialtest.ioConfig","aaaaaa") + + return (meta:get_int("industrialtest.powerAmount")>0 and roomAvailable) +end + +transformer.onPowerFlow=function(pos,side) + industrialtest.api.changeIoConfig(minetest.get_meta(pos),industrialtest.api.normalizeSide(pos,side),"i") + minetest.get_node_timer(pos):start(industrialtest.updateDelay) +end + +local function registerTransformer(config) + local definition={ + description=config.displayName, + tiles={ + config.machineBlockTexture.."^industrialtest_"..config.name.."_side.png", + config.machineBlockTexture.."^industrialtest_"..config.name.."_side.png", + config.machineBlockTexture.."^industrialtest_"..config.name.."_side.png", + config.machineBlockTexture.."^industrialtest_"..config.name.."_side.png", + config.machineBlockTexture.."^industrialtest_"..config.name.."_side.png", + config.machineBlockTexture.."^industrialtest_"..config.name.."_front.png" + }, + paramtype2="facedir", + legacy_facedir_simple=true, + drop=(config.requiresWrench and "industrialtest:machine_block" or "industrialtest:"..config.name), + on_construct=transformer.onConstruct, + on_timer=transformer.onTimer, + _industrialtest_onPowerFlow=transformer.onPowerFlow + } + if industrialtest.mtgAvailable then + definition.groups={cracky=2} + definition.sounds=(config.sounds=="metal" and default.node_sound_metal_defaults() or default.node_sound_wood_defaults()) + elseif industrialtest.mclAvailable then + definition.groups={pickaxey=1} + definition.sounds=(config.sounds=="metal" and mcl_sounds.node_sound_metal_defaults() or mcl_sounds.node_sound_wood_defaults()) + definition._mcl_blast_resistance=3 + definition._mcl_hardness=3.5 + end + definition.groups._industrialtest_hasPowerInput=1 + definition.groups._industrialtest_hasPowerOutput=1 + definition.groups._industrialtest_wrenchUnmountable=1 + minetest.register_node("industrialtest:"..config.name,definition) +end + +registerTransformer({ + name="lv_transformer", + displayName="LV Transformer", + machineBlockTexture="industrialtest_wood_machine_block.png", + requiresWrench=false, + lowerFlow=industrialtest.api.lvPowerFlow, + upperFlow=industrialtest.api.mvPowerFlow, + sounds="wood" +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:lv_transformer", + recipe={ + {"group:wood","industrialtest:insulated_tin_cable","group:wood"}, + {industrialtest.elementKeys.copperIngot,industrialtest.elementKeys.copperIngot,industrialtest.elementKeys.copperIngot}, + {"group:wood","industrialtest:insulated_copper_cable","group:wood"} + } +}) + +registerTransformer({ + name="mv_transformer", + displayName="MV Transformer", + machineBlockTexture="industrialtest_machine_block.png", + requiresWrench=true, + lowerFlow=industrialtest.api.mvPowerFlow, + upperFlow=industrialtest.api.hvPowerFlow, + sounds="metal" +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:mv_transformer", + recipe={ + {"industrialtest:insulated_copper_cable"}, + {"industrialtest:machine_block"}, + {"industrialtest:insulated_gold_cable"} + } +}) + +registerTransformer({ + name="hv_transformer", + displayName="HV Transformer", + machineBlockTexture="industrialtest_machine_block.png", + requiresWrench=true, + lowerFlow=industrialtest.api.hvPowerFlow, + upperFlow=industrialtest.api.evPowerFlow, + sounds="metal" +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:hv_transformer", + recipe={ + {"","industrialtest:insulated_iron_cable",""}, + {"industrialtest:electronic_circuit","industrialtest:mv_transformer","industrialtest:energy_crystal"}, + {"","industrialtest:insulated_iron_cable",""} + } +}) + +registerTransformer({ + name="ev_transformer", + displayName="EV Transformer", + machineBlockTexture="industrialtest_machine_block.png", + requiresWrench=true, + lowerFlow=industrialtest.api.evPowerFlow, + upperFlow=industrialtest.api.ivPowerFlow, + sounds="metal" +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:ev_transformer", + recipe={ + {"","industrialtest:insulated_iron_cable",""}, + {"industrialtest:advanced_electronic_circuit","industrialtest:hv_transformer","industrialtest:lapotron_crystal"}, + {"","industrialtest:insulated_iron_cable",""} + } +}) diff --git a/machines/wind_mill.lua b/machines/wind_mill.lua new file mode 100644 index 0000000..55fd747 --- /dev/null +++ b/machines/wind_mill.lua @@ -0,0 +1,131 @@ +-- IndustrialTest +-- Copyright (C) 2023 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local S=minetest.get_translator("industrialtest") +local windMill={} + +windMill.getFormspec=function(pos) + local meta=minetest.get_meta(pos) + local charging=meta:get_int("charging") + local formspec + if industrialtest.mtgAvailable then + formspec={ + "list[context;charged;4.9,1.8;1,1]", + "listring[context;charged]", + (charging>0 and "image[4.9,3;1,1;industrialtest_gui_wind_bg.png^[lowpart:"..charging..":industrialtest_gui_wind_fg.png]" + or "image[4.9,3;1,1;industrialtest_gui_wind_bg.png]") + } + elseif industrialtest.mclAvailable then + formspec={ + "list[context;charged;4.7,1.8;1,1]", + mcl_formspec.get_itemslot_bg(4.7,1.8,1,1), + "listring[context;charged]", + (charging>0 and "image[4.7,3;1,1;industrialtest_gui_wind_bg.png^[lowpart:"..charging..":industrialtest_gui_wind_fg.png]" + or "image[4.7,3;1,1;industrialtest_gui_wind_bg.png]") + } + end + return table.concat(formspec,"") +end + +windMill.onConstruct=function(pos,meta,inv) + inv:set_size("charged",1) + meta:set_int("prevCharging",0) + meta:set_int("charging",0) +end + +windMill.onTimer=function(pos,elapsed,meta,inv) + local chargedSlot=inv:get_stack("charged",1) + local shouldUpdateFormspec=false + local charging + if industrialtest.mtgAvailable then + charging=math.min(math.max(pos.y,0)/150,1.0) + elseif industrialtest.mclAvailable then + local dimMax=31000 + local dim=mcl_worlds.pos_to_dimension(pos) + if dim=="overworld" then + dimMax=mcl_vars.mg_overworld_max + elseif dim=="nether" then + dimMax=mcl_vars.mg_nether_max + elseif dim=="end" then + dimMax=mcl_vars.mg_end_max + end + charging=math.max(mcl_worlds.layer_to_y(pos.y,dim),0)/dimMax + end + local neighbourPositions={ + vector.offset(pos,-1,0,0), + vector.offset(pos,1,0,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 and node.name~="air" then + charging=0 + break + end + end + industrialtest.api.addPower(meta,math.ceil(charging*elapsed*industrialtest.api.lvPowerFlow)) + if meta:get_int("prevCharging")~=charging then + shouldUpdateFormspec=true + 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) + end + end + industrialtest.api.powerFlow(pos) + meta:set_int("charging",charging*100) + return true,shouldUpdateFormspec +end + +industrialtest.internal.registerMachine({ + name="wind_mill", + displayName=S("Wind Mill"), + getFormspec=windMill.getFormspec, + capacity=7000, + flow=industrialtest.api.lvPowerFlow, + ioConfig="oooooo", + requiresWrench=true, + registerActiveVariant=false, + powerSlots={"charged"}, + storageSlots={"charged"}, + sounds="metal", + groups={ + _industrialtest_hasPowerOutput=1 + }, + customKeys={ + tiles={ + "industrialtest_machine_block.png", + "industrialtest_machine_block.png", + "industrialtest_machine_block.png^industrialtest_wind_mill_side.png", + "industrialtest_machine_block.png^industrialtest_wind_mill_side.png", + "industrialtest_machine_block.png^industrialtest_wind_mill_side.png", + "industrialtest_machine_block.png^industrialtest_wind_mill_side.png" + } + }, + onConstruct=windMill.onConstruct, + onTimer=windMill.onTimer +}) + +minetest.register_craft({ + type="shaped", + output="industrialtest:wind_mill", + recipe={ + {"","industrialtest:refined_iron_ingot",""}, + {"industrialtest:refined_iron_ingot","industrialtest:generator","industrialtest:refined_iron_ingot"}, + {"","industrialtest:refined_iron_ingot",""} + } +})