update the mod

This commit is contained in:
RealBadAngel
2012-12-13 01:49:02 +01:00
parent 306b407a38
commit b8d77627a4
348 changed files with 3263 additions and 254 deletions

1
technic/modpack.txt Normal file
View File

@ -0,0 +1 @@

1
technic/pipeworks/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*~

34
technic/pipeworks/README Normal file
View File

@ -0,0 +1,34 @@
This simple mod uses nodeboxes to supply a complete set of 3D flanged pipes,
along with "valve" and "pump" devices.
Unlike the previous version of this mod, these pipes are rounded, and when
placed, they'll automatically join together as needed. Pipes can go vertically
or horizontally, and there are enough nodes defined to allow for all possible
connections. Valves and pumps can only be placed horizontally, and will
automatically rotate and join with neighboring pipes as objects are added, as
well as joining with each other under certain circumstances.
Pipes come in two variants: one type bears one or more dark windows on each
pipe, suggesting they're empty, while the other type bears green-tinted
windows, as if full (the two colors should also be easy to select if you want
to change them in a paint program). These windows only appear on straight
lengths and on certain junctions.
There are no crafting recipes, yet, but you can use /giveme as usual, namely
"/giveme pipeworks:pipe 999" or so, and then place them as needed. See
init.lua for more details.
This mod is intended to be used as a basis or at least as sort of a model for
something else to build on (perhaps a nicer-looking oil mod?), and does not
provide any of the code necessary to cause anything to flow through them. Like
the pipes, the valve and pump don't do anything useful yet, but you can punch
them to turn them "on" and "off". Note that the valve and pump textures and
shapes are not yet complete (hence their boxy appearance).
This mod is a work in progress.
Please note that owing to the nature of this mod, I have opted to use 64px
textures. Anything less just looks terrible.
If you don't need the old node names from the previous version of this mod,
edit init.lua and comment-out the 'dofile' line at the top.

View File

@ -0,0 +1,176 @@
-- autorouting for pipes
function pipe_scanforobjects(pos)
pipe_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_loaded")
pipe_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_loaded")
pipe_autoroute({ x=pos.x , y=pos.y-1, z=pos.z }, "_loaded")
pipe_autoroute({ x=pos.x , y=pos.y+1, z=pos.z }, "_loaded")
pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_loaded")
pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_loaded")
pipe_autoroute(pos, "_loaded")
pipe_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_empty")
pipe_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_empty")
pipe_autoroute({ x=pos.x , y=pos.y-1, z=pos.z }, "_empty")
pipe_autoroute({ x=pos.x , y=pos.y+1, z=pos.z }, "_empty")
pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_empty")
pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_empty")
pipe_autoroute(pos, "_empty")
end
function pipe_autoroute(pos, state)
nctr = minetest.env:get_node(pos)
if (string.find(nctr.name, "pipeworks:pipe_") == nil) then return end
pipes_scansurroundings(pos)
nsurround = pxm..pxp..pym..pyp..pzm..pzp
if nsurround == "000000" then nsurround = "110000" end
minetest.env:add_node(pos, { name = "pipeworks:pipe_"..nsurround..state })
end
-- autorouting for pneumatic tubes
function tube_scanforobjects(pos)
tube_autoroute({ x=pos.x-1, y=pos.y , z=pos.z })
tube_autoroute({ x=pos.x+1, y=pos.y , z=pos.z })
tube_autoroute({ x=pos.x , y=pos.y-1, z=pos.z })
tube_autoroute({ x=pos.x , y=pos.y+1, z=pos.z })
tube_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 })
tube_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 })
tube_autoroute(pos)
end
function tube_autoroute(pos)
nctr = minetest.env:get_node(pos)
print ("minetest.get_item_group("..nctr.name..',"tubedevice") == '..minetest.get_item_group(nctr.name, "tubedevice"))
if (string.find(nctr.name, "pipeworks:tube_") == nil)
and minetest.get_item_group(nctr.name, "tubedevice") ~= 1 then return end
pxm=0
pxp=0
pym=0
pyp=0
pzm=0
pzp=0
nxm = minetest.env:get_node({ x=pos.x-1, y=pos.y , z=pos.z })
nxp = minetest.env:get_node({ x=pos.x+1, y=pos.y , z=pos.z })
nym = minetest.env:get_node({ x=pos.x , y=pos.y-1, z=pos.z })
nyp = minetest.env:get_node({ x=pos.x , y=pos.y+1, z=pos.z })
nzm = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z-1 })
nzp = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z+1 })
if (string.find(nxm.name, "pipeworks:tube_") ~= nil)
or minetest.get_item_group(nxm.name, "tubedevice") == 1 then pxm=1 end
if (string.find(nxp.name, "pipeworks:tube_") ~= nil)
or minetest.get_item_group(nxp.name, "tubedevice") == 1 then pxp=1 end
if (string.find(nym.name, "pipeworks:tube_") ~= nil)
or minetest.get_item_group(nym.name, "tubedevice") == 1 then pym=1 end
if (string.find(nyp.name, "pipeworks:tube_") ~= nil)
or minetest.get_item_group(nyp.name, "tubedevice") == 1 then pyp=1 end
if (string.find(nzm.name, "pipeworks:tube_") ~= nil)
or minetest.get_item_group(nzm.name, "tubedevice") == 1 then pzm=1 end
if (string.find(nzp.name, "pipeworks:tube_") ~= nil)
or minetest.get_item_group(nzp.name, "tubedevice") == 1 then pzp=1 end
nsurround = pxm..pxp..pym..pyp..pzm..pzp
if minetest.get_item_group(nctr.name, "tubedevice") ~= 1 then
minetest.env:add_node(pos, { name = "pipeworks:tube_"..nsurround })
end
end
-- auto-rotation code for various devices the tubes attach to
function pipe_device_autorotate(pos, state, bname)
if state == nil then
nname = bname
else
nname = bname.."_"..state
end
local nctr = minetest.env:get_node(pos)
pipes_scansurroundings(pos)
if (pxm+pxp) ~= 0 then
minetest.env:add_node(pos, { name = nname.."_x" })
return
end
if (pzm+pzp) ~= 0 then
minetest.env:add_node(pos, { name = nname.."_z" })
end
end
function pipes_scansurroundings(pos)
pxm=0
pxp=0
pym=0
pyp=0
pzm=0
pzp=0
nxm = minetest.env:get_node({ x=pos.x-1, y=pos.y , z=pos.z })
nxp = minetest.env:get_node({ x=pos.x+1, y=pos.y , z=pos.z })
nym = minetest.env:get_node({ x=pos.x , y=pos.y-1, z=pos.z })
nyp = minetest.env:get_node({ x=pos.x , y=pos.y+1, z=pos.z })
nzm = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z-1 })
nzp = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z+1 })
if (string.find(nxm.name, "pipeworks:pipe_") ~= nil) then pxm=1 end
if (string.find(nxp.name, "pipeworks:pipe_") ~= nil) then pxp=1 end
if (string.find(nym.name, "pipeworks:pipe_") ~= nil) then pym=1 end
if (string.find(nyp.name, "pipeworks:pipe_") ~= nil) then pyp=1 end
if (string.find(nzm.name, "pipeworks:pipe_") ~= nil) then pzm=1 end
if (string.find(nzp.name, "pipeworks:pipe_") ~= nil) then pzp=1 end
for p in ipairs(pipes_devicelist) do
pdev = pipes_devicelist[p]
if (string.find(nxm.name, "pipeworks:"..pdev.."_off_x") ~= nil) or
(string.find(nxm.name, "pipeworks:"..pdev.."_on_x") ~= nil) or
(string.find(nxm.name, "pipeworks:"..pdev.."_x") ~= nil) then
pxm=1
end
if (string.find(nxp.name, "pipeworks:"..pdev.."_off_x") ~= nil) or
(string.find(nxp.name, "pipeworks:"..pdev.."_on_x") ~= nil) or
(string.find(nxp.name, "pipeworks:"..pdev.."_x") ~= nil) then
pxp=1
end
if (string.find(nzm.name, "pipeworks:"..pdev.."_off_z") ~= nil) or
(string.find(nzm.name, "pipeworks:"..pdev.."_on_z") ~= nil) or
(string.find(nzm.name, "pipeworks:"..pdev.."_z") ~= nil) then
pzm=1
end
if (string.find(nzp.name, "pipeworks:"..pdev.."_off_z") ~= nil) or
(string.find(nzp.name, "pipeworks:"..pdev.."_on_z") ~= nil) or
(string.find(nzp.name, "pipeworks:"..pdev.."_z") ~= nil) then
pzp=1
end
end
-- storage tanks and intake grates have vertical connections
-- also, so they require a special case
if (string.find(nym.name, "pipeworks:storage_tank_") ~= nil) or
(string.find(nym.name, "pipeworks:intake") ~= nil) or
(string.find(nym.name, "pipeworks:outlet") ~= nil) then
pym=1
end
end
function pipe_look_for_stackable_tanks(pos)
tym = minetest.env:get_node({ x=pos.x , y=pos.y-1, z=pos.z })
if string.find(tym.name, "pipeworks:storage_tank_") ~= nil or
string.find(tym.name, "pipeworks:expansion_tank_") ~= nil then
minetest.env:add_node(pos, { name = "pipeworks:expansion_tank_0"})
end
end

View File

@ -0,0 +1,46 @@
Changelog
---------
2012-08-24: Added square-ish pneumatic tubes, with their own autoplace code
(they do not connect to the steel pipes or their related devices).
2012-08-22: Added outlet grate, made it participate in autoplace algorithm.
Extended storage tank to show fill level in 10% steps (0% to 100%). Added
"expansion tank" that appears if the user stacks tanks upwards. (Downwards is
not checked).
2012-08-21: Made storage tank participate in autoplace algorithm. Tuned API a
little to allow for more flexible placement. Re-organized code a bit to allow
for some upcoming rules changes. Made storage tanks' upper/lower fittins and
intake grate participate in autoplace algorithm.
2012-08-20: Added temporary nodes for storage tank and intake grating, but
without autoplace.
2012-08-19: Pumps and valves now fully participate in the
auto-rotate/auto-place algorithm.
2012-08-18: Total rewrite again. All pipes are now nice and round-looking, and
they auto-connect! Also added temporary nodes for pump and valve (each with an
on/off setting - punch to change). No crafting recipes yet and the pipes still
don't do anything useful yet. Soon.
2012-08-06: Moved this changelog off the forum post and into a separate file.
2012-08-05 (multiple updates): Rewrote pipeworks to use loops and tables to
create the nodes. Requires far less code now. Added -X, +X, -Y, +Y, -Z, +Z
capped stubs and a short centered horizontal segment. Changed node definitions
so that the aforementioned "short centered" segment is given on dig/drop.
Renamed it to just "pipeworks:pipe" (and pipe_loaded). Added empty/loaded
indicator images to the capped ends, removed some redundant comments. Made the
empty/loaded indication at the capped end more prominent.
2012-07-21: Added screenshot showing pipes as they look now that nodebox
texture rotation is fixed.
2012-07-18: Changed the mod name and all internals to 'pipeworks' instead of
'pipes'... after a couple of mistakes :-)
2012-07-12: moved project to github.
2012-06-23: Initial release, followed by reworking the textures a bit.

View File

@ -0,0 +1,94 @@
-- Crafting recipes for pipeworks
-- If the technic mod is present, then don't bother registering these recipes
-- as that mod supplies its own.
if io.open(minetest.get_modpath("pipeworks").."/../technic/init.lua", "r") == nil then
-- If homedecor is not installed, we need to register a few of its crafts
-- manually so we can use them.
if minetest.get_modpath("homedecor") == nil then
minetest.register_craftitem(":homedecor:plastic_sheeting", {
description = "Plastic sheet",
inventory_image = "pipeworks_plastic_sheeting.png",
})
minetest.register_craft({
type = "cooking",
output = "homedecor:plastic_sheeting",
recipe = "default:junglegrass",
})
minetest.register_craft({
type = 'fuel',
recipe = 'homedecor:plastic_sheeting',
burntime = 30,
})
end
minetest.register_craft( {
output = "pipeworks:pipe_110000_empty 12",
recipe = {
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" },
{ "", "", "" },
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
},
})
minetest.register_craft( {
output = "pipeworks:pump 2",
recipe = {
{ "default:stone", "default:stone", "default:stone" },
{ "default:steel_ingot", "default:stick", "default:steel_ingot" },
{ "default:stone", "default:stone", "default:stone" }
},
})
minetest.register_craft( {
output = "pipeworks:valve 2",
recipe = {
{ "", "default:stick", "" },
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" },
{ "", "default:steel_ingot", "" }
},
})
minetest.register_craft( {
output = "pipeworks:storage_tank 2",
recipe = {
{ "", "default:steel_ingot", "default:steel_ingot" },
{ "default:steel_ingot", "default:glass", "default:steel_ingot" },
{ "default:steel_ingot", "default:steel_ingot", "" }
},
})
minetest.register_craft( {
output = "pipeworks:intake 2",
recipe = {
{ "", "default:steel_ingot", "" },
{ "default:steel_ingot", "", "default:steel_ingot" },
{ "", "default:steel_ingot", "" }
},
})
minetest.register_craft( {
output = "pipeworks:outlet 2",
recipe = {
{ "default:steel_ingot", "", "default:steel_ingot" },
{ "", "default:steel_ingot", "" },
{ "default:steel_ingot", "", "default:steel_ingot" }
},
})
minetest.register_craft( {
output = "pipeworks:tube 12",
recipe = {
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
{ "", "", "" },
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
},
})
end

View File

@ -0,0 +1,2 @@
default

View File

