Compare commits

..

10 Commits

13 changed files with 442 additions and 63 deletions

View File

@ -15,6 +15,7 @@ Currently IndustrialTest supports following games:
## Optional dependencies ## Optional dependencies
- [Rubber Addon for MineClone](https://content.minetest.net/packages/biochemist/mcl_rubber) - [Rubber Addon for MineClone](https://content.minetest.net/packages/biochemist/mcl_rubber)
- [Pipeworks](https://content.minetest.net/packages/VanessaE/pipeworks) - [Pipeworks](https://content.minetest.net/packages/VanessaE/pipeworks)
- [Mesecons](https://content.minetest.net/packages/Jeija/mesecons)
## Contributors ## Contributors
- mrkubax10 <mrkubax10@onet.pl or mrkubax10 at irc.libera.chat> [programming, some graphics] - mrkubax10 <mrkubax10@onet.pl or mrkubax10 at irc.libera.chat> [programming, some graphics]

124
compat/mesecons.lua Normal file
View File

@ -0,0 +1,124 @@
-- IndustrialTest
-- Copyright (C) 2024 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 <http://www.gnu.org/licenses/>.
-- Rotary Macerator
local override={
mesecons={
effector={
action_on=function(pos,node)
if node.name~="industrialtest:rotary_macerator" then
return
end
local meta=minetest.get_meta(pos)
meta:set_int("maintainSpeed",1)
local def=minetest.registered_nodes[node.name]
def._industrialtest_updateFormspec(pos)
minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end,
action_off=function(pos,node)
local meta=minetest.get_meta(pos)
meta:set_int("maintainSpeed",0)
local def=minetest.registered_nodes[node.name]
def._industrialtest_updateFormspec(pos)
end
}
}
}
minetest.override_item("industrialtest:rotary_macerator",override)
minetest.override_item("industrialtest:rotary_macerator_active",override)
-- Nuclear Reactor
override={
mesecons={
effector={
action_on=function(pos,node)
local isChamber=node.name=="industrialtest:nuclear_reactor_chamber"
if node.name~="industrialtest:nuclear_reactor" and not isChamber then
return
end
local originalPos
local meta=minetest.get_meta(pos)
meta:set_int("meseconPowered",1)
if isChamber then
originalPos=pos
pos=minetest.deserialize(meta:get_string("reactor"))
node=minetest.get_node(pos)
meta=minetest.get_meta(pos)
end
meta:set_int("enabled",1)
meta:set_int("stateChanged",1)
local def=minetest.registered_nodes[node.name]
def._industrialtest_updateFormspec(pos)
if isChamber then
def._industrialtest_synchronizeToChamber(originalPos)
end
minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end,
action_off=function(pos,node)
local isChamber=node.name=="industrialtest:nuclear_reactor_chamber"
local originalPos
local meta=minetest.get_meta(pos)
meta:set_int("meseconPowered",0)
if isChamber then
originalPos=pos
pos=minetest.deserialize(meta:get_string("reactor"))
node=minetest.get_node(pos)
meta=minetest.get_meta(pos)
end
if meta:get_int("meseconPowered")==1 then
return
end
if meta:contains("chambers") then
local chambers=minetest.deserialize(meta:get_string("chambers"))
for _,chamber in ipairs(chambers) do
local chamberMeta=minetest.get_meta(chamber)
if chamberMeta:get_int("meseconPowered")==1 then
return
end
end
end
meta:set_int("enabled",0)
meta:set_int("stateChanged",1)
local def=minetest.registered_nodes[node.name]
def._industrialtest_updateFormspec(pos)
if isChamber then
def._industrialtest_synchronizeToChamber(originalPos)
end
end
}
}
}
minetest.override_item("industrialtest:nuclear_reactor",override)
minetest.override_item("industrialtest:nuclear_reactor_active",override)
-- Nuclear Reactor Chamber
minetest.override_item("industrialtest:nuclear_reactor_chamber",override)

View File

@ -157,6 +157,7 @@ local override={
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
local result=inv:add_item(listname,stack) local result=inv:add_item(listname,stack)
minetest.registered_nodes["industrialtest:nuclear_reactor"].on_metadata_inventory_put(pos)
return result return result
end, end,
can_insert=function(pos,node,stack,direction) can_insert=function(pos,node,stack,direction)
@ -188,6 +189,36 @@ local override={
minetest.override_item("industrialtest:nuclear_reactor",override) minetest.override_item("industrialtest:nuclear_reactor",override)
minetest.override_item("industrialtest:nuclear_reactor_active",override) minetest.override_item("industrialtest:nuclear_reactor_active",override)
-- Nuclear Reactor Chamber
override=table.copy(override)
def=table.copy(minetest.registered_nodes["industrialtest:nuclear_reactor_chamber"])
override.groups=def.groups
override.groups.tubedevice=1
override.groups.tubedevice_receiver=1
override.tube.insert_object=function(pos,node,stack,direction)
local listname=direction.y==0 and "charged" or "fuel"
local def=stack:get_definition()
if (listname=="charged" and not industrialtest.api.hasPowerStorage(stack:get_meta())) or
(listname=="fuel" and (not def.groups or not def.groups._industrialtest_placedInNuclearReactor)) then
return nil
end
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local result=inv:add_item(listname,stack)
minetest.registered_nodes["industrialtest:nuclear_reactor_chamber"].on_metadata_inventory_put(pos)
return result
end
override.after_place_node_old=def.after_place_node
override.after_place_node=function(pos)
minetest.registered_nodes["industrialtest:nuclear_reactor_chamber"].after_place_node_old(pos)
pipeworks.after_place(pos)
end
minetest.override_item("industrialtest:nuclear_reactor_chamber",override)
-- BatBox -- BatBox
addPipeworksCompatibility("industrialtest:batbox",{ addPipeworksCompatibility("industrialtest:batbox",{
{ {

View File

@ -46,6 +46,7 @@ elseif industrialtest.mclAvailable then
industrialtest.mods.mclRubber=minetest.get_modpath("mcl_rubber") industrialtest.mods.mclRubber=minetest.get_modpath("mcl_rubber")
end end
industrialtest.mods.pipeworks=minetest.get_modpath("pipeworks") industrialtest.mods.pipeworks=minetest.get_modpath("pipeworks")
industrialtest.mods.mesecons=minetest.get_modpath("mesecons")
if industrialtest.mtgAvailable and not industrialtest.mods._3dArmor then if industrialtest.mtgAvailable and not industrialtest.mods._3dArmor then
error("IndustrialTest requires 3D Armor when used with Minetest Game") error("IndustrialTest requires 3D Armor when used with Minetest Game")

View File

@ -554,6 +554,13 @@ industrialtest.api.registerPlate("tin_plate",S("Tin Plate"),{
} }
},"#e0e0e0ff",true) },"#e0e0e0ff",true)
industrialtest.api.registerPlate("lead_plate",S("Lead Plate"),{
{
resource="industrialtest:lead_ingot",
count=1
}
},"#eafef8ff",true)
-- Cells -- Cells
minetest.register_craftitem("industrialtest:empty_cell",{ minetest.register_craftitem("industrialtest:empty_cell",{
description=S("Empty Cell"), description=S("Empty Cell"),

View File

@ -83,3 +83,6 @@ dofile(modpath.."/crafts.lua")
if industrialtest.mods.pipeworks then if industrialtest.mods.pipeworks then
dofile(modpath.."/compat/pipeworks.lua") dofile(modpath.."/compat/pipeworks.lua")
end end
if industrialtest.mods.mesecons then
dofile(modpath.."/compat/mesecons.lua")
end

View File

@ -95,9 +95,6 @@ machine.onConstruct=function(pos,config)
local inv=meta:get_inventory() local inv=meta:get_inventory()
industrialtest.api.addPowerStorage(meta,config.capacity,config.flow,config.ioConfig) industrialtest.api.addPowerStorage(meta,config.capacity,config.flow,config.ioConfig)
if not config.withoutFormspec then
meta:set_string("formspec",machine.getFormspec(pos,config))
end
if config.groups then if config.groups then
if config.groups._industrialtest_hasPowerInput then if config.groups._industrialtest_hasPowerInput then
@ -130,10 +127,14 @@ machine.onConstruct=function(pos,config)
config.onConstruct(pos,meta,inv) config.onConstruct(pos,meta,inv)
end end
if not config.withoutFormspec then
meta:set_string("formspec",machine.getFormspec(pos,config))
end
minetest.get_node_timer(pos):start(industrialtest.updateDelay) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end end
machine.onDestruct=function(pos) machine.onDestruct=function(pos,config)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
if industrialtest.api.isNetworkMaster(meta) then if industrialtest.api.isNetworkMaster(meta) then
local network=industrialtest.api.createNetworkMap(pos,true) local network=industrialtest.api.createNetworkMap(pos,true)
@ -155,6 +156,9 @@ machine.onDestruct=function(pos)
industrialtest.api.removeNodeFromNetwork(network,pos) industrialtest.api.removeNodeFromNetwork(network,pos)
end end
end end
if config.onDestruct then
config.onDestruct(pos)
end
end end
machine.onTimer=function(pos,elapsed,config) machine.onTimer=function(pos,elapsed,config)
@ -287,7 +291,9 @@ function industrialtest.internal.registerMachine(config)
on_construct=function(pos) on_construct=function(pos)
machine.onConstruct(pos,config) machine.onConstruct(pos,config)
end, end,
on_destruct=machine.onDestruct, on_destruct=function(pos)
machine.onDestruct(pos,config)
end,
on_timer=function(pos,elapsed) on_timer=function(pos,elapsed)
local shouldRerunTimer,_=machine.onTimer(pos,elapsed,config) local shouldRerunTimer,_=machine.onTimer(pos,elapsed,config)
return shouldRerunTimer return shouldRerunTimer
@ -321,6 +327,12 @@ function industrialtest.internal.registerMachine(config)
end, end,
_industrialtest_updateFormspec=function(pos) _industrialtest_updateFormspec=function(pos)
machine.updateFormspec(pos,config) machine.updateFormspec(pos,config)
end,
_industrialtest_getFormspec=function(pos)
if config.withoutFormspec then
return ""
end
return machine.getFormspec(pos,config)
end end
} }
if industrialtest.mtgAvailable then if industrialtest.mtgAvailable then

View File

@ -16,15 +16,17 @@
local S=minetest.get_translator("industrialtest") local S=minetest.get_translator("industrialtest")
local reactor={} local reactor={}
local reactorChamber={}
reactor.getFormspec=function(pos) reactor.getFormspec=function(pos)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local charged=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity") local charged=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")
local size=math.floor(meta:get_int("size")/3)
local switchText=(meta:get_int("enabled")==0 and S("Start") or S("Stop")) local switchText=(meta:get_int("enabled")==0 and S("Start") or S("Stop"))
local formspec local formspec
if industrialtest.mtgAvailable then if industrialtest.mtgAvailable then
formspec={ formspec={
"list[context;fuel;1,1;5,4]", "list[context;fuel;1,1;"..size..","..size.."]",
"listring[context;fuel]", "listring[context;fuel]",
"list[context;charged;7.7,2.8;1,1]", "list[context;charged;7.7,2.8;1,1]",
"listring[context;charged]", "listring[context;charged]",
@ -34,8 +36,8 @@ reactor.getFormspec=function(pos)
} }
elseif industrialtest.mclAvailable then elseif industrialtest.mclAvailable then
formspec={ formspec={
"list[context;fuel;1,1;5,4]", "list[context;fuel;1,1;"..size..","..size.."]",
mcl_formspec.get_itemslot_bg(1,1,5,4), mcl_formspec.get_itemslot_bg(1,1,size,size),
"listring[context;fuel]", "listring[context;fuel]",
"list[context;charged;7,2.8;1,1]", "list[context;charged;7,2.8;1,1]",
mcl_formspec.get_itemslot_bg(7.7,2.8,1,1), mcl_formspec.get_itemslot_bg(7.7,2.8,1,1),
@ -49,13 +51,23 @@ reactor.getFormspec=function(pos)
end end
reactor.onConstruct=function(pos,meta,inv) reactor.onConstruct=function(pos,meta,inv)
inv:set_size("fuel",20) inv:set_size("fuel",4)
inv:set_size("charged",1) inv:set_size("charged",1)
meta:set_int("heat",0) meta:set_int("heat",0)
meta:set_int("size",6)
meta:set_int("enabled",0) meta:set_int("enabled",0)
meta:set_int("stateChanged",0) meta:set_int("stateChanged",0)
end end
reactor.onDestruct=function(pos)
local meta=minetest.get_meta(pos)
local chambers=minetest.deserialize(meta:get_string("chambers")) or {}
for _,chamber in ipairs(chambers) do
minetest.remove_node(chamber)
minetest.add_item(chamber,"industrialtest:nuclear_reactor_chamber")
end
end
local function hasFuel(fuelList) local function hasFuel(fuelList)
for _,stack in ipairs(fuelList) do for _,stack in ipairs(fuelList) do
if stack:get_name()=="industrialtest:uranium_cell" then if stack:get_name()=="industrialtest:uranium_cell" then
@ -65,12 +77,12 @@ local function hasFuel(fuelList)
return false return false
end end
local function findMaxFuelCluster(fuelList) local function findMaxFuelCluster(size,fuelList)
local maxCluster={} local maxCluster={}
for y=1,4 do for y=1,size do
for x=1,5 do for x=1,size do
local iy=y-1 local iy=y-1
local stack=fuelList[iy*5+x] local stack=fuelList[iy*size+x]
local def=minetest.registered_tools[stack:get_name()] local def=minetest.registered_tools[stack:get_name()]
if def and def.groups._industrialtest_nuclearReactorFuel then if def and def.groups._industrialtest_nuclearReactorFuel then
local cluster={ local cluster={
@ -79,49 +91,49 @@ local function findMaxFuelCluster(fuelList)
y=iy y=iy
} }
} }
if x>1 and fuelList[iy*5+x-1]:get_name()==stack:get_name() then if x>1 and fuelList[iy*size+x-1]:get_name()==stack:get_name() then
table.insert(cluster,{ table.insert(cluster,{
x=x-1, x=x-1,
y=iy y=iy
}) })
end end
if x<5 and fuelList[iy*5+x+1]:get_name()==stack:get_name() then if x<size and fuelList[iy*size+x+1]:get_name()==stack:get_name() then
table.insert(cluster,{ table.insert(cluster,{
x=x+1, x=x+1,
y=iy y=iy
}) })
end end
if y>1 and fuelList[(iy-1)*5+x]:get_name()==stack:get_name() then if y>1 and fuelList[(iy-1)*size+x]:get_name()==stack:get_name() then
table.insert(cluster,{ table.insert(cluster,{
x=x, x=x,
y=iy-1 y=iy-1
}) })
end end
if y<4 and fuelList[(iy+1)*5+x]:get_name()==stack:get_name() then if y<size and fuelList[(iy+1)*size+x]:get_name()==stack:get_name() then
table.insert(cluster,{ table.insert(cluster,{
x=x, x=x,
y=iy+1 y=iy+1
}) })
end end
if x>1 and y>1 and fuelList[(iy-1)*5+x-1]:get_name()==stack:get_name() then if x>1 and y>1 and fuelList[(iy-1)*size+x-1]:get_name()==stack:get_name() then
table.insert(cluster,{ table.insert(cluster,{
x=x-1, x=x-1,
y=iy-1 y=iy-1
}) })
end end
if x<5 and y>1 and fuelList[(iy-1)*5+x+1]:get_name()==stack:get_name() then if x<size and y>1 and fuelList[(iy-1)*size+x+1]:get_name()==stack:get_name() then
table.insert(cluster,{ table.insert(cluster,{
x=x+1, x=x+1,
y=iy-1 y=iy-1
}) })
end end
if x>1 and y<4 and fuelList[(iy+1)*5+x-1]:get_name()==stack:get_name() then if x>1 and y<size and fuelList[(iy+1)*size+x-1]:get_name()==stack:get_name() then
table.insert(cluster,{ table.insert(cluster,{
x=x-1, x=x-1,
y=iy+1 y=iy+1
}) })
end end
if x<5 and y<4 and fuelList[(iy+1)*5+x+1]:get_name()==stack:get_name() then if x<size and y<size and fuelList[(iy+1)*size+x+1]:get_name()==stack:get_name() then
table.insert(cluster,{ table.insert(cluster,{
x=x+1, x=x+1,
y=iy+1 y=iy+1
@ -140,7 +152,7 @@ local function findMaxFuelCluster(fuelList)
end end
local function findCoolant(fuelList) local function findCoolant(fuelList)
for i=1,20 do for i=1,#fuelList do
local stack=fuelList[i] local stack=fuelList[i]
local def=minetest.registered_tools[stack:get_name()] local def=minetest.registered_tools[stack:get_name()]
if def and def.groups._industrialtest_nuclearReactorCoolant then if def and def.groups._industrialtest_nuclearReactorCoolant then
@ -189,11 +201,14 @@ reactor.onTimer=function(pos,elapsed,meta,inv)
shouldRerunTimer=false shouldRerunTimer=false
end end
reactor.synchronizeChambers(pos)
return shouldRerunTimer,shouldUpdateFormspec return shouldRerunTimer,shouldUpdateFormspec
end end
reactor.activeOnTimer=function(pos,elapsed,meta,inv) reactor.activeOnTimer=function(pos,elapsed,meta,inv)
local powerFlow=meta:get_int("industrialtest.powerFlow") local powerFlow=meta:get_int("industrialtest.powerFlow")
local size=math.floor(meta:get_int("size")/3)
local chargedSlot=inv:get_stack("charged",1) local chargedSlot=inv:get_stack("charged",1)
local fuelList=inv:get_list("fuel") local fuelList=inv:get_list("fuel")
local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos) local afterFlow,flowTransferred=industrialtest.api.powerFlow(pos)
@ -218,13 +233,14 @@ reactor.activeOnTimer=function(pos,elapsed,meta,inv)
param2=minetest.get_node(pos).param2 param2=minetest.get_node(pos).param2
}) })
meta:set_int("enabled",0) meta:set_int("enabled",0)
reactor.synchronizeChambers(pos)
minetest.get_node_timer(pos):start(industrialtest.updateDelay) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
return false,shouldUpdateFormspec return false,shouldUpdateFormspec
end end
local maxCluster=findMaxFuelCluster(fuelList) local maxCluster=findMaxFuelCluster(size,fuelList)
for _,stack in ipairs(maxCluster) do for _,stack in ipairs(maxCluster) do
local index=stack.y*5+stack.x local index=stack.y*size+stack.x
local usedStack,_=useFuel(fuelList[index],5) local usedStack,_=useFuel(fuelList[index],5)
inv:set_stack("fuel",index,usedStack) inv:set_stack("fuel",index,usedStack)
end end
@ -237,7 +253,7 @@ reactor.activeOnTimer=function(pos,elapsed,meta,inv)
local coolant=findCoolant(fuelList) local coolant=findCoolant(fuelList)
if coolant>0 then if coolant>0 then
local coolantStack,used=useFuel(fuelList[coolant],#maxCluster*50) local coolantStack,used=useFuel(fuelList[coolant],#maxCluster*50)
heat=heat-used heat=math.max(0,heat-used)
inv:set_stack("fuel",coolant,coolantStack) inv:set_stack("fuel",coolant,coolantStack)
end end
if heat>200 then if heat>200 then
@ -247,6 +263,8 @@ reactor.activeOnTimer=function(pos,elapsed,meta,inv)
end end
meta:set_int("heat",heat) meta:set_int("heat",heat)
reactor.synchronizeChambers(pos)
return shouldRerunTimer,shouldUpdateFormspec return shouldRerunTimer,shouldUpdateFormspec
end end
@ -271,6 +289,7 @@ end
reactor.metadataChange=function(pos) reactor.metadataChange=function(pos)
minetest.get_node_timer(pos):start(industrialtest.updateDelay) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
reactor.synchronizeChambers(pos)
end end
reactor.handleFormspecFields=function(pos,formname,fields) reactor.handleFormspecFields=function(pos,formname,fields)
@ -292,33 +311,121 @@ reactor.handleFormspecFields=function(pos,formname,fields)
reactor.metadataChange(pos) reactor.metadataChange(pos)
end end
local definition={ reactor.synchronizeToChamber=function(pos)
description=S("Nuclear Reactor Chamber"), local meta=minetest.get_meta(pos)
tiles={"industrialtest_machine_block.png^industrialtest_nuclear_reactor_top.png"}, local inv=meta:get_inventory()
drop="industrialtest:machine_block", local fuelList=inv:get_list("fuel")
groups={ local chargedList=inv:get_list("charged")
_industrialtest_wrenchUnmountable=1
} local reactorPos=minetest.deserialize(meta:get_string("reactor"))
} local reactorMeta=minetest.get_meta(reactorPos)
if industrialtest.mtgAvailable then local reactorInv=reactorMeta:get_inventory()
definition.sounds=default.node_sound_metal_defaults() reactorInv:set_list("fuel",fuelList)
definition.groups.cracky=1 reactorInv:set_list("charged",chargedList)
definition.groups.level=2
elseif industrialtest.mclAvailable then reactor.synchronizeChambers(reactorPos)
definition.sounds=mcl_sounds.node_sound_metal_defaults()
definition._mcl_blast_resistance=6
definition._mcl_hardness=5
end end
minetest.register_node("industrialtest:nuclear_reactor_chamber",definition)
minetest.register_craft({ reactor.synchronizeChambers=function(pos)
type="shaped", local meta=minetest.get_meta(pos)
output="industrialtest:nuclear_reactor_chamber", local chambers=meta:contains("chambers") and minetest.deserialize(meta:get_string("chambers")) or {}
recipe={ for _,chamber in ipairs(chambers) do
{"","industrialtest:copper_plate",""}, reactorChamber.synchronize(chamber,pos)
{"industrialtest:copper_plate","industrialtest:machine_block","industrialtest:copper_plate"}, end
{"","industrialtest:copper_plate",""} end
reactor.changeSize=function(pos,diff)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local size=meta:get_int("size")+diff
local actualSize=math.floor(size/3)
meta:set_int("size",size)
inv:set_size("fuel",actualSize*actualSize)
local def=minetest.registered_nodes[minetest.get_node(pos).name]
def._industrialtest_updateFormspec(pos)
end
reactorChamber.synchronize=function(pos,reactor)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local reactorDef=minetest.registered_nodes[minetest.get_node(reactor).name]
meta:set_string("formspec",reactorDef._industrialtest_getFormspec(reactor))
local reactorMeta=minetest.get_meta(reactor)
local reactorInv=reactorMeta:get_inventory()
local fuelList=reactorInv:get_list("fuel")
local chargedList=reactorInv:get_list("charged")
inv:set_size("fuel",#fuelList)
inv:set_size("charged",#chargedList)
inv:set_list("fuel",fuelList)
inv:set_list("charged",chargedList)
end
reactorChamber.afterPlaceNode=function(pos)
local neighbours={
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 reactorPos=nil
for _,neighbour in ipairs(neighbours) do
local node=minetest.get_node(neighbour)
if node.name=="industrialtest:nuclear_reactor" or node.name=="industrialtest:nuclear_reactor_active" then
reactorPos=neighbour
end
end
if not reactorPos then
minetest.remove_node(pos)
return true
end
local meta=minetest.get_meta(pos)
meta:set_string("reactor",minetest.serialize(reactorPos))
reactor.changeSize(reactorPos,1)
reactor.synchronizeChambers(reactorPos)
local reactorMeta=minetest.get_meta(reactorPos)
local chambers=reactorMeta:contains("chambers") and minetest.deserialize(reactorMeta:get_string("chambers")) or {}
table.insert(chambers,pos)
reactorMeta:set_string("chambers",minetest.serialize(chambers))
industrialtest.api.createNetworkMapForNode(reactorPos)
reactorChamber.synchronize(pos,reactorPos)
end
reactorChamber.onDestruct=function(pos)
local meta=minetest.get_meta(pos)
if not meta:contains("reactor") then
return
end
local reactorPos=minetest.deserialize(meta:get_string("reactor"))
local reactorMeta=minetest.get_meta(reactorPos)
if not reactorMeta or not reactorMeta:contains("chambers") then
return
end
local chambers=minetest.deserialize(reactorMeta:get_string("chambers"))
for i,chamber in ipairs(chambers) do
if chamber.x==pos.x and chamber.y==pos.y and chamber.z==pos.z then
table.remove(chambers,i)
break
end
end
reactorMeta:set_string("chambers",minetest.serialize(chambers))
reactor.changeSize(reactorPos,-1)
reactor.synchronizeChambers(reactorPos)
end
reactorChamber.handleFormspecFields=function(pos,formname,fields)
local meta=minetest.get_meta(pos)
local reactorPos=minetest.deserialize(meta:get_string("reactor"))
reactor.handleFormspecFields(reactorPos,formname,fields)
end
industrialtest.internal.registerMachine({ industrialtest.internal.registerMachine({
name="nuclear_reactor", name="nuclear_reactor",
@ -347,7 +454,8 @@ industrialtest.internal.registerMachine({
}, },
paramtype2="facedir", paramtype2="facedir",
legacy_facedir_simple=true, legacy_facedir_simple=true,
on_receive_fields=reactor.handleFormspecFields on_receive_fields=reactor.handleFormspecFields,
_industrialtest_synchronizeToChamber=reactor.synchronizeToChamber
}, },
activeCustomKeys={ activeCustomKeys={
tiles={ tiles={
@ -363,12 +471,14 @@ industrialtest.internal.registerMachine({
on_receive_fields=reactor.handleFormspecFields on_receive_fields=reactor.handleFormspecFields
}, },
onConstruct=reactor.onConstruct, onConstruct=reactor.onConstruct,
onDestruct=reactor.onDestruct,
onTimer=reactor.onTimer, onTimer=reactor.onTimer,
activeOnTimer=reactor.activeOnTimer, activeOnTimer=reactor.activeOnTimer,
allowMetadataInventoryMove=reactor.allowMetadataInventoryMove, allowMetadataInventoryMove=reactor.allowMetadataInventoryMove,
allowMetadataInventoryPut=reactor.allowMetadataInventoryPut, allowMetadataInventoryPut=reactor.allowMetadataInventoryPut,
onMetadataInventoryMove=reactor.metadataChange, onMetadataInventoryMove=reactor.metadataChange,
onMetadataInventoryPut=reactor.metadataChange onMetadataInventoryPut=reactor.metadataChange,
onMetadataInventoryTake=reactor.metadataChange
}) })
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
@ -379,3 +489,42 @@ minetest.register_craft({
{"","industrialtest:generator",""} {"","industrialtest:generator",""}
} }
}) })
local definition={
description=S("Nuclear Reactor Chamber"),
tiles={"industrialtest_machine_block.png^industrialtest_nuclear_reactor_top.png"},
drop="industrialtest:machine_block",
groups={
_industrialtest_wrenchUnmountable=1,
_industrialtest_cable=1
},
on_destruct=reactorChamber.onDestruct,
after_place_node=reactorChamber.afterPlaceNode,
can_dig=minetest.registered_nodes["industrialtest:nuclear_reactor"].can_dig,
on_receive_fields=reactorChamber.handleFormspecFields,
allow_metadata_inventory_move=minetest.registered_nodes["industrialtest:nuclear_reactor"].allow_metadata_inventory_move,
allow_metadata_inventory_put=minetest.registered_nodes["industrialtest:nuclear_reactor"].allow_metadata_inventory_put,
on_metadata_inventory_move=reactor.synchronizeToChamber,
on_metadata_inventory_put=reactor.synchronizeToChamber,
on_metadata_inventory_take=reactor.synchronizeToChamber,
_industrialtest_cableFlow=industrialtest.api.evPowerFlow
}
if industrialtest.mtgAvailable then
definition.sounds=default.node_sound_metal_defaults()
definition.groups.cracky=1
definition.groups.level=2
elseif industrialtest.mclAvailable then
definition.sounds=mcl_sounds.node_sound_metal_defaults()
definition._mcl_blast_resistance=6
definition._mcl_hardness=5
end
minetest.register_node("industrialtest:nuclear_reactor_chamber",definition)
minetest.register_craft({
type="shaped",
output="industrialtest:nuclear_reactor_chamber",
recipe={
{"","industrialtest:lead_plate",""},
{"industrialtest:lead_plate","industrialtest:machine_block","industrialtest:lead_plate"},
{"","industrialtest:lead_plate",""}
}
})

View File

@ -18,6 +18,7 @@ local S=minetest.get_translator("industrialtest")
local rotaryMacerator={} local rotaryMacerator={}
rotaryMacerator.opPower=60 rotaryMacerator.opPower=60
rotaryMacerator.maintainSpeedOpPower=10
rotaryMacerator.getFormspec=function(pos) rotaryMacerator.getFormspec=function(pos)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
@ -25,6 +26,7 @@ rotaryMacerator.getFormspec=function(pos)
local maxSrcTime=meta:get_float("maxSrcTime") local maxSrcTime=meta:get_float("maxSrcTime")
local srcPercent=maxSrcTime>0 and meta:get_float("srcTime")/maxSrcTime*100 or 0 local srcPercent=maxSrcTime>0 and meta:get_float("srcTime")/maxSrcTime*100 or 0
local rpm=meta:get_int("rpm") local rpm=meta:get_int("rpm")
local buttonMaintainSpeedText=meta:get_int("maintainSpeed")==1 and S("Don't maintain speed") or S("Maintain speed")
local formspec local formspec
if industrialtest.mtgAvailable then if industrialtest.mtgAvailable then
formspec={ formspec={
@ -38,6 +40,7 @@ rotaryMacerator.getFormspec=function(pos)
"list[context;dst;6,2.8;1,1;]", "list[context;dst;6,2.8;1,1;]",
"list[context;upgrades;9,0.9;1,4]", "list[context;upgrades;9,0.9;1,4]",
"label[0.5,2.8;"..minetest.formspec_escape(S("Speed: @1",rpm)).."]", "label[0.5,2.8;"..minetest.formspec_escape(S("Speed: @1",rpm)).."]",
"button[0.5,3.4;3,0.8;maintainSpeed;"..minetest.formspec_escape(buttonMaintainSpeedText).."]",
"listring[context;src]", "listring[context;src]",
"listring[context;modifier]", "listring[context;modifier]",
"listring[context;powerStorage]", "listring[context;powerStorage]",
@ -61,6 +64,7 @@ rotaryMacerator.getFormspec=function(pos)
"list[context;upgrades;9,0.9;1,4]", "list[context;upgrades;9,0.9;1,4]",
mcl_formspec.get_itemslot_bg(9,0.9,1,4), mcl_formspec.get_itemslot_bg(9,0.9,1,4),
"label[0.5,2.8;"..minetest.formspec_escape(S("Speed: @1",rpm)).."]", "label[0.5,2.8;"..minetest.formspec_escape(S("Speed: @1",rpm)).."]",
"button[0.5,3.4;3,0.8;maintainSpeed;"..minetest.formspec_escape(buttonMaintainSpeedText).."]",
"listring[context;src]", "listring[context;src]",
"listring[context;modifier]", "listring[context;modifier]",
"listring[context;powerStorage]", "listring[context;powerStorage]",
@ -80,6 +84,7 @@ rotaryMacerator.onConstruct=function(pos,meta,inv)
meta:set_int("rpm",0) meta:set_int("rpm",0)
meta:set_float("srcTime",0) meta:set_float("srcTime",0)
meta:set_float("maxSrcTime",0) meta:set_float("maxSrcTime",0)
meta:set_int("maintainSpeed",0)
end end
rotaryMacerator.onTimer=function(pos,elapsed,meta,inv) rotaryMacerator.onTimer=function(pos,elapsed,meta,inv)
@ -88,12 +93,21 @@ rotaryMacerator.onTimer=function(pos,elapsed,meta,inv)
local srcSlot=inv:get_stack("src",1) local srcSlot=inv:get_stack("src",1)
local modifierSlot=inv:get_stack("modifier",1) local modifierSlot=inv:get_stack("modifier",1)
local dstSlot=inv:get_stack("dst",1) local dstSlot=inv:get_stack("dst",1)
local powerAmount=meta:get_int("industrialtest.powerAmount")
local rpm=meta:get_int("rpm") local rpm=meta:get_int("rpm")
local maintainSpeed=meta:get_int("maintainSpeed")
shouldRerunTimer,shouldUpdateFormspec=industrialtest.internal.chargeFromPowerStorageItem(meta,inv) shouldRerunTimer,shouldUpdateFormspec=industrialtest.internal.chargeFromPowerStorageItem(meta,inv)
local powerAmount=meta:get_int("industrialtest.powerAmount")
if rpm>0 then if maintainSpeed==1 and powerAmount>=rotaryMacerator.maintainSpeedOpPower then
local newRpm=math.max(rpm+10*elapsed,0)
if newRpm>rpm then
meta:set_int("rpm",newRpm)
shouldUpdateFormspec=true
end
industrialtest.api.addPower(meta,-rotaryMacerator.maintainSpeedOpPower)
shouldRerunTimer=true
elseif rpm>0 then
meta:set_int("rpm",math.max(rpm-1000*elapsed,0)) meta:set_int("rpm",math.max(rpm-1000*elapsed,0))
shouldRerunTimer=shouldRerunTimer or rpm>0 shouldRerunTimer=shouldRerunTimer or rpm>0
shouldUpdateFormspec=true shouldUpdateFormspec=true

View File

@ -20,32 +20,46 @@ if industrialtest.mtgAvailable then
ore_type="scatter", ore_type="scatter",
ore="industrialtest:stone_with_uranium", ore="industrialtest:stone_with_uranium",
wherein="default:stone", wherein="default:stone",
clust_scarcity=7*7*7, clust_scarcity=15*15*15,
clust_num_ores=3, clust_num_ores=3,
clust_size=3, clust_size=3,
y_max=-128, y_max=-128,
y_min=-31000 y_min=-31000
}) })
industrialtest.internal.registerMetal("lead","Lead",2) industrialtest.internal.registerMetal("lead","Lead",2)
minetest.register_ore({ minetest.register_ore({
ore_type="scatter", ore_type="scatter",
ore="industrialtest:stone_with_lead", ore="industrialtest:stone_with_lead",
wherein="default:stone", wherein="default:stone",
clust_scarcity=7*7*7, clust_scarcity=11*11*11,
clust_num_ores=3, clust_num_ores=3,
clust_size=3, clust_size=3,
y_max=-48, y_max=-48,
y_min=-31000 y_min=-31000
}) })
industrialtest.internal.registerMetal("iridium","Iridium",4)
minetest.register_ore({
ore_type="scatter",
ore="industrialtest:stone_with_iridium",
wherein="default:stone",
clust_scarcity=40*40*40,
clust_num_ores=3,
clust_size=3,
y_max=-512,
y_min=-31000
})
elseif industrialtest.mclAvailable then elseif industrialtest.mclAvailable then
industrialtest.internal.registerMetal("uranium","Uranium",4,4,4,4,5,5)
local stonelike={"mcl_core:stone","mcl_core:diorite","mcl_core:andesite","mcl_core:granite"} local stonelike={"mcl_core:stone","mcl_core:diorite","mcl_core:andesite","mcl_core:granite"}
local deepslatelike={"mcl_deepslate:deepslate","mcl_deepslate:tuff"} local deepslatelike={"mcl_deepslate:deepslate","mcl_deepslate:tuff"}
industrialtest.internal.registerMetal("uranium","Uranium",4,4,4,4,5,5)
minetest.register_ore({ minetest.register_ore({
ore_type="scatter", ore_type="scatter",
ore="industrialtest:stone_with_uranium", ore="industrialtest:stone_with_uranium",
wherein=stonelike, wherein=stonelike,
clust_scarcity=7*7*7, clust_scarcity=15*15*15,
clust_num_ores=3, clust_num_ores=3,
clust_size=3, clust_size=3,
y_max=mcl_worlds.layer_to_y(20), y_max=mcl_worlds.layer_to_y(20),
@ -55,18 +69,19 @@ elseif industrialtest.mclAvailable then
ore_type="scatter", ore_type="scatter",
ore="industrialtest:deepslate_with_uranium", ore="industrialtest:deepslate_with_uranium",
wherein=deepslatelike, wherein=deepslatelike,
clust_scarcity=7*7*7, clust_scarcity=15*15*15,
clust_num_ores=3, clust_num_ores=3,
clust_size=3, clust_size=3,
y_max=mcl_worlds.layer_to_y(15), y_max=mcl_worlds.layer_to_y(15),
y_min=mcl_vars.mg_overworld_min y_min=mcl_vars.mg_overworld_min
}) })
industrialtest.internal.registerMetal("lead","Lead",4,4,4,4,6,5) industrialtest.internal.registerMetal("lead","Lead",4,4,4,4,6,5)
minetest.register_ore({ minetest.register_ore({
ore_type="scatter", ore_type="scatter",
ore="industrialtest:stone_with_lead", ore="industrialtest:stone_with_lead",
wherein=stonelike, wherein=stonelike,
clust_scarcity=7*7*7, clust_scarcity=11*11*11,
clust_num_ores=3, clust_num_ores=3,
clust_size=3, clust_size=3,
y_max=mcl_worlds.layer_to_y(30), y_max=mcl_worlds.layer_to_y(30),
@ -76,7 +91,29 @@ elseif industrialtest.mclAvailable then
ore_type="scatter", ore_type="scatter",
ore="industrialtest:deepslate_with_lead", ore="industrialtest:deepslate_with_lead",
wherein=deepslatelike, wherein=deepslatelike,
clust_scarcity=7*7*7, clust_scarcity=11*11*11,
clust_num_ores=3,
clust_size=3,
y_max=mcl_worlds.layer_to_y(15),
y_min=mcl_vars.mg_overworld_min
})
industrialtest.internal.registerMetal("iridium","Iridium",4,5,4,4,5,5)
minetest.register_ore({
ore_type="scatter",
ore="industrialtest:stone_with_iridium",
wherein=stonelike,
clust_scarcity=40*40*40,
clust_num_ores=3,
clust_size=3,
y_max=mcl_worlds.layer_to_y(20),
y_min=mcl_vars.mg_overworld_min
})
minetest.register_ore({
ore_type="scatter",
ore="industrialtest:deepslate_with_iridium",
wherein=deepslatelike,
clust_scarcity=40*40*40,
clust_num_ores=3, clust_num_ores=3,
clust_size=3, clust_size=3,
y_max=mcl_worlds.layer_to_y(15), y_max=mcl_worlds.layer_to_y(15),

View File

@ -1,5 +1,5 @@
name=industrialtest name=industrialtest
description=Adds various machinery description=Adds various machinery
optional_depends=default,bucket,3d_armor,mcl_core,mcl_copper,mcl_armor,mcl_deepslate,mcl_nether,mcl_buckets,mcl_util,mcl_dye,mcl_rubber,pipeworks optional_depends=default,bucket,3d_armor,mcl_core,mcl_copper,mcl_armor,mcl_deepslate,mcl_nether,mcl_buckets,mcl_util,mcl_dye,mcl_rubber,pipeworks,mesecons
author=IndustrialTest Team author=IndustrialTest Team
title=IndustrialTest title=IndustrialTest

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B

View File

@ -54,7 +54,7 @@ local function registerNanoSuitPart(config)
on_place=mcl_armor.equip_on_use, on_place=mcl_armor.equip_on_use,
on_secondary_use=mcl_armor.equip_on_use, on_secondary_use=mcl_armor.equip_on_use,
_mcl_armor_element=config.element, _mcl_armor_element=config.element,
_mcl_armor_texture="industrialtest_"..config.name..".png", _mcl_armor_texture=(config.element=="feet" and "industrialtest_mcl_" or "industrialtest_")..config.name..".png",
_industrialtest_powerStorage=true, _industrialtest_powerStorage=true,
_industrialtest_powerCapacity=1000000, _industrialtest_powerCapacity=1000000,
_industrialtest_powerFlow=industrialtest.api.evPowerFlow, _industrialtest_powerFlow=industrialtest.api.evPowerFlow,