@ -0,0 +1,471 @@
-- List of devices that should participate in the autoplace algorithm
pipes_devicelist = {
"pump",
"valve",
"storage_tank_0",
"storage_tank_1",
"storage_tank_2",
"storage_tank_3",
"storage_tank_4",
"storage_tank_5",
"storage_tank_6",
"storage_tank_7",
"storage_tank_8",
"storage_tank_9",
"storage_tank_10"
}
-- tables
minetest.register_alias("pipeworks:pump", "pipeworks:pump_off_x")
minetest.register_alias("pipeworks:valve", "pipeworks:valve_off_x")
minetest.register_alias("pipeworks:storage_tank", "pipeworks:storage_tank_0_x")
pipe_pumpbody_x = {
{ -6/16, -8/16, -6/16, 6/16, 8/16, 6/16 }
}
pipe_pumpbody_z = {
{ -6/16, -8/16, -6/16, 6/16, 8/16, 6/16 }
}
pipe_valvebody_x = {
{ -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 }
}
pipe_valvebody_z = {
{ -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 }
}
pipe_valvehandle_on_x = {
{ -5/16, 4/16, -1/16, 0, 5/16, 1/16 }
}
pipe_valvehandle_on_z = {
{ -1/16, 4/16, -5/16, 1/16, 5/16, 0 }
}
pipe_valvehandle_off_x = {
{ -1/16, 4/16, -5/16, 1/16, 5/16, 0 }
}
pipe_valvehandle_off_z = {
{ -5/16, 4/16, -1/16, 0, 5/16, 1/16 }
}
-- Now define the nodes.
local states = { "on", "off" }
local dgroups = ""
for s in ipairs(states) do
if states[s] == "off" then
dgroups = {snappy=3, pipe=1}
else
dgroups = {snappy=3, pipe=1, not_in_creative_inventory=1}
end
local pumpboxes = {}
pipe_addbox(pumpboxes, pipe_leftstub)
pipe_addbox(pumpboxes, pipe_pumpbody_x)
pipe_addbox(pumpboxes, pipe_rightstub)
local tilex = "pipeworks_pump_ends.png"
local tilez = "pipeworks_pump_"..states[s]..".png"
minetest.register_node("pipeworks:pump_"..states[s].."_x", {
description = "Pump Module ("..states[s]..")",
drawtype = "nodebox",
tiles = {
"pipeworks_pump_top_x.png",
"pipeworks_pump_sides.png",
tilex,
tilex,
"pipeworks_pump_sides.png",
tilez
},
paramtype = "light",
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
node_box = {
type = "fixed",
fixed = pumpboxes
},
groups = dgroups,
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
after_place_node = function(pos)
pipe_device_autorotate(pos, states[s], "pipeworks:pump")
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end,
drop = "pipeworks:pump_off_x"
})
local pumpboxes = {}
pipe_addbox(pumpboxes, pipe_frontstub)
pipe_addbox(pumpboxes, pipe_pumpbody_z)
pipe_addbox(pumpboxes, pipe_backstub)
minetest.register_node("pipeworks:pump_"..states[s].."_z", {
description = "Pump Module ("..states[s]..", Z-axis)",
drawtype = "nodebox",
tiles = {
"pipeworks_pump_top_z.png",
"pipeworks_pump_sides.png",
tilez,
tilez,
"pipeworks_pump_sides.png",
tilex
},
paramtype = "light",
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
node_box = {
type = "fixed",
fixed = pumpboxes
},
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
after_place_node = function(pos)
pipe_device_autorotate(pos, states[s], "pipeworks:pump")
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end,
drop = "pipeworks:pump_off_x"
})
local valveboxes = {}
pipe_addbox(valveboxes, pipe_leftstub)
pipe_addbox(valveboxes, pipe_valvebody_x)
if states[s] == "off" then
pipe_addbox(valveboxes, pipe_valvehandle_off_x)
else
pipe_addbox(valveboxes, pipe_valvehandle_on_x)
end
pipe_addbox(valveboxes, pipe_rightstub)
local tilex = "pipeworks_valvebody_ends.png"
local tilez = "pipeworks_valvebody_sides.png"
minetest.register_node("pipeworks:valve_"..states[s].."_x", {
description = "Valve ("..states[s]..")",
drawtype = "nodebox",
tiles = {
"pipeworks_valvebody_top_"..states[s].."_x.png",
"pipeworks_valvebody_bottom.png",
tilex,
tilex,
tilez,
tilez,
},
paramtype = "light",
selection_box = {
type = "fixed",
fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 }
},
node_box = {
type = "fixed",
fixed = valveboxes
},
groups = dgroups,
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
after_place_node = function(pos)
pipe_device_autorotate(pos, states[s], "pipeworks:valve")
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end,
drop = "pipeworks:valve_off_x",
pipelike=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",1)
end,
})
local valveboxes = {}
pipe_addbox(valveboxes, pipe_frontstub)
pipe_addbox(valveboxes, pipe_valvebody_z)
if states[s] == "off" then
pipe_addbox(valveboxes, pipe_valvehandle_off_z)
else
pipe_addbox(valveboxes, pipe_valvehandle_on_z)
end
pipe_addbox(valveboxes, pipe_backstub)
minetest.register_node("pipeworks:valve_"..states[s].."_z", {
description = "Valve ("..states[s]..", Z-axis)",
drawtype = "nodebox",
tiles = {
"pipeworks_valvebody_top_"..states[s].."_z.png",
"pipeworks_valvebody_bottom.png",
tilez,
tilez,
tilex,
tilex,
},
paramtype = "light",
selection_box = {
type = "fixed",
fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 }
},
node_box = {
type = "fixed",
fixed = valveboxes
},
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
after_place_node = function(pos)
pipe_device_autorotate(pos, states[s], "pipeworks:valve")
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end,
drop = "pipeworks:valve_off_x",
pipelike=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",1)
end,
})
end
-- intake grate
minetest.register_node("pipeworks:intake", {
description = "Intake grate",
drawtype = "nodebox",
tiles = {
"pipeworks_intake_top.png",
"pipeworks_intake_sides.png",
"pipeworks_intake_sides.png",
"pipeworks_intake_sides.png",
"pipeworks_intake_sides.png",
"pipeworks_intake_sides.png"
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
node_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
paramtype = "light",
groups = {snappy=3, pipe=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
after_place_node = function(pos)
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end,
pipelike=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",1)
end,
})
-- outlet grate
minetest.register_node("pipeworks:outlet", {
description = "Outlet grate",
drawtype = "nodebox",
tiles = {
"pipeworks_outlet_top.png",
"pipeworks_outlet_sides.png",
"pipeworks_outlet_sides.png",
"pipeworks_outlet_sides.png",
"pipeworks_outlet_sides.png",
"pipeworks_outlet_sides.png"
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
node_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
paramtype = "light",
groups = {snappy=3, pipe=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
after_place_node = function(pos)
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end,
pipelike=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",1)
end,
})
-- tanks
for fill = 0, 10 do
if fill == 0 then
filldesc="empty"
sgroups = {snappy=3, pipe=1, tankfill=fill+1}
else
filldesc=fill.."0% full"
sgroups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1}
end
minetest.register_node("pipeworks:expansion_tank_"..fill, {
description = "Expansion Tank ("..filldesc..")... You hacker, you.",
tiles = {
"pipeworks_storage_tank_fittings.png",
"pipeworks_storage_tank_fittings.png",
"pipeworks_storage_tank_back.png",
"pipeworks_storage_tank_back.png",
"pipeworks_storage_tank_back.png",
"pipeworks_storage_tank_front_"..fill..".png"
},
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
drop = "pipeworks:storage_tank_"..fill.."_x",
after_place_node = function(pos)
pipe_look_for_stackable_tanks(pos)
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end,
pipelike=0,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",0)
end,
})
minetest.register_node("pipeworks:storage_tank_"..fill.."_x", {
description = "Fluid Storage Tank ("..filldesc..")",
tiles = {
"pipeworks_storage_tank_fittings.png",
"pipeworks_storage_tank_back.png",
"pipeworks_storage_tank_fittings.png",
"pipeworks_storage_tank_fittings.png",
"pipeworks_storage_tank_back.png",
"pipeworks_storage_tank_front_"..fill..".png"
},
paramtype = "light",
groups = sgroups,
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
after_place_node = function(pos)
pipe_look_for_stackable_tanks(pos)
if string.find(minetest.env:get_node(pos).name, "pipeworks:storage_tank_") ~= nil then
pipe_device_autorotate(pos, nil, "pipeworks:storage_tank_"..fill)
end
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end,
pipelike=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",1)
end,
})
minetest.register_node("pipeworks:storage_tank_"..fill.."_z", {
description = "Fluid Storage Tank (Z axis, "..filldesc..")... You hacker, you.",
tiles = {
"pipeworks_storage_tank_fittings.png",
"pipeworks_storage_tank_back.png",
"pipeworks_storage_tank_front_"..fill..".png",
"pipeworks_storage_tank_back.png",
"pipeworks_storage_tank_fittings.png",
"pipeworks_storage_tank_fittings.png"
},
paramtype = "light",
groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
drop = "pipeworks:storage_tank_"..fill.."_x",
after_place_node = function(pos)
pipe_look_for_stackable_tanks(pos)
if string.find(minetest.env:get_node(pos).name, "pipeworks:storage_tank_") ~= nil then
pipe_device_autorotate(pos, nil, "pipeworks:storage_tank_"..fill)
end
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end,
pipelike=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",1)
end,
})
end
-- various actions
local axes = { "x", "z" }
for a in ipairs(axes) do
minetest.register_on_punchnode(function (pos, node)
if node.name=="pipeworks:valve_on_"..axes[a] then
minetest.env:add_node(pos, { name = "pipeworks:valve_off_"..axes[a] })
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",0)
end
end)
minetest.register_on_punchnode(function (pos, node)
if node.name=="pipeworks:valve_off_"..axes[a] then
minetest.env:add_node(pos, { name = "pipeworks:valve_on_"..axes[a] })
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",1)
end
end)
minetest.register_on_punchnode(function (pos, node)
if node.name=="pipeworks:pump_on_"..axes[a] then
minetest.env:add_node(pos, { name = "pipeworks:pump_off_"..axes[a] })
end
end)
minetest.register_on_punchnode(function (pos, node)
if node.name=="pipeworks:pump_off_"..axes[a] then
minetest.env:add_node(pos, { name = "pipeworks:pump_on_"..axes[a] })
end
end)
end

322
technic/pipeworks/init.lua Normal file
View File

@ -0,0 +1,322 @@
-- Pipeworks mod by Vanessa Ezekowitz - 2012-08-05
--
-- Entirely my own code. This mod supplies various shapes of pipes
-- and devices that they can connect to such as pumps, valves, etc.
-- All pipes autoconnect as you lay them out, and devices will auto-
-- connect to them.
--
-- License: WTFPL
--
-- Un-comment the following dofile line to re-enable the old pipe nodes.
-- dofile(minetest.get_modpath("pipeworks").."/oldpipes.lua")
minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_110000_empty")
pipe_leftstub = {
{ -32/64, -2/64, -6/64, 1/64, 2/64, 6/64 }, -- pipe segment against -X face
{ -32/64, -4/64, -5/64, 1/64, 4/64, 5/64 },
{ -32/64, -5/64, -4/64, 1/64, 5/64, 4/64 },
{ -32/64, -6/64, -2/64, 1/64, 6/64, 2/64 },
{ -32/64, -3/64, -8/64, -30/64, 3/64, 8/64 }, -- (the flange for it)
{ -32/64, -5/64, -7/64, -30/64, 5/64, 7/64 },
{ -32/64, -6/64, -6/64, -30/64, 6/64, 6/64 },
{ -32/64, -7/64, -5/64, -30/64, 7/64, 5/64 },
{ -32/64, -8/64, -3/64, -30/64, 8/64, 3/64 }
}
pipe_rightstub = {
{ -1/64, -2/64, -6/64, 32/64, 2/64, 6/64 }, -- pipe segment against +X face
{ -1/64, -4/64, -5/64, 32/64, 4/64, 5/64 },
{ -1/64, -5/64, -4/64, 32/64, 5/64, 4/64 },
{ -1/64, -6/64, -2/64, 32/64, 6/64, 2/64 },
{ 30/64, -3/64, -8/64, 32/64, 3/64, 8/64 }, -- (the flange for it)
{ 30/64, -5/64, -7/64, 32/64, 5/64, 7/64 },
{ 30/64, -6/64, -6/64, 32/64, 6/64, 6/64 },
{ 30/64, -7/64, -5/64, 32/64, 7/64, 5/64 },
{ 30/64, -8/64, -3/64, 32/64, 8/64, 3/64 }
}
pipe_bottomstub = {
{ -2/64, -32/64, -6/64, 2/64, 1/64, 6/64 }, -- pipe segment against -Y face
{ -4/64, -32/64, -5/64, 4/64, 1/64, 5/64 },
{ -5/64, -32/64, -4/64, 5/64, 1/64, 4/64 },
{ -6/64, -32/64, -2/64, 6/64, 1/64, 2/64 },
{ -3/64, -32/64, -8/64, 3/64, -30/64, 8/64 }, -- (the flange for it)
{ -5/64, -32/64, -7/64, 5/64, -30/64, 7/64 },
{ -6/64, -32/64, -6/64, 6/64, -30/64, 6/64 },
{ -7/64, -32/64, -5/64, 7/64, -30/64, 5/64 },
{ -8/64, -32/64, -3/64, 8/64, -30/64, 3/64 }
}
pipe_topstub = {
{ -2/64, -1/64, -6/64, 2/64, 32/64, 6/64 }, -- pipe segment against +Y face
{ -4/64, -1/64, -5/64, 4/64, 32/64, 5/64 },
{ -5/64, -1/64, -4/64, 5/64, 32/64, 4/64 },
{ -6/64, -1/64, -2/64, 6/64, 32/64, 2/64 },
{ -3/64, 30/64, -8/64, 3/64, 32/64, 8/64 }, -- (the flange for it)
{ -5/64, 30/64, -7/64, 5/64, 32/64, 7/64 },
{ -6/64, 30/64, -6/64, 6/64, 32/64, 6/64 },
{ -7/64, 30/64, -5/64, 7/64, 32/64, 5/64 },
{ -8/64, 30/64, -3/64, 8/64, 32/64, 3/64 }
}
pipe_frontstub = {
{ -6/64, -2/64, -32/64, 6/64, 2/64, 1/64 }, -- pipe segment against -Z face
{ -5/64, -4/64, -32/64, 5/64, 4/64, 1/64 },
{ -4/64, -5/64, -32/64, 4/64, 5/64, 1/64 },
{ -2/64, -6/64, -32/64, 2/64, 6/64, 1/64 },
{ -8/64, -3/64, -32/64, 8/64, 3/64, -30/64 }, -- (the flange for it)
{ -7/64, -5/64, -32/64, 7/64, 5/64, -30/64 },
{ -6/64, -6/64, -32/64, 6/64, 6/64, -30/64 },
{ -5/64, -7/64, -32/64, 5/64, 7/64, -30/64 },
{ -3/64, -8/64, -32/64, 3/64, 8/64, -30/64 }
}
pipe_backstub = {
{ -6/64, -2/64, -1/64, 6/64, 2/64, 32/64 }, -- pipe segment against -Z face
{ -5/64, -4/64, -1/64, 5/64, 4/64, 32/64 },
{ -4/64, -5/64, -1/64, 4/64, 5/64, 32/64 },
{ -2/64, -6/64, -1/64, 2/64, 6/64, 32/64 },
{ -8/64, -3/64, 30/64, 8/64, 3/64, 32/64 }, -- (the flange for it)
{ -7/64, -5/64, 30/64, 7/64, 5/64, 32/64 },
{ -6/64, -6/64, 30/64, 6/64, 6/64, 32/64 },
{ -5/64, -7/64, 30/64, 5/64, 7/64, 32/64 },
{ -3/64, -8/64, 30/64, 3/64, 8/64, 32/64 }
}
pipe_selectboxes = {
{ -32/64, -8/64, -8/64, 8/64, 8/64, 8/64 },
{ -8/64 , -8/64, -8/64, 32/64, 8/64, 8/64 },
{ -8/64 , -32/64, -8/64, 8/64, 8/64, 8/64 },
{ -8/64 , -8/64, -8/64, 8/64, 32/64, 8/64 },
{ -8/64 , -8/64, -32/64, 8/64, 8/64, 8/64 },
{ -8/64 , -8/64, -8/64, 8/64, 8/64, 32/64 }
}
pipe_bendsphere = {
{ -4/64, -4/64, -4/64, 4/64, 4/64, 4/64 },
{ -5/64, -3/64, -3/64, 5/64, 3/64, 3/64 },
{ -3/64, -5/64, -3/64, 3/64, 5/64, 3/64 },
{ -3/64, -3/64, -5/64, 3/64, 3/64, 5/64 }
}
-- Functions
dbg = function(s)
if DEBUG == 1 then
print('[PIPEWORKS] ' .. s)
end
end
function pipes_fix_image_names(table, replacement)
outtable={}
for i in ipairs(table) do
outtable[i]=string.gsub(table[i], "_XXXXX", replacement)
end
return outtable
end
function pipe_addbox(t, b)
for i in ipairs(b)
do table.insert(t, b[i])
end
end
-- now define the nodes!
for xm = 0, 1 do
for xp = 0, 1 do
for ym = 0, 1 do
for yp = 0, 1 do
for zm = 0, 1 do
for zp = 0, 1 do
local outboxes = {}
local outsel = {}
local outimgs = {}
if yp==1 then
pipe_addbox(outboxes, pipe_topstub)
table.insert(outsel, pipe_selectboxes[4])
table.insert(outimgs, "pipeworks_pipe_end.png")
else
table.insert(outimgs, "pipeworks_plain.png")
end
if ym==1 then
pipe_addbox(outboxes, pipe_bottomstub)
table.insert(outsel, pipe_selectboxes[3])
table.insert(outimgs, "pipeworks_pipe_end.png")
else
table.insert(outimgs, "pipeworks_plain.png")
end
if xp==1 then
pipe_addbox(outboxes, pipe_rightstub)
table.insert(outsel, pipe_selectboxes[2])
table.insert(outimgs, "pipeworks_pipe_end.png")
else
table.insert(outimgs, "pipeworks_plain.png")
end
if xm==1 then
pipe_addbox(outboxes, pipe_leftstub)
table.insert(outsel, pipe_selectboxes[1])
table.insert(outimgs, "pipeworks_pipe_end.png")
else
table.insert(outimgs, "pipeworks_plain.png")
end
if zp==1 then
pipe_addbox(outboxes, pipe_backstub)
table.insert(outsel, pipe_selectboxes[6])
table.insert(outimgs, "pipeworks_pipe_end.png")
else
table.insert(outimgs, "pipeworks_plain.png")
end
if zm==1 then
pipe_addbox(outboxes, pipe_frontstub)
table.insert(outsel, pipe_selectboxes[5])
table.insert(outimgs, "pipeworks_pipe_end.png")
else
table.insert(outimgs, "pipeworks_plain.png")
end
local jx = xp+xm
local jy = yp+ym
local jz = zp+zm
if (jx+jy+jz) == 1 then
if xm == 1 then
table.remove(outimgs, 3)
table.insert(outimgs, 3, "pipeworks_pipe_end_XXXXX.png")
end
if xp == 1 then
table.remove(outimgs, 4)
table.insert(outimgs, 4, "pipeworks_pipe_end_XXXXX.png")
end
if ym == 1 then
table.remove(outimgs, 1)
table.insert(outimgs, 1, "pipeworks_pipe_end_XXXXX.png")
end
if xp == 1 then
table.remove(outimgs, 2)
table.insert(outimgs, 2, "pipeworks_pipe_end_XXXXX.png")
end
if zm == 1 then
table.remove(outimgs, 5)
table.insert(outimgs, 5, "pipeworks_pipe_end_XXXXX.png")
end
if zp == 1 then
table.remove(outimgs, 6)
table.insert(outimgs, 6, "pipeworks_pipe_end_XXXXX.png")
end
end
if (jx==1 and jy==1 and jz~=1) or (jx==1 and jy~=1 and jz==1) or (jx~= 1 and jy==1 and jz==1) then
pipe_addbox(outboxes, pipe_bendsphere)
end
if (jx==2 and jy~=2 and jz~=2) then
table.remove(outimgs, 5)
table.remove(outimgs, 5)
table.insert(outimgs, 5, "pipeworks_windowed_XXXXX.png")
table.insert(outimgs, 5, "pipeworks_windowed_XXXXX.png")
end
if (jx~=2 and jy~=2 and jz==2) or (jx~=2 and jy==2 and jz~=2) then
table.remove(outimgs, 3)
table.remove(outimgs, 3)
table.insert(outimgs, 3, "pipeworks_windowed_XXXXX.png")
table.insert(outimgs, 3, "pipeworks_windowed_XXXXX.png")
end
local pname = xm..xp..ym..yp..zm..zp
local pgroups = ""
if pname ~= "110000" then
pgroups = {snappy=3, pipe=1, not_in_creative_inventory=1}
pipedesc = "Pipe segment (empty, "..pname..")... You hacker, you."
else
pgroups = {snappy=3, pipe=1}
pipedesc = "Pipe segment"
end
minetest.register_node("pipeworks:pipe_"..pname.."_empty", {
description = pipedesc,
drawtype = "nodebox",
tiles = pipes_fix_image_names(outimgs, "_empty"),
paramtype = "light",
selection_box = {
type = "fixed",
fixed = outsel
},
node_box = {
type = "fixed",
fixed = outboxes
},
groups = pgroups,
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
drop = "pipeworks:pipe_110000_empty",
pipelike=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",1)
end,
after_place_node = function(pos)
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end,
})
minetest.register_node("pipeworks:pipe_"..pname.."_loaded", {
description = "Pipe segment (loaded, "..pname..")... You hacker, you.",
drawtype = "nodebox",
tiles = pipes_fix_image_names(outimgs, "_loaded"),
paramtype = "light",
selection_box = {
type = "fixed",
fixed = outsel
},
node_box = {
type = "fixed",
fixed = outboxes
},
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
drop = "pipeworks:pipe_110000_loaded",
pipelike=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("pipelike",1)
end,
after_place_node = function(pos)
pipe_scanforobjects(pos)
end,
after_dig_node = function(pos)
pipe_scanforobjects(pos)
end
})
end
end
end
end
end
end
dofile(minetest.get_modpath("pipeworks").."/tubes.lua")
dofile(minetest.get_modpath("pipeworks").."/devices.lua")
dofile(minetest.get_modpath("pipeworks").."/autoplace.lua")
dofile(minetest.get_modpath("pipeworks").."/crafts.lua")
print("Pipeworks loaded!")

View File

@ -0,0 +1,360 @@
-- This file is basically most of the old init.lua and only supplies the
-- old nodes created by the previous verison of Pipeworks.
--
-- License: WTFPL
--
local nodenames = {
"vertical",
"horizontal",
"junction_xy",
"junction_xz",
"bend_xy_down",
"bend_xy_up",
"bend_xz",
"crossing_xz",
"crossing_xy",
"crossing_xyz",
"pipe_segment",
"cap_neg_x",
"cap_pos_x",
"cap_neg_y",
"cap_pos_y",
"cap_neg_z",
"cap_pos_z"
}
local descriptions = {
"vertical",
"horizontal",
"junction between X and Y axes",
"junction between X and Z axes",
"downward bend between X and Y axes",
"upward bend between X and Y axes",
"bend between X/Z axes",
"4-way crossing between X and Z axes",
"4-way crossing between X/Z and Y axes",
"6-way crossing",
"basic segment",
"capped, negative X half only",
"capped, positive X half only",
"capped, negative Y half only",
"capped, positive Y half only",
"capped, negative Z half only",
"capped, positive Z half only"
}
local nodeimages = {
{"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_plain.png",
"pipeworks_plain.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png"},
{"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_plain.png",
"pipeworks_plain.png"},
{"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_plain.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png"},
{"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_plain.png"},
{"pipeworks_plain.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_plain.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png"},
{"pipeworks_pipe_end.png",
"pipeworks_plain.png",
"pipeworks_pipe_end.png",
"pipeworks_plain.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png"},
{"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_pipe_end.png",
"pipeworks_plain.png",
"pipeworks_pipe_end.png",
"pipeworks_plain.png"},
{"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png"},
{"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png"},
{"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png"},
-- horizontal short segment
{"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_pipe_end.png",
"pipeworks_pipe_end.png",
"pipeworks_plain.png",
"pipeworks_plain.png"},
-- capped
{"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_pipe_end.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png"},
{"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_pipe_end.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png"},
{"pipeworks_windowed_XXXXX.png",
"pipeworks_pipe_end.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png"},
{"pipeworks_pipe_end.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png"},
{"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_pipe_end.png"},
{"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_windowed_XXXXX.png",
"pipeworks_pipe_end.png",
"pipeworks_windowed_XXXXX.png"},
}
local selectionboxes = {
{ -0.15, -0.5, -0.15, 0.15, 0.5, 0.15 },
{ -0.5, -0.15, -0.15, 0.5, 0.15, 0.15 },
{ -0.15, -0.5, -0.15, 0.5, 0.5, 0.15 },
{ -0.5, -0.15, -0.15, 0.5, 0.15, 0.5 },
{ -0.15, -0.5, -0.15, 0.5, 0.15, 0.15 },
{ -0.15, -0.15, -0.15, 0.5, 0.5, 0.15 },
{ -0.15, -0.15, -0.15, 0.5, 0.15, 0.5 },
{ -0.5, -0.15, -0.5, 0.5, 0.15, 0.5 },
{ -0.5, -0.5, -0.15, 0.5, 0.5, 0.15 },
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
{ -0.3, -0.15, -0.15, 0.3, 0.15, 0.15 },
{ -0.5, -0.15, -0.15, 0, 0.15, 0.15 },
{ 0, -0.15, -0.15, 0.5, 0.15, 0.15 },
{ -0.15, -0.5, -0.15, 0.15, 0, 0.15 },
{ -0.15, 0, -0.15, 0.15, 0.5, 0.15 },
{ -0.15, -0.15, -0.5, 0.15, 0.15, 0 },
{ -0.15, -0.15, 0, 0.15, 0.15, 0.5 },
}
local nodeboxes = {
{{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- vertical
{ -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 },
{ -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 }},
{{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, -- horizontal
{ -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 },
{ 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }},
{{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- vertical with X/Z junction
{ -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 },
{ -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 },
{ 0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 },
{ 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }},
{{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, -- horizontal with X/Z junction
{ -0.1 , -0.1 , 0.1 , 0.1 , 0.1 , 0.45 },
{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 },
{ -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 },
{ 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }},
{{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- bend down from X/Z to Y axis
{ -0.1 , -0.45, -0.1 , 0.1 , 0.1 , 0.1 },
{ -0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 },
{ 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }},
{{ -0.15, 0.45 , -0.15, 0.15, 0.5, 0.15 }, -- bend up from X/Z to Y axis
{ -0.1 , -0.1 , -0.1 , 0.1 , 0.45, 0.1 },
{ -0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 },
{ 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }},
{{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, -- bend between X and Z axes
{ -0.1 , -0.1 , 0.1 , 0.1 , 0.1 , 0.45 },
{ -0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 },
{ 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }},
{{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, -- 4-way crossing between X and Z axes
{ -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 },
{ 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 },
{ -0.15, -0.15, -0.5 , 0.15, 0.15, -0.45 },
{ -0.1 , -0.1 , -0.45, 0.1 , 0.1 , 0.45 },
{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }},
{{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- 4-way crossing between X/Z and Y axes
{ -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 },
{ -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 },
{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 },
{ -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 },
{ 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }},
{{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, -- 6-way crossing (all 3 axes)
{ -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 },
{ 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 },
{ -0.15, -0.15, -0.5 , 0.15, 0.15, -0.45 },
{ -0.1 , -0.1 , -0.45, 0.1 , 0.1 , 0.45 },
{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 },
{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 },
{ -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 },
{ -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 }},
{{ -0.3 , -0.15, -0.15, -0.25, 0.15, 0.15 }, -- main center segment
{ -0.25, -0.1 , -0.1 , 0.25, 0.1 , 0.1 },
{ 0.25, -0.15, -0.15, 0.3 , 0.15, 0.15 }},
{{ -0.5, -0.15, -0.15, -0.45, 0.15, 0.15 }, -- anchored at -X
{ -0.45, -0.1, -0.1, -0.2, 0.1, 0.1 },
{ -0.2, -0.15, -0.15, -0.15, 0.15, 0.15 },
{ -0.15, -0.12, -0.12, -0.1, 0.12, 0.12 },
{ -0.1, -0.08, -0.08, -0.05, 0.08, 0.08 },
{ -0.05, -0.04, -0.04, 0, 0.04, 0.04 }},
{{ 0.45, -0.15, -0.15, 0.5, 0.15, 0.15 }, -- anchored at +X
{ 0.2, -0.1, -0.1, 0.45, 0.1, 0.1 },
{ 0.15, -0.15, -0.15, 0.2, 0.15, 0.15 },
{ 0.1, -0.12, -0.12, 0.15, 0.12, 0.12 },
{ 0.05, -0.08, -0.08, 0.1, 0.08, 0.08 },
{ 0, -0.04, -0.04, 0.05, 0.04, 0.04 }},
{{ -0.15, -0.5, -0.15, 0.15, -0.45, 0.15 }, -- anchored at -Y
{ -0.1, -0.45, -0.1, 0.1, -0.2, 0.1 },
{ -0.15, -0.2, -0.15, 0.15, -0.15, 0.15 },
{ -0.12, -0.15, -0.12, 0.12, -0.1, 0.12 },
{ -0.08, -0.1, -0.08, 0.08, -0.05, 0.08 },
{ -0.04, -0.05, -0.04, 0.04, 0, 0.04 }},
{{ -0.15, 0.45, -0.15, 0.15, 0.5, 0.15 }, -- anchored at +Y
{ -0.1, 0.2, -0.1, 0.1, 0.45, 0.1 },
{ -0.15, 0.15, -0.15, 0.15, 0.2, 0.15 },
{ -0.12, 0.1, -0.12, 0.12, 0.15, 0.12 },
{ -0.08, 0.05, -0.08, 0.08, 0.1, 0.08 } ,
{ -0.04, 0, -0.04, 0.04, 0.05, 0.04 }},
{{ -0.15, -0.15, -0.5, 0.15, 0.15, -0.45 }, -- anchored at -Z
{ -0.1, -0.1, -0.45, 0.1, 0.1, -0.2 },
{ -0.15, -0.15, -0.2, 0.15, 0.15, -0.15 },
{ -0.12, -0.12, -0.15, 0.12, 0.12, -0.1 },
{ -0.08, -0.08, -0.1, 0.08, 0.08, -0.05 },
{ -0.04, -0.04, -0.05, 0.04, 0.04, 0 }},
{{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, -- anchored at +Z
{ -0.1, -0.1, 0.2, 0.1, 0.1, 0.45 },
{ -0.15, -0.15, 0.15, 0.15, 0.15, 0.2 },
{ -0.12, -0.12, 0.1, 0.12, 0.12, 0.15 },
{ -0.08, -0.08, 0.05, 0.08, 0.08, 0.1 },
{ -0.04, -0.04, 0, 0.04, 0.04, 0.05 }},
}
function fix_image_names(node, replacement)
outtable={}
for i in ipairs(nodeimages[node]) do
outtable[i]=string.gsub(nodeimages[node][i], "_XXXXX", replacement)
end
return outtable
end
-- Now define the actual nodes
for node in ipairs(nodenames) do
if node ~= 2 then
pgroups = {snappy=3, pipe=1, not_in_creative_inventory=1}
else
pgroups = {snappy=3, pipe=1}
end
minetest.register_node("pipeworks:"..nodenames[node], {
description = "Empty Pipe ("..descriptions[node]..")",
drawtype = "nodebox",
tiles = fix_image_names(node, "_empty"),
paramtype = "light",
paramtype2 = "facedir",
selection_box = {
type = "fixed",
fixed = selectionboxes[node],
},
node_box = {
type = "fixed",
fixed = nodeboxes[node]
},
groups = pgroups,
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
drop = "pipeworks:pipe"
})
minetest.register_node("pipeworks:"..nodenames[node].."_loaded", {
description = "Loaded Pipe ("..descriptions[node]..")",
drawtype = "nodebox",
tiles = fix_image_names(node, "_loaded"),
paramtype = "light",
paramtype2 = "facedir",
selection_box = {
type = "fixed",
fixed = selectionboxes[node],
},
node_box = {
type = "fixed",
fixed = nodeboxes[node]
},
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
drop = "pipeworks:pipe"
})
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

217
technic/pipeworks/tubes.lua Normal file
View File

@ -0,0 +1,217 @@
-- This file supplies pneumatic tubes and a 'test' device
minetest.register_node("pipeworks:testobject", {
description = "Pneumatic tube test ojbect",
tiles = {
"pipeworks_testobject.png",
},
paramtype = "light",
groups = {snappy=3, tubedevice=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
after_place_node = function(pos)
tube_scanforobjects(pos)
end,
after_dig_node = function(pos)
tube_scanforobjects(pos)
end,
})
-- tables
minetest.register_alias("pipeworks:tube", "pipeworks:tube_000000")
tube_leftstub = {
{ -32/64, -9/64, -9/64, 9/64, 9/64, 9/64 }, -- tube segment against -X face
}
tube_rightstub = {
{ -9/64, -9/64, -9/64, 32/64, 9/64, 9/64 }, -- tube segment against +X face
}
tube_bottomstub = {
{ -9/64, -32/64, -9/64, 9/64, 9/64, 9/64 }, -- tube segment against -Y face
}
tube_topstub = {
{ -9/64, -9/64, -9/64, 9/64, 32/64, 9/64 }, -- tube segment against +Y face
}
tube_frontstub = {
{ -9/64, -9/64, -32/64, 9/64, 9/64, 9/64 }, -- tube segment against -Z face
}
tube_backstub = {
{ -9/64, -9/64, -9/64, 9/64, 9/64, 32/64 }, -- tube segment against -Z face
}
tube_selectboxes = {
{ -32/64, -10/64, -10/64, 10/64, 10/64, 10/64 },
{ -10/64 , -10/64, -10/64, 32/64, 10/64, 10/64 },
{ -10/64 , -32/64, -10/64, 10/64, 10/64, 10/64 },
{ -10/64 , -10/64, -10/64, 10/64, 32/64, 10/64 },
{ -10/64 , -10/64, -32/64, 10/64, 10/64, 10/64 },
{ -10/64 , -10/64, -10/64, 10/64, 10/64, 32/64 }
}
-- Functions
function tube_addbox(t, b)
for i in ipairs(b)
do table.insert(t, b[i])
end
end
-- now define the nodes!
for xm = 0, 1 do
for xp = 0, 1 do
for ym = 0, 1 do
for yp = 0, 1 do
for zm = 0, 1 do
for zp = 0, 1 do
local outboxes = {}
local outsel = {}
local outimgs = {}
if yp==1 then
tube_addbox(outboxes, tube_topstub)
table.insert(outsel, tube_selectboxes[4])
table.insert(outimgs, "pipeworks_tube_noctr.png")
else
table.insert(outimgs, "pipeworks_tube_plain.png")
end
if ym==1 then
tube_addbox(outboxes, tube_bottomstub)
table.insert(outsel, tube_selectboxes[3])
table.insert(outimgs, "pipeworks_tube_noctr.png")
else
table.insert(outimgs, "pipeworks_tube_plain.png")
end
if xp==1 then
tube_addbox(outboxes, tube_rightstub)
table.insert(outsel, tube_selectboxes[2])
table.insert(outimgs, "pipeworks_tube_noctr.png")
else
table.insert(outimgs, "pipeworks_tube_plain.png")
end
if xm==1 then
tube_addbox(outboxes, tube_leftstub)
table.insert(outsel, tube_selectboxes[1])
table.insert(outimgs, "pipeworks_tube_noctr.png")
else
table.insert(outimgs, "pipeworks_tube_plain.png")
end
if zp==1 then
tube_addbox(outboxes, tube_backstub)
table.insert(outsel, tube_selectboxes[6])
table.insert(outimgs, "pipeworks_tube_noctr.png")
else
table.insert(outimgs, "pipeworks_tube_plain.png")
end
if zm==1 then
tube_addbox(outboxes, tube_frontstub)
table.insert(outsel, tube_selectboxes[5])
table.insert(outimgs, "pipeworks_tube_noctr.png")
else
table.insert(outimgs, "pipeworks_tube_plain.png")
end
local jx = xp+xm
local jy = yp+ym
local jz = zp+zm
if (jx+jy+jz) == 1 then
if xm == 1 then
table.remove(outimgs, 3)
table.insert(outimgs, 3, "pipeworks_tube_end.png")
end
if xp == 1 then
table.remove(outimgs, 4)
table.insert(outimgs, 4, "pipeworks_tube_end.png")
end
if ym == 1 then
table.remove(outimgs, 1)
table.insert(outimgs, 1, "pipeworks_tube_end.png")
end
if xp == 1 then
table.remove(outimgs, 2)
table.insert(outimgs, 2, "pipeworks_tube_end.png")
end
if zm == 1 then
table.remove(outimgs, 5)
table.insert(outimgs, 5, "pipeworks_tube_end.png")
end
if zp == 1 then
table.remove(outimgs, 6)
table.insert(outimgs, 6, "pipeworks_tube_end.png")
end
end
local tname = xm..xp..ym..yp..zm..zp
local tgroups = ""
if tname ~= "000000" then
tgroups = {snappy=3, tube=1, not_in_creative_inventory=1}
tubedesc = "Pneumatic tube segment ("..tname..")... You hacker, you."
iimg=nil
wscale = {x=1,y=1,z=1}
else
tgroups = {snappy=3, tube=1}
tubedesc = "Pneumatic tube segment"
iimg="pipeworks_tube_inv.png"
outimgs = {
"pipeworks_tube_short.png",
"pipeworks_tube_short.png",
"pipeworks_tube_end.png",
"pipeworks_tube_end.png",
"pipeworks_tube_short.png",
"pipeworks_tube_short.png"
}
outboxes = { -24/64, -9/64, -9/64, 24/64, 9/64, 9/64 }
outsel = { -24/64, -10/64, -10/64, 24/64, 10/64, 10/64 }
wscale = {x=1,y=1,z=0.01}
end
minetest.register_node("pipeworks:tube_"..tname, {
description = tubedesc,
drawtype = "nodebox",
tiles = outimgs,
inventory_image=iimg,
wield_image=iimg,
wield_scale=wscale,
paramtype = "light",
selection_box = {
type = "fixed",
fixed = outsel
},
node_box = {
type = "fixed",
fixed = outboxes
},
groups = tgroups,
sounds = default.node_sound_wood_defaults(),
walkable = true,
stack_max = 99,
drop = "pipeworks:tube_000000",
tubelike=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("tubelike",1)
end,
after_place_node = function(pos)
tube_scanforobjects(pos)
end,
after_dig_node = function(pos)
tube_scanforobjects(pos)
end
})
end
end
end
end
end
end

View File

@ -0,0 +1,434 @@
alloy_recipes ={}
registered_recipes_count=1
function register_alloy_recipe (string1,count1, string2,count2, string3,count3)
alloy_recipes[registered_recipes_count]={}
alloy_recipes[registered_recipes_count].src1_name=string1
alloy_recipes[registered_recipes_count].src1_count=count1
alloy_recipes[registered_recipes_count].src2_name=string2
alloy_recipes[registered_recipes_count].src2_count=count2
alloy_recipes[registered_recipes_count].dst_name=string3
alloy_recipes[registered_recipes_count].dst_count=count3
registered_recipes_count=registered_recipes_count+1
alloy_recipes[registered_recipes_count]={}
alloy_recipes[registered_recipes_count].src1_name=string2
alloy_recipes[registered_recipes_count].src1_count=count2
alloy_recipes[registered_recipes_count].src2_name=string1
alloy_recipes[registered_recipes_count].src2_count=count1
alloy_recipes[registered_recipes_count].dst_name=string3
alloy_recipes[registered_recipes_count].dst_count=count3
registered_recipes_count=registered_recipes_count+1
if UI_recipes_hook then
minetest.register_craft({
type = "alloy",
output = string3.." "..count3,
recipe = {
{string1.." "..count1},
{string2.." "..count2},
}
})
end
end
register_alloy_recipe ("technic:copper_dust",3, "technic:tin_dust",1, "technic:bronze_dust",4)
register_alloy_recipe ("moreores:copper_ingot",3, "moreores:tin_ingot",1, "moreores:bronze_ingot",4)
register_alloy_recipe ("technic:iron_dust",3, "technic:chromium_dust",1, "technic:stainless_steel_dust",4)
register_alloy_recipe ("default:steel_ingot",3, "technic:chromium_ingot",1, "technic:stainless_steel_ingot",4)
register_alloy_recipe ("technic:copper_dust",2, "technic:zinc_dust",1, "technic:brass_dust",3)
register_alloy_recipe ("moreores:copper_ingot",2, "technic:zinc_ingot",1, "technic:brass_ingot",3)
register_alloy_recipe ("default:sand",2, "technic:coal_dust",2, "technic:silicon_wafer",1)
register_alloy_recipe ("technic:silicon_wafer",1, "technic:mithril_dust",1, "technic:doped_silicon_wafer",1)
minetest.register_craft({
output = 'technic:alloy_furnace',
recipe = {
{'default:brick', 'default:brick', 'default:brick'},
{'default:brick', '', 'default:brick'},
{'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'},
}
})
alloy_furnace_formspec =
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
"list[current_name;src;3,1;1,1;]"..
"list[current_name;src2;3,2;1,1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]"..
"label[0,0;Electric Alloy Furnace]"..
"label[1,3;Power level]"
minetest.register_node("technic:alloy_furnace", {
description = "Electric alloy furnace",
tiles = {"technic_alloy_furnace_top.png", "technic_machine_bottom.png", "technic_alloy_furnace_side.png",
"technic_alloy_furnace_side.png", "technic_alloy_furnace_side.png", "technic_alloy_furnace_front.png"},
paramtype2 = "facedir",
groups = {cracky=2},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
technic_power_machine=1,
internal_EU_buffer=0;
interal_EU_buffer_size=2000;
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_float("technic_power_machine", 1)
meta:set_string("formspec", alloy_furnace_formspec)
meta:set_string("infotext", "Electric Alloy furnace")
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("src2", 1)
inv:set_size("dst", 4)
local EU_used = 0
local furnace_is_cookin = 0
local cooked = nil
meta:set_float("internal_EU_buffer",0)
meta:set_float("internal_EU_buffer_size",2000)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false end
if not inv:is_empty("src") then
return false end
if not inv:is_empty("src2") then
return false end
return true
end,
})
minetest.register_node("technic:alloy_furnace_active", {
description = "Alloy Furnace",
tiles = {"technic_alloy_furnace_top.png", "technic_machine_bottom.png", "technic_alloy_furnace_side.png",
"technic_alloy_furnace_side.png", "technic_alloy_furnace_side.png", "technic_alloy_furnace_front_active.png"},
paramtype2 = "facedir",
light_source = 8,
drop = "technic:alloy_furnace",
groups = {cracky=2, not_in_creative_inventory=1},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
internal_EU_buffer=0;
interal_EU_buffer_size=2000;
technic_power_machine=1,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
})
minetest.register_abm({
nodenames = {"technic:alloy_furnace","technic:alloy_furnace_active"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
internal_EU_buffer=meta:get_float("internal_EU_buffer")
internal_EU_buffer_size=meta:get_float("internal_EU_buffer")
local load = math.floor(internal_EU_buffer/2000 * 100)
meta:set_string("formspec",
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
(load)..":technic_power_meter_fg.png]"..
"list[current_name;src;3,1;1,1;]"..
"list[current_name;src2;3,2;1,1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]"..
"label[0,0;Electric Alloy Furnace]"..
"label[1,3;Power level]")
local inv = meta:get_inventory()
local furnace_is_cookin = meta:get_int("furnace_is_cookin")
local srclist = inv:get_list("src")
local srclist2 = inv:get_list("src2")
srcstack = inv:get_stack("src", 1)
if srcstack then src_item1=srcstack:to_table() end
srcstack = inv:get_stack("src2", 1)
if srcstack then src_item2=srcstack:to_table() end
dst_index=nil
if src_item1 and src_item2 then
dst_index=get_cook_result(src_item1,src_item2)
end
if (furnace_is_cookin == 1) then
if internal_EU_buffer>=150 then
internal_EU_buffer=internal_EU_buffer-150;
meta:set_float("internal_EU_buffer",internal_EU_buffer)
meta:set_float("src_time", meta:get_float("src_time") + 1)
if dst_index and meta:get_float("src_time") >= 4 then
-- check if there's room for output in "dst" list
dst_stack={}
dst_stack["name"]=alloy_recipes[dst_index].dst_name
dst_stack["count"]=alloy_recipes[dst_index].dst_count
if inv:room_for_item("dst",dst_stack) then
-- Put result in "dst" list
inv:add_item("dst",dst_stack)
-- take stuff from "src" list
for i=1,alloy_recipes[dst_index].src1_count,1 do
srcstack = inv:get_stack("src", 1)
srcstack:take_item()
inv:set_stack("src", 1, srcstack)
end
for i=1,alloy_recipes[dst_index].src2_count,1 do
srcstack = inv:get_stack("src2", 1)
srcstack:take_item()
inv:set_stack("src2", 1, srcstack)
end
else
print("Furnace inventory full!")
end
meta:set_string("src_time", 0)
end
end
end
if dst_index and meta:get_int("furnace_is_cookin")==0 then
hacky_swap_node(pos,"technic:alloy_furnace_active")
meta:set_string("infotext","Electric Alloy Furnace active")
meta:set_int("furnace_is_cookin",1)
meta:set_string("src_time", 0)
return
end
if meta:get_int("furnace_is_cookin")==0 or dst_index==nil then
hacky_swap_node(pos,"technic:alloy_furnace")
meta:set_string("infotext","Electric Alloy Furnace inactive")
meta:set_int("furnace_is_cookin",0)
meta:set_string("src_time", 0)
end
end,
})
function get_cook_result(src_item1, src_item2)
local counter=registered_recipes_count-1
for i=1, counter,1 do
if alloy_recipes[i].src1_name==src_item1["name"] and
alloy_recipes[i].src2_name==src_item2["name"] and
alloy_recipes[i].src1_count<=src_item1["count"] and
alloy_recipes[i].src2_count<=src_item2["count"]
then return i end
end
return nil
end
--coal driven alloy furnace:
minetest.register_craft({
output = 'technic:coal_alloy_furnace',
recipe = {
{'default:brick', 'default:brick', 'default:brick'},
{'default:brick', '', 'default:brick'},
{'default:brick', 'default:brick', 'default:brick'},
}
})
coal_alloy_furnace_formspec =
"size[8,9]"..
"label[0,0;Alloy Furnace]"..
"image[2,2;1,1;default_furnace_fire_bg.png]"..
"list[current_name;fuel;2,3;1,1;]"..
"list[current_name;src;2,1;1,1;]"..
"list[current_name;src2;3,1;1,1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:coal_alloy_furnace", {
description = "Alloy Furnace",
tiles = {"technic_coal_alloy_furnace_top.png", "technic_coal_alloy_furnace_bottom.png", "technic_coal_alloy_furnace_side.png",
"technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_front.png"},
paramtype2 = "facedir",
groups = {cracky=2},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec", coal_alloy_furnace_formspec)
meta:set_string("infotext", "Alloy Furnace")
local inv = meta:get_inventory()
inv:set_size("fuel", 1)
inv:set_size("src", 1)
inv:set_size("src2", 1)
inv:set_size("dst", 4)
local furnace_is_cookin = 0
local dst_index = nil
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not (inv:is_empty("fuel") or inv:is_empty("dst") or inv:is_empty("src") or inv:is_empty("src2") )then
return false
end
return true
end,
})
minetest.register_node("technic:coal_alloy_furnace_active", {
description = "Alloy Furnace",
tiles = {"technic_coal_alloy_furnace_top.png", "technic_coal_alloy_furnace_bottom.png", "technic_coal_alloy_furnace_side.png",
"technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_front_active.png"},
paramtype2 = "facedir",
light_source = 8,
drop = "technic:coal_alloy_furnace",
groups = {cracky=2, not_in_creative_inventory=1},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not (inv:is_empty("fuel") or inv:is_empty("dst") or inv:is_empty("src") or inv:is_empty("src2") )then
return false
end
return true
end,
})
minetest.register_abm({
nodenames = {"technic:coal_alloy_furnace","technic:coal_alloy_furnace_active"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
for i, name in ipairs({
"fuel_totaltime",
"fuel_time",
"src_totaltime",
"src_time"
}) do
if meta:get_string(name) == "" then
meta:set_float(name, 0.0)
end
end
local inv = meta:get_inventory()
srcstack = inv:get_stack("src", 1)
if srcstack then src_item1=srcstack:to_table() end
srcstack = inv:get_stack("src2", 1)
if srcstack then src_item2=srcstack:to_table() end
dst_index=nil
if src_item1 and src_item2 then
dst_index=get_cook_result(src_item1,src_item2)
end
local was_active = false
if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
was_active = true
meta:set_float("fuel_time", meta:get_float("fuel_time") + 1)
meta:set_float("src_time", meta:get_float("src_time") + 1)
if dst_index and meta:get_float("src_time") >= 5 then
-- check if there's room for output in "dst" list
dst_stack={}
dst_stack["name"]=alloy_recipes[dst_index].dst_name
dst_stack["count"]=alloy_recipes[dst_index].dst_count
if inv:room_for_item("dst",dst_stack) then
-- Put result in "dst" list
inv:add_item("dst", dst_stack)
-- take stuff from "src" list
for i=1,alloy_recipes[dst_index].src1_count,1 do
srcstack = inv:get_stack("src", 1)
srcstack:take_item()
inv:set_stack("src", 1, srcstack)
end
for i=1,alloy_recipes[dst_index].src2_count,1 do
srcstack = inv:get_stack("src2", 1)
srcstack:take_item()
inv:set_stack("src2", 1, srcstack)
end
else
print("Furnace inventory full!")
end
meta:set_string("src_time", 0)
end
end
if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
local percent = math.floor(meta:get_float("fuel_time") /
meta:get_float("fuel_totaltime") * 100)
meta:set_string("infotext","Furnace active: "..percent.."%")
hacky_swap_node(pos,"technic:coal_alloy_furnace_active")
meta:set_string("formspec",
"size[8,9]"..
"label[0,0;Electric Alloy Furnace]"..
"image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:"..
(100-percent)..":default_furnace_fire_fg.png]"..
"list[current_name;fuel;2,3;1,1;]"..
"list[current_name;src;2,1;1,1;]"..
"list[current_name;src2;3,1;1,1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]")
return
end
local fuel = nil
local fuellist = inv:get_list("fuel")
srcstack = inv:get_stack("src", 1)
if srcstack then src_item1=srcstack:to_table() end
srcstack = inv:get_stack("src2", 1)
if srcstack then src_item2=srcstack:to_table() end
dst_index=nil
if src_item1 and src_item2 then
dst_index=get_cook_result(src_item1,src_item2)
end
if fuellist then
fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
end
if fuel.time <= 0 then
meta:set_string("infotext","Furnace out of fuel")
hacky_swap_node(pos,"technic:coal_alloy_furnace")
meta:set_string("formspec", coal_alloy_furnace_formspec)
return
end
if dst_index==nil then
if was_active then
meta:set_string("infotext","Furnace is empty")
hacky_swap_node(pos,"technic:coal_alloy_furnace")
meta:set_string("formspec", coal_alloy_furnace_formspec)
end
return
end
meta:set_string("fuel_totaltime", fuel.time)
meta:set_string("fuel_time", 0)
local stack = inv:get_stack("fuel", 1)
stack:take_item()
inv:set_stack("fuel", 1, stack)
end,
})

View File

@ -0,0 +1,398 @@
power_tools ={}
registered_power_tools_count=1
function register_power_tool (string1,max_charge)
power_tools[registered_power_tools_count]={}
power_tools[registered_power_tools_count].tool_name=string1
power_tools[registered_power_tools_count].max_charge=max_charge
registered_power_tools_count=registered_power_tools_count+1
end
register_power_tool ("technic:mining_drill",60000)
register_power_tool ("technic:chainsaw",30000)
register_power_tool ("technic:laser_mk1",40000)
register_power_tool ("technic:battery",10000)
register_power_tool ("technic:sonic_screwdriver",15000)
register_power_tool ("technic:flashlight",30000)
register_power_tool ("technic:red_energy_crystal",100000)
register_power_tool ("technic:green_energy_crystal",250000)
register_power_tool ("technic:blue_energy_crystal",500000)
minetest.register_alias("battery", "technic:battery")
minetest.register_alias("battery_box", "technic:battery_box")
minetest.register_craft({
output = 'technic:battery 1',
recipe = {
{'default:wood', 'moreores:copper_ingot', 'default:wood'},
{'default:wood', 'moreores:tin_ingot', 'default:wood'},
{'default:wood', 'moreores:copper_ingot', 'default:wood'},
}
})
minetest.register_craft({
output = 'technic:battery_box 1',
recipe = {
{'technic:battery', 'default:wood', 'technic:battery'},
{'technic:battery', 'moreores:copper_ingot', 'technic:battery'},
{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
}
})
minetest.register_tool("technic:battery",
{description = "RE Battery",
inventory_image = "technic_battery.png",
tool_capabilities = {load=0,max_drop_level=0, groupcaps={fleshy={times={}, uses=10000, maxlevel=0}}}})
minetest.register_craftitem("technic:battery_box", {
description = "Battery box",
stack_max = 99,
})
battery_box_formspec =
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
"list[current_name;src;3,1;1,1;]"..
"image[4,1;1,1;technic_battery_reload.png]"..
"list[current_name;dst;5,1;1,1;]"..
"label[0,0;Battery box]"..
"label[3,0;Charge]"..
"label[5,0;Discharge]"..
"label[1,3;Power level]"..
"list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:battery_box", {
description = "Battery box",
tiles = {"technic_battery_box_top.png", "technic_battery_box_bottom.png", "technic_battery_box_side0.png",
"technic_battery_box_side0.png", "technic_battery_box_side0.png", "technic_battery_box_side0.png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
technic_power_machine=1,
last_side_shown=0,
drop="technic:battery_box",
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "Battery box")
meta:set_float("technic_power_machine", 1)
meta:set_string("formspec", battery_box_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 1)
battery_charge = 0
max_charge = 60000
last_side_shown=0
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
})
for i=1,8,1 do
minetest.register_node("technic:battery_box"..i, {
description = "Battery box",
tiles = {"technic_battery_box_top.png", "technic_battery_box_bottom.png", "technic_battery_box_side0.png^technic_power_meter"..i..".png",
"technic_battery_box_side0.png^technic_power_meter"..i..".png", "technic_battery_box_side0.png^technic_power_meter"..i..".png", "technic_battery_box_side0.png^technic_power_meter"..i..".png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
technic_power_machine=1,
last_side_shown=0,
drop="technic:battery_box",
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "Battery box")
meta:set_float("technic_power_machine", 1)
meta:set_string("formspec", battery_box_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 1)
battery_charge = 0
max_charge = 60000
last_side_shown=0
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
})
end
LV_nodes_visited = {}
function get_RE_item_load (load1,max_load)
if load1==0 then load1=65535 end
local temp = 65536-load1
temp= temp/65535*max_load
return math.floor(temp + 0.5)
end
function set_RE_item_load (load1,max_load)
if load1 == 0 then return 65535 end
local temp=load1/max_load*65535
temp=65536-temp
return math.floor(temp)
end
function set_RE_wear (item_stack,load1,max_load)
local temp=65536-math.floor(load1/max_load*65535)
item_stack["wear"]=tostring(temp)
return item_stack
end
minetest.register_abm({
nodenames = {"technic:battery_box","technic:battery_box1","technic:battery_box2","technic:battery_box3","technic:battery_box4",
"technic:battery_box5","technic:battery_box6","technic:battery_box7","technic:battery_box8"
},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
charge= meta:get_int("battery_charge")
max_charge= 60000
local i=math.ceil((charge/max_charge)*8)
if i>8 then i=8 end
j=meta:get_float("last_side_shown")
if i~=j then
if i>0 then hacky_swap_node(pos,"technic:battery_box"..i)
elseif i==0 then hacky_swap_node(pos,"technic:battery_box") end
meta:set_float("last_side_shown",i)
end
--loading registered power tools
local inv = meta:get_inventory()
if inv:is_empty("src")==false then
srcstack = inv:get_stack("src", 1)
src_item=srcstack:to_table()
item_meta=srcstack:get_metadata()
if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before tool/item
local item_max_charge = nil
local counter=registered_power_tools_count-1
for i=1, counter,1 do
if power_tools[i].tool_name==src_item["name"] then
item_max_charge=power_tools[i].max_charge
end
end
if item_max_charge then
load1=tonumber((src_item["metadata"]))
load_step=1000
if load1<item_max_charge and charge>0 then
if charge-load_step<0 then load_step=charge end
if load1+load_step>item_max_charge then load_step=item_max_charge-load1 end
load1=load1+load_step
charge=charge-load_step
set_RE_wear(src_item,load1,item_max_charge)
src_item["metadata"]=tostring(load1)
inv:set_stack("src", 1, src_item)
end
meta:set_int("battery_charge",charge)
end
end
-- dischargin registered power tools
if inv:is_empty("dst") == false then
srcstack = inv:get_stack("dst", 1)
src_item=srcstack:to_table()
local item_max_charge = nil
local counter=registered_power_tools_count-1
for i=1, counter,1 do
if power_tools[i].tool_name==src_item["name"] then
item_max_charge=power_tools[i].max_charge
end
end
if item_max_charge then
if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before battery/crystal
local load1=tonumber((src_item["metadata"]))
load_step=1000
if load1>0 and charge<max_charge then
if charge+load_step>max_charge then load_step=max_charge-charge end
if load1-load_step<0 then load_step=load1 end
load1=load1-load_step
charge=charge+load_step
set_RE_wear(src_item,load1,item_max_charge)
src_item["metadata"]=tostring(load1)
inv:set_stack("dst", 1, src_item)
end
end
end
meta:set_int("battery_charge",charge)
local load = math.floor(charge/60000 * 100)
meta:set_string("formspec",
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
(load)..":technic_power_meter_fg.png]"..
"list[current_name;src;3,1;1,1;]"..
"image[4,1;1,1;technic_battery_reload.png]"..
"list[current_name;dst;5,1;1,1;]"..
"label[0,0;Battery box]"..
"label[3,0;Charge]"..
"label[5,0;Discharge]"..
"label[1,3;Power level]"..
"list[current_player;main;0,5;8,4;]")
local pos1={}
pos1.y=pos.y-1
pos1.x=pos.x
pos1.z=pos.z
meta1 = minetest.env:get_meta(pos1)
if meta1:get_float("cablelike")~=1 then return end
local LV_nodes = {}
local PR_nodes = {}
local RE_nodes = {}
LV_nodes[1]={}
LV_nodes[1].x=pos1.x
LV_nodes[1].y=pos1.y
LV_nodes[1].z=pos1.z
LV_nodes[1].visited=false
table_index=1
repeat
check_LV_node (PR_nodes,RE_nodes,LV_nodes,table_index)
table_index=table_index+1
if LV_nodes[table_index]==nil then break end
until false
local pos1={}
i=1
repeat
if PR_nodes[i]==nil then break end -- gettin power from all connected producers
pos1.x=PR_nodes[i].x
pos1.y=PR_nodes[i].y
pos1.z=PR_nodes[i].z
local meta1 = minetest.env:get_meta(pos1)
local internal_EU_buffer=meta1:get_float("internal_EU_buffer")
if charge<max_charge then
charge_to_take=200
if internal_EU_buffer-charge_to_take<=0 then
charge_to_take=internal_EU_buffer
end
if charge_to_take>0 then
charge=charge+charge_to_take
internal_EU_buffer=internal_EU_buffer-charge_to_take
meta1:set_float("internal_EU_buffer",internal_EU_buffer)
end
end
i=i+1
until false
if charge>max_charge then charge=max_charge end
i=1
repeat
if RE_nodes[i]==nil then break end
pos1.x=RE_nodes[i].x -- loading all conected machines buffers
pos1.y=RE_nodes[i].y
pos1.z=RE_nodes[i].z
local meta1 = minetest.env:get_meta(pos1)
local internal_EU_buffer=meta1:get_float("internal_EU_buffer")
local internal_EU_buffer_size=meta1:get_float("internal_EU_buffer_size")
local charge_to_give=200
if internal_EU_buffer+charge_to_give>internal_EU_buffer_size then
charge_to_give=internal_EU_buffer_size-internal_EU_buffer
end
if charge-charge_to_give<0 then charge_to_give=charge end
internal_EU_buffer=internal_EU_buffer+charge_to_give
meta1:set_float("internal_EU_buffer",internal_EU_buffer)
charge=charge-charge_to_give;
i=i+1
until false
charge=math.floor(charge)
charge_string=tostring(charge)
meta:set_string("infotext", "Battery box: "..charge_string.."/"..max_charge);
meta:set_int("battery_charge",charge)
end
})
function add_new_cable_node (LV_nodes,pos1)
local i=1
repeat
if LV_nodes[i]==nil then break end
if pos1.x==LV_nodes[i].x and pos1.y==LV_nodes[i].y and pos1.z==LV_nodes[i].z then return false end
i=i+1
until false
LV_nodes[i]={}
LV_nodes[i].x=pos1.x
LV_nodes[i].y=pos1.y
LV_nodes[i].z=pos1.z
LV_nodes[i].visited=false
return true
end
function check_LV_node (PR_nodes,RE_nodes,LV_nodes,i)
local pos1={}
pos1.x=LV_nodes[i].x
pos1.y=LV_nodes[i].y
pos1.z=LV_nodes[i].z
LV_nodes[i].visited=true
new_node_added=false
pos1.x=pos1.x+1
check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
pos1.x=pos1.x-2
check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
pos1.x=pos1.x+1
pos1.y=pos1.y+1
check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
pos1.y=pos1.y-2
check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
pos1.y=pos1.y+1
pos1.z=pos1.z+1
check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
pos1.z=pos1.z-2
check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
pos1.z=pos1.z+1
return new_node_added
end
function check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
meta = minetest.env:get_meta(pos1)
if meta:get_float("cablelike")==1 then new_node_added=add_new_cable_node(LV_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:solar_panel" then new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:generator" then new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:generator_active" then new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:geothermal" then new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:geothermal_active" then new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:water_mill" then new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:water_mill_active" then new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:electric_furnace" then new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:electric_furnace_active" then new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:alloy_furnace" then new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:alloy_furnace_active" then new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:tool_workshop" then new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:music_player" then new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:grinder" then new_node_added=add_new_cable_node(RE_nodes,pos1) end
end

View File

@ -0,0 +1,321 @@
minetest.register_craft({
output = 'technic:mv_battery_box 1',
recipe = {
{'technic:battery_box', 'technic:battery_box', 'technic:battery_box'},
{'technic:battery_box', 'technic:mv_transformer', 'technic:battery_box'},
{'', 'technic:mv_cable', ''},
}
})
mv_battery_box_formspec =
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
"list[current_name;src;3,1;1,1;]"..
"image[4,1;1,1;technic_battery_reload.png]"..
"list[current_name;dst;5,1;1,1;]"..
"label[0,0;MV_Battery box]"..
"label[3,0;Charge]"..
"label[5,0;Discharge]"..
"label[1,3;Power level]"..
"list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:mv_battery_box", {
description = "MV Battery Box",
tiles = {"technic_mv_battery_box_top.png", "technic_mv_battery_box_bottom.png", "technic_mv_battery_box_side0.png",
"technic_mv_battery_box_side0.png", "technic_mv_battery_box_side0.png", "technic_mv_battery_box_side0.png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
technic_mv_power_machine=1,
last_side_shown=0,
drop="technic:mv_battery_box",
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "MV Battery box")
meta:set_float("technic_mv_power_machine", 1)
meta:set_string("formspec", battery_box_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 1)
battery_charge = 0
max_charge = 300000
last_side_shown=0
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
})
for i=1,8,1 do
minetest.register_node("technic:mv_battery_box"..i, {
description = "MV Battery Box",
tiles = {"technic_mv_battery_box_top.png", "technic_mv_battery_box_bottom.png", "technic_mv_battery_box_side0.png^technic_power_meter"..i..".png",
"technic_mv_battery_box_side0.png^technic_power_meter"..i..".png", "technic_mv_battery_box_side0.png^technic_power_meter"..i..".png", "technic_mv_battery_box_side0.png^technic_power_meter"..i..".png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
technic_power_machine=1,
last_side_shown=0,
drop="technic:mv_battery_box",
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "MV Battery box")
meta:set_float("technic_mv_power_machine", 1)
meta:set_string("formspec", battery_box_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 1)
battery_charge = 0
max_charge = 300000
last_side_shown=0
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
})
end
MV_nodes_visited = {}
minetest.register_abm({
nodenames = {"technic:mv_battery_box","technic:mv_battery_box1","technic:mv_battery_box2","technic:mv_battery_box3","technic:mv_battery_box4",
"technic:mv_battery_box5","technic:mv_battery_box6","technic:mv_battery_box7","technic:mv_battery_box8"
},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
charge= meta:get_int("battery_charge")
max_charge= 300000
local i=math.ceil((charge/max_charge)*8)
if i>8 then i=8 end
j=meta:get_float("last_side_shown")
if i~=j then
if i>0 then hacky_swap_node(pos,"technic:mv_battery_box"..i)
elseif i==0 then hacky_swap_node(pos,"technic:mv_battery_box") end
meta:set_float("last_side_shown",i)
end
--loading registered power tools
local inv = meta:get_inventory()
if inv:is_empty("src")==false then
srcstack = inv:get_stack("src", 1)
src_item=srcstack:to_table()
item_meta=srcstack:get_metadata()
if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before tool/item
local item_max_charge = nil
local counter=registered_power_tools_count-1
for i=1, counter,1 do
if power_tools[i].tool_name==src_item["name"] then
item_max_charge=power_tools[i].max_charge
end
end
if item_max_charge then
load1=tonumber((src_item["metadata"]))
load_step=4000
if load1<item_max_charge and charge>0 then
if charge-load_step<0 then load_step=charge end
if load1+load_step>item_max_charge then load_step=item_max_charge-load1 end
load1=load1+load_step
charge=charge-load_step
set_RE_wear(src_item,load1,item_max_charge)
src_item["metadata"]=tostring(load1)
inv:set_stack("src", 1, src_item)
end
meta:set_int("battery_charge",charge)
end
end
-- dischargin registered power tools
if inv:is_empty("dst") == false then
srcstack = inv:get_stack("dst", 1)
src_item=srcstack:to_table()
local item_max_charge = nil
local counter=registered_power_tools_count-1
for i=1, counter,1 do
if power_tools[i].tool_name==src_item["name"] then
item_max_charge=power_tools[i].max_charge
end
end
if item_max_charge then
if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before battery/crystal
local load1=tonumber((src_item["metadata"]))
load_step=4000
if load1>0 and charge<max_charge then
if charge+load_step>max_charge then load_step=max_charge-charge end
if load1-load_step<0 then load_step=load1 end
load1=load1-load_step
charge=charge+load_step
set_RE_wear(src_item,load1,item_max_charge)
src_item["metadata"]=tostring(load1)
inv:set_stack("dst", 1, src_item)
end
end
end
meta:set_int("battery_charge",charge)
local load = math.floor(charge/300000 * 100)
meta:set_string("formspec",
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
(load)..":technic_power_meter_fg.png]"..
"list[current_name;src;3,1;1,1;]"..
"image[4,1;1,1;technic_battery_reload.png]"..
"list[current_name;dst;5,1;1,1;]"..
"label[0,0;MV Battery box]"..
"label[3,0;Charge]"..
"label[5,0;Discharge]"..
"label[1,3;Power level]"..
"list[current_player;main;0,5;8,4;]")
local pos1={}
pos1.y=pos.y-1
pos1.x=pos.x
pos1.z=pos.z
meta1 = minetest.env:get_meta(pos1)
if meta1:get_float("mv_cablelike")~=1 then return end
local MV_nodes = {}
local PR_nodes = {}
local RE_nodes = {}
MV_nodes[1]={}
MV_nodes[1].x=pos1.x
MV_nodes[1].y=pos1.y
MV_nodes[1].z=pos1.z
MV_nodes[1].visited=false
table_index=1
repeat
check_MV_node (PR_nodes,RE_nodes,MV_nodes,table_index)
table_index=table_index+1
if MV_nodes[table_index]==nil then break end
until false
local pos1={}
i=1
repeat
if PR_nodes[i]==nil then break end -- gettin power from all connected producers
pos1.x=PR_nodes[i].x
pos1.y=PR_nodes[i].y
pos1.z=PR_nodes[i].z
local meta1 = minetest.env:get_meta(pos1)
local internal_EU_buffer=meta1:get_float("internal_EU_buffer")
if charge<max_charge then
charge_to_take=1000
if internal_EU_buffer-charge_to_take<=0 then
charge_to_take=internal_EU_buffer
end
if charge_to_take>0 then
charge=charge+charge_to_take
internal_EU_buffer=internal_EU_buffer-charge_to_take
meta1:set_float("internal_EU_buffer",internal_EU_buffer)
end
end
i=i+1
until false
if charge>max_charge then charge=max_charge end
i=1
repeat
if RE_nodes[i]==nil then break end
pos1.x=RE_nodes[i].x -- loading all conected machines buffers
pos1.y=RE_nodes[i].y
pos1.z=RE_nodes[i].z
local meta1 = minetest.env:get_meta(pos1)
local internal_EU_buffer=meta1:get_float("internal_EU_buffer")
local internal_EU_buffer_size=meta1:get_float("internal_EU_buffer_size")
local charge_to_give=1000
if internal_EU_buffer+charge_to_give>internal_EU_buffer_size then
charge_to_give=internal_EU_buffer_size-internal_EU_buffer
end
if charge-charge_to_give<0 then charge_to_give=charge end
internal_EU_buffer=internal_EU_buffer+charge_to_give
meta1:set_float("internal_EU_buffer",internal_EU_buffer)
charge=charge-charge_to_give;
i=i+1
until false
charge=math.floor(charge)
charge_string=tostring(charge)
meta:set_string("infotext", "Battery box: "..charge_string.."/"..max_charge);
meta:set_int("battery_charge",charge)
end
})
function add_new_MVcable_node (MV_nodes,pos1)
local i=1
repeat
if MV_nodes[i]==nil then break end
if pos1.x==MV_nodes[i].x and pos1.y==MV_nodes[i].y and pos1.z==MV_nodes[i].z then return false end
i=i+1
until false
MV_nodes[i]={}
MV_nodes[i].x=pos1.x
MV_nodes[i].y=pos1.y
MV_nodes[i].z=pos1.z
MV_nodes[i].visited=false
return true
end
function check_MV_node (PR_nodes,RE_nodes,MV_nodes,i)
local pos1={}
pos1.x=MV_nodes[i].x
pos1.y=MV_nodes[i].y
pos1.z=MV_nodes[i].z
MV_nodes[i].visited=true
new_node_added=false
pos1.x=pos1.x+1
check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
pos1.x=pos1.x-2
check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
pos1.x=pos1.x+1
pos1.y=pos1.y+1
check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
pos1.y=pos1.y-2
check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
pos1.y=pos1.y+1
pos1.z=pos1.z+1
check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
pos1.z=pos1.z-2
check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
pos1.z=pos1.z+1
return new_node_added
end
function check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
meta = minetest.env:get_meta(pos1)
if meta:get_float("mv_cablelike")==1 then new_node_added=add_new_MVcable_node(MV_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:solar_panel_mv" then new_node_added=add_new_MVcable_node(PR_nodes,pos1) end
end

162
technic/technic/cans.lua Normal file
View File

@ -0,0 +1,162 @@
water_can_max_load = 16
lava_can_max_load = 8
minetest.register_craft({
output = 'technic:water_can 1',
recipe = {
{'technic:zinc_ingot', 'technic:rubber','technic:zinc_ingot'},
{'default:steel_ingot', '', 'default:steel_ingot'},
{'technic:zinc_ingot', 'default:steel_ingot', 'technic:zinc_ingot'},
}
})
minetest.register_craft({
output = 'technic:lava_can 1',
recipe = {
{'technic:zinc_ingot', 'technic:stainless_steel_ingot','technic:zinc_ingot'},
{'technic:stainless_steel_ingot', '', 'technic:stainless_steel_ingot'},
{'technic:zinc_ingot', 'technic:stainless_steel_ingot', 'technic:zinc_ingot'},
}
})
minetest.register_tool("technic:water_can", {
description = "Water Can",
inventory_image = "technic_water_can.png",
stack_max = 1,
liquids_pointable = true,
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then
return end
n = minetest.env:get_node(pointed_thing.under)
item=itemstack:to_table()
local load=nil
if item["metadata"]=="" then load=0
else load=tonumber(item["metadata"])
end
if n.name == "default:water_source" then
if load+1<17 then
minetest.env:add_node(pointed_thing.under, {name="air"})
load=load+1;
item["metadata"]=tostring(load)
set_RE_wear(item,load,water_can_max_load)
itemstack:replace(item)
end
return itemstack
end
item=itemstack:to_table()
if load==0 then return end
if n.name == "default:water_flowing" then
minetest.env:add_node(pointed_thing.under, {name="default:water_source"})
load=load-1;
item["metadata"]=tostring(load)
set_RE_wear(item,load,water_can_max_load)
itemstack:replace(item)
return itemstack
end
n = minetest.env:get_node(pointed_thing.above)
if n.name == "air" then
minetest.env:add_node(pointed_thing.above, {name="default:water_source"})
load=load-1;
item["metadata"]=tostring(load)
set_RE_wear(item,load,water_can_max_load)
itemstack:replace(item)
return itemstack
end
end,
})
minetest.register_tool("technic:lava_can", {
description = "Lava Can",
inventory_image = "technic_lava_can.png",
stack_max = 1,
liquids_pointable = true,
on_use = function(itemstack, user, pointed_thing)
item=itemstack:to_table()
local load=nil
if item["metadata"]=="" then load=0
else load=tonumber(item["metadata"])
end
if n.name == "default:water_source" then
if load+1<17 then
minetest.env:add_node(pointed_thing.under, {name="air"})
load=load+1;
item["metadata"]=tostring(load)
set_RE_wear(item,load,water_can_max_load)
itemstack:replace(item)
end
return itemstack
end
item=itemstack:to_table()
if load==0 then return end
if n.name == "default:lava_flowing" then
minetest.env:add_node(pointed_thing.under, {name="default:lava_source"})
load=load-1;
item["metadata"]=tostring(load)
set_RE_wear(item,load,water_can_max_load)
itemstack:replace(item)
return itemstack
end
n = minetest.env:get_node(pointed_thing.above)
if n.name == "air" then
minetest.env:add_node(pointed_thing.above, {name="default:lava_source"})
load=load-1;
item["metadata"]=tostring(load)
set_RE_wear(item,load,water_can_max_load)
itemstack:replace(item)
return itemstack
end
if pointed_thing.type ~= "node" then
return end
n = minetest.env:get_node(pointed_thing.under)
if n.name == "default:lava_source" then
item=itemstack:to_table()
local load=tonumber((item["wear"]))
if load==0 then load =65535 end
load=get_RE_item_load(load,lava_can_max_load)
if load+1<9 then
minetest.env:add_node(pointed_thing.under, {name="air"})
load=load+1;
load=set_RE_item_load(load,lava_can_max_load)
item["wear"]=tostring(load)
itemstack:replace(item)
end
return itemstack
end
item=itemstack:to_table()
load=tonumber((item["wear"]))
if load==0 then load =65535 end
load=get_RE_item_load(load,lava_can_max_load)
if load==0 then return end
if n.name == "default:lava_flowing" then
minetest.env:add_node(pointed_thing.under, {name="default:lava_source"})
load=load-1;
load=set_RE_item_load(load,lava_can_max_load)
item["wear"]=tostring(load)
itemstack:replace(item)
return itemstack
end
n = minetest.env:get_node(pointed_thing.above)
if n.name == "air" then
minetest.env:add_node(pointed_thing.above, {name="default:lava_source"})
load=load-1;
load=set_RE_item_load(load,lava_can_max_load)
item["wear"]=tostring(load)
itemstack:replace(item)
return itemstack
end
end,
})

View File

@ -0,0 +1,59 @@
chainsaw_max_charge=30000
minetest.register_tool("technic:chainsaw", {
description = "Chainsaw",
inventory_image = "technic_chainsaw.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type=="node" then
item=itemstack:to_table()
if item["metadata"]=="" or item["metadata"]=="0" then return end --tool not charged
charge=tonumber(item["metadata"])
charge_to_take=600;
if charge-charge_to_take>0 then
charge_to_take=chainsaw_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,charge_to_take)
charge=charge-charge_to_take;
set_RE_wear(item,charge,chainsaw_max_charge)
item["metadata"]=tostring(charge)
itemstack:replace(item)
return itemstack
end
end
end,
})
minetest.register_craft({
output = 'technic:chainsaw',
recipe = {
{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:battery'},
{'technic:stainless_steel_ingot', 'technic:motor', 'technic:battery'},
{'','','moreores:copper_ingot'},
}
})
timber_nodenames={"default:jungletree", "default:papyrus", "default:cactus", "default:tree"}
function chainsaw_dig_it (pos, player,charge_to_take)
charge_to_take=0
local node=minetest.env:get_node(pos)
local i=1
while timber_nodenames[i]~=nil do
if node.name==timber_nodenames[i] then
charge_to_take=600
np={x=pos.x, y=pos.y, z=pos.z}
while minetest.env:get_node(np).name==timber_nodenames[i] do
minetest.env:remove_node(np)
minetest.env:add_item(np, timber_nodenames[i])
np={x=np.x, y=np.y+1, z=np.z}
end
minetest.sound_play("chainsaw", {pos = pos, gain = 1.0, max_hear_distance = 10,})
return charge_to_take
end
i=i+1
end
return charge_to_take
end

View File

@ -0,0 +1,83 @@
minetest.register_craft({
output = 'technic:rebar 6',
recipe = {
{'','', 'default:steel_ingot'},
{'','default:steel_ingot',''},
{'default:steel_ingot', '', ''},
}
})
minetest.register_craft({
output = 'technic:concrete 5',
recipe = {
{'default:stone','technic:rebar','default:stone'},
{'technic:rebar','default:stone','technic:rebar'},
{'default:stone','technic:rebar','default:stone'},
}
})
minetest.register_craft({
output = 'technic:concrete_post 4',
recipe = {
{'default:stone','technic:rebar','default:stone'},
{'default:stone','technic:rebar','default:stone'},
{'default:stone','technic:rebar','default:stone'},
}
})
minetest.register_craftitem("technic:rebar", {
description = "Rebar",
inventory_image = "technic_rebar.png",
stack_max = 99,
})
minetest.register_craftitem("technic:concrete", {
description = "Concrete Block",
inventory_image = "technic_concrete_block.png",
stack_max = 99,
})
minetest.register_craftitem("technic:concrete_post", {
description = "Concrete Post",
inventory_image = "technic_concrete_post.png",
stack_max = 99,
})
-- NODES:
minetest.register_node("technic:concrete", {
description = "Concrete Block",
tile_images = {"technic_concrete_block.png",},
is_ground_content = true,
groups = {cracky=1},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("technic:concrete_post", {
description = "Concrete Post",
drawtype = "fencelike",
tiles = {"technic_concrete_block.png"},
inventory_image = "default_fence.png",
wield_image = "default_fence.png",
paramtype = "light",
is_ground_content = true,
selection_box = {
type = "fixed",
fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
},
groups = {cracky=1},
sounds = default.node_sound_stone_defaults(),
})
stairsplus.register_stair_and_slab_and_panel_and_micro("concrete", "technic:concrete",
{cracky=3},
{"technic_concrete_block.png"},
"Concrete Stairs",
"Concrete Slab",
"Concrete Panel",
"Concrete Microblock",
"concrete")

View File

@ -0,0 +1,10 @@
enable_item_drop=false
enable_item_pickup=true
enable_technic_inventory=true
enable_mining_drill=true
enable_mining_laser=true
enable_flashlight=true
enable_rubber_tree_generation=true
enable_marble_generation=true
enable_granite_generation=true
enable_obsidian_generation=true

View File

@ -0,0 +1,297 @@
minetest.register_craft({
type = "shapeless",
output = 'technic:constructor_mk1_off 1',
recipe = {'technic:nodebreaker_off', 'technic:deployer_off'},
})
minetest.register_craft({
type = "shapeless",
output = 'technic:constructor_mk2_off 1',
recipe = {'technic:constructor_mk1_off', 'technic:constructor_mk1_off'},
})
minetest.register_craft({
type = "shapeless",
output = 'technic:constructor_mk3_off 1',
recipe = {'technic:constructor_mk2_off', 'technic:constructor_mk2_off'},
})
minetest.register_node("technic:constructor_mk1_off", {
description = "Constructor MK1",
tile_images = {"technic_constructor_mk1_top_off.png","technic_constructor_mk1_bottom_off.png","technic_constructor_mk1_side2_off.png","technic_constructor_mk1_side1_off.png",
"technic_constructor_back.png","technic_constructor_front_off.png"},
is_ground_content = true,
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2},
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[8,9;]"..
"label[0,0;Constructor MK1]"..
"label[5,0;Slot 1]"..
"list[current_name;slot1;6,0;1,1;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Constructor MK1")
local inv = meta:get_inventory()
inv:set_size("slot1", 1)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
return inv:is_empty("slot1")
end,
})
minetest.register_node("technic:constructor_mk1_on", {
description = "Constructor MK1",
tile_images = {"technic_constructor_mk1_top_on.png","technic_constructor_mk1_bottom_on.png","technic_constructor_mk1_side2_on.png","technic_constructor_mk1_side1_on.png",
"technic_constructor_back.png","technic_constructor_front_on.png"},
is_ground_content = true,
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2,not_in_creative_inventory=1},
sounds = default.node_sound_stone_defaults(),
})
mesecon:register_on_signal_on(function(pos, node)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
local pos1={}
pos1.x=pos.x
pos1.y=pos.y
pos1.z=pos.z
if node.param2==3 then pos1.x=pos1.x+1 end
if node.param2==2 then pos1.z=pos1.z+1 end
if node.param2==1 then pos1.x=pos1.x-1 end
if node.param2==0 then pos1.z=pos1.z-1 end
if node.name == "technic:constructor_mk1_off" then
hacky_swap_node(pos,"technic:constructor_mk1_on")
nodeupdate(pos)
local node1=minetest.env:get_node(pos1)
deploy_node (inv,"slot1",pos1,node1,node)
end
end)
mesecon:register_on_signal_off(function(pos, node)
if node.name == "technic:constructor_mk1_on" then
hacky_swap_node(pos,"technic:constructor_mk1_off")
nodeupdate(pos)
end
end)
mesecon:register_effector("technic:constructor_mk1_on", "technic:constructor_mk1_off")
minetest.register_node("technic:constructor_mk2_off", {
description = "Constructor MK2",
tile_images = {"technic_constructor_mk2_top_off.png","technic_constructor_mk2_bottom_off.png","technic_constructor_mk2_side2_off.png","technic_constructor_mk2_side1_off.png",
"technic_constructor_back.png","technic_constructor_front_off.png"},
is_ground_content = true,
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2},
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[8,9;]"..
"label[0,0;Constructor MK2]"..
"label[5,0;Slot 1]"..
"list[current_name;slot1;6,0;1,1;]"..
"label[5,1;Slot 2]"..
"list[current_name;slot2;6,1;1,1;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Constructor MK2")
local inv = meta:get_inventory()
inv:set_size("slot1", 1)
inv:set_size("slot2", 1)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
if inv:is_empty("slot1")==false or inv:is_empty("slot2")==false then return false end
return true
end,
})
minetest.register_node("technic:constructor_mk2_on", {
description = "Constructor MK2",
tile_images = {"technic_constructor_mk2_top_on.png","technic_constructor_mk2_bottom_on.png","technic_constructor_mk2_side2_on.png","technic_constructor_mk2_side1_on.png",
"technic_constructor_back.png","technic_constructor_front_on.png"},
is_ground_content = true,
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2,not_in_creative_inventory=1},
sounds = default.node_sound_stone_defaults(),
})
mesecon:register_on_signal_on(function(pos, node)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
local pos1={}
local pos2={}
pos1.x=pos.x
pos1.y=pos.y
pos1.z=pos.z
pos2.x=pos.x
pos2.y=pos.y
pos2.z=pos.z
if node.param2==3 then pos1.x=pos1.x+1 pos2.x=pos2.x+2 end
if node.param2==2 then pos1.z=pos1.z+1 pos2.z=pos2.z+2 end
if node.param2==1 then pos1.x=pos1.x-1 pos2.x=pos2.x-2 end
if node.param2==0 then pos1.z=pos1.z-1 pos2.z=pos2.z-2 end
if node.name == "technic:constructor_mk2_off" then
hacky_swap_node(pos,"technic:constructor_mk2_on")
nodeupdate(pos)
local node1=minetest.env:get_node(pos1)
deploy_node (inv,"slot1",pos1,node1,node)
local node1=minetest.env:get_node(pos2)
deploy_node (inv,"slot2",pos2,node1,node)
end
end)
mesecon:register_on_signal_off(function(pos, node)
if node.name == "technic:constructor_mk2_on" then
hacky_swap_node(pos,"technic:constructor_mk2_off")
nodeupdate(pos)
end
end)
mesecon:register_effector("technic:constructor_mk2_on", "technic:constructor_mk2_off")
minetest.register_node("technic:constructor_mk3_off", {
description = "Constructor MK3",
tile_images = {"technic_constructor_mk3_top_off.png","technic_constructor_mk3_bottom_off.png","technic_constructor_mk3_side2_off.png","technic_constructor_mk3_side1_off.png",
"technic_constructor_back.png","technic_constructor_front_off.png"},
is_ground_content = true,
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2},
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[8,9;]"..
"label[0,0;Constructor MK2]"..
"label[5,0;Slot 1]"..
"list[current_name;slot1;6,0;1,1;]"..
"label[5,1;Slot 2]"..
"list[current_name;slot2;6,1;1,1;]"..
"label[5,2;Slot 3]"..
"list[current_name;slot3;6,2;1,1;]"..
"label[5,3;Slot 4]"..
"list[current_name;slot4;6,3;1,1;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Constructor MK3")
local inv = meta:get_inventory()
inv:set_size("slot1", 1)
inv:set_size("slot2", 1)
inv:set_size("slot3", 1)
inv:set_size("slot4", 1)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
if inv:is_empty("slot1")==false or inv:is_empty("slot2")==false or inv:is_empty("slot3")==false or inv:is_empty("slot4")==false then return false end
return true
end,
})
minetest.register_node("technic:constructor_mk3_on", {
description = "Constructor MK3",
tile_images = {"technic_constructor_mk3_top_on.png","technic_constructor_mk3_bottom_on.png","technic_constructor_mk3_side2_on.png","technic_constructor_mk3_side1_on.png",
"technic_constructor_back.png","technic_constructor_front_on.png"},
is_ground_content = true,
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2,not_in_creative_inventory=1},
sounds = default.node_sound_stone_defaults(),
})
mesecon:register_on_signal_on(function(pos, node)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
local pos1={}
local pos2={}
local pos3={}
local pos4={}
pos1.x=pos.x
pos1.y=pos.y
pos1.z=pos.z
pos2.x=pos.x
pos2.y=pos.y
pos2.z=pos.z
pos3.x=pos.x
pos3.y=pos.y
pos3.z=pos.z
pos4.x=pos.x
pos4.y=pos.y
pos4.z=pos.z
if node.param2==3 then pos1.x=pos1.x+1 pos2.x=pos2.x+2 pos3.x=pos3.x+3 pos4.x=pos4.x+4 end
if node.param2==2 then pos1.z=pos1.z+1 pos2.z=pos2.z+2 pos3.z=pos3.z+3 pos4.z=pos4.z+4 end
if node.param2==1 then pos1.x=pos1.x-1 pos2.x=pos2.x-2 pos3.x=pos3.x-3 pos4.x=pos4.x-4 end
if node.param2==0 then pos1.z=pos1.z-1 pos2.z=pos2.z-2 pos3.z=pos3.z-3 pos4.z=pos4.z-4 end
if node.name == "technic:constructor_mk3_off" then
hacky_swap_node(pos,"technic:constructor_mk3_on")
nodeupdate(pos)
local node1=minetest.env:get_node(pos1)
deploy_node (inv,"slot1",pos1,node1,node)
local node1=minetest.env:get_node(pos2)
deploy_node (inv,"slot2",pos2,node1,node)
local node1=minetest.env:get_node(pos3)
deploy_node (inv,"slot3",pos3,node1,node)
local node1=minetest.env:get_node(pos4)
deploy_node (inv,"slot4",pos4,node1,node)
end
end)
mesecon:register_on_signal_off(function(pos, node)
if node.name == "technic:constructor_mk3_on" then
hacky_swap_node(pos,"technic:constructor_mk3_off")
nodeupdate(pos)
end
end)
mesecon:register_effector("technic:constructor_mk3_on", "technic:constructor_mk3_off")
deploy_node =function (inv, slot_name, pos1, node1, node)
if node1.name == "air" then
if not inv:is_empty(slot_name) then
stack1=inv:get_list(slot_name)
node_to_be_placed={name=stack1[1]:get_name(), param1=0, param2=node.param2}
minetest.env:set_node(pos1,node_to_be_placed)
stack1[1]:take_item()
inv:set_stack(slot_name, 1, stack1[1])
return
end
return
end
if node1.name == "ignore" or
node1.name == "default:lava_source" or
node1.name == "default:lava_flowing" or
node1.name == "default:water_source" or
node1.name == "default:water_flowing"
then return end
if inv:room_for_item(slot_name,node1) then
inv:add_item(slot_name,node1)
minetest.env:remove_node(pos1)
end
end

View File

@ -0,0 +1,162 @@
minetest.register_craft({
output = 'technic:copper_chest 1',
recipe = {
{'moreores:copper_ingot','moreores:copper_ingot','moreores:copper_ingot'},
{'moreores:copper_ingot','technic:iron_chest','moreores:copper_ingot'},
{'moreores:copper_ingot','moreores:copper_ingot','moreores:copper_ingot'},
}
})
minetest.register_craft({
output = 'technic:copper_locked_chest 1',
recipe = {
{'moreores:copper_ingot','moreores:copper_ingot','moreores:copper_ingot'},
{'moreores:copper_ingot','technic:iron_locked_chest','moreores:copper_ingot'},
{'moreores:copper_ingot','moreores:copper_ingot','moreores:copper_ingot'},
}
})
minetest.register_craft({
output = 'technic:copper_locked_chest 1',
recipe = {
{'default:steel_ingot'},
{'technic:copper_chest'},
}
})
minetest.register_craftitem("technic:copper_chest", {
description = "Copper Chest",
stack_max = 99,
})
minetest.register_craftitem("technic:copper_locked_chest", {
description = "Copper Locked Chest",
stack_max = 99,
})
minetest.register_node("technic:copper_chest", {
description = "Copper Chest",
tiles = {"technic_copper_chest_top.png", "technic_copper_chest_top.png", "technic_copper_chest_side.png",
"technic_copper_chest_side.png", "technic_copper_chest_side.png", "technic_copper_chest_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[10,9;]"..
"list[current_name;main;0,0;10,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Copper Chest")
local inv = meta:get_inventory()
inv:set_size("main", 10*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_move_allow_all(
pos, from_list, from_index, to_list, to_index, count, player)
end,
on_metadata_inventory_offer = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_offer_allow_all(
pos, listname, index, stack, player)
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from chest at "..minetest.pos_to_string(pos))
end,
})
local function has_locked_chest_privilege(meta, player)
if player:get_player_name() ~= meta:get_string("owner") then
return false
end
return true
end
minetest.register_node("technic:copper_locked_chest", {
description = "Copper Locked Chest",
tiles = {"technic_copper_chest_top.png", "technic_copper_chest_top.png", "technic_copper_chest_side.png",
"technic_copper_chest_side.png", "technic_copper_chest_side.png", "technic_copper_chest_locked.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
local meta = minetest.env:get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", "Copper Locked Chest (owned by "..
meta:get_string("owner")..")")
end,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[10,9;]"..
"list[current_name;main;0,0;10,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Copper Locked Chest")
meta:set_string("owner", "")
local inv = meta:get_inventory()
inv:set_size("main", 10*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return count
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from locked chest at "..minetest.pos_to_string(pos))
end,
})

View File

@ -0,0 +1,21 @@
technic.creative_inventory_size = 0
technic.creative_list = {}
-- Create detached creative inventory after loading all mods
minetest.after(0, function()
local inv = minetest.create_detached_inventory("technic_creative", {})
technic.creative_list = {}
for name,def in pairs(minetest.registered_items) do
if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0)
and def.description and def.description ~= "" then
table.insert(technic.creative_list, name)
end
end
table.sort(technic.creative_list)
--inv:set_size("main", #technic.creative_list)
--for _,itemstring in ipairs(technic.creative_list) do
-- local stack = ItemStack(itemstring)
-- inv:add_item("main", stack)
--end
--technic.creative_inventory_size = #technic.creative_list
end)

View File

@ -0,0 +1,5 @@
moreores
flowers
pipeworks
mesecons
stairsplus

View File

@ -0,0 +1,91 @@
minetest.register_craft({
output = 'technic:deployer_off 1',
recipe = {
{'default:wood', 'default:chest','default:wood'},
{'default:stone', 'mesecons:piston','default:stone'},
{'default:stone', 'mesecons:mesecon','default:stone'},
}
})
minetest.register_node("technic:deployer_off", {
description = "Deployer",
tile_images = {"technic_deployer_top.png","technic_deployer_bottom.png","technic_deployer_side2.png","technic_deployer_side1.png",
"technic_deployer_back.png","technic_deployer_front_off.png"},
is_ground_content = true,
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2,tubedevice=1},
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[8,9;]"..
"label[0,0;Deployer]"..
"list[current_name;main;4,1;3,3;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Deployer")
local inv = meta:get_inventory()
inv:set_size("main", 3*3)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("main") then
return false
end
return true
end,
})
minetest.register_node("technic:deployer_on", {
description = "Deployer",
tile_images = {"technic_deployer_top.png","technic_deployer_bottom.png","technic_deployer_side2.png","technic_deployer_side1.png",
"technic_deployer_back.png","technic_deployer_front_on.png"},
is_ground_content = true,
paramtype2 = "facedir",
tubelike=1,
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2,tubedevice=1,not_in_creative_inventory=1},
sounds = default.node_sound_stone_defaults(),
})
mesecon:register_on_signal_on(function(pos, node)
local pos1={}
pos1.x=pos.x
pos1.y=pos.y
pos1.z=pos.z
if node.param2==3 then pos1.x=pos1.x+1 end
if node.param2==2 then pos1.z=pos1.z+1 end
if node.param2==1 then pos1.x=pos1.x-1 end
if node.param2==0 then pos1.z=pos1.z-1 end
if node.name == "technic:deployer_off" then
hacky_swap_node(pos,"technic:deployer_on")
nodeupdate(pos)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
print (dump(inv))
for _,stack in ipairs(inv:get_list("main")) do
print (dump(stack:get_name()))
if stack:get_name() ~=nil then
node1={name=stack:get_name(), param1=0, param2=node.param2}
minetest.env:place_node(pos1,node1)
return
end
end
end
end)
mesecon:register_on_signal_off(function(pos, node)
if node.name == "technic:deployer_on" then
hacky_swap_node(pos,"technic:deployer_off")
nodeupdate(pos)
end
end)
mesecon:register_effector("technic:deployer_on", "technic:deployer_off")

View File

@ -0,0 +1,268 @@
power_tools ={}
registered_power_tools_count=1
function register_power_tool (string1,max_charge)
power_tools[registered_power_tools_count]={}
power_tools[registered_power_tools_count].tool_name=string1
power_tools[registered_power_tools_count].max_charge=max_charge
registered_power_tools_count=registered_power_tools_count+1
end
register_power_tool ("technic:mining_drill",60000)
register_power_tool ("technic:laser_mk1",40000)
register_power_tool ("technic:battery",10000)
minetest.register_alias("battery", "technic:battery")
minetest.register_alias("battery_box", "technic:battery_box")
minetest.register_alias("electric_furnace", "technic:electric_furnace")
minetest.register_craft({
output = 'technic:battery 1',
recipe = {
{'default:wood', 'moreores:copper_ingot', 'default:wood'},
{'default:wood', 'moreores:tin_ingot', 'default:wood'},
{'default:wood', 'moreores:copper_ingot', 'default:wood'},
}
})
minetest.register_craft({
output = 'technic:battery_box 1',
recipe = {
{'technic:battery', 'default:wood', 'technic:battery'},
{'technic:battery', 'moreores:copper_ingot', 'technic:battery'},
{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
}
})
minetest.register_craft({
output = 'technic:electric_furnace',
recipe = {
{'default:brick', 'default:brick', 'default:brick'},
{'default:brick', '', 'default:brick'},
{'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'},
}
})
minetest.register_tool("technic:battery",
{description = "RE Battery",
inventory_image = "technic_battery.png",
energy_charge = 0,
tool_capabilities = {max_drop_level=0, groupcaps={fleshy={times={}, uses=10000, maxlevel=0}}}})
minetest.register_craftitem("technic:battery_box", {
description = "Battery box",
stack_max = 99,
})
battery_box_formspec =
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
"list[current_name;src;3,1;1,1;]"..
"image[4,1;1,1;technic_battery_reload.png]"..
"list[current_name;dst;5,1;1,1;]"..
"label[0,0;Battery box]"..
"label[3,0;Charge]"..
"label[5,0;Discharge]"..
"label[1,3;Power level]"..
"list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:battery_box", {
description = "Battery box",
tiles = {"technic_battery_box_top.png", "technic_battery_box_bottom.png", "technic_battery_box_side.png",
"technic_battery_box_side.png", "technic_battery_box_side.png", "technic_battery_box_side.png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
technic_power_machine=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "Battery box")
meta:set_float("technic_power_machine", 1)
meta:set_string("formspec", battery_box_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 1)
battery_charge = 0
max_charge = 60000
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
})
electric_furnace_formspec =
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
"list[current_name;src;3,1;1,1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]"..
"label[0,0;Electric Furnace]"..
"label[1,3;Power level]"
minetest.register_node("technic:electric_furnace", {
description = "Electric furnace",
tiles = {"technic_electric_furnace_top.png", "technic_electric_furnace_bottom.png", "technic_electric_furnace_side.png",
"technic_electric_furnace_side.png", "technic_electric_furnace_side.png", "technic_electric_furnace_front.png"},
paramtype2 = "facedir",
groups = {cracky=2},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
technic_power_machine=1,
internal_EU_buffer=0;
interal_EU_buffer_size=2000;
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_float("technic_power_machine", 1)
meta:set_string("formspec", electric_furnace_formspec)
meta:set_string("infotext", "Electric furnace")
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 4)
local EU_used = 0
local furnace_is_cookin = 0
local cooked = nil
meta:set_float("internal_EU_buffer",0)
meta:set_float("internal_EU_buffer_size",2000)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
})
minetest.register_node("technic:electric_furnace_active", {
description = "Electric Furnace",
tiles = {"technic_electric_furnace_top.png", "technic_electric_furnace_bottom.png", "technic_electric_furnace_side.png",
"technic_electric_furnace_side.png", "technic_electric_furnace_side.png", "technic_electric_furnace_front_active.png"},
paramtype2 = "facedir",
light_source = 8,
drop = "technic:electric_furnace",
groups = {cracky=2, not_in_creative_inventory=1},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
internal_EU_buffer=0;
interal_EU_buffer_size=2000;
technic_power_machine=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_float("technic_power_machine", 1)
meta:set_string("formspec", electric_furnace_formspec)
meta:set_string("infotext", "Electric furnace");
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 4)
local EU_used = 0
local furnace_is_cookin = 0
local cooked = nil
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
})
minetest.register_abm({
nodenames = {"technic:electric_furnace","technic:electric_furnace_active"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
internal_EU_buffer=meta:get_float("internal_EU_buffer")
internal_EU_buffer_size=meta:get_float("internal_EU_buffer")
local load = math.floor(internal_EU_buffer/2000 * 100)
meta:set_string("formspec",
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
(load)..":technic_power_meter_fg.png]"..
"list[current_name;src;3,1;1,1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]"..
"label[0,0;Electric Furnace]"..
"label[1,3;Power level]")
local inv = meta:get_inventory()
local furnace_is_cookin = meta:get_float("furnace_is_cookin")
local srclist = inv:get_list("src")
local cooked=nil
if srclist then
cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
end
if (furnace_is_cookin == 1) then
if internal_EU_buffer>=150 then
internal_EU_buffer=internal_EU_buffer-150;
meta:set_float("internal_EU_buffer",internal_EU_buffer)
meta:set_float("src_time", meta:get_float("src_time") + 3)
if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then
-- check if there's room for output in "dst" list
if inv:room_for_item("dst",cooked.item) then
-- Put result in "dst" list
inv:add_item("dst", cooked.item)
-- take stuff from "src" list
srcstack = inv:get_stack("src", 1)
srcstack:take_item()
inv:set_stack("src", 1, srcstack)
else
print("Furnace inventory full!")
end
meta:set_string("src_time", 0)
end
end
end
if srclist then
cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
if cooked.time>0 then
hacky_swap_node(pos,"technic:electric_furnace_active")
meta:set_string("infotext","Furnace active")
meta:set_string("furnace_is_cookin",1)
-- meta:set_string("formspec", electric_furnace_formspec)
meta:set_string("src_time", 0)
return
end
end
hacky_swap_node(pos,"technic:electric_furnace")
meta:set_string("infotext","Furnace inactive")
meta:set_string("furnace_is_cookin",0)
-- meta:set_string("formspec", electric_furnace_formspec)
meta:set_string("src_time", 0)
end,
})

View File

@ -0,0 +1,178 @@
minetest.register_alias("electric_furnace", "technic:electric_furnace")
minetest.register_craft({
output = 'technic:electric_furnace',
recipe = {
{'default:cobble', 'default:cobble', 'default:cobble'},
{'default:cobble', '', 'default:cobble'},
{'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'},
}
})
electric_furnace_formspec =
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
"list[current_name;src;3,1;1,1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]"..
"label[0,0;Electric Furnace]"..
"label[1,3;Power level]"
minetest.register_node("technic:electric_furnace", {
description = "Electric furnace",
tiles = {"technic_electric_furnace_top.png", "technic_electric_furnace_bottom.png", "technic_electric_furnace_side.png",
"technic_electric_furnace_side.png", "technic_electric_furnace_side.png", "technic_electric_furnace_front.png"},
paramtype2 = "facedir",
groups = {cracky=2},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
technic_power_machine=1,
internal_EU_buffer=0;
interal_EU_buffer_size=2000;
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_float("technic_power_machine", 1)
meta:set_string("formspec", electric_furnace_formspec)
meta:set_string("infotext", "Electric furnace")
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 4)
local EU_used = 0
local furnace_is_cookin = 0
local cooked = nil
meta:set_float("internal_EU_buffer",0)
meta:set_float("internal_EU_buffer_size",2000)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
})
minetest.register_node("technic:electric_furnace_active", {
description = "Electric Furnace",
tiles = {"technic_electric_furnace_top.png", "technic_electric_furnace_bottom.png", "technic_electric_furnace_side.png",
"technic_electric_furnace_side.png", "technic_electric_furnace_side.png", "technic_electric_furnace_front_active.png"},
paramtype2 = "facedir",
light_source = 8,
drop = "technic:electric_furnace",
groups = {cracky=2, not_in_creative_inventory=1},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
internal_EU_buffer=0;
interal_EU_buffer_size=2000;
technic_power_machine=1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_float("technic_power_machine", 1)
meta:set_string("formspec", electric_furnace_formspec)
meta:set_string("infotext", "Electric furnace");
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 4)
local EU_used = 0
local furnace_is_cookin = 0
local cooked = nil
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
})
minetest.register_abm({
nodenames = {"technic:electric_furnace","technic:electric_furnace_active"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
internal_EU_buffer=meta:get_float("internal_EU_buffer")
internal_EU_buffer_size=meta:get_float("internal_EU_buffer")
local load = math.floor(internal_EU_buffer/2000 * 100)
meta:set_string("formspec",
"invsize[8,9;]"..
"background[-1,-1;10,11;technic_electric_furnace_GUI.png]"..
"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
(load)..":technic_power_meter_fg.png]"..
"list[current_name;src;3,1;1,1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]"..
"label[0,0;Electric Furnace]"..
"label[1,3;Power level]")
local inv = meta:get_inventory()
local furnace_is_cookin = meta:get_float("furnace_is_cookin")
local srclist = inv:get_list("src")
local cooked=nil
if srclist then
cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
end
if (furnace_is_cookin == 1) then
if internal_EU_buffer>=150 then
internal_EU_buffer=internal_EU_buffer-150;
meta:set_float("internal_EU_buffer",internal_EU_buffer)
meta:set_float("src_time", meta:get_float("src_time") + 3)
if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then
-- check if there's room for output in "dst" list
if inv:room_for_item("dst",cooked.item) then
-- Put result in "dst" list
inv:add_item("dst", cooked.item)
-- take stuff from "src" list
srcstack = inv:get_stack("src", 1)
srcstack:take_item()
inv:set_stack("src", 1, srcstack)
else
print("Furnace inventory full!")
end
meta:set_string("src_time", 0)
end
end
end
if srclist then
cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
if cooked.time>0 then
hacky_swap_node(pos,"technic:electric_furnace_active")
meta:set_string("infotext","Furnace active")
meta:set_string("furnace_is_cookin",1)
-- meta:set_string("formspec", electric_furnace_formspec)
meta:set_string("src_time", 0)
return
end
end
hacky_swap_node(pos,"technic:electric_furnace")
meta:set_string("infotext","Furnace inactive")
meta:set_string("furnace_is_cookin",0)
-- meta:set_string("formspec", electric_furnace_formspec)
meta:set_string("src_time", 0)
end,
})

View File

@ -0,0 +1,167 @@
-- original code comes from walkin_light mod by Echo http://minetest.net/forum/viewtopic.php?id=2621
flashlight_max_charge=30000
minetest.register_tool("technic:flashlight", {
description = "Flashlight",
inventory_image = "technic_flashlight.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
end,
})
minetest.register_craft({
output = "technic:flashlight",
recipe = {
{"technic:rubber","glass","technic:rubber"},
{"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"},
{"","technic:battery",""}
}
})
local players = {}
local player_positions = {}
local last_wielded = {}
function round(num)
return math.floor(num + 0.5)
end
minetest.register_on_joinplayer(function(player)
local player_name = player:get_player_name()
table.insert(players, player_name)
local pos = player:getpos()
local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
player_positions[player_name] = {}
player_positions[player_name]["x"] = rounded_pos.x;
player_positions[player_name]["y"] = rounded_pos.y;
player_positions[player_name]["z"] = rounded_pos.z;
end)
minetest.register_on_leaveplayer(function(player)
local player_name = player:get_player_name()
for i,v in ipairs(players) do
if v == player_name then
table.remove(players, i)
last_wielded[player_name] = nil
-- Neuberechnung des Lichts erzwingen
local pos = player:getpos()
local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
minetest.env:add_node(rounded_pos,{type="node",name="air"})
player_positions[player_name]["x"] = nil
player_positions[player_name]["y"] = nil
player_positions[player_name]["z"] = nil
player_positions[player_name]["m"] = nil
player_positions[player_name] = nil
end
end
end)
minetest.register_globalstep(function(dtime)
for i,player_name in ipairs(players) do
local player = minetest.env:get_player_by_name(player_name)
flashlight_weared=check_for_flashlight(player)
local pos = player:getpos()
local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
if last_wielded[player_name] and not flashlight_weared then --remove light, flashlight weared out or was removed from hotbar
local node=minetest.env:get_node_or_nil(old_pos)
if node then
if node.name=="technic:light" then
minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
minetest.env:add_node(old_pos,{type="node",name="air"})
last_wielded[player_name]=false
end
end
end
player_moved=not(old_pos.x==rounded_pos.x and old_pos.y==rounded_pos.y and old_pos.z==rounded_pos.z)
if player_moved and last_wielded[player_name] and flashlight_weared then
local node=minetest.env:get_node_or_nil(rounded_pos)
if node then
if node.name=="air" then
minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
end
end
local node=minetest.env:get_node_or_nil(old_pos)
if node then
if node.name=="technic:light" then
minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
minetest.env:add_node(old_pos,{type="node",name="air"})
end
end
player_positions[player_name]["x"] = rounded_pos.x
player_positions[player_name]["y"] = rounded_pos.y
player_positions[player_name]["z"] = rounded_pos.z
else if not last_wielded[player_name] and flashlight_weared then
local node=minetest.env:get_node_or_nil(rounded_pos)
if node then
if node.name=="air" then
minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
end
end
player_positions[player_name]["x"] = rounded_pos.x
player_positions[player_name]["y"] = rounded_pos.y
player_positions[player_name]["z"] = rounded_pos.z
last_wielded[player_name]=true
end
end
end
end)
minetest.register_node("technic:light", {
drawtype = "glasslike",
tile_images = {"technic_light.png"},
paramtype = "light",
walkable = false,
buildable_to = true,
is_ground_content = true,
light_propagates = true,
sunlight_propagates = true,
light_source = 15,
selection_box = {
type = "fixed",
fixed = {0, 0, 0, 0, 0, 0},
},
})
minetest.register_node("technic:light_off", {
drawtype = "glasslike",
tile_images = {"technic_light.png"},
paramtype = "light",
walkable = false,
buildable_to = true,
is_ground_content = true,
light_propagates = true,
sunlight_propagates = true,
selection_box = {
type = "fixed",
fixed = {0, 0, 0, 0, 0, 0},
},
})
function check_for_flashlight (player)
if player==nil then return false end
local inv = player:get_inventory()
local hotbar=inv:get_list("main")
for i=1,8,1 do
if hotbar[i]:get_name() == "technic:flashlight" then
item=hotbar[i]:to_table()
if item["metadata"]=="" or item["metadata"]=="0" then return false end --flashlight not charghed
charge=tonumber(item["metadata"])
if charge-2>0 then
charge =charge-2;
set_RE_wear(item,charge,flashlight_max_charge)
item["metadata"]=tostring(charge)
hotbar[i]:replace(item)
inv:set_stack("main",i,hotbar[i])
return true
end
end
end
return false
end

View File

@ -0,0 +1,176 @@
-- original code comes from walkin_light mod by Echo http://minetest.net/forum/viewtopic.php?id=2621
flashlight_max_charge=30000
minetest.register_tool("technic:flashlight", {
description = "Flashlight",
inventory_image = "technic_flashlight.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
end,
})
minetest.register_craft({
output = "technic:flashlight",
recipe = {
{"glass","glass","glass"},
{"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"},
{"","technic:battery",""}
}
})
local players = {}
local player_positions = {}
local last_wielded = {}
function round(num)
return math.floor(num + 0.5)
end
minetest.register_on_joinplayer(function(player)
local player_name = player:get_player_name()
table.insert(players, player_name)
last_wielded[player_name] = flashlight_weared(player)
local pos = player:getpos()
local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
local wielded_item = player:get_wielded_item():get_name()
if flashlight_weared(player)==true then
-- Neuberechnung des Lichts erzwingen
minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
minetest.env:add_node(rounded_pos,{type="node",name="air"})
end
player_positions[player_name] = {}
player_positions[player_name]["x"] = rounded_pos.x;
player_positions[player_name]["y"] = rounded_pos.y;
player_positions[player_name]["z"] = rounded_pos.z;
end)
minetest.register_on_leaveplayer(function(player)
local player_name = player:get_player_name()
for i,v in ipairs(players) do
if v == player_name then
table.remove(players, i)
last_wielded[player_name] = nil
-- Neuberechnung des Lichts erzwingen
local pos = player:getpos()
local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
minetest.env:add_node(rounded_pos,{type="node",name="air"})
player_positions[player_name]["x"] = nil
player_positions[player_name]["y"] = nil
player_positions[player_name]["z"] = nil
player_positions[player_name]["m"] = nil
player_positions[player_name] = nil
end
end
end)
minetest.register_globalstep(function(dtime)
for i,player_name in ipairs(players) do
local player = minetest.env:get_player_by_name(player_name)
if flashlight_weared(player)==true then
-- Fackel ist in der Hand
local pos = player:getpos()
local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
if (last_wielded[player_name] ~= true) or (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then
-- Fackel gerade in die Hand genommen oder zu neuem Node bewegt
local is_air = minetest.env:get_node_or_nil(rounded_pos)
if is_air == nil or (is_air ~= nil and (is_air.name == "air" or is_air.name == "technic:light")) then
-- wenn an aktueller Position "air" ist, Fackellicht setzen
minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
end
if (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then
-- wenn Position ge<67>nder, dann altes Licht l<>schen
local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
-- Neuberechnung des Lichts erzwingen
local is_light = minetest.env:get_node_or_nil(old_pos)
if is_light ~= nil and is_light.name == "technic:light" then
minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
minetest.env:add_node(old_pos,{type="node",name="air"})
end
end
-- gemerkte Position ist nun die gerundete neue Position
player_positions[player_name]["x"] = rounded_pos.x
player_positions[player_name]["y"] = rounded_pos.y
player_positions[player_name]["z"] = rounded_pos.z
end
last_wielded[player_name] = true;
elseif last_wielded[player_name] == true then
-- Fackel nicht in der Hand, aber beim letzten Durchgang war die Fackel noch in der Hand
local pos = player:getpos()
local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
repeat
local is_light = minetest.env:get_node_or_nil(rounded_pos)
if is_light ~= nil and is_light.name == "technic:light" then
-- minetest.env:remove_node(rounded_pos)
-- Erzwinge Neuberechnung des Lichts
minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
minetest.env:add_node(rounded_pos,{type="node",name="air"})
end
until minetest.env:get_node_or_nil(rounded_pos) ~= "technic:light"
local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
repeat
is_light = minetest.env:get_node_or_nil(old_pos)
if is_light ~= nil and is_light.name == "technic:light" then
-- minetest.env:remove_node(old_pos)
-- Erzwinge Neuberechnung des Lichts
minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
minetest.env:add_node(old_pos,{type="node",name="air"})
end
until minetest.env:get_node_or_nil(old_pos) ~= "technic:light"
last_wielded[player_name] = true
end
end
end)
minetest.register_node("technic:light", {
drawtype = "glasslike",
tile_images = {"technic_light.png"},
paramtype = "light",
walkable = false,
is_ground_content = true,
light_propagates = true,
sunlight_propagates = true,
light_source = 15,
selection_box = {
type = "fixed",
fixed = {0, 0, 0, 0, 0, 0},
},
})
minetest.register_node("technic:light_off", {
drawtype = "glasslike",
tile_images = {"technic_light.png"},
paramtype = "light",
walkable = false,
is_ground_content = true,
light_propagates = true,
sunlight_propagates = true,
selection_box = {
type = "fixed",
fixed = {0, 0, 0, 0, 0, 0},
},
})
function flashlight_weared (player)
flashlight_on=false
local inv = player:get_inventory()
local hotbar=inv:get_list("main")
for i=1,8,1 do
if hotbar[i]:get_name() == "technic:flashlight" then
item=hotbar[i]:to_table()
if item["metadata"]=="" or item["metadata"]=="0" then return flashlight_on end --flashlight not charghed
charge=tonumber(item["metadata"])
if charge-2>0 then
flashlight_on=true
charge =charge-2;
set_RE_wear(item,charge,flashlight_max_charge)
item["metadata"]=tostring(charge)
hotbar[i]:replace(item)
inv:set_stack("main",i,hotbar[i])
return true
end
end
end
return flashlight_on
end

View File

@ -0,0 +1,148 @@
minetest.register_alias("generator", "technic:generator")
minetest.register_alias("generator", "technic:generator_active")
minetest.register_craft({
output = 'technic:generator',
recipe = {
{'default:stone', 'default:stone', 'default:stone'},
{'default:stone', '', 'default:stone'},
{'default:stone', 'moreores:copper_ingot', 'default:stone'},
}
})
minetest.register_craftitem("technic:generator", {
description = "Coal Driven Generator",
stack_max = 99,
})
generator_formspec =
"invsize[8,9;]"..
"image[0,0;5,5;technic_generator_menu.png]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
-- "label[0,0;Generator]"..
"label[1,3;Power level]"..
"list[current_name;src;3,1;1,1;]"..
"image[4,1;1,1;default_furnace_fire_bg.png]"..
"list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:generator", {
description = "Coal Driven Generator",
tiles = {"technic_generator_top.png", "technic_machine_bottom.png", "technic_generator_side.png",
"technic_generator_side.png", "technic_generator_side.png", "technic_generator_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
technic_power_machine=1,
internal_EU_buffer=0;
internal_EU_buffer_size=5000;
burn_time=0;
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "Generator")
meta:set_float("technic_power_machine", 1)
meta:set_float("internal_EU_buffer", 0)
meta:set_float("internal_EU_buffer_size", 5000)
meta:set_string("formspec", generator_formspec)
meta:set_float("burn_time", 0)
local inv = meta:get_inventory()
inv:set_size("src", 1)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("src") then
return false
end
return true
end,
})
minetest.register_node("technic:generator_active", {
description = "Coal Driven Generator",
tiles = {"technic_generator_top.png", "technic_machine_bottom.png", "technic_generator_side.png",
"technic_generator_side.png", "technic_generator_side.png", "technic_generator_front_active.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
drop="technic:generator",
technic_power_machine=1,
internal_EU_buffer=0;
internal_EU_buffer_size=0;
burn_time=0;
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("src") then
return false
end
return true
end,
})
minetest.register_abm({
nodenames = {"technic:generator","technic:generator_active"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
local burn_time= meta:get_float("burn_time")
local charge= meta:get_float("internal_EU_buffer")
local max_charge= meta:get_float("internal_EU_buffer_size")
local burn_charge=200
if burn_time>0 then
if charge+burn_charge>max_charge then
burn_charge=max_charge-charge
end
if burn_charge>0 then
burn_time=burn_time-1
meta:set_float("burn_time",burn_time)
charge=charge+burn_charge
meta:set_float("internal_EU_buffer",charge)
end
end
if burn_time==0 then
local inv = meta:get_inventory()
if inv:is_empty("src")==false then
local srcstack = inv:get_stack("src", 1)
src_item=srcstack:to_table()
if src_item["name"]== "default:coal_lump" then
srcstack:take_item()
inv:set_stack("src", 1, srcstack)
burn_time=16
meta:set_float("burn_time",burn_time)
hacky_swap_node (pos,"technic:generator_active")
end
end
end
local load = math.floor((charge/max_charge)*100)
local percent = math.floor((burn_time/16)*100)
meta:set_string("formspec",
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
(load)..":technic_power_meter_fg.png]"..
"label[0,0;Generator]"..
"label[1,3;Power level]"..
"list[current_name;src;3,1;1,1;]"..
"image[4,1;1,1;default_furnace_fire_bg.png^[lowpart:"..
(percent)..":default_furnace_fire_fg.png]"..
"list[current_player;main;0,5;8,4;]"
)
if burn_time==0 then
hacky_swap_node (pos,"technic:generator")
end
end
})

View File

@ -0,0 +1,135 @@
minetest.register_alias("geothermal", "technic:geothermal")
minetest.register_craft({
output = 'technic:geothermal',
recipe = {
{'default:stone', 'default:stone', 'default:stone'},
{'moreores:copper_ingot', 'technic:diamond', 'moreores:copper_ingot'},
{'default:stone', 'moreores:copper_ingot', 'default:stone'},
}
})
minetest.register_craftitem("technic:geothermal", {
description = "Geothermal Generator",
stack_max = 99,
})
geothermal_formspec =
"invsize[8,4;]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
"label[0,0;Geothermal Generator]"..
"label[1,3;Power level]"..
"list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:geothermal", {
description = "Geothermal Generator",
tiles = {"technic_geothermal_top.png", "technic_machine_bottom.png", "technic_geothermal_side.png",
"technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
technic_power_machine=1,
internal_EU_buffer=0;
internal_EU_buffer_size=5000;
burn_time=0;
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "Geothermal Generator")
meta:set_float("technic_power_machine", 1)
meta:set_float("internal_EU_buffer", 0)
meta:set_float("internal_EU_buffer_size", 2000)
meta:set_string("formspec", geothermal_formspec)
end,
})
minetest.register_node("technic:geothermal_active", {
description = "Geothermal Generator",
tiles = {"technic_geothermal_top_active.png", "technic_machine_bottom.png", "technic_geothermal_side.png",
"technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
drop="technic:geothermal",
technic_power_machine=1,
internal_EU_buffer=0;
internal_EU_buffer_size=0;
})
minetest.register_abm({
nodenames = {"technic:geothermal","technic:geothermal_active"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
local charge= meta:get_float("internal_EU_buffer")
local max_charge= meta:get_float("internal_EU_buffer_size")
local water_nodes = 0
local lava_nodes = 0
local production_level=0
local load_step=0
pos.x=pos.x+1
local check=check_node_around (pos)
if check==1 then water_nodes=water_nodes+1 end
if check==2 then lava_nodes=lava_nodes+1 end
pos.x=pos.x-2
check=check_node_around (pos)
if check==1 then water_nodes=water_nodes+1 end
if check==2 then lava_nodes=lava_nodes+1 end
pos.x=pos.x+1
pos.z=pos.z+1
check=check_node_around (pos)
if check==1 then water_nodes=water_nodes+1 end
if check==2 then lava_nodes=lava_nodes+1 end
pos.z=pos.z-2
check=check_node_around (pos)
if check==1 then water_nodes=water_nodes+1 end
if check==2 then lava_nodes=lava_nodes+1 end
pos.z=pos.z+1
if water_nodes==1 and lava_nodes==1 then production_level=50 load_step=30 end
if water_nodes==2 and lava_nodes==1 then production_level=75 load_step=45 end
if water_nodes==1 and lava_nodes==2 then production_level=75 load_step=45 end
if water_nodes==2 and lava_nodes==2 then production_level=100 load_step=60 end
if water_nodes==3 and lava_nodes==1 then production_level=25 load_step=15 end
if water_nodes==1 and lava_nodes==3 then production_level=25 load_step=15 end
if production_level>0 then
if charge+load_step>max_charge then
load_step=max_charge-charge
end
if load_step>0 then
charge=charge+load_step
meta:set_float("internal_EU_buffer",charge)
end
end
local load = math.floor((charge/max_charge)*100)
meta:set_string("formspec",
"invsize[8,4;]"..
"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
(load)..":technic_power_meter_fg.png]"..
"label[0,0;Geothermal Generator]"..
"label[1,3;Power level]"..
"label[4,0;Production at "..tostring(production_level).."%]"
)
if production_level>0 and minetest.env:get_node(pos).name=="technic:geothermal" then
hacky_swap_node (pos,"technic:geothermal_active")
return
end
if production_level==0 then hacky_swap_node (pos,"technic:geothermal") end
end
})
function check_node_around (pos)
local node=minetest.env:get_node(pos)
if node.name=="default:water_source" or node.name=="default:water_flowing" then return 1 end
if node.name=="default:lava_source" or node.name=="default:lava_flowing" then return 2 end
return 0
end

View File

@ -0,0 +1,611 @@
local chest_mark_colors = {
'_black',
'_blue',
'_brown',
'_cyan',
'_dark_green',
'_dark_grey',
'_green',
'_grey',
'_magenta',
'_orange',
'_pink',
'_red',
'_violet',
'_white',
'_yellow',
}
minetest.register_craft({
output = 'technic:gold_chest 1',
recipe = {
{'moreores:gold_ingot','moreores:gold_ingot','moreores:gold_ingot'},
{'moreores:gold_ingot','technic:silver_chest','moreores:gold_ingot'},
{'moreores:gold_ingot','moreores:gold_ingot','moreores:gold_ingot'},
}
})
minetest.register_craft({
output = 'technic:gold_locked_chest 1',
recipe = {
{'moreores:gold_ingot','moreores:gold_ingot','moreores:gold_ingot'},
{'moreores:gold_ingot','technic:silver_locked_chest','moreores:gold_ingot'},
{'moreores:gold_ingot','moreores:gold_ingot','moreores:gold_ingot'},
}
})
minetest.register_craft({
output = 'technic:gold_locked_chest 1',
recipe = {
{'default:steel_ingot'},
{'technic:gold_chest'},
}
})
minetest.register_craftitem("technic:gold_chest", {
description = "Gold Chest",
stack_max = 99,
})
minetest.register_craftitem("technic:gold_locked_chest", {
description = "Gold Locked Chest",
stack_max = 99,
})
minetest.register_node("technic:gold_chest", {
description = "Gold Chest",
tiles = {"technic_gold_chest_top.png", "technic_gold_chest_top.png", "technic_gold_chest_side.png",
"technic_gold_chest_side.png", "technic_gold_chest_side.png", "technic_gold_chest_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,tubedevice=1,tubedevice_receiver=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[12,9;]"..
"list[current_name;main;0,0;12,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Gold Chest")
local inv = meta:get_inventory()
inv:set_size("main", 12*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_punch = function (pos, node, puncher)
chest_punched (pos,node,puncher);
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.env:get_meta(pos);
fields.text = fields.text or ""
meta:set_string("text", fields.text)
meta:set_string("infotext", '"'..fields.text..'"')
meta:set_string("formspec",
"invsize[12,9;]"..
"list[current_name;main;0,0;12,4;]"..
"list[current_player;main;0,5;8,4;]")
end,
on_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_move_allow_all(
pos, from_list, from_index, to_list, to_index, count, player)
end,
on_metadata_inventory_offer = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_offer_allow_all(
pos, listname, index, stack, player)
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from chest at "..minetest.pos_to_string(pos))
end,
})
for i, state in ipairs(chest_mark_colors) do
minetest.register_node("technic:gold_chest".. state, {
description = "Gold Chest",
tiles = {"technic_gold_chest_top.png", "technic_gold_chest_top.png", "technic_gold_chest_side.png",
"technic_gold_chest_side.png", "technic_gold_chest_side.png", "technic_gold_chest_front"..state..".png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, not_in_creative_inventory=1,tubedevice=1,tubedevice_receiver=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
drop = "technic:gold_chest",
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[12,9;]"..
"list[current_name;main;0,0;12,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Gold Chest")
local inv = meta:get_inventory()
inv:set_size("main", 12*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_punch = function (pos, node, puncher)
chest_punched (pos,node,puncher);
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.env:get_meta(pos);
fields.text = fields.text or ""
meta:set_string("text", fields.text)
meta:set_string("infotext", '"'..fields.text..'"')
meta:set_string("formspec",
"invsize[12,9;]"..
"list[current_name;main;0,0;12,4;]"..
"list[current_player;main;0,5;8,4;]")
end,
on_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_move_allow_all(
pos, from_list, from_index, to_list, to_index, count, player)
end,
on_metadata_inventory_offer = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_offer_allow_all(
pos, listname, index, stack, player)
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from chest at "..minetest.pos_to_string(pos))
end,
})
end
local function has_locked_chest_privilege(meta, player)
if player:get_player_name() ~= meta:get_string("owner") then
return false
end
return true
end
minetest.register_node("technic:gold_locked_chest", {
description = "Gold Locked Chest",
tiles = {"technic_gold_chest_top.png", "technic_gold_chest_top.png", "technic_gold_chest_side.png",
"technic_gold_chest_side.png", "technic_gold_chest_side.png", "technic_gold_chest_locked.png"},
paramtype2 = "facedir",
drop = "technic:gold_locked_chest",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,tubedevice=1,tubedevice_receiver=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
local meta = minetest.env:get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", "Gold Locked Chest (owned by "..
meta:get_string("owner")..")")
end,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[12,9;]"..
"list[current_name;main;0,0;12,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Gold Locked Chest")
meta:set_string("owner", "")
local inv = meta:get_inventory()
inv:set_size("main", 12*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_punch = function (pos, node, puncher)
local meta = minetest.env:get_meta(pos);
if (has_locked_chest_privilege(meta, puncher)) then
locked_chest_punched (pos,node,puncher);
end
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.env:get_meta(pos);
fields.text = fields.text or ""
meta:set_string("text", fields.text)
meta:set_string("infotext", '"'..fields.text..'"')
meta:set_string("formspec",
"invsize[12,9;]"..
"list[current_name;main;0,0;12,4;]"..
"list[current_player;main;0,5;8,4;]")
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return count
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from locked chest at "..minetest.pos_to_string(pos))
end,
})
for i, state in ipairs(chest_mark_colors) do
minetest.register_node("technic:gold_locked_chest".. state, {
description = "Gold Locked Chest",
tiles = {"technic_gold_chest_top.png", "technic_gold_chest_top.png", "technic_gold_chest_side.png",
"technic_gold_chest_side.png", "technic_gold_chest_side.png", "technic_gold_chest_locked"..state..".png"},
paramtype2 = "facedir",
drop = "technic:gold_locked_chest",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, not_in_creative_inventory=1,tubedevice=1,tubedevice_receiver=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
local meta = minetest.env:get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", "Gold Locked Chest (owned by "..
meta:get_string("owner")..")")
end,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[12,9;]"..
"list[current_name;main;0,0;12,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Gold Locked Chest")
meta:set_string("owner", "")
local inv = meta:get_inventory()
inv:set_size("main", 12*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_punch = function (pos, node, puncher)
local meta = minetest.env:get_meta(pos);
if (has_locked_chest_privilege(meta, puncher)) then
locked_chest_punched (pos,node,puncher);
end
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.env:get_meta(pos);
fields.text = fields.text or ""
meta:set_string("text", fields.text)
meta:set_string("infotext", '"'..fields.text..'"')
meta:set_string("formspec",
"invsize[12,9;]"..
"list[current_name;main;0,0;12,4;]"..
"list[current_player;main;0,5;8,4;]")
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return count
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from locked chest at "..minetest.pos_to_string(pos))
end,
})
end
function chest_punched (pos,node,puncher)
local player_tool = puncher:get_wielded_item();
local item=player_tool:get_name();
if item == "dye:black" then
if (hacky_swap_node(pos,"technic:gold_chest_black")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:blue" then
if (hacky_swap_node(pos,"technic:gold_chest_blue")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:brown" then
if (hacky_swap_node(pos,"technic:gold_chest_brown")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:cyan" then
if (hacky_swap_node(pos,"technic:gold_chest_cyan")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:dark_green" then
if (hacky_swap_node(pos,"technic:gold_chest_dark_green")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:dark_grey" then
if (hacky_swap_node(pos,"technic:gold_chest_dark_grey")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:green" then
if (hacky_swap_node(pos,"technic:gold_chest_green")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:grey" then
if (hacky_swap_node(pos,"technic:gold_chest_grey")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:magenta" then
if (hacky_swap_node(pos,"technic:gold_chest_magenta")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:orange" then
if (hacky_swap_node(pos,"technic:gold_chest_orange")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:pink" then
if (hacky_swap_node(pos,"technic:gold_chest_pink")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:red" then
if (hacky_swap_node(pos,"technic:gold_chest_red")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:violet" then
if (hacky_swap_node(pos,"technic:gold_chest_violet")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:white" then
if (hacky_swap_node(pos,"technic:gold_chest_white")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:yellow" then
if (hacky_swap_node(pos,"technic:gold_chest_yellow")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
local meta = minetest.env:get_meta(pos);
meta:set_string("formspec", "hack:sign_text_input")
end
function locked_chest_punched (pos,node,puncher)
local player_tool = puncher:get_wielded_item();
local item=player_tool:get_name();
if item == "dye:black" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_black")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:blue" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_blue")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:brown" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_brown")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:cyan" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_cyan")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:dark_green" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_dark_green")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:dark_grey" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_dark_grey")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:green" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_green")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:grey" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_grey")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:magenta" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_magenta")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:orange" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_orange")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:pink" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_pink")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:red" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_red")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:violet" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_violet")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:white" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_white")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
if item == "dye:yellow" then
if (hacky_swap_node(pos,"technic:gold_locked_chest_yellow")) then
player_tool:take_item(1);
puncher:set_wielded_item(player_tool);
return
end
end
local meta = minetest.env:get_meta(pos);
meta:set_string("formspec", "hack:sign_text_input")
end

326
technic/technic/grinder.lua Normal file
View File

@ -0,0 +1,326 @@
grinder_recipes ={}
registered_grinder_recipes_count=1
function register_grinder_recipe (string1,string2)
grinder_recipes[registered_grinder_recipes_count]={}
grinder_recipes[registered_grinder_recipes_count].src_name=string1
grinder_recipes[registered_grinder_recipes_count].dst_name=string2
registered_grinder_recipes_count=registered_grinder_recipes_count+1
if UI_recipes_hook then
minetest.register_craft({
type = "grinding",
output = string2,
recipe = string1,
})
end
end
register_grinder_recipe("default:stone","default:sand")
register_grinder_recipe("default:cobble","default:gravel")
register_grinder_recipe("default:gravel","default:dirt")
register_grinder_recipe("default:desert_stone","default:desert_sand")
register_grinder_recipe("default:iron_lump","technic:iron_dust 2")
register_grinder_recipe("default:coal_lump","technic:coal_dust 2")
register_grinder_recipe("moreores:copper_lump","technic:copper_dust 2")
register_grinder_recipe("moreores:tin_lump","technic:tin_dust 2")
register_grinder_recipe("moreores:silver_lump","technic:silver_dust 2")
register_grinder_recipe("moreores:gold_lump","technic:gold_dust 2")
register_grinder_recipe("moreores:mithril_lump","technic:mithril_dust 2")
register_grinder_recipe("technic:chromium_lump","technic:chromium_dust 2")
register_grinder_recipe("technic:zinc_lump","technic:zinc_dust 2")
register_grinder_recipe("technic:coal_dust","dye:black 2")
register_grinder_recipe("default:cactus","dye:green 2")
register_grinder_recipe("default:dry_shrub","dye:brown 2")
register_grinder_recipe("flowers:flower_geranium","dye:blue 2")
register_grinder_recipe("flowers:flower_dandelion_white","dye:white 2")
register_grinder_recipe("flowers:flower_dandelion_yellow","dye:yellow 2")
register_grinder_recipe("flowers:flower_tulip","dye:orange 2")
register_grinder_recipe("flowers:flower_rose","dye:red 2")
register_grinder_recipe("flowers:flower_viola","dye:violet 2")
minetest.register_craftitem( "technic:coal_dust", {
description = "Coal Dust",
inventory_image = "technic_coal_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craftitem( "technic:iron_dust", {
description = "Iron Dust",
inventory_image = "technic_iron_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
type = "cooking",
output = "default:steel_ingot",
recipe = "technic:iron_dust",
})
minetest.register_craftitem( "technic:copper_dust", {
description = "Copper Dust",
inventory_image = "technic_copper_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
type = "cooking",
output = "moreores:copper_ingot",
recipe = "technic:copper_dust",
})
minetest.register_craftitem( "technic:tin_dust", {
description = "Tin Dust",
inventory_image = "technic_tin_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
type = "cooking",
output = "moreores:tin_ingot",
recipe = "technic:tin_dust",
})
minetest.register_craftitem( "technic:silver_dust", {
description = "Silver Dust",
inventory_image = "technic_silver_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
type = "cooking",
output = "moreores:silver_ingot",
recipe = "technic:silver_dust",
})
minetest.register_craftitem( "technic:gold_dust", {
description = "Gold Dust",
inventory_image = "technic_gold_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
type = "cooking",
output = "moreores:gold_ingot",
recipe = "technic:gold_dust",
})
minetest.register_craftitem( "technic:mithril_dust", {
description = "Mithril Dust",
inventory_image = "technic_mithril_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
type = "cooking",
output = "moreores:mithril_ingot",
recipe = "technic:mithril_dust",
})
minetest.register_craftitem( "technic:chromium_dust", {
description = "Chromium Dust",
inventory_image = "technic_chromium_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
type = "cooking",
output = "technic:chromium_ingot",
recipe = "technic:chromium_dust",
})
minetest.register_craftitem( "technic:bronze_dust", {
description = "Bronze Dust",
inventory_image = "technic_bronze_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
type = "cooking",
output = "moreores:bronze_ingot",
recipe = "technic:bronze_dust",
})
minetest.register_craftitem( "technic:brass_dust", {
description = "Brass Dust",
inventory_image = "technic_brass_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
type = "cooking",
output = "technic:brass_ingot",
recipe = "technic:brass_dust",
})
minetest.register_craftitem( "technic:stainless_steel_dust", {
description = "Stainless Steel Dust",
inventory_image = "technic_stainless_steel_dust.png",
})
minetest.register_craft({
type = "cooking",
output = "technic:stainless_steel_ingot",
recipe = "technic:stainless_steel_dust",
})
minetest.register_craftitem( "technic:zinc_dust", {
description = "Zinc Dust",
inventory_image = "technic_zinc_dust.png",
})
minetest.register_craft({
type = "cooking",
output = "technic:zinc_ingot",
recipe = "technic:zinc_dust",
})
minetest.register_alias("grinder", "technic:grinder")
minetest.register_craft({
output = 'technic:grinder',
recipe = {
{'default:desert_stone', 'default:desert_stone', 'default:desert_stone'},
{'default:desert_stone', 'technic:diamond', 'default:desert_stone'},
{'default:stone', 'moreores:copper_ingot', 'default:stone'},
}
})
minetest.register_craftitem("technic:grinder", {
description = "Grinder",
stack_max = 99,
})
grinder_formspec =
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
"label[0,0;Grinder]"..
"label[1,3;Power level]"..
"list[current_name;src;3,1;1,1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:grinder", {
description = "Grinder",
tiles = {"technic_grinder_top.png", "technic_machine_bottom.png", "technic_grinder_side.png",
"technic_grinder_side.png", "technic_grinder_side.png", "technic_grinder_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
technic_power_machine=1,
internal_EU_buffer=0;
internal_EU_buffer_size=5000;
grind_time=0;
grinded = nil;
src_time = 0;
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "Grinder")
meta:set_float("technic_power_machine", 1)
meta:set_float("internal_EU_buffer", 0)
meta:set_float("internal_EU_buffer_size", 5000)
meta:set_string("formspec", grinder_formspec)
meta:set_float("grind_time", 0)
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("src") then
return false
end
if not inv:is_empty("dst") then
return false
end
return true
end,
})
minetest.register_abm({
nodenames = {"technic:grinder"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
local charge= meta:get_float("internal_EU_buffer")
local max_charge= meta:get_float("internal_EU_buffer_size")
local grind_cost=200
local load = math.floor((charge/max_charge)*100)
meta:set_string("formspec",
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
(load)..":technic_power_meter_fg.png]"..
"label[0,0;Grinder]"..
"label[1,3;Power level]"..
"list[current_name;src;3,1;1,1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]"
)
local inv = meta:get_inventory()
-- local grinder_on = meta:get_float("grinder_on")
local srclist = inv:get_list("src")
if inv:is_empty("src") then meta:set_float("grinder_on",0) end
if (meta:get_float("grinder_on") == 1) then
if charge>=grind_cost then
charge=charge-grind_cost;
meta:set_float("internal_EU_buffer",charge)
meta:set_float("src_time", meta:get_float("src_time") + 1)
if meta:get_float("src_time") >= meta:get_float("grind_time") then
-- check if there's room for output in "dst" list
grinded = get_grinded_item (inv:get_stack("src", 1))
if inv:room_for_item("dst",grinded) then
-- Put result in "dst" list
inv:add_item("dst", grinded)
-- take stuff from "src" list
srcstack = inv:get_stack("src", 1)
srcstack:take_item()
inv:set_stack("src", 1, srcstack)
if inv:is_empty("src") then meta:set_float("grinder_on",0) end
else
print("Grinder inventory full!")
end
meta:set_float("src_time", 0)
end
end
end
if (meta:get_float("grinder_on")==0) then
local grinded=nil
if not inv:is_empty("src") then
grinded = get_grinded_item (inv:get_stack("src", 1))
if grinded then meta:set_float("grinder_on",1) end
grind_time=4
meta:set_float("grind_time",grind_time)
meta:set_float("src_time", 0)
return
end
end
end
})
function get_grinded_item (items)
new_item =nil
src_item=items:to_table()
item_name=src_item["name"]
local counter=registered_grinder_recipes_count-1
for i=1, counter,1 do
if grinder_recipes[i].src_name==item_name then return ItemStack(grinder_recipes[i].dst_name) end
end
return nil
end

View File

@ -0,0 +1,55 @@
register_grinder_recipe("gloopores:alatro_lump","technic:alatro_dust 2")
register_grinder_recipe("gloopores:kalite_lump","technic:kalite_dust 2")
register_grinder_recipe("gloopores:arol_lump","technic:arol_dust 2")
register_grinder_recipe("gloopores:talinite_lump","technic:talinite_dust 2")
register_grinder_recipe("gloopores:akalin_lump","technic:akalin_dust 2")
 
minetest.register_craftitem("technic:alatro_dust", {
        description = "Alatro Dust",
        inventory_image = "technic_alatro_dust.png",
})
 
minetest.register_craft({
    type = "cooking",
    output = "gloopores:alatro_ingot",
    recipe = "technic:alatro_dust",
})
 
minetest.register_craftitem("technicplus:arol_dust", {
        description = "Arol Dust",
        inventory_image = "technic_arol_dust.png",
})
 
minetest.register_craft({
    type = "cooking",
    output = "gloopores:arol_ingot",
    recipe = "technic:arol_dust",
})
 
minetest.register_craftitem("technic:talinite_dust", {
        description = "Talinite Dust",
        inventory_image = "technic_talinite_dust.png",
})
 
minetest.register_craft({
    type = "cooking",
    output = "gloopores:talinite_ingot",
    recipe = "technic:talinite_dust",
})
 
minetest.register_craftitem("technic:akalin_dust", {
        description = "Akalin Dust",
        inventory_image = "technic_akalin_dust.png",
})
 
minetest.register_craft({
    type = "cooking",
    output = "gloopores:akalin_ingot",
    recipe = "technic:akalin_dust",
})
 
minetest.register_craftitem("technic:kalite_dust", {
        description = "Kalite Dust",
        inventory_image = "technic_kalite_dust.png",
        on_use = minetest.item_eat(2)
})

96
technic/technic/init.lua Normal file
View File

@ -0,0 +1,96 @@
-- Minetest 0.4.4 : technic
minetest.register_alias("rebar", "technic:rebar")
minetest.register_alias("concrete", "technic:concrete")
minetest.register_alias("concrete_post", "technic:concrete_post")
minetest.register_alias("iron_chest", "technic:iron_chest")
minetest.register_alias("iron_locked_chest", "technic:iron_locked_chest")
minetest.register_alias("copper_chest", "technic:copper_chest")
minetest.register_alias("copper_locked_chest", "technic:copper_locked_chest")
minetest.register_alias("silver_chest", "technic:silver_chest")
minetest.register_alias("silver_locked_chest", "technic:silver_locked_chest")
minetest.register_alias("gold_chest", "technic:gold_chest")
minetest.register_alias("gold_locked_chest", "technic:gold_locked_chest")
minetest.register_alias("mithril_chest", "technic:mithril_chest")
minetest.register_alias("mithril_locked_chest", "technic:mithril_locked_chest")
modpath=minetest.get_modpath("technic")
--Read technic config file
dofile(modpath.."/config.lua")
-- world gen
dofile(modpath.."/ores.lua")
if enable_rubber_tree_generation==true then dofile(modpath.."/rubber.lua") end
-- chests
dofile(modpath.."/iron_chest.lua")
dofile(modpath.."/copper_chest.lua")
dofile(modpath.."/silver_chest.lua")
dofile(modpath.."/gold_chest.lua")
dofile(modpath.."/mithril_chest.lua")
--items
dofile(modpath.."/concrete.lua")
dofile(modpath.."/items.lua")
--LV machines
dofile(modpath.."/alloy_furnace.lua")
dofile(modpath.."/solar_panel.lua")
dofile(modpath.."/geothermal.lua")
dofile(modpath.."/water_mill.lua")
dofile(modpath.."/electric_furnace.lua")
dofile(modpath.."/battery_box.lua")
dofile(modpath.."/wires.lua")
dofile(modpath.."/tool_workshop.lua")
dofile(modpath.."/music_player.lua")
dofile(modpath.."/generator.lua")
dofile(modpath.."/grinder.lua")
--MV machines
dofile(modpath.."/wires_mv.lua")
dofile(modpath.."/solar_panel_mv.lua")
dofile(modpath.."/battery_box_mv.lua")
--Tools
if enable_mining_dril==true then dofile(modpath.."/mining_drill.lua") end
if enable_mining_laser==true then dofile(modpath.."/mining_laser_mk1.lua") end
if enable_flashlight==true then dofile(modpath.."/flashlight.lua") end
dofile(modpath.."/cans.lua")
dofile(modpath.."/chainsaw.lua")
dofile(modpath.."/tree_tap.lua")
dofile(modpath.."/screwdriver.lua")
dofile(modpath.."/sonic_screwdriver.lua")
-- mesecons and tubes related
dofile(modpath.."/injector.lua")
dofile(modpath.."/node_breaker.lua")
dofile(modpath.."/deployer.lua")
dofile(modpath.."/constructor.lua")
if enable_item_drop then dofile(modpath.."/item_drop.lua") end
if enable_item_pickup then dofile(modpath.."/item_pickup.lua") end
function has_locked_chest_privilege(meta, player)
if player:get_player_name() ~= meta:get_string("owner") then
return false
end
return true
end
function hacky_swap_node(pos,name)
local node = minetest.env:get_node(pos)
local meta = minetest.env:get_meta(pos)
local meta0 = meta:to_table()
if node.name == name then
return nil
end
node.name = name
local meta0 = meta:to_table()
minetest.env:set_node(pos,node)
meta = minetest.env:get_meta(pos)
meta:from_table(meta0)
return 1
end

View File

@ -0,0 +1,325 @@
minetest.register_craftitem("technic:injector", {
description = "Injector",
stack_max = 99,
})
minetest.register_node("technic:injector", {
description = "Injector",
tiles = {"technic_iron_chest_top.png", "technic_iron_chest_top.png", "technic_iron_chest_side.png",
"technic_iron_chest_side.png", "technic_iron_chest_side.png", "technic_iron_chest_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[9,9;]"..
"list[current_name;main;0,2;8,2;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Injector")
local inv = meta:get_inventory()
inv:set_size("main", 8*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_punch = function (pos, node, puncher)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
for _,stack in ipairs(inv:get_list("main")) do
if stack:get_name() ~="" then
inv:remove_item("main",stack)
pos1=pos
pos1.y=pos1.y
local x=pos1.x+1.5
local z=pos1.z
item1=tube_item({x=pos1.x,y=pos1.y,z=pos1.z},stack)
item1:get_luaentity().start_pos = {x=pos1.x,y=pos1.y,z=pos1.z}
item1:setvelocity({x=1, y=0, z=0})
item1:setacceleration({x=0, y=0, z=0})
return
end
end
end,
})
function tube_item(pos, item)
local TUBE_nodes = {}
local CHEST_nodes = {}
TUBE_nodes[1]={}
TUBE_nodes[1].x=pos.x
TUBE_nodes[1].y=pos.y
TUBE_nodes[1].z=pos.z
table_index=1
repeat
check_TUBE_node (TUBE_nodes,CHEST_nodes,table_index)
table_index=table_index+1
if TUBE_nodes[table_index]==nil then break end
until false
found=table_index-1
print("Found "..found.." tubes connected")
print(dump(CHEST_nodes))
-- Take item in any format
local stack = ItemStack(item)
local obj = minetest.env:add_entity(pos, "technic:tubed_item")
obj:get_luaentity():set_item(stack:to_string())
return obj
end
minetest.register_entity("technic:tubed_item", {
initial_properties = {
hp_max = 1,
physical = false,
collisionbox = {0,0,0,0,0,0},
visual = "sprite",
visual_size = {x=0.5, y=0.5},
textures = {""},
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
is_visible = false,
start_pos={},
route={}
},
itemstring = '',
physical_state = false,
set_item = function(self, itemstring)
self.itemstring = itemstring
local stack = ItemStack(itemstring)
local itemtable = stack:to_table()
local itemname = nil
if itemtable then
itemname = stack:to_table().name
end
local item_texture = nil
local item_type = ""
if minetest.registered_items[itemname] then
item_texture = minetest.registered_items[itemname].inventory_image
item_type = minetest.registered_items[itemname].type
end
prop = {
is_visible = true,
visual = "sprite",
textures = {"unknown_item.png"}
}
if item_texture and item_texture ~= "" then
prop.visual = "sprite"
prop.textures = {item_texture}
prop.visual_size = {x=0.3, y=0.3}
else
prop.visual = "wielditem"
prop.textures = {itemname}
prop.visual_size = {x=0.15, y=0.15}
end
self.object:set_properties(prop)
end,
get_staticdata = function(self)
return minetest.serialize({
itemstring=self.itemstring,
velocity=self.object:getvelocity(),
start_pos=self.start_pos
})
end,
on_activate = function(self, staticdata)
-- print (dump(staticdata))
if staticdata=="" or staticdata==nil then return end
local item = minetest.deserialize(staticdata)
local stack = ItemStack(item.itemstring)
local itemtable = stack:to_table()
local itemname = nil
if itemtable then
itemname = stack:to_table().name
end
if itemname then
self.start_pos=item.start_pos
self.object:setvelocity(item.velocity)
self.object:setacceleration({x=0, y=0, z=0})
self.object:setpos(item.start_pos)
end
self:set_item(item.itemstring)
end,
on_step = function(self, dtime)
if self.start_pos then
local pos = self.object:getpos()
local node = minetest.env:get_node(pos)
local meta = minetest.env:get_meta(pos)
tubelike=meta:get_int("tubelike")
local stack = ItemStack(self.itemstring)
local drop_pos=nil
local velocity=self.object:getvelocity()
if velocity==nil then print ("wypadl") return end
if math.abs(velocity.x)==1 then
local next_node=math.abs(pos.x-self.start_pos.x)
if next_node >= 1 then
self.start_pos.x=self.start_pos.x+velocity.x
if check_pos_vector (self.start_pos, velocity)==0 then
if check_next_step (self.start_pos, velocity)==0 then
drop_pos=minetest.env:find_node_near({x=self.start_pos.x,y=self.start_pos.y,z=self.start_pos.z+velocity.x}, 1, "air")
if drop_pos then minetest.item_drop(stack, "", drop_pos) end
self.object:remove()
end
self.object:setpos(self.start_pos)
self.object:setvelocity(velocity)
return
end
end
end
if math.abs(velocity.y)==1 then
local next_node=math.abs(pos.y-self.start_pos.y)
if next_node >= 1 then
self.start_pos.y=self.start_pos.y+velocity.y
if check_pos_vector (self.start_pos, velocity)==0 then
if check_next_step (self.start_pos, velocity)==0 then
drop_pos=minetest.env:find_node_near({x=self.start_pos.x+velocity.x,y=self.start_pos.y+velocity.y,z=self.start_pos.z+velocity.z}, 1, "air")
if drop_pos then minetest.item_drop(stack, "", drop_pos) end
self.object:remove()
end
self.object:setpos(self.start_pos)
self.object:setvelocity(velocity)
return
end
end
end
if math.abs(velocity.z)==1 then
local next_node=math.abs(pos.z-self.start_pos.z)
if next_node >= 1 then
self.start_pos.z=self.start_pos.z+velocity.z
if check_pos_vector (self.start_pos, velocity)==0 then
if check_next_step (self.start_pos, velocity)==0 then
drop_pos=minetest.env:find_node_near({x=self.start_pos.x+velocity.x,y=self.start_pos.y+velocity.y,z=self.start_pos.z+velocity.z}, 1, "air")
if drop_pos then minetest.item_drop(stack, "", drop_pos) end
self.object:remove()
end
self.object:setpos(self.start_pos)
self.object:setvelocity(velocity)
return
end
end
end
end
end
})
function check_next_step (pos,velocity)
local meta
local tubelike
if velocity.x==0 then
meta = minetest.env:get_meta({x=pos.x-1,y=pos.y,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=-1 velocity.y=0 velocity.z=0 return 1 end
meta = minetest.env:get_meta({x=pos.x+1,y=pos.y,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=1 velocity.y=0 velocity.z=0 return 1 end
end
if velocity.z==0 then
meta = minetest.env:get_meta({x=pos.x,y=pos.y,z=pos.z+1})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=0 velocity.z=1 return 1 end
meta = minetest.env:get_meta({x=pos.x,y=pos.y,z=pos.z-1})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=0 velocity.z=-1 return 1 end
end
if velocity.y==0 then
meta = minetest.env:get_meta({x=pos.x,y=pos.y+1,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=1 velocity.z=0 return 1 end
meta = minetest.env:get_meta({x=pos.x,y=pos.y-1,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=-1 velocity.z=0 return 1 end
end
print ("spadl")
return 0
end
function check_pos_vector (pos,velocity)
added={}
added.x=pos.x+velocity.x
added.y=pos.y+velocity.y
added.z=pos.z+velocity.z
local meta=minetest.env:get_meta(added)
--print(dump(added).." : "..tubelike)
if meta:get_int("tubelike")==1 then return 1 end
return 0
end
function add_new_TUBE_node (TUBE_nodes,pos1,parent)
local i=1
repeat
if TUBE_nodes[i]==nil then break end
if pos1.x==TUBE_nodes[i].x and pos1.y==TUBE_nodes[i].y and pos1.z==TUBE_nodes[i].z then return false end
i=i+1
until false
TUBE_nodes[i]={}
TUBE_nodes[i].x=pos1.x
TUBE_nodes[i].y=pos1.y
TUBE_nodes[i].z=pos1.z
TUBE_nodes[i].parent_x=parent.x
TUBE_nodes[i].parent_y=parent.y
TUBE_nodes[i].parent_z=parent.z
return true
end
function check_TUBE_node (TUBE_nodes,CHEST_nodes,i)
local pos1={}
local parent={}
pos1.x=TUBE_nodes[i].x
pos1.y=TUBE_nodes[i].y
pos1.z=TUBE_nodes[i].z
parent.x=pos1.x
parent.y=pos1.y
parent.z=pos1.z
new_node_added=false
pos1.x=pos1.x+1
check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
pos1.x=pos1.x-2
check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
pos1.x=pos1.x+1
pos1.y=pos1.y+1
check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
pos1.y=pos1.y-2
check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
pos1.y=pos1.y+1
pos1.z=pos1.z+1
check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
pos1.z=pos1.z-2
check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
pos1.z=pos1.z+1
return new_node_added
end
function check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
meta = minetest.env:get_meta(pos1)
if meta:get_float("tubelike")==1 then add_new_TUBE_node(TUBE_nodes,pos1,parent) return end
nctr = minetest.env:get_node(pos1)
if minetest.get_item_group(nctr.name, "tubedevice_receiver") == 1 then add_new_TUBE_node(CHEST_nodes,pos1,parent) return end
end

View File

@ -0,0 +1,248 @@
minetest.register_craftitem("technic:injector", {
description = "Injector",
stack_max = 99,
})
minetest.register_node("technic:injector", {
description = "Injector",
tiles = {"technic_iron_chest_top.png", "technic_iron_chest_top.png", "technic_iron_chest_side.png",
"technic_iron_chest_side.png", "technic_iron_chest_side.png", "technic_iron_chest_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[9,9;]"..
"list[current_name;main;0,2;8,2;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Injector")
local inv = meta:get_inventory()
inv:set_size("main", 8*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_punch = function (pos, node, puncher)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
for _,stack in ipairs(inv:get_list("main")) do
if stack:get_name() ~="" then
inv:remove_item("main",stack)
item1=tube_item({x=pos.x+.5,y=pos.y,z=pos.z},stack)
return
end
end
end,
})
function tube_item(pos, item)
-- Take item in any format
local stack = ItemStack(item)
local obj = minetest.env:add_entity(pos, "technic:tubed_item")
obj:get_luaentity():set_item(stack:to_string())
obj:get_luaentity().start_pos = {x=pos.x,y=pos.y,z=pos.z}
obj:setacceleration({x=0, y=0, z=0})
pos.x=pos.x+1
local meta = minetest.env:get_meta(pos)
if meta:get_int("tubelike")==1 then obj:setvelocity({x=1, y=0, z=0}) return obj end
pos.x=pos.x-2
meta = minetest.env:get_meta(pos)
if meta:get_int("tubelike")==1 then obj:setvelocity({x=-1, y=0, z=0}) return obj end
pos.x=pos.x+1
pos.z=pos.z+1
meta = minetest.env:get_meta(pos)
if meta:get_int("tubelike")==1 then obj:setvelocity({x=0, y=0, z=1}) return obj end
pos.z=pos.z-2
meta = minetest.env:get_meta(pos)
if meta:get_int("tubelike")==1 then obj:setvelocity({x=0, y=0, z=-1}) return obj end
pos.z=pos.z+1
pos.y=pos.y+1
meta = minetest.env:get_meta(pos)
if meta:get_int("tubelike")==1 then obj:setvelocity({x=0, y=1, z=0}) return obj end
pos.y=pos.y-2
meta = minetest.env:get_meta(pos)
if meta:get_int("tubelike")==1 then obj:setvelocity({x=0, y=-2, z=0}) return obj end
pos.y=pos.y+1
return obj
end
minetest.register_entity("technic:tubed_item", {
initial_properties = {
hp_max = 1,
physical = false,
collisionbox = {0,0,0,0,0,0},
visual = "sprite",
visual_size = {x=0.5, y=0.5},
textures = {""},
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
is_visible = false,
start_pos={}
},
itemstring = '',
physical_state = false,
set_item = function(self, itemstring)
self.itemstring = itemstring
local stack = ItemStack(itemstring)
local itemtable = stack:to_table()
local itemname = nil
if itemtable then
itemname = stack:to_table().name
end
local item_texture = nil
local item_type = ""
if minetest.registered_items[itemname] then
item_texture = minetest.registered_items[itemname].inventory_image
item_type = minetest.registered_items[itemname].type
end
prop = {
is_visible = true,
visual = "sprite",
textures = {"unknown_item.png"}
}
if item_texture and item_texture ~= "" then
prop.visual = "sprite"
prop.textures = {item_texture}
prop.visual_size = {x=0.3, y=0.3}
else
prop.visual = "wielditem"
prop.textures = {itemname}
prop.visual_size = {x=0.15, y=0.15}
end
self.object:set_properties(prop)
end,
get_staticdata = function(self)
return minetest.serialize({
itemstring=self.itemstring,
velocity=self.object:getvelocity(),
start_pos=self.start_pos
})
end,
on_activate = function(self, staticdata)
if staticdata=="" or staticdata==nil then return end
local item = minetest.deserialize(staticdata)
local stack = ItemStack(item.itemstring)
local itemtable = stack:to_table()
local itemname = nil
if itemtable then
itemname = stack:to_table().name
end
if itemname then
self.start_pos=item.start_pos
self.object:setvelocity(item.velocity)
self.object:setacceleration({x=0, y=0, z=0})
self.object:setpos(item.start_pos)
end
self:set_item(item.itemstring)
end,
on_step = function(self, dtime)
if self.start_pos then
local pos = self.object:getpos()
local node = minetest.env:get_node(pos)
local meta = minetest.env:get_meta(pos)
tubelike=meta:get_int("tubelike")
local velocity=self.object:getvelocity()
if not velocity then return end
if math.abs(velocity.x)==1 then
local next_node=math.abs(pos.x-self.start_pos.x)
if next_node >= 1 then
self.start_pos.x=self.start_pos.x+velocity.x
if check_pos_vector (self.start_pos, velocity)==0 then
check_next_step (self.start_pos, velocity)
self.object:setpos(self.start_pos)
self.object:setvelocity(velocity)
return
end
end
end
if math.abs(velocity.y)==1 then
local next_node=math.abs(pos.y-self.start_pos.y)
if next_node >= 1 then
self.start_pos.y=self.start_pos.y+velocity.y
if check_pos_vector (self.start_pos, velocity)==0 then
check_next_step (self.start_pos, velocity)
self.object:setpos(self.start_pos)
self.object:setvelocity(velocity)
return
end
end
end
if math.abs(velocity.z)==1 then
local next_node=math.abs(pos.z-self.start_pos.z)
if next_node >= 1 then
self.start_pos.z=self.start_pos.z+velocity.z
if check_pos_vector (self.start_pos, velocity)==0 then
check_next_step (self.start_pos, velocity)
self.object:setpos(self.start_pos)
self.object:setvelocity(velocity)
return
end
end
end
end
end
})
function check_next_step (pos,velocity)
local meta
local tubelike
if velocity.x==0 then
meta = minetest.env:get_meta({x=pos.x-1,y=pos.y,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=-1 velocity.y=0 velocity.z=0 return end
meta = minetest.env:get_meta({x=pos.x+1,y=pos.y,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=1 velocity.y=0 velocity.z=0 return end
end
if velocity.z==0 then
meta = minetest.env:get_meta({x=pos.x,y=pos.y,z=pos.z+1})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=0 velocity.z=1 return end
meta = minetest.env:get_meta({x=pos.x,y=pos.y,z=pos.z-1})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=0 velocity.z=-1 return end
end
if velocity.y==0 then
meta = minetest.env:get_meta({x=pos.x,y=pos.y+1,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=1 velocity.z=0 return end
meta = minetest.env:get_meta({x=pos.x,y=pos.y-1,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=-1 velocity.z=0 return end
end
--velocity.x=0
--velocity.y=0
--velocity.z=0
end
function check_pos_vector (pos,velocity)
added={}
added.x=pos.x+velocity.x
added.y=pos.y+velocity.y
added.z=pos.z+velocity.z
local meta=minetest.env:get_meta(added)
--print(dump(added).." : "..tubelike)
if meta:get_int("tubelike")==1 then return 1 end
return 0
end

View File

@ -0,0 +1,163 @@
minetest.register_craft({
output = 'technic:iron_chest 1',
recipe = {
{'default:steel_ingot','default:steel_ingot','default:steel_ingot'},
{'default:steel_ingot','default:chest','default:steel_ingot'},
{'default:steel_ingot','default:steel_ingot','default:steel_ingot'},
}
})
minetest.register_craft({
output = 'technic:iron_locked_chest 1',
recipe = {
{'default:steel_ingot','default:steel_ingot','default:steel_ingot'},
{'default:steel_ingot','default:chest_locked','default:steel_ingot'},
{'default:steel_ingot','default:steel_ingot','default:steel_ingot'},
}
})
minetest.register_craft({
output = 'technic:iron_locked_chest 1',
recipe = {
{'default:steel_ingot'},
{'technic:iron_chest'},
}
})
minetest.register_craftitem("technic:iron_chest", {
description = "Iron Chest",
stack_max = 99,
})
minetest.register_craftitem("technic:iron_locked_chest", {
description = "Iron Locked Chest",
stack_max = 99,
})
minetest.register_alias("blabla", "technic:iron_chest")
minetest.register_node("technic:iron_chest", {
description = "Iron Chest",
tiles = {"technic_iron_chest_top.png", "technic_iron_chest_top.png", "technic_iron_chest_side.png",
"technic_iron_chest_side.png", "technic_iron_chest_side.png", "technic_iron_chest_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[9,9;]"..
"list[current_name;main;0,0;9,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Iron Chest")
local inv = meta:get_inventory()
inv:set_size("main", 9*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_move_allow_all(
pos, from_list, from_index, to_list, to_index, count, player)
end,
on_metadata_inventory_offer = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_offer_allow_all(
pos, listname, index, stack, player)
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from chest at "..minetest.pos_to_string(pos))
end,
})
local function has_locked_chest_privilege(meta, player)
if player:get_player_name() ~= meta:get_string("owner") then
return false
end
return true
end
minetest.register_node("technic:iron_locked_chest", {
description = "Iron Locked Chest",
tiles = {"technic_iron_chest_top.png", "technic_iron_chest_top.png", "technic_iron_chest_side.png",
"technic_iron_chest_side.png", "technic_iron_chest_side.png", "technic_iron_chest_locked.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
local meta = minetest.env:get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", "Locked Iron Chest (owned by "..
meta:get_string("owner")..")")
end,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[9,9;]"..
"list[current_name;main;0,0;9,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Iron Locked Chest")
meta:set_string("owner", "")
local inv = meta:get_inventory()
inv:set_size("main", 9*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return count
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from locked chest at "..minetest.pos_to_string(pos))
end,
})

View File

@ -0,0 +1,100 @@
-- This part written by PilzAdam (item_drop mod)
minetest.register_globalstep(function(dtime)
for _,player in ipairs(minetest.get_connected_players()) do
local pos = player:getpos()
pos.y = pos.y+0.5
local inv = player:get_inventory()
for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do
if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
inv:add_item("main", ItemStack(object:get_luaentity().itemstring))
if object:get_luaentity().itemstring ~= "" then
minetest.sound_play("item_drop_pickup", {
to_player = player:get_player_name(),
})
end
object:get_luaentity().itemstring = ""
object:remove()
end
end
end
for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 2)) do
if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
if object:get_luaentity().collect then
if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
local pos1 = pos
pos1.y = pos1.y+0.2
local pos2 = object:getpos()
local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z}
vec.x = vec.x*3
vec.y = vec.y*3
vec.z = vec.z*3
object:setvelocity(vec)
minetest.after(1, function(args)
local lua = object:get_luaentity()
if object == nil or lua == nil or lua.itemstring == nil then
return
end
if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
inv:add_item("main", ItemStack(object:get_luaentity().itemstring))
if object:get_luaentity().itemstring ~= "" then
minetest.sound_play("item_drop_pickup", {
to_player = player:get_player_name(),
})
end
object:get_luaentity().itemstring = ""
object:remove()
else
object:setvelocity({x=0,y=0,z=0})
end
end, {player, object})
end
end
end
end
end
end)
function minetest.handle_node_drops(pos, drops, digger)
for _,item in ipairs(drops) do
local count, name
if type(item) == "string" then
count = 1
name = item
else
count = item:get_count()
name = item:get_name()
end
for i=1,count do
local obj = minetest.env:add_item(pos, name)
if obj ~= nil then
obj:get_luaentity().collect = true
local x = math.random(1, 5)
if math.random(1,2) == 1 then
x = -x
end
local z = math.random(1, 5)
if math.random(1,2) == 1 then
z = -z
end
obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z})
-- FIXME this doesnt work for deactiveted objects
if minetest.setting_get("remove_items") and tonumber(minetest.setting_get("remove_items")) then
minetest.after(tonumber(minetest.setting_get("remove_items")), function(obj)
obj:remove()
end, obj)
end
end
end
end
end
if minetest.setting_get("log_mods") then
minetest.log("action", "item_drop loaded")
end

View File

@ -0,0 +1,63 @@
minetest.register_globalstep(function(dtime)
for _,player in ipairs(minetest.get_connected_players()) do
local pos = player:getpos()
pos.y = pos.y+0.5
local inv = player:get_inventory()
for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do
if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
inv:add_item("main", ItemStack(object:get_luaentity().itemstring))
if object:get_luaentity().itemstring ~= "" then
minetest.sound_play("item_drop_pickup", {
to_player = player:get_player_name(),
})
end
object:get_luaentity().itemstring = ""
object:remove()
end
end
end
for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 2)) do
if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
if object:get_luaentity().collect then
if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
local pos1 = pos
pos1.y = pos1.y+0.2
local pos2 = object:getpos()
local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z}
vec.x = vec.x*3
vec.y = vec.y*3
vec.z = vec.z*3
object:setvelocity(vec)
minetest.after(1, function(args)
local lua = object:get_luaentity()
if object == nil or lua == nil or lua.itemstring == nil then
return
end
if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
inv:add_item("main", ItemStack(object:get_luaentity().itemstring))
if object:get_luaentity().itemstring ~= "" then
minetest.sound_play("item_drop_pickup", {
to_player = player:get_player_name(),
})
end
object:get_luaentity().itemstring = ""
object:remove()
else
object:setvelocity({x=0,y=0,z=0})
end
end, {player, object})
end
else
minetest.after(0.5, function(entity)
entity.collect = true
end, object:get_luaentity())
end
end
end
end
end)

157
technic/technic/items.lua Normal file
View File

@ -0,0 +1,157 @@
minetest.register_craftitem( "technic:silicon_wafer", {
description = "Silicon Wafer",
inventory_image = "technic_silicon_wafer.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craftitem( "technic:doped_silicon_wafer", {
description = "Doped Silicon Wafer",
inventory_image = "technic_doped_silicon_wafer.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
output = 'pipeworks:tube_000000 9',
recipe = {
{'technic:stainless_steel_ingot', 'default:glass', 'technic:stainless_steel_ingot'},
{'technic:stainless_steel_ingot', 'default:glass', 'technic:stainless_steel_ingot'},
{'technic:stainless_steel_ingot', 'default:glass', 'technic:stainless_steel_ingot'},
}
})
minetest.register_craftitem( "technic:diamond_drill_head", {
description = "Diamond Drill Head",
inventory_image = "technic_diamond_drill_head.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
output = 'technic:diamond_drill_head',
recipe = {
{'technic:stainless_steel_ingot', 'technic:diamond', 'technic:stainless_steel_ingot'},
{'technic:diamond', '', 'technic:diamond'},
{'technic:stainless_steel_ingot', 'technic:diamond', 'technic:stainless_steel_ingot'},
}
})
minetest.register_craft({
output = 'technic:diamond_block',
recipe = {
{'technic:diamond', 'technic:diamond', 'technic:diamond'},
{'technic:diamond', 'technic:diamond', 'technic:diamond'},
{'technic:diamond', 'technic:diamond', 'technic:diamond'},
}
})
minetest.register_node( "technic:diamond_block", {
description = "Diamond Block",
tiles = { "technic_diamond_block.png" },
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
drop = 'craft "technic:diamond_block" 1',
})
minetest.register_craft({
output = 'technic:green_energy_crystal',
recipe = {
{'moreores:gold_ingot', 'technic:battery', 'dye:green'},
{'technic:battery', 'technic:red_energy_crystal', 'technic:battery'},
{'dye:green', 'technic:battery', 'moreores:gold_ingot'},
}
})
minetest.register_craft({
output = 'technic:blue_energy_crystal',
recipe = {
{'moreores:gold_ingot', 'technic:battery', 'dye:blue'},
{'technic:battery', 'technic:green_energy_crystal', 'technic:battery'},
{'dye:blue', 'technic:battery', 'moreores:gold_ingot'},
}
})
minetest.register_craft({
output = 'technic:red_energy_crystal',
recipe = {
{'moreores:gold_ingot', 'technic:battery', 'dye:red'},
{'technic:battery', 'technic:diamond_block', 'technic:battery'},
{'dye:red', 'technic:battery', 'moreores:gold_ingot'},
}
})
minetest.register_tool("technic:blue_energy_crystal",
{description = "Blue Energy Crystal",
inventory_image = minetest.inventorycube("technic_diamond_block_blue.png", "technic_diamond_block_blue.png", "technic_diamond_block_blue.png"),
tool_capabilities = {load=0,max_drop_level=0, groupcaps={fleshy={times={}, uses=10000, maxlevel=0}}}})
minetest.register_tool("technic:green_energy_crystal",
{description = "Green Energy Crystal",
inventory_image = minetest.inventorycube("technic_diamond_block_green.png", "technic_diamond_block_green.png", "technic_diamond_block_green.png"),
tool_capabilities = {load=0,max_drop_level=0, groupcaps={fleshy={times={}, uses=10000, maxlevel=0}}}})
minetest.register_tool("technic:red_energy_crystal",
{description = "Red Energy Crystal",
inventory_image = minetest.inventorycube("technic_diamond_block_red.png", "technic_diamond_block_red.png", "technic_diamond_block_red.png"),
tool_capabilities = {load=0,max_drop_level=0, groupcaps={fleshy={times={}, uses=10000, maxlevel=0}}}})
minetest.register_craftitem( "technic:fine_copper_wire", {
description = "Fine Copper Wire",
inventory_image = "technic_fine_copper_wire.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
output = 'technic:fine_copper_wire 2',
recipe = {
{'', 'moreores:copper_ingot', ''},
{'', 'moreores:copper_ingot', ''},
{'', 'moreores:copper_ingot', ''},
}
})
minetest.register_craftitem( "technic:copper_coil", {
description = "Copper Coil",
inventory_image = "technic_copper_coil.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
output = 'technic:copper_coil 1',
recipe = {
{'technic:fine_copper_wire', 'default:steel_ingot', 'technic:fine_copper_wire'},
{'default:steel_ingot', '', 'default:steel_ingot'},
{'technic:fine_copper_wire', 'default:steel_ingot', 'technic:fine_copper_wire'},
}
})
minetest.register_craftitem( "technic:motor", {
description = "Electric Motor",
inventory_image = "technic_motor.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
output = 'technic:motor',
recipe = {
{'default:steel_ingot', 'technic:copper_coil', 'default:steel_ingot'},
{'default:steel_ingot', 'technic:copper_coil', 'default:steel_ingot'},
{'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'},
}
})
minetest.register_craftitem( "technic:mv_transformer", {
description = "Medium Voltage Transformer",
inventory_image = "technic_mv_transformer.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
output = 'technic:mv_transformer',
recipe = {
{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
{'technic:copper_coil', 'default:steel_ingot', 'technic:copper_coil'},
{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
}
})

View File

@ -0,0 +1,49 @@
mining_drill_max_charge=60000
minetest.register_tool("technic:mining_drill", {
description = "Mining Drill",
inventory_image = "technic_mining_drill.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type=="node" then
item=itemstack:to_table()
if item["metadata"]=="" or item["metadata"]=="0" then return end --tool not charged
charge=tonumber(item["metadata"])
if charge-200>0 then
drill_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user)
charge =charge-200;
item["metadata"]=tostring(charge)
set_RE_wear(item,charge,mining_drill_max_charge)
itemstack:replace(item)
end
return itemstack
end
end,
})
minetest.register_craft({
output = 'technic:mining_drill',
recipe = {
{'technic:stainless_steel_ingot', 'technic:diamond_drill_head', 'technic:stainless_steel_ingot'},
{'technic:stainless_steel_ingot', 'technic:motor', 'technic:stainless_steel_ingot'},
{'', 'technic:red_energy_crystal', 'moreores:copper_ingot'},
}
})
function drill_dig_it (pos, player)
local node=minetest.env:get_node(pos)
if node.name == "air" or node.name == "ignore" then return end
if node.name == "default:lava_source" then return end
if node.name == "default:lava_flowing" then return end
if node.name == "default:water_source" then minetest.env:remove_node(pos) return end
if node.name == "default:water_flowing" then minetest.env:remove_node(pos) return end
minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,})
minetest.node_dig(pos,node,player)
end

View File

@ -0,0 +1,174 @@
laser_mk1_max_charge=40000
local laser_shoot = function(itemstack, player, pointed_thing)
local laser_straight_mode=0
local playerpos=player:getpos()
local dir=player:get_look_dir()
if pointed_thing.type=="node" then
pos=minetest.get_pointed_thing_position(pointed_thing, above)
local node = minetest.env:get_node(pos)
if node.name~="ignore" then
minetest.node_dig(pos,node,player)
end
laser_straight_mode=1
end
direction_y=math.abs(math.floor(dir.y*100))
if direction_y>50 then entity_name="technic:laser_beam_entityV"
else entity_name="technic:laser_beam_entity" end
if laser_straight_mode==1 then
pos1=minetest.get_pointed_thing_position(pointed_thing, under)
pos1.x=math.floor(pos1.x)
pos1.y=math.floor(pos1.y)
pos1.z=math.floor(pos1.z)
obj=minetest.env:add_entity(pos1,entity_name)
else
obj=minetest.env:add_entity({x=playerpos.x,y=playerpos.y+1.6,z=playerpos.z},entity_name)
end
if obj:get_luaentity().player == nil then
obj:get_luaentity().player = player
end
if laser_straight_mode==1 and direction_y<50 then
obj:setvelocity({x=dir.x*8, y=0, z=dir.z*8})
else if laser_straight_mode==1 and direction_y>50 then
obj:setvelocity({x=0, y=dir.y*8, z=dir.z*8})
end
end
if laser_straight_mode==0 then
obj:setvelocity({x=dir.x*8, y=dir.y*8, z=dir.z*8})
end
obj:setacceleration({x=0, y=0, z=0})
obj:setyaw(player:get_look_yaw()+math.pi)
if obj:get_luaentity().player == nil then
obj:get_luaentity().player = player
end
--obj:get_luaentity().node = player:get_inventory():get_stack("main", 1):get_name()
minetest.sound_play("technic_laser", {pos = playerpos, gain = 1.0, max_hear_distance = 10,})
return true
end
minetest.register_tool("technic:laser_mk1", {
description = "Mining Laser MK1",
inventory_image = "technic_mining_laser_mk1.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
item=itemstack:to_table()
if item["metadata"]=="" or item["metadata"]=="0" then return end
local charge=tonumber((item["metadata"]))
if charge-400>0 then
laser_shoot(item, user, pointed_thing)
charge =charge-400;
item["metadata"]=tostring(charge)
charge=set_RE_wear(item,charge,laser_mk1_max_charge)
itemstack:replace(item)
end
return itemstack
end,
})
minetest.register_craft({
output = 'technic:laser_mk1',
recipe = {
{'technic:diamond', 'default:steel_ingot', 'technic:battery'},
{'', 'default:steel_ingot', 'technic:battery'},
{'', '', 'moreores:copper_ingot'},
}
})
minetest.register_node("technic:laser_beam_box", {
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -0.5 , -0.1, -0.1 , 0.1 , 0.1 , 0.1 },
{ -0.1 , -0.1 , -0.1 , 0.5, 0.1 , 0.1 },
}
},
tiles = {"technic_laser_beam.png"},
groups = {not_in_creative_inventory=1},
})
minetest.register_node("technic:laser_beam_boxV", {
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -0.1 , -0.1 , -0.1 , 0.1 , 0.5, 0.1 },
{ -0.1 , -0.5, -0.1 , 0.1 , 0.1 , 0.1 },
}
},
tiles = {"technic_laser_beam.png"},
groups = {not_in_creative_inventory=1},
})
LASER_BEAM_ENTITY={
physical = false,
timer=0,
visual = "wielditem",
visual_size = {x=0.2, y=0.2},
textures = {"technic:laser_beam_box"},
lastpos={},
max_range=10,
count=0,
-- digger=nil,
collisionbox = {0,0,0,0,0,0},
}
LASER_BEAM_ENTITY.on_step = function(self, dtime)
self.timer=self.timer+dtime
local pos = self.object:getpos()
if self.player~=nil then if self.lastpos.x~=nil then lazer_it (pos, self.player) end end
if self.lastpos.x ~=nil and self.lastpos.y ~=nil and self.lastpos.y ~=nil then
temp1={x=math.floor(self.lastpos.x),y=math.floor(self.lastpos.y),z=math.floor(self.lastpos.z)}
temp2={x=math.floor(pos.x),y=math.floor(pos.y),z=math.floor(pos.z)}
if temp1.x==temp2.x and temp1.y==temp2.y and temp1.z==temp2.z then return end
end
self.lastpos={x=pos.x, y=pos.y, z=pos.z}
self.count=self.count+1
if self.count==self.max_range then self.object:remove() end
end
LASER_BEAM_ENTITYV={
physical = false,
timer=0,
visual = "wielditem",
visual_size = {x=0.2, y=0.2},
textures = {"technic:laser_beam_boxV"},
lastpos={},
max_range=15,
count=0,
collisionbox = {0,0,0,0,0,0},
}
LASER_BEAM_ENTITYV.on_step = function(self, dtime)
self.timer=self.timer+dtime
local pos = self.object:getpos()
if self.player~=nil then if self.lastpos.x~=nil then lazer_it (pos, self.player) end end
if self.lastpos.x ~=nil and self.lastpos.y ~=nil and self.lastpos.y ~=nil then
temp1={x=math.floor(self.lastpos.x),y=math.floor(self.lastpos.y),z=math.floor(self.lastpos.z)}
temp2={x=math.floor(pos.x),y=math.floor(pos.y),z=math.floor(pos.z)}
if temp1.x==temp2.x and temp1.y==temp2.y and temp1.z==temp2.z then return end
end
self.lastpos={x=pos.x, y=pos.y, z=pos.z}
self.count=self.count+1
if self.count==self.max_range then self.object:remove() end
end
minetest.register_entity("technic:laser_beam_entity", LASER_BEAM_ENTITY)
minetest.register_entity("technic:laser_beam_entityV", LASER_BEAM_ENTITYV)
function lazer_it (pos, player)
local pos1={}
-- pos1.x=math.floor(pos.x)
-- pos1.y=math.floor(pos.y)
-- pos1.z=math.floor(pos.z)
local node = minetest.env:get_node(pos)
if node.name == "air" or node.name == "ignore" or node.name == "default:lava_source" or node.name == "default:lava_flowing" then return end
if node.name == "default:water_source" or node.name == "default:water_flowing" then minetest.env:remove_node(pos) return end
if player then minetest.node_dig(pos,node,player) end
end

View File

@ -0,0 +1,145 @@
minetest.register_craft({
output = 'technic:mithril_chest 1',
recipe = {
{'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
{'moreores:mithril_ingot','technic:gold_chest','moreores:mithril_ingot'},
{'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
}
})
minetest.register_craft({
output = 'technic:mithril_locked_chest 1',
recipe = {
{'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
{'moreores:mithril_ingot','technic:gold_locked_chest','moreores:mithril_ingot'},
{'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
}
})
minetest.register_craft({
output = 'technic:mithril_locked_chest 1',
recipe = {
{'default:steel_ingot'},
{'technic:mithril_chest'},
}
})
minetest.register_node("technic:mithril_chest", {
description = "Mithril Chest",
tiles = {"technic_mithril_chest_top.png", "technic_mithril_chest_top.png", "technic_mithril_chest_side.png",
"technic_mithril_chest_side.png", "technic_mithril_chest_side.png", "technic_mithril_chest_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[13,9;]"..
"list[current_name;main;0,0;13,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Mithril Chest")
local inv = meta:get_inventory()
inv:set_size("main", 13*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_move_allow_all(
pos, from_list, from_index, to_list, to_index, count, player)
end,
on_metadata_inventory_offer = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_offer_allow_all(
pos, listname, index, stack, player)
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from chest at "..minetest.pos_to_string(pos))
end,
})
minetest.register_node("technic:mithril_locked_chest", {
description = "Mithril Locked Chest",
tiles = {"technic_mithril_chest_top.png", "technic_mithril_chest_top.png", "technic_mithril_chest_side.png",
"technic_mithril_chest_side.png", "technic_mithril_chest_side.png", "technic_mithril_chest_locked.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
local meta = minetest.env:get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", "Mithril Locked Chest (owned by "..
meta:get_string("owner")..")")
end,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[13,9;]"..
"list[current_name;main;0,0;13,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Mithril Locked Chest")
meta:set_string("owner", "")
local inv = meta:get_inventory()
inv:set_size("main", 13*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return count
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from locked chest at "..minetest.pos_to_string(pos))
end,
})

View File

@ -0,0 +1,145 @@
minetest.register_craft({
output = 'technic:mithril_chest 1',
recipe = {
{'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
{'moreores:mithril_ingot','technic:gold_chest','moreores:mithril_ingot'},
{'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
}
})
minetest.register_craft({
output = 'technic:mithril_locked_chest 1',
recipe = {
{'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
{'moreores:mithril_ingot','technic:gold_locked_chest','moreores:mithril_ingot'},
{'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
}
})
minetest.register_craft({
output = 'technic:mithril_locked_chest 1',
recipe = {
{'default:steel_ingot'},
{'technic:mithril_chest'},
}
})
minetest.register_node("technic:mithril_chest", {
description = "Mithril Chest",
tiles = {"technic_mithril_chest_top.png", "technic_mithril_chest_top.png", "technic_mithril_chest_side.png",
"technic_mithril_chest_side.png", "technic_mithril_chest_side.png", "technic_mithril_chest_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[13,9;]"..
"list[current_name;main;0,0;13,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Mithril Chest")
local inv = meta:get_inventory()
inv:set_size("main", 13*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_move_allow_all(
pos, from_list, from_index, to_list, to_index, count, player)
end,
on_metadata_inventory_offer = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_offer_allow_all(
pos, listname, index, stack, player)
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from chest at "..minetest.pos_to_string(pos))
end,
})
minetest.register_node("technic:mithril_locked_chest", {
description = "Mithril Locked Chest",
tiles = {"technic_mithril_chest_top.png", "technic_mithril_chest_top.png", "technic_mithril_chest_side.png",
"technic_mithril_chest_side.png", "technic_mithril_chest_side.png", "technic_mithril_chest_locked.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
local meta = minetest.env:get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", "Mithril Locked Chest (owned by "..
meta:get_string("owner")..")")
end,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[13,9;]"..
"list[current_name;main;0,0;13,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Mithril Locked Chest")
meta:set_string("owner", "")
local inv = meta:get_inventory()
inv:set_size("main", 13*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return count
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from locked chest at "..minetest.pos_to_string(pos))
end,
})

View File

@ -0,0 +1,126 @@
minetest.register_alias("music_player", "technic:music_player")
minetest.register_craft({
output = 'technic:music_player',
recipe = {
{'default:wood', 'default:wood', 'default:wood'},
{'technic:diamond', 'technic:diamond', 'technic:diamond'},
{'default:stone', 'moreores:copper_ingot', 'default:stone'},
}
})
minetest.register_craftitem("technic:music_player", {
description = "Music Player",
stack_max = 99,
})
music_player_formspec =
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
"label[0,0;Music Player]"..
"label[1,3;Power level]"..
"button[5,2;1,1;track1;1]"..
"button[6,2;1,1;track2;2]"
minetest.register_node("technic:music_player", {
description = "Music Player",
tiles = {"technic_music_player_top.png", "technic_machine_bottom.png", "technic_music_player_side.png",
"technic_music_player_side.png", "technic_music_player_side.png", "technic_music_player_side.png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
technic_power_machine=1,
internal_EU_buffer=0,
internal_EU_buffer_size=5000,
music_player_on=0,
music_playing =0,
music_handle = 0,
music_player_current_track =1,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "Music Player")
meta:set_float("technic_power_machine", 1)
meta:set_float("internal_EU_buffer", 1)
meta:set_float("internal_EU_buffer_size", 5000)
meta:set_string("formspec", music_player_formspec)
meta:set_float("music_player_on", 0)
meta:set_float("music_player_current_track", 1)
end,
on_receive_fields = function(pos, formanme, fields, sender)
local meta = minetest.env:get_meta(pos)
player_on=meta:get_float("music_player_on")
music_handle=meta:get_float("music_handle")
music_player_current_track=meta:get_float("music_player_current_track")
if fields.track1 then music_player_current_track=1 end
if fields.track2 then music_player_current_track=2 end
if fields.track3 then music_player_current_track=3 end
if fields.track4 then music_player_current_track=4 end
if fields.track5 then music_player_current_track=5 end
if fields.track6 then music_player_current_track=6 end
if fields.track7 then music_player_current_track=7 end
if fields.track8 then music_player_current_track=8 end
if fields.track9 then music_player_current_track=9 end
meta:set_float("music_player_current_track",music_player_current_track)
if fields.play and player_on==1 then
if music_handle then minetest.sound_stop(music_handle) end
music_handle=minetest.sound_play("technic_track"..music_player_current_track, {pos = pos, gain = 1.0,loop = true, max_hear_distance = 72,})
meta:set_float("music_playing",1)
end
if fields.stop then
meta:set_float("music_playing",0)
if music_handle then minetest.sound_stop(music_handle) end
end
meta:set_float("music_handle",music_handle)
end,
})
minetest.register_abm({
nodenames = {"technic:music_player"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
local charge= meta:get_float("internal_EU_buffer")
local max_charge= meta:get_float("internal_EU_buffer_size")
player_on=meta:get_float("music_player_on")
music_player_current_track=meta:get_float("music_player_current_track")
local play_cost=80
if charge>play_cost then
if meta:get_float("music_playing")==1 then charge=charge-play_cost end
meta:set_float("internal_EU_buffer",charge)
meta:set_float("music_player_on",1)
else
meta:set_float("music_playing",0)
meta:set_float("music_player_on",0)
if music_handle then minetest.sound_stop(music_handle) end
end
local load = math.floor((charge/max_charge)*100)
meta:set_string("formspec",
"invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
(load)..":technic_power_meter_fg.png]"..
"label[0,0;Music Player]"..
"label[1,3;Power level]"..
"button[4,1;1,1;track1;1]"..
"button[5,1;1,1;track2;2]"..
"button[6,1;1,1;track3;3]"..
"button[4,2;1,1;track4;4]"..
"button[5,2;1,1;track5;5]"..
"button[6,2;1,1;track6;6]"..
"button[4,3;1,1;track7;7]"..
"button[5,3;1,1;track8;8]"..
"button[6,3;1,1;track9;9]"..
"button[4,4;1,2;play;Play]"..
"button[6,4;1,2;stop;Stop]"..
"label[4,0;Current track "..tostring(music_player_current_track).."]"
)
end
})

View File

@ -0,0 +1,94 @@
minetest.register_craft({
output = 'technic:nodebreaker_off 1',
recipe = {
{'default:wood', 'default:pick_mese','default:wood'},
{'default:stone', 'mesecons:piston','default:stone'},
{'default:stone', 'mesecons:mesecon','default:stone'},
}
})
minetest.register_node("technic:nodebreaker_off", {
description = "Node Breaker",
tile_images = {"technic_nodebreaker_top_off.png","technic_nodebreaker_bottom_off.png","technic_nodebreaker_side2_off.png","technic_nodebreaker_side1_off.png",
"technic_nodebreaker_back.png","technic_nodebreaker_front_off.png"},
is_ground_content = true,
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2,tubedevice=1},
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
end,
})
minetest.register_node("technic:nodebreaker_on", {
description = "Node Breaker",
tile_images = {"technic_nodebreaker_top_on.png","technic_nodebreaker_bottom_on.png","technic_nodebreaker_side2_on.png","technic_nodebreaker_side1_on.png",
"technic_nodebreaker_back.png","technic_nodebreaker_front_on.png"},
is_ground_content = true,
paramtype2 = "facedir",
tubelike=1,
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2,tubedevice=1,not_in_creative_inventory=1},
sounds = default.node_sound_stone_defaults(),
})
mesecon:register_on_signal_on(function(pos, node)
if node.name == "technic:nodebreaker_off" then
minetest.env:add_node(pos, {name="technic:nodebreaker_on", param2 = node.param2})
break_node (pos,node.param2)
nodeupdate(pos)
end
end)
mesecon:register_on_signal_off(function(pos, node)
if node.name == "technic:nodebreaker_on" then
minetest.env:add_node(pos, {name="technic:nodebreaker_off", param2 = node.param2})
nodeupdate(pos)
end
end)
mesecon:register_effector("technic:nodebreaker_on", "technic:nodebreaker_off")
function break_node (pos,n_param)
local pos1={}
local pos2={}
pos1.x=pos.x
pos1.y=pos.y
pos1.z=pos.z
pos2.x=pos.x
pos2.y=pos.y
pos2.z=pos.z
--param2 3=x+ 1=x- 2=z+ 0=z-
local x_velocity=0
local z_velocity=0
if n_param==3 then pos2.x=pos2.x+1 pos1.x=pos1.x-1 x_velocity=-1 end
if n_param==2 then pos2.z=pos2.z+1 pos1.z=pos1.z-1 z_velocity=-1 end
if n_param==1 then pos2.x=pos2.x-1 pos1.x=pos1.x+1 x_velocity=1 end
if n_param==0 then pos2.z=pos2.z-1 pos1.x=pos1.z+1 z_velocity=1 end
local node=minetest.env:get_node(pos2)
local meta = minetest.env:get_meta(pos1)
tubelike=meta:get_int("tubelike")
--if tubelike==1 then
if node.name == "air" then return nil end
if node.name == "default:lava_source" then return nil end
if node.name == "default:lava_flowing" then return nil end
if node.name == "default:water_source" then minetest.env:remove_node(pos2) return nil end
if node.name == "default:water_flowing" then minetest.env:remove_node(pos2) return nil end
if node.name == "ignore" then minetest.env:remove_node(pos2) return nil end
local drops = minetest.get_node_drops(node.name, "default:pick_mese")
local _, dropped_item
for _, dropped_item in ipairs(drops) do
local item1=tube_item({x=pos.x,y=pos.y,z=pos.z},dropped_item)
item1:get_luaentity().start_pos = {x=pos.x,y=pos.y,z=pos.z}
item1:setvelocity({x=x_velocity, y=0, z=z_velocity})
item1:setacceleration({x=0, y=0, z=0})
-- minetest.item_drop(dropped_item, "", pos1)
end
minetest.env:remove_node(pos2)
--end
end

339
technic/technic/ores.lua Normal file
View File

@ -0,0 +1,339 @@
minetest.register_node( "technic:marble", {
description = "Marble",
tiles = { "technic_marble.png" },
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node( "technic:marble_bricks", {
description = "Marble Bricks",
tiles = { "technic_marble_bricks.png" },
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_craft({
output = 'technic:marble_bricks 4',
recipe = {
{'technic:marble','technic:marble'},
{'technic:marble','technic:marble'}
}
})
minetest.register_node( "technic:granite", {
description = "Granite",
tiles = { "technic_granite.png" },
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node( "technic:obsidian", {
description = "Obsidian",
tiles = { "technic_obsidian.png" },
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
})
stairsplus.register_stair_and_slab_and_panel_and_micro("marble", "technic:marble",
{cracky=3},
{"technic_marble.png"},
"Marble Stairs",
"Marble Slab",
"Marble Panel",
"Marble Microblock",
"marble")
stairsplus.register_stair_and_slab_and_panel_and_micro("marble_bricks", "technic:marble_bricks",
{cracky=3},
{"technic_marble_bricks.png"},
"Marble Bricks Stairs",
"Marble Bricks Slab",
"Marble Bricks Panel",
"Marble Bricks Microblock",
"marble_bricks")
stairsplus.register_stair_and_slab_and_panel_and_micro("granite", "technic:granite",
{cracky=3},
{"technic_granite.png"},
"Granite Stairs",
"Granite Slab",
"Granite Panel",
"Granite Microblock",
"granite")
stairsplus.register_stair_and_slab_and_panel_and_micro("obsidian", "technic:obsidian",
{cracky=3},
{"technic_obsidian.png"},
"Obsidian Stairs",
"Obsidian Slab",
"Obsidian Panel",
"Obsidian Microblock",
"obsidian")
minetest.register_node( "technic:mineral_diamond", {
description = "Diamond Ore",
tiles = { "default_stone.png^technic_mineral_diamond.png" },
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
drop = 'craft "technic:diamond" 1',
})
minetest.register_craftitem( "technic:diamond", {
description = "Diamond",
inventory_image = "technic_diamond.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_node( "technic:mineral_uranium", {
description = "Uranium Ore",
tiles = { "default_stone.png^technic_mineral_uranium.png" },
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
drop = 'craft "technic:uranium" 1',
})
minetest.register_craftitem( "technic:uranium", {
description = "Uranium",
inventory_image = "technic_uranium.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_node( "technic:mineral_chromium", {
description = "Chromium Ore",
tiles = { "default_stone.png^technic_mineral_chromium.png" },
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
drop = 'craft "technic:chromium_lump" 1',
})
minetest.register_craftitem( "technic:chromium_lump", {
description = "Chromium Lump",
inventory_image = "technic_chromium_lump.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craftitem( "technic:chromium_ingot", {
description = "Chromium Ingot",
inventory_image = "technic_chromium_ingot.png",
on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
type = 'cooking',
output = "technic:chromium_ingot",
recipe = "technic:chromium_lump"
})
minetest.register_node( "technic:mineral_zinc", {
description = "Zinc Ore",
tile_images = { "default_stone.png^technic_mineral_zinc.png" },
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
drop = 'craft "technic:zinc_lump" 1',
})
minetest.register_craftitem( "technic:zinc_lump", {
description = "Zinc Lump",
inventory_image = "technic_zinc_lump.png",
})
minetest.register_craftitem( "technic:zinc_ingot", {
description = "Zinc Ingot",
inventory_image = "technic_zinc_ingot.png",
})
minetest.register_craftitem( "technic:stainless_steel_ingot", {
description = "Stainless Steel Ingot",
inventory_image = "technic_stainless_steel_ingot.png",
})
minetest.register_craftitem( "technic:brass_ingot", {
description = "Brass Ingot",
inventory_image = "technic_brass_ingot.png",
})
minetest.register_craft({
type = 'cooking',
output = "technic:zinc_ingot",
recipe = "technic:zinc_lump"
})
local function generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, ore_per_chunk, height_min, height_max)
if maxp.y < height_min or minp.y > height_max then
return
end
local y_min = math.max(minp.y, height_min)
local y_max = math.min(maxp.y, height_max)
local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1)
local pr = PseudoRandom(seed)
local num_chunks = math.floor(chunks_per_volume * volume)
local chunk_size = 3
if ore_per_chunk <= 4 then
chunk_size = 2
end
local inverse_chance = math.floor(chunk_size*chunk_size*chunk_size / ore_per_chunk)
--print("generate_ore num_chunks: "..dump(num_chunks))
for i=1,num_chunks do
if (y_max-chunk_size+1 <= y_min) then return end
local y0 = pr:next(y_min, y_max-chunk_size+1)
if y0 >= height_min and y0 <= height_max then
local x0 = pr:next(minp.x, maxp.x-chunk_size+1)
local z0 = pr:next(minp.z, maxp.z-chunk_size+1)
local p0 = {x=x0, y=y0, z=z0}
for x1=0,chunk_size-1 do
for y1=0,chunk_size-1 do
for z1=0,chunk_size-1 do
if pr:next(1,inverse_chance) == 1 then
local x2 = x0+x1
local y2 = y0+y1
local z2 = z0+z1
local p2 = {x=x2, y=y2, z=z2}
if minetest.env:get_node(p2).name == wherein then
minetest.env:set_node(p2, {name=name})
end
end
end
end
end
end
end
--print("generate_ore done")
end
minetest.register_on_generated(function(minp, maxp, seed)
generate_ore("technic:mineral_diamond", "default:stone", minp, maxp, seed+21, 1/11/11/11, 4, -31000, -450)
generate_ore("technic:mineral_uranium", "default:stone", minp, maxp, seed+22, 1/10/10/10, 3, -300, -80)
generate_ore("technic:mineral_chromium", "default:stone", minp, maxp, seed+23, 1/10/10/10, 2, -31000, -100)
generate_ore("technic:mineral_zinc", "default:stone", minp, maxp, seed+24, 1/9/9/9, 4, -31000, 2)
generate_ore("technic:marble", "default:stone", minp, maxp, seed+25, 1/128, 20, -100, -32)
generate_ore("technic:granite", "default:stone", minp, maxp, seed+25, 1/128, 15, -190, -90)
generate_stratus("technic:obsidian",
{"default:stone"},
{"default:lava_source"},{"default:air"},
minp, maxp, seed+4, 10, 25, 7, -450, -31000, -450)
end)
function generate_stratus(name, wherein, ceilin, ceil, minp, maxp, seed, stratus_chance, radius, radius_y, deep, height_min, height_max)
if maxp.y < height_min or minp.y > height_max then
return
end
-- it will be only generate a stratus for every 100 m of area
local stratus_per_volume=1
local area=45
local y_min = math.max(minp.y, height_min)
local y_max = math.min(maxp.y, height_max)
local volume = ((maxp.x-minp.x+1)/area)*((y_max-y_min+1)/area)*((maxp.z-minp.z+1)/area)
local pr = PseudoRandom(seed)
local blocks = math.floor(stratus_per_volume*volume)
print(" <<"..dump(name)..">>");
if blocks == 0 then
blocks = 1
end
print(" blocks: "..dump(blocks).." in vol: "..dump(volume).." ("..dump(maxp.x-minp.x+1)..","..dump(y_max-y_min+1)..","..dump(maxp.z-minp.z+1)..")")
for i=1,blocks do
local x = pr:next(1,stratus_chance)
if x == 1 then
-- TODO deep
local y0=y_max-radius_y+1
if y0 < y_min then
y0=y_min
else
y0=pr:next(y_min, y0)
end
local x0 = maxp.x-radius+1
if x0 < minp.x then
x0 = minp.x
else
x0 = pr:next(minp.x, x0)
end
local z0 = maxp.z-radius+1
if z0 < minp.z then
x0 = minp.z
else
z0 = pr:next(minp.z, z0)
end
local p0 = {x=x0, y=y0, z=z0}
local n = minetest.env:get_node(p0).name
local i = 0
--print(" upper node "..n)
x = 0
for k, v in ipairs(ceilin) do
if n == v then
x = 1
break
end
end
if x == 1 then
-- search for the node to replace
--print(" Searching nodes to replace from "..dump(y0-1).." to "..dump(y_min))
for y1=y0-1,y_min,-1 do
p0.y=y1
n = minetest.env:get_node(p0).name
x = 0
for k, v in ipairs(wherein) do
if n == v then
x = 1
break
end
end
if x == 1 then
y0=y1-deep
if y0 < y_min then
y0 = y_min
end
break
end
end
local rx=pr:next(radius/2,radius)+1
local rz=pr:next(radius/2,radius)+1
local ry=pr:next(radius_y/2,radius_y)+1
--print(" area of generation ("..dump(rx)..","..dump(rz)..","..dump(ry)..")")
for x1=0,rx do
rz = rz + 3 - pr:next(1,6)
if rz < 1 then
rz = 1
end
for z1=pr:next(1,3),rz do
local ry0=ry+ pr:next(1,3)
for y1=pr:next(1,3),ry0 do
local x2 = x0+x1
local y2 = y0+y1
local z2 = z0+z1
local p2 = {x=x2, y=y2, z=z2}
n = minetest.env:get_node(p2).name
x = 0
for k, v in ipairs(wherein) do
if n == v then
x = 1
break
end
end
if x == 1 then
if ceil == nil then
minetest.env:set_node(p2, {name=name})
i = i +1
else
local p3 = {p2.x,p2.y+1,p2}
if minetest.env:get_node(p3).name == ceil then
minetest.env:set_node(p2, {name=name})
i = i +1
end
end
end
end
end
end
print(" generated "..dump(i).." blocks in ("..dump(x0)..","..dump(y0)..","..dump(z0)..")")
end
end
end
--print("generate_ore done")
end

View File

@ -0,0 +1,39 @@
minetest.register_craft({
output = 'technic:project_table 1',
recipe = {
{'default:wood','default:wood','default:wood'},
{'default:wood','default:chest','default:wood'},
{'default:stone','default:stone','default:stone'},
}
})
minetest.register_craftitem("technic:project_table", {
description = "Project Table",
stack_max = 99,
})
minetest.register_node("technic:project_table", {
description = "Project Table",
tiles = {"technic_iron_chest_top.png", "technic_iron_chest_top.png", "technic_iron_chest_side.png",
"technic_iron_chest_side.png", "technic_iron_chest_side.png", "technic_iron_chest_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[9,9;]"..
"list[current_name;main;0,2;8,2;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Iron Chest")
local inv = meta:get_inventory()
inv:set_size("main", 8*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
})

186
technic/technic/rubber.lua Normal file
View File

@ -0,0 +1,186 @@
-- Code of rubber tree by PilzAdam
minetest.register_node("technic:rubber_sapling", {
description = "Rubber Tree Sapling",
drawtype = "plantlike",
tiles = {"technic_rubber_sapling.png"},
inventory_image = "technic_rubber_sapling.png",
wield_image = "technic_rubber_sapling.png",
paramtype = "light",
walkable = false,
groups = {dig_immediate=3,flammable=2},
sounds = default.node_sound_defaults(),
})
minetest.register_node("technic:rubber_tree_full", {
description = "Rubber Tree",
tiles = {"default_tree_top.png", "default_tree_top.png", "technic_rubber_tree_full.png"},
groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
drop = "default:tree",
sounds = default.node_sound_wood_defaults(),
on_dig = function(pos, node, digger)
minetest.node_dig(pos, node, digger)
minetest.env:remove_node(pos)
end,
after_destruct = function(pos, oldnode)
oldnode.name = "technic:rubber_tree_empty"
minetest.env:set_node(pos, oldnode)
end
})
minetest.register_node("technic:rubber_tree_empty", {
tiles = {"default_tree_top.png", "default_tree_top.png", "technic_rubber_tree_empty.png"},
groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2, not_in_creative_inventory=1},
drop = "default:tree",
sounds = default.node_sound_wood_defaults(),
})
minetest.register_abm({
nodenames = {"technic:rubber_tree_empty"},
interval = 60,
chance = 15,
action = function(pos, node)
node.name = "technic:rubber_tree_full"
minetest.env:set_node(pos, node)
end
})
minetest.register_node("technic:rubber_leaves", {
drawtype = "allfaces_optional",
visual_scale = 1.3,
tiles = {"default_leaves.png"},
paramtype = "light",
groups = {snappy=3, leafdecay=3, flammable=2, not_in_creative_inventory=1},
drop = {
max_items = 1,
items = {
{
items = {'technic:rubber_sapling'},
rarity = 20,
},
}
},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_abm({
nodenames = {"technic:rubber_sapling"},
interval = 60,
chance = 20,
action = function(pos, node)
generate_tree(pos, "technic:rubber_tree_full", "technic:rubber_leaves", {"default:dirt", "default:dirt_with_grass"})
end
})
minetest.register_on_generated(function(minp, maxp, blockseed)
if math.random(1, 100) > 5 then
return
end
local tmp = {x=(maxp.x-minp.x)/2+minp.x, y=(maxp.y-minp.y)/2+minp.y, z=(maxp.z-minp.z)/2+minp.z}
local pos = minetest.env:find_node_near(tmp, maxp.x-minp.x, {"default:dirt_with_grass"})
if pos ~= nil then
generate_tree({x=pos.x, y=pos.y+1, z=pos.z}, "technic:rubber_tree_full", "technic:rubber_leaves", {"default:dirt", "default:dirt_with_grass"})
end
end)
-- ========= FUEL =========
minetest.register_craft({
type = "fuel",
recipe = "technic:rubber_sapling",
burntime = 10
})
function generate_tree(pos, trunk, leaves, underground, replacements)
pos.y = pos.y-1
local nodename = minetest.env:get_node(pos).name
local ret = true
for _,name in ipairs(underground) do
if nodename == name then
ret = false
break
end
end
pos.y = pos.y+1
if ret or minetest.env:get_node_light(pos) < 8 then
return
end
node = {name = ""}
for dy=1,4 do
pos.y = pos.y+dy
if minetest.env:get_node(pos).name ~= "air" then
return
end
pos.y = pos.y-dy
end
node.name = trunk
for dy=0,4 do
pos.y = pos.y+dy
minetest.env:set_node(pos, node)
pos.y = pos.y-dy
end
if not replacements then
replacements = {}
end
node.name = leaves
pos.y = pos.y+3
for dx=-2,2 do
for dz=-2,2 do
for dy=0,3 do
pos.x = pos.x+dx
pos.y = pos.y+dy
pos.z = pos.z+dz
if dx == 0 and dz == 0 and dy==3 then
if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
minetest.env:set_node(pos, node)
for name,rarity in pairs(replacements) do
if math.random(1, rarity) == 1 then
minetest.env:set_node(pos, {name=name})
end
end
end
elseif dx == 0 and dz == 0 and dy==4 then
if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
minetest.env:set_node(pos, node)
for name,rarity in pairs(replacements) do
if math.random(1, rarity) == 1 then
minetest.env:set_node(pos, {name=name})
end
end
end
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
if minetest.env:get_node(pos).name == "air" then
minetest.env:set_node(pos, node)
for name,rarity in pairs(replacements) do
if math.random(1, rarity) == 1 then
minetest.env:set_node(pos, {name=name})
end
end
end
else
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
minetest.env:set_node(pos, node)
for name,rarity in pairs(replacements) do
if math.random(1, rarity) == 1 then
minetest.env:set_node(pos, {name=name})
end
end
end
end
end
pos.x = pos.x-dx
pos.y = pos.y-dy
pos.z = pos.z-dz
end
end
end
end

View File

@ -0,0 +1,47 @@
minetest.register_tool("technic:screwdriver", {
description = "Screwdriver",
inventory_image = "technic_screwdriver.png",
on_use = function(itemstack, user, pointed_thing)
-- Must be pointing to facedir applicable node
if pointed_thing.type~="node" then return end
local pos=minetest.get_pointed_thing_position(pointed_thing,above)
local node=minetest.env:get_node(pos)
local node_name=node.name
if minetest.registered_nodes[node_name].paramtype2 == "facedir" or minetest.registered_nodes[node_name].paramtype2 == "wallmounted" then
if node.param2==nil then return end
-- Get ready to set the param2
local n = node.param2
if minetest.registered_nodes[node_name].paramtype2 == "facedir" then
n = n+1
if n == 4 then n = 0 end
else
n = n+1
if n == 6 then n = 0 end
end
-- hacky_swap_node, unforunatly.
local meta = minetest.env:get_meta(pos)
local meta0 = meta:to_table()
node.param2 = n
minetest.env:set_node(pos,node)
meta = minetest.env:get_meta(pos)
meta:from_table(meta0)
local item=itemstack:to_table()
local item_wear=tonumber((item["wear"]))
item_wear=item_wear+819
if item_wear>65535 then itemstack:clear() return itemstack end
item["wear"]=tostring(item_wear)
itemstack:replace(item)
return itemstack
else
return itemstack
end
end,
})
minetest.register_craft({
output = "technic:screwdriver",
recipe = {
{"technic:stainless_steel_ingot"},
{"default:stick"}
}
})

View File

@ -0,0 +1,197 @@
minetest.register_craft({
output = 'technic:silver_chest 1',
recipe = {
{'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'},
{'moreores:silver_ingot','technic:copper_chest','moreores:silver_ingot'},
{'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'},
}
})
minetest.register_craft({
output = 'technic:silver_locked_chest 1',
recipe = {
{'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'},
{'moreores:silver_ingot','technic:copper_locked_chest','moreores:silver_ingot'},
{'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'},
}
})
minetest.register_craft({
output = 'technic:silver_locked_chest 1',
recipe = {
{'default:steel_ingot'},
{'technic:silver_chest'},
}
})
minetest.register_craftitem("technic:silver_chest", {
description = "Silver Chest",
stack_max = 99,
})
minetest.register_craftitem("technic:silver_locked_chest", {
description = "Silver Locked Chest",
stack_max = 99,
})
minetest.register_node("technic:silver_chest", {
description = "Silver Chest",
tiles = {"technic_silver_chest_top.png", "technic_silver_chest_top.png", "technic_silver_chest_side.png",
"technic_silver_chest_side.png", "technic_silver_chest_side.png", "technic_silver_chest_front.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[11,9;]"..
"list[current_name;main;0,0;11,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Silver Chest")
local inv = meta:get_inventory()
inv:set_size("main", 11*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_punch = function (pos, node, puncher)
local meta = minetest.env:get_meta(pos);
meta:set_string("formspec", "hack:sign_text_input")
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.env:get_meta(pos);
fields.text = fields.text or ""
meta:set_string("text", fields.text)
meta:set_string("infotext", '"'..fields.text..'"')
meta:set_string("formspec",
"invsize[11,9;]"..
"list[current_name;main;0,0;11,4;]"..
"list[current_player;main;0,5;8,4;]")
end,
on_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_move_allow_all(
pos, from_list, from_index, to_list, to_index, count, player)
end,
on_metadata_inventory_offer = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to chest at "..minetest.pos_to_string(pos))
return minetest.node_metadata_inventory_offer_allow_all(
pos, listname, index, stack, player)
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from chest at "..minetest.pos_to_string(pos))
end,
})
local function has_locked_chest_privilege(meta, player)
if player:get_player_name() ~= meta:get_string("owner") then
return false
end
return true
end
minetest.register_node("technic:silver_locked_chest", {
description = "Silver Locked Chest",
tiles = {"technic_silver_chest_top.png", "technic_silver_chest_top.png", "technic_silver_chest_side.png",
"technic_silver_chest_side.png", "technic_silver_chest_side.png", "technic_silver_chest_locked.png"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
local meta = minetest.env:get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", "Silver Locked Chest (owned by "..
meta:get_string("owner")..")")
end,
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"invsize[11,9;]"..
"list[current_name;main;0,0;11,4;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", "Silver Locked Chest")
meta:set_string("owner", "")
local inv = meta:get_inventory()
inv:set_size("main", 11*4)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_punch = function (pos, node, puncher)
local meta = minetest.env:get_meta(pos);
meta:set_string("formspec", "hack:sign_text_input")
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.env:get_meta(pos);
fields.text = fields.text or ""
meta:set_string("text", fields.text)
meta:set_string("infotext", '"'..fields.text..'"')
meta:set_string("formspec",
"invsize[11,9;]"..
"list[current_name;main;0,0;11,4;]"..
"list[current_player;main;0,5;8,4;]")
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return count
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
minetest.log("action", player:get_player_name()..
" tried to access a locked chest belonging to "..
meta:get_string("owner").." at "..
minetest.pos_to_string(pos))
return 0
end
return stack:get_count()
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
" moves stuff in locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" moves stuff to locked chest at "..minetest.pos_to_string(pos))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", player:get_player_name()..
" takes stuff from locked chest at "..minetest.pos_to_string(pos))
end,
})

View File

@ -0,0 +1,76 @@
minetest.register_node("technic:solar_panel", {
tiles = {"technic_solar_panel_top.png", "technic_solar_panel_bottom.png", "technic_solar_panel_side.png",
"technic_solar_panel_side.png", "technic_solar_panel_side.png", "technic_solar_panel_side.png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
description="Solar Panel",
active = false,
technic_power_machine=1,
internal_EU_buffer=0;
internal_EU_buffer_size=1000;
drawtype = "nodebox",
paramtype = "light",
is_ground_content = true,
node_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
},
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
},
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_float("technic_power_machine", 1)
meta:set_float("internal_EU_buffer", 0)
meta:set_float("internal_EU_buffer_size", 1000)
meta:set_string("infotext", "Solar Panel")
meta:set_float("active", false)
end,
})
minetest.register_craft({
output = 'technic:solar_panel 1',
recipe = {
{'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer','technic:doped_silicon_wafer'},
{'technic:doped_silicon_wafer', 'moreores:copper_ingot','technic:doped_silicon_wafer'},
{'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer','technic:doped_silicon_wafer'},
}
})
minetest.register_abm(
{nodenames = {"technic:solar_panel"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local pos1={}
pos1.y=pos.y+1
pos1.x=pos.x
pos1.z=pos.z
local light = minetest.env:get_node_light(pos1, nil)
local meta = minetest.env:get_meta(pos)
if light == nil then light = 0 end
if light >= 12 then
meta:set_string("infotext", "Solar Panel is active ")
meta:set_float("active",1)
local internal_EU_buffer=meta:get_float("internal_EU_buffer")
local internal_EU_buffer_size=meta:get_float("internal_EU_buffer_size")
local charge_to_give=40+(pos1.y/250*40) -- make solar energy depending on height
if charge_to_give<0 then charge_to_give=0 end
if charge_to_give>160 then charge_to_give=160 end
if internal_EU_buffer+charge_to_give>internal_EU_buffer_size then
charge_to_give=internal_EU_buffer_size-internal_EU_buffer
end
internal_EU_buffer=internal_EU_buffer+charge_to_give
meta:set_float("internal_EU_buffer",internal_EU_buffer)
else
meta:set_string("infotext", "Solar Panel is inactive");
meta:set_float("active",0)
end
end,
})

View File

@ -0,0 +1,76 @@
minetest.register_node("technic:solar_panel_mv", {
tiles = {"technic_mv_solar_panel_top.png", "technic_mv_solar_panel_bottom.png", "technic_mv_solar_panel_side.png",
"technic_mv_solar_panel_side.png", "technic_mv_solar_panel_side.png", "technic_mv_solar_panel_side.png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
description="MV Solar Panel",
active = false,
technic_mv_power_machine=1,
internal_EU_buffer=0;
internal_EU_buffer_size=10000;
drawtype = "nodebox",
paramtype = "light",
is_ground_content = true,
node_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
},
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
},
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_float("technic_mv_power_machine", 1)
meta:set_float("internal_EU_buffer", 0)
meta:set_float("internal_EU_buffer_size", 10000)
meta:set_string("infotext", "MV Solar Panel")
meta:set_float("active", false)
end,
})
minetest.register_craft({
output = 'technic:solar_panel_mv 1',
recipe = {
{'technic:solar_panel', 'technic:solar_panel','technic:solar_panel'},
{'technic:solar_panel', 'technic:mv_transformer','technic:solar_panel'},
{'', 'technic:mv_cable',''},
}
})
minetest.register_abm(
{nodenames = {"technic:solar_panel_mv"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local pos1={}
pos1.y=pos.y+1
pos1.x=pos.x
pos1.z=pos.z
local light = minetest.env:get_node_light(pos1, nil)
local meta = minetest.env:get_meta(pos)
if light == nil then light = 0 end
if light >= 14 then
meta:set_string("infotext", "Solar Panel is active ")
meta:set_float("active",1)
local internal_EU_buffer=meta:get_float("internal_EU_buffer")
local internal_EU_buffer_size=meta:get_float("internal_EU_buffer_size")
local charge_to_give=300+(pos1.y/250*300) -- make solar energy depending on height
if charge_to_give<0 then charge_to_give=0 end
if charge_to_give>600 then charge_to_give=600 end
if internal_EU_buffer+charge_to_give>internal_EU_buffer_size then
charge_to_give=internal_EU_buffer_size-internal_EU_buffer
end
internal_EU_buffer=internal_EU_buffer+charge_to_give
meta:set_float("internal_EU_buffer",internal_EU_buffer)
else
meta:set_string("infotext", "Solar Panel is inactive");
meta:set_float("active",0)
end
end,
})

View File

@ -0,0 +1,55 @@
sonic_screwdriver_max_charge=15000
minetest.register_tool("technic:sonic_screwdriver", {
description = "Sonic Screwdriver",
inventory_image = "technic_sonic_screwdriver.png",
on_use = function(itemstack, user, pointed_thing)
-- Must be pointing to facedir applicable node
if pointed_thing.type~="node" then return end
local pos=minetest.get_pointed_thing_position(pointed_thing,above)
local node=minetest.env:get_node(pos)
local node_name=node.name
if minetest.registered_nodes[node_name].paramtype2 == "facedir" or minetest.registered_nodes[node_name].paramtype2 == "wallmounted" then
if node.param2==nil then return end
item=itemstack:to_table()
if item["metadata"]=="" or item["metadata"]=="0" then return end
local charge=tonumber((item["metadata"]))
if charge-100>0 then
minetest.sound_play("technic_sonic_screwdriver", {pos = pos, gain = 0.3, max_hear_distance = 10,})
local n = node.param2
if minetest.registered_nodes[node_name].paramtype2 == "facedir" then
n = n+1
if n == 4 then n = 0 end
else
n = n+1
if n == 6 then n = 0 end
end
-- hacky_swap_node, unforunatly.
local meta = minetest.env:get_meta(pos)
local meta0 = meta:to_table()
node.param2 = n
minetest.env:set_node(pos,node)
meta = minetest.env:get_meta(pos)
meta:from_table(meta0)
charge =charge-100;
item["metadata"]=tostring(charge)
set_RE_wear(item,charge,sonic_screwdriver_max_charge)
itemstack:replace(item)
end
return itemstack
else
return itemstack
end
end,
})
minetest.register_craft({
output = "technic:sonic_screwdriver",
recipe = {
{"technic:diamond"},
{"technic:battery"},
{"technic:stainless_steel_ingot"}
}
})

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More