9 Commits

Author SHA1 Message Date
9004ab3322 Handheld prospecting tool
The new tool will say whether a target block type is present in a
specified region, to allow for more targeted digging.  It is deliberately
quite weak, with several limitations: only stores enough charge for a
small number of shots; target can only be set by pointing at an example
node; range is limited; accuracy is less than 100%.  Some of these
limitations should probably be ameliorated, but not entirely eliminated,
in the future when we have a better idea of game balance.

The inventory image is only a placeholder.
2014-07-07 15:15:30 +02:00
01b475c7cc Fine gold and silver wire items
Not used in any recipes yet.
2014-07-07 15:15:30 +02:00
63ab5ef5d4 Tweak supply converter recipe
The casing is now in the center of the grid, as it is for all other
machines.
2014-07-07 15:15:30 +02:00
74d54eb0b4 Consistently use cable in electric machine recipes
All electric machine recipes now include cable of the appropriate tier
as the bottom-middle ingredient, immediately below the casing ingredient.
Many LV machines were using a copper ingot in that location.
2014-07-07 15:15:30 +02:00
d9fc156960 Use machine casing in most machine recipes 2014-07-07 15:15:30 +02:00
c26f45c962 Machine casing item
The casing is intended to be an ingredient in craft recipes for machines.
It isn't actually used in any recipes yet.  Although mainly a craft
item, it is defined as a node type, mainly to get an appropriately cubic
inventory image.  It is incidentally possible to place it as a node:
this makes some sense, although the empty machine casing isn't actually
useful as a node.
2014-07-07 15:15:30 +02:00
775cb9d132 Fix fuel-fired alloy furnace
Commit ee0765804c broke the fuel-fired alloy
furnace, by removing the definition of its formspec that it requires to
set up the form upon construction.
2014-07-07 15:15:30 +02:00
fb15df52e2 Fix craft guide for alloy cooking et al
A typo in commit d55ecc39f9 made recipes
for alloy cooking, compressing, and all other craft types sharing that
machine code, to be shown with three ingredient slots instead of the
correct one or two.
2014-07-07 15:15:30 +02:00
43295b5b7f Fix brass alloying recipe
Commit d55ecc39f9 introduced a bogus
reference to "technic:copper_ingot".
2014-07-07 15:15:30 +02:00
255 changed files with 3786 additions and 12635 deletions

1
.gitignore vendored
View File

@ -48,6 +48,7 @@ local.properties
*_p.c *_p.c
*.ilk *.ilk
*.meta *.meta
*.obj
*.pch *.pch
*.pdb *.pdb
*.pgc *.pgc

View File

@ -1,4 +0,0 @@
RealBadAngel <maciej.kasatkin@o2.pl> <mk@realbadangel.pl>
Vanessa Ezekowitz <vanessaezekowitz@gmail.com>
Vanessa Ezekowitz <vanessaezekowitz@gmail.com> <vanessa@rainbird.(none)>
kaeza <kaeza@users.sf.net> Diego Martínez <kaeza@users.sf.net>

View File

@ -4,7 +4,7 @@ Technic
Credits for contributing to the project (in alphabetical order): Credits for contributing to the project (in alphabetical order):
* kpoppel * kpoppel
* Nekogloop * Nekogloop
* Nore/Ekdohibs * Nore/Novatux
* ShadowNinja * ShadowNinja
* VanessaE * VanessaE
* And many others... * And many others...
@ -18,6 +18,5 @@ FAQ
License License
------- -------
Unless otherwise stated, all components of this modpack are licensed under the See mod folders for their licences
LGPL, V2 or later. See also the individual mod folders for their
secondary/alternate licenses, if any.

View File

@ -1,20 +1,22 @@
--Minetest 0.4.7 mod: concrete --Minetest 0.4.7 mod: concrete
--(c) 2013 by RealBadAngel <mk@realbadangel.pl> --(c) 2013 by RealBadAngel <mk@realbadangel.pl>
local technic = rawget(_G, "technic") or {} local technic = technic or {}
technic.concrete_posts = {} technic.concrete_posts = {}
-- Boilerplate to support localized strings if intllib mod is installed. -- Boilerplate to support localized strings if intllib mod is installed.
local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end local S
if intllib then
S = intllib.Getter()
else
S = function(s) return s end
end
for i = 0, 31 do minetest.register_alias("technic:concrete_post", "technic:concrete_post0")
minetest.register_alias("technic:concrete_post"..i, minetest.register_alias("technic:concrete_post32", "technic:concrete_post12")
"technic:concrete_post") minetest.register_alias("technic:concrete_post33", "technic:concrete_post3")
end minetest.register_alias("technic:concrete_post34", "technic:concrete_post28")
for i = 32, 63 do minetest.register_alias("technic:concrete_post35", "technic:concrete_post19")
minetest.register_alias("technic:concrete_post"..i,
"technic:concrete_post_with_platform")
end
local steel_ingot local steel_ingot
if minetest.get_modpath("technic_worldgen") then if minetest.get_modpath("technic_worldgen") then
@ -44,12 +46,12 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
output = 'technic:concrete_post_platform 6', output = 'technic:concrete_post_platform 6',
recipe = { recipe = {
{'technic:concrete','technic:concrete_post','technic:concrete'}, {'technic:concrete','technic:concrete_post0','technic:concrete'},
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = 'technic:concrete_post 12', output = 'technic:concrete_post0 12',
recipe = { recipe = {
{'default:stone','technic:rebar','default:stone'}, {'default:stone','technic:rebar','default:stone'},
{'default:stone','technic:rebar','default:stone'}, {'default:stone','technic:rebar','default:stone'},
@ -66,6 +68,13 @@ minetest.register_craft({
} }
}) })
local box_platform = {-0.5, 0.3, -0.5, 0.5, 0.5, 0.5}
local box_center = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}
local box_x1 = {0, -0.3, -0.1, 0.5, 0.3, 0.1}
local box_z1 = {-0.1, -0.3, 0, 0.1, 0.3, 0.5}
local box_x2 = {0, -0.3, -0.1, -0.5, 0.3, 0.1}
local box_z2 = {-0.1, -0.3, 0, 0.1, 0.3, -0.5}
minetest.register_craftitem(":technic:rebar", { minetest.register_craftitem(":technic:rebar", {
description = S("Rebar"), description = S("Rebar"),
inventory_image = "technic_rebar.png", inventory_image = "technic_rebar.png",
@ -73,35 +82,33 @@ minetest.register_craftitem(":technic:rebar", {
minetest.register_node(":technic:concrete", { minetest.register_node(":technic:concrete", {
description = S("Concrete Block"), description = S("Concrete Block"),
tiles = {"technic_concrete_block.png",}, tile_images = {"technic_concrete_block.png",},
groups = {cracky=1, level=2, concrete=1}, groups = {cracky=1, level=2, concrete=1},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
after_place_node = function(pos, placer, itemstack)
technic.update_posts(pos, false)
end,
after_dig_node = function (pos, oldnode, oldmetadata, digger)
technic.update_posts(pos, false)
end,
}) })
minetest.register_node(":technic:blast_resistant_concrete", { minetest.register_node(":technic:blast_resistant_concrete", {
description = S("Blast-resistant Concrete Block"), description = S("Blast-resistant Concrete Block"),
tiles = {"technic_blast_resistant_concrete_block.png",}, tile_images = {"technic_blast_resistant_concrete_block.png",},
groups={cracky=1, level=3, concrete=1}, groups={cracky=1, level=3, concrete=1},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
on_blast = function(pos, intensity) after_place_node = function(pos, player, itemstack)
if intensity > 9 then technic.update_posts(pos, false)
minetest.remove_node(pos) end,
return {"technic:blast_resistant_concrete"} after_dig_node = function (pos, oldnode, oldmetadata, digger)
end technic.update_posts(pos, false)
end, end,
}) })
local box_platform = {-0.5, 0.3, -0.5, 0.5, 0.5, 0.5}
local box_post = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}
local box_front = {-0.1, -0.3, -0.5, 0.1, 0.3, 0}
local box_back = {-0.1, -0.3, 0, 0.1, 0.3, 0.5}
local box_left = {-0.5, -0.3, -0.1, 0, 0.3, 0.1}
local box_right = {0, -0.3, -0.1, 0.5, 0.3, 0.1}
minetest.register_node(":technic:concrete_post_platform", { minetest.register_node(":technic:concrete_post_platform", {
description = S("Concrete Post Platform"), description = S("Concrete Post Platform"),
tiles = {"technic_concrete_block.png",}, tile_images = {"technic_concrete_block.png",},
groups={cracky=1, level=2}, groups={cracky=1, level=2},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
paramtype = "light", paramtype = "light",
@ -112,45 +119,144 @@ minetest.register_node(":technic:concrete_post_platform", {
}, },
on_place = function (itemstack, placer, pointed_thing) on_place = function (itemstack, placer, pointed_thing)
local node = minetest.get_node(pointed_thing.under) local node = minetest.get_node(pointed_thing.under)
if node.name ~= "technic:concrete_post" then if not technic.concrete_posts[node.name] then
return minetest.item_place_node(itemstack, placer, pointed_thing) return minetest.item_place_node(itemstack, placer, pointed_thing)
end end
minetest.set_node(pointed_thing.under, {name="technic:concrete_post_with_platform"}) local links = technic.concrete_posts[node.name]
if links[5] ~= 0 then -- The post already has a platform
return minetest.item_place_node(itemstack, placer, pointed_thing)
end
local id = technic.get_post_id({links[1], links[2], links[3], links[4], 1})
minetest.set_node(pointed_thing.under, {name="technic:concrete_post"..id})
itemstack:take_item() itemstack:take_item()
placer:set_wielded_item(itemstack) placer:set_wielded_item(itemstack)
return itemstack return itemstack
end, end,
}) })
for platform = 0, 1 do local function gen_post_nodebox(x1, x2, z1, z2, platform)
local after_dig_node = nil local box = {box_center}
if platform == 1 then if x1 ~= 0 then
after_dig_node = function(pos, old_node) table.insert(box, box_x1)
old_node.name = "technic:concrete_post" end
minetest.set_node(pos, old_node) if x2 ~= 0 then
table.insert(box, box_x2)
end
if z1 ~= 0 then
table.insert(box, box_z1)
end
if z2 ~= 0 then
table.insert(box, box_z2)
end
if platform ~= 0 then
table.insert(box, box_platform)
end
return box
end
local function dig_post_with_platform(pos, oldnode, oldmetadata)
oldnode.name = "technic:concrete_post0"
minetest.set_node(pos, oldnode)
technic.update_posts(pos, true)
end
function technic.posts_should_connect(pos)
local node = minetest.get_node(pos)
if technic.concrete_posts[node.name] then
return "post"
elseif minetest.get_item_group(node.name, "concrete") ~= 0 then
return "block"
end end
end end
minetest.register_node(":technic:concrete_post"..(platform == 1 and "_with_platform" or ""), { function technic.get_post_id(links)
return (links[4] * 1) + (links[3] * 2)
+ (links[2] * 4) + (links[1] * 8)
+ (links[5] * 16)
end
function technic.update_posts(pos, set, secondrun)
local node = minetest.get_node(pos)
local link_positions = {
{x=pos.x+1, y=pos.y, z=pos.z},
{x=pos.x-1, y=pos.y, z=pos.z},
{x=pos.x, y=pos.y, z=pos.z+1},
{x=pos.x, y=pos.y, z=pos.z-1},
}
local links = {0, 0, 0, 0, 0}
for i, link_pos in pairs(link_positions) do
local connecttype = technic.posts_should_connect(link_pos)
if connecttype then
links[i] = 1
-- Have posts next to us update theirselves,
-- but only once. (We don't want to start an
-- infinite loop of updates)
if not secondrun and connecttype == "post" then
technic.update_posts(link_pos, true, true)
end
end
end
-- We don't want to set ourselves if we have been removed or we are
-- updating a concrete node
if set then
-- Preserve platform
local oldlinks = technic.concrete_posts[node.name]
if oldlinks then
links[5] = oldlinks[5]
end
minetest.set_node(pos, {name="technic:concrete_post"
..technic.get_post_id(links)})
end
end
for x1 = 0, 1 do
for x2 = 0, 1 do
for z1 = 0, 1 do
for z2 = 0, 1 do
for platform = 0, 1 do
local links = {x1, x2, z1, z2, platform}
local id = technic.get_post_id(links)
technic.concrete_posts["technic:concrete_post"..id] = links
local groups = {cracky=1, level=2, concrete_post=1}
if id ~= 0 then
groups.not_in_creative_inventory = 1
end
local drop = "technic:concrete_post0"
local after_dig_node = function(pos, oldnode, oldmetadata, digger)
technic.update_posts(pos, false)
end
if platform ~= 0 then
drop = "technic:concrete_post_platform"
after_dig_node = function(pos, oldnode, oldmetadata, digger)
dig_post_with_platform(pos, oldnode, oldmetadata)
end
end
minetest.register_node(":technic:concrete_post"..id, {
description = S("Concrete Post"), description = S("Concrete Post"),
tiles = {"technic_concrete_block.png"}, tiles = {"technic_concrete_block.png"},
groups = {cracky=1, level=2, concrete_post=1, not_in_creative_inventory=platform}, groups = groups,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
drop = (platform == 1 and "technic:concrete_post_platform" or drop = drop,
"technic:concrete_post"),
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
drawtype = "nodebox", drawtype = "nodebox",
connects_to = {"group:concrete", "group:concrete_post"},
node_box = { node_box = {
type = "connected", type = "fixed",
fixed = {box_post, (platform == 1 and box_platform or nil)}, fixed = gen_post_nodebox(x1, x2, z1, z2, platform),
connect_front = box_front,
connect_back = box_back,
connect_left = box_left,
connect_right = box_right,
}, },
after_place_node = function(pos, placer, itemstack)
technic.update_posts(pos, true)
end,
after_dig_node = after_dig_node, after_dig_node = after_dig_node,
}) })
end end
end
end
end
end

View File

@ -1,8 +0,0 @@
# technic_concrete traducido por Carlos Barraza
Rebar = Barra de refuerzo
Concrete Block = Bloque de concreto
Blast-resistant Concrete Block = Bloque de concreto resistente a explosiones
Concrete Post Platform = Plataforma de concreto
Concrete Post = Postes de concreto

View File

@ -1,7 +0,0 @@
# turkish translation by mahmutelmas06
Rebar = Beton demiri
Concrete Block = Beton blok
Blast-resistant Concrete Block = Patlamaya dayanıklı beton blok
Concrete Post Platform = Beton direk platformu
Concrete Post = Beton direk

View File

@ -1,6 +1,6 @@
default default
moreblocks
technic_worldgen technic_worldgen
concrete concrete
unifieddyes?
intllib? intllib?
moreblocks?

View File

@ -1,67 +1,52 @@
-- Minetest 0.4.6 mod: extranodes -- Minetest 0.4.6 mod: extranodes
-- namespace: technic -- namespace: technic
-- Boilerplate to support localized strings if intllib mod is installed. -- Boilerplate to support localized strings if intllib mod is installed.
local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end local S
if intllib then
S = intllib.Getter()
else
S = function(s) return s end
end
--register stairslike nodes
register_stair_slab_panel_micro("technic", "marble", "technic:marble",
{cracky=2, not_in_creative_inventory=1},
{"technic_marble.png"},
S("Marble"),
"marble",
"facedir",
0)
if minetest.get_modpath("moreblocks") then register_stair_slab_panel_micro("technic", "marble_bricks", "technic:marble_bricks",
{cracky=2, not_in_creative_inventory=1},
{"technic_marble_bricks.png"},
S("Marble Bricks"),
"marble_bricks",
"facedir",
0)
-- register stairsplus/circular_saw nodes register_stair_slab_panel_micro("technic", "granite", "technic:granite",
-- we skip blast resistant concrete and uranium intentionally {cracky=3, not_in_creative_inventory=1},
-- chrome seems to be too hard of a metal to be actually sawable {"technic_granite.png"},
S("Granite"),
"granite",
"facedir",
0)
stairsplus:register_all("technic", "marble", "technic:marble", { register_stair_slab_panel_micro("technic", "concrete", "technic:concrete",
description=S("Marble"), {cracky=3, not_in_creative_inventory=1},
groups={cracky=3, not_in_creative_inventory=1}, {"technic_concrete_block.png"},
tiles={"technic_marble.png"}, S("Concrete"),
}) "concrete",
"facedir",
0)
stairsplus:register_all("technic", "marble_bricks", "technic:marble_bricks", { --register nodes in circular saw if aviable
description=S("Marble Bricks"), if circular_saw then
groups={cracky=3, not_in_creative_inventory=1}, for i,v in ipairs({"concrete", "marble", "marble_bricks", "granite", "default:obsidian"}) do
tiles={"technic_marble_bricks.png"}, table.insert(circular_saw.known_stairs, "technic:" ..v);
}) end
end
stairsplus:register_all("technic", "granite", "technic:granite", {
description=S("Granite"),
groups={cracky=1, not_in_creative_inventory=1},
tiles={"technic_granite.png"},
})
stairsplus:register_all("technic", "concrete", "technic:concrete", {
description=S("Concrete"),
groups={cracky=3, not_in_creative_inventory=1},
tiles={"technic_concrete_block.png"},
})
stairsplus:register_all("technic", "zinc_block", "technic:zinc_block", {
description=S("Zinc Block"),
groups={cracky=1, not_in_creative_inventory=1},
tiles={"technic_zinc_block.png"},
})
stairsplus:register_all("technic", "cast_iron_block", "technic:cast_iron_block", {
description=S("Cast Iron Block"),
groups={cracky=1, not_in_creative_inventory=1},
tiles={"technic_cast_iron_block.png"},
})
stairsplus:register_all("technic", "carbon_steel_block", "technic:carbon_steel_block", {
description=S("Carbon Steel Block"),
groups={cracky=1, not_in_creative_inventory=1},
tiles={"technic_carbon_steel_block.png"},
})
stairsplus:register_all("technic", "stainless_steel_block", "technic:stainless_steel_block", {
description=S("Stainless Steel Block"),
groups={cracky=1, not_in_creative_inventory=1},
tiles={"technic_stainless_steel_block.png"},
})
stairsplus:register_all("technic", "brass_block", "technic:brass_block", {
description=S("Brass Block"),
groups={cracky=1, not_in_creative_inventory=1},
tiles={"technic_brass_block.png"},
})
function register_technic_stairs_alias(modname, origname, newmod, newname) function register_technic_stairs_alias(modname, origname, newmod, newname)
minetest.register_alias(modname .. ":slab_" .. origname, newmod..":slab_" .. newname) minetest.register_alias(modname .. ":slab_" .. origname, newmod..":slab_" .. newname)
@ -99,89 +84,3 @@ if minetest.get_modpath("moreblocks") then
register_technic_stairs_alias("stairsplus", "marble", "technic", "marble") register_technic_stairs_alias("stairsplus", "marble", "technic", "marble")
register_technic_stairs_alias("stairsplus", "granite", "technic", "granite") register_technic_stairs_alias("stairsplus", "granite", "technic", "granite")
register_technic_stairs_alias("stairsplus", "marble_bricks", "technic", "marble_bricks") register_technic_stairs_alias("stairsplus", "marble_bricks", "technic", "marble_bricks")
end
local iclip_def = {
description = "Insulator/cable clip",
drawtype = "mesh",
mesh = "technic_insulator_clip.obj",
tiles = {"technic_insulator_clip.png"},
is_ground_content = false,
groups = {choppy=1, snappy=1, oddly_breakable_by_hand=1 },
sounds = default.node_sound_stone_defaults(),
}
local iclipfence_def = {
description = "Insulator/cable clip",
tiles = {"technic_insulator_clip.png"},
is_ground_content = false,
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "connected",
fixed = {
{ -0.25, 0.75, -0.25, 0.25, 1.25, 0.25 }, -- the clip on top
{ -0.125, 0.6875, -0.125, 0.125, 0.75, 0.125 },
{ -0.1875, 0.625, -0.1875, 0.1875, 0.6875, 0.1875 },
{ -0.125, 0.5625, -0.125, 0.125, 0.625, 0.125 },
{ -0.1875, 0.5, -0.1875, 0.1875, 0.5625, 0.1875 },
{ -0.125, 0.4375, -0.125, 0.125, 0.5, 0.125 },
{ -0.1875, 0.375, -0.1875, 0.1875, 0.4375, 0.1875 },
{ -0.125, -0.5, -0.125, 0.125, 0.375, 0.125 }, -- the post, slightly short
},
-- connect_top =
-- connect_bottom =
connect_front = {{-1/16,3/16,-1/2,1/16,5/16,-1/8},
{-1/16,-5/16,-1/2,1/16,-3/16,-1/8}},
connect_left = {{-1/2,3/16,-1/16,-1/8,5/16,1/16},
{-1/2,-5/16,-1/16,-1/8,-3/16,1/16}},
connect_back = {{-1/16,3/16,1/8,1/16,5/16,1/2},
{-1/16,-5/16,1/8,1/16,-3/16,1/2}},
connect_right = {{1/8,3/16,-1/16,1/2,5/16,1/16},
{1/8,-5/16,-1/16,1/2,-3/16,1/16}},
},
connects_to = {"group:fence", "group:wood", "group:tree"},
groups = {fence=1, choppy=1, snappy=1, oddly_breakable_by_hand=1 },
sounds = default.node_sound_stone_defaults(),
}
if minetest.get_modpath("unifieddyes") then
iclip_def.paramtype2 = "colorwallmounted"
iclip_def.palette = "unifieddyes_palette_colorwallmounted.png"
iclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing)
unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing)
end
iclip_def.after_dig_node = unifieddyes.after_dig_node
iclip_def.groups = {choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1}
iclipfence_def.paramtype2 = "color"
iclipfence_def.palette = "unifieddyes_palette_extended.png"
iclipfence_def.on_construct = unifieddyes.on_construct
iclipfence_def.after_place_node = unifieddyes.recolor_on_place
iclipfence_def.after_dig_node = unifieddyes.after_dig_node
iclipfence_def.groups = {fence=1, choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1}
iclipfence_def.place_param2 = 171 -- medium amber, low saturation, closest color to default:wood
end
minetest.register_node(":technic:insulator_clip", iclip_def)
minetest.register_node(":technic:insulator_clip_fencepost", iclipfence_def)
minetest.register_craft({
output = "technic:insulator_clip",
recipe = {
{ "", "dye:white", ""},
{ "", "technic:raw_latex", ""},
{ "technic:raw_latex", "default:stone", "technic:raw_latex"},
}
})
minetest.register_craft({
output = "technic:insulator_clip_fencepost 2",
recipe = {
{ "", "dye:white", ""},
{ "", "technic:raw_latex", ""},
{ "technic:raw_latex", "default:fence_wood", "technic:raw_latex"},
}
})

View File

@ -1,7 +0,0 @@
# technic_extranodes traducido por Carlos Barraza
Marble = Mármol
Marble Bricks = Ladrillos de mármol
Granite = Granito
Concrete = Concreto

View File

@ -1,6 +0,0 @@
# turkish translation by mahmutelmas06
Marble = Mermer
Marble Bricks = Mermer tuğla
Granite = Granit
Concrete = Beton

View File

@ -1,173 +0,0 @@
# Blender v2.72 (sub 0) OBJ File: ''
# www.blender.org
o Cube
v -0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v -0.249997 0.500000 0.249997
v -0.249997 0.500000 -0.249997
v 0.249997 0.500000 -0.249997
v 0.249997 0.500000 0.249997
v -0.187500 0.500000 0.187500
v -0.187500 0.500000 -0.187500
v 0.187500 0.500000 -0.187500
v 0.187500 0.500000 0.187500
v -0.187500 0.750000 0.187500
v -0.187500 0.750000 -0.187500
v 0.187500 0.750000 -0.187500
v 0.187500 0.750000 0.187500
v -0.250000 0.750000 0.250000
v -0.250000 0.750000 -0.250000
v 0.250000 0.750000 -0.250000
v 0.250000 0.750000 0.250000
v -0.250000 1.250000 0.250000
v -0.250000 1.250000 -0.250000
v 0.250000 1.250000 -0.250000
v 0.250000 1.250000 0.250000
v -0.500000 0.312500 0.500000
v -0.500000 0.312500 -0.500000
v 0.500000 0.312500 -0.500000
v 0.500000 0.312500 0.500000
v 0.187500 0.625000 0.187500
v 0.187500 0.625000 -0.187500
v -0.187500 0.625000 -0.187500
v -0.187500 0.625000 0.187500
v 0.187500 0.562500 0.187500
v 0.187500 0.687500 -0.187500
v -0.187500 0.687500 -0.187500
v -0.187500 0.562500 0.187500
v 0.187500 0.687500 0.187500
v 0.187500 0.562500 -0.187500
v -0.187500 0.562500 -0.187500
v -0.187500 0.687500 0.187500
v 0.168668 0.531250 0.168668
v 0.168668 0.718750 -0.168668
v -0.168668 0.718750 -0.168668
v -0.168668 0.531250 0.168668
v 0.168668 0.656250 0.168668
v 0.168668 0.593750 -0.168668
v -0.168668 0.593750 -0.168668
v -0.168668 0.656250 0.168668
v 0.168668 0.593750 0.168668
v 0.168668 0.656250 -0.168668
v -0.168668 0.656250 -0.168668
v -0.168668 0.593750 0.168668
v 0.168668 0.718750 0.168668
v 0.168668 0.531250 -0.168668
v -0.168668 0.531250 -0.168668
v -0.168668 0.718750 0.168668
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 0.749997 0.749997
vt 0.749997 0.250003
vt 0.250003 0.250003
vt 0.250003 0.749997
vt 0.000000 0.812500
vt 1.000000 0.812500
vt 0.312500 0.312500
vt 0.312500 0.687500
vt 0.687500 0.312500
vt 0.687500 0.687500
vt 0.331332 1.218750
vt 0.668668 1.218750
vt 0.687500 1.250000
vt 0.312500 1.250000
vt 0.750000 1.250000
vt 0.750000 1.750000
vt 0.250000 1.750000
vt 0.250000 1.250000
vt 0.331332 1.093750
vt 0.668668 1.093750
vt 0.687500 1.125000
vt 0.312500 1.125000
vt 0.331332 1.093750
vt 0.668668 1.093750
vt 0.331332 1.156250
vt 0.668668 1.156250
vt 0.687500 1.187500
vt 0.312500 1.187500
vt 0.331332 1.156250
vt 0.668668 1.156250
vt 0.331332 1.031250
vt 0.668668 1.031250
vt 0.687500 1.062500
vt 0.312500 1.062500
vt 0.312500 1.000000
vt 0.687500 1.000000
vn 0.000000 -1.000000 -0.000000
vn -0.600000 0.800000 -0.000000
vn 0.000000 0.800000 -0.600000
vn 0.600000 0.800000 0.000000
vn -0.000000 0.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 0.856500 -0.516200 0.000000
vn 0.000000 -0.516200 -0.856500
vn -0.000000 -0.516200 0.856500
vn -0.856500 -0.516200 -0.000000
vn -1.000000 0.000000 -0.000000
vn 0.000000 -0.000000 -1.000000
vn 1.000000 -0.000000 0.000000
vn -0.000000 0.800000 0.600000
vn 0.856500 0.516200 0.000000
vn 0.000000 0.516200 -0.856500
vn -0.000000 0.516200 0.856500
vn -0.856500 0.516200 -0.000000
g Cube_Cube_Material
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 25/2/2 5/5/2 6/6/2 26/1/2
f 26/1/3 6/6/3 7/7/3 27/4/3
f 27/4/4 7/7/4 8/8/4 28/3/4
f 25/9/5 1/4/5 4/1/5 28/10/5
f 8/8/6 7/7/6 11/11/6 12/12/6
f 7/7/6 6/6/6 10/13/6 11/11/6
f 5/5/6 8/8/6 12/12/6 9/14/6
f 6/6/6 5/5/6 9/14/6 10/13/6
f 53/15/7 42/16/7 15/17/7 16/18/7
f 42/15/8 43/16/8 14/17/8 15/18/8
f 56/15/9 53/16/9 16/17/9 13/18/9
f 43/15/10 56/16/10 13/17/10 14/18/10
f 14/4/1 18/4/1 19/4/1 15/4/1
f 17/19/11 21/20/11 22/21/11 18/22/11
f 18/19/12 22/20/12 23/21/12 19/22/12
f 19/19/13 23/20/13 24/21/13 20/22/13
f 21/21/5 17/22/5 20/19/5 24/20/5
f 21/5/6 24/8/6 23/7/6 22/6/6
f 15/4/1 19/4/1 20/4/1 16/4/1
f 16/4/1 20/4/1 17/4/1 13/4/1
f 13/4/1 17/4/1 18/4/1 14/4/1
f 1/1/11 25/10/11 26/9/11 2/4/11
f 2/1/12 26/10/12 27/9/12 3/4/12
f 3/1/13 27/10/13 28/9/13 4/4/13
f 5/5/14 25/2/14 28/3/14 8/8/14
f 49/23/7 46/24/7 30/25/7 29/26/7
f 46/27/8 47/28/8 31/25/8 30/26/8
f 52/23/9 49/24/9 29/25/9 32/26/9
f 47/23/10 52/24/10 32/25/10 31/26/10
f 45/29/7 50/30/7 34/31/7 37/32/7
f 50/33/8 51/34/8 35/31/8 34/32/8
f 48/33/9 45/34/9 37/31/9 40/32/9
f 51/29/10 48/30/10 40/31/10 35/32/10
f 41/35/7 54/36/7 38/37/7 33/38/7
f 54/35/8 55/36/8 39/37/8 38/38/8
f 44/35/9 41/36/9 33/37/9 36/38/9
f 55/35/10 44/36/10 36/37/10 39/38/10
f 37/32/15 34/31/15 42/16/15 53/15/15
f 34/32/16 35/31/16 43/16/16 42/15/16
f 40/32/17 37/31/17 53/16/17 56/15/17
f 35/32/18 40/31/18 56/16/18 43/15/18
f 33/38/15 38/37/15 46/24/15 49/23/15
f 38/38/16 39/37/16 47/28/16 46/27/16
f 36/38/17 33/37/17 49/24/17 52/23/17
f 39/38/18 36/37/18 52/24/18 47/23/18
f 29/26/15 30/25/15 50/30/15 45/29/15
f 30/26/16 31/25/16 51/34/16 50/33/16
f 32/26/17 29/25/17 45/34/17 48/33/17
f 31/26/18 32/25/18 48/30/18 51/29/18
f 12/39/15 11/40/15 54/36/15 41/35/15
f 11/39/16 10/40/16 55/36/16 54/35/16
f 9/39/17 12/40/17 41/36/17 44/35/17
f 10/39/18 9/40/18 44/36/18 55/35/18

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

1493
manual.md

File diff suppressed because it is too large Load Diff

68
notes_on_iron Normal file
View File

@ -0,0 +1,68 @@
Notes on iron and steel
=======================
Alloying iron with carbon is of huge importance, but in some processes
the alloying is an implicit side effect rather than the product of
explicit mixing, so it is a complex area. In the real world, there is
a huge variety of kinds of iron and steel, differing in the proportion
of carbon included and in other elements added to the mix.
The Minetest default mod doesn't distinguish between types of iron and
steel at all. This mod introduces multiple types in order to get a bit
of complexity and flavour.
Leaving aside explicit addition of other elements, the iron/carbon
spectrum is here represented by three substances: wrought iron,
carbon steel, and cast iron. Wrought iron has low carbon content
(less than 0.25%), resists shattering, and is easily welded, but is
relatively soft and susceptible to rusting. It was used for rails,
gates, chains, wire, pipes, fasteners, and other purposes. Cast iron
has high carbon content (2.1% to 4%), is especially hard, and resists
corrosion, but is relatively brittle, and difficult to work. It was used
to build large structures such as bridges, and for cannons, cookware,
and engine cylinders. Carbon steel has medium carbon content (0.25%
to 2.1%), and intermediate properties: moderately hard and also tough,
somewhat resistant to corrosion. It is now used for most of the purposes
previously satisfied by wrought iron and many of those of cast iron,
but has historically been especially important for its use in swords,
armour, skyscrapers, large bridges, and machines.
Historically, the first form of iron to be refined was wrought iron,
produced from ore by a low-temperature furnace process in which the
ore/iron remains solid and impurities (slag) are progressively removed.
Cast iron, by contrast, was produced somewhat later by a high-temperature
process in a blast furnace, in which the metal is melted, and carbon is
unavoidably incorporated from the furnace's fuel. (In fact, it's done
in two stages, first producing pig iron from ore, and then remelting the
pig iron to cast as cast iron.) Carbon steel requires a more advanced
process, in which molten pig iron is processed to remove the carbon,
and then a controlled amount of carbon is explicitly mixed back in.
Other processes are possible to refine iron ore and to adjust its
carbon content.
Unfortunately, Minetest doesn't let us readily distinguish between
low-temperature and high-temperature processes: in the default game, the
same furnace is used both to cook food (low temperature) and to cast metal
ingots (varying high temperatures). So we can't sensibly have wrought
iron and cast iron produced by different types of furnace. Nor can
furnace recipes discriminate by which kind of fuel is used (and thus
by the availability of carbon). The alloy furnace allows for explicit
alloying, which appropriately represents how carbon steel is made, but
is not sensible for the other two, and is a relatively advanced process.
About the only option to make a second iron-processing furnace process
readily available is to cook multiple times; happily, this bears a slight
resemblance to the real process with pig iron as an intermediate product.
The default mod's refined iron, which it calls "steel", is identified
with this mod's wrought iron. Cooking an iron lump (representing ore)
initially produces wrought iron; the cooking process here represents a
low-temperature bloomery process. Cooking wrought iron then produces
cast iron; this time the cooking process represents a blast furnace.
Alloy cooking wrought iron with coal dust (carbon) produces carbon steel;
this represents the explicit mixing stage of carbon steel production.
Additionally, alloy cooking carbon steel with coal dust produces cast
iron, which is logical but not very useful. Furthermore, to make it
possible to turn any of the forms of iron into any other, cooking carbon
steel or cast iron produces wrought iron, in an abbreviated form of the
bloomery process. As usual for metals, the same cooking and alloying
processes can be performed in parallel forms on ingots or dust.

View File

@ -10,26 +10,6 @@ Technic chests code is licensed under the GNU LGPLv2+.
Texture licenses: Texture licenses:
BlockMen modified by Zefram (CC BY-SA 3.0):
* technic_chernobylite_block.png
* technic_corium_flowing_animated.png
* technic_corium_source_animated.png
celeron55 (Perttu Ahola) modified by Zefram (CC BY-SA 3.0):
* technic_bucket_corium.png
sdzen (Elise Staudter) (CC BY-SA 3.0):
* most of the older 16x16 textures
RealBadAngel: (WTFPL) RealBadAngel: (WTFPL)
* Everything else. * Everything.
CC BY-SA 3.0: <http://creativecommons.org/licenses/by-sa/3.0/>
Sound licenses:
veikk0 (Veikko Mäkelä) (CC BY-SA 4.0):
* technic_hv_nuclear_reactor_siren_danger_loop.ogg
* Derived from "Nuclear alarm.wav" by Freesound.org user rene___ from <https://freesound.org/people/rene___/sounds/56778/>. Originally licensed under CC0 1.0 <https://creativecommons.org/publicdomain/zero/1.0/>
CC BY-SA 4.0: <https://creativecommons.org/licenses/by-sa/4.0/>

View File

@ -1,4 +1,7 @@
technic.config = technic.config or Settings(minetest.get_worldpath().."/technic.conf")
local worldpath = minetest.get_worldpath()
technic.config = Settings(worldpath.."/technic.conf")
local conf_table = technic.config:to_table() local conf_table = technic.config:to_table()
@ -6,13 +9,10 @@ local defaults = {
enable_mining_drill = "true", enable_mining_drill = "true",
enable_mining_laser = "true", enable_mining_laser = "true",
enable_flashlight = "false", enable_flashlight = "false",
enable_rubber_tree_generation = "true",
enable_marble_generation = "true",
enable_granite_generation = "true",
enable_wind_mill = "false", enable_wind_mill = "false",
enable_frames = "false",
enable_corium_griefing = "true",
enable_radiation_protection = "true",
enable_entity_radiation_damage = "true",
enable_longterm_radiation_damage = "true",
enable_nuclear_reactor_digiline_selfdestruct = "false",
} }
for k, v in pairs(defaults) do for k, v in pairs(defaults) do
@ -20,3 +20,4 @@ for k, v in pairs(defaults) do
technic.config:set(k, v) technic.config:set(k, v)
end end
end end

View File

@ -1,18 +1,4 @@
-- check if we have the necessary dependencies to allow actually using these materials in the crafts -- tubes crafting recipes
local mesecons_materials = minetest.get_modpath("mesecons_materials")
-- Remove some recipes
-- Bronze
minetest.clear_craft({
type = "shapeless",
output = "default:bronze_ingot"
})
-- Accelerator tube
if pipeworks.enable_accelerator_tube then
minetest.clear_craft({
output = "pipeworks:accelerator_tube_1",
})
minetest.register_craft({ minetest.register_craft({
output = 'pipeworks:accelerator_tube_1', output = 'pipeworks:accelerator_tube_1',
@ -20,13 +6,6 @@ if pipeworks.enable_accelerator_tube then
{'technic:copper_coil', 'pipeworks:tube_1', 'technic:copper_coil'}, {'technic:copper_coil', 'pipeworks:tube_1', 'technic:copper_coil'},
} }
}) })
end
-- Teleport tube
if pipeworks.enable_teleport_tube then
minetest.clear_craft({
output = "pipeworks:teleport_tube_1",
})
minetest.register_craft({ minetest.register_craft({
output = 'pipeworks:teleport_tube_1', output = 'pipeworks:teleport_tube_1',
@ -36,9 +15,6 @@ if pipeworks.enable_teleport_tube then
{'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'}, {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
} }
}) })
end
-- tubes crafting recipes
minetest.register_craft({ minetest.register_craft({
output = 'technic:diamond_drill_head', output = 'technic:diamond_drill_head',
@ -61,18 +37,18 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
output = 'technic:blue_energy_crystal', output = 'technic:blue_energy_crystal',
recipe = { recipe = {
{'moreores:mithril_ingot', 'technic:battery', 'dye:blue'}, {'default:gold_ingot', 'technic:battery', 'dye:blue'},
{'technic:battery', 'technic:green_energy_crystal', 'technic:battery'}, {'technic:battery', 'technic:green_energy_crystal', 'technic:battery'},
{'dye:blue', 'technic:battery', 'moreores:mithril_ingot'}, {'dye:blue', 'technic:battery', 'default:gold_ingot'},
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = 'technic:red_energy_crystal', output = 'technic:red_energy_crystal',
recipe = { recipe = {
{'moreores:silver_ingot', 'technic:battery', 'dye:red'}, {'default:gold_ingot', 'technic:battery', 'dye:red'},
{'technic:battery', 'default:diamondblock', 'technic:battery'}, {'technic:battery', 'default:diamondblock', 'technic:battery'},
{'dye:red', 'technic:battery', 'moreores:silver_ingot'}, {'dye:red', 'technic:battery', 'default:gold_ingot'},
} }
}) })
@ -121,12 +97,10 @@ minetest.register_craft({
} }
}) })
local isolation = mesecons_materials and "mesecons_materials:fiber" or "technic:rubber"
minetest.register_craft({ minetest.register_craft({
output = 'technic:lv_transformer', output = 'technic:lv_transformer',
recipe = { recipe = {
{isolation, 'technic:wrought_iron_ingot', isolation}, {'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot'},
{'technic:copper_coil', 'technic:wrought_iron_ingot', 'technic:copper_coil'}, {'technic:copper_coil', 'technic:wrought_iron_ingot', 'technic:copper_coil'},
{'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot'}, {'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot'},
} }
@ -135,7 +109,7 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
output = 'technic:mv_transformer', output = 'technic:mv_transformer',
recipe = { recipe = {
{isolation, 'technic:carbon_steel_ingot', isolation}, {'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot'},
{'technic:copper_coil', 'technic:carbon_steel_ingot', 'technic:copper_coil'}, {'technic:copper_coil', 'technic:carbon_steel_ingot', 'technic:copper_coil'},
{'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot'}, {'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot'},
} }
@ -144,7 +118,7 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
output = 'technic:hv_transformer', output = 'technic:hv_transformer',
recipe = { recipe = {
{isolation, 'technic:stainless_steel_ingot', isolation}, {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
{'technic:copper_coil', 'technic:stainless_steel_ingot', 'technic:copper_coil'}, {'technic:copper_coil', 'technic:stainless_steel_ingot', 'technic:copper_coil'},
{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
} }
@ -153,9 +127,9 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
output = 'technic:control_logic_unit', output = 'technic:control_logic_unit',
recipe = { recipe = {
{'', 'technic:fine_gold_wire', ''}, {'', 'default:gold_ingot', ''},
{'default:copper_ingot', 'technic:silicon_wafer', 'default:copper_ingot'}, {'default:copper_ingot', 'technic:silicon_wafer', 'default:copper_ingot'},
{'', 'technic:chromium_ingot', ''}, {'', 'default:copper_ingot', ''},
} }
}) })
@ -164,7 +138,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
{'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'},
{'default:tin_ingot', 'default:tin_ingot', 'default:tin_ingot'}, {'moreores:tin_ingot', 'moreores:tin_ingot', 'moreores:tin_ingot'},
} }
}) })
@ -184,15 +158,44 @@ minetest.register_craft({
}, },
}) })
-- Remove some recipes
minetest.register_craftitem("technic:nothing", {
description = "",
inventory_image = "blank.png",
})
if minetest.register_craft_predict then
minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv)
if itemstack:get_name() == "technic:nothing" then
return ItemStack("")
end
end)
end
-- Bronze
minetest.register_craft({ minetest.register_craft({
output = "default:dirt 2",
type = "shapeless", type = "shapeless",
replacements = {{"bucket:bucket_water","bucket:bucket_empty"}}, output = "technic:nothing",
recipe = {"default:copper_ingot", "default:steel_ingot"}
})
-- Accelerator tube
minetest.register_craft({
output = "technic:nothing",
recipe = { recipe = {
"technic:stone_dust", { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
"group:leaves", { "default:mese_crystal_fragment", "default:steel_ingot", "default:mese_crystal_fragment" },
"bucket:bucket_water", { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
"group:sand",
}, },
}) })
-- Teleport tube
minetest.register_craft({
output = "technic:nothing",
recipe = {
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
{ "default:desert_stone", "default:mese_block", "default:desert_stone" },
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
},
})

View File

@ -1,12 +1,7 @@
default default
moreores
pipeworks pipeworks
technic_worldgen mesecons
bucket?
screwdriver?
mesecons?
mesecons_mvps? mesecons_mvps?
digilines?
digiline_remote?
intllib? intllib?
unified_inventory? unified_inventory?
vector_extras?

View File

@ -1,133 +0,0 @@
This file is fairly incomplete. Help is welcome.
Tiers
-----
The tier is a string, currently `"LV"`, `"MV"` and `"HV"` are supported.
Network
-------
The network is the cable with the connected machine nodes. Currently the
switching station handles the network activity.
Helper functions
----------------
* `technic.EU_string(num)`
* Converts num to a human-readable string (see pretty_num)
and adds the `EU` unit
* Use this function when showing players energy values
* `technic.pretty_num(num)`
* Converts the number `num` to a human-readable string with SI prefixes
* `technic.swap_node(pos, nodename)`
* Same as `mintest.swap_node` but it only changes the nodename.
* It uses `minetest.get_node` before swapping to ensure the new nodename
is not the same as the current one.
* `technic.get_or_load_node(pos)`
* If the mapblock is loaded, it returns the node at pos,
else it loads the chunk and returns `nil`.
* `technic.set_RE_wear(itemstack, item_load, max_charge)`
* If the `wear_represents` field in the item's nodedef is
`"technic_RE_charge"`, this function does nothing.
* `technic.refill_RE_charge(itemstack)`
* This function fully recharges an RE chargeable item.
* If `technic.power_tools[itemstack:get_name()]` is `nil` (or `false`), this
function does nothing, else that value is the maximum charge.
* The itemstack metadata is changed to contain the charge.
* `technic.is_tier_cable(nodename, tier)`
* Tells whether the node `nodename` is the cable of the tier `tier`.
* `technic.get_cable_tier(nodename)`
* Returns the tier of the cable `nodename` or `nil`.
* `technic.trace_node_ray(pos, dir, range)`
* Returns an iteration function (usable in the for loop) to iterate over the
node positions along the specified ray.
* The returned positions will not include the starting position `pos`.
* `technic.trace_node_ray_fat(pos, dir, range)`
* Like `technic.trace_node_ray` but includes extra positions near the ray.
* The node ray functions are used for mining lasers.
* `technic.config:get(name)`
* Some configuration function
* `technic.tube_inject_item(pos, start_pos, velocity, item)`
* Same as `pipeworks.tube_inject_item`
Registration functions
----------------------
* `technic.register_power_tool(itemname, max_charge)`
* Same as `technic.power_tools[itemname] = max_charge`
* This function makes the craftitem `itemname` chargeable.
* `technic.register_machine(tier, nodename, machine_type)`
* Same as `technic.machines[tier][nodename] = machine_type`
* Currently this is requisite to make technic recognize your node.
* See also `Machine types`
* `technic.register_tier(tier)`
* Same as `technic.machines[tier] = {}`
* See also `tiers`
### Specific machines
* `technic.register_solar_array(data)`
* data is a table
Used itemdef fields
-------------------
* groups:
* `technic_<ltier> = 1` ltier is a tier in small letters; this group makes
the node connect to the cable(s) of the right tier.
* `technic_machine = 1` Currently used for
* `connect_sides`
* In addition to the default use (see lua_api.txt), this tells where the
machine can be connected.
#
#
* `technic_run(pos, node)`
* This function is currently used to update the node.
Modders have to manually change the information about supply etc. in the
node metadata.
Machine types
-------------
There are currently following types:
* `technic.receiver = "RE"` e.g. grinder
* `technic.producer = "PR"` e.g. solar panel
* `technic.producer_receiver = "PR_RE"` supply converter
* `technic.battery = "BA"` e.g. LV batbox
Switching Station
-----------------
The switching station is the center of all power distribution on an electric
network.
The station collects power from sources (PR), distributes it to sinks (RE),
and uses the excess/shortfall to charge and discharge batteries (BA).
For now, all supply and demand values are expressed in kW.
It works like this:
All PR,BA,RE nodes are indexed and tagged with the switching station.
The tagging is a workaround to allow more stations to be built without allowing
a cheat with duplicating power.
All the RE nodes are queried for their current EU demand. Those which are off
would require no or a small standby EU demand, while those which are on would
require more.
If the total demand is less than the available power they are all updated with
the demand number.
If any surplus exists from the PR nodes the batteries will be charged evenly
with this.
If the total demand requires draw on the batteries they will be discharged
evenly.
If the total demand is more than the available power all RE nodes will be shut
down. We have a brown-out situation.
Hence for now all the power distribution logic resides in this single node.
### Node meta usage
Nodes connected to the network will have one or more of these parameters as meta
data:
* `<LV|MV|HV>_EU_supply` : Exists for PR and BA node types.
This is the EU value supplied by the node. Output
* `<LV|MV|HV>_EU_demand` : Exists for RE and BA node types.
This is the EU value the node requires to run. Output
* `<LV|MV|HV>_EU_input` : Exists for RE and BA node types.
This is the actual EU value the network can give the node. Input
The reason the LV|MV|HV type is prepended to meta data is because some machine
could require several supplies to work.
This way the supplies are separated per network.

View File

@ -1,71 +1,20 @@
local constant_digit_count = technic.config:get("constant_digit_count") minetest.swap_node = minetest.swap_node or function(pos, node)
local oldmeta = minetest.get_meta(pos):to_table()
-- converts a number to a readable string with SI prefix, e.g. 10000 → "10 k", minetest.set_node(pos, node)
-- 15 → "15 ", 0.1501 → "150.1 m" minetest.get_meta(pos):from_table(oldmeta)
-- a non-breaking space (U+a0) instead of a usual one is put after number
-- The precision is 4 digits
local prefixes = {[-8] = "y", [-7] = "z", [-6] = "a", [-5] = "f", [-4] = "p",
[-3] = "n", [-2] = "µ", [-1] = "m", [0] = "", [1] = "k", [2] = "M",
[3] = "G", [4] = "T", [5] = "P", [6] = "E", [7] = "Z", [8] = "Y"}
function technic.pretty_num(num)
-- the small number added is due to floating point inaccuracy
local b = math.floor(math.log10(math.abs(num)) +0.000001)
local pref_i
if b ~= 0 then
-- b is decremented by 1 to avoid a single digit with many decimals,
-- e.g. instead of 1.021 MEU, 1021 kEU is shown
pref_i = math.floor((b - 1) / 3)
else
-- as special case, avoid showing e.g. 1100 mEU instead of 1.1 EU
pref_i = 0
end
if not prefixes[pref_i] then
-- This happens for 0, nan, inf, very big values, etc.
if num == 0 then
-- handle 0 explicilty to avoid showing "-0"
if not constant_digit_count then
return "0 "
end
-- gives 0.000
return string.format("%.3f ", 0)
end
return string.format("%.4g ", num)
end end
num = num * 10 ^ (-3 * pref_i) -- Only changes name, keeps other params
if constant_digit_count then
local comma_digits_cnt = 3 - (b - 3 * pref_i)
return string.format("%." .. comma_digits_cnt .. "f %s",
num, prefixes[pref_i])
end
return string.format("%.4g %s", num, prefixes[pref_i])
end
-- some unittests
assert(technic.pretty_num(-0) == "0 ")
assert(technic.pretty_num(0) == "0 ")
assert(technic.pretty_num(1234) == "1234 ")
assert(technic.pretty_num(123456789) == "123.5 M")
-- used to display power values
function technic.EU_string(num)
return technic.pretty_num(num) .. "EU"
end
--- Same as minetest.swap_node, but only changes name
-- and doesn't re-set if already set.
function technic.swap_node(pos, name) function technic.swap_node(pos, name)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
if node.name ~= name then if node.name ~= name then
node.name = name node.name = name
minetest.swap_node(pos, node) minetest.swap_node(pos, node)
end end
return node.name
end end
-- Fully charge RE chargeable item.
--- Fully charge RE chargeable item.
-- Must be defined early to reference in item definitions. -- Must be defined early to reference in item definitions.
function technic.refill_RE_charge(stack) function technic.refill_RE_charge(stack)
local max_charge = technic.power_tools[stack:get_name()] local max_charge = technic.power_tools[stack:get_name()]
@ -77,148 +26,20 @@ function technic.refill_RE_charge(stack)
return stack return stack
end end
--------------------------------------------------------------------------------
-- If the node is loaded, returns it. If it isn't loaded, load it and return nil. local function resolve_name(function_name)
function technic.get_or_load_node(pos) local a = _G
local node = minetest.get_node_or_nil(pos) for key in string.gmatch(function_name, "([^%.]+)(%.?)") do
if node then return node end if a[key] then
local vm = VoxelManip() a = a[key]
local MinEdge, MaxEdge = vm:read_from_map(pos, pos) else
return nil return nil
end end
end
return a
technic.tube_inject_item = pipeworks.tube_inject_item or function(pos, start_pos, velocity, item)
local tubed = pipeworks.tube_item(vector.new(pos), item)
tubed:get_luaentity().start_pos = vector.new(start_pos)
tubed:setvelocity(velocity)
tubed:setacceleration(vector.new(0, 0, 0))
end end
function technic.function_exists(function_name)
--- Iterates over the node positions along the specified ray. return type(resolve_name(function_name)) == 'function'
-- The returned positions will not include the starting position.
function technic.trace_node_ray(pos, dir, range)
local x_step = dir.x > 0 and 1 or -1
local y_step = dir.y > 0 and 1 or -1
local z_step = dir.z > 0 and 1 or -1
local i = 1
return function(p)
-- Approximation of where we should be if we weren't rounding
-- to nodes. This moves forward a bit faster then we do.
-- A correction is done below.
local real_x = pos.x + (dir.x * i)
local real_y = pos.y + (dir.y * i)
local real_z = pos.z + (dir.z * i)
-- How far off we've gotten from where we should be.
local dx = math.abs(real_x - p.x)
local dy = math.abs(real_y - p.y)
local dz = math.abs(real_z - p.z)
-- If the real position moves ahead too fast, stop it so we
-- can catch up. If it gets too far ahead it will smooth
-- out our movement too much and we won't turn fast enough.
if dx + dy + dz < 2 then
i = i + 1
end end
--------------------------------------------------------------------------------
-- Step in whichever direction we're most off course in.
if dx > dy then
if dx > dz then
p.x = p.x + x_step
else
p.z = p.z + z_step
end
elseif dy > dz then
p.y = p.y + y_step
else
p.z = p.z + z_step
end
if vector.distance(pos, p) > range then
return nil
end
return p
end, vector.round(pos)
end
--- Like trace_node_ray, but includes extra positions close to the ray.
function technic.trace_node_ray_fat(pos, dir, range)
local x_step = dir.x > 0 and 1 or -1
local y_step = dir.y > 0 and 1 or -1
local z_step = dir.z > 0 and 1 or -1
local next_poses = {}
local i = 1
return function(p)
local ni, np = next(next_poses)
if np then
next_poses[ni] = nil
return np
end
-- Approximation of where we should be if we weren't rounding
-- to nodes. This moves forward a bit faster then we do.
-- A correction is done below.
local real_x = pos.x + (dir.x * i)
local real_y = pos.y + (dir.y * i)
local real_z = pos.z + (dir.z * i)
-- How far off we've gotten from where we should be.
local dx = math.abs(real_x - p.x)
local dy = math.abs(real_y - p.y)
local dz = math.abs(real_z - p.z)
-- If the real position moves ahead too fast, stop it so we
-- can catch up. If it gets too far ahead it will smooth
-- out our movement too much and we won't turn fast enough.
if dx + dy + dz < 2 then
i = i + 1
end
-- Step in whichever direction we're most off course in.
local sx, sy, sz -- Whether we've already stepped along each axis
if dx > dy then
if dx > dz then
sx = true
p.x = p.x + x_step
else
sz = true
p.z = p.z + z_step
end
elseif dy > dz then
sy = true
p.y = p.y + y_step
else
sz = true
p.z = p.z + z_step
end
if vector.distance(pos, p) > range then
return nil
end
-- Add other positions that we're significantly off on.
-- We can just use fixed integer keys here because the
-- table will be completely cleared before we reach this
-- code block again.
local dlen = math.sqrt(dx*dx + dy*dy + dz*dz)
-- Normalized axis deltas
local dxn, dyn, dzn = dx / dlen, dy / dlen, dz / dlen
if not sx and dxn > 0.5 then
next_poses[1] = vector.new(p.x + x_step, p.y, p.z)
end
if not sy and dyn > 0.5 then
next_poses[2] = vector.new(p.x, p.y + y_step, p.z)
end
if not sz and dzn > 0.5 then
next_poses[3] = vector.new(p.x, p.y, p.z + z_step)
end
return p
end, vector.round(pos)
end

View File

@ -2,21 +2,17 @@
-- namespace: technic -- namespace: technic
-- (c) 2012-2013 by RealBadAngel <mk@realbadangel.pl> -- (c) 2012-2013 by RealBadAngel <mk@realbadangel.pl>
technic = {}
local load_start = os.clock() local load_start = os.clock()
technic = rawget(_G, "technic") or {}
technic.creative_mode = minetest.settings:get_bool("creative_mode")
local modpath = minetest.get_modpath("technic") local modpath = minetest.get_modpath("technic")
technic.modpath = modpath technic.modpath = modpath
-- Boilerplate to support intllib -- Boilerplate to support intllib
if rawget(_G, "intllib") then if intllib then
technic.getter = intllib.Getter() technic.getter = intllib.Getter()
else else
technic.getter = function(s,a,...)if a==nil then return s end a={a,...}return s:gsub("(@?)@(%(?)(%d+)(%)?)",function(e,o,n,c)if e==""then return a[tonumber(n)]..(o==""and c or"")else return"@"..o..n..c end end) end technic.getter = function(s) return s end
end end
local S = technic.getter local S = technic.getter
@ -35,9 +31,6 @@ dofile(modpath.."/crafts.lua")
-- Register functions -- Register functions
dofile(modpath.."/register.lua") dofile(modpath.."/register.lua")
-- Radiation
dofile(modpath.."/radiation.lua")
-- Machines -- Machines
dofile(modpath.."/machines/init.lua") dofile(modpath.."/machines/init.lua")
@ -47,7 +40,7 @@ dofile(modpath.."/tools/init.lua")
-- Aliases for legacy node/item names -- Aliases for legacy node/item names
dofile(modpath.."/legacy.lua") dofile(modpath.."/legacy.lua")
if minetest.settings:get_bool("log_mods") then if minetest.setting_get("log_mod") then
print(S("[Technic] Loaded in %f seconds"):format(os.clock() - load_start)) print(S("[Technic] Loaded in %f seconds"):format(os.clock() - load_start))
end end

View File

@ -11,6 +11,11 @@ minetest.register_craftitem( "technic:doped_silicon_wafer", {
inventory_image = "technic_doped_silicon_wafer.png", inventory_image = "technic_doped_silicon_wafer.png",
}) })
minetest.register_craftitem("technic:enriched_uranium", {
description = S("Enriched Uranium"),
inventory_image = "technic_enriched_uranium.png",
})
minetest.register_craftitem("technic:uranium_fuel", { minetest.register_craftitem("technic:uranium_fuel", {
description = S("Uranium Fuel"), description = S("Uranium Fuel"),
inventory_image = "technic_uranium_fuel.png", inventory_image = "technic_uranium_fuel.png",
@ -100,6 +105,10 @@ minetest.register_craftitem("technic:lv_transformer", {
inventory_image = "technic_lv_transformer.png", inventory_image = "technic_lv_transformer.png",
}) })
minetest.register_craftitem("technic:lv_transformer", {
description = S("Low Voltage Transformer"),
inventory_image = "technic_lv_transformer.png",
})
minetest.register_craftitem("technic:mv_transformer", { minetest.register_craftitem("technic:mv_transformer", {
description = S("Medium Voltage Transformer"), description = S("Medium Voltage Transformer"),
inventory_image = "technic_mv_transformer.png", inventory_image = "technic_mv_transformer.png",
@ -154,71 +163,3 @@ minetest.register_node("technic:machine_casing", {
tiles = {"technic_machine_casing.png"}, tiles = {"technic_machine_casing.png"},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
}) })
for p = 0, 35 do
local nici = (p ~= 0 and p ~= 7 and p ~= 35) and 1 or nil
local psuffix = p == 7 and "" or p
local ingot = "technic:uranium"..psuffix.."_ingot"
local block = "technic:uranium"..psuffix.."_block"
local ov = p == 7 and minetest.override_item or nil;
(ov or minetest.register_craftitem)(ingot, {
description = string.format(S("%.1f%%-Fissile Uranium Ingot"), p/10),
inventory_image = "technic_uranium_ingot.png",
groups = {uranium_ingot=1, not_in_creative_inventory=nici},
});
-- Note on radioactivity of blocks:
-- Source: <http://www.wise-uranium.org/rup.html>
-- The baseline radioactivity of an isotope is not especially
-- correlated with whether it's fissile (i.e., suitable as
-- reactor fuel). Natural uranium consists mainly of fissile
-- U-235 and non-fissile U-238, and both U-235 and U-238 are
-- significantly radioactive. U-235's massic activity is
-- about 80.0 MBq/kg, and U-238's is about 12.4 MBq/kg, which
-- superficially suggests that 3.5%-fissile uranium should have
-- only 1.19 times the activity of fully-depleted uranium.
-- But a third isotope affects the result hugely: U-234 has
-- massic activity of 231 GBq/kg. Natural uranium has massic
-- composition of 99.2837% U-238, 0.711% U-235, and 0.0053% U-234,
-- so its activity comes roughly 49% each from U-234 and U-238
-- and only 2% from U-235. During enrichment via centrifuge,
-- the U-234 fraction is concentrated along with the U-235, with
-- the U-234:U-235 ratio remaining close to its original value.
-- (Actually the U-234 gets separated from U-238 slightly more
-- than the U-235 is, so the U-234:U-235 ratio is slightly
-- higher in enriched uranium.) A typical massic composition
-- for 3.5%-fissile uranium is 96.47116% U-238, 3.5% U-235, and
-- 0.02884% U-234. This gives 3.5%-fissile uranium about 6.55
-- times the activity of fully-depleted uranium. The values we
-- compute here for the "radioactive" group value are based on
-- linear interpolation of activity along that scale, rooted at
-- a natural (0.7%-fissile) uranium block having the activity of
-- 9 uranium ore blocks (due to 9 ingots per block). The group
-- value is proportional to the square root of the activity, and
-- uranium ore has radioactive=1. This yields radioactive=1.0
-- for a fully-depleted uranium block and radioactive=2.6 for
-- a 3.5%-fissile uranium block.
local radioactivity = math.floor(math.sqrt((1+5.55*p/35) * 18 / (1+5.55*7/35)) + 0.5);
(ov or minetest.register_node)(block, {
description = string.format(S("%.1f%%-Fissile Uranium Block"), p/10),
tiles = {"technic_uranium_block.png"},
is_ground_content = true,
groups = {uranium_block=1, not_in_creative_inventory=nici,
cracky=1, level=2, radioactive=radioactivity},
sounds = default.node_sound_stone_defaults(),
});
if not ov then
minetest.register_craft({
output = block,
recipe = {
{ingot, ingot, ingot},
{ingot, ingot, ingot},
{ingot, ingot, ingot},
},
})
minetest.register_craft({
output = ingot.." 9",
recipe = {{block}},
})
end
end

View File

@ -22,20 +22,16 @@ technic.legacy_nodenames = {
["technic:compressor"] = "technic:lv_compressor", ["technic:compressor"] = "technic:lv_compressor",
["technic:compressor_active"] = "technic:lv_compressor_active", ["technic:compressor_active"] = "technic:lv_compressor_active",
["technic:hv_battery_box"] = "technic:hv_battery_box0", ["technic:hv_battery_box"] = "technic:hv_battery_box0",
["technic:hv_cable"] = "technic:hv_cable0",
["technic:lv_cable"] = "technic:lv_cable0",
["technic:mv_cable"] = "technic:mv_cable0",
["technic:mv_battery_box"] = "technic:mv_battery_box0", ["technic:mv_battery_box"] = "technic:mv_battery_box0",
["technic:generator"] = "technic:lv_generator", ["technic:generator"] = "technic:lv_generator",
["technic:generator_active"] = "technic:lv_generator_active", ["technic:generator_active"] = "technic:lv_generator_active",
["technic:iron_dust"] = "technic:wrought_iron_dust", ["technic:iron_dust"] = "technic:wrought_iron_dust",
["technic:enriched_uranium"] = "technic:uranium35_ingot",
} }
for old, new in pairs(technic.legacy_nodenames) do for old, new in pairs(technic.legacy_nodenames) do
minetest.register_alias(old, new) minetest.register_alias(old, new)
end end
for i = 0, 64 do
minetest.register_alias("technic:hv_cable"..i, "technic:hv_cable")
minetest.register_alias("technic:mv_cable"..i, "technic:mv_cable")
minetest.register_alias("technic:lv_cable"..i, "technic:lv_cable")
end

View File

@ -29,14 +29,11 @@ Graphite = Graphit
Carbon Cloth = Kohlefasergewebe Carbon Cloth = Kohlefasergewebe
Raw Latex = Rohlatex Raw Latex = Rohlatex
Rubber Fiber = Gummifaser Rubber Fiber = Gummifaser
%.1f%%-Fissile Uranium Ingot =
%.1f%%-Fissile Uranium Block =
## Machine misc ## Machine misc
Machine cannot be removed because it is not empty = Die Maschine kann nicht entfernt werden, weil sie noch nicht leer ist. Machine cannot be removed because it is not empty = Die Maschine kann nicht entfernt werden, weil sie noch nicht leer ist.
Inventory move disallowed due to protection = Das Inventar ist geschuetzt, Zugriff verweigert. Inventory move disallowed due to protection = Das Inventar ist geschuetzt, Zugriff verweigert.
# $1: Machine name (Includes tier) # $1: Machine name (Includes tier)
@1 Active (@2 EU) = @1 ist eingeschaltet (@2 EU)
%s Active = %s ist eingeschaltet %s Active = %s ist eingeschaltet
%s Disabled = %s ist ausgeschaltet %s Disabled = %s ist ausgeschaltet
%s Enabled = %s Enabled =
@ -53,14 +50,9 @@ Upgrade Slots = Verbesserungsfaecher
In: = Rein: In: = Rein:
Out: = Raus: Out: = Raus:
Slot %d = Fach %d Slot %d = Fach %d
Itemwise = Einzelstuecke Mode: %s = Methode: %s
Stackwise = Ganzer Stapel single items = Einzelstuecke
Owner: = whole stacks = Ganzer Stapel
Unlocked =
Locked =
Radius: =
Enabled =
Disabled =
## Machine names ## Machine names
# $1: Tier # $1: Tier
@ -83,7 +75,7 @@ Hydro %s Generator = %s Wassermuehle
Nuclear %s Generator Core = %s Reaktorkern Nuclear %s Generator Core = %s Reaktorkern
Small Solar %s Generator = %s Solarmodul Small Solar %s Generator = %s Solarmodul
Wind %s Generator = %s Windmuehle Wind %s Generator = %s Windmuehle
Self-Contained Injector = Selbstversorger-Injektor Injector = Injektor
Constructor Mk%d = Konstruktor Modell %d Constructor Mk%d = Konstruktor Modell %d
Frame = Rahmen Frame = Rahmen
Frame Motor = Rahmenmotor Frame Motor = Rahmenmotor
@ -99,7 +91,6 @@ Fuel-Fired Furnace = Kohle-Ofen
Wind Mill Frame = Windmuehlengeruest Wind Mill Frame = Windmuehlengeruest
Forcefield = Kraftfeld Forcefield = Kraftfeld
Nuclear Reactor Rod Compartment = Brennstabfaecher Nuclear Reactor Rod Compartment = Brennstabfaecher
Administrative World Anchor =
## Machine-specific ## Machine-specific
# $1: Pruduced EU # $1: Pruduced EU
@ -107,19 +98,13 @@ Charge = Aufladen
Discharge = Entladen Discharge = Entladen
Power level = Energiestufe Power level = Energiestufe
# $1: Tier $2: current_charge $3: max_charge # $1: Tier $2: current_charge $3: max_charge
@1 Battery Box: @2/@3 = @1 Batteriebox: @2/@3 %s Battery Box: %d/%d = %s Batteriebox: %d/%d
# $1: Machine name $2: Supply $3: Demand # $1: Machine name $2: Supply $3: Demand
@1. Supply: @2 Demand: @3 = @1. Versorgung: @2 Bedarf: @3 %s. Supply: %d Demand: %d = %s. Versorgung: %d Bedarf: %d
Production at %d%% = Produktion bei %d%% Production at %d%% = Produktion bei %d%%
Choose Milling Program: = Waehle ein Fraesprogramm: Choose Milling Program: = Waehle ein Fraesprogramm:
Slim Elements half / normal height: = Schmale Elemente von halber / normaler Hoehe: Slim Elements half / normal height: = Schmale Elemente von halber / normaler Hoehe:
Current track %s = Aktueller Titel %s Current track %s = Aktueller Titel %s
Stopped =
Keeping %d/%d map blocks loaded =
Digging not started =
Digging finished =
Digging %d m above machine =
Digging %d m below machine =
## CNC ## CNC
Cylinder = Zylinder Cylinder = Zylinder
@ -177,7 +162,6 @@ Talinite = Talinite
Tin = Zinn Tin = Zinn
Wrought Iron = Schmiedeeisen Wrought Iron = Schmiedeeisen
Zinc = Zink Zinc = Zink
%.1f%%-Fissile Uranium =
## Tools ## Tools
RE Battery = Akkubatterie RE Battery = Akkubatterie

View File

@ -29,14 +29,11 @@ Graphite = Grafito
Carbon Cloth = Tela de Carbon Carbon Cloth = Tela de Carbon
Raw Latex = Latex Crudo Raw Latex = Latex Crudo
Rubber Fiber = Fibra de Hule Rubber Fiber = Fibra de Hule
%.1f%%-Fissile Uranium Ingot =
%.1f%%-Fissile Uranium Block =
## Machine misc ## Machine misc
Machine cannot be removed because it is not empty = La maquina no puede removerse porque no esta vacia Machine cannot be removed because it is not empty = La maquina no puede removerse porque no esta vacia
Inventory move disallowed due to protection = Inventory move disallowed due to protection =
# $1: Machine name (Includes tier) # $1: Machine name (Includes tier)
@1 Active (@2 EU) = @1 Activo (@2 EU)
%s Active = %s Activo %s Active = %s Activo
%s Enabled = %s Enabled =
%s Idle = %s Quieto %s Idle = %s Quieto
@ -49,14 +46,6 @@ Inventory move disallowed due to protection =
%s Improperly Placed = %s No Colocado Apropiadamente %s Improperly Placed = %s No Colocado Apropiadamente
Range = Alcance Range = Alcance
Enable/Disable = Habilitar/Deshabilitar Enable/Disable = Habilitar/Deshabilitar
Itemwise =
Stackwise =
Owner: =
Unlocked =
Locked =
Radius: =
Enabled =
Disabled =
## Machine names ## Machine names
# $1: Tier # $1: Tier
@ -79,7 +68,7 @@ Hydro %s Generator = Molino de Agua %s
Nuclear %s Generator Core = Nucleo de Reactor Nuclear %s Nuclear %s Generator Core = Nucleo de Reactor Nuclear %s
Small Solar %s Generator = Panel Solar %s Small Solar %s Generator = Panel Solar %s
Wind %s Generator = Molino de Viento %s Wind %s Generator = Molino de Viento %s
Self-Contained Injector = Injector =
Constructor Mk%d = Constructor Mk%d =
Frame = Frame =
Frame Motor = Frame Motor =
@ -95,7 +84,6 @@ Fuel-Fired Furnace = Horno a Carbon
Forcefield = Campo de Fuerza Forcefield = Campo de Fuerza
Nuclear Reactor Rod Compartment = Compartimiento para Vara de Reactor Nuclear Nuclear Reactor Rod Compartment = Compartimiento para Vara de Reactor Nuclear
Wind Mill Frame = Armazon de Molino de Viento Wind Mill Frame = Armazon de Molino de Viento
Administrative World Anchor =
## Machine-specific ## Machine-specific
# $1: Pruduced EU # $1: Pruduced EU
@ -103,17 +91,11 @@ Charge = Cargar
Discharge = Descargar Discharge = Descargar
Power level = Nivel de Poder Power level = Nivel de Poder
# $1: Tier $2: current_charge $3: max_charge # $1: Tier $2: current_charge $3: max_charge
@1 Battery Box: @2/@3 = Caja de Bateria @1: @2/@3 %s Battery Box: %d/%d = Caja de Bateria %s: %d/%d
# $1: Machine name $2: Supply $3: Demand # $1: Machine name $2: Supply $3: Demand
@1. Supply: @2 Demand: @3 = @1. Alimentacion: @2 Demanda: @3 %s. Supply: %d Demand: %d = %s. Alimentacion: %d Demanda: %d
# $1: Production percent # $1: Production percent
Production at %d%% = Produccion en %d%% Production at %d%% = Produccion en %d%%
Stopped =
Keeping %d/%d map blocks loaded =
Digging not started =
Digging finished =
Digging %d m above machine =
Digging %d m below machine =
## CNC Machine ## CNC Machine
Element Edge = Elemento Borde Element Edge = Elemento Borde
@ -170,7 +152,6 @@ Talinite = Talinita
Tin = Estanio Tin = Estanio
Wrought Iron = Hierro Forjado Wrought Iron = Hierro Forjado
Zinc = Zinc Zinc = Zinc
%.1f%%-Fissile Uranium =
## Tools ## Tools
RE Battery = RE Battery =

View File

@ -26,17 +26,14 @@ Graphite = Lastra in graffite
Carbon Cloth = Fibra di carbonio Carbon Cloth = Fibra di carbonio
Raw Latex = Latex grezzo Raw Latex = Latex grezzo
Rubber Fiber = Fibra di gomma Rubber Fiber = Fibra di gomma
%.1f%%-Fissile Uranium Ingot = %.1f%%-Lingotto di uranio fissile
%.1f%%-Fissile Uranium Block = %.1f%%-Blocco di uranio fissile
## Machine misc ## Machine misc
Machine cannot be removed because it is not empty = La macchina non può essere rimossa perchè non è vuota Machine cannot be removed because it is not empty = La macchina non può essere rimossa perchè non è vuota
Inventory move disallowed due to protection = Impossibile muovere l'inventario a causa della protezione Inventory move disallowed due to protection = Impossibile muovere l'inventario a causa della protezione
# $1: Machine name (Includes tier) # $1: Machine name (Includes tier)
@1 Active (@2 EU) = @1 Attivo (@2 EU)
%s Active = %s Attivo %s Active = %s Attivo
%s Disabled = %s Disabilitato %s Disabled = %s Disabilitato
%s Enabled = %s Abilitato %s Enabled =
%s Idle = %s Inattivo %s Idle = %s Inattivo
%s Improperly Placed = %s Piazzato impropiamente %s Improperly Placed = %s Piazzato impropiamente
%s Unpowered = %s Non alimentato %s Unpowered = %s Non alimentato
@ -46,18 +43,13 @@ Inventory move disallowed due to protection = Impossibile muovere l'inventario a
%s Finished = %s Finito %s Finished = %s Finito
Enable/Disable = Abilita/Disabilita Enable/Disable = Abilita/Disabilita
Range = Raggio Range = Raggio
Upgrade Slots = Alloggi di aggiornamento Upgrade Slots =
In: = Ingresso: In: = Ingresso:
Out: = Uscita: Out: = Uscita:
Slot %d = Alloggio %d Slot %d =
Itemwise = Singolo elemento Mode: %s = Modalità: %s
Stackwise = pila completa single items = Singolo elemento
Owner: = Proprietario: whole stacks = pila completa
Unlocked = Non chiuso a chiave
Locked = Chiuso a chiave
Radius: = Raggio:
Enabled = Abilitato
Disabled = Disabilitato
## Machine names ## Machine names
# $1: Tier # $1: Tier
@ -80,14 +72,14 @@ Hydro %s Generator = Turbina Elettrica %s
Nuclear %s Generator Core = Reattore nucleare %s Nuclear %s Generator Core = Reattore nucleare %s
Small Solar %s Generator = %s Pannello solare Small Solar %s Generator = %s Pannello solare
Wind %s Generator = %s Generatore eolico Wind %s Generator = %s Generatore eolico
Self-Contained Injector = Ignettore Injector = Ignettore
Constructor Mk%d = Costruttore Mk%d Constructor Mk%d = Costruttore Mk%d
Frame = Cornice Frame = Cornice
Frame Motor = Cornice del motore Frame Motor = Cornice del motore
Template = Sagoma Template =
Template (replacing) = Sagoma (di rimpiazzo) Template (replacing) = Template (rimpiazzato)
Template Motor = Motore per sagome Template Motor =
Template Tool = Strumento per sagome Template Tool =
Battery Box = Box batterie Battery Box = Box batterie
Supply Converter = Trasformatore Supply Converter = Trasformatore
Switching Station = Stazione di controllo Switching Station = Stazione di controllo
@ -96,7 +88,6 @@ Fuel-Fired Furnace = Fornace a carbone
Wind Mill Frame = Pala eolica Wind Mill Frame = Pala eolica
Forcefield = Campo di forza Forcefield = Campo di forza
Nuclear Reactor Rod Compartment = Compartimento combustibile nucleare Nuclear Reactor Rod Compartment = Compartimento combustibile nucleare
Administrative World Anchor = Ancora-mondo amministrativa
## Machine-specific ## Machine-specific
# $1: Pruduced EU # $1: Pruduced EU
@ -104,19 +95,13 @@ Charge = Carica
Discharge = Scarica Discharge = Scarica
Power level = Livello di potenza Power level = Livello di potenza
# $1: Tier $2: current_charge $3: max_charge # $1: Tier $2: current_charge $3: max_charge
@1 Battery Box: @2/@3 = @1 Box Batterie: @2/@3 %s Battery Box: %d/%d = %s Box Batterie: %d/%d
# $1: Machine name $2: Supply $3: Demand # $1: Machine name $2: Supply $3: Demand
@1. Supply: @2 Demand: @3 = @1. Prodotto: @2 Consumato: @3 %s. Supply: %d Demand: %d = %s. Prodotto: %d Consumato: %d
Production at %d%% = Produzione a %d%% Production at %d%% = Produzione a %d%%
Choose Milling Program: = Scegliere un programma di Fresatura Choose Milling Program: = Scegliere un programma di Fresatura
Slim Elements half / normal height: = Metà elementi sottili / altezza normale: Slim Elements half / normal height: = Metà elementi sottili / altezza normale:
Current track %s = Traccia corrente %s Current track %s = Traccia corrente %s
Stopped = Fermato
Keeping %d/%d map blocks loaded = Mantenimento di %d/%d blocchi mappa caricati
Digging not started = Scavo non iniziato
Digging finished = Scavo finito
Digging %d m above machine = Scavo di %d m sopra la macchina
Digging %d m below machine = Scavo di %d m sotto la macchina
## CNC ## CNC
Cylinder = Cilindro Cylinder = Cilindro
@ -174,10 +159,9 @@ Talinite = Talinite
Tin = Stagno Tin = Stagno
Wrought Iron = Ferro Battuto Wrought Iron = Ferro Battuto
Zinc = Zinco Zinc = Zinco
%.1f%%-Fissile Uranium = %.1f%%-Uranio fissile
## Tools ## Tools
RE Battery = Batteria RE RE Battery =
Water Can = Serbatoio d'acqua Water Can = Serbatoio d'acqua
Lava Can = Serbatoio di lava Lava Can = Serbatoio di lava
Chainsaw = Motosega Chainsaw = Motosega

View File

@ -29,14 +29,11 @@ Graphite =
Carbon Cloth = Carbon Cloth =
Raw Latex = Raw Latex =
Rubber Fiber = Rubber Fiber =
%.1f%%-Fissile Uranium Ingot =
%.1f%%-Fissile Uranium Block =
## Machine misc ## Machine misc
Machine cannot be removed because it is not empty = Machine cannot be removed because it is not empty =
Inventory move disallowed due to protection = Inventory move disallowed due to protection =
# $1: Machine name (Includes tier) # $1: Machine name (Includes tier)
@1 Active (@2 EU) =
%s Active = %s Active =
%s Disabled = %s Disabled =
%s Enabled = %s Enabled =
@ -46,7 +43,6 @@ Inventory move disallowed due to protection =
%s Unpowered = %s Unpowered =
%s Out Of Fuel = %s Out Of Fuel =
%s Has Bad Cabling = %s Has Bad Cabling =
%s (Slave) =
%s Has No Network = %s Has No Network =
%s Finished = %s Finished =
Enable/Disable = Enable/Disable =
@ -55,16 +51,9 @@ Upgrade Slots =
In: = In: =
Out: = Out: =
Slot %d = Slot %d =
Itemwise = Mode: %s =
Stackwise = single items =
Ignoring Mesecon Signal = whole stacks =
Controlled by Mesecon Signal =
Owner: =
Unlocked =
Locked =
Radius: =
Enabled =
Disabled =
## Machine names ## Machine names
# $1: Tier # $1: Tier
@ -72,7 +61,6 @@ Disabled =
%s Battery Box = %s Battery Box =
%s Cable = %s Cable =
%s CNC Machine = %s CNC Machine =
%s Centrifuge =
%s Compressor = %s Compressor =
%s Extractor = %s Extractor =
%s Forcefield Emitter = %s Forcefield Emitter =
@ -88,7 +76,7 @@ Hydro %s Generator =
Nuclear %s Generator Core = Nuclear %s Generator Core =
Small Solar %s Generator = Small Solar %s Generator =
Wind %s Generator = Wind %s Generator =
Self-Contained Injector = Injector =
Constructor Mk%d = Constructor Mk%d =
Frame = Frame =
Frame Motor = Frame Motor =
@ -104,7 +92,6 @@ Fuel-Fired Furnace =
Wind Mill Frame = Wind Mill Frame =
Forcefield = Forcefield =
Nuclear Reactor Rod Compartment = Nuclear Reactor Rod Compartment =
Administrative World Anchor =
## Machine-specific ## Machine-specific
# $1: Pruduced EU # $1: Pruduced EU
@ -112,20 +99,13 @@ Charge =
Discharge = Discharge =
Power level = Power level =
# $1: Tier $2: current_charge $3: max_charge # $1: Tier $2: current_charge $3: max_charge
@1 Battery Box: @2/@3 = %s Battery Box: %d/%d =
# $1: Machine name $2: Supply $3: Demand # $1: Machine name $2: Supply $3: Demand
@1. Supply: @2 Demand: @3 = %s. Supply: %d Demand: %d =
Production at %d%% = Production at %d%% =
Choose Milling Program: = Choose Milling Program: =
Slim Elements half / normal height: = Slim Elements half / normal height: =
Current track %s = Current track %s =
Stopped =
Keeping %d/%d map blocks loaded =
Digging not started =
Digging finished =
Digging %d m above machine =
Digging %d m below machine =
@1 (@2 @3 -> @4 @5) =
## CNC ## CNC
Cylinder = Cylinder =
@ -183,7 +163,6 @@ Talinite =
Tin = Tin =
Wrought Iron = Wrought Iron =
Zinc = Zinc =
%.1f%%-Fissile Uranium =
## Tools ## Tools
RE Battery = RE Battery =
@ -208,4 +187,3 @@ Alloy cooking =
Grinding = Grinding =
Compressing = Compressing =
Extracting = Extracting =
Separating =

View File

@ -1,11 +1,10 @@
-- HV battery box -- HV battery box
minetest.register_craft({ minetest.register_craft({
output = 'technic:hv_battery_box0', output = 'technic:hv_battery_box0',
recipe = { recipe = {
{'technic:mv_battery_box0', 'technic:mv_battery_box0', 'technic:mv_battery_box0'}, {'technic:mv_battery_box0', 'technic:mv_battery_box0', 'technic:mv_battery_box0'},
{'technic:mv_battery_box0', 'technic:hv_transformer', 'technic:mv_battery_box0'}, {'technic:mv_battery_box0', 'technic:hv_transformer', 'technic:mv_battery_box0'},
{'', 'technic:hv_cable', ''}, {'', 'technic:hv_cable0', ''},
} }
}) })

View File

@ -1,10 +1,10 @@
minetest.register_craft({ minetest.register_craft({
output = 'technic:hv_cable 3', output = 'technic:hv_cable0 3',
recipe = { recipe = {
{'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'}, {'technic:rubber', 'technic:rubber', 'technic:rubber'},
{'technic:mv_cable', 'technic:mv_cable', 'technic:mv_cable'}, {'technic:mv_cable0', 'technic:mv_cable0', 'technic:mv_cable0'},
{'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'}, {'technic:rubber', 'technic:rubber', 'technic:rubber'},
} }
}) })

View File

@ -1,40 +1,26 @@
--- Forcefield generator. -- Forcefield mod by ShadowNinja
-- @author ShadowNinja -- Modified by kpoppel
-- --
-- Forcefields are powerful barriers but they consume huge amounts of power. -- Forcefields are powerful barriers but they consume huge amounts of power.
-- The forcefield Generator is an HV machine. -- Forcefield Generator is a HV machine.
-- How expensive is the generator? -- How expensive is the generator?
-- Leaves room for upgrades lowering the power drain? -- Leaves room for upgrades lowering the power drain?
local digilines_path = minetest.get_modpath("digilines")
local forcefield_power_drain = 10 local forcefield_power_drain = 10
local forcefield_step_interval = 1
local S = technic.getter local S = technic.getter
local cable_entry = "^technic_cable_connection_overlay.png"
minetest.register_craft({ minetest.register_craft({
output = "technic:forcefield_emitter_off", output = 'technic:forcefield_emitter_off',
recipe = { recipe = {
{"default:mese", "technic:motor", "default:mese" }, {'default:mese', 'technic:motor', 'default:mese' },
{"technic:deployer_off", "technic:machine_casing", "technic:deployer_off"}, {'technic:deployer_off', 'technic:machine_casing', 'technic:deployer_off'},
{"default:mese", "technic:hv_cable", "default:mese" }, {'default:mese', 'technic:hv_cable0', 'default:mese' },
} }
}) })
local replaceable_cids = {}
minetest.after(0, function()
for name, ndef in pairs(minetest.registered_nodes) do
if ndef.buildable_to == true and name ~= "ignore" then
replaceable_cids[minetest.get_content_id(name)] = true
end
end
end)
-- Idea: Let forcefields have different colors by upgrade slot. -- Idea: Let forcefields have different colors by upgrade slot.
-- Idea: Let forcefields add up by detecting if one hits another. -- Idea: Let forcefields add up by detecting if one hits another.
-- ___ __ -- ___ __
@ -42,12 +28,11 @@ end)
-- | | -- | |
-- \___/\___/ -- \___/\___/
local function update_forcefield(pos, meta, active, first) local function update_forcefield(pos, range, active)
local shape = meta:get_int("shape")
local range = meta:get_int("range")
local vm = VoxelManip() local vm = VoxelManip()
local MinEdge, MaxEdge = vm:read_from_map(vector.subtract(pos, range), local p1 = {x = pos.x-range, y = pos.y-range, z = pos.z-range}
vector.add(pos, range)) local p2 = {x = pos.x+range, y = pos.y+range, z = pos.z+range}
local MinEdge, MaxEdge = vm:read_from_map(p1, p2)
local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge})
local data = vm:get_data() local data = vm:get_data()
@ -58,23 +43,11 @@ local function update_forcefield(pos, meta, active, first)
for y=-range, range do for y=-range, range do
local vi = area:index(pos.x+(-range), pos.y+y, pos.z+z) local vi = area:index(pos.x+(-range), pos.y+y, pos.z+z)
for x=-range, range do for x=-range, range do
local relevant if x*x+y*y+z*z <= range * range + range and
if shape == 0 then x*x+y*y+z*z >= (range-1) * (range-1) + (range-1) then
local squared = x * x + y * y + z * z if active and data[vi] == c_air then
relevant =
squared <= range * range + range and
squared >= (range - 1) * (range - 1) + (range - 1)
else
relevant =
x == -range or x == range or
y == -range or y == range or
z == -range or z == range
end
if relevant then
local cid = data[vi]
if active and replaceable_cids[cid] then
data[vi] = c_field data[vi] = c_field
elseif not active and cid == c_field then elseif not active and data[vi] == c_field then
data[vi] = c_air data[vi] = c_air
end end
end end
@ -86,214 +59,54 @@ local function update_forcefield(pos, meta, active, first)
vm:set_data(data) vm:set_data(data)
vm:update_liquids() vm:update_liquids()
vm:write_to_map() vm:write_to_map()
-- update_map is very slow, but if we don't call it we'll
-- get phantom blocks on the client.
if not active or first then
vm:update_map() vm:update_map()
end end
end
local function set_forcefield_formspec(meta) local function set_forcefield_formspec(meta)
local formspec local formspec = "size[5,1.5]"..
if digilines_path then "field[2,0.5;2,1;range;"..S("Range")..";"..meta:get_int("range").."]"
formspec = "size[5,3.25]"..
"field[0.3,3;5,1;channel;Digiline Channel;"..meta:get_string("channel").."]"
else
formspec = "size[5,2.25]"
end
formspec = formspec..
"field[0.3,0.5;2,1;range;"..S("Range")..";"..meta:get_int("range").."]"
-- The names for these toggle buttons are explicit about which
-- state they'll switch to, so that multiple presses (arising
-- from the ambiguity between lag and a missed press) only make
-- the single change that the user expects.
if meta:get_int("shape") == 0 then
formspec = formspec.."button[3,0.2;2,1;shape1;"..S("Sphere").."]"
else
formspec = formspec.."button[3,0.2;2,1;shape0;"..S("Cube").."]"
end
if meta:get_int("mesecon_mode") == 0 then
formspec = formspec.."button[0,1;5,1;mesecon_mode_1;"..S("Ignoring Mesecon Signal").."]"
else
formspec = formspec.."button[0,1;5,1;mesecon_mode_0;"..S("Controlled by Mesecon Signal").."]"
end
if meta:get_int("enabled") == 0 then if meta:get_int("enabled") == 0 then
formspec = formspec.."button[0,1.75;5,1;enable;"..S("%s Disabled"):format(S("%s Forcefield Emitter"):format("HV")).."]" formspec = formspec.."button[0,1;5,1;enable;"..S("%s Disabled"):format(S("%s Forcefield Emitter"):format("HV")).."]"
else else
formspec = formspec.."button[0,1.75;5,1;disable;"..S("%s Enabled"):format(S("%s Forcefield Emitter"):format("HV")).."]" formspec = formspec.."button[0,1;5,1;disable;"..S("%s Enabled"):format(S("%s Forcefield Emitter"):format("HV")).."]"
end end
meta:set_string("formspec", formspec) meta:set_string("formspec", formspec)
end end
local forcefield_receive_fields = function(pos, formname, fields, sender) local forcefield_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local range = nil
if fields.range then if fields.range then
range = tonumber(fields.range) or 0 local range = tonumber(fields.range) or 0
-- Smallest field is 5. Anything less is asking for trouble. -- Smallest field is 5. Anything less is asking for trouble.
-- Largest is 20. It is a matter of pratical node handling. -- Largest is 20. It is a matter of pratical node handling.
-- At the maximim range updating the forcefield takes about 0.2s -- At the maximim range updating the forcefield takes about 0.2s
range = math.max(range, 5) range = math.max(range, 5)
range = math.min(range, 20) range = math.min(range, 20)
if range == meta:get_int("range") then range = nil end if meta:get_int("range") ~= range then
update_forcefield(pos, meta:get_int("range"), false)
meta:set_int("range", range)
end end
if fields.shape0 or fields.shape1 or range then
update_forcefield(pos, meta, false)
end end
if range then meta:set_int("range", range) end
if fields.channel then meta:set_string("channel", fields.channel) end
if fields.shape0 then meta:set_int("shape", 0) end
if fields.shape1 then meta:set_int("shape", 1) end
if fields.enable then meta:set_int("enabled", 1) end if fields.enable then meta:set_int("enabled", 1) end
if fields.disable then meta:set_int("enabled", 0) end if fields.disable then meta:set_int("enabled", 0) end
if fields.mesecon_mode_0 then meta:set_int("mesecon_mode", 0) end
if fields.mesecon_mode_1 then meta:set_int("mesecon_mode", 1) end
set_forcefield_formspec(meta) set_forcefield_formspec(meta)
end end
local mesecons = { local mesecons = {
effector = { effector = {
action_on = function(pos, node) action_on = function(pos, node)
minetest.get_meta(pos):set_int("mesecon_effect", 1) minetest.get_meta(pos):set_int("enabled", 0)
end, end,
action_off = function(pos, node) action_off = function(pos, node)
minetest.get_meta(pos):set_int("mesecon_effect", 0) minetest.get_meta(pos):set_int("enabled", 1)
end end
} }
} }
local digiline_def = {
receptor = {action = function() end},
effector = {
action = function(pos, node, channel, msg)
local meta = minetest.get_meta(pos)
if channel ~= meta:get_string("channel") then
return
end
local msgt = type(msg)
if msgt == "string" then
local smsg = msg:lower()
msg = {}
if smsg == "get" then
msg.command = "get"
elseif smsg == "off" then
msg.command = "off"
elseif smsg == "on" then
msg.command = "on"
elseif smsg == "toggle" then
msg.command = "toggle"
elseif smsg:sub(1, 5) == "range" then
msg.command = "range"
msg.value = tonumber(smsg:sub(7))
elseif smsg:sub(1, 5) == "shape" then
msg.command = "shape"
msg.value = smsg:sub(7):lower()
msg.value = tonumber(msg.value) or msg.value
end
elseif msgt ~= "table" then
return
end
if msg.command == "get" then
digilines.receptor_send(pos, digilines.rules.default, channel, {
enabled = meta:get_int("enabled"),
range = meta:get_int("range"),
shape = meta:get_int("shape")
})
return
elseif msg.command == "off" then
meta:set_int("enabled", 0)
elseif msg.command == "on" then
meta:set_int("enabled", 1)
elseif msg.command == "toggle" then
local onn = meta:get_int("enabled")
onn = 1-onn -- Mirror onn with pivot 0.5, so switch between 1 and 0.
meta:set_int("enabled", onn)
elseif msg.command == "range" then
if type(msg.value) ~= "number" then
return
end
msg.value = math.max(msg.value, 5)
msg.value = math.min(msg.value, 20)
update_forcefield(pos, meta, false)
meta:set_int("range", msg.value)
elseif msg.command == "shape" then
local valuet = type(msg.value)
if valuet == "string" then
if msg.value == "sphere" then
msg.value = 0
elseif msg.value == "cube" then
msg.value = 1
end
elseif valuet ~= "number" then
return
end
if not msg.value then
return
end
update_forcefield(pos, meta, false)
meta:set_int("shape", msg.value)
else
return
end
set_forcefield_formspec(meta)
end
},
}
local function run(pos, node)
local meta = minetest.get_meta(pos)
local eu_input = meta:get_int("HV_EU_input")
local enabled = meta:get_int("enabled") ~= 0 and
(meta:get_int("mesecon_mode") == 0 or meta:get_int("mesecon_effect") ~= 0)
local machine_name = S("%s Forcefield Emitter"):format("HV")
local range = meta:get_int("range")
local power_requirement
if meta:get_int("shape") == 0 then
power_requirement = math.floor(4 * math.pi * range * range)
else
power_requirement = 24 * range * range
end
power_requirement = power_requirement * forcefield_power_drain
if not enabled then
if node.name == "technic:forcefield_emitter_on" then
update_forcefield(pos, meta, false)
technic.swap_node(pos, "technic:forcefield_emitter_off")
meta:set_string("infotext", S("%s Disabled"):format(machine_name))
end
meta:set_int("HV_EU_demand", 0)
return
end
meta:set_int("HV_EU_demand", power_requirement)
if eu_input < power_requirement then
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
if node.name == "technic:forcefield_emitter_on" then
update_forcefield(pos, meta, false)
technic.swap_node(pos, "technic:forcefield_emitter_off")
end
elseif eu_input >= power_requirement then
local first = false
if node.name == "technic:forcefield_emitter_off" then
first = true
technic.swap_node(pos, "technic:forcefield_emitter_on")
meta:set_string("infotext", S("%s Active"):format(machine_name))
end
update_forcefield(pos, meta, true, first)
end
end
minetest.register_node("technic:forcefield_emitter_off", { minetest.register_node("technic:forcefield_emitter_off", {
description = S("%s Forcefield Emitter"):format("HV"), description = S("%s Forcefield Emitter"):format("HV"),
tiles = { tiles = {"technic_forcefield_emitter_off.png"},
"technic_forcefield_emitter_off.png", groups = {cracky = 1},
"technic_machine_bottom.png"..cable_entry,
"technic_forcefield_emitter_off.png",
"technic_forcefield_emitter_off.png",
"technic_forcefield_emitter_off.png",
"technic_forcefield_emitter_off.png"
},
groups = {cracky = 1, technic_machine = 1, technic_hv = 1},
on_receive_fields = forcefield_receive_fields, on_receive_fields = forcefield_receive_fields,
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -301,59 +114,37 @@ minetest.register_node("technic:forcefield_emitter_off", {
meta:set_int("HV_EU_demand", 0) meta:set_int("HV_EU_demand", 0)
meta:set_int("range", 10) meta:set_int("range", 10)
meta:set_int("enabled", 0) meta:set_int("enabled", 0)
meta:set_int("mesecon_mode", 0)
meta:set_int("mesecon_effect", 0)
if digilines_path then
meta:set_string("channel", "forcefield"..minetest.pos_to_string(pos))
end
meta:set_string("infotext", S("%s Forcefield Emitter"):format("HV")) meta:set_string("infotext", S("%s Forcefield Emitter"):format("HV"))
set_forcefield_formspec(meta) set_forcefield_formspec(meta)
end, end,
mesecons = mesecons, mesecons = mesecons
digiline = digiline_def,
technic_run = run,
}) })
minetest.register_node("technic:forcefield_emitter_on", { minetest.register_node("technic:forcefield_emitter_on", {
description = S("%s Forcefield Emitter"):format("HV"), description = S("%s Forcefield Emitter"):format("HV"),
tiles = { tiles = {"technic_forcefield_emitter_on.png"},
"technic_forcefield_emitter_on.png", groups = {cracky = 1, not_in_creative_inventory=1},
"technic_machine_bottom.png"..cable_entry,
"technic_forcefield_emitter_on.png",
"technic_forcefield_emitter_on.png",
"technic_forcefield_emitter_on.png",
"technic_forcefield_emitter_on.png"
},
groups = {cracky = 1, technic_machine = 1, technic_hv = 1,
not_in_creative_inventory=1},
drop = "technic:forcefield_emitter_off", drop = "technic:forcefield_emitter_off",
on_receive_fields = forcefield_receive_fields, on_receive_fields = forcefield_receive_fields,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local range = meta:get_int("range")
meta:set_string("formspec", get_forcefield_formspec(range))
end,
on_destruct = function(pos) on_destruct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
update_forcefield(pos, meta, false) update_forcefield(pos, meta:get_int("range"), false)
end,
mesecons = mesecons,
digiline = digiline_def,
technic_run = run,
technic_on_disable = function (pos, node)
local meta = minetest.get_meta(pos)
update_forcefield(pos, meta, false)
technic.swap_node(pos, "technic:forcefield_emitter_off")
end,
on_blast = function(pos, intensity)
minetest.dig_node(pos)
return {"technic:forcefield_emitter_off"}
end, end,
mesecons = mesecons
}) })
minetest.register_node("technic:forcefield", { minetest.register_node("technic:forcefield", {
description = S("%s Forcefield"):format("HV"), description = S("%s Forcefield"):format("HV"),
sunlight_propagates = true, sunlight_propagates = true,
drawtype = "glasslike", drawtype = "glasslike",
groups = {not_in_creative_inventory=1}, groups = {not_in_creative_inventory=1, unbreakable=1},
paramtype = "light", paramtype = "light",
light_source = default.LIGHT_MAX, light_source = 15,
diggable = false,
drop = '', drop = '',
tiles = {{ tiles = {{
name = "technic_forcefield_animated.png", name = "technic_forcefield_animated.png",
@ -364,14 +155,53 @@ minetest.register_node("technic:forcefield", {
length = 1.0, length = 1.0,
}, },
}}, }},
on_blast = function(pos, intensity) })
end, minetest.register_abm({
nodenames = {"technic:forcefield_emitter_on", "technic:forcefield_emitter_off"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos)
local eu_input = meta:get_int("HV_EU_input")
local eu_demand = meta:get_int("HV_EU_demand")
local enabled = meta:get_int("enabled")
local machine_name = S("%s Forcefield Emitter"):format("HV")
-- Power off automatically if no longer connected to a switching station
technic.switching_station_timeout_count(pos, "HV")
local power_requirement = math.floor(
4 * math.pi * math.pow(meta:get_int("range"), 2)
) * forcefield_power_drain
if meta:get_int("enabled") == 0 then
if node.name == "technic:forcefield_emitter_on" then
meta:set_int("HV_EU_demand", 0)
update_forcefield(pos, meta:get_int("range"), false)
technic.swap_node(pos, "technic:forcefield_emitter_off")
meta:set_string("infotext", S("%s Disabled"):format(machine_name))
return
end
elseif eu_input < power_requirement then
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
if node.name == "technic:forcefield_emitter_on" then
update_forcefield(pos, meta:get_int("range"), false)
technic.swap_node(pos, "technic:forcefield_emitter_off")
end
elseif eu_input >= power_requirement then
if node.name == "technic:forcefield_emitter_off" then
technic.swap_node(pos, "technic:forcefield_emitter_on")
meta:set_string("infotext", S("%s Active"):format(machine_name))
end
update_forcefield(pos, meta:get_int("range"), true)
end
meta:set_int("HV_EU_demand", power_requirement)
end
}) })
if minetest.get_modpath("mesecons_mvps") then if minetest.get_modpath("mesecons_mvps") then
mesecon.register_mvps_stopper("technic:forcefield") mesecon:register_mvps_stopper("technic:forcefield")
end end
-- TODO: Register a stopper for frames
technic.register_machine("HV", "technic:forcefield_emitter_on", technic.receiver) technic.register_machine("HV", "technic:forcefield_emitter_on", technic.receiver)
technic.register_machine("HV", "technic:forcefield_emitter_off", technic.receiver) technic.register_machine("HV", "technic:forcefield_emitter_off", technic.receiver)

View File

@ -3,9 +3,9 @@ minetest.register_alias("hv_generator", "technic:hv_generator")
minetest.register_craft({ minetest.register_craft({
output = 'technic:hv_generator', output = 'technic:hv_generator',
recipe = { recipe = {
{'technic:carbon_plate', 'technic:mv_generator', 'technic:composite_plate'}, {'technic:stainless_steel_ingot', 'technic:mv_generator', 'technic:stainless_steel_ingot'},
{'pipeworks:tube_1', 'technic:hv_transformer', 'pipeworks:tube_1'}, {'pipeworks:tube_1', 'technic:hv_transformer', 'pipeworks:tube_1'},
{'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:hv_cable0', 'technic:stainless_steel_ingot'},
} }
}) })

View File

@ -1,482 +1,244 @@
--[[ -- The enriched uranium rod driven EU generator.
The enriched uranium rod driven EU generator. -- A very large and advanced machine providing vast amounts of power.
A very large and advanced machine providing vast amounts of power. -- Very efficient but also expensive to run as it needs uranium. (10000EU 86400 ticks (one week))
Very efficient but also expensive to run as it needs uranium. -- Provides HV EUs that can be down converted as needed.
Provides 10000 HV EUs for one week (only counted when loaded). --
-- The nuclear reactor core needs water and a protective shield to work.
-- This is checked now and then and if the machine is tampered with... BOOM!
The nuclear reactor core requires a casing of water and a protective local burn_ticks = 7 * 24 * 60 * 60 -- (seconds).
shield to work. This is checked now and then and if the casing is not
intact the reactor will melt down!
--]]
local burn_ticks = 7 * 24 * 60 * 60 -- Seconds
local power_supply = 100000 -- EUs local power_supply = 100000 -- EUs
local fuel_type = "technic:uranium_fuel" -- The reactor burns this local fuel_type = "technic:uranium_fuel" -- The reactor burns this stuff
local digiline_meltdown = technic.config:get_bool("enable_nuclear_reactor_digiline_selfdestruct")
local digiline_remote_path = minetest.get_modpath("digiline_remote")
local S = technic.getter local S = technic.getter
local reactor_desc = S("@1 Nuclear Reactor Core", S("HV")) -- FIXME: recipe must make more sense like a rod recepticle, steam chamber, HV generator?
local cable_entry = "^technic_cable_connection_overlay.png"
-- FIXME: Recipe should make more sense like a rod recepticle, steam chamber, HV generator?
minetest.register_craft({ minetest.register_craft({
output = 'technic:hv_nuclear_reactor_core', output = 'technic:hv_nuclear_reactor_core',
recipe = { recipe = {
{'technic:carbon_plate', 'default:obsidian_glass', 'technic:carbon_plate'}, {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
{'technic:composite_plate', 'technic:machine_casing', 'technic:composite_plate'}, {'technic:stainless_steel_ingot', 'technic:machine_casing', 'technic:stainless_steel_ingot'},
{'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:hv_cable0', 'technic:stainless_steel_ingot'},
} }
}) })
local function make_reactor_formspec(meta) local generator_formspec =
local f = "size[8,9]".. "invsize[8,9;]"..
"label[0,0;"..S("Nuclear Reactor Rod Compartment").."]".. "label[0,0;"..S("Nuclear Reactor Rod Compartment").."]"..
"list[current_name;src;2,1;3,2;]".. "list[current_name;src;2,1;3,2;]"..
"list[current_player;main;0,5;8,4;]".. "list[current_player;main;0,5;8,4;]"
"listring[]"..
"button[5.5,1.5;2,1;start;Start]"..
"checkbox[5.5,2.5;autostart;automatic Start;"..meta:get_string("autostart").."]"
if not digiline_remote_path then
return f
end
local digiline_enabled = meta:get_string("enable_digiline")
f = f.."checkbox[0.5,2.8;enable_digiline;Enable Digiline;"..digiline_enabled.."]"
if digiline_enabled ~= "true" then
return f
end
return f..
"button_exit[4.6,3.69;2,1;save;Save]"..
"field[1,4;4,1;remote_channel;Digiline Remote Channel;${remote_channel}]"
end
local SS_OFF = 0 -- "Boxy sphere"
local SS_DANGER = 1 local nodebox = {
local SS_CLEAR = 2 { -0.353, -0.353, -0.353, 0.353, 0.353, 0.353 }, -- Box
{ -0.495, -0.064, -0.064, 0.495, 0.064, 0.064 }, -- Circle +-x
{ -0.483, -0.128, -0.128, 0.483, 0.128, 0.128 },
{ -0.462, -0.191, -0.191, 0.462, 0.191, 0.191 },
{ -0.433, -0.249, -0.249, 0.433, 0.249, 0.249 },
{ -0.397, -0.303, -0.303, 0.397, 0.303, 0.303 },
{ -0.305, -0.396, -0.305, 0.305, 0.396, 0.305 }, -- Circle +-y
{ -0.250, -0.432, -0.250, 0.250, 0.432, 0.250 },
{ -0.191, -0.461, -0.191, 0.191, 0.461, 0.191 },
{ -0.130, -0.482, -0.130, 0.130, 0.482, 0.130 },
{ -0.066, -0.495, -0.066, 0.066, 0.495, 0.066 },
{ -0.064, -0.064, -0.495, 0.064, 0.064, 0.495 }, -- Circle +-z
{ -0.128, -0.128, -0.483, 0.128, 0.128, 0.483 },
{ -0.191, -0.191, -0.462, 0.191, 0.191, 0.462 },
{ -0.249, -0.249, -0.433, 0.249, 0.249, 0.433 },
{ -0.303, -0.303, -0.397, 0.303, 0.303, 0.397 },
}
local reactor_siren = {} minetest.register_node("technic:hv_nuclear_reactor_core", {
local function siren_set_state(pos, state) description = S("Nuclear %s Generator Core"):format("HV"),
local hpos = minetest.hash_node_position(pos) tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
local siren = reactor_siren[hpos] "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
if not siren then "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
if state == SS_OFF then return end groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
siren = {state=SS_OFF} legacy_facedir_simple = true,
reactor_siren[hpos] = siren sounds = default.node_sound_wood_defaults(),
end drawtype="nodebox",
if state == SS_DANGER and siren.state ~= SS_DANGER then paramtype = "light",
if siren.handle then minetest.sound_stop(siren.handle) end stack_max = 1,
siren.handle = minetest.sound_play("technic_hv_nuclear_reactor_siren_danger_loop", node_box = {
{pos=pos, gain=1.5, loop=true, max_hear_distance=48}) type = "fixed",
siren.state = SS_DANGER fixed = nodebox
elseif state == SS_CLEAR then },
if siren.handle then minetest.sound_stop(siren.handle) end on_construct = function(pos)
local clear_handle = minetest.sound_play("technic_hv_nuclear_reactor_siren_clear", local meta = minetest.get_meta(pos)
{pos=pos, gain=1.5, loop=false, max_hear_distance=48}) meta:set_string("infotext", S("Nuclear %s Generator Core"):format("HV"))
siren.handle = clear_handle meta:set_int("HV_EU_supply", 0)
siren.state = SS_CLEAR -- Signal to the switching station that this device burns some
minetest.after(10, function() -- sort of fuel and needs special handling
if siren.handle ~= clear_handle then return end meta:set_int("HV_EU_from_fuel", 1)
minetest.sound_stop(clear_handle) meta:set_int("burn_time", 0)
if reactor_siren[hpos] == siren then meta:set_string("formspec", generator_formspec)
reactor_siren[hpos] = nil local inv = meta:get_inventory()
end inv:set_size("src", 6)
end) end,
elseif state == SS_OFF and siren.state ~= SS_OFF then can_dig = technic.machine_can_dig,
if siren.handle then minetest.sound_stop(siren.handle) end allow_metadata_inventory_put = technic.machine_inventory_put,
reactor_siren[hpos] = nil allow_metadata_inventory_take = technic.machine_inventory_take,
end allow_metadata_inventory_move = technic.machine_inventory_move,
end })
local function siren_danger(pos, meta) minetest.register_node("technic:hv_nuclear_reactor_core_active", {
meta:set_int("siren", 1) tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
siren_set_state(pos, SS_DANGER) "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
end "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
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:hv_nuclear_reactor_core",
drawtype="nodebox",
light_source = 15,
paramtype = "light",
node_box = {
type = "fixed",
fixed = nodebox
},
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
})
local function siren_clear(pos, meta) local check_reactor_structure = function(pos)
if meta:get_int("siren") ~= 0 then -- The reactor consists of a 9x9x9 cube structure
siren_set_state(pos, SS_CLEAR) -- A cross section through the middle:
meta:set_int("siren", 0) -- CCCC CCCC
end -- CBBB BBBC
end -- CBSS SSBC
-- CBSWWWSBC
-- CBSW#WSBC
-- CBSW|WSBC
-- CBSS|SSBC
-- CBBB|BBBC
-- CCCC|CCCC
-- C = Concrete, B = Blast resistant concrete, S = Stainless Steel,
-- W = water node, # = reactor core, | = HV cable
-- The man-hole and the HV cable is only in the middle
-- The man-hole is optional
--[[
The standard reactor structure consists of a 9x9x9 cube. A cross
section through the middle:
CCCC CCCC
CBBB BBBC
CBLL LLBC
CBLWWWLBC
CBLW#WLBC
CBLW|WLBC
CBLL|LLBC
CBBB|BBBC
CCCC|CCCC
C = Concrete, B = Blast-resistant concrete, L = Lead,
W = water node, # = reactor core, | = HV cable
The man-hole is optional (but necessary for refueling).
For the reactor to operate and not melt down, it insists on the inner
7x7x7 portion (from the core out to the blast-resistant concrete)
being intact. Intactness only depends on the number of nodes of the
right type in each layer. The water layer must have water in all but
at most one node; the steel and blast-resistant concrete layers must
have the right material in all but at most two nodes. The permitted
gaps are meant for the cable and man-hole, but can actually be anywhere
and contain anything. For the reactor to be useful, a cable must
connect to the core, but it can go in any direction.
The outer concrete layer of the standard structure is not required
for the reactor to operate. It is noted here because it used to
be mandatory, and for historical reasons (that it predates the
implementation of radiation) it needs to continue being adequate
shielding of legacy reactors. If it ever ceases to be adequate
shielding for new reactors, legacy ones should be grandfathered.
For legacy reasons, if the reactor has a stainless steel layer instead
of a lead layer it will be converted to a lead layer.
--]]
local function reactor_structure_badness(pos)
local vm = VoxelManip() local vm = VoxelManip()
local pos1 = vector.subtract(pos, 3) local pos1 = vector.subtract(pos, 4)
local pos2 = vector.add(pos, 3) local pos2 = vector.add(pos, 4)
local MinEdge, MaxEdge = vm:read_from_map(pos1, pos2) local MinEdge, MaxEdge = vm:read_from_map(pos1, pos2)
local data = vm:get_data() local data = vm:get_data()
local area = VoxelArea:new({MinEdge=MinEdge, MaxEdge=MaxEdge}) local area = VoxelArea:new({MinEdge=MinEdge, MaxEdge=MaxEdge})
local c_concrete = minetest.get_content_id("technic:concrete")
local c_blast_concrete = minetest.get_content_id("technic:blast_resistant_concrete") local c_blast_concrete = minetest.get_content_id("technic:blast_resistant_concrete")
local c_lead = minetest.get_content_id("technic:lead_block") local c_stainless_steel = minetest.get_content_id("technic:stainless_steel_block")
local c_steel = minetest.get_content_id("technic:stainless_steel_block")
local c_water_source = minetest.get_content_id("default:water_source") local c_water_source = minetest.get_content_id("default:water_source")
local c_water_flowing = minetest.get_content_id("default:water_flowing") local c_water_flowing = minetest.get_content_id("default:water_flowing")
local blast_layer, steel_layer, lead_layer, water_layer = 0, 0, 0, 0 local concretelayer, blastlayer, steellayer, waterlayer = 0, 0, 0, 0
for z = pos1.z, pos2.z do for z = pos1.z, pos2.z do
for y = pos1.y, pos2.y do for y = pos1.y, pos2.y do
for x = pos1.x, pos2.x do for x = pos1.x, pos2.x do
local cid = data[area:index(x, y, z)] -- If the position is in the outer layer
if x == pos1.x or x == pos2.x or if x == pos1.x or x == pos2.x or
y == pos1.y or y == pos2.y or y == pos1.y or y == pos2.y or
z == pos1.z or z == pos2.z then z == pos1.z or z == pos2.z then
if cid == c_blast_concrete then if data[area:index(x, y, z)] == c_concrete then
blast_layer = blast_layer + 1 concretelayer = concretelayer + 1
end end
elseif x == pos1.x+1 or x == pos2.x-1 or elseif x == pos1.x+1 or x == pos2.x-1 or
y == pos1.y+1 or y == pos2.y-1 or y == pos1.y+1 or y == pos2.y-1 or
z == pos1.z+1 or z == pos2.z-1 then z == pos1.z+1 or z == pos2.z-1 then
if cid == c_lead then if data[area:index(x, y, z)] == c_blast_concrete then
lead_layer = lead_layer + 1 blastlayer = blastlayer + 1
elseif cid == c_steel then
steel_layer = steel_layer + 1
end end
elseif x == pos1.x+2 or x == pos2.x-2 or elseif x == pos1.x+2 or x == pos2.x-2 or
y == pos1.y+2 or y == pos2.y-2 or y == pos1.y+2 or y == pos2.y-2 or
z == pos1.z+2 or z == pos2.z-2 then z == pos1.z+2 or z == pos2.z-2 then
if data[area:index(x, y, z)] == c_stainless_steel then
steellayer = steellayer + 1
end
elseif x == pos1.x+3 or x == pos2.x-3 or
y == pos1.y+3 or y == pos2.y-3 or
z == pos1.z+3 or z == pos2.z-3 then
local cid = data[area:index(x, y, z)]
if cid == c_water_source or cid == c_water_flowing then if cid == c_water_source or cid == c_water_flowing then
water_layer = water_layer + 1 waterlayer = waterlayer + 1
end end
end end
end end
end end
end end
if waterlayer >= 25 and
steellayer >= 96 and
blastlayer >= 216 and
concretelayer >= 384 then
return true
end
end
local explode_reactor = function(pos)
print("A reactor exploded at "..minetest.pos_to_string(pos))
end
local function damage_nearby_players(pos)
local objs = minetest.get_objects_inside_radius(pos, 4)
for _, o in pairs(objs) do
if o:is_player() then
o:set_hp(math.max(o:get_hp() - 2, 0))
end
end
end
if steel_layer >= 96 then minetest.register_abm({
for z = pos1.z+1, pos2.z-1 do nodenames = {"technic:hv_nuclear_reactor_core", "technic:hv_nuclear_reactor_core_active"},
for y = pos1.y+1, pos2.y-1 do interval = 1,
for x = pos1.x+1, pos2.x-1 do chance = 1,
local vi = area:index(x, y, z) action = function(pos, node, active_object_count, active_object_count_wider)
if x == pos1.x+1 or x == pos2.x-1 or local meta = minetest.get_meta(pos)
y == pos1.y+1 or y == pos2.y-1 or local machine_name = S("Nuclear %s Generator Core"):format("HV")
z == pos1.z+1 or z == pos2.z-1 then local burn_time = meta:get_int("burn_time") or 0
if data[vi] == c_steel then
data[vi] = c_lead
end
end
end
end
end
vm:set_data(data)
vm:write_to_map()
lead_layer = steel_layer
end
if water_layer > 25 then water_layer = 25 end if burn_time >= burn_ticks or burn_time == 0 then
if lead_layer > 96 then lead_layer = 96 end
if blast_layer > 216 then blast_layer = 216 end
return (25 - water_layer) + (96 - lead_layer) + (216 - blast_layer)
end
local function melt_down_reactor(pos)
minetest.log("action", "A reactor melted down at "..minetest.pos_to_string(pos))
minetest.set_node(pos, {name = "technic:corium_source"})
end
local function start_reactor(pos, meta)
if minetest.get_node(pos).name ~= "technic:hv_nuclear_reactor_core" then
return false
end
local inv = meta:get_inventory() local inv = meta:get_inventory()
if inv:is_empty("src") then if not inv:is_empty("src") then
return false local srclist = inv:get_list("src")
end
local src_list = inv:get_list("src")
local correct_fuel_count = 0 local correct_fuel_count = 0
for _, src_stack in pairs(src_list) do for _, srcstack in pairs(srclist) do
if src_stack and src_stack:get_name() == fuel_type then if srcstack then
if srcstack:get_name() == fuel_type then
correct_fuel_count = correct_fuel_count + 1 correct_fuel_count = correct_fuel_count + 1
end end
end end
-- Check that the reactor is complete and has the correct fuel
if correct_fuel_count ~= 6 or reactor_structure_badness(pos) ~= 0 then
return false
end end
-- Check that the reactor is complete as well
-- as the correct number of correct fuel
if correct_fuel_count == 6 and
check_reactor_structure(pos) then
meta:set_int("burn_time", 1) meta:set_int("burn_time", 1)
technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active") technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active")
meta:set_int("HV_EU_supply", power_supply) meta:set_int("HV_EU_supply", power_supply)
for idx, src_stack in pairs(src_list) do for idx, srcstack in pairs(srclist) do
src_stack:take_item() srcstack:take_item()
inv:set_stack("src", idx, src_stack) inv:set_stack("src", idx, srcstack)
end end
return true
end
minetest.register_abm({
label = "Machines: reactor melt-down check",
nodenames = {"technic:hv_nuclear_reactor_core_active"},
interval = 4,
chance = 1,
action = function (pos, node)
local meta = minetest.get_meta(pos)
local badness = reactor_structure_badness(pos)
local accum_badness = meta:get_int("structure_accumulated_badness")
if badness == 0 then
if accum_badness ~= 0 then
meta:set_int("structure_accumulated_badness", math.max(accum_badness - 4, 0))
siren_clear(pos, meta)
end
else
siren_danger(pos, meta)
accum_badness = accum_badness + badness
if accum_badness >= 25 then
melt_down_reactor(pos)
else
meta:set_int("structure_accumulated_badness", accum_badness)
end
end
end,
})
local function run(pos, node)
local meta = minetest.get_meta(pos)
local burn_time = meta:get_int("burn_time") or 0
if burn_time >= burn_ticks or burn_time == 0 then
if digiline_remote_path and meta:get_int("HV_EU_supply") == power_supply then
digiline_remote.send_to_node(pos, meta:get_string("remote_channel"),
"fuel used", 6, true)
end
if meta:get_string("autostart") == "true" then
if start_reactor(pos, meta) then
return return
end end
end end
meta:set_int("HV_EU_supply", 0) meta:set_int("HV_EU_supply", 0)
meta:set_int("burn_time", 0) meta:set_int("burn_time", 0)
meta:set_string("infotext", S("%s Idle"):format(reactor_desc)) meta:set_string("infotext", S("%s Idle"):format(machine_name))
technic.swap_node(pos, "technic:hv_nuclear_reactor_core") technic.swap_node(pos, "technic:hv_nuclear_reactor_core")
meta:set_int("structure_accumulated_badness", 0)
siren_clear(pos, meta)
elseif burn_time > 0 then elseif burn_time > 0 then
damage_nearby_players(pos)
if not check_reactor_structure(pos) then
explode_reactor(pos)
end
burn_time = burn_time + 1 burn_time = burn_time + 1
meta:set_int("burn_time", burn_time) meta:set_int("burn_time", burn_time)
local percent = math.floor(burn_time / burn_ticks * 100) local percent = math.floor(burn_time / burn_ticks * 100)
meta:set_string("infotext", reactor_desc.." ("..percent.."%)") meta:set_string("infotext", machine_name.." ("..percent.."%)")
meta:set_int("HV_EU_supply", power_supply) meta:set_int("HV_EU_supply", power_supply)
end end
end end
local nuclear_reactor_receive_fields = function(pos, formname, fields, sender)
local player_name = sender:get_player_name()
if minetest.is_protected(pos, player_name) then
minetest.chat_send_player(player_name, "You are not allowed to edit this!")
minetest.record_protection_violation(pos, player_name)
return
end
local meta = minetest.get_meta(pos)
local update_formspec = false
if fields.remote_channel then
meta:set_string("remote_channel", fields.remote_channel)
end
if fields.start then
local b = start_reactor(pos, meta)
if b then
minetest.chat_send_player(player_name, "Start successful")
else
minetest.chat_send_player(player_name, "Error")
end
end
if fields.autostart then
meta:set_string("autostart", fields.autostart)
update_formspec = true
end
if fields.enable_digiline then
meta:set_string("enable_digiline", fields.enable_digiline)
update_formspec = true
end
if update_formspec then
meta:set_string("formspec", make_reactor_formspec(meta))
end
end
local digiline_remote_def = function(pos, channel, msg)
local meta = minetest.get_meta(pos)
if meta:get_string("enable_digiline") ~= "true" or
channel ~= meta:get_string("remote_channel") then
return
end
-- Convert string messages to tables:
local msgt = type(msg)
if msgt == "string" then
local smsg = msg:lower()
msg = {}
if smsg == "get" then
msg.command = "get"
elseif smsg:sub(1, 13) == "self_destruct" then
msg.command = "self_destruct"
msg.timer = tonumber(smsg:sub(15)) or 0
elseif smsg == "start" then
msg.command = "start"
end
elseif msgt ~= "table" then
return
end
if msg.command == "get" then
local inv = meta:get_inventory()
local invtable = {}
for i = 1, 6 do
local stack = inv:get_stack("src", i)
if stack:is_empty() then
invtable[i] = 0
elseif stack:get_name() == fuel_type then
invtable[i] = stack:get_count()
else
invtable[i] = -stack:get_count()
end
end
digiline_remote.send_to_node(pos, channel, {
burn_time = meta:get_int("burn_time"),
enabled = meta:get_int("HV_EU_supply") == power_supply,
siren = meta:get_int("siren") == 1,
structure_accumulated_badness = meta:get_int("structure_accumulated_badness"),
rods = invtable
}, 6, true)
elseif digiline_meltdown and msg.command == "self_destruct" and
minetest.get_node(pos).name == "technic:hv_nuclear_reactor_core_active" then
if msg.timer ~= 0 and type(msg.timer) == "number" then
siren_danger(pos, meta)
minetest.after(msg.timer, melt_down_reactor, pos)
else
melt_down_reactor(pos)
end
elseif msg.command == "start" then
local b = start_reactor(pos, meta)
if b then
digiline_remote.send_to_node(pos, channel, "Start successful", 6, true)
else
digiline_remote.send_to_node(pos, channel, "Error", 6, true)
end
end
end
minetest.register_node("technic:hv_nuclear_reactor_core", {
description = reactor_desc,
tiles = {
"technic_hv_nuclear_reactor_core.png",
"technic_hv_nuclear_reactor_core.png"..cable_entry
},
drawtype = "mesh",
mesh = "technic_reactor.obj",
groups = {cracky = 1, technic_machine = 1, technic_hv = 1, digiline_remote_receive = 1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
paramtype = "light",
paramtype2 = "facedir",
stack_max = 1,
on_receive_fields = nuclear_reactor_receive_fields,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", reactor_desc)
meta:set_string("formspec", make_reactor_formspec(meta))
if digiline_remote_path then
meta:set_string("remote_channel",
"nucelear_reactor"..minetest.pos_to_string(pos))
end
local inv = meta:get_inventory()
inv:set_size("src", 6)
end,
_on_digiline_remote_receive = digiline_remote_def,
can_dig = technic.machine_can_dig,
on_destruct = function(pos) siren_set_state(pos, SS_OFF) end,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
technic_run = run,
})
minetest.register_node("technic:hv_nuclear_reactor_core_active", {
tiles = {
"technic_hv_nuclear_reactor_core.png",
"technic_hv_nuclear_reactor_core.png"..cable_entry
},
drawtype = "mesh",
mesh = "technic_reactor.obj",
groups = {cracky = 1, technic_machine = 1, technic_hv = 1, radioactive = 4,
not_in_creative_inventory = 1, digiline_remote_receive = 1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
drop = "technic:hv_nuclear_reactor_core",
light_source = 14,
paramtype = "light",
paramtype2 = "facedir",
on_receive_fields = nuclear_reactor_receive_fields,
_on_digiline_remote_receive = digiline_remote_def,
can_dig = technic.machine_can_dig,
after_dig_node = melt_down_reactor,
on_destruct = function(pos) siren_set_state(pos, SS_OFF) end,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
technic_run = run,
technic_on_disable = function(pos, node)
local timer = minetest.get_node_timer(pos)
timer:start(1)
end,
on_timer = function(pos, node)
local meta = minetest.get_meta(pos)
-- Connected back?
if meta:get_int("HV_EU_timeout") > 0 then return false end
local burn_time = meta:get_int("burn_time") or 0
if burn_time >= burn_ticks or burn_time == 0 then
meta:set_int("HV_EU_supply", 0)
meta:set_int("burn_time", 0)
technic.swap_node(pos, "technic:hv_nuclear_reactor_core")
meta:set_int("structure_accumulated_badness", 0)
siren_clear(pos, meta)
return false
end
meta:set_int("burn_time", burn_time + 1)
return true
end,
}) })
technic.register_machine("HV", "technic:hv_nuclear_reactor_core", technic.producer) technic.register_machine("HV", "technic:hv_nuclear_reactor_core", technic.producer)

View File

@ -1,269 +1,193 @@
local S = technic.getter local S = technic.getter
local tube_entry = "^pipeworks_tube_connection_metallic.png"
local cable_entry = "^technic_cable_connection_overlay.png"
minetest.register_craft({ minetest.register_craft({
recipe = { recipe = {
{"technic:carbon_plate", "pipeworks:filter", "technic:composite_plate"}, {"technic:carbon_steel_block", "pipeworks:filter", "technic:carbon_steel_block"},
{"technic:motor", "technic:machine_casing", "technic:diamond_drill_head"}, {"technic:motor", "technic:machine_casing", "technic:diamond_drill_head"},
{"technic:carbon_steel_block", "technic:hv_cable", "technic:carbon_steel_block"}}, {"technic:carbon_steel_block", "technic:hv_cable0", "technic:carbon_steel_block"}},
output = "technic:quarry", output = "technic:quarry",
}) })
local quarry_dig_above_nodes = 3 -- How far above the quarry we will dig nodes local quarry_dig_above_nodes = 3 -- How far above the quarry we will dig nodes
local quarry_max_depth = 100 local quarry_max_depth = 100
local quarry_demand = 10000
local quarry_eject_dir = vector.new(0, 1, 0)
local function set_quarry_formspec(meta) local function set_quarry_formspec(meta)
local radius = meta:get_int("size") local formspec = "size[3,1.5]"..
local formspec = "size[6,4.3]".. "field[1,0.5;2,1;size;Radius;"..meta:get_int("size").."]"
"list[context;cache;0,1;4,3;]"..
"item_image[4.8,0;1,1;technic:quarry]"..
"label[0,0.2;"..S("%s Quarry"):format("HV").."]"..
"field[4.3,3.5;2,1;size;"..S("Radius:")..";"..radius.."]"
if meta:get_int("enabled") == 0 then if meta:get_int("enabled") == 0 then
formspec = formspec.."button[4,1;2,1;enable;"..S("Disabled").."]" formspec = formspec.."button[0,1;3,1;enable;"..S("%s Disabled"):format(S("%s Quarry"):format("HV")).."]"
else else
formspec = formspec.."button[4,1;2,1;disable;"..S("Enabled").."]" formspec = formspec.."button[0,1;3,1;disable;"..S("%s Enabled"):format(S("%s Quarry"):format("HV")).."]"
end end
local diameter = radius*2 + 1
local nd = meta:get_int("dug")
local rel_y = quarry_dig_above_nodes - math.floor(nd / (diameter*diameter))
formspec = formspec.."label[0,4;"..minetest.formspec_escape(
nd == 0 and S("Digging not started") or
(rel_y < -quarry_max_depth and S("Digging finished") or
(meta:get_int("purge_on") == 1 and S("Purging cache") or
S("Digging %d m "..(rel_y > 0 and "above" or "below").." machine")
:format(math.abs(rel_y))))
).."]"
formspec = formspec.."button[4,2;2,1;restart;"..S("Restart").."]"
meta:set_string("formspec", formspec) meta:set_string("formspec", formspec)
end end
local function set_quarry_demand(meta)
local radius = meta:get_int("size")
local diameter = radius*2 + 1
local machine_name = S("%s Quarry"):format("HV")
if meta:get_int("enabled") == 0 or meta:get_int("purge_on") == 1 then
meta:set_string("infotext", S(meta:get_int("purge_on") == 1 and "%s purging cache" or "%s Disabled"):format(machine_name))
meta:set_int("HV_EU_demand", 0)
elseif meta:get_int("dug") == diameter*diameter * (quarry_dig_above_nodes+1+quarry_max_depth) then
meta:set_string("infotext", S("%s Finished"):format(machine_name))
meta:set_int("HV_EU_demand", 0)
else
meta:set_string("infotext", S(meta:get_int("HV_EU_input") >= quarry_demand and "%s Active" or "%s Unpowered"):format(machine_name))
meta:set_int("HV_EU_demand", quarry_demand)
end
end
local function quarry_receive_fields(pos, formname, fields, sender) local function quarry_receive_fields(pos, formname, fields, sender)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if fields.size and string.find(fields.size, "^[0-9]+$") then if fields.size then
local size = tonumber(fields.size) local size = tonumber(fields.size) or 0
if size >= 2 and size <= 8 and size ~= meta:get_int("size") then size = math.max(size, 2)
size = math.min(size, 8)
meta:set_int("size", size) meta:set_int("size", size)
meta:set_int("dug", 0)
end
end end
if fields.enable then meta:set_int("enabled", 1) end if fields.enable then meta:set_int("enabled", 1) end
if fields.disable then meta:set_int("enabled", 0) end if fields.disable then meta:set_int("enabled", 0) end
if fields.restart then
meta:set_int("dug", 0)
meta:set_int("purge_on", 1)
end
set_quarry_formspec(meta) set_quarry_formspec(meta)
set_quarry_demand(meta)
end end
local function quarry_handle_purge(pos) local function get_quarry_center(pos, size)
local node = minetest.get_node(pos)
local back_dir = minetest.facedir_to_dir(node.param2)
local relative_center = vector.multiply(back_dir, size + 1)
local center = vector.add(pos, relative_center)
return center
end
local function gen_next_digpos(center, digpos, size)
digpos.x = digpos.x + 1
if digpos.x > center.x + size then
digpos.x = center.x - size
digpos.z = digpos.z + 1
end
if digpos.z > center.z + size then
digpos.x = center.x - size
digpos.z = center.z - size
digpos.y = digpos.y - 1
end
end
local function find_next_digpos(data, area, center, dig_y, size)
local c_air = minetest.get_content_id("air")
for y = center.y + quarry_dig_above_nodes, dig_y - 1, -1 do
for z = center.z - size, center.z + size do
for x = center.x - size, center.x + size do
if data[area:index(x, y, z)] ~= c_air then
return vector.new(x, y, z)
end
end
end
end
end
local function quarry_dig(pos, center, size)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local drops = {}
local i = 0 local dig_y = meta:get_int("dig_y")
for _,stack in ipairs(inv:get_list("cache")) do
i = i + 1
if stack then
local item = stack:to_table()
if item then
technic.tube_inject_item(pos, pos, quarry_eject_dir, item)
stack:clear()
inv:set_stack("cache", i, stack)
break
end
end
end
if inv:is_empty("cache") then
meta:set_int("purge_on", 0)
end
end
local function quarry_run(pos, node)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
-- initialize cache for the case we load an older world
inv:set_size("cache", 12)
-- toss a coin whether we do an automatic purge. Chance 1:200
local purge_rand = math.random()
if purge_rand <= 0.005 then
meta:set_int("purge_on", 1)
end
if meta:get_int("enabled") and meta:get_int("HV_EU_input") >= quarry_demand and meta:get_int("purge_on") == 0 then
local pdir = minetest.facedir_to_dir(node.param2)
local qdir = pdir.x == 1 and vector.new(0,0,-1) or
(pdir.z == -1 and vector.new(-1,0,0) or
(pdir.x == -1 and vector.new(0,0,1) or
vector.new(1,0,0)))
local radius = meta:get_int("size")
local diameter = radius*2 + 1
local startpos = vector.add(vector.add(vector.add(pos,
vector.new(0, quarry_dig_above_nodes, 0)),
pdir),
vector.multiply(qdir, -radius))
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
local nd = meta:get_int("dug")
while nd ~= diameter*diameter * (quarry_dig_above_nodes+1+quarry_max_depth) do
local ry = math.floor(nd / (diameter*diameter))
local ndl = nd % (diameter*diameter)
if ry % 2 == 1 then
ndl = diameter*diameter - 1 - ndl
end
local rq = math.floor(ndl / diameter)
local rp = ndl % diameter
if rq % 2 == 1 then rp = diameter - 1 - rp end
local digpos = vector.add(vector.add(vector.add(startpos,
vector.new(0, -ry, 0)),
vector.multiply(pdir, rp)),
vector.multiply(qdir, rq))
local can_dig = true
if can_dig and minetest.is_protected and minetest.is_protected(digpos, owner) then
can_dig = false
end
local dignode
if can_dig then
dignode = technic.get_or_load_node(digpos) or minetest.get_node(digpos)
local dignodedef = minetest.registered_nodes[dignode.name] or {diggable=false}
-- doors mod among other thing does NOT like a nil digger...
local fakedigger = {
get_player_name = function()
return "!technic_quarry_fake_digger"
end,
is_player = function() return false end,
get_wielded_item = function()
return ItemStack("air")
end,
}
if not dignodedef.diggable or (dignodedef.can_dig and not dignodedef.can_dig(digpos, fakedigger)) then
can_dig = false
end
end
if can_dig then local vm = VoxelManip()
for ay = startpos.y, digpos.y+1, -1 do local p1 = vector.new(
local checkpos = {x=digpos.x, y=ay, z=digpos.z} center.x - size,
local checknode = technic.get_or_load_node(checkpos) or minetest.get_node(checkpos) center.y + quarry_dig_above_nodes,
if checknode.name ~= "air" then center.z - size)
can_dig = false local p2 = vector.new(
break center.x + size,
end dig_y - 1, -- One node lower in case we have finished the current layer
end center.z + size)
end local e1, e2 = vm:read_from_map(p1, p2)
nd = nd + 1 local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2})
if can_dig then local data = vm:get_data()
minetest.remove_node(digpos)
local drops = minetest.get_node_drops(dignode.name, "") local digpos = find_next_digpos(data, area, center, dig_y, size)
for _, dropped_item in ipairs(drops) do
local left = inv:add_item("cache", dropped_item) if digpos then
while not left:is_empty() do if digpos.y < pos.y - quarry_max_depth then
meta:set_int("purge_on", 1) meta:set_int("dig_y", digpos.y)
quarry_handle_purge(pos) return drops
left = inv:add_item("cache", left)
end
end
break
end
end
if nd == diameter*diameter * (quarry_dig_above_nodes+1+quarry_max_depth) then
-- if a quarry is finished, we enable purge mode
meta:set_int("purge_on", 1)
end
meta:set_int("dug", nd)
else
-- if a quarry is disabled or has no power, we enable purge mode
meta:set_int("purge_on", 1)
end
-- if something triggered a purge, we handle it
if meta:get_int("purge_on") == 1 then
quarry_handle_purge(pos)
end end
if minetest.is_protected and minetest.is_protected(digpos, owner) then
meta:set_int("enabled", 0)
set_quarry_formspec(meta) set_quarry_formspec(meta)
set_quarry_demand(meta) return {}
end
dig_y = digpos.y
local node = minetest.get_node(digpos)
local node_def = minetest.registered_nodes[node.name] or { diggable = false }
if node_def.diggable and ((not node_def.can_dig) or node_def.can_dig(digpos, nil)) then
minetest.remove_node(digpos)
drops = minetest.get_node_drops(node.name, "")
end
elseif not (dig_y < pos.y - quarry_max_depth) then
dig_y = dig_y - 16
end end
local function send_move_error(player) meta:set_int("dig_y", dig_y)
minetest.chat_send_player(player:get_player_name(), return drops
S("Manually taking/removing from cache by hand is not possible. ".. end
"If you can't wait, restart or disable the quarry to start automatic purge."))
return 0 local function send_items(items, pos, node)
for _, item in pairs(items) do
local tube_item = pipeworks.tube_item(vector.new(pos), item)
tube_item:get_luaentity().start_pos = vector.new(pos)
tube_item:setvelocity(vector.new(0, 1, 0))
tube_item:setacceleration({x=0, y=0, z=0})
end
end end
minetest.register_node("technic:quarry", { minetest.register_node("technic:quarry", {
description = S("%s Quarry"):format("HV"), description = S("%s Quarry"):format("HV"),
tiles = { tiles = {"technic_carbon_steel_block.png", "technic_carbon_steel_block.png",
"technic_carbon_steel_block.png"..tube_entry, "technic_carbon_steel_block.png", "technic_carbon_steel_block.png",
"technic_carbon_steel_block.png"..cable_entry, "technic_carbon_steel_block.png^default_tool_mesepick.png", "technic_carbon_steel_block.png"},
"technic_carbon_steel_block.png"..cable_entry,
"technic_carbon_steel_block.png"..cable_entry,
"technic_carbon_steel_block.png^default_tool_mesepick.png",
"technic_carbon_steel_block.png"..cable_entry
},
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {cracky=2, tubedevice=1, technic_machine=1, technic_hv=1}, groups = {cracky=2, tubedevice=1},
connect_sides = {"bottom", "front", "left", "right"},
tube = { tube = {
connect_sides = {top = 1}, connect_sides = {top = 1},
-- lower priority than other tubes, so that quarries will prefer any
-- other tube to another quarry, which could lead to server freezes
-- in certain quarry placements (2x2 for example would never eject)
priority = 10,
can_go = function(pos, node, velocity, stack)
-- always eject the same, even if items came in another way
-- this further mitigates loops and generally avoids random sideway movement
-- that can be expected in certain quarry placements
return { quarry_eject_dir }
end
}, },
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("%s Quarry"):format("HV")) meta:set_string("infotext", S("%s Quarry"):format("HV"))
meta:set_int("size", 4) meta:set_int("size", 4)
set_quarry_formspec(meta) set_quarry_formspec(meta)
set_quarry_demand(meta) meta:set_int("dig_y", pos.y)
end, end,
after_place_node = function(pos, placer, itemstack) after_place_node = function(pos, placer, itemstack)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("owner", placer:get_player_name()) meta:set_string("owner", placer:get_player_name())
pipeworks.scan_for_tube_objects(pos) pipeworks.scan_for_tube_objects(pos)
end, end,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("cache")
end,
after_dig_node = pipeworks.scan_for_tube_objects, after_dig_node = pipeworks.scan_for_tube_objects,
on_receive_fields = quarry_receive_fields, on_receive_fields = quarry_receive_fields,
technic_run = quarry_run, })
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
return send_move_error(player) minetest.register_abm({
end, nodenames = {"technic:quarry"},
allow_metadata_inventory_put = function(pos, listname, index, stack, player) interval = 1,
return send_move_error(player) chance = 1,
end, action = function(pos, node, active_object_count, active_object_count_wider)
allow_metadata_inventory_take = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos)
return send_move_error(player) local size = meta:get_int("size")
local eu_input = meta:get_int("HV_EU_input")
local demand = 10000
local center = get_quarry_center(pos, size)
local dig_y = meta:get_int("dig_y")
local machine_name = S("%s Quarry"):format("HV")
technic.switching_station_timeout_count(pos, "HV")
if meta:get_int("enabled") == 0 then
meta:set_string("infotext", S("%s Disabled"):format(machine_name))
meta:set_int("HV_EU_demand", 0)
return
end
if eu_input < demand then
meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
elseif eu_input >= demand then
meta:set_string("infotext", S("%s Active"):format(machine_name))
local items = quarry_dig(pos, center, size)
send_items(items, pos, node)
if dig_y < pos.y - quarry_max_depth then
meta:set_string("infotext", S("%s Finished"):format(machine_name))
end
end
meta:set_int("HV_EU_demand", demand)
end end
}) })
technic.register_machine("HV", "technic:quarry", technic.receiver) technic.register_machine("HV", "technic:quarry", technic.receiver)

View File

@ -5,8 +5,8 @@ minetest.register_craft({
output = 'technic:solar_array_hv 1', output = 'technic:solar_array_hv 1',
recipe = { recipe = {
{'technic:solar_array_mv', 'technic:solar_array_mv', 'technic:solar_array_mv'}, {'technic:solar_array_mv', 'technic:solar_array_mv', 'technic:solar_array_mv'},
{'technic:carbon_plate', 'technic:hv_transformer', 'technic:composite_plate'}, {'technic:carbon_steel_ingot', 'technic:hv_transformer', 'technic:carbon_steel_ingot'},
{'', 'technic:hv_cable', ''}, {'', 'technic:hv_cable0', ''},
} }
}) })

View File

@ -6,7 +6,7 @@ minetest.register_craft({
recipe = { recipe = {
{'default:brick', 'default:brick', 'default:brick'}, {'default:brick', 'default:brick', 'default:brick'},
{'default:brick', 'technic:machine_casing', 'default:brick'}, {'default:brick', 'technic:machine_casing', 'default:brick'},
{'default:brick', 'technic:lv_cable', 'default:brick'}, {'default:brick', 'technic:lv_cable0', 'default:brick'},
} }
}) })

View File

@ -1,11 +1,10 @@
-- LV Battery box
minetest.register_craft({ minetest.register_craft({
output = 'technic:lv_battery_box0', output = 'technic:lv_battery_box0',
recipe = { recipe = {
{'group:wood', 'group:wood', 'group:wood'}, {'group:wood', 'group:wood', 'group:wood'},
{'technic:battery', 'technic:machine_casing', 'technic:battery'}, {'technic:battery', 'technic:machine_casing', 'technic:battery'},
{'technic:battery', 'technic:lv_cable', 'technic:battery'}, {'technic:battery', 'technic:lv_cable0', 'technic:battery'},
} }
}) })

View File

@ -1,12 +1,10 @@
minetest.register_alias("lv_cable", "technic:lv_cable") minetest.register_alias("lv_cable", "technic:lv_cable0")
minetest.register_craft({ minetest.register_craft({
output = 'technic:lv_cable 6', output = 'technic:lv_cable0 6',
recipe = { recipe = {
{'default:paper', 'default:paper', 'default:paper'},
{'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}, {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'},
{'default:paper', 'default:paper', 'default:paper'},
} }
}) })

View File

@ -9,17 +9,6 @@
local S = technic.getter local S = technic.getter
minetest.register_craft({
output = 'technic:cnc',
recipe = {
{'default:glass', 'technic:diamond_drill_head', 'default:glass'},
{'technic:control_logic_unit', 'technic:machine_casing', 'technic:motor'},
{'technic:carbon_steel_ingot', 'technic:lv_cable', 'technic:carbon_steel_ingot'},
},
})
local shape = {} local shape = {}
local onesize_products = { local onesize_products = {
slope = 2, slope = 2,
@ -28,7 +17,6 @@ local onesize_products = {
pyramid = 2, pyramid = 2,
spike = 1, spike = 1,
cylinder = 2, cylinder = 2,
oblate_spheroid = 1,
sphere = 1, sphere = 1,
stick = 8, stick = 8,
slope_upsdown = 2, slope_upsdown = 2,
@ -48,7 +36,7 @@ local twosize_products = {
} }
local cnc_formspec = local cnc_formspec =
"size[9,11;]".. "invsize[9,11;]"..
"label[1,0;"..S("Choose Milling Program:").."]".. "label[1,0;"..S("Choose Milling Program:").."]"..
"image_button[1,0.5;1,1;technic_cnc_slope.png;slope; ]".. "image_button[1,0.5;1,1;technic_cnc_slope.png;slope; ]"..
"image_button[2,0.5;1,1;technic_cnc_slope_edge.png;slope_edge; ]".. "image_button[2,0.5;1,1;technic_cnc_slope_edge.png;slope_edge; ]"..
@ -56,14 +44,13 @@ local cnc_formspec =
"image_button[4,0.5;1,1;technic_cnc_pyramid.png;pyramid; ]".. "image_button[4,0.5;1,1;technic_cnc_pyramid.png;pyramid; ]"..
"image_button[5,0.5;1,1;technic_cnc_spike.png;spike; ]".. "image_button[5,0.5;1,1;technic_cnc_spike.png;spike; ]"..
"image_button[6,0.5;1,1;technic_cnc_cylinder.png;cylinder; ]".. "image_button[6,0.5;1,1;technic_cnc_cylinder.png;cylinder; ]"..
"image_button[7,0.5;1,1;technic_cnc_oblate_spheroid.png;oblate_spheroid; ]".. "image_button[7,0.5;1,1;technic_cnc_sphere.png;sphere; ]"..
"image_button[8,0.5;1,1;technic_cnc_stick.png;stick; ]".. "image_button[8,0.5;1,1;technic_cnc_stick.png;stick; ]"..
"image_button[1,1.5;1,1;technic_cnc_slope_upsdwn.png;slope_upsdown; ]".. "image_button[1,1.5;1,1;technic_cnc_slope_upsdwn.png;slope_upsdown; ]"..
"image_button[2,1.5;1,1;technic_cnc_slope_edge_upsdwn.png;slope_edge_upsdown; ]".. "image_button[2,1.5;1,1;technic_cnc_slope_edge_upsdwn.png;slope_edge_upsdown; ]"..
"image_button[3,1.5;1,1;technic_cnc_slope_inner_edge_upsdwn.png;slope_inner_edge_upsdown; ]".. "image_button[3,1.5;1,1;technic_cnc_slope_inner_edge_upsdwn.png;slope_inner_edge_upsdown; ]"..
"image_button[4,1.5;1,1;technic_cnc_cylinder_horizontal.png;cylinder_horizontal; ]".. "image_button[4,1.5;1,1;technic_cnc_cylinder_horizontal.png;cylinder_horizontal; ]"..
"image_button[5,1.5;1,1;technic_cnc_sphere.png;sphere; ]"..
"image_button[1,2.5;1,1;technic_cnc_slope_lying.png;slope_lying; ]".. "image_button[1,2.5;1,1;technic_cnc_slope_lying.png;slope_lying; ]"..
"image_button[2,2.5;1,1;technic_cnc_onecurvededge.png;onecurvededge; ]".. "image_button[2,2.5;1,1;technic_cnc_onecurvededge.png;onecurvededge; ]"..
@ -84,11 +71,7 @@ local cnc_formspec =
"label[4, 5.5;"..S("Out:").."]".. "label[4, 5.5;"..S("Out:").."]"..
"list[current_name;dst;5,5.5;4,1;]".. "list[current_name;dst;5,5.5;4,1;]"..
"list[current_player;main;0,7;8,4;]".. "list[current_player;main;0,7;8,4;]"
"listring[current_name;dst]"..
"listring[current_player;main]"..
"listring[current_name;src]"..
"listring[current_player;main]"
local size = 1; local size = 1;
@ -142,8 +125,60 @@ local function form_handler(pos, formname, fields, sender)
return return
end end
-- The actual block inactive state
minetest.register_node("technic:cnc", {
description = S("%s CNC Machine"):format("LV"),
tiles = {"technic_cnc_top.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
"technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
},
},
groups = {cracky=2},
legacy_facedir_simple = true,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("%s CNC Machine"):format("LV"))
meta:set_float("technic_power_machine", 1)
meta:set_string("formspec", cnc_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 4)
end,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
on_receive_fields = form_handler,
})
-- Active state block
minetest.register_node("technic:cnc_active", {
description = S("%s CNC Machine"):format("LV"),
tiles = {"technic_cnc_top_active.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
"technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front_active.png"},
paramtype2 = "facedir",
drop = "technic:cnc",
groups = {cracky=2, not_in_creative_inventory=1},
legacy_facedir_simple = true,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
on_receive_fields = form_handler,
})
-- Action code performing the transformation -- Action code performing the transformation
local run = function(pos, node) minetest.register_abm({
nodenames = {"technic:cnc","technic:cnc_active"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local eu_input = meta:get_int("LV_EU_input") local eu_input = meta:get_int("LV_EU_input")
@ -151,6 +186,9 @@ local run = function(pos, node)
local machine_node = "technic:cnc" local machine_node = "technic:cnc"
local demand = 450 local demand = 450
-- Power off automatically if no longer connected to a switching station
technic.switching_station_timeout_count(pos, "LV")
local result = meta:get_string("cnc_product") local result = meta:get_string("cnc_product")
if inv:is_empty("src") or if inv:is_empty("src") or
(not minetest.registered_nodes[result]) or (not minetest.registered_nodes[result]) or
@ -179,52 +217,20 @@ local run = function(pos, node)
end end
meta:set_int("LV_EU_demand", demand) meta:set_int("LV_EU_demand", demand)
end end
-- The actual block inactive state
minetest.register_node("technic:cnc", {
description = S("%s CNC Machine"):format("LV"),
tiles = {"technic_cnc_top.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
"technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front.png"},
groups = {cracky=2, technic_machine=1, technic_lv=1},
connect_sides = {"bottom", "back", "left", "right"},
paramtype2 = "facedir",
legacy_facedir_simple = true,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("%s CNC Machine"):format("LV"))
meta:set_float("technic_power_machine", 1)
meta:set_string("formspec", cnc_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 4)
end,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
on_receive_fields = form_handler,
technic_run = run,
})
-- Active state block
minetest.register_node("technic:cnc_active", {
description = S("%s CNC Machine"):format("LV"),
tiles = {"technic_cnc_top_active.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
"technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front_active.png"},
groups = {cracky=2, technic_machine=1, technic_lv=1, not_in_creative_inventory=1},
connect_sides = {"bottom", "back", "left", "right"},
paramtype2 = "facedir",
drop = "technic:cnc",
legacy_facedir_simple = true,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
on_receive_fields = form_handler,
technic_run = run,
technic_disabled_machine_name = "technic:cnc",
}) })
technic.register_machine("LV", "technic:cnc", technic.receiver) technic.register_machine("LV", "technic:cnc", technic.receiver)
technic.register_machine("LV", "technic:cnc_active", technic.receiver) technic.register_machine("LV", "technic:cnc_active", technic.receiver)
-------------------------
-- CNC Machine Recipe
-------------------------
minetest.register_craft({
output = 'technic:cnc',
recipe = {
{'default:glass', 'technic:diamond_drill_head', 'default:glass'},
{'technic:control_logic_unit', 'technic:machine_casing', 'technic:motor'},
{'technic:carbon_steel_ingot', 'technic:lv_cable0', 'technic:carbon_steel_ingot'},
},
})

View File

@ -5,305 +5,293 @@ local S = technic.getter
technic.cnc = {} technic.cnc = {}
technic.cnc.detail_level = 16
-- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES: -- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES:
------------------------------------------------------ ------------------------------------------------------
local function cnc_sphere()
local nodebox = {}
local detail = technic.cnc.detail_level
local sehne
for i = 1, detail - 1 do
sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2))
nodebox[i]={-sehne, (i/detail) - 0.5, -sehne, sehne, (i/detail)+(1/detail)-0.5, sehne}
end
return nodebox
end
local function cnc_cylinder_horizontal()
local nodebox = {}
local detail = technic.cnc.detail_level
local sehne
for i = 1, detail - 1 do
sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2))
nodebox[i]={-0.5, (i/detail)-0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, sehne}
end
return nodebox
end
local function cnc_cylinder()
local nodebox = {}
local detail = technic.cnc.detail_level
local sehne
for i = 1, detail - 1 do
sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2))
nodebox[i]={(i/detail) - 0.5, -0.5, -sehne, (i/detail)+(1/detail)-0.5, 0.5, sehne}
end
return nodebox
end
local function cnc_twocurvededge()
local nodebox = {}
local detail = technic.cnc.detail_level * 2
local sehne
for i = (detail / 2) - 1, detail - 1 do
sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2))
nodebox[i]={-sehne, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
end
return nodebox
end
local function cnc_onecurvededge()
local nodebox = {}
local detail = technic.cnc.detail_level * 2
local sehne
for i = (detail / 2) - 1, detail - 1 do
sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2))
nodebox[i]={-0.5, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
end
return nodebox
end
local function cnc_spike()
local nodebox = {}
local detail = technic.cnc.detail_level
for i = 0, detail - 1 do
nodebox[i+1] = {(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5,
0.5-(i/detail/2), (i/detail)-0.5+(1/detail), 0.5-(i/detail/2)}
end
return nodebox
end
local function cnc_pyramid()
local nodebox = {}
local detail = technic.cnc.detail_level / 2
for i = 0, detail - 1 do
nodebox[i+1] = {(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail/2)-0.5+(1/detail), 0.5-(i/detail/2)}
end
return nodebox
end
local function cnc_slope_inner_edge_upsdown()
local nodebox = {}
local detail = technic.cnc.detail_level
for i = 0, detail-1 do
nodebox[i+1] = {0.5-(i/detail)-(1/detail), (i/detail)-0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
nodebox[i+detail+1] = {-0.5, (i/detail)-0.5, 0.5-(i/detail)-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
end
return nodebox
end
local function cnc_slope_edge_upsdown()
local nodebox = {}
local detail = technic.cnc.detail_level
for i = 0, detail-1 do
nodebox[i+1] = {(-1*(i/detail))+0.5-(1/detail), (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
end
return nodebox
end
local function cnc_slope_inner_edge()
local nodebox = {}
local detail = technic.cnc.detail_level
for i = 0, detail-1 do
nodebox[i+1] = {(i/detail)-0.5, -0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
nodebox[i+detail+1] = {-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
end
return nodebox
end
local function cnc_slope_edge()
local nodebox = {}
local detail = technic.cnc.detail_level
for i = 0, detail-1 do
nodebox[i+1] = {(i/detail)-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
end
return nodebox
end
local function cnc_slope_upsdown()
local nodebox = {}
local detail = technic.cnc.detail_level
for i = 0, detail-1 do
nodebox[i+1] = {-0.5, (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
end
return nodebox
end
local function cnc_slope_lying()
local nodebox = {}
local detail = technic.cnc.detail_level
for i = 0, detail-1 do
nodebox[i+1] = {(i/detail)-0.5, -0.5, (i/detail)-0.5, (i/detail)-0.5+(1/detail), 0.5 , 0.5}
end
return nodebox
end
local function cnc_slope()
local nodebox = {}
local detail = technic.cnc.detail_level
for i = 0, detail-1 do
nodebox[i+1] = {-0.5, (i/detail)-0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
end
return nodebox
end
-- Define slope boxes for the various nodes -- Define slope boxes for the various nodes
------------------------------------------- -------------------------------------------
technic.cnc.programs = { technic.cnc.programs = {
{suffix = "technic_cnc_stick", {suffix = "technic_cnc_stick",
model = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}, nodebox = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
desc = S("Stick") desc = S("Stick")},
},
{suffix = "technic_cnc_element_end_double", {suffix = "technic_cnc_element_end_double",
model = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5}, nodebox = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
desc = S("Element End Double") desc = S("Element End Double")},
},
{suffix = "technic_cnc_element_cross_double", {suffix = "technic_cnc_element_cross_double",
model = { nodebox = {
{0.3, -0.5, -0.3, 0.5, 0.5, 0.3}, {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
{-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
{-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}}, {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
desc = S("Element Cross Double") desc = S("Element Cross Double")},
},
{suffix = "technic_cnc_element_t_double", {suffix = "technic_cnc_element_t_double",
model = { nodebox = {
{-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
{-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}, {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
{0.3, -0.5, -0.3, 0.5, 0.5, 0.3}}, {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}},
desc = S("Element T Double") desc = S("Element T Double")},
},
{suffix = "technic_cnc_element_edge_double", {suffix = "technic_cnc_element_edge_double",
model = { nodebox = {
{-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
{-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}}, {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
desc = S("Element Edge Double") desc = S("Element Edge Double")},
},
{suffix = "technic_cnc_element_straight_double", {suffix = "technic_cnc_element_straight_double",
model = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, nodebox = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
desc = S("Element Straight Double") desc = S("Element Straight Double")},
},
{suffix = "technic_cnc_element_end", {suffix = "technic_cnc_element_end",
model = {-0.3, -0.5, -0.3, 0.3, 0, 0.5}, nodebox = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
desc = S("Element End") desc = S("Element End")},
},
{suffix = "technic_cnc_element_cross", {suffix = "technic_cnc_element_cross",
model = { nodebox = {
{0.3, -0.5, -0.3, 0.5, 0, 0.3}, {0.3, -0.5, -0.3, 0.5, 0, 0.3},
{-0.3, -0.5, -0.5, 0.3, 0, 0.5}, {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
{-0.5, -0.5, -0.3, -0.3, 0, 0.3}}, {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
desc = S("Element Cross") desc = S("Element Cross")},
},
{suffix = "technic_cnc_element_t", {suffix = "technic_cnc_element_t",
model = { nodebox = {
{-0.3, -0.5, -0.5, 0.3, 0, 0.3}, {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
{-0.5, -0.5, -0.3, -0.3, 0, 0.3}, {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
{0.3, -0.5, -0.3, 0.5, 0, 0.3}}, {0.3, -0.5, -0.3, 0.5, 0, 0.3}},
desc = S("Element T") desc = S("Element T")},
},
{suffix = "technic_cnc_element_edge", {suffix = "technic_cnc_element_edge",
model = { nodebox = {
{-0.3, -0.5, -0.5, 0.3, 0, 0.3}, {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
{-0.5, -0.5, -0.3, -0.3, 0, 0.3}}, {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
desc = S("Element Edge") desc = S("Element Edge")},
},
{suffix = "technic_cnc_element_straight", {suffix = "technic_cnc_element_straight",
model = {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, nodebox = {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
desc = S("Element Straight") desc = S("Element Straight")},
},
{ suffix = "technic_cnc_oblate_spheroid",
model = "technic_oblate_spheroid.obj",
desc = S("Oblate spheroid"),
cbox = {
type = "fixed",
fixed = {
{ -6/16, 4/16, -6/16, 6/16, 8/16, 6/16 },
{ -8/16, -4/16, -8/16, 8/16, 4/16, 8/16 },
{ -6/16, -8/16, -6/16, 6/16, -4/16, 6/16 }
}
}
},
{suffix = "technic_cnc_sphere", {suffix = "technic_cnc_sphere",
model = "technic_sphere.obj", nodebox = cnc_sphere(),
desc = S("Sphere") desc = S("Sphere")},
},
{suffix = "technic_cnc_cylinder_horizontal", {suffix = "technic_cnc_cylinder_horizontal",
model = "technic_cylinder_horizontal.obj", nodebox = cnc_cylinder_horizontal(),
desc = S("Horizontal Cylinder") desc = S("Horizontal Cylinder")},
},
{suffix = "technic_cnc_cylinder", {suffix = "technic_cnc_cylinder",
model = "technic_cylinder.obj", nodebox = cnc_cylinder(),
desc = S("Cylinder") desc = S("Cylinder")},
},
{suffix = "technic_cnc_twocurvededge", {suffix = "technic_cnc_twocurvededge",
model = "technic_two_curved_edge.obj", nodebox = cnc_twocurvededge(),
desc = S("Two Curved Edge/Corner Block") desc = S("Two Curved Edge Block")},
},
{suffix = "technic_cnc_onecurvededge", {suffix = "technic_cnc_onecurvededge",
model = "technic_one_curved_edge.obj", nodebox = cnc_onecurvededge(),
desc = S("One Curved Edge Block") desc = S("One Curved Edge Block")},
},
{suffix = "technic_cnc_spike", {suffix = "technic_cnc_spike",
model = "technic_pyramid_spike.obj", nodebox = cnc_spike(),
desc = S("Spike"), desc = S("Spike")},
cbox = {
type = "fixed",
fixed = {
{ -2/16, 4/16, -2/16, 2/16, 8/16, 2/16 },
{ -4/16, 0, -4/16, 4/16, 4/16, 4/16 },
{ -6/16, -4/16, -6/16, 6/16, 0, 6/16 },
{ -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
}
}
},
{suffix = "technic_cnc_pyramid", {suffix = "technic_cnc_pyramid",
model = "technic_pyramid.obj", nodebox = cnc_pyramid(),
desc = S("Pyramid"), desc = S("Pyramid")},
cbox = {
type = "fixed",
fixed = {
{ -2/16, -2/16, -2/16, 2/16, 0, 2/16 },
{ -4/16, -4/16, -4/16, 4/16, -2/16, 4/16 },
{ -6/16, -6/16, -6/16, 6/16, -4/16, 6/16 },
{ -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }
}
}
},
{suffix = "technic_cnc_slope_inner_edge_upsdown", {suffix = "technic_cnc_slope_inner_edge_upsdown",
model = "technic_innercorner_upsdown.obj", nodebox = cnc_slope_inner_edge_upsdown(),
desc = S("Slope Upside Down Inner Edge/Corner"), desc = S("Slope Upside Down Inner Edge")},
sbox = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
cbox = {
type = "fixed",
fixed = {
{ 0.25, -0.25, -0.5, 0.5, -0.5, 0.5 },
{ -0.5, -0.25, 0.25, 0.5, -0.5, 0.5 },
{ 0, 0, -0.5, 0.5, -0.25, 0.5 },
{ -0.5, 0, 0, 0.5, -0.25, 0.5 },
{ -0.25, 0.25, -0.5, 0.5, 0, -0.25 },
{ -0.5, 0.25, -0.25, 0.5, 0, 0.5 },
{ -0.5, 0.5, -0.5, 0.5, 0.25, 0.5 }
}
}
},
{suffix = "technic_cnc_slope_edge_upsdown", {suffix = "technic_cnc_slope_edge_upsdown",
model = "technic_outercorner_upsdown.obj", nodebox = cnc_slope_edge_upsdown(),
desc = S("Slope Upside Down Outer Edge/Corner"), desc = S("Slope Upside Down Edge")},
cbox = {
type = "fixed",
fixed = {
{ -8/16, 8/16, -8/16, 8/16, 4/16, 8/16 },
{ -4/16, 4/16, -4/16, 8/16, 0, 8/16 },
{ 0, 0, 0, 8/16, -4/16, 8/16 },
{ 4/16, -4/16, 4/16, 8/16, -8/16, 8/16 }
}
}
},
{suffix = "technic_cnc_slope_inner_edge", {suffix = "technic_cnc_slope_inner_edge",
model = "technic_innercorner.obj", nodebox = cnc_slope_inner_edge(),
desc = S("Slope Inner Edge/Corner"), desc = S("Slope Inner Edge")},
sbox = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
cbox = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 },
{ -0.5, -0.25, -0.25, 0.5, 0, 0.5 },
{ -0.25, -0.25, -0.5, 0.5, 0, -0.25 },
{ -0.5, 0, 0, 0.5, 0.25, 0.5 },
{ 0, 0, -0.5, 0.5, 0.25, 0.5 },
{ -0.5, 0.25, 0.25, 0.5, 0.5, 0.5 },
{ 0.25, 0.25, -0.5, 0.5, 0.5, 0.5 }
}
}
},
{suffix = "technic_cnc_slope_edge", {suffix = "technic_cnc_slope_edge",
model = "technic_outercorner.obj", nodebox = cnc_slope_edge(),
desc = S("Slope Outer Edge/Corner"), desc = S("Slope Edge")},
cbox = {
type = "fixed",
fixed = {
{ 4/16, 4/16, 4/16, 8/16, 8/16, 8/16 },
{ 0, 0, 0, 8/16, 4/16, 8/16 },
{ -4/16, -4/16, -4/16, 8/16, 0, 8/16 },
{ -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
}
}
},
{suffix = "technic_cnc_slope_upsdown", {suffix = "technic_cnc_slope_upsdown",
model = "technic_slope_upsdown.obj", nodebox = cnc_slope_upsdown(),
desc = S("Slope Upside Down"), desc = S("Slope Upside Down")},
cbox = {
type = "fixed",
fixed = {
{ -8/16, 8/16, -8/16, 8/16, 4/16, 8/16 },
{ -8/16, 4/16, -4/16, 8/16, 0, 8/16 },
{ -8/16, 0, 0, 8/16, -4/16, 8/16 },
{ -8/16, -4/16, 4/16, 8/16, -8/16, 8/16 }
}
}
},
{suffix = "technic_cnc_slope_lying", {suffix = "technic_cnc_slope_lying",
model = "technic_slope_horizontal.obj", nodebox = cnc_slope_lying(),
desc = S("Slope Lying"), desc = S("Slope Lying")},
cbox = {
type = "fixed",
fixed = {
{ 4/16, -8/16, 4/16, 8/16, 8/16, 8/16 },
{ 0, -8/16, 0, 4/16, 8/16, 8/16 },
{ -4/16, -8/16, -4/16, 0, 8/16, 8/16 },
{ -8/16, -8/16, -8/16, -4/16, 8/16, 8/16 }
}
}
},
{suffix = "technic_cnc_slope", {suffix = "technic_cnc_slope",
model = "technic_slope.obj", nodebox = cnc_slope(),
desc = S("Slope"), desc = S("Slope")},
cbox = {
type = "fixed",
fixed = {
{ -8/16, 4/16, 4/16, 8/16, 8/16, 8/16 },
{ -8/16, 0, 0, 8/16, 4/16, 8/16 },
{ -8/16, -4/16, -4/16, 8/16, 0, 8/16 },
{ -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
}
}
},
} }
-- Allow disabling certain programs for some node. Default is allowing all types for all nodes -- Allow disabling certain programs for some node. Default is allowing all types for all nodes
technic.cnc.programs_disable = { technic.cnc.programs_disable = {
-- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick -- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick
-- ... -- ...
["default:dirt"] = {"technic_cnc_oblate_spheroid", "technic_cnc_slope_upsdown", "technic_cnc_edge", ["default:dirt"] = {"technic_cnc_sphere", "technic_cnc_slope_upsdown", "technic_cnc_edge",
"technic_cnc_inner_edge", "technic_cnc_slope_edge_upsdown", "technic_cnc_inner_edge", "technic_cnc_slope_edge_upsdown",
"technic_cnc_slope_inner_edge_upsdown", "technic_cnc_stick", "technic_cnc_slope_inner_edge_upsdown", "technic_cnc_stick",
"technic_cnc_cylinder_horizontal"} "technic_cnc_cylinder_horizontal"}
} }
-- Generic function for registering all the different node types -- Generic function for registering all the different node types
function technic.cnc.register_program(recipeitem, suffix, model, groups, images, description, cbox, sbox) function technic.cnc.register_program(recipeitem, suffix, nodebox, groups, images, description)
local dtype
local nodeboxdef
local meshdef
if type(model) ~= "string" then -- assume a nodebox if it's a table or function call
dtype = "nodebox"
nodeboxdef = {
type = "fixed",
fixed = model
}
else
dtype = "mesh"
meshdef = model
end
if cbox and not sbox then sbox = cbox end
minetest.register_node(":"..recipeitem.."_"..suffix, { minetest.register_node(":"..recipeitem.."_"..suffix, {
description = description, description = description,
drawtype = dtype, drawtype = "nodebox",
node_box = nodeboxdef,
mesh = meshdef,
tiles = images, tiles = images,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
walkable = true, walkable = true,
node_box = {
type = "fixed",
fixed = nodebox
},
groups = groups, groups = groups,
selection_box = sbox,
collision_box = cbox
}) })
end end
@ -321,8 +309,7 @@ function technic.cnc.register_all(recipeitem, groups, images, description)
end end
-- Create the node if it passes the test -- Create the node if it passes the test
if do_register then if do_register then
technic.cnc.register_program(recipeitem, data.suffix, data.model, technic.cnc.register_program(recipeitem, data.suffix, data.nodebox, groups, images, description.." "..data.desc)
groups, images, description.." "..data.desc, data.cbox, data.sbox)
end end
end end
end end
@ -330,7 +317,7 @@ end
-- REGISTER NEW TECHNIC_CNC_API's PART 2: technic.cnc..register_element_end(subname, recipeitem, groups, images, desc_element_xyz) -- REGISTER NEW TECHNIC_CNC_API's PART 2: technic.cnc..register_element_end(subname, recipeitem, groups, images, desc_element_xyz)
----------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------
function technic.cnc.register_slope_edge_etc(recipeitem, groups, images, desc_slope, desc_slope_lying, desc_slope_upsdown, desc_slope_edge, desc_slope_inner_edge, desc_slope_upsdwn_edge, desc_slope_upsdwn_inner_edge, desc_pyramid, desc_spike, desc_onecurvededge, desc_twocurvededge, desc_cylinder, desc_cylinder_horizontal, desc_spheroid, desc_element_straight, desc_element_edge, desc_element_t, desc_element_cross, desc_element_end) function technic.cnc.register_slope_edge_etc(recipeitem, groups, images, desc_slope, desc_slope_lying, desc_slope_upsdown, desc_slope_edge, desc_slope_inner_edge, desc_slope_upsdwn_edge, desc_slope_upsdwn_inner_edge, desc_pyramid, desc_spike, desc_onecurvededge, desc_twocurvededge, desc_cylinder, desc_cylinder_horizontal, desc_sphere, desc_element_straight, desc_element_edge, desc_element_t, desc_element_cross, desc_element_end)
technic.cnc.register_slope(recipeitem, groups, images, desc_slope) technic.cnc.register_slope(recipeitem, groups, images, desc_slope)
technic.cnc.register_slope_lying(recipeitem, groups, images, desc_slope_lying) technic.cnc.register_slope_lying(recipeitem, groups, images, desc_slope_lying)
@ -345,7 +332,7 @@ function technic.cnc.register_slope_edge_etc(recipeitem, groups, images, desc_sl
technic.cnc.register_twocurvededge(recipeitem, groups, images, desc_twocurvededge) technic.cnc.register_twocurvededge(recipeitem, groups, images, desc_twocurvededge)
technic.cnc.register_cylinder(recipeitem, groups, images, desc_cylinder) technic.cnc.register_cylinder(recipeitem, groups, images, desc_cylinder)
technic.cnc.register_cylinder_horizontal(recipeitem, groups, images, desc_cylinder_horizontal) technic.cnc.register_cylinder_horizontal(recipeitem, groups, images, desc_cylinder_horizontal)
technic.cnc.register_spheroid(recipeitem, groups, images, desc_spheroid) technic.cnc.register_sphere(recipeitem, groups, images, desc_sphere)
technic.cnc.register_element_straight(recipeitem, groups, images, desc_element_straight) technic.cnc.register_element_straight(recipeitem, groups, images, desc_element_straight)
technic.cnc.register_element_edge(recipeitem, groups, images, desc_element_edge) technic.cnc.register_element_edge(recipeitem, groups, images, desc_element_edge)
technic.cnc.register_element_t(recipeitem, groups, images, desc_element_t) technic.cnc.register_element_t(recipeitem, groups, images, desc_element_t)

View File

@ -9,6 +9,11 @@ technic.cnc.register_all("default:dirt",
{snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1},
{"default_grass.png", "default_dirt.png", "default_grass.png"}, {"default_grass.png", "default_dirt.png", "default_grass.png"},
S("Dirt")) S("Dirt"))
technic.cnc.programs_disable["default:dirt"] = {"technic_cnc_sphere", "technic_cnc_slope_upsdown",
"technic_cnc_edge", "technic_cnc_inner_edge",
"technic_cnc_slope_edge_upsdown", "technic_cnc_slope_inner_edge_upsdown",
"technic_cnc_stick", "technic_cnc_cylinder_horizontal"}
-- WOOD -- WOOD
------- -------
technic.cnc.register_all("default:wood", technic.cnc.register_all("default:wood",
@ -37,7 +42,7 @@ technic.cnc.register_all("default:brick",
-- SANDSTONE -- SANDSTONE
------------ ------------
technic.cnc.register_all("default:sandstone", technic.cnc.register_all("default:sandstone",
{crumbly=2, cracky=3, not_in_creative_inventory=1}, {crumbly=2, cracky=2, not_in_creative_inventory=1},
{"default_sandstone.png"}, {"default_sandstone.png"},
S("Sandstone")) S("Sandstone"))
@ -85,7 +90,7 @@ technic.cnc.register_all("technic:marble",
-- Granite -- Granite
------------ ------------
technic.cnc.register_all("technic:granite", technic.cnc.register_all("technic:granite",
{cracky=1, not_in_creative_inventory=1}, {cracky=3, not_in_creative_inventory=1},
{"technic_granite.png"}, {"technic_granite.png"},
S("Granite")) S("Granite"))

View File

@ -20,13 +20,7 @@ local formspec =
"list[current_name;fuel;2,3;1,1;]".. "list[current_name;fuel;2,3;1,1;]"..
"list[current_name;src;2,1;2,1;]".. "list[current_name;src;2,1;2,1;]"..
"list[current_name;dst;5,1;2,2;]".. "list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]".. "list[current_player;main;0,5;8,4;]"
"listring[current_name;dst]"..
"listring[current_player;main]"..
"listring[current_name;src]"..
"listring[current_player;main]"..
"listring[current_name;fuel]"..
"listring[current_player;main]"
minetest.register_node("technic:coal_alloy_furnace", { minetest.register_node("technic:coal_alloy_furnace", {
description = machine_name, description = machine_name,
@ -38,7 +32,7 @@ minetest.register_node("technic:coal_alloy_furnace", {
legacy_facedir_simple = true, legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.env:get_meta(pos)
meta:set_string("formspec", formspec) meta:set_string("formspec", formspec)
meta:set_string("infotext", machine_name) meta:set_string("infotext", machine_name)
local inv = meta:get_inventory() local inv = meta:get_inventory()
@ -70,7 +64,6 @@ minetest.register_node("technic:coal_alloy_furnace_active", {
}) })
minetest.register_abm({ minetest.register_abm({
label = "Machines: run coal alloy furnace",
nodenames = {"technic:coal_alloy_furnace", "technic:coal_alloy_furnace_active"}, nodenames = {"technic:coal_alloy_furnace", "technic:coal_alloy_furnace_active"},
interval = 1, interval = 1,
chance = 1, chance = 1,
@ -132,13 +125,7 @@ minetest.register_abm({
"list[current_name;fuel;2,3;1,1;]".. "list[current_name;fuel;2,3;1,1;]"..
"list[current_name;src;2,1;2,1;]".. "list[current_name;src;2,1;2,1;]"..
"list[current_name;dst;5,1;2,2;]".. "list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]".. "list[current_player;main;0,5;8,4;]")
"listring[current_name;dst]"..
"listring[current_player;main]"..
"listring[current_name;src]"..
"listring[current_player;main]"..
"listring[current_name;fuel]"..
"listring[current_player;main]")
return return
end end
@ -155,11 +142,10 @@ minetest.register_abm({
-- Next take a hard look at the fuel situation -- Next take a hard look at the fuel situation
local fuel = nil local fuel = nil
local afterfuel
local fuellist = inv:get_list("fuel") local fuellist = inv:get_list("fuel")
if fuellist then if fuellist then
fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
end end
if fuel.time <= 0 then if fuel.time <= 0 then
@ -172,7 +158,9 @@ minetest.register_abm({
meta:set_string("fuel_totaltime", fuel.time) meta:set_string("fuel_totaltime", fuel.time)
meta:set_string("fuel_time", 0) meta:set_string("fuel_time", 0)
inv:set_stack("fuel", 1, afterfuel.items[1]) local stack = inv:get_stack("fuel", 1)
stack:take_item()
inv:set_stack("fuel", 1, stack)
end, end,
}) })

View File

@ -6,7 +6,7 @@ minetest.register_craft({
recipe = { recipe = {
{'default:stone', 'technic:motor', 'default:stone'}, {'default:stone', 'technic:motor', 'default:stone'},
{'mesecons:piston', 'technic:machine_casing', 'mesecons:piston'}, {'mesecons:piston', 'technic:machine_casing', 'mesecons:piston'},
{'technic:fine_silver_wire', 'technic:lv_cable', 'technic:fine_silver_wire'}, {'default:stone', 'technic:lv_cable0', 'default:stone'},
} }
}) })

View File

@ -7,7 +7,7 @@ minetest.register_craft({
recipe = { recipe = {
{'default:cobble', 'default:cobble', 'default:cobble'}, {'default:cobble', 'default:cobble', 'default:cobble'},
{'default:cobble', 'technic:machine_casing', 'default:cobble'}, {'default:cobble', 'technic:machine_casing', 'default:cobble'},
{'default:cobble', 'technic:lv_cable', 'default:cobble'}, {'default:cobble', 'technic:lv_cable0', 'default:cobble'},
} }
}) })

View File

@ -6,7 +6,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:treetap', 'technic:motor', 'technic:treetap'}, {'technic:treetap', 'technic:motor', 'technic:treetap'},
{'technic:treetap', 'technic:machine_casing', 'technic:treetap'}, {'technic:treetap', 'technic:machine_casing', 'technic:treetap'},
{'', 'technic:lv_cable', ''}, {'', 'technic:lv_cable0', ''},
} }
}) })

View File

@ -8,9 +8,9 @@ minetest.register_alias("lv_generator", "technic:lv_generator")
minetest.register_craft({ minetest.register_craft({
output = 'technic:lv_generator', output = 'technic:lv_generator',
recipe = { recipe = {
{'default:stone', 'default:furnace', 'default:stone'}, {'default:stone', 'default:stone', 'default:stone'},
{'default:stone', 'technic:machine_casing', 'default:stone'}, {'default:stone', 'technic:machine_casing', 'default:stone'},
{'default:stone', 'technic:lv_cable', 'default:stone'}, {'default:stone', 'technic:lv_cable0', 'default:stone'},
} }
}) })

View File

@ -10,9 +10,9 @@ local S = technic.getter
minetest.register_craft({ minetest.register_craft({
output = 'technic:geothermal', output = 'technic:geothermal',
recipe = { recipe = {
{'technic:granite', 'default:diamond', 'technic:granite'}, {'default:stone', 'default:diamond', 'default:stone'},
{'technic:fine_copper_wire', 'technic:machine_casing', 'technic:fine_copper_wire'}, {'default:copper_ingot', 'technic:machine_casing', 'default:copper_ingot'},
{'technic:granite', 'technic:lv_cable', 'technic:granite'}, {'default:stone', 'technic:lv_cable0', 'default:stone'},
} }
}) })
@ -20,6 +20,32 @@ minetest.register_craftitem("technic:geothermal", {
description = S("Geothermal %s Generator"):format("LV"), description = S("Geothermal %s Generator"):format("LV"),
}) })
minetest.register_node("technic:geothermal", {
description = S("Geothermal %s Generator"):format("LV"),
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(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Geothermal %s Generator"):format("LV"))
meta:set_int("LV_EU_supply", 0)
end,
})
minetest.register_node("technic:geothermal_active", {
description = S("Geothermal %s Generator"):format("LV"),
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",
})
local check_node_around = function(pos) local check_node_around = function(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
if node.name == "default:water_source" or node.name == "default:water_flowing" then return 1 end if node.name == "default:water_source" or node.name == "default:water_flowing" then return 1 end
@ -27,7 +53,11 @@ local check_node_around = function(pos)
return 0 return 0
end end
local run = function(pos, node) 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.get_meta(pos) local meta = minetest.get_meta(pos)
local water_nodes = 0 local water_nodes = 0
local lava_nodes = 0 local lava_nodes = 0
@ -77,35 +107,6 @@ local run = function(pos, node)
meta:set_int("LV_EU_supply", 0) meta:set_int("LV_EU_supply", 0)
end end
end end
minetest.register_node("technic:geothermal", {
description = S("Geothermal %s Generator"):format("LV"),
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"},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
technic_machine=1, technic_lv=1},
paramtype2 = "facedir",
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Geothermal %s Generator"):format("LV"))
meta:set_int("LV_EU_supply", 0)
end,
technic_run = run,
})
minetest.register_node("technic:geothermal_active", {
description = S("Geothermal %s Generator"):format("LV"),
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,
technic_machine=1, technic_lv=1, not_in_creative_inventory=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
drop = "technic:geothermal",
technic_run = run,
}) })
technic.register_machine("LV", "technic:geothermal", technic.producer) technic.register_machine("LV", "technic:geothermal", technic.producer)

View File

@ -1,11 +1,11 @@
minetest.register_alias("grinder", "technic:lv_grinder") minetest.register_alias("grinder", "technic:grinder")
minetest.register_craft({ minetest.register_craft({
output = 'technic:lv_grinder', output = 'technic:grinder',
recipe = { recipe = {
{'default:desert_stone', 'default:diamond', 'default:desert_stone'}, {'default:desert_stone', 'default:diamond', 'default:desert_stone'},
{'default:desert_stone', 'technic:machine_casing', 'default:desert_stone'}, {'default:desert_stone', 'technic:machine_casing', 'default:desert_stone'},
{'technic:granite', 'technic:lv_cable', 'technic:granite'}, {'default:stone', 'technic:lv_cable0', 'default:stone'},
} }
}) })

View File

@ -14,6 +14,10 @@ dofile(path.."/geothermal.lua")
dofile(path.."/water_mill.lua") dofile(path.."/water_mill.lua")
dofile(path.."/generator.lua") dofile(path.."/generator.lua")
-- Coal-powered machines (TODO -> move to somewhere else?)
dofile(path.."/coal_alloy_furnace.lua")
dofile(path.."/coal_furnace.lua")
-- Machines -- Machines
dofile(path.."/alloy_furnace.lua") dofile(path.."/alloy_furnace.lua")
dofile(path.."/electric_furnace.lua") dofile(path.."/electric_furnace.lua")

View File

@ -7,20 +7,101 @@ minetest.register_alias("music_player", "technic:music_player")
minetest.register_craft({ minetest.register_craft({
output = 'technic:music_player', output = 'technic:music_player',
recipe = { recipe = {
{'technic:chromium_ingot', 'default:diamond', 'technic:chromium_ingot'}, {'group:wood', 'default:diamond', 'group:wood'},
{'default:diamond', 'technic:machine_casing', 'default:diamond'}, {'default:diamond', 'technic:machine_casing', 'default:diamond'},
{'default:mossycobble', 'technic:lv_cable', 'default:mossycobble'}, {'default:stone', 'technic:lv_cable0', 'default:stone'},
} }
}) })
local music_handles = {} local music_handles = {}
local music_player_formspec =
"invsize[8,9;]"..
"label[0,0;"..S("%s Music Player"):format("LV").."]"..
"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;"..S("Current track %s"):format("--").."]"
local function play_track(pos, track) local function play_track(pos, track)
return minetest.sound_play("technic_track"..tostring(track), return minetest.sound_play("technic_track"..tostring(track),
{pos = pos, gain = 1.0, loop = true, max_hear_distance = 72,}) {pos = pos, gain = 1.0, loop = true, max_hear_distance = 72,})
end end
local run = function(pos, node) minetest.register_node("technic:music_player", {
description = S("%s Music Player"):format("LV"),
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(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("%s Music Player"):format("LV"))
meta:set_int("active", 0)
meta:set_int("current_track", 1)
meta:set_string("formspec", music_player_formspec)
end,
on_receive_fields = function(pos, formanme, fields, sender)
local meta = minetest.get_meta(pos)
local pos_hash = minetest.hash_node_position(pos)
local music_handle = music_handles[pos_hash]
local current_track = meta:get_int("current_track")
if fields.track1 then current_track = 1 end
if fields.track2 then current_track = 2 end
if fields.track3 then current_track = 3 end
if fields.track4 then current_track = 4 end
if fields.track5 then current_track = 5 end
if fields.track6 then current_track = 6 end
if fields.track7 then current_track = 7 end
if fields.track8 then current_track = 8 end
if fields.track9 then current_track = 9 end
meta:set_int("current_track", current_track)
meta:set_string("formspec",
"invsize[8,9;]"..
"label[0,0;"..S("%s Music Player"):format("LV").."]"..
"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;"..S("Current track %s")
:format(current_track).."]")
if fields.play then
if music_handle then
minetest.sound_stop(music_handle)
end
music_handle = play_track(pos, current_track)
meta:set_int("active", 1)
end
if fields.stop then
meta:set_int("active", 0)
if music_handle then
minetest.sound_stop(music_handle)
end
end
music_handles[pos_hash] = 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.get_meta(pos) local meta = minetest.get_meta(pos)
local eu_input = meta:get_int("LV_EU_input") local eu_input = meta:get_int("LV_EU_input")
local machine_name = S("%s Music Player"):format("LV") local machine_name = S("%s Music Player"):format("LV")
@ -38,6 +119,9 @@ local run = function(pos, node)
return return
end end
-- Power off automatically if no longer connected to a switching station
technic.switching_station_timeout_count(pos, "LV")
if meta:get_int("active") == 0 then if meta:get_int("active") == 0 then
meta:set_string("infotext", S("%s Idle"):format(machine_name)) meta:set_string("infotext", S("%s Idle"):format(machine_name))
meta:set_int("LV_EU_demand", 0) meta:set_int("LV_EU_demand", 0)
@ -59,73 +143,6 @@ local run = function(pos, node)
music_handles[pos_hash] = music_handle music_handles[pos_hash] = music_handle
meta:set_int("LV_EU_demand", demand) meta:set_int("LV_EU_demand", demand)
end end
local function stop_player(pos, node)
local pos_hash = minetest.hash_node_position(pos)
local music_handle = music_handles[pos_hash]
if music_handle then
minetest.sound_stop(music_handle)
music_handles[pos_hash] = nil
end
end
local function set_display(meta)
meta:set_string("formspec",
"size[4,4.5]"..
"item_image[0,0;1,1;technic:music_player]"..
"label[1,0;"..S("%s Music Player"):format("LV").."]"..
"button[0,1;1,1;track1;1]"..
"button[1,1;1,1;track2;2]"..
"button[2,1;1,1;track3;3]"..
"button[0,2;1,1;track4;4]"..
"button[1,2;1,1;track5;5]"..
"button[2,2;1,1;track6;6]"..
"button[0,3;1,1;track7;7]"..
"button[1,3;1,1;track8;8]"..
"button[2,3;1,1;track9;9]"..
"button[3,1;1,1;stop;Stop]"..
"label[0,4;"..minetest.formspec_escape(
meta:get_int("active") == 0 and
S("Stopped") or
S("Current track %s"):format(meta:get_int("current_track"))).."]")
end
minetest.register_node("technic:music_player", {
description = S("%s Music Player"):format("LV"),
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,
technic_machine=1, technic_lv=1},
connect_sides = {"bottom"},
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("%s Music Player"):format("LV"))
set_display(meta)
end,
on_receive_fields = function(pos, formanme, fields, sender)
local new_track = nil
if fields.stop then new_track = 0 end
if fields.track1 then new_track = 1 end
if fields.track2 then new_track = 2 end
if fields.track3 then new_track = 3 end
if fields.track4 then new_track = 4 end
if fields.track5 then new_track = 5 end
if fields.track6 then new_track = 6 end
if fields.track7 then new_track = 7 end
if fields.track8 then new_track = 8 end
if fields.track9 then new_track = 9 end
if new_track then
stop_player(pos)
local meta = minetest.get_meta(pos)
meta:set_int("active", new_track == 0 and 0 or 1)
meta:set_int("current_track", new_track)
set_display(meta)
end
end,
on_destruct = stop_player,
technic_run = run,
technic_on_disable = stop_player,
}) })
technic.register_machine("LV", "technic:music_player", technic.receiver) technic.register_machine("LV", "technic:music_player", technic.receiver)

View File

@ -10,7 +10,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:solar_panel', 'technic:solar_panel', 'technic:solar_panel'}, {'technic:solar_panel', 'technic:solar_panel', 'technic:solar_panel'},
{'technic:carbon_steel_ingot', 'technic:lv_transformer', 'technic:carbon_steel_ingot'}, {'technic:carbon_steel_ingot', 'technic:lv_transformer', 'technic:carbon_steel_ingot'},
{'', 'technic:lv_cable', ''}, {'', 'technic:lv_cable0', ''},
} }
}) })

View File

@ -4,52 +4,10 @@
local S = technic.getter local S = technic.getter
minetest.register_craft({
output = 'technic:solar_panel',
recipe = {
{'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer'},
{'technic:fine_silver_wire', 'technic:lv_cable', 'mesecons_materials:glue'},
}
})
local run = function(pos, node)
-- The action here is to make the solar panel prodice power
-- Power is dependent on the light level and the height above ground
-- There are many ways to cheat by using other light sources like lamps.
-- As there is no way to determine if light is sunlight that is just a shame.
-- To take care of some of it solar panels do not work outside daylight hours or if
-- built below 0m
local pos1 = {x=pos.x, y=pos.y+1, z=pos.z}
local machine_name = S("Small Solar %s Generator"):format("LV")
local light = minetest.get_node_light(pos1, nil)
local time_of_day = minetest.get_timeofday()
local meta = minetest.get_meta(pos)
if light == nil then light = 0 end
-- turn on panel only during day time and if sufficient light
-- I know this is counter intuitive when cheating by using other light sources underground.
if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > -10 then
local charge_to_give = math.floor((light + pos1.y) * 3)
charge_to_give = math.max(charge_to_give, 0)
charge_to_give = math.min(charge_to_give, 200)
meta:set_string("infotext", S("@1 Active (@2)", machine_name,
technic.EU_string(charge_to_give)))
meta:set_int("LV_EU_supply", charge_to_give)
else
meta:set_string("infotext", S("%s Idle"):format(machine_name))
meta:set_int("LV_EU_supply", 0)
end
end
minetest.register_node("technic:solar_panel", { minetest.register_node("technic:solar_panel", {
tiles = {"technic_solar_panel_top.png", "technic_solar_panel_bottom.png", "technic_solar_panel_side.png", 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"}, "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, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
technic_machine=1, technic_lv=1},
connect_sides = {"bottom"},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
description = S("Small Solar %s Generator"):format("LV"), description = S("Small Solar %s Generator"):format("LV"),
active = false, active = false,
@ -65,7 +23,50 @@ minetest.register_node("technic:solar_panel", {
meta:set_int("LV_EU_supply", 0) meta:set_int("LV_EU_supply", 0)
meta:set_string("infotext", S("Small Solar %s Generator"):format("LV")) meta:set_string("infotext", S("Small Solar %s Generator"):format("LV"))
end, end,
technic_run = run, })
minetest.register_craft({
output = 'technic:solar_panel',
recipe = {
{'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer'},
{'technic:wrought_iron_ingot', 'technic:lv_cable0', 'technic:wrought_iron_ingot'},
}
})
minetest.register_abm({
nodenames = {"technic:solar_panel"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
-- The action here is to make the solar panel prodice power
-- Power is dependent on the light level and the height above ground
-- 130m and above is optimal as it would be above cloud level.
-- Height gives 1/4 of the effect, light 3/4. Max. effect is 26EU.
-- There are many ways to cheat by using other light sources like lamps.
-- As there is no way to determine if light is sunlight that is just a shame.
-- To take care of some of it solar panels do not work outside daylight hours or if
-- built below -10m
local pos1 = {x=pos.x, y=pos.y+1, z=pos.z}
local machine_name = S("Small Solar %s Generator"):format("LV")
local light = minetest.get_node_light(pos1, nil)
local time_of_day = minetest.get_timeofday()
local meta = minetest.get_meta(pos)
if light == nil then light = 0 end
-- turn on panel only during day time and if sufficient light
-- I know this is counter intuitive when cheating by using other light sources underground.
if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > -10 then
local charge_to_give = math.floor((light + pos1.y) * 3)
charge_to_give = math.max(charge_to_give, 0)
charge_to_give = math.min(charge_to_give, 200)
meta:set_string("infotext", S("%s Active"):format(machine_name).." ("..charge_to_give.."EU)")
meta:set_int("LV_EU_supply", charge_to_give)
else
meta:set_string("infotext", S("%s Idle"):format(machine_name))
meta:set_int("LV_EU_supply", 0)
end
end,
}) })
technic.register_machine("LV", "technic:solar_panel", technic.producer) technic.register_machine("LV", "technic:solar_panel", technic.producer)

View File

@ -1,37 +1,67 @@
-- A water mill produces LV EUs by exploiting flowing water across it -- A water mill produces LV EUs by exploiting flowing water across it
-- It is a LV EU supplyer and fairly low yield (max 180EUs) -- It is a LV EU supplyer and fairly low yield (max 120EUs)
-- It is a little over half as good as the thermal generator. -- It is a little under half as good as the thermal generator.
local S = technic.getter local S = technic.getter
local cable_entry = "^technic_cable_connection_overlay.png"
minetest.register_alias("water_mill", "technic:water_mill") minetest.register_alias("water_mill", "technic:water_mill")
minetest.register_craft({ minetest.register_craft({
output = 'technic:water_mill', output = 'technic:water_mill',
recipe = { recipe = {
{'technic:marble', 'default:diamond', 'technic:marble'}, {'default:stone', 'default:diamond', 'default:stone'},
{'group:wood', 'technic:machine_casing', 'group:wood'}, {'group:wood', 'technic:machine_casing', 'group:wood'},
{'technic:marble', 'technic:lv_cable', 'technic:marble'}, {'default:stone', 'technic:lv_cable0', 'default:stone'},
} }
}) })
minetest.register_node("technic:water_mill", {
description = S("Hydro %s Generator"):format("LV"),
tiles = {"technic_water_mill_top.png", "technic_machine_bottom.png",
"technic_water_mill_side.png", "technic_water_mill_side.png",
"technic_water_mill_side.png", "technic_water_mill_side.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.get_meta(pos)
meta:set_string("infotext", S("Hydro %s Generator"):format("LV"))
meta:set_int("LV_EU_supply", 0)
end,
})
minetest.register_node("technic:water_mill_active", {
description = S("Hydro %s Generator"):format("LV"),
tiles = {"technic_water_mill_top_active.png", "technic_machine_bottom.png",
"technic_water_mill_side.png", "technic_water_mill_side.png",
"technic_water_mill_side.png", "technic_water_mill_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:water_mill",
})
local function check_node_around_mill(pos) local function check_node_around_mill(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
if node.name == "default:water_flowing" if node.name == "default:water_flowing" or
or node.name == "default:river_water_flowing" then node.name == "default:water_source" then
return node.param2 -- returns approx. water flow, if any return true
end end
return false return false
end end
local run = function(pos, node) minetest.register_abm({
nodenames = {"technic:water_mill", "technic:water_mill_active"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local water_flow = 0 local water_nodes = 0
local lava_nodes = 0
local production_level = 0 local production_level = 0
local eu_supply = 0 local eu_supply = 0
local max_output = 4 * 45 -- keeping it around 180, little more than previous 150 :)
local positions = { local positions = {
{x=pos.x+1, y=pos.y, z=pos.z}, {x=pos.x+1, y=pos.y, z=pos.z},
@ -43,14 +73,16 @@ local run = function(pos, node)
for _, p in pairs(positions) do for _, p in pairs(positions) do
local check = check_node_around_mill(p) local check = check_node_around_mill(p)
if check then if check then
water_flow = water_flow + check water_nodes = water_nodes + 1
end end
end end
eu_supply = math.min(4 * water_flow, max_output) production_level = 25 * water_nodes
production_level = math.floor(100 * eu_supply / max_output) eu_supply = 30 * water_nodes
if production_level > 0 then
meta:set_int("LV_EU_supply", eu_supply) meta:set_int("LV_EU_supply", eu_supply)
end
meta:set_string("infotext", meta:set_string("infotext",
S("Hydro %s Generator"):format("LV").." ("..production_level.."%)") S("Hydro %s Generator"):format("LV").." ("..production_level.."%)")
@ -65,43 +97,6 @@ local run = function(pos, node)
technic.swap_node(pos, "technic:water_mill") technic.swap_node(pos, "technic:water_mill")
end end
end end
minetest.register_node("technic:water_mill", {
description = S("Hydro %s Generator"):format("LV"),
tiles = {
"technic_water_mill_top.png",
"technic_machine_bottom.png"..cable_entry,
"technic_water_mill_side.png",
"technic_water_mill_side.png",
"technic_water_mill_side.png",
"technic_water_mill_side.png"
},
paramtype2 = "facedir",
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
technic_machine=1, technic_lv=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Hydro %s Generator"):format("LV"))
meta:set_int("LV_EU_supply", 0)
end,
technic_run = run,
})
minetest.register_node("technic:water_mill_active", {
description = S("Hydro %s Generator"):format("LV"),
tiles = {"technic_water_mill_top_active.png", "technic_machine_bottom.png",
"technic_water_mill_side.png", "technic_water_mill_side.png",
"technic_water_mill_side.png", "technic_water_mill_side.png"},
paramtype2 = "facedir",
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
technic_machine=1, technic_lv=1, not_in_creative_inventory=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
drop = "technic:water_mill",
technic_run = run,
technic_disabled_machine_name = "technic:water_mill",
}) })
technic.register_machine("LV", "technic:water_mill", technic.producer) technic.register_machine("LV", "technic:water_mill", technic.producer)

View File

@ -5,7 +5,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:stainless_steel_ingot', 'technic:lv_alloy_furnace', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:lv_alloy_furnace', 'technic:stainless_steel_ingot'},
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
} }
}) })

View File

@ -5,7 +5,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:lv_battery_box0', 'technic:lv_battery_box0', 'technic:lv_battery_box0'}, {'technic:lv_battery_box0', 'technic:lv_battery_box0', 'technic:lv_battery_box0'},
{'technic:lv_battery_box0', 'technic:mv_transformer', 'technic:lv_battery_box0'}, {'technic:lv_battery_box0', 'technic:mv_transformer', 'technic:lv_battery_box0'},
{'', 'technic:mv_cable', ''}, {'', 'technic:mv_cable0', ''},
} }
}) })

View File

@ -1,11 +1,11 @@
minetest.register_alias("mv_cable", "technic:mv_cable") minetest.register_alias("mv_cable", "technic:mv_cable0")
minetest.register_craft({ minetest.register_craft({
output = 'technic:mv_cable 3', output = 'technic:mv_cable0 3',
recipe ={ recipe ={
{'technic:rubber', 'technic:rubber', 'technic:rubber'}, {'technic:rubber', 'technic:rubber', 'technic:rubber'},
{'technic:lv_cable', 'technic:lv_cable', 'technic:lv_cable'}, {'technic:lv_cable0', 'technic:lv_cable0', 'technic:lv_cable0'},
{'technic:rubber', 'technic:rubber', 'technic:rubber'}, {'technic:rubber', 'technic:rubber', 'technic:rubber'},
} }
}) })

View File

@ -1,16 +0,0 @@
minetest.register_craft({
output = "technic:mv_centrifuge",
recipe = {
{"technic:motor", "technic:copper_plate", "technic:diamond_drill_head"},
{"technic:copper_plate", "technic:machine_casing", "technic:copper_plate" },
{"pipeworks:one_way_tube", "technic:mv_cable", "pipeworks:mese_filter" },
}
})
technic.register_centrifuge({
tier = "MV",
demand = { 8000, 7000, 6000 },
speed = 2,
upgrade = 1,
tube = 1,
})

View File

@ -5,7 +5,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:stainless_steel_ingot', 'technic:lv_compressor', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:lv_compressor', 'technic:stainless_steel_ingot'},
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
} }
}) })

View File

@ -10,7 +10,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:stainless_steel_ingot', 'technic:lv_electric_furnace', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:lv_electric_furnace', 'technic:stainless_steel_ingot'},
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
} }
}) })

View File

@ -5,7 +5,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:stainless_steel_ingot', 'technic:lv_extractor', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:lv_extractor', 'technic:stainless_steel_ingot'},
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
} }
}) })

View File

@ -5,7 +5,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:stainless_steel_ingot', 'technic:lv_generator', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:lv_generator', 'technic:stainless_steel_ingot'},
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
} }
}) })

View File

@ -5,7 +5,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:stainless_steel_ingot', 'technic:lv_grinder', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:lv_grinder', 'technic:stainless_steel_ingot'},
{'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
} }
}) })

View File

@ -1,105 +0,0 @@
-- A Hydro Turbine produces MV EUs by exploiting flowing water across it
-- It is a MV EU supplyer and fairly high yield (max 1800EUs)
local S = technic.getter
local cable_entry = "^technic_cable_connection_overlay.png"
minetest.register_alias("hydro_turbine", "technic:hydro_turbine")
minetest.register_craft({
output = 'technic:hydro_turbine',
recipe = {
{'technic:stainless_steel_ingot', 'technic:water_mill', 'technic:stainless_steel_ingot'},
{'technic:water_mill', 'technic:mv_transformer', 'technic:water_mill'},
{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'},
}
})
local function get_water_flow(pos)
local node = minetest.get_node(pos)
if minetest.get_item_group(node.name, "water") == 3 then
return node.param2 -- returns approx. water flow, if any
end
return 0
end
---
-- 10 times better than LV hydro because of 2 extra water mills and 4 stainless steel, a transformer and whatnot ;P.
-- Man hydro turbines are tough and long lasting. So, give it some value :)
local run = function(pos, node)
local meta = minetest.get_meta(pos)
local water_flow = 0
local production_level = 0
local eu_supply = 0
local max_output = 40 * 45 -- Generates 1800EU/s
local positions = {
{x=pos.x+1, y=pos.y, z=pos.z},
{x=pos.x-1, y=pos.y, z=pos.z},
{x=pos.x, y=pos.y, z=pos.z+1},
{x=pos.x, y=pos.y, z=pos.z-1},
}
for _, p in pairs(positions) do
water_flow = water_flow + get_water_flow(p)
end
eu_supply = math.min(40 * water_flow, max_output)
production_level = math.floor(100 * eu_supply / max_output)
meta:set_int("MV_EU_supply", eu_supply)
meta:set_string("infotext",
S("Hydro %s Generator"):format("MV").." ("..production_level.."%)")
if production_level > 0 and
minetest.get_node(pos).name == "technic:hydro_turbine" then
technic.swap_node(pos, "technic:hydro_turbine_active")
meta:set_int("MV_EU_supply", 0)
return
end
if production_level == 0 then
technic.swap_node(pos, "technic:hydro_turbine")
end
end
minetest.register_node("technic:hydro_turbine", {
description = S("Hydro %s Generator"):format("MV"),
tiles = {
"technic_hydro_turbine_top.png",
"technic_machine_bottom.png"..cable_entry,
"technic_hydro_turbine_side.png",
"technic_hydro_turbine_side.png",
"technic_hydro_turbine_side.png",
"technic_hydro_turbine_side.png"
},
paramtype2 = "facedir",
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
technic_machine=1, technic_mv=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Hydro %s Generator"):format("MV"))
meta:set_int("MV_EU_supply", 0)
end,
technic_run = run,
})
minetest.register_node("technic:hydro_turbine_active", {
description = S("Hydro %s Generator"):format("MV"),
tiles = {"technic_hydro_turbine_top_active.png", "technic_machine_bottom.png",
"technic_hydro_turbine_side.png", "technic_hydro_turbine_side.png",
"technic_hydro_turbine_side.png", "technic_hydro_turbine_side.png"},
paramtype2 = "facedir",
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
technic_machine=1, technic_mv=1, not_in_creative_inventory=1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
drop = "technic:hydro_turbine",
technic_run = run,
technic_disabled_machine_name = "technic:hydro_turbine",
})
technic.register_machine("MV", "technic:hydro_turbine", technic.producer)
technic.register_machine("MV", "technic:hydro_turbine_active", technic.producer)

View File

@ -13,7 +13,6 @@ if technic.config:get_bool("enable_wind_mill") then
end end
dofile(path.."/generator.lua") dofile(path.."/generator.lua")
dofile(path.."/solar_array.lua") dofile(path.."/solar_array.lua")
dofile(path.."/hydro_turbine.lua")
-- Machines -- Machines
dofile(path.."/alloy_furnace.lua") dofile(path.."/alloy_furnace.lua")
@ -21,7 +20,6 @@ dofile(path.."/electric_furnace.lua")
dofile(path.."/grinder.lua") dofile(path.."/grinder.lua")
dofile(path.."/extractor.lua") dofile(path.."/extractor.lua")
dofile(path.."/compressor.lua") dofile(path.."/compressor.lua")
dofile(path.."/centrifuge.lua")
dofile(path.."/tool_workshop.lua") dofile(path.."/tool_workshop.lua")

View File

@ -12,16 +12,6 @@
local power_radius = 12 local power_radius = 12
minetest.register_craft({
output = 'technic:power_radiator 1',
recipe = {
{'technic:stainless_steel_ingot', 'technic:mv_transformer', 'technic:stainless_steel_ingot'},
{'technic:copper_coil', 'technic:machine_casing', 'technic:copper_coil'},
{'technic:rubber', 'technic:mv_cable', 'technic:rubber'},
}
})
------------------------------------------------------------------ ------------------------------------------------------------------
-- API for inductive powered nodes: -- API for inductive powered nodes:
-- Use the functions below to set the corresponding callbacks -- Use the functions below to set the corresponding callbacks
@ -145,13 +135,21 @@ minetest.register_node("technic:power_radiator", {
end end
}) })
minetest.register_craft({
output = 'technic:power_radiator 1',
recipe = {
{'technic:stainless_steel_ingot', 'technic:mv_transformer', 'technic:stainless_steel_ingot'},
{'technic:copper_coil', 'technic:machine_casing', 'technic:copper_coil'},
{'technic:rubber', 'technic:mv_cable0', 'technic:rubber'},
}
})
minetest.register_abm({ minetest.register_abm({
label = "Machines: run power radiator",
nodenames = {"technic:power_radiator"}, nodenames = {"technic:power_radiator"},
interval = 1, interval = 1,
chance = 1, chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider) action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos) local meta = minetest.env:get_meta(pos)
local eu_input = meta:get_int("MV_EU_input") local eu_input = meta:get_int("MV_EU_input")
local eu_demand = meta:get_int("MV_EU_demand") local eu_demand = meta:get_int("MV_EU_demand")

View File

@ -4,7 +4,7 @@ minetest.register_craft({
recipe = { recipe = {
{'technic:solar_array_lv', 'technic:solar_array_lv', 'technic:solar_array_lv'}, {'technic:solar_array_lv', 'technic:solar_array_lv', 'technic:solar_array_lv'},
{'technic:carbon_steel_ingot', 'technic:mv_transformer', 'technic:carbon_steel_ingot'}, {'technic:carbon_steel_ingot', 'technic:mv_transformer', 'technic:carbon_steel_ingot'},
{'', 'technic:mv_cable', ''}, {'', 'technic:mv_cable0', ''},
} }
}) })

View File

@ -5,50 +5,60 @@ minetest.register_alias("tool_workshop", "technic:tool_workshop")
local S = technic.getter local S = technic.getter
local tube_entry = "^pipeworks_tube_connection_wooden.png"
minetest.register_craft({ minetest.register_craft({
output = 'technic:tool_workshop', output = 'technic:tool_workshop',
recipe = { recipe = {
{'group:wood', 'default:diamond', 'group:wood'}, {'group:wood', 'default:diamond', 'group:wood'},
{'mesecons_pistons:piston_sticky_off', 'technic:machine_casing', 'technic:carbon_cloth'}, {'group:wood', 'technic:machine_casing', 'group:wood'},
{'default:obsidian', 'technic:mv_cable', 'default:obsidian'}, {'default:stone', 'technic:mv_cable0', 'default:stone'},
} }
}) })
local workshop_demand = {5000, 3500, 2000}
local workshop_formspec = local workshop_formspec =
"size[8,9;]".. "invsize[8,9;]"..
"list[current_name;src;3,1;1,1;]".. "list[current_name;src;3,1;1,1;]"..
"label[0,0;"..S("%s Tool Workshop"):format("MV").."]".. "label[0,0;"..S("%s Tool Workshop"):format("MV").."]"..
"list[current_name;upgrade1;1,3;1,1;]".. "list[current_player;main;0,5;8,4;]"
"list[current_name;upgrade2;2,3;1,1;]"..
"label[1,4;"..S("Upgrade Slots").."]"..
"list[current_player;main;0,5;8,4;]"..
"listring[current_player;main]"..
"listring[current_name;src]"..
"listring[current_player;main]"..
"listring[current_name;upgrade1]"..
"listring[current_player;main]"..
"listring[current_name;upgrade2]"..
"listring[current_player;main]"
local run = function(pos, node) minetest.register_node("technic:tool_workshop", {
description = S("%s Tool Workshop"):format("MV"),
tiles = {"technic_workshop_top.png", "technic_machine_bottom.png", "technic_workshop_side.png",
"technic_workshop_side.png", "technic_workshop_side.png", "technic_workshop_side.png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("%s Tool Workshop"):format("MV"))
meta:set_string("formspec", workshop_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
end,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
})
minetest.register_abm({
nodenames = {"technic:tool_workshop"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local eu_input = meta:get_int("MV_EU_input") local eu_input = meta:get_int("MV_EU_input")
local machine_name = S("%s Tool Workshop"):format("MV") local machine_name = S("%s Tool Workshop"):format("MV")
local machine_node = "technic:tool_workshop" local machine_node = "technic:tool_workshop"
local demand = 5000
-- Setup meta data if it does not exist. -- Setup meta data if it does not exist.
if not eu_input then if not eu_input then
meta:set_int("MV_EU_demand", workshop_demand[1]) meta:set_int("MV_EU_demand", demand)
meta:set_int("MV_EU_input", 0) meta:set_int("MV_EU_input", 0)
return return
end end
local EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta) -- Power off automatically if no longer connected to a switching station
technic.switching_station_timeout_count(pos, "MV")
local repairable = false local repairable = false
local srcstack = inv:get_stack("src", 1) local srcstack = inv:get_stack("src", 1)
@ -61,66 +71,21 @@ local run = function(pos, node)
repairable = true repairable = true
end end
end end
technic.handle_machine_pipeworks(pos, tube_upgrade, function (pos, x_velocity, z_velocity)
if not repairable then
technic.send_items(pos, x_velocity, z_velocity, "src")
end
end)
if not repairable then if not repairable then
meta:set_string("infotext", S("%s Idle"):format(machine_name)) meta:set_string("infotext", S("%s Idle"):format(machine_name))
meta:set_int("MV_EU_demand", 0) meta:set_int("MV_EU_demand", 0)
return return
end end
if eu_input < workshop_demand[EU_upgrade+1] then if eu_input < demand then
meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
elseif eu_input >= workshop_demand[EU_upgrade+1] then elseif eu_input >= demand then
meta:set_string("infotext", S("%s Active"):format(machine_name)) meta:set_string("infotext", S("%s Active"):format(machine_name))
srcstack:add_wear(-1000) srcstack:add_wear(-1000)
inv:set_stack("src", 1, srcstack) inv:set_stack("src", 1, srcstack)
end end
meta:set_int("MV_EU_demand", workshop_demand[EU_upgrade+1]) meta:set_int("MV_EU_demand", demand)
end end
minetest.register_node("technic:tool_workshop", {
description = S("%s Tool Workshop"):format("MV"),
paramtype2 = "facedir",
tiles = {
"technic_workshop_top.png"..tube_entry,
"technic_machine_bottom.png"..tube_entry,
"technic_workshop_side.png"..tube_entry,
"technic_workshop_side.png"..tube_entry,
"technic_workshop_side.png"..tube_entry,
"technic_workshop_side.png"
},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
technic_machine=1, technic_mv=1, tubedevice=1, tubedevice_receiver=1},
connect_sides = {"bottom", "back", "left", "right"},
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("%s Tool Workshop"):format("MV"))
meta:set_string("formspec", workshop_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("upgrade1", 1)
inv:set_size("upgrade2", 1)
end,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
tube = {
can_insert = function (pos, node, stack, direction)
return minetest.get_meta(pos):get_inventory():room_for_item("src", stack)
end,
insert_object = function (pos, node, stack, direction)
return minetest.get_meta(pos):get_inventory():add_item("src", stack)
end,
connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1},
},
technic_run = run,
after_place_node = pipeworks.after_place,
after_dig_node = technic.machine_after_dig_node
}) })
technic.register_machine("MV", "technic:tool_workshop", technic.receiver) technic.register_machine("MV", "technic:tool_workshop", technic.receiver)

View File

@ -15,7 +15,7 @@ minetest.register_craft({
recipe = { recipe = {
{'', 'technic:motor', ''}, {'', 'technic:motor', ''},
{'technic:carbon_steel_ingot', 'technic:carbon_steel_block', 'technic:carbon_steel_ingot'}, {'technic:carbon_steel_ingot', 'technic:carbon_steel_block', 'technic:carbon_steel_ingot'},
{'', 'technic:mv_cable', ''}, {'', 'technic:mv_cable0', ''},
} }
}) })
@ -29,49 +29,11 @@ minetest.register_node("technic:wind_mill_frame", {
paramtype = "light", paramtype = "light",
}) })
local function check_wind_mill(pos)
if pos.y < 30 then
return false
end
pos = {x=pos.x, y=pos.y, z=pos.z}
for i = 1, 20 do
pos.y = pos.y - 1
local node = minetest.get_node_or_nil(pos)
if not node then
-- we reached CONTENT_IGNORE, we can assume, that nothing changed
-- as the user will have to load the block to change it
return
end
if node.name ~= "technic:wind_mill_frame" then
return false
end
end
return true
end
local run = function(pos, node)
local meta = minetest.get_meta(pos)
local machine_name = S("Wind %s Generator"):format("MV")
local check = check_wind_mill(pos)
if check == false then
meta:set_int("MV_EU_supply", 0)
meta:set_string("infotext", S("%s Improperly Placed"):format(machine_name))
elseif check == true then
local power = math.min(pos.y * 100, 5000)
meta:set_int("MV_EU_supply", power)
meta:set_string("infotext", S("@1 (@2)", machine_name,
technic.EU_string(power)))
end
-- check == nil: assume nothing has changed
end
minetest.register_node("technic:wind_mill", { minetest.register_node("technic:wind_mill", {
description = S("Wind %s Generator"):format("MV"), description = S("Wind %s Generator"):format("MV"),
tiles = {"technic_carbon_steel_block.png"}, tiles = {"technic_carbon_steel_block.png"},
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {cracky=1, technic_machine=1, technic_mv=1}, groups = {cracky=1},
connect_sides = {"top", "bottom", "back", "left", "right"},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
drawtype = "nodebox", drawtype = "nodebox",
paramtype = "light", paramtype = "light",
@ -89,7 +51,40 @@ minetest.register_node("technic:wind_mill", {
meta:set_string("infotext", S("Wind %s Generator"):format("MV")) meta:set_string("infotext", S("Wind %s Generator"):format("MV"))
meta:set_int("MV_EU_supply", 0) meta:set_int("MV_EU_supply", 0)
end, end,
technic_run = run, })
local function check_wind_mill(pos)
if pos.y < 30 then
return false
end
for i = 1, 20 do
local node = minetest.get_node({x=pos.x, y=pos.y-i, z=pos.z})
if node.name ~= "technic:wind_mill_frame" then
return false
end
end
return true
end
minetest.register_abm({
nodenames = {"technic:wind_mill"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos)
local machine_name = S("Wind %s Generator"):format("MV")
local power = math.min(pos.y * 100, 5000)
if not check_wind_mill(pos) then
meta:set_int("MV_EU_supply", 0)
meta:set_string("infotext", S("%s Improperly Placed"):format(machine_name))
return
else
meta:set_int("MV_EU_supply", power)
end
meta:set_string("infotext", machine_name.." ("..power.."EU)")
end
}) })
technic.register_machine("MV", "technic:wind_mill", technic.producer) technic.register_machine("MV", "technic:wind_mill", technic.producer)

View File

@ -8,7 +8,6 @@ dofile(path.."/MV/init.lua")
dofile(path.."/HV/init.lua") dofile(path.."/HV/init.lua")
dofile(path.."/switching_station.lua") dofile(path.."/switching_station.lua")
dofile(path.."/power_monitor.lua")
dofile(path.."/supply_converter.lua") dofile(path.."/supply_converter.lua")
dofile(path.."/other/init.lua") dofile(path.."/other/init.lua")

View File

@ -1,109 +0,0 @@
local S = technic.getter
local desc = S("Administrative World Anchor")
local function compute_forceload_positions(pos, meta)
local radius = meta:get_int("radius")
local minpos = vector.subtract(pos, vector.new(radius, radius, radius))
local maxpos = vector.add(pos, vector.new(radius, radius, radius))
local minbpos = {}
local maxbpos = {}
for _, coord in ipairs({"x","y","z"}) do
minbpos[coord] = math.floor(minpos[coord] / 16) * 16
maxbpos[coord] = math.floor(maxpos[coord] / 16) * 16
end
local flposes = {}
for x = minbpos.x, maxbpos.x, 16 do
for y = minbpos.y, maxbpos.y, 16 do
for z = minbpos.z, maxbpos.z, 16 do
table.insert(flposes, vector.new(x, y, z))
end
end
end
return flposes
end
local function currently_forceloaded_positions(meta)
local ser = meta:get_string("forceloaded")
return ser == "" and {} or minetest.deserialize(ser)
end
local function forceload_off(meta)
local flposes = currently_forceloaded_positions(meta)
meta:set_string("forceloaded", "")
for _, p in ipairs(flposes) do
minetest.forceload_free_block(p)
end
end
local function forceload_on(pos, meta)
local want_flposes = compute_forceload_positions(pos, meta)
local have_flposes = {}
for _, p in ipairs(want_flposes) do
if minetest.forceload_block(p) then
table.insert(have_flposes, p)
end
end
meta:set_string("forceloaded", #have_flposes == 0 and "" or minetest.serialize(have_flposes))
end
local function set_display(pos, meta)
meta:set_string("infotext", S(meta:get_int("enabled") ~= 0 and "%s Enabled" or "%s Disabled"):format(desc))
meta:set_string("formspec",
"size[5,3.5]"..
"item_image[0,0;1,1;technic:admin_anchor]"..
"label[1,0;"..minetest.formspec_escape(desc).."]"..
"label[0,1;"..minetest.formspec_escape(S("Owner:").." "..meta:get_string("owner")).."]"..
(meta:get_int("locked") == 0 and
"button[3,1;2,1;lock;"..minetest.formspec_escape(S("Unlocked")).."]" or
"button[3,1;2,1;unlock;"..minetest.formspec_escape(S("Locked")).."]")..
"field[0.25,2.3;1,1;radius;"..minetest.formspec_escape(S("Radius:"))..";"..meta:get_int("radius").."]"..
(meta:get_int("enabled") == 0 and
"button[3,2;2,1;enable;"..minetest.formspec_escape(S("Disabled")).."]" or
"button[3,2;2,1;disable;"..minetest.formspec_escape(S("Enabled")).."]")..
"label[0,3;"..minetest.formspec_escape(S("Keeping %d/%d map blocks loaded"):format(#currently_forceloaded_positions(meta), #compute_forceload_positions(pos, meta))).."]")
end
minetest.register_node("technic:admin_anchor", {
description = desc,
drawtype = "normal",
tiles = {"technic_admin_anchor.png"},
is_ground_content = true,
groups = {cracky=3, not_in_creative_inventory=1},
sounds = default.node_sound_stone_defaults(),
after_place_node = function (pos, placer)
local meta = minetest.get_meta(pos)
if placer and placer:is_player() then
meta:set_string("owner", placer:get_player_name())
end
set_display(pos, meta)
end,
can_dig = function (pos, player)
local meta = minetest.get_meta(pos)
return meta:get_int("locked") == 0 or (player and player:is_player() and player:get_player_name() == meta:get_string("owner"))
end,
on_destruct = function (pos)
local meta = minetest.get_meta(pos)
forceload_off(meta)
end,
on_receive_fields = function (pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
if (meta:get_int("locked") ~= 0 or fields.lock) and
not (sender and sender:is_player() and
sender:get_player_name() == meta:get_string("owner")) then
return
end
if fields.unlock then meta:set_int("locked", 0) end
if fields.lock then meta:set_int("locked", 1) end
if fields.disable or fields.enable or fields.radius then
forceload_off(meta)
if fields.disable then meta:set_int("enabled", 0) end
if fields.enable then meta:set_int("enabled", 1) end
if fields.radius and string.find(fields.radius, "^[0-9]+$") and tonumber(fields.radius) < 256 then meta:set_int("radius", fields.radius) end
if meta:get_int("enabled") ~= 0 then
forceload_on(pos, meta)
end
end
set_display(pos, meta)
end,
})

View File

@ -1,68 +1,75 @@
local S = technic.getter local S = technic.getter
local function deploy_node(inv, slot_name, pos, node, machine_node) local function deploy_node(inv, slot_name, pos1, node1, node)
if node.param2 > 3 then return end if node1.name == "air" then
if node.name ~= "air" then
if node.name == "ignore" or
node.name == "default:lava_source" or
node.name == "default:lava_flowing" or
node.name == "default:water_source" or
node.name == "default:water_flowing" then
return
end
local drops = minetest.get_node_drops(node.name, "")
local remove_to = false
for i, item in ipairs(drops) do
if not inv:room_for_item(slot_name, item) then
remove_to = i - 1
break
end
inv:add_item(slot_name, item)
end
if remove_to then
for i = 1, remove_to do
inv:remove_item(slot_name, drops[i])
end
else
minetest.remove_node(pos)
end
return
end
if not inv:is_empty(slot_name) then if not inv:is_empty(slot_name) then
local stack = inv:get_list(slot_name)[1] stack1=inv:get_list(slot_name)
local def = stack:get_definition() local def = stack1[1]:get_definition()
if def.type == "node" then if def.type == "node" then
minetest.set_node(pos, { node_to_be_placed={name=stack1[1]:get_name(), param1=0, param2=node.param2}
name = stack:get_name(), minetest.set_node(pos1,node_to_be_placed)
param2 = machine_node.param2 stack1[1]:take_item()
}) inv:set_stack(slot_name, 1, stack1[1])
stack:take_item()
inv:set_stack(slot_name, 1, stack)
elseif def.type == "craft" then elseif def.type == "craft" then
if def.on_place then if def.on_place then
-- Use pcall to avoid nil placer errors. -- print("deploy_node: item has on_place. trying...")
-- TODO: Do without pcall. local ok, stk = pcall(def.on_place, stack1[1], nil, {
local ok, stk = pcall(def.on_place, stack, nil, {
-- Fake pointed_thing -- Fake pointed_thing
type = "node", type = "node",
above = pos, above = pos1,
under = {x=pos.x, y=pos.y-1, z=pos.z}, under = { x=pos1.x, y=pos1.y-1, z=pos1.z },
}) })
if ok then if ok then
inv:set_stack(slot_name, 1, stk or stack) -- print("deploy_node: on_place succeeded!")
inv:set_stack(slot_name, 1, stk or stack1[1])
return return
-- else
-- print("deploy_node: WARNING: error while running on_place: "..tostring(stk))
end end
end end
minetest.item_place_object(stack, nil, { minetest.item_place_object(stack1[1], nil, {
-- Fake pointed_thing -- Fake pointed_thing
type = "node", type = "node",
above = pos, above = pos1,
under = pos, under = pos1,
}) })
inv:set_stack(slot_name, 1, nil) inv:set_stack(slot_name, 1, nil)
end end
end 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
local def = minetest.registered_nodes[node1.name]
if not def then return end
local drop = def.drop or node1.name
if type(drop) == "table" then
local pr = PseudoRandom(math.random())
local c = 0
local loop = 0 -- Prevent infinite loop
while (c < (drop.max_items or 1)) and (loop < 1000) do
local i = math.floor(pr:next(1, #drop.items))
if pr:next(1, drop.items[i].rarity or 1) == 1 then
for _,item in ipairs(drop.items[i].items) do
inv:add_item(slot_name,item)
end
c = c + 1
end
loop = loop + 1
end
minetest.remove_node(pos1)
elseif type(drop) == "string" then
inv:add_item(slot_name,drop)
minetest.remove_node(pos1)
end
end
end end
minetest.register_craft({ minetest.register_craft({
@ -85,108 +92,273 @@ minetest.register_craft({
}) })
local function make_on(mark, length) local function mk1_on(pos, node)
return function(pos, node)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local dir = vector.new() local pos1={}
if node.param2 == 3 then dir.x = 1 end pos1.x=pos.x
if node.param2 == 2 then dir.z = 1 end pos1.y=pos.y
if node.param2 == 1 then dir.x = -1 end pos1.z=pos.z
if node.param2 == 0 then dir.z = -1 end 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
local place_pos = vector.new(pos) if node.name == "technic:constructor_mk1_off" then
technic.swap_node(pos,"technic:constructor_mk1_on")
if node.name == "technic:constructor_mk"..mark.."_off" then nodeupdate(pos)
technic.swap_node(pos, "technic:constructor_mk"..mark.."_on") local node1=minetest.get_node(pos1)
minetest.check_for_falling(pos) deploy_node (inv,"slot1",pos1,node1,node)
for i = 1, length do
place_pos = vector.add(place_pos, dir)
local place_node = minetest.get_node(place_pos)
deploy_node(inv, "slot"..i, place_pos, place_node, node)
end
end
end end
end end
local function make_off(mark) local function mk1_off(pos, node)
return function(pos, node) if node.name == "technic:constructor_mk1_on" then
if node.name == "technic:constructor_mk"..mark.."_on" then technic.swap_node(pos,"technic:constructor_mk1_off")
technic.swap_node(pos,"technic:constructor_mk"..mark.."_off") nodeupdate(pos)
minetest.check_for_falling(pos)
end
end end
end end
local function make_constructor(mark, length) minetest.register_node("technic:constructor_mk1_off", {
minetest.register_node("technic:constructor_mk"..mark.."_off", { description = S("Constructor Mk%d"):format(1),
description = S("Constructor Mk%d"):format(mark), 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",
tiles = {"technic_constructor_mk"..mark.."_top_off.png", "technic_constructor_back.png","technic_constructor_front_off.png"},
"technic_constructor_mk"..mark.."_bottom_off.png", is_ground_content = true,
"technic_constructor_mk"..mark.."_side2_off.png",
"technic_constructor_mk"..mark.."_side1_off.png",
"technic_constructor_back.png",
"technic_constructor_front_off.png"},
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, mesecon = 2}, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2},
mesecons = {effector = {action_on = make_on(mark, length)}}, mesecons= {effector={action_on=mk1_on}},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local formspec = "size[8,9;]".. meta:set_string("formspec",
"label[0,0;"..S("Constructor Mk%d"):format(mark).."]".. "invsize[8,9;]"..
"list[current_player;main;0,5;8,4;]" "label[0,0;"..S("Constructor Mk%d"):format(1).."]"..
for i = 1, length do "label[5,0;"..S("Slot %d"):format(1).."]"..
formspec = formspec "list[current_name;slot1;6,0;1,1;]"..
.."label[5,"..(i - 1)..";"..S("Slot %d"):format(i).."]" "list[current_player;main;0,5;8,4;]")
.."list[current_name;slot"..i meta:set_string("infotext", S("Constructor Mk%d"):format(1))
..";6,"..(i - 1)..";1,1;]"
end
meta:set_string("formspec", formspec)
meta:set_string("infotext", S("Constructor Mk%d"):format(mark))
local inv = meta:get_inventory() local inv = meta:get_inventory()
for i = 1, length do inv:set_size("slot1", 1)
inv:set_size("slot"..i, 1) end,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv:is_empty("slot1")
end,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
})
minetest.register_node("technic:constructor_mk1_on", {
description = S("Constructor Mk%d"):format(1),
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"},
paramtype2 = "facedir",
drop = "technic:constructor_mk1_off",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon = 2,not_in_creative_inventory=1},
mesecons= {effector={action_off=mk1_off}},
sounds = default.node_sound_stone_defaults(),
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
})
--Constructor Mk2
local function mk2_on(pos, node)
local meta = minetest.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
technic.swap_node(pos,"technic:constructor_mk2_on")
nodeupdate(pos)
local node1=minetest.get_node(pos1)
deploy_node (inv,"slot1",pos1,node1,node)
local node1=minetest.get_node(pos2)
deploy_node (inv,"slot2",pos2,node1,node)
end end
end
local function mk2_off(pos, node)
if node.name == "technic:constructor_mk2_on" then
technic.swap_node(pos,"technic:constructor_mk2_off")
nodeupdate(pos)
end
end
minetest.register_node("technic:constructor_mk2_off", {
description = S("Constructor Mk%d"):format(2),
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 = 2},
mesecons= {effector={action_on=mk2_on}},
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec",
"invsize[8,9;]"..
"label[0,0;"..S("Constructor Mk%d"):format(2).."]"..
"label[5,0;"..S("Slot %d"):format(1).."]"..
"list[current_name;slot1;6,0;1,1;]"..
"label[5,1;"..S("Slot %d"):format(2).."]"..
"list[current_name;slot2;6,1;1,1;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", S("Constructor Mk%d"):format(2))
local inv = meta:get_inventory()
inv:set_size("slot1", 1)
inv:set_size("slot2", 1)
end, end,
can_dig = function(pos,player) can_dig = function(pos,player)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
for i = 1, length do if inv:is_empty("slot1")==false or inv:is_empty("slot2")==false then return false end
if not inv:is_empty("slot"..i) then
return false
end
end
return true return true
end, end,
allow_metadata_inventory_put = technic.machine_inventory_put, allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take, allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move, allow_metadata_inventory_move = technic.machine_inventory_move,
on_rotate = screwdriver.rotate_simple
}) })
minetest.register_node("technic:constructor_mk"..mark.."_on", { minetest.register_node("technic:constructor_mk2_on", {
tiles = {"technic_constructor_mk"..mark.."_top_on.png", description = S("Constructor Mk%d"):format(2),
"technic_constructor_mk"..mark.."_bottom_on.png", 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_mk"..mark.."_side2_on.png", "technic_constructor_back.png","technic_constructor_front_on.png"},
"technic_constructor_mk"..mark.."_side1_on.png", is_ground_content = true,
"technic_constructor_back.png",
"technic_constructor_front_on.png"},
paramtype2 = "facedir", paramtype2 = "facedir",
drop = "technic:constructor_mk"..mark.."_off", drop = "technic:constructor_mk2_off",
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2, not_in_creative_inventory=1},
mesecon=2, not_in_creative_inventory=1}, mesecons = {effector={action_off=mk2_off}},
mesecons= {effector = {action_off = make_off(mark)}},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
allow_metadata_inventory_put = technic.machine_inventory_put, allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take, allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move, allow_metadata_inventory_move = technic.machine_inventory_move,
on_rotate = false
}) })
-- Constructor Mk3
local function mk3_on(pos, node)
local meta = minetest.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
technic.swap_node(pos,"technic:constructor_mk3_on")
nodeupdate(pos)
local node1=minetest.get_node(pos1)
deploy_node (inv,"slot1",pos1,node1,node)
local node1=minetest.get_node(pos2)
deploy_node (inv,"slot2",pos2,node1,node)
local node1=minetest.get_node(pos3)
deploy_node (inv,"slot3",pos3,node1,node)
local node1=minetest.get_node(pos4)
deploy_node (inv,"slot4",pos4,node1,node)
end
end end
make_constructor(1, 1) local function mk3_off(pos, node)
make_constructor(2, 2) if node.name == "technic:constructor_mk3_on" then
make_constructor(3, 4) technic.swap_node(pos,"technic:constructor_mk3_off")
nodeupdate(pos)
end
end
minetest.register_node("technic:constructor_mk3_off", {
description = S("Constructor Mk%d"):format(3),
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"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2},
mesecons = {effector={action_on=mk3_on}},
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec",
"invsize[8,9;]"..
"label[0,0;"..S("Constructor Mk%d"):format(3).."]"..
"label[5,0;"..S("Slot %d"):format(1).."]"..
"list[current_name;slot1;6,0;1,1;]"..
"label[5,1;"..S("Slot %d"):format(2).."]"..
"list[current_name;slot2;6,1;1,1;]"..
"label[5,2;"..S("Slot %d"):format(3).."]"..
"list[current_name;slot3;6,2;1,1;]"..
"label[5,3;"..S("Slot %d"):format(4).."]"..
"list[current_name;slot4;6,3;1,1;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", S("Constructor Mk%d"):format(3))
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.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,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
})
minetest.register_node("technic:constructor_mk3_on", {
description = S("Constructor Mk%d"):format(3),
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",
drop = "technic:constructor_mk3_off",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,not_in_creative_inventory=1},
mesecons = {effector={action_off=mk3_off}},
sounds = default.node_sound_stone_defaults(),
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
})

View File

@ -1,9 +1,9 @@
local S = technic.getter local S = technic.getter
frames = {} frames = {}
local infinite_stacks = minetest.settings:get_bool("creative_mode") local infinite_stacks = minetest.setting_getbool("creative_mode") and minetest.get_modpath("unified_inventory") == nil
and minetest.get_modpath("unified_inventory") == nil
local frames_pos = {} local frames_pos = {}
@ -12,60 +12,45 @@ local frames_pos = {}
local function get_face(pos,ppos,pvect) local function get_face(pos,ppos,pvect)
-- Raytracer to get which face has been clicked -- Raytracer to get which face has been clicked
ppos={x=ppos.x-pos.x,y=ppos.y-pos.y+1.5,z=ppos.z-pos.z} ppos={x=ppos.x-pos.x,y=ppos.y-pos.y+1.5,z=ppos.z-pos.z}
if pvect.x>0 then if pvect.x>0 then
local t=(-0.5-ppos.x)/pvect.x local t=(-0.5-ppos.x)/pvect.x
local y_int=ppos.y+t*pvect.y local y_int=ppos.y+t*pvect.y
local z_int=ppos.z+t*pvect.z local z_int=ppos.z+t*pvect.z
if y_int > -0.45 and y_int < 0.45 and z_int > -0.45 and z_int < 0.45 then if y_int>-0.45 and y_int<0.45 and z_int>-0.45 and z_int<0.45 then return 1 end
return 1
end
elseif pvect.x<0 then elseif pvect.x<0 then
local t=(0.5-ppos.x)/pvect.x local t=(0.5-ppos.x)/pvect.x
local y_int=ppos.y+t*pvect.y local y_int=ppos.y+t*pvect.y
local z_int=ppos.z+t*pvect.z local z_int=ppos.z+t*pvect.z
if y_int > -0.45 and y_int < 0.45 and z_int > -0.45 and z_int < 0.45 then if y_int>-0.45 and y_int<0.45 and z_int>-0.45 and z_int<0.45 then return 2 end
return 2
end end
end
if pvect.y>0 then if pvect.y>0 then
local t=(-0.5-ppos.y)/pvect.y local t=(-0.5-ppos.y)/pvect.y
local x_int=ppos.x+t*pvect.x local x_int=ppos.x+t*pvect.x
local z_int=ppos.z+t*pvect.z local z_int=ppos.z+t*pvect.z
if x_int > -0.45 and x_int < 0.45 and z_int > -0.45 and z_int < 0.45 then if x_int>-0.45 and x_int<0.45 and z_int>-0.45 and z_int<0.45 then return 3 end
return 3
end
elseif pvect.y<0 then elseif pvect.y<0 then
local t=(0.5-ppos.y)/pvect.y local t=(0.5-ppos.y)/pvect.y
local x_int=ppos.x+t*pvect.x local x_int=ppos.x+t*pvect.x
local z_int=ppos.z+t*pvect.z local z_int=ppos.z+t*pvect.z
if x_int > -0.45 and x_int < 0.45 and z_int > -0.45 and z_int < 0.45 then if x_int>-0.45 and x_int<0.45 and z_int>-0.45 and z_int<0.45 then return 4 end
return 4
end end
end
if pvect.z>0 then if pvect.z>0 then
local t=(-0.5-ppos.z)/pvect.z local t=(-0.5-ppos.z)/pvect.z
local x_int=ppos.x+t*pvect.x local x_int=ppos.x+t*pvect.x
local y_int=ppos.y+t*pvect.y local y_int=ppos.y+t*pvect.y
if x_int > -0.45 and x_int < 0.45 and y_int > -0.45 and y_int < 0.45 then if x_int>-0.45 and x_int<0.45 and y_int>-0.45 and y_int<0.45 then return 5 end
return 5
end
elseif pvect.z<0 then elseif pvect.z<0 then
local t=(0.5-ppos.z)/pvect.z local t=(0.5-ppos.z)/pvect.z
local x_int=ppos.x+t*pvect.x local x_int=ppos.x+t*pvect.x
local y_int=ppos.y+t*pvect.y local y_int=ppos.y+t*pvect.y
if x_int > -0.45 and x_int < 0.45 and y_int > -0.45 and y_int < 0.45 then if x_int>-0.45 and x_int<0.45 and y_int>-0.45 and y_int<0.45 then return 6 end
return 6
end
end end
end end
local function lines(str) local function lines(str)
local t = {} local t = {}
local function helper(line) table.insert(t, line) return "" end local function helper(line) table.insert(t, line) return "" end
helper(str:gsub("(.-)\r?\n", helper)) helper((str:gsub("(.-)\r?\n", helper)))
return t return t
end end
@ -83,9 +68,7 @@ end
local function pos_in_list(l,pos) local function pos_in_list(l,pos)
for _,p in ipairs(l) do for _,p in ipairs(l) do
if p.x == pos.x and p.y == pos.y and p.z == pos.z then if p.x==pos.x and p.y==pos.y and p.z==pos.z then return true end
return true
end
end end
return false return false
end end
@ -117,56 +100,39 @@ local function move_nodes_vect(poslist, vect, must_not_move, owner)
end end
end end
end end
for _,pos in ipairs(poslist) do for _,pos in ipairs(poslist) do
local npos=vector.add(pos,vect) local npos=vector.add(pos,vect)
local name = minetest.get_node(npos).name local name = minetest.get_node(npos).name
if (name ~= "air" and minetest.registered_nodes[name].liquidtype == "none" or if ((name~="air" and minetest.registered_nodes[name].liquidtype=="none") or frames_pos[pos_to_string(npos)]) and not(pos_in_list(poslist,npos)) then
frames_pos[pos_to_string(npos)]) and not pos_in_list(poslist, npos) then
return return
end end
--[[if pos.x==must_not_move.x and pos.y==must_not_move.y and pos.z==must_not_move.z then
return
end]]
end end
local nodelist = {} local nodelist = {}
for _, pos in ipairs(poslist) do for _, pos in ipairs(poslist) do
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos):to_table() local meta = minetest.get_meta(pos):to_table()
local timer = minetest.get_node_timer(pos) nodelist[#(nodelist)+1] = {oldpos = pos, pos = vector.add(pos, vect), node = node, meta = meta}
nodelist[#nodelist + 1] = {
oldpos = pos,
pos = vector.add(pos, vect),
node = node,
meta = meta,
timer = {
timeout = timer:get_timeout(),
elapsed = timer:get_elapsed()
}
}
end end
local objects = {} local objects = {}
for _, pos in ipairs(poslist) do for _, pos in ipairs(poslist) do
for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do
local entity = object:get_luaentity() local entity = object:get_luaentity()
if not entity or not mesecon.is_mvps_unmov(entity.name) then if not entity or not mesecon:is_mvps_unmov(entity.name) then
add_table(objects, object) add_table(objects, object)
end end
end end
end end
for _, obj in ipairs(objects) do for _, obj in ipairs(objects) do
obj:setpos(vector.add(obj:getpos(), vect)) obj:setpos(vector.add(obj:getpos(), vect))
end end
for _,n in ipairs(nodelist) do for _,n in ipairs(nodelist) do
local npos = n.pos local npos = n.pos
minetest.set_node(npos, n.node) minetest.set_node(npos, n.node)
local meta = minetest.get_meta(npos) local meta = minetest.get_meta(npos)
meta:from_table(n.meta) meta:from_table(n.meta)
local timer = minetest.get_node_timer(npos)
if n.timer.timeout ~= 0 or n.timer.elapsed ~= 0 then
timer:set(n.timer.timeout, n.timer.elapsed)
end
for __,pos in ipairs(poslist) do for __,pos in ipairs(poslist) do
if npos.x == pos.x and npos.y == pos.y and npos.z == pos.z then if npos.x == pos.x and npos.y == pos.y and npos.z == pos.z then
table.remove(poslist, __) table.remove(poslist, __)
@ -174,20 +140,19 @@ local function move_nodes_vect(poslist, vect, must_not_move, owner)
end end
end end
end end
for __, pos in ipairs(poslist) do for __, pos in ipairs(poslist) do
minetest.remove_node(pos) minetest.remove_node(pos)
end end
for _, callback in ipairs(mesecon.on_mvps_move) do for _, callback in ipairs(mesecon.on_mvps_move) do
callback(nodelist) callback(nodelist)
end end
end end
local function is_supported_node(name) local function is_supported_node(name)
return string.find(name, "tube") and string.find(name, "pipeworks") return ((string.find(name, "tube") ~= nil) and (string.find(name, "pipeworks") ~= nil))
end end
-- Frames -- Frames
for xm=0,1 do for xm=0,1 do
for xp=0,1 do for xp=0,1 do
@ -201,7 +166,6 @@ for zp = 0, 1 do
local nodeboxes= { local nodeboxes= {
{ -a, -a, -a, -b, a, -b }, { -a, -a, -a, -b, a, -b },
{ -a, -a, b, -b, a, a }, { -a, -a, b, -b, a, a },
{ b, -a, b, a, a, a }, { b, -a, b, a, a, a },
{ b, -a, -a, a, a, -b }, { b, -a, -a, a, a, -b },
@ -237,7 +201,7 @@ for zp = 0, 1 do
table.insert(nodeboxes, {-b,-b,-a, b,b,-b}) table.insert(nodeboxes, {-b,-b,-a, b,b,-b})
end end
local nameext = string.format("%d%d%d%d%d%d", xm, xp, ym, yp, zm, zp) local nameext=tostring(xm)..tostring(xp)..tostring(ym)..tostring(yp)..tostring(zm)..tostring(zp)
local groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2} local groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}
if nameext~="111111" then groups.not_in_creative_inventory=1 end if nameext~="111111" then groups.not_in_creative_inventory=1 end
@ -259,44 +223,33 @@ for zp = 0, 1 do
frame=1, frame=1,
drop="technic:frame_111111", drop="technic:frame_111111",
sunlight_propagates = true, sunlight_propagates = true,
frame_connect_all=function(nodename) frame_connect_all=function(nodename)
l2={} l2={}
l1 = { l1={{x=-1,y=0,z=0},{x=1,y=0,z=0},{x=0,y=-1,z=0},{x=0,y=1,z=0},{x=0,y=0,z=-1},{x=0,y=0,z=1}}
{ x = -1, y = 0, z = 0 }, { x = 1, y = 0, z = 0 },
{ x = 0, y = -1, z = 0 }, { x = 0, y = 1, z = 0 },
{ x = 0, y = 0, z = -1 }, { x = 0, y = 0, z = 1 }
}
for i,dir in ipairs(l1) do for i,dir in ipairs(l1) do
if string.sub(nodename,-7+i,-7+i)=="1" then if string.sub(nodename,-7+i,-7+i)=="1" then
l2[#l2 + 1] = dir l2[#(l2)+1]=dir
end end
end end
return l2 return l2
end, end,
on_punch=function(pos,node,puncher) on_punch=function(pos,node,puncher)
local ppos=puncher:getpos() local ppos=puncher:getpos()
local pvect=puncher:get_look_dir() local pvect=puncher:get_look_dir()
local pface=get_face(pos,ppos,pvect) local pface=get_face(pos,ppos,pvect)
if pface==nil then return end if pface==nil then return end
local nodename=node.name local nodename=node.name
local newstate = tostring(1 - tonumber(string.sub(nodename, pface - 7, pface - 7))) local newstate=tostring(1-tonumber(string.sub(nodename,-7+pface,-7+pface)))
if pface<=5 then if pface<=5 then
nodename = string.sub(nodename, 1, pface - 7 - 1)..newstate..string.sub(nodename, pface - 7 + 1) nodename=string.sub(nodename,1,-7+pface-1)..newstate..string.sub(nodename,-7+pface+1)
else else
nodename=string.sub(nodename,1,-2)..newstate nodename=string.sub(nodename,1,-2)..newstate
end end
node.name=nodename node.name=nodename
minetest.set_node(pos,node) minetest.set_node(pos,node)
end, end,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
local pos = pointed_thing.above local pos = pointed_thing.above
if minetest.is_protected(pos, placer:get_player_name()) then if minetest.is_protected(pos, placer:get_player_name()) then
minetest.log("action", placer:get_player_name() minetest.log("action", placer:get_player_name()
.. " tried to place " .. itemstack:get_name() .. " tried to place " .. itemstack:get_name()
@ -305,9 +258,7 @@ for zp = 0, 1 do
minetest.record_protection_violation(pos, placer:get_player_name()) minetest.record_protection_violation(pos, placer:get_player_name())
return itemstack return itemstack
end end
if pos == nil then return end if pos == nil then return end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
if node.name ~= "air" then if node.name ~= "air" then
if is_supported_node(node.name) then if is_supported_node(node.name) then
@ -317,13 +268,11 @@ for zp = 0, 1 do
else else
minetest.set_node(pos, {name = itemstack:get_name()}) minetest.set_node(pos, {name = itemstack:get_name()})
end end
if not infinite_stacks then if not infinite_stacks then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
end, end,
on_rightclick = function(pos, node, placer, itemstack, pointed_thing) on_rightclick = function(pos, node, placer, itemstack, pointed_thing)
if is_supported_node(itemstack:get_name()) then if is_supported_node(itemstack:get_name()) then
if minetest.is_protected(pos, placer:get_player_name()) then if minetest.is_protected(pos, placer:get_player_name()) then
@ -342,7 +291,7 @@ for zp = 0, 1 do
-- Run callback -- Run callback
if def.after_place_node then if def.after_place_node then
-- Copy place_to because callback can modify it -- Copy place_to because callback can modify it
local pos_copy = vector.new(pos) local pos_copy = {x=pos.x, y=pos.y, z=pos.z}
if def.after_place_node(pos_copy, placer, itemstack) then if def.after_place_node(pos_copy, placer, itemstack) then
take_item = false take_item = false
end end
@ -371,7 +320,7 @@ for zp = 0, 1 do
else else
--local pointed_thing = {type = "node", under = pos} --local pointed_thing = {type = "node", under = pos}
if pointed_thing then if pointed_thing then
return minetest.item_place_node(itemstack, placer, pointed_thing) minetest.item_place_node(itemstack, placer, pointed_thing)
end end
end end
end, end,
@ -397,17 +346,15 @@ minetest.register_entity("technic:frame_entity", {
set_node = function(self, node) set_node = function(self, node)
self.node = node self.node = node
local pos = vector.round(self.object:getpos()) local pos = self.object:getpos()
pos = {x = math.floor(pos.x+0.5), y = math.floor(pos.y+0.5), z = math.floor(pos.z+0.5)}
frames_pos[pos_to_string(pos)] = node.name frames_pos[pos_to_string(pos)] = node.name
local stack = ItemStack(node.name) local stack = ItemStack(node.name)
local itemtable = stack:to_table() local itemtable = stack:to_table()
local itemname = nil local itemname = nil
if itemtable then if itemtable then
itemname = stack:to_table().name itemname = stack:to_table().name
end end
local item_texture = nil local item_texture = nil
local item_type = "" local item_type = ""
if minetest.registered_items[itemname] then if minetest.registered_items[itemname] then
@ -432,7 +379,8 @@ minetest.register_entity("technic:frame_entity", {
dig = function(self) dig = function(self)
minetest.handle_node_drops(self.object:getpos(), {ItemStack("technic:frame_111111")}, self.last_puncher) minetest.handle_node_drops(self.object:getpos(), {ItemStack("technic:frame_111111")}, self.last_puncher)
local pos = vector.round(self.object:getpos()) local pos = self.object:getpos()
pos = {x = math.floor(pos.x+0.5), y = math.floor(pos.y+0.5), z = math.floor(pos.z+0.5)}
frames_pos[pos_to_string(pos)] = nil frames_pos[pos_to_string(pos)] = nil
self.object:remove() self.object:remove()
end, end,
@ -448,21 +396,18 @@ minetest.register_entity("technic:frame_entity", {
else else
self.damage_object:get_luaentity().remaining_time = 0.25 self.damage_object:get_luaentity().remaining_time = 0.25
end end
self.last_puncher = puncher self.last_puncher = puncher
local ppos = puncher:getpos() local ppos = puncher:getpos()
local pvect = puncher:get_look_dir() local pvect = puncher:get_look_dir()
local pface = get_face(pos,ppos,pvect) local pface = get_face(pos,ppos,pvect)
if pface == nil then return end if pface == nil then return end
local nodename = self.node.name local nodename = self.node.name
local newstate = tostring(1 - tonumber(string.sub(nodename, pface - 7, pface - 7))) local newstate = tostring(1-tonumber(string.sub(nodename, -7+pface, -7+pface)))
if pface <= 5 then if pface <= 5 then
nodename = string.sub(nodename, 1, pface - 7 - 1)..newstate..string.sub(nodename, pface - 7 + 1) nodename = string.sub(nodename, 1, -7+pface-1)..newstate..string.sub(nodename, -7+pface+1)
else else
nodename = string.sub(nodename, 1, -2)..newstate nodename = string.sub(nodename, 1, -2)..newstate
end end
self.node.name = nodename self.node.name = nodename
self:set_node(self.node) self:set_node(self.node)
end, end,
@ -472,19 +417,14 @@ minetest.register_entity("technic:frame_entity", {
local ppos = clicker:getpos() local ppos = clicker:getpos()
local pvect = clicker:get_look_dir() local pvect = clicker:get_look_dir()
local pface = get_face(pos, ppos, pvect) local pface = get_face(pos, ppos, pvect)
if pface == nil then return end
if pface == nil then local pos_under = {x = math.floor(pos.x+0.5), y = math.floor(pos.y+0.5), z = math.floor(pos.z+0.5)}
return
end
local pos_under = vector.round(pos)
local pos_above = {x = pos_under.x, y = pos_under.y, z = pos_under.z} local pos_above = {x = pos_under.x, y = pos_under.y, z = pos_under.z}
local index = ({"x", "y", "z"})[math.floor((pface+1)/2)] local index = ({"x", "y", "z"})[math.floor((pface+1)/2)]
pos_above[index] = pos_above[index] + 2*((pface+1)%2) - 1 pos_above[index] = pos_above[index] + 2*((pface+1)%2) - 1
local pointed_thing = {type = "node", under = pos_under, above = pos_above} local pointed_thing = {type = "node", under = pos_under, above = pos_above}
local itemstack = clicker:get_wielded_item() local itemstack = clicker:get_wielded_item()
local itemdef = minetest.registered_items[itemstack:get_name()] local itemdef = minetest.registered_items[itemstack:get_name()]
if itemdef ~= nil then if itemdef ~= nil then
itemdef.on_place(itemstack, clicker, pointed_thing) itemdef.on_place(itemstack, clicker, pointed_thing)
end end
@ -525,17 +465,13 @@ minetest.register_entity("technic:damage_entity", {
end, end,
}) })
mesecon.register_mvps_unmov("technic:frame_entity") mesecon:register_mvps_unmov("technic:frame_entity")
mesecon.register_mvps_unmov("technic:damage_entity") mesecon:register_mvps_unmov("technic:damage_entity")
mesecon.register_on_mvps_move(function(moved_nodes) mesecon:register_on_mvps_move(function(moved_nodes)
local to_move = {} local to_move = {}
for _, n in ipairs(moved_nodes) do for _, n in ipairs(moved_nodes) do
if frames_pos[pos_to_string(n.oldpos)] ~= nil then if frames_pos[pos_to_string(n.oldpos)] ~= nil then
to_move[#to_move + 1] = { to_move[#to_move+1] = {pos = n.pos, oldpos = n.oldpos, name = frames_pos[pos_to_string(n.oldpos)]}
pos = n.pos,
oldpos = n.oldpos,
name = frames_pos[pos_to_string(n.oldpos)]
}
frames_pos[pos_to_string(n.oldpos)] = nil frames_pos[pos_to_string(n.oldpos)] = nil
end end
end end
@ -545,8 +481,7 @@ mesecon.register_on_mvps_move(function(moved_nodes)
local objects = minetest.get_objects_inside_radius(t.oldpos, 0.1) local objects = minetest.get_objects_inside_radius(t.oldpos, 0.1)
for _, obj in ipairs(objects) do for _, obj in ipairs(objects) do
local entity = obj:get_luaentity() local entity = obj:get_luaentity()
if entity and (entity.name == "technic:frame_entity" or if entity and (entity.name == "technic:frame_entity" or entity.name == "technic:damage_entity") then
entity.name == "technic:damage_entity") then
obj:setpos(t.pos) obj:setpos(t.pos)
end end
end end
@ -576,10 +511,10 @@ local function connected(pos, c, adj)
if frames_pos[pos_to_string(pos1)] then if frames_pos[pos_to_string(pos1)] then
nodename = frames_pos[pos_to_string(pos1)] nodename = frames_pos[pos_to_string(pos1)]
end end
if not pos_in_list(c, pos1) and nodename ~= "air" and if not(pos_in_list(c,pos1)) and nodename~="air" and
(minetest.registered_nodes[nodename].frames_can_connect==nil or (minetest.registered_nodes[nodename].frames_can_connect==nil or
minetest.registered_nodes[nodename].frames_can_connect(pos1,vect)) then minetest.registered_nodes[nodename].frames_can_connect(pos1,vect)) then
c[#c + 1] = pos1 c[#(c)+1]=pos1
if minetest.registered_nodes[nodename].frame==1 then if minetest.registered_nodes[nodename].frame==1 then
local adj=minetest.registered_nodes[nodename].frame_connect_all(nodename) local adj=minetest.registered_nodes[nodename].frame_connect_all(nodename)
connected(pos1,c,adj) connected(pos1,c,adj)
@ -599,55 +534,39 @@ local function get_connected_nodes(pos)
end end
local function frame_motor_on(pos, node) local function frame_motor_on(pos, node)
local dirs = { local dirs = {{x=0,y=1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=-1,z=0}}
{ x = 0, y = 1, z = 0 }, { x = 0, y = 0, z = 1 },
{ x = 0, y = 0, z = -1 }, { x = 1, y = 0, z = 0 },
{ x = -1, y = 0, z = 0 }, { x = 0, y = -1, z = 0 }
}
local nnodepos = vector.add(pos, dirs[math.floor(node.param2/4)+1]) local nnodepos = vector.add(pos, dirs[math.floor(node.param2/4)+1])
local dir = minetest.facedir_to_dir(node.param2) local dir = minetest.facedir_to_dir(node.param2)
local nnode=minetest.get_node(nnodepos) local nnode=minetest.get_node(nnodepos)
if frames_pos[pos_to_string(nnodepos)] then if frames_pos[pos_to_string(nnodepos)] then
nnode.name = frames_pos[pos_to_string(nnodepos)] nnode.name = frames_pos[pos_to_string(nnodepos)]
end end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if meta:get_int("last_moved") == minetest.get_gametime() then if meta:get_int("last_moved") == minetest.get_gametime() then
return return
end end
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
if minetest.registered_nodes[nnode.name].frame==1 then if minetest.registered_nodes[nnode.name].frame==1 then
local connected_nodes=get_connected_nodes(nnodepos) local connected_nodes=get_connected_nodes(nnodepos)
move_nodes_vect(connected_nodes,dir,pos,owner) move_nodes_vect(connected_nodes,dir,pos,owner)
end end
minetest.get_meta(vector.add(pos, dir)):set_int("last_moved", minetest.get_gametime()) minetest.get_meta(vector.add(pos, dir)):set_int("last_moved", minetest.get_gametime())
end end
minetest.register_node("technic:frame_motor",{ minetest.register_node("technic:frame_motor",{
description = S("Frame Motor"), description = S("Frame Motor"),
tiles = { tiles = {"pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png",
"pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png"},
"technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png"
},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2}, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
paramtype2 = "facedir", paramtype2 = "facedir",
mesecons={effector={action_on=frame_motor_on}}, mesecons={effector={action_on=frame_motor_on}},
after_place_node = function(pos, placer, itemstack) after_place_node = function(pos, placer, itemstack)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("owner", placer:get_player_name()) meta:set_string("owner", placer:get_player_name())
end, end,
frames_can_connect=function(pos,dir) frames_can_connect=function(pos,dir)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local dir2 = ({ local dir2 = ({{x=0,y=1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=-1,z=0}})[math.floor(node.param2/4)+1]
{ x= 0 , y = 1, z = 0 }, { x = 0, y = 0, z = 1 },
{ x = 0, y = 0, z = -1 }, { x = 1, y = 0, z = 0 },
{ x = -1, y = 0, z = 0 }, { x = 0, y = -1, z = 0 }
})[math.floor(node.param2 / 4) + 1]
return dir2.x~=-dir.x or dir2.y~=-dir.y or dir2.z~=-dir.z return dir2.x~=-dir.x or dir2.y~=-dir.y or dir2.z~=-dir.z
end end
}) })
@ -656,19 +575,13 @@ minetest.register_node("technic:frame_motor", {
-- Templates -- Templates
local function template_connected(pos,c,connectors) local function template_connected(pos,c,connectors)
local vects = { for _,vect in ipairs({{x=0,y=1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=-1,z=0}}) do
{ x = 0, y = 1, z = 0 }, { x = 0, y = 0, z = 1 },
{ x = 0, y = 0, z = -1 }, { x = 1, y = 0, z = 0 },
{ x = -1, y = 0, z = 0 }, { x = 0, y = -1, z = 0 }
}
for _, vect in ipairs(vects) do
local pos1=vector.add(pos,vect) local pos1=vector.add(pos,vect)
local nodename=minetest.get_node(pos1).name local nodename=minetest.get_node(pos1).name
if not pos_in_list(c, pos1) and (nodename == "technic:template" or if not(pos_in_list(c,pos1)) and (nodename=="technic:template" or nodename == "technic:template_connector")then
nodename == "technic:template_connector") then
local meta = minetest.get_meta(pos1) local meta = minetest.get_meta(pos1)
if meta:get_string("connected") == "" then if meta:get_string("connected") == "" then
c[#c + 1] = pos1 c[#(c)+1]=pos1
template_connected(pos1,c,connectors) template_connected(pos1,c,connectors)
if nodename == "technic:template_connector" then if nodename == "technic:template_connector" then
connectors[#connectors+1] = pos1 connectors[#connectors+1] = pos1
@ -711,7 +624,6 @@ local function save_node(pos)
meta:set_string("connected", "") meta:set_string("connected", "")
return return
end end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local meta0 = meta:to_table() local meta0 = meta:to_table()
for _, list in pairs(meta0.inventory) do for _, list in pairs(meta0.inventory) do
@ -719,7 +631,6 @@ local function save_node(pos)
list[key] = stack:to_string() list[key] = stack:to_string()
end end
end end
node.meta = meta0 node.meta = meta0
minetest.set_node(pos, {name="technic:template"}) minetest.set_node(pos, {name="technic:template"})
return node return node
@ -739,27 +650,25 @@ end
local function expand_template(pos) local function expand_template(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local c = meta:get_string("connected") local c = meta:get_string("connected")
if c == "" then return end if c == "" then return end
c = minetest.deserialize(c) c = minetest.deserialize(c)
for _, vect in ipairs(c) do for _, vect in ipairs(c) do
local pos1 = vector.add(pos, vect) local pos1 = vector.add(pos, vect)
local saved_node = save_node(pos1) local saved_node = save_node(pos1)
local meta1 = minetest.get_meta(pos1) local meta1 = minetest.get_meta(pos1)
if saved_node ~= nil then if saved_node ~= nil then
meta1:set_string("saved_node", minetest.serialize(saved_node)) meta1:set_string("saved_node", minetest.serialize(saved_node))
else
--meta1:set_string("saved_node", "")
end end
end end
end end
local function compress_templates(pos) local function compress_templates(pos)
local templates, connectors = get_templates(pos) local templates, connectors = get_templates(pos)
if #connectors == 0 then if #connectors == 0 then
connectors = {pos} connectors = {pos}
end end
for _, cn in ipairs(connectors) do for _, cn in ipairs(connectors) do
local meta = minetest.get_meta(cn) local meta = minetest.get_meta(cn)
local c = {} local c = {}
@ -772,7 +681,7 @@ local function compress_templates(pos)
local cc = {} local cc = {}
for _,p in ipairs(connectors) do for _,p in ipairs(connectors) do
local np = vector.subtract(p, cn) local np = vector.subtract(p, cn)
if np.x ~= 0 or np.y ~= 0 or np.z ~= 0 then if (np.x ~= 0 or np.y ~= 0 or np.z ~= 0) then
cc[pos_to_string(np)] = true cc[pos_to_string(np)] = true
end end
end end
@ -792,7 +701,6 @@ local function template_drops(pos, node, oldmeta, digger)
local c = oldmeta.fields.connected local c = oldmeta.fields.connected
local cc = oldmeta.fields.connectors_connected local cc = oldmeta.fields.connectors_connected
local drops local drops
if c == "" or c == nil then if c == "" or c == nil then
drops = {"technic:template 1"} drops = {"technic:template 1"}
else else
@ -814,7 +722,7 @@ local function template_drops(pos, node, oldmeta, digger)
end end
else else
local stack_max = 99 local stack_max = 99
local num = #minetest.deserialize(c) local num = #(minetest.deserialize(c))
drops = {} drops = {}
while num > stack_max do while num > stack_max do
drops[#drops+1] = "technic:template "..stack_max drops[#drops+1] = "technic:template "..stack_max
@ -824,7 +732,6 @@ local function template_drops(pos, node, oldmeta, digger)
end end
end end
end end
minetest.handle_node_drops(pos, drops, digger) minetest.handle_node_drops(pos, drops, digger)
end end
@ -899,7 +806,7 @@ minetest.register_tool("technic:template_tool", {
inventory_image = "technic_template_tool.png", inventory_image = "technic_template_tool.png",
on_use = function(itemstack, puncher, pointed_thing) on_use = function(itemstack, puncher, pointed_thing)
local pos = pointed_thing.under local pos = pointed_thing.under
if pos == nil or minetest.is_protected and minetest.is_protected(pos, puncher:get_player_name()) then if pos == nil or (minetest.is_protected and minetest.is_protected(pos, puncher:get_player_name())) then
return nil return nil
end end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
@ -928,18 +835,14 @@ local function get_template_nodes(pos)
local pos1=vector.add(pos,vect) local pos1=vector.add(pos,vect)
local nodename=minetest.get_node(pos1).name local nodename=minetest.get_node(pos1).name
if not(pos_in_list(c,pos1)) and nodename~="air" then if not(pos_in_list(c,pos1)) and nodename~="air" then
c[#c + 1] = pos1 c[#(c)+1]=pos1
end end
end end
return c return c
end end
local function template_motor_on(pos, node) local function template_motor_on(pos, node)
local dirs = { local dirs = {{x=0,y=1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=-1,z=0}}
{ x = 0, y = 1, z = 0 }, { x = 0, y = 0, z = 1 },
{ x = 0, y = 0, z = -1 }, { x = 1, y = 0, z = 0 },
{ x = -1, y = 0, z = 0 }, { x = 0, y = -1, z = 0 }
}
local nnodepos = vector.add(pos, dirs[math.floor(node.param2/4)+1]) local nnodepos = vector.add(pos, dirs[math.floor(node.param2/4)+1])
local dir = minetest.facedir_to_dir(node.param2) local dir = minetest.facedir_to_dir(node.param2)
local nnode=minetest.get_node(nnodepos) local nnode=minetest.get_node(nnodepos)
@ -957,14 +860,8 @@ end
minetest.register_node("technic:template_motor",{ minetest.register_node("technic:template_motor",{
description = S("Template Motor"), description = S("Template Motor"),
tiles = { tiles = {"pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png",
"pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png"},
"technic_lv_cable.png",
"technic_lv_cable.png",
"technic_lv_cable.png",
"technic_lv_cable.png",
"technic_lv_cable.png"
},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2}, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
paramtype2 = "facedir", paramtype2 = "facedir",
mesecons={effector={action_on=template_motor_on}}, mesecons={effector={action_on=template_motor_on}},

View File

@ -3,13 +3,6 @@ local path = technic.modpath.."/machines/other"
-- mesecons and tubes related -- mesecons and tubes related
dofile(path.."/injector.lua") dofile(path.."/injector.lua")
dofile(path.."/constructor.lua") dofile(path.."/constructor.lua")
if minetest.get_modpath("mesecons_mvps") ~= nil then
if technic.config:get_bool("enable_frames") and minetest.get_modpath("mesecons_mvps") ~= nil then
dofile(path.."/frames.lua") dofile(path.."/frames.lua")
end end
-- Coal-powered machines
dofile(path.."/coal_alloy_furnace.lua")
dofile(path.."/coal_furnace.lua")
dofile(path.."/anchor.lua")

View File

@ -1,12 +1,8 @@
local S = technic.getter local S = technic.getter
local fs_helpers = pipeworks.fs_helpers
local tube_entry = "^pipeworks_tube_connection_metallic.png"
local function inject_items (pos) local function inject_items (pos)
local meta=minetest.get_meta(pos) local meta=minetest.env:get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local mode=meta:get_string("mode") local mode=meta:get_string("mode")
if mode=="single items" then if mode=="single items" then
@ -17,8 +13,11 @@ local function inject_items (pos)
local item0=stack:to_table() local item0=stack:to_table()
if item0 then if item0 then
item0["count"]="1" item0["count"]="1"
technic.tube_inject_item(pos, pos, vector.new(0, -1, 0), item0) local item1=pipeworks.tube_item({x=pos.x,y=pos.y,z=pos.z},item0)
stack:take_item(1) item1:get_luaentity().start_pos = {x=pos.x,y=pos.y,z=pos.z}
item1:setvelocity({x=0, y=-1, z=0})
item1:setacceleration({x=0, y=0, z=0})
stack:take_item(1);
inv:set_stack("main", i, stack) inv:set_stack("main", i, stack)
return return
end end
@ -32,7 +31,10 @@ local function inject_items (pos)
if stack then if stack then
local item0=stack:to_table() local item0=stack:to_table()
if item0 then if item0 then
technic.tube_inject_item(pos, pos, vector.new(0, -1, 0), item0) local item1=pipeworks.tube_item({x=pos.x,y=pos.y,z=pos.z},item0)
item1:get_luaentity().start_pos = {x=pos.x,y=pos.y,z=pos.z}
item1:setvelocity({x=0, y=-1, z=0})
item1:setacceleration({x=0, y=0, z=0})
stack:clear() stack:clear()
inv:set_stack("main", i, stack) inv:set_stack("main", i, stack)
return return
@ -52,100 +54,67 @@ minetest.register_craft({
} }
}) })
local function set_injector_formspec(meta)
local is_stack = meta:get_string("mode") == "whole stacks"
meta:set_string("formspec",
"size[8,9;]"..
"item_image[0,0;1,1;technic:injector]"..
"label[1,0;"..S("Self-Contained Injector").."]"..
(is_stack and
"button[0,1;2,1;mode_item;"..S("Stackwise").."]" or
"button[0,1;2,1;mode_stack;"..S("Itemwise").."]")..
"list[current_name;main;0,2;8,2;]"..
"list[current_player;main;0,5;8,4;]"..
"listring[]"..
fs_helpers.cycling_button(
meta,
pipeworks.button_base,
"splitstacks",
{
pipeworks.button_off,
pipeworks.button_on
}
)..pipeworks.button_label
)
end
minetest.register_node("technic:injector", { minetest.register_node("technic:injector", {
description = S("Self-Contained Injector"), description = S("Injector"),
tiles = { tiles = {"technic_injector_top.png", "technic_injector_bottom.png", "technic_injector_side.png",
"technic_injector_top.png"..tube_entry, "technic_injector_side.png", "technic_injector_side.png", "technic_injector_side.png"},
"technic_injector_bottom.png", groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, tubedevice=1},
"technic_injector_side.png"..tube_entry, tube = {connect_sides={bottom=1}},
"technic_injector_side.png"..tube_entry,
"technic_injector_side.png"..tube_entry,
"technic_injector_side.png"
},
paramtype2 = "facedir",
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, tubedevice=1, tubedevice_receiver=1},
tube = {
can_insert = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if meta:get_int("splitstacks") == 1 then
stack = stack:peek_item(1)
end
return meta:get_inventory():room_for_item("main", stack)
end,
insert_object = function(pos, node, stack, direction)
return minetest.get_meta(pos):get_inventory():add_item("main", stack)
end,
connect_sides = {left=1, right=1, back=1, top=1, bottom=1},
},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", S("Self-Contained Injector")) meta:set_string("formspec",
"invsize[8,9;]"..
"label[0,0;"..S("Injector").."]"..
"button[0,1;.8,.8;mode;]"..
"label[.8,1;"..S("Mode: %s"):format("single items").."]"..
"list[current_name;main;0,2;8,2;]"..
"list[current_player;main;0,5;8,4;]")
meta:set_string("infotext", S("Injector"))
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("main", 8*2) inv:set_size("main", 8*4)
meta:set_string("mode","single items") meta:set_string("mode","single items")
set_injector_formspec(meta)
end, end,
can_dig = function(pos,player) can_dig = function(pos,player)
local meta = minetest.get_meta(pos); local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory() local inv = meta:get_inventory()
return inv:is_empty("main") return inv:is_empty("main")
end, end,
on_receive_fields = function(pos, formanme, fields, sender) on_receive_fields = function(pos, formanme, fields, sender)
local meta = minetest.get_meta(pos) local meta = minetest.env:get_meta(pos)
if fields.mode_item then meta:set_string("mode", "single items") end local mode=meta:get_string("mode")
if fields.mode_stack then meta:set_string("mode", "whole stacks") end if fields.mode then
if mode == "single items" then
if fields["fs_helpers_cycling:0:splitstacks"] mode = "whole stacks"
or fields["fs_helpers_cycling:1:splitstacks"] then else
if not pipeworks.may_configure(pos, sender) then return end mode = "single items"
fs_helpers.on_receive_fields(pos, fields)
end end
set_injector_formspec(meta) meta:set_string("mode", mode)
end
meta:set_string("formspec",
"invsize[8,9;]"..
"label[0,0;"..S("Injector").."]"..
"button[0,1;.8,.8;mode;]"..
"label[.8,1;"..S("Mode: %s"):format(S(mode)).."]"..
"list[current_name;main;0,2;8,2;]"..
"list[current_player;main;0,5;8,4;]")
end, end,
allow_metadata_inventory_put = technic.machine_inventory_put, allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take, allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move, allow_metadata_inventory_move = technic.machine_inventory_move,
after_place_node = pipeworks.after_place,
after_dig_node = pipeworks.after_dig
}) })
minetest.register_abm({ minetest.register_abm({
label = "Machines: run injector",
nodenames = {"technic:injector"}, nodenames = {"technic:injector"},
interval = 1, interval = 1,
chance = 1, chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider) action = function(pos, node, active_object_count, active_object_count_wider)
local pos1 = vector.add(pos, vector.new(0, -1, 0)) local pos1={}
local node1 = minetest.get_node(pos1) pos1.x = pos.x
if minetest.get_item_group(node1.name, "tubedevice") > 0 then pos1.y = pos.y-1
inject_items(pos) pos1.z = pos.z
end local meta=minetest.env:get_meta(pos1)
if meta:get_int("tubelike")==1 then inject_items (pos) end
end, end,
}) })

View File

@ -0,0 +1,17 @@
minetest.register_node("technic:tetris_machine_node1", {
tiles = {"tetris_machine_top.png", "technic_mv_battery_box_bottom.png", "tetris_machine_front1.png",
"tetris_machine_side1B.png", "tetris_machine_side1P.png", "tetris_machine_side1L.png"},
tile_images = {"technic_tetris_machine.png",},
is_ground_content = true,
groups = {cracky=1},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("technic:tetris_machine_node2", {
tiles = {"tetris_machine_top.png", "technic_mv_battery_box_bottom.png", "tetris_machine_front2.png",
"tetris_machine_side2B.png", "tetris_machine_side2P.png", "tetris_machine_side2L.png"},
tile_images = {"technic_tetris_machine.png",},
is_ground_content = true,
groups = {cracky=1},
sounds = default.node_sound_stone_defaults(),
})

View File

@ -1,69 +0,0 @@
-- POWER MONITOR
-- The power monitor can be used to monitor how much power is available on a network,
-- similarly to the old "slave" switching stations.
local S = technic.getter
local cable_entry = "^technic_cable_connection_overlay.png"
minetest.register_craft({
output = "technic:power_monitor",
recipe = {
{"", "", ""},
{"", "technic:machine_casing", "default:copper_ingot"},
{"technic:lv_cable", "technic:lv_cable", "technic:lv_cable"}
}
})
minetest.register_node("technic:power_monitor",{
description = S("Power Monitor"),
tiles = {
"technic_power_monitor_sides.png",
"technic_power_monitor_sides.png"..cable_entry,
"technic_power_monitor_sides.png",
"technic_power_monitor_sides.png",
"technic_power_monitor_sides.png"..cable_entry,
"technic_power_monitor_front.png"
},
paramtype2 = "facedir",
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_all_tiers=1, technic_machine=1},
connect_sides = {"bottom", "back"},
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Power Monitor"))
end,
})
minetest.register_abm({
nodenames = {"technic:power_monitor"},
label = "Machines: run power monitor",
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos)
local network_hash = technic.cables[minetest.hash_node_position(pos)]
local network = network_hash and minetest.get_position_from_hash(network_hash)
local sw_pos = network and {x=network.x,y=network.y+1,z=network.z}
local timeout = 0
for tier in pairs(technic.machines) do
timeout = math.max(meta:get_int(tier.."_EU_timeout"),timeout)
end
if timeout > 0 and sw_pos and minetest.get_node(sw_pos).name == "technic:switching_station" then
local sw_meta = minetest.get_meta(sw_pos)
local supply = sw_meta:get_int("supply")
local demand = sw_meta:get_int("demand")
meta:set_string("infotext",
S("Power Monitor. Supply: @1 Demand: @2",
technic.EU_string(supply), technic.EU_string(demand)))
else
meta:set_string("infotext",S("Power Monitor Has No Network"))
end
end,
})
for tier in pairs(technic.machines) do
-- RE in order to use the "timeout" functions, although it consumes 0 power
technic.register_machine(tier, "technic:power_monitor", "RE")
end

View File

@ -1,10 +1,7 @@
local S = technic.getter local S = technic.getter
technic.register_recipe_type("alloy", { technic.register_recipe_type("alloy", S("Alloy cooking"), 2)
description = S("Alloying"),
input_size = 2,
})
function technic.register_alloy_recipe(data) function technic.register_alloy_recipe(data)
data.time = data.time or 6 data.time = data.time or 6
@ -13,23 +10,19 @@ end
local recipes = { local recipes = {
{"technic:copper_dust 3", "technic:tin_dust", "technic:bronze_dust 4"}, {"technic:copper_dust 3", "technic:tin_dust", "technic:bronze_dust 4"},
{"default:copper_ingot 3", "default:tin_ingot", "default:bronze_ingot 4"}, {"default:copper_ingot 3", "moreores:tin_ingot", "default:bronze_ingot 4"},
{"technic:wrought_iron_dust", "technic:coal_dust", "technic:carbon_steel_dust", 3}, {"technic:wrought_iron_dust", "technic:coal_dust", "technic:carbon_steel_dust"},
{"technic:wrought_iron_ingot", "technic:coal_dust", "technic:carbon_steel_ingot", 3}, {"technic:wrought_iron_ingot", "technic:coal_dust", "technic:carbon_steel_ingot"},
{"technic:carbon_steel_dust", "technic:coal_dust", "technic:cast_iron_dust", 3}, {"technic:carbon_steel_dust", "technic:coal_dust", "technic:cast_iron_dust"},
{"technic:carbon_steel_ingot", "technic:coal_dust", "technic:cast_iron_ingot", 3}, {"technic:carbon_steel_ingot", "technic:coal_dust", "technic:cast_iron_ingot"},
{"technic:carbon_steel_dust 3", "technic:chromium_dust", "technic:stainless_steel_dust 4"}, {"technic:carbon_steel_dust 3", "technic:chromium_dust", "technic:stainless_steel_dust 4"},
{"technic:carbon_steel_ingot 3", "technic:chromium_ingot", "technic:stainless_steel_ingot 4"}, {"technic:carbon_steel_ingot 3", "technic:chromium_ingot", "technic:stainless_steel_ingot 4"},
{"technic:copper_dust 2", "technic:zinc_dust", "technic:brass_dust 3"}, {"technic:copper_dust 2", "technic:zinc_dust", "technic:brass_dust 3"},
{"default:copper_ingot 2", "technic:zinc_ingot", "technic:brass_ingot 3"}, {"default:copper_ingot 2", "technic:zinc_ingot", "technic:brass_ingot 3"},
{"default:sand 2", "technic:coal_dust 2", "technic:silicon_wafer"}, {"default:sand 2", "technic:coal_dust 2", "technic:silicon_wafer"},
{"technic:silicon_wafer", "technic:gold_dust", "technic:doped_silicon_wafer"}, {"technic:silicon_wafer", "technic:gold_dust", "technic:doped_silicon_wafer"},
-- from https://en.wikipedia.org/wiki/Carbon_black
-- The highest volume use of carbon black is as a reinforcing filler in rubber products, especially tires.
-- "[Compounding a] pure gum vulcanizate … with 50% of its weight of carbon black improves its tensile strength and wear resistance …"
{"technic:raw_latex 4", "technic:coal_dust 2", "technic:rubber 6", 2},
} }
for _, data in pairs(recipes) do for _, data in pairs(recipes) do
technic.register_alloy_recipe({input = {data[1], data[2]}, output = data[3], time = data[4]}) technic.register_alloy_recipe({input = {data[1], data[2]}, output = data[3]})
end end

View File

@ -1,70 +1,17 @@
local digilines_path = minetest.get_modpath("digilines")
local S = technic.getter local S = technic.getter
local tube_entry = "^pipeworks_tube_connection_metallic.png"
local cable_entry = "^technic_cable_connection_overlay.png"
local fs_helpers = pipeworks.fs_helpers
technic.register_power_tool("technic:battery", 10000) technic.register_power_tool("technic:battery", 10000)
technic.register_power_tool("technic:red_energy_crystal", 50000) technic.register_power_tool("technic:red_energy_crystal", 50000)
technic.register_power_tool("technic:green_energy_crystal", 150000) technic.register_power_tool("technic:green_energy_crystal", 150000)
technic.register_power_tool("technic:blue_energy_crystal", 450000) technic.register_power_tool("technic:blue_energy_crystal", 450000)
-- Battery recipes:
-- Tin-copper recipe:
minetest.register_craft({ minetest.register_craft({
output = "technic:battery", output = 'technic:battery',
recipe = { recipe = {
{"group:wood", "default:copper_ingot", "group:wood"}, {'group:wood', 'default:copper_ingot', 'group:wood'},
{"group:wood", "default:tin_ingot", "group:wood"}, {'group:wood', 'moreores:tin_ingot', 'group:wood'},
{"group:wood", "default:copper_ingot", "group:wood"}, {'group:wood', 'default:copper_ingot', 'group:wood'},
}
})
-- Sulfur-lead-water recipes:
-- With sulfur lumps:
-- With water:
minetest.register_craft({
output = "technic:battery",
recipe = {
{"group:wood", "technic:sulfur_lump", "group:wood"},
{"technic:lead_ingot", "bucket:bucket_water", "technic:lead_ingot"},
{"group:wood", "technic:sulfur_lump", "group:wood"},
},
replacements = {
{"bucket:bucket_water", "bucket:bucket_empty"}
}
})
-- With oil extract:
minetest.register_craft({
output = "technic:battery",
recipe = {
{"group:wood", "technic:sulfur_lump", "group:wood"},
{"technic:lead_ingot", "homedecor:oil_extract", "technic:lead_ingot"},
{"group:wood", "technic:sulfur_lump", "group:wood"},
}
})
-- With sulfur dust:
-- With water:
minetest.register_craft({
output = "technic:battery",
recipe = {
{"group:wood", "technic:sulfur_dust", "group:wood"},
{"technic:lead_ingot", "bucket:bucket_water", "technic:lead_ingot"},
{"group:wood", "technic:sulfur_dust", "group:wood"},
},
replacements = {
{"bucket:bucket_water", "bucket:bucket_empty"}
}
})
-- With oil extract:
minetest.register_craft({
output = "technic:battery",
recipe = {
{"group:wood", "technic:sulfur_dust", "group:wood"},
{"technic:lead_ingot", "homedecor:oil_extract", "technic:lead_ingot"},
{"group:wood", "technic:sulfur_dust", "group:wood"},
} }
}) })
@ -82,127 +29,121 @@ minetest.register_tool("technic:battery", {
} }
}) })
-- x+2 + (z+2)*2
local dirtab = {
[4] = 2,
[5] = 3,
[7] = 1,
[8] = 0
}
local tube = { local tube = {
insert_object = function(pos, node, stack, direction) insert_object = function(pos, node, stack, direction)
print(minetest.pos_to_string(direction), dirtab[direction.x+2+(direction.z+2)*2], node.param2) if direction.y == 0 then
if direction.y == 1
or (direction.y == 0 and dirtab[direction.x+2+(direction.z+2)*2] == node.param2) then
return stack return stack
end end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if direction.y == 0 then if direction.y > 0 then
return inv:add_item("src", stack) return inv:add_item("src", stack)
else else
return inv:add_item("dst", stack) return inv:add_item("dst", stack)
end end
end, end,
can_insert = function(pos, node, stack, direction) can_insert = function(pos, node, stack, direction)
print(minetest.pos_to_string(direction), dirtab[direction.x+2+(direction.z+2)*2], node.param2) if direction.y == 0 then
if direction.y == 1
or (direction.y == 0 and dirtab[direction.x+2+(direction.z+2)*2] == node.param2) then
return false return false
end end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if direction.y == 0 then if direction.y > 0 then
if meta:get_int("split_src_stacks") == 1 then
stack = stack:peek_item(1)
end
return inv:room_for_item("src", stack) return inv:room_for_item("src", stack)
else else
if meta:get_int("split_dst_stacks") == 1 then
stack = stack:peek_item(1)
end
return inv:room_for_item("dst", stack) return inv:room_for_item("dst", stack)
end end
end, end,
connect_sides = {left=1, right=1, back=1, top=1}, connect_sides = {left=1, right=1, back=1, top=1, bottom=1},
} }
local function add_on_off_buttons(meta, ltier, charge_percent)
local formspec = ""
if ltier == "mv" or ltier == "hv" then
formspec = "image[1,1;1,2;technic_power_meter_bg.png"
.."^[lowpart:"..charge_percent
..":technic_power_meter_fg.png]"..
fs_helpers.cycling_button(
meta,
"image_button[3,2.0;1,0.6",
"split_src_stacks",
{
pipeworks.button_off,
pipeworks.button_on
}
).."label[3.9,2.01;Allow splitting incoming 'charge' stacks from tubes]"..
fs_helpers.cycling_button(
meta,
"image_button[3,2.5;1,0.6",
"split_dst_stacks",
{
pipeworks.button_off,
pipeworks.button_on
}
).."label[3.9,2.51;Allow splitting incoming 'discharge' stacks]"
end
return formspec
end
function technic.register_battery_box(data) function technic.register_battery_box(data)
local tier = data.tier local tier = data.tier
local ltier = string.lower(tier) local ltier = string.lower(tier)
local formspec = local formspec =
"size[8,9]".. "invsize[8,9;]"..
"image[1,1;1,2;technic_power_meter_bg.png]".. "image[1,1;1,2;technic_power_meter_bg.png]"..
"list[context;src;3,1;1,1;]".. "list[current_name;src;3,1;1,1;]"..
"image[4,1;1,1;technic_battery_reload.png]".. "image[4,1;1,1;technic_battery_reload.png]"..
"list[context;dst;5,1;1,1;]".. "list[current_name;dst;5,1;1,1;]"..
"label[0,0;"..S("%s Battery Box"):format(tier).."]".. "label[0,0;"..S("%s Battery Box"):format(tier).."]"..
"label[3,0;"..S("Charge").."]".. "label[3,0;"..S("Charge").."]"..
"label[5,0;"..S("Discharge").."]".. "label[5,0;"..S("Discharge").."]"..
"label[1,3;"..S("Power level").."]".. "label[1,3;"..S("Power level").."]"..
"list[current_player;main;0,5;8,4;]".. "list[current_player;main;0,5;8,4;]"
"listring[context;dst]"..
"listring[current_player;main]"..
"listring[context;src]"..
"listring[current_player;main]"
if digilines_path then
formspec = formspec.."button[0.6,3.7;2,1;edit_channel;edit Channel]"
end
if data.upgrade then if data.upgrade then
formspec = formspec.. formspec = formspec..
"list[context;upgrade1;3.5,3;1,1;]".. "list[current_name;upgrade1;3.5,3;1,1;]"..
"list[context;upgrade2;4.5,3;1,1;]".. "list[current_name;upgrade2;4.5,3;1,1;]"..
"label[3.5,4;"..S("Upgrade Slots").."]".. "label[3.5,4;"..S("Upgrade Slots").."]"
"listring[context;upgrade1]"..
"listring[current_player;main]"..
"listring[context;upgrade2]"..
"listring[current_player;main]"
end end
local run = function(pos, node) for i = 0, 8 do
local below = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}
if i ~= 0 then
groups.not_in_creative_inventory = 1
end
if data.tube then
groups.tubedevice = 1
groups.tubedevice_receiver = 1
end
minetest.register_node("technic:"..ltier.."_battery_box"..i, {
description = S("%s Battery Box"):format(tier),
tiles = {"technic_"..ltier.."_battery_box_top.png",
"technic_"..ltier.."_battery_box_bottom.png",
"technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
"technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
"technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
"technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png"},
groups = groups,
tube = data.tube and tube or nil,
paramtype2 = "facedir",
sounds = default.node_sound_wood_defaults(),
drop = "technic:"..ltier.."_battery_box0",
on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local node = minetest.get_node(pos)
if not technic.is_tier_cable(below.name, tier) then meta:set_string("infotext", S("%s Battery Box"):format(tier))
meta:set_string("infotext", S("%s Battery Box Has No Network"):format(tier)) meta:set_string("formspec", formspec)
return meta:set_int(tier.."_EU_demand", 0)
meta:set_int(tier.."_EU_supply", 0)
meta:set_int(tier.."_EU_input", 0)
meta:set_float("internal_EU_charge", 0)
inv:set_size("src", 1)
inv:set_size("dst", 1)
inv:set_size("upgrade1", 1)
inv:set_size("upgrade2", 1)
end,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
})
end end
minetest.register_abm({
nodenames = {"technic:"..ltier.."_battery_box0", "technic:"..ltier.."_battery_box1",
"technic:"..ltier.."_battery_box2", "technic:"..ltier.."_battery_box3",
"technic:"..ltier.."_battery_box4", "technic:"..ltier.."_battery_box5",
"technic:"..ltier.."_battery_box6", "technic:"..ltier.."_battery_box7",
"technic:"..ltier.."_battery_box8"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos)
local eu_input = meta:get_int(tier.."_EU_input") local eu_input = meta:get_int(tier.."_EU_input")
local current_charge = meta:get_int("internal_EU_charge") local current_charge = meta:get_int("internal_EU_charge")
-- Power off automatically if no longer connected to a switching station
technic.switching_station_timeout_count(pos, tier)
local EU_upgrade, tube_upgrade = 0, 0 local EU_upgrade, tube_upgrade = 0, 0
if data.upgrade then if data.upgrade then
EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta) EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
@ -241,6 +182,7 @@ function technic.register_battery_box(data)
math.min(data.charge_rate, max_charge - current_charge)) math.min(data.charge_rate, max_charge - current_charge))
meta:set_int(tier.."_EU_supply", meta:set_int(tier.."_EU_supply",
math.min(data.discharge_rate, current_charge)) math.min(data.discharge_rate, current_charge))
meta:set_int("internal_EU_charge", current_charge) meta:set_int("internal_EU_charge", current_charge)
-- Select node textures -- Select node textures
@ -254,137 +196,20 @@ function technic.register_battery_box(data)
end end
local charge_percent = math.floor(current_charge / max_charge * 100) local charge_percent = math.floor(current_charge / max_charge * 100)
meta:set_string("formspec", formspec..add_on_off_buttons(meta, ltier, charge_percent)) meta:set_string("formspec",
local infotext = S("@1 Battery Box: @2 / @3", tier, formspec..
technic.EU_string(current_charge), "image[1,1;1,2;technic_power_meter_bg.png"
technic.EU_string(max_charge)) .."^[lowpart:"..charge_percent
..":technic_power_meter_fg.png]")
local infotext = S("%s Battery Box: %d/%d"):format(tier,
current_charge, max_charge)
if eu_input == 0 then if eu_input == 0 then
infotext = S("%s Idle"):format(infotext) infotext = S("%s Idle"):format(infotext)
end end
meta:set_string("infotext", infotext) meta:set_string("infotext", infotext)
end end
for i = 0, 8 do
local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
technic_machine=1, ["technic_"..ltier]=1}
if i ~= 0 then
groups.not_in_creative_inventory = 1
end
if data.tube then
groups.tubedevice = 1
groups.tubedevice_receiver = 1
end
local top_tex = "technic_"..ltier.."_battery_box_top.png"..tube_entry
local front_tex = "technic_"..ltier.."_battery_box_front.png^technic_power_meter"..i..".png"
local side_tex = "technic_"..ltier.."_battery_box_side.png"..tube_entry
local bottom_tex = "technic_"..ltier.."_battery_box_bottom.png"..cable_entry
if ltier == "lv" then
top_tex = "technic_"..ltier.."_battery_box_top.png"
front_tex = "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png"
side_tex = "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png"
end
minetest.register_node("technic:"..ltier.."_battery_box"..i, {
description = S("%s Battery Box"):format(tier),
tiles = {
top_tex,
bottom_tex,
side_tex,
side_tex,
side_tex,
front_tex},
groups = groups,
connect_sides = {"bottom"},
tube = data.tube and tube or nil,
paramtype2 = "facedir",
sounds = default.node_sound_wood_defaults(),
drop = "technic:"..ltier.."_battery_box0",
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local EU_upgrade, tube_upgrade = 0, 0
if data.upgrade then
EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
end
local max_charge = data.max_charge * (1 + EU_upgrade / 10)
local charge = meta:get_int("internal_EU_charge")
local cpercent = math.floor(charge / max_charge * 100)
local inv = meta:get_inventory()
local node = minetest.get_node(pos)
meta:set_string("infotext", S("%s Battery Box"):format(tier))
meta:set_string("formspec", formspec..add_on_off_buttons(meta, ltier, cpercent))
meta:set_string("channel", ltier.."_battery_box"..minetest.pos_to_string(pos))
meta:set_int(tier.."_EU_demand", 0)
meta:set_int(tier.."_EU_supply", 0)
meta:set_int(tier.."_EU_input", 0)
meta:set_float("internal_EU_charge", 0)
inv:set_size("src", 1)
inv:set_size("dst", 1)
inv:set_size("upgrade1", 1)
inv:set_size("upgrade2", 1)
end,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
technic_run = run,
on_rotate = screwdriver.rotate_simple,
after_place_node = data.tube and pipeworks.after_place,
after_dig_node = technic.machine_after_dig_node,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
local nodename = minetest.get_node(pos).name
if fields.edit_channel then
minetest.show_formspec(sender:get_player_name(),
"technic:battery_box_edit_channel"..minetest.pos_to_string(pos),
"field[channel;Digiline Channel;"..meta:get_string("channel").."]")
elseif fields["fs_helpers_cycling:0:split_src_stacks"]
or fields["fs_helpers_cycling:0:split_dst_stacks"]
or fields["fs_helpers_cycling:1:split_src_stacks"]
or fields["fs_helpers_cycling:1:split_dst_stacks"] then
local meta = minetest.get_meta(pos)
if not pipeworks.may_configure(pos, sender) then return end
fs_helpers.on_receive_fields(pos, fields)
local EU_upgrade, tube_upgrade = 0, 0
if data.upgrade then
EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
end
local max_charge = data.max_charge * (1 + EU_upgrade / 10)
local charge = meta:get_int("internal_EU_charge")
local cpercent = math.floor(charge / max_charge * 100)
meta:set_string("formspec", formspec..add_on_off_buttons(meta, ltier, cpercent))
end
end,
digiline = {
receptor = {action = function() end},
effector = {
action = function(pos, node, channel, msg)
if msg ~= "GET" and msg ~= "get" then
return
end
local meta = minetest.get_meta(pos)
if channel ~= meta:get_string("channel") then
return
end
local inv = meta:get_inventory()
digilines.receptor_send(pos, digilines.rules.default, channel, {
demand = meta:get_int(tier.."_EU_demand"),
supply = meta:get_int(tier.."_EU_supply"),
input = meta:get_int(tier.."_EU_input"),
charge = meta:get_int("internal_EU_charge"),
max_charge = data.max_charge * (1 + technic.handle_machine_upgrades(meta) / 10),
src = inv:get_stack("src", 1):to_table(),
dst = inv:get_stack("dst", 1):to_table(),
upgrade1 = inv:get_stack("upgrade1", 1):to_table(),
upgrade2 = inv:get_stack("upgrade2", 1):to_table()
}) })
end
},
},
})
end
-- Register as a battery type -- Register as a battery type
-- Battery type machines function as power reservoirs and can both receive and give back power -- Battery type machines function as power reservoirs and can both receive and give back power
@ -394,41 +219,26 @@ function technic.register_battery_box(data)
end -- End registration end -- End registration
minetest.register_on_player_receive_fields(
function(player, formname, fields)
if formname:sub(1, 32) ~= "technic:battery_box_edit_channel" or
not fields.channel then
return
end
local pos = minetest.string_to_pos(formname:sub(33))
local plname = player:get_player_name()
if minetest.is_protected(pos, plname) then
minetest.record_protection_violation(pos, plname)
return
end
local meta = minetest.get_meta(pos)
meta:set_string("channel", fields.channel)
end
)
function technic.charge_tools(meta, batt_charge, charge_step) function technic.charge_tools(meta, batt_charge, charge_step)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if inv:is_empty("src") then if inv:is_empty("src") then
return batt_charge, false return batt_charge, false
end end
local src_stack = inv:get_stack("src", 1) local srcstack = inv:get_stack("src", 1)
local tool_name = src_stack:get_name() local toolname = srcstack:get_name()
if not technic.power_tools[tool_name] then if not technic.power_tools[toolname] then
return batt_charge, false return batt_charge, false
end end
-- Set meta data for the tool if it didn't do it itself -- Set meta data for the tool if it didn't do it itself
local src_meta = minetest.deserialize(src_stack:get_metadata()) or {} src_meta = minetest.deserialize(srcstack:get_metadata())
src_meta = src_meta or {}
if not src_meta.charge then if not src_meta.charge then
src_meta.charge = 0 src_meta.charge = 0
end end
-- Do the charging -- Do the charging
local item_max_charge = technic.power_tools[tool_name] local item_max_charge = technic.power_tools[toolname]
local tool_charge = src_meta.charge local tool_charge = src_meta.charge
if tool_charge >= item_max_charge then if tool_charge >= item_max_charge then
return batt_charge, true return batt_charge, true
@ -439,10 +249,10 @@ function technic.charge_tools(meta, batt_charge, charge_step)
charge_step = math.min(charge_step, item_max_charge - tool_charge) charge_step = math.min(charge_step, item_max_charge - tool_charge)
tool_charge = tool_charge + charge_step tool_charge = tool_charge + charge_step
batt_charge = batt_charge - charge_step batt_charge = batt_charge - charge_step
technic.set_RE_wear(src_stack, tool_charge, item_max_charge) technic.set_RE_wear(srcstack, tool_charge, item_max_charge)
src_meta.charge = tool_charge src_meta.charge = tool_charge
src_stack:set_metadata(minetest.serialize(src_meta)) srcstack:set_metadata(minetest.serialize(src_meta))
inv:set_stack("src", 1, src_stack) inv:set_stack("src", 1, srcstack)
return batt_charge, (tool_charge == item_max_charge) return batt_charge, (tool_charge == item_max_charge)
end end

View File

@ -1,286 +1,175 @@
local S = technic.getter local S = technic.getter
local cable_tier = {} technic.cables = {}
function technic.is_tier_cable(name, tier)
return cable_tier[name] == tier
end
function technic.get_cable_tier(name)
return cable_tier[name]
end
local function check_connections(pos)
-- Build a table of all machines
local machines = {}
for tier,list in pairs(technic.machines) do
for k,v in pairs(list) do
machines[k] = v
end
end
local connections = {}
local positions = {
{x=pos.x+1, y=pos.y, z=pos.z},
{x=pos.x-1, y=pos.y, z=pos.z},
{x=pos.x, y=pos.y+1, z=pos.z},
{x=pos.x, y=pos.y-1, z=pos.z},
{x=pos.x, y=pos.y, z=pos.z+1},
{x=pos.x, y=pos.y, z=pos.z-1}}
for _,connected_pos in pairs(positions) do
local name = minetest.get_node(connected_pos).name
if machines[name] or technic.get_cable_tier(name) then
table.insert(connections,connected_pos)
end
end
return connections
end
local function clear_networks(pos)
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos)
local placed = node.name ~= "air"
local positions = check_connections(pos)
if #positions < 1 then return end
local dead_end = #positions == 1
for _,connected_pos in pairs(positions) do
local net = technic.cables[minetest.hash_node_position(connected_pos)]
if net and technic.networks[net] then
if dead_end and placed then
-- Dead end placed, add it to the network
-- Get the network
local network_id = technic.cables[minetest.hash_node_position(positions[1])]
if not network_id then
-- We're evidently not on a network, nothing to add ourselves to
return
end
local sw_pos = minetest.get_position_from_hash(network_id)
sw_pos.y = sw_pos.y + 1
local network = technic.networks[network_id]
local tier = network.tier
-- Actually add it to the (cached) network
-- This is similar to check_node_subp
technic.cables[minetest.hash_node_position(pos)] = network_id
pos.visited = 1
if technic.is_tier_cable(name, tier) then
table.insert(network.all_nodes,pos)
elseif technic.machines[tier][node.name] then
meta:set_string(tier.."_network",minetest.pos_to_string(sw_pos))
if technic.machines[tier][node.name] == technic.producer then
table.insert(network.PR_nodes,pos)
elseif technic.machines[tier][node.name] == technic.receiver then
table.insert(network.RE_nodes,pos)
elseif technic.machines[tier][node.name] == technic.producer_receiver then
table.insert(network.PR_nodes,pos)
table.insert(network.RE_nodes,pos)
elseif technic.machines[tier][node.name] == "SPECIAL" and
(pos.x ~= sw_pos.x or pos.y ~= sw_pos.y or pos.z ~= sw_pos.z) and
from_below then
table.insert(network.SP_nodes,pos)
elseif technic.machines[tier][node.name] == technic.battery then
table.insert(network.BA_nodes,pos)
end
end
elseif dead_end and not placed then
-- Dead end removed, remove it from the network
-- Get the network
local network_id = technic.cables[minetest.hash_node_position(positions[1])]
if not network_id then
-- We're evidently not on a network, nothing to add ourselves to
return
end
local network = technic.networks[network_id]
-- Search for and remove machine
technic.cables[minetest.hash_node_position(pos)] = nil
for tblname,table in pairs(network) do
if tblname ~= "tier" then
for machinenum,machine in pairs(table) do
if machine.x == pos.x
and machine.y == pos.y
and machine.z == pos.z then
table[machinenum] = nil
end
end
end
end
else
-- Not a dead end, so the whole network needs to be recalculated
for _,v in pairs(technic.networks[net].all_nodes) do
local pos1 = minetest.hash_node_position(v)
technic.cables[pos1] = nil
end
technic.networks[net] = nil
end
end
end
end
function technic.register_cable(tier, size) function technic.register_cable(tier, size)
local ltier = string.lower(tier) local ltier = string.lower(tier)
cable_tier["technic:"..ltier.."_cable"] = tier
local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, for x1 = 0, 1 do
["technic_"..ltier.."_cable"] = 1} for x2 = 0, 1 do
for y1 = 0, 1 do
for y2 = 0, 1 do
for z1 = 0, 1 do
for z2 = 0, 1 do
local id = technic.get_cable_id({x1, x2, y1, y2, z1, z2})
local node_box = { technic.cables["technic:"..ltier.."_cable"..id] = tier
type = "connected",
fixed = {-size, -size, -size, size, size, size},
connect_top = {-size, -size, -size, size, 0.5, size}, -- y+
connect_bottom = {-size, -0.5, -size, size, size, size}, -- y-
connect_front = {-size, -size, -0.5, size, size, size}, -- z-
connect_back = {-size, -size, size, size, size, 0.5 }, -- z+
connect_left = {-0.5, -size, -size, size, size, size}, -- x-
connect_right = {-size, -size, -size, 0.5, size, size}, -- x+
}
minetest.register_node("technic:"..ltier.."_cable", { local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}
if id ~= 0 then
groups.not_in_creative_inventory = 1
end
minetest.register_node("technic:"..ltier.."_cable"..id, {
description = S("%s Cable"):format(tier), description = S("%s Cable"):format(tier),
tiles = {"technic_"..ltier.."_cable.png"}, tiles = {"technic_"..ltier.."_cable.png"},
inventory_image = "technic_"..ltier.."_cable_wield.png", inventory_image = "technic_"..ltier.."_cable_wield.png",
wield_image = "technic_"..ltier.."_cable_wield.png", wield_image = "technic_"..ltier.."_cable_wield.png",
groups = groups, groups = groups,
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
drop = "technic:"..ltier.."_cable", drop = "technic:"..ltier.."_cable0",
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
drawtype = "nodebox", drawtype = "nodebox",
node_box = node_box, node_box = {
connects_to = {"group:technic_"..ltier.."_cable", type = "fixed",
"group:technic_"..ltier, "group:technic_all_tiers"}, fixed = technic.gen_cable_nodebox(x1, y1, z1, x2, y2, z2, size)
on_construct = clear_networks, },
on_destruct = clear_networks, on_construct = function()
}) technic.networks = {}
end,
local xyz = { on_destruct = function()
["-x"] = 1, technic.networks = {}
["-y"] = 2, end,
["-z"] = 3, after_place_node = function(pos)
["x"] = 4, local node = minetest.get_node(pos)
["y"] = 5, technic.update_cables(pos, technic.get_cable_tier(node.name))
["z"] = 6, end,
} after_dig_node = function(pos, oldnode)
local notconnects = { local tier = technic.get_cable_tier(oldnode.name)
[1] = "left", technic.update_cables(pos, tier, true)
[2] = "bottom",
[3] = "front",
[4] = "right",
[5] = "top",
[6] = "back",
}
local function s(p)
if p:find("-") then
return p:sub(2)
else
return "-"..p
end end
end
for p, i in pairs(xyz) do
local def = {
description = S("%s Cable Plate"):format(tier),
tiles = {"technic_"..ltier.."_cable.png"},
groups = table.copy(groups),
sounds = default.node_sound_wood_defaults(),
drop = "technic:"..ltier.."_cable_plate_1",
paramtype = "light",
sunlight_propagates = true,
drawtype = "nodebox",
node_box = table.copy(node_box),
connects_to = {"group:technic_"..ltier.."_cable",
"group:technic_"..ltier, "group:technic_all_tiers"},
on_construct = clear_networks,
on_destruct = clear_networks,
}
def.node_box.fixed = {
{-size, -size, -size, size, size, size},
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
}
def.node_box.fixed[1][xyz[p]] = 7/16 * (i-3.5)/math.abs(i-3.5)
def.node_box.fixed[2][xyz[s(p)]] = 3/8 * (i-3.5)/math.abs(i-3.5)
def.node_box["connect_"..notconnects[i]] = nil
if i == 1 then
def.on_place = function(itemstack, placer, pointed_thing)
local pointed_thing_diff = vector.subtract(pointed_thing.above, pointed_thing.under)
local num
local changed
for k, v in pairs(pointed_thing_diff) do
if v ~= 0 then
changed = k
num = xyz[s(tostring(v):sub(-2, -2)..k)]
break
end
end
local crtl = placer:get_player_control()
if (crtl.aux1 or crtl.sneak) and not (crtl.aux1 and crtl.sneak) then
local fine_pointed = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
fine_pointed = vector.subtract(fine_pointed, pointed_thing.above)
fine_pointed[changed] = nil
local ps = {}
for p, _ in pairs(fine_pointed) do
ps[#ps+1] = p
end
local bigger = (math.abs(fine_pointed[ps[1]]) > math.abs(fine_pointed[ps[2]]) and ps[1]) or ps[2]
if math.abs(fine_pointed[bigger]) < 0.3 then
num = num + 3
num = (num <= 6 and num) or num - 6
else
num = xyz[((fine_pointed[bigger] < 0 and "-") or "") .. bigger]
end
end
minetest.set_node(pointed_thing.above, {name = "technic:"..ltier.."_cable_plate_"..num})
if not (creative and creative.is_enabled_for(placer)) then
itemstack:take_item()
end
return itemstack
end
else
def.groups.not_in_creative_inventory = 1
end
def.on_rotate = function(pos, node, user, mode, new_param2)
local dir = 0
if mode == screwdriver.ROTATE_FACE then -- left-click
dir = 1
elseif mode == screwdriver.ROTATE_AXIS then -- right-click
dir = -1
end
local num = tonumber(node.name:sub(-1))
num = num + dir
num = (num >= 1 and num) or num + 6
num = (num <= 6 and num) or num - 6
minetest.swap_node(pos, {name = "technic:"..ltier.."_cable_plate_"..num})
end
minetest.register_node("technic:"..ltier.."_cable_plate_"..i, def)
cable_tier["technic:"..ltier.."_cable_plate_"..i] = tier
end
local c = "technic:"..ltier.."_cable"
minetest.register_craft({
output = "technic:"..ltier.."_cable_plate_1 5",
recipe = {
{"", "", c},
{c , c , c},
{"", "", c},
}
})
minetest.register_craft({
output = c,
recipe = {
{"technic:"..ltier.."_cable_plate_1"},
}
}) })
end end
end
end
end
end
end
end
local function clear_nets_if_machine(pos, node) minetest.register_on_placenode(function(pos, node)
for tier, machine_list in pairs(technic.machines) do for tier, machine_list in pairs(technic.machines) do
if machine_list[node.name] ~= nil then if machine_list[node.name] ~= nil then
return clear_networks(pos) technic.update_cables(pos, tier, true)
technic.networks = {}
end end
end end
end)
minetest.register_on_dignode(function(pos, node)
for tier, machine_list in pairs(technic.machines) do
if machine_list[node.name] ~= nil then
technic.update_cables(pos, tier, true)
technic.networks = {}
end
end
end)
function technic.get_cable_id(links)
return (links[6] * 1) + (links[5] * 2)
+ (links[4] * 4) + (links[3] * 8)
+ (links[2] * 16) + (links[1] * 32)
end
function technic.update_cables(pos, tier, no_set, secondrun)
local link_positions = {
{x=pos.x+1, y=pos.y, z=pos.z},
{x=pos.x-1, y=pos.y, z=pos.z},
{x=pos.x, y=pos.y+1, z=pos.z},
{x=pos.x, y=pos.y-1, z=pos.z},
{x=pos.x, y=pos.y, z=pos.z+1},
{x=pos.x, y=pos.y, z=pos.z-1}}
local links = {0, 0, 0, 0, 0, 0}
for i, link_pos in pairs(link_positions) do
local connect_type = technic.cables_should_connect(pos, link_pos, tier)
if connect_type then
links[i] = 1
-- Have cables next to us update theirselves,
-- but only once. (We don't want to update the entire
-- network or start an infinite loop of updates)
if not secondrun and connect_type == "cable" then
technic.update_cables(link_pos, tier, false, true)
end
end
end
-- We don't want to set ourselves if we have been removed or we are
-- updating a machine
if not no_set then
minetest.set_node(pos, {name="technic:"..string.lower(tier)
.."_cable"..technic.get_cable_id(links)})
end
end end
minetest.register_on_placenode(clear_nets_if_machine)
minetest.register_on_dignode(clear_nets_if_machine) function technic.is_tier_cable(name, tier)
return technic.cables[name] and technic.cables[name] == tier
end
function technic.get_cable_tier(name)
return technic.cables[name]
end
function technic.cables_should_connect(pos1, pos2, tier)
local name = minetest.get_node(pos2).name
if technic.is_tier_cable(name, tier) then
return "cable"
elseif technic.machines[tier][name] then
return "machine"
end
return false
end
function technic.gen_cable_nodebox(x1, y1, z1, x2, y2, z2, size)
-- Nodeboxes
local box_center = {-size, -size, -size, size, size, size}
local box_y1 = {-size, -size, -size, size, 0.5, size} -- y+
local box_x1 = {-size, -size, -size, 0.5, size, size} -- x+
local box_z1 = {-size, -size, size, size, size, 0.5} -- z+
local box_z2 = {-size, -size, -0.5, size, size, size} -- z-
local box_y2 = {-size, -0.5, -size, size, size, size} -- y-
local box_x2 = {-0.5, -size, -size, size, size, size} -- x-
local box = {box_center}
if x1 == 1 then
table.insert(box, box_x1)
end
if y1 == 1 then
table.insert(box, box_y1)
end
if z1 == 1 then
table.insert(box, box_z1)
end
if x2 == 1 then
table.insert(box, box_x2)
end
if y2 == 1 then
table.insert(box, box_y2)
end
if z2 == 1 then
table.insert(box, box_z2)
end
return box
end

View File

@ -1,8 +0,0 @@
local S = technic.getter
function technic.register_centrifuge(data)
data.typename = "separating"
data.machine_name = "centrifuge"
data.machine_desc = S("%s Centrifuge")
technic.register_base_machine(data)
end

View File

@ -1,40 +0,0 @@
local S = technic.getter
technic.register_recipe_type("separating", {
description = S("Separating"),
output_size = 2,
})
function technic.register_separating_recipe(data)
data.time = data.time or 10
technic.register_recipe("separating", data)
end
local recipes = {
{ "technic:bronze_dust 4", "technic:copper_dust 3", "technic:tin_dust" },
{ "technic:stainless_steel_dust 4", "technic:wrought_iron_dust 3", "technic:chromium_dust" },
{ "technic:brass_dust 3", "technic:copper_dust 2", "technic:zinc_dust" },
{ "technic:chernobylite_dust", "default:sand", "technic:uranium3_dust" },
{ "default:dirt 4", "default:sand", "default:gravel", "default:clay_lump 2" },
}
local function uranium_dust(p)
return "technic:uranium"..(p == 7 and "" or p).."_dust"
end
for p = 1, 34 do
table.insert(recipes, { uranium_dust(p).." 2", uranium_dust(p-1), uranium_dust(p+1) })
end
if minetest.get_modpath("bushes_classic") then
for _, berry in ipairs({ "blackberry", "blueberry", "gooseberry", "raspberry", "strawberry" }) do
table.insert(recipes, { "bushes:"..berry.."_bush", "default:stick 20", "bushes:"..berry.." 4" })
end
end
if minetest.get_modpath("farming") then
table.insert(recipes, { "farming:wheat 4", "farming:seed_wheat 3", "default:dry_shrub 1" })
end
for _, data in pairs(recipes) do
technic.register_separating_recipe({ input = { data[1] }, output = { data[2], data[3], data[4] } })
end

View File

@ -1,64 +1,41 @@
local S = technic.getter local S = technic.getter
-- handles the machine upgrades every tick
function technic.handle_machine_upgrades(meta) function technic.handle_machine_upgrades(meta)
-- Get the names of the upgrades -- Get the names of the upgrades
local inv = meta:get_inventory() local inv = meta:get_inventory()
local upg_item1
local upg_item2
local srcstack = inv:get_stack("upgrade1", 1) local srcstack = inv:get_stack("upgrade1", 1)
local upg_item1 = srcstack and srcstack:get_name() if srcstack then
upg_item1 = srcstack:to_table()
end
srcstack = inv:get_stack("upgrade2", 1) srcstack = inv:get_stack("upgrade2", 1)
local upg_item2 = srcstack and srcstack:get_name() if srcstack then
upg_item2 = srcstack:to_table()
end
-- Save some power by installing battery upgrades. -- Save some power by installing battery upgrades.
-- Tube loading speed can be upgraded using control logic units. -- Tube loading speed can be upgraded using control logic units.
local EU_upgrade = 0 local EU_upgrade = 0
local tube_upgrade = 0 local tube_upgrade = 0
if upg_item1 then
if upg_item1 == "technic:control_logic_unit" then if upg_item1.name == "technic:battery" then
tube_upgrade = tube_upgrade + 1
elseif upg_item1 == "technic:battery" then
EU_upgrade = EU_upgrade + 1 EU_upgrade = EU_upgrade + 1
end elseif upg_item1.name == "technic:control_logic_unit" then
if upg_item2 == "technic:control_logic_unit" then
tube_upgrade = tube_upgrade + 1 tube_upgrade = tube_upgrade + 1
elseif upg_item2 == "technic:battery" then
EU_upgrade = EU_upgrade + 1
end end
end
if upg_item2 then
if upg_item2.name == "technic:battery" then
EU_upgrade = EU_upgrade + 1
elseif upg_item2.name == "technic:control_logic_unit" then
tube_upgrade = tube_upgrade + 1
end
end
return EU_upgrade, tube_upgrade return EU_upgrade, tube_upgrade
end end
-- handles the machine upgrades when set or removed
local function on_machine_upgrade(meta, stack)
local stack_name = stack:get_name()
if stack_name == "default:chest" then
meta:set_int("public", 1)
return 1
elseif stack_name ~= "technic:control_logic_unit"
and stack_name ~= "technic:battery" then
return 0
end
return 1
end
-- something is about to be removed
local function on_machine_downgrade(meta, stack, list)
if stack:get_name() == "default:chest" then
local inv = meta:get_inventory()
local upg1, upg2 = inv:get_stack("upgrade1", 1), inv:get_stack("upgrade2", 1)
-- only set 0 if theres not a nother chest in the other list too
if (not upg1 or not upg2 or upg1:get_name() ~= upg2:get_name()) then
meta:set_int("public", 0)
end
end
return 1
end
function technic.send_items(pos, x_velocity, z_velocity, output_name) function technic.send_items(pos, x_velocity, z_velocity, output_name)
-- Send items on their way in the pipe system. -- Send items on their way in the pipe system.
@ -75,7 +52,10 @@ function technic.send_items(pos, x_velocity, z_velocity, output_name)
local item0 = stack:to_table() local item0 = stack:to_table()
if item0 then if item0 then
item0["count"] = "1" item0["count"] = "1"
technic.tube_inject_item(pos, pos, vector.new(x_velocity, 0, z_velocity), item0) local item1 = pipeworks.tube_item({x=pos.x, y=pos.y, z=pos.z}, item0)
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})
stack:take_item(1) stack:take_item(1)
inv:set_stack(output_name, i, stack) inv:set_stack(output_name, i, stack)
return return
@ -91,15 +71,15 @@ function technic.smelt_item(meta, result, speed)
if meta:get_int("cook_time") < result.time / speed then if meta:get_int("cook_time") < result.time / speed then
return return
end end
local result local result = minetest.get_craft_result({method = "cooking", width = 1, items = inv:get_list("src")})
local afterfuel
result, afterfuel = minetest.get_craft_result({method = "cooking", width = 1, items = inv:get_list("src")})
if result and result.item then if result and result.item then
meta:set_int("cook_time", 0) meta:set_int("cook_time", 0)
-- check if there's room for output in "dst" list -- check if there's room for output in "dst" list
if inv:room_for_item("dst", result.item) then if inv:room_for_item("dst", result.item) then
inv:set_stack("src", 1, afterfuel.items[1]) srcstack = inv:get_stack("src", 1)
srcstack:take_item()
inv:set_stack("src", 1, srcstack)
inv:add_item("dst", result.item) inv:add_item("dst", result.item)
end end
end end
@ -124,11 +104,12 @@ function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function)
if node.param2 == 0 then pos1.x = pos1.x + 1 x_velocity = 1 end if node.param2 == 0 then pos1.x = pos1.x + 1 x_velocity = 1 end
local output_tube_connected = false local output_tube_connected = false
local node1 = minetest.get_node(pos1) local meta1 = minetest.get_meta(pos1)
if minetest.get_item_group(node1.name, "tubedevice") > 0 then if meta1:get_int("tubelike") == 1 then
output_tube_connected = true output_tube_connected = true
end end
local tube_time = meta:get_int("tube_time") + tube_upgrade tube_time = meta:get_int("tube_time")
tube_time = tube_time + tube_upgrade
if tube_time >= 2 then if tube_time >= 2 then
tube_time = 0 tube_time = 0
if output_tube_connected then if output_tube_connected then
@ -138,77 +119,39 @@ function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function)
meta:set_int("tube_time", tube_time) meta:set_int("tube_time", tube_time)
end end
function technic.machine_can_dig(pos, player) function technic.machine_can_dig(pos, player)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if not inv:is_empty("src") or not inv:is_empty("dst") then if not inv:is_empty("src") or not inv:is_empty("dst") or
if player then not inv:is_empty("upgrade1") or not inv:is_empty("upgrade2") then
minetest.chat_send_player(player:get_player_name(), minetest.chat_send_player(player:get_player_name(),
S("Machine cannot be removed because it is not empty")) S("Machine cannot be removed because it is not empty"))
end
return false return false
end else
return true return true
end end
function technic.machine_after_dig_node(pos, oldnode, oldmetadata, player)
if oldmetadata.inventory then
if oldmetadata.inventory.upgrade1 and oldmetadata.inventory.upgrade1[1] then
local stack = ItemStack(oldmetadata.inventory.upgrade1[1])
if not stack:is_empty() then
minetest.add_item(pos, stack)
end
end
if oldmetadata.inventory.upgrade2 and oldmetadata.inventory.upgrade2[1] then
local stack = ItemStack(oldmetadata.inventory.upgrade2[1])
if not stack:is_empty() then
minetest.add_item(pos, stack)
end
end
end end
if minetest.registered_nodes[oldnode.name].tube then local function inv_change(pos, player, count)
pipeworks.after_dig(pos, oldnode, oldmetadata, player) if minetest.is_protected(pos, player:get_player_name()) then
end minetest.chat_send_player(player:get_player_name(),
end S("Inventory move disallowed due to protection"))
local function inv_change(pos, player, count, from_list, to_list, stack)
local playername = player:get_player_name()
local meta = minetest.get_meta(pos);
local public = (meta:get_int("public") == 1)
local to_upgrade = to_list == "upgrade1" or to_list == "upgrade2"
local from_upgrade = from_list == "upgrade1" or from_list == "upgrade2"
if (not public or to_upgrade or from_upgrade) and minetest.is_protected(pos, playername) then
minetest.chat_send_player(playername, S("Inventory move disallowed due to protection"))
return 0 return 0
end end
if to_upgrade then
-- only place a single item into it, if it's empty
local empty = meta:get_inventory():is_empty(to_list)
if empty then
return on_machine_upgrade(meta, stack)
end
return 0
elseif from_upgrade then
-- only called on take (not move)
on_machine_downgrade(meta, stack, from_list)
end
return count return count
end end
function technic.machine_inventory_put(pos, listname, index, stack, player) function technic.machine_inventory_put(pos, listname, index, stack, player)
return inv_change(pos, player, stack:get_count(), nil, listname, stack) return inv_change(pos, player, stack:get_count())
end end
function technic.machine_inventory_take(pos, listname, index, stack, player) function technic.machine_inventory_take(pos, listname, index, stack, player)
return inv_change(pos, player, stack:get_count(), listname, nil, stack) return inv_change(pos, player, stack:get_count())
end end
function technic.machine_inventory_move(pos, from_list, from_index, function technic.machine_inventory_move(pos, from_list, from_index,
to_list, to_index, count, player) to_list, to_index, count, player)
local stack = minetest.get_meta(pos):get_inventory():get_stack(from_list, from_index) return inv_change(pos, player, count)
return inv_change(pos, player, count, from_list, to_list, stack)
end end

View File

@ -1,7 +1,7 @@
local S = technic.getter local S = technic.getter
technic.register_recipe_type("compressing", { description = S("Compressing") }) technic.register_recipe_type("compressing", S("Compressing"))
function technic.register_compressor_recipe(data) function technic.register_compressor_recipe(data)
data.time = data.time or 4 data.time = data.time or 4
@ -10,24 +10,14 @@ end
local recipes = { local recipes = {
{"default:snowblock", "default:ice"}, {"default:snowblock", "default:ice"},
{"default:sand 2", "default:sandstone"},
{"default:desert_sand", "default:desert_stone"}, {"default:desert_sand", "default:desert_stone"},
{"technic:mixed_metal_ingot", "technic:composite_plate"}, {"technic:mixed_metal_ingot", "technic:composite_plate"},
{"default:copper_ingot 5", "technic:copper_plate"}, {"default:copper_ingot 5", "technic:copper_plate"},
{"technic:coal_dust 4", "technic:graphite"}, {"technic:coal_dust 4", "technic:graphite"},
{"technic:carbon_cloth", "technic:carbon_plate"}, {"technic:carbon_cloth", "technic:carbon_plate"},
{"technic:uranium35_ingot 5", "technic:uranium_fuel"}, {"technic:enriched_uranium 4", "technic:uranium_fuel"},
} }
-- defuse the default sandstone recipe, since we have the compressor to take over in a more realistic manner
minetest.clear_craft({
output = "default:sandstone",
recipe = {
{'group:sand', 'group:sand'},
{'group:sand', 'group:sand'}
},
})
for _, data in pairs(recipes) do for _, data in pairs(recipes) do
technic.register_compressor_recipe({input = {data[1]}, output = data[2]}) technic.register_compressor_recipe({input = {data[1]}, output = data[2]})
end end

View File

@ -1,59 +1,35 @@
local S = technic.getter local S = technic.getter
technic.register_recipe_type("extracting", { description = S("Extracting") }) technic.register_recipe_type("extracting", S("Extracting"))
function technic.register_extractor_recipe(data) function technic.register_extractor_recipe(data)
data.time = data.time or 4 data.time = data.time or 4
technic.register_recipe("extracting", data) technic.register_recipe("extracting", data)
end end
if minetest.get_modpath("dye") then local recipes = {
-- check if we are using dye or unifieddyes -- Dyes
local unifieddyes = minetest.get_modpath("unifieddyes")
-- register recipes with the same crafting ratios as `dye` provides
local dye_recipes = {
{"technic:coal_dust", "dye:black 2"}, {"technic:coal_dust", "dye:black 2"},
{"default:grass_1", "dye:green 1"}, {"default:cactus", "dye:green 2"},
{"default:dry_shrub", "dye:brown 1"}, {"default:dry_shrub", "dye:brown 2"},
{"default:junglegrass", "dye:green 2"}, {"flowers:geranium", "dye:blue 2"},
{"default:cactus", "dye:green 4"}, {"flowers:dandelion_white", "dye:white 2"},
{"flowers:geranium", "dye:blue 4"}, {"flowers:dandelion_yellow", "dye:yellow 2"},
{"flowers:dandelion_white", "dye:white 4"}, {"flowers:tulip", "dye:orange 2"},
{"flowers:dandelion_yellow", "dye:yellow 4"}, {"flowers:rose", "dye:red 2"},
{"flowers:tulip", "dye:orange 4"}, {"flowers:viola", "dye:violet 2"},
{"flowers:rose", "dye:red 4"},
{"flowers:viola", "dye:violet 4"}, -- Rubber
{"bushes:blackberry", unifieddyes and "unifieddyes:magenta_s50 4" or "dye:violet 4"}, {"technic:raw_latex", "technic:rubber 3"},
{"bushes:blueberry", unifieddyes and "unifieddyes:magenta_s50 4" or "dye:magenta 4"}, {"moretrees:rubber_tree_trunk_empty", "technic:rubber"},
{"moretrees:rubber_tree_trunk", "technic:rubber"},
-- Other
{"technic:uranium 5", "technic:enriched_uranium"},
} }
for _, data in ipairs(dye_recipes) do for _, data in pairs(recipes) do
technic.register_extractor_recipe({input = {data[1]}, output = data[2]}) technic.register_extractor_recipe({input = {data[1]}, output = data[2]})
end end
-- overwrite the existing crafting recipes
local dyes = {"white", "red", "yellow", "blue", "violet", "orange"}
for _, color in ipairs(dyes) do
minetest.register_craft({
type = "shapeless",
output = "dye:"..color.." 1",
recipe = {"group:flower,color_"..color},
})
end
minetest.register_craft({
type = "shapeless",
output = "dye:black 1",
recipe = {"group:coal"},
})
if unifieddyes then
minetest.register_craft({
type = "shapeless",
output = "dye:green 1",
recipe = {"default:cactus"},
})
end
end

View File

@ -1,8 +1,5 @@
local S = technic.getter local S = technic.getter
local fs_helpers = pipeworks.fs_helpers
local tube_entry = "^pipeworks_tube_connection_metallic.png"
local tube = { local tube = {
insert_object = function(pos, node, stack, direction) insert_object = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -12,39 +9,79 @@ local tube = {
can_insert = function(pos, node, stack, direction) can_insert = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if meta:get_int("splitstacks") == 1 then
stack = stack:peek_item(1)
end
return inv:room_for_item("src", stack) return inv:room_for_item("src", stack)
end, end,
connect_sides = {left=1, right=1, back=1, top=1, bottom=1}, connect_sides = {left=1, right=1, back=1, top=1, bottom=1},
} }
function technic.register_generator(data) function technic.register_generator(data)
local tier = data.tier local tier = data.tier
local ltier = string.lower(tier) local ltier = string.lower(tier)
local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}
technic_machine=1, ["technic_"..ltier]=1} local active_groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}
if data.tube then if data.tube then
groups.tubedevice = 1 groups.tubedevice = 1
groups.tubedevice_receiver = 1 groups.tubedevice_receiver = 1
active_groups.tubedevice = 1
active_groups.tubedevice_receiver = 1
end end
local active_groups = {not_in_creative_inventory = 1}
for k, v in pairs(groups) do active_groups[k] = v end
local generator_formspec = local generator_formspec =
"size[8,9;]".. "invsize[8,9;]"..
"label[0,0;"..S("Fuel-Fired %s Generator"):format(tier).."]".. "label[0,0;"..S("Fuel-Fired %s Generator"):format(tier).."]"..
"list[current_name;src;3,1;1,1;]".. "list[current_name;src;3,1;1,1;]"..
"image[4,1;1,1;default_furnace_fire_bg.png]".. "image[4,1;1,1;default_furnace_fire_bg.png]"..
"list[current_player;main;0,5;8,4;]".. "list[current_player;main;0,5;8,4;]"
"listring[]"
local desc = S("Fuel-Fired %s Generator"):format(tier) local desc = S("Fuel-Fired %s Generator"):format(tier)
minetest.register_node("technic:"..ltier.."_generator", {
description = desc,
tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
"technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_side.png",
"technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_front.png"},
paramtype2 = "facedir",
groups = groups,
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
tube = data.tube and tube or nil,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", desc)
meta:set_int(data.tier.."_EU_supply", 0)
meta:set_int("burn_time", 0)
meta:set_int("tube_time", 0)
meta:set_string("formspec", generator_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
end,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
})
local run = function(pos, node) minetest.register_node("technic:"..ltier.."_generator_active", {
description = desc,
tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
"technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_side.png",
"technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_front_active.png"},
paramtype2 = "facedir",
groups = active_groups,
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
tube = data.tube and tube or nil,
drop = "technic:"..ltier.."_generator",
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
})
minetest.register_abm({
nodenames = {"technic:"..ltier.."_generator", "technic:"..ltier.."_generator_active"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local burn_time = meta:get_int("burn_time") local burn_time = meta:get_int("burn_time")
local burn_totaltime = meta:get_int("burn_totaltime") local burn_totaltime = meta:get_int("burn_totaltime")
@ -59,20 +96,19 @@ function technic.register_generator(data)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if not inv:is_empty("src") then if not inv:is_empty("src") then
local fuellist = inv:get_list("src") local fuellist = inv:get_list("src")
local fuel local fuel = minetest.get_craft_result(
local afterfuel
fuel, afterfuel = minetest.get_craft_result(
{method = "fuel", width = 1, {method = "fuel", width = 1,
items = fuellist}) items = fuellist})
if not fuel or fuel.time == 0 then if not fuel or fuel.time == 0 then
meta:set_string("infotext", S("%s Out Of Fuel"):format(desc)) meta:set_string("infotext", S("%s Out Of Fuel"):format(desc))
technic.swap_node(pos, "technic:"..ltier.."_generator") technic.swap_node(pos, "technic:"..ltier.."_generator")
meta:set_int(tier.."_EU_supply", 0)
return return
end end
meta:set_int("burn_time", fuel.time) meta:set_int("burn_time", fuel.time)
meta:set_int("burn_totaltime", fuel.time) meta:set_int("burn_totaltime", fuel.time)
inv:set_stack("src", 1, afterfuel.items[1]) local stack = inv:get_stack("src", 1)
stack:take_item()
inv:set_stack("src", 1, stack)
technic.swap_node(pos, "technic:"..ltier.."_generator_active") technic.swap_node(pos, "technic:"..ltier.."_generator_active")
meta:set_int(tier.."_EU_supply", data.supply) meta:set_int(tier.."_EU_supply", data.supply)
else else
@ -83,210 +119,15 @@ function technic.register_generator(data)
if burn_totaltime == 0 then burn_totaltime = 1 end if burn_totaltime == 0 then burn_totaltime = 1 end
local percent = math.floor((burn_time / burn_totaltime) * 100) local percent = math.floor((burn_time / burn_totaltime) * 100)
meta:set_string("infotext", desc.." ("..percent.."%)") meta:set_string("infotext", desc.." ("..percent.."%)")
local form_buttons = ""
if ltier ~= "lv" then
form_buttons = fs_helpers.cycling_button(
meta,
pipeworks.button_base,
"splitstacks",
{
pipeworks.button_off,
pipeworks.button_on
}
)..pipeworks.button_label
end
meta:set_string("formspec", meta:set_string("formspec",
"size[8, 9]".. "size[8, 9]"..
"label[0, 0;"..minetest.formspec_escape(desc).."]".. "label[0, 0;"..minetest.formspec_escape(desc).."]"..
"list[current_name;src;3, 1;1, 1;]".. "list[current_name;src;3, 1;1, 1;]"..
"image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:".. "image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:"..
(percent)..":default_furnace_fire_fg.png]".. (percent)..":default_furnace_fire_fg.png]"..
"list[current_player;main;0, 5;8, 4;]".. "list[current_player;main;0, 5;8, 4;]")
"listring[]"..
form_buttons
)
end end
local tentry = tube_entry
if ltier == "lv" then tentry = "" end
minetest.register_node("technic:"..ltier.."_generator", {
description = desc,
tiles = {
"technic_"..ltier.."_generator_top.png"..tentry,
"technic_machine_bottom.png"..tentry,
"technic_"..ltier.."_generator_side.png"..tentry,
"technic_"..ltier.."_generator_side.png"..tentry,
"technic_"..ltier.."_generator_side.png"..tentry,
"technic_"..ltier.."_generator_front.png"
},
paramtype2 = "facedir",
groups = groups,
connect_sides = {"bottom", "back", "left", "right"},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
tube = data.tube and tube or nil,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
meta:set_string("infotext", desc)
meta:set_int(data.tier.."_EU_supply", 0)
meta:set_int("burn_time", 0)
meta:set_int("tube_time", 0)
local form_buttons = ""
if not string.find(node.name, ":lv_") then
form_buttons = fs_helpers.cycling_button(
meta,
pipeworks.button_base,
"splitstacks",
{
pipeworks.button_off,
pipeworks.button_on
}
)..pipeworks.button_label
end
meta:set_string("formspec", generator_formspec..form_buttons)
local inv = meta:get_inventory()
inv:set_size("src", 1)
end,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
technic_run = run,
after_place_node = data.tube and pipeworks.after_place,
after_dig_node = technic.machine_after_dig_node,
on_receive_fields = function(pos, formname, fields, sender)
if not pipeworks.may_configure(pos, sender) then return end
fs_helpers.on_receive_fields(pos, fields)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
local form = generator_formspec
local form_buttons = ""
if not string.find(node.name, ":lv_") then
form_buttons = fs_helpers.cycling_button(
meta,
pipeworks.button_base,
"splitstacks",
{
pipeworks.button_off,
pipeworks.button_on
}
)..pipeworks.button_label
end
meta:set_string("formspec", generator_formspec..form_buttons)
end,
}) })
minetest.register_node("technic:"..ltier.."_generator_active", {
description = desc,
tiles = {
"technic_"..ltier.."_generator_top.png"..tube_entry,
"technic_machine_bottom.png"..tube_entry,
"technic_"..ltier.."_generator_side.png"..tube_entry,
"technic_"..ltier.."_generator_side.png"..tube_entry,
"technic_"..ltier.."_generator_side.png"..tube_entry,
"technic_"..ltier.."_generator_front_active.png"
},
paramtype2 = "facedir",
groups = active_groups,
connect_sides = {"bottom"},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
tube = data.tube and tube or nil,
drop = "technic:"..ltier.."_generator",
can_dig = technic.machine_can_dig,
after_dig_node = technic.machine_after_dig_node,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
technic_run = run,
technic_on_disable = function(pos, node)
local timer = minetest.get_node_timer(pos)
timer:start(1)
end,
on_timer = function(pos, node)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
-- Connected back?
if meta:get_int(tier.."_EU_timeout") > 0 then return false end
local burn_time = meta:get_int("burn_time") or 0
if burn_time <= 0 then
meta:set_int(tier.."_EU_supply", 0)
meta:set_int("burn_time", 0)
technic.swap_node(pos, "technic:"..ltier.."_generator")
return false
end
local burn_totaltime = meta:get_int("burn_totaltime") or 0
if burn_totaltime == 0 then burn_totaltime = 1 end
burn_time = burn_time - 1
meta:set_int("burn_time", burn_time)
local percent = math.floor(burn_time / burn_totaltime * 100)
local form_buttons = ""
if not string.find(node.name, ":lv_") then
form_buttons = fs_helpers.cycling_button(
meta,
pipeworks.button_base,
"splitstacks",
{
pipeworks.button_off,
pipeworks.button_on
}
)..pipeworks.button_label
end
meta:set_string("formspec",
"size[8, 9]"..
"label[0, 0;"..minetest.formspec_escape(desc).."]"..
"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;]"..
"listring[]"..
form_buttons
)
return true
end,
on_receive_fields = function(pos, formname, fields, sender)
if not pipeworks.may_configure(pos, sender) then return end
fs_helpers.on_receive_fields(pos, fields)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
local form_buttons = ""
if not string.find(node.name, ":lv_") then
form_buttons = fs_helpers.cycling_button(
meta,
pipeworks.button_base,
"splitstacks",
{
pipeworks.button_off,
pipeworks.button_on
}
)..pipeworks.button_label
end
local burn_totaltime = meta:get_int("burn_totaltime") or 0
local burn_time = meta:get_int("burn_time")
local percent = math.floor(burn_time / burn_totaltime * 100)
meta:set_string("formspec",
"size[8, 9]"..
"label[0, 0;"..minetest.formspec_escape(desc).."]"..
"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;]"..
"listring[]"..
form_buttons
)
end,
})
technic.register_machine(tier, "technic:"..ltier.."_generator", technic.producer) technic.register_machine(tier, "technic:"..ltier.."_generator", technic.producer)
technic.register_machine(tier, "technic:"..ltier.."_generator_active", technic.producer) technic.register_machine(tier, "technic:"..ltier.."_generator_active", technic.producer)
end end

View File

@ -1,7 +1,7 @@
local S = technic.getter local S = technic.getter
technic.register_recipe_type("grinding", { description = S("Grinding") }) technic.register_recipe_type("grinding", S("Grinding"))
function technic.register_grinder_recipe(data) function technic.register_grinder_recipe(data)
data.time = data.time or 3 data.time = data.time or 3
@ -15,37 +15,18 @@ local recipes = {
{"default:desert_stone", "default:desert_sand"}, {"default:desert_stone", "default:desert_sand"},
{"default:gold_lump", "technic:gold_dust 2"}, {"default:gold_lump", "technic:gold_dust 2"},
{"default:iron_lump", "technic:wrought_iron_dust 2"}, {"default:iron_lump", "technic:wrought_iron_dust 2"},
{"default:tin_lump", "technic:tin_dust 2"}, {"moreores:mithril_lump", "technic:mithril_dust 2"},
{"moreores:silver_lump", "technic:silver_dust 2"},
{"moreores:tin_lump", "technic:tin_dust 2"},
{"technic:chromium_lump", "technic:chromium_dust 2"}, {"technic:chromium_lump", "technic:chromium_dust 2"},
{"technic:uranium_lump", "technic:uranium_dust 2"},
{"technic:zinc_lump", "technic:zinc_dust 2"}, {"technic:zinc_lump", "technic:zinc_dust 2"},
{"technic:lead_lump", "technic:lead_dust 2"},
{"technic:sulfur_lump", "technic:sulfur_dust 2"},
{"default:stone", "technic:stone_dust"},
{"default:sand", "technic:stone_dust"},
-- Other -- Other
{"default:cobble", "default:gravel"}, {"default:cobble", "default:gravel"},
{"default:gravel", "default:sand"}, {"default:gravel", "default:dirt"},
{"default:sandstone", "default:sand 2"}, -- reverse recipe can be found in the compressor {"default:stone", "default:sand"},
} }
-- defuse the sandstone -> 4 sand recipe to avoid infinite sand bugs (also consult the inverse compressor recipe)
minetest.clear_craft({
recipe = {
{'default:sandstone'}
},
})
if minetest.get_modpath("farming") then
table.insert(recipes, {"farming:seed_wheat", "farming:flour 1"})
end
if minetest.get_modpath("moreores") then
table.insert(recipes, {"moreores:mithril_lump", "technic:mithril_dust 2"})
table.insert(recipes, {"moreores:silver_lump", "technic:silver_dust 2"})
end
if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then
table.insert(recipes, {"gloopores:alatro_lump", "technic:alatro_dust 2"}) table.insert(recipes, {"gloopores:alatro_lump", "technic:alatro_dust 2"})
table.insert(recipes, {"gloopores:kalite_lump", "technic:kalite_dust 2"}) table.insert(recipes, {"gloopores:kalite_lump", "technic:kalite_dust 2"})
@ -62,13 +43,13 @@ for _, data in pairs(recipes) do
technic.register_grinder_recipe({input = {data[1]}, output = data[2]}) technic.register_grinder_recipe({input = {data[1]}, output = data[2]})
end end
-- dusts
local function register_dust(name, ingot) local function register_dust(name, ingot)
local lname = string.lower(name) local lname = string.lower(name)
lname = string.gsub(lname, ' ', '_') lname = string.gsub(lname, ' ', '_')
minetest.register_craftitem("technic:"..lname.."_dust", { minetest.register_craftitem("technic:"..lname.."_dust", {
description = S("%s Dust"):format(S(name)), description = S("%s Dust"):format(S(name)),
inventory_image = "technic_"..lname.."_dust.png", inventory_image = "technic_"..lname.."_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
}) })
if ingot then if ingot then
minetest.register_craft({ minetest.register_craft({
@ -85,18 +66,14 @@ register_dust("Brass", "technic:brass_ingot")
register_dust("Bronze", "default:bronze_ingot") register_dust("Bronze", "default:bronze_ingot")
register_dust("Carbon Steel", "technic:carbon_steel_ingot") register_dust("Carbon Steel", "technic:carbon_steel_ingot")
register_dust("Cast Iron", "technic:cast_iron_ingot") register_dust("Cast Iron", "technic:cast_iron_ingot")
register_dust("Chernobylite", "technic:chernobylite_block")
register_dust("Chromium", "technic:chromium_ingot") register_dust("Chromium", "technic:chromium_ingot")
register_dust("Coal", nil) register_dust("Coal", nil)
register_dust("Copper", "default:copper_ingot") register_dust("Copper", "default:copper_ingot")
register_dust("Lead", "technic:lead_ingot")
register_dust("Gold", "default:gold_ingot") register_dust("Gold", "default:gold_ingot")
register_dust("Mithril", "moreores:mithril_ingot") register_dust("Mithril", "moreores:mithril_ingot")
register_dust("Silver", "moreores:silver_ingot") register_dust("Silver", "moreores:silver_ingot")
register_dust("Stainless Steel", "technic:stainless_steel_ingot") register_dust("Stainless Steel", "technic:stainless_steel_ingot")
register_dust("Stone", "default:stone") register_dust("Tin", "moreores:tin_ingot")
register_dust("Sulfur", nil)
register_dust("Tin", "default:tin_ingot")
register_dust("Wrought Iron", "technic:wrought_iron_ingot") register_dust("Wrought Iron", "technic:wrought_iron_ingot")
register_dust("Zinc", "technic:zinc_ingot") register_dust("Zinc", "technic:zinc_ingot")
if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then
@ -107,51 +84,9 @@ if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then
register_dust("Talinite", "glooptest:talinite_ingot") register_dust("Talinite", "glooptest:talinite_ingot")
end end
for p = 0, 35 do
local nici = (p ~= 0 and p ~= 7 and p ~= 35) and 1 or nil
local psuffix = p == 7 and "" or p
local ingot = "technic:uranium"..psuffix.."_ingot"
local dust = "technic:uranium"..psuffix.."_dust"
minetest.register_craftitem(dust, {
description = S("%s Dust"):format(string.format(S("%.1f%%-Fissile Uranium"), p/10)),
inventory_image = "technic_uranium_dust.png",
on_place_on_ground = minetest.craftitem_place_item,
groups = {uranium_dust=1, not_in_creative_inventory=nici},
})
minetest.register_craft({
type = "cooking",
recipe = dust,
output = ingot,
})
technic.register_grinder_recipe({ input = {ingot}, output = dust })
end
local function uranium_dust(p)
return "technic:uranium"..(p == 7 and "" or p).."_dust"
end
for pa = 0, 34 do
for pb = pa+1, 35 do
local pc = (pa+pb)/2
if pc == math.floor(pc) then
minetest.register_craft({
type = "shapeless",
recipe = { uranium_dust(pa), uranium_dust(pb) },
output = uranium_dust(pc).." 2",
})
end
end
end
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "technic:coal_dust", recipe = "technic:coal_dust",
burntime = 50, burntime = 50,
}) })
if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then
minetest.register_craft({
type = "fuel",
recipe = "technic:kalite_dust",
burntime = 37.5,
})
end

View File

@ -1,62 +0,0 @@
local S = technic.getter
local moretrees = minetest.get_modpath("moretrees")
local mesecons_materials = minetest.get_modpath("mesecons_materials")
local dye = minetest.get_modpath("dye")
-- sawdust, the finest wood/tree grinding
local sawdust = "technic:sawdust"
minetest.register_craftitem(sawdust, {
description = S("Sawdust"),
inventory_image = "technic_sawdust.png",
})
minetest.register_craft({ type = "fuel", recipe = sawdust, burntime = 6 })
technic.register_compressor_recipe({ input = {sawdust .. " 4"}, output = "default:wood" })
-- tree/wood grindings
local function register_tree_grinding(name, tree, wood, extract, grinding_color)
local lname = string.lower(name)
lname = string.gsub(lname, ' ', '_')
local grindings_name = "technic:"..lname.."_grindings"
local inventory_image = "technic_"..lname.."_grindings.png"
if grinding_color then
inventory_image = inventory_image .. "^[colorize:" .. grinding_color
end
minetest.register_craftitem(grindings_name, {
description = S("%s Grinding"):format(S(name)),
inventory_image = inventory_image,
})
minetest.register_craft({
type = "fuel",
recipe = grindings_name,
burntime = 8,
})
technic.register_grinder_recipe({ input = { tree }, output = grindings_name .. " 4" })
technic.register_grinder_recipe({ input = { grindings_name }, output = sawdust .. " 4" })
if wood then
technic.register_grinder_recipe({ input = { wood }, output = grindings_name })
end
if extract then
technic.register_extractor_recipe({ input = { grindings_name .. " 4" }, output = extract})
technic.register_separating_recipe({
input = { grindings_name .. " 4" },
output = { sawdust .. " 4", extract }
})
end
end
local rubber_tree_planks = moretrees and "moretrees:rubber_tree_planks"
local default_extract = dye and "dye:brown 2"
local grinding_recipes = {
{"Common Tree", "group:tree", "group:wood", default_extract },
{"Rubber Tree", "moretrees:rubber_tree_trunk", rubber_tree_planks, "technic:raw_latex"}
}
for _, data in pairs(grinding_recipes) do
register_tree_grinding(unpack(data))
end
if moretrees and dye then
-- https://en.wikipedia.org/wiki/Catechu ancient brown dye from the wood of acacia trees
register_tree_grinding("Acacia", "moretrees:acacia_trunk", "moretrees:acacia_planks", "dye:brown 8")
end

View File

@ -19,10 +19,6 @@ dofile(path.."/alloy_recipes.lua")
dofile(path.."/grinder_recipes.lua") dofile(path.."/grinder_recipes.lua")
dofile(path.."/extractor_recipes.lua") dofile(path.."/extractor_recipes.lua")
dofile(path.."/compressor_recipes.lua") dofile(path.."/compressor_recipes.lua")
dofile(path.."/centrifuge_recipes.lua")
-- Multi-Machine Recipes
dofile(path.."/grindings.lua")
-- Machines -- Machines
dofile(path.."/alloy_furnace.lua") dofile(path.."/alloy_furnace.lua")
@ -30,4 +26,4 @@ dofile(path.."/electric_furnace.lua")
dofile(path.."/grinder.lua") dofile(path.."/grinder.lua")
dofile(path.."/extractor.lua") dofile(path.."/extractor.lua")
dofile(path.."/compressor.lua") dofile(path.."/compressor.lua")
dofile(path.."/centrifuge.lua")

View File

@ -1,9 +1,6 @@
local S = technic.getter local S = technic.getter
local fs_helpers = pipeworks.fs_helpers
local tube_entry = "^pipeworks_tube_connection_metallic.png"
local tube = { local tube = {
insert_object = function(pos, node, stack, direction) insert_object = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -13,58 +10,99 @@ local tube = {
can_insert = function(pos, node, stack, direction) can_insert = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if meta:get_int("splitstacks") == 1 then
stack = stack:peek_item(1)
end
return inv:room_for_item("src", stack) return inv:room_for_item("src", stack)
end, end,
connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1}, connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1},
} }
local connect_default = {"bottom", "back", "left", "right"}
local function round(v)
return math.floor(v + 0.5)
end
function technic.register_base_machine(data) function technic.register_base_machine(data)
local typename = data.typename local typename = data.typename
local input_size = technic.recipes[typename].input_size local numitems = technic.recipes[typename].numitems
local machine_name = data.machine_name local machine_name = data.machine_name
local machine_desc = data.machine_desc local machine_desc = data.machine_desc
local tier = data.tier local tier = data.tier
local ltier = string.lower(tier) local ltier = string.lower(tier)
local groups = {cracky = 2, technic_machine = 1, ["technic_"..ltier] = 1} local groups = {cracky = 2}
local active_groups = {cracky = 2, not_in_creative_inventory = 1}
if data.tube then if data.tube then
groups.tubedevice = 1 groups.tubedevice = 1
groups.tubedevice_receiver = 1 groups.tubedevice_receiver = 1
active_groups.tubedevice = 1
active_groups.tubedevice_receiver = 1
end end
local active_groups = {not_in_creative_inventory = 1}
for k, v in pairs(groups) do active_groups[k] = v end
local formspec = local formspec =
"size[8,9;]".. "invsize[8,9;]"..
"list[current_name;src;"..(4-input_size)..",1;"..input_size..",1;]".. "list[current_name;src;"..(4-numitems)..",1;"..numitems..",1;]"..
"list[current_name;dst;5,1;2,2;]".. "list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]".. "list[current_player;main;0,5;8,4;]"..
"label[0,0;"..machine_desc:format(tier).."]".. "label[0,0;"..machine_desc:format(tier).."]"
"listring[current_name;dst]"..
"listring[current_player;main]"..
"listring[current_name;src]"..
"listring[current_player;main]"
if data.upgrade then if data.upgrade then
formspec = formspec.. formspec = formspec..
"list[current_name;upgrade1;1,3;1,1;]".. "list[current_name;upgrade1;1,3;1,1;]"..
"list[current_name;upgrade2;2,3;1,1;]".. "list[current_name;upgrade2;2,3;1,1;]"..
"label[1,4;"..S("Upgrade Slots").."]".. "label[1,4;"..S("Upgrade Slots").."]"
"listring[current_name;upgrade1]"..
"listring[current_player;main]"..
"listring[current_name;upgrade2]"..
"listring[current_player;main]"
end end
local run = function(pos, node) minetest.register_node("technic:"..ltier.."_"..machine_name, {
description = machine_desc:format(tier),
tiles = {"technic_"..ltier.."_"..machine_name.."_top.png",
"technic_"..ltier.."_"..machine_name.."_bottom.png",
"technic_"..ltier.."_"..machine_name.."_side.png",
"technic_"..ltier.."_"..machine_name.."_side.png",
"technic_"..ltier.."_"..machine_name.."_side.png",
"technic_"..ltier.."_"..machine_name.."_front.png"},
paramtype2 = "facedir",
groups = groups,
tube = data.tube and tube or nil,
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", machine_desc:format(tier))
meta:set_int("tube_time", 0)
meta:set_string("formspec", formspec)
local inv = meta:get_inventory()
inv:set_size("src", numitems)
inv:set_size("dst", 4)
inv:set_size("upgrade1", 1)
inv:set_size("upgrade2", 1)
end,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
})
minetest.register_node("technic:"..ltier.."_"..machine_name.."_active",{
description = machine_desc:format(tier),
tiles = {"technic_"..ltier.."_"..machine_name.."_top.png",
"technic_"..ltier.."_"..machine_name.."_bottom.png",
"technic_"..ltier.."_"..machine_name.."_side.png",
"technic_"..ltier.."_"..machine_name.."_side.png",
"technic_"..ltier.."_"..machine_name.."_side.png",
"technic_"..ltier.."_"..machine_name.."_front_active.png"},
paramtype2 = "facedir",
drop = "technic:"..ltier.."_"..machine_name,
groups = active_groups,
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
tube = data.tube and tube or nil,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
})
minetest.register_abm({
nodenames = {"technic:"..ltier.."_"..machine_name,
"technic:"..ltier.."_"..machine_name.."_active"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local eu_input = meta:get_int(tier.."_EU_input") local eu_input = meta:get_int(tier.."_EU_input")
@ -80,6 +118,9 @@ function technic.register_base_machine(data)
return return
end end
-- Power off automatically if no longer connected to a switching station
technic.switching_station_timeout_count(pos, tier)
local EU_upgrade, tube_upgrade = 0, 0 local EU_upgrade, tube_upgrade = 0, 0
if data.upgrade then if data.upgrade then
EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta) EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
@ -88,174 +129,36 @@ function technic.register_base_machine(data)
technic.handle_machine_pipeworks(pos, tube_upgrade) technic.handle_machine_pipeworks(pos, tube_upgrade)
end end
local powered = eu_input >= machine_demand[EU_upgrade+1]
if powered then
meta:set_int("src_time", meta:get_int("src_time") + round(data.speed*10))
end
while true do
local result = technic.get_recipe(typename, inv:get_list("src")) local result = technic.get_recipe(typename, inv:get_list("src"))
if not result then if not result then
technic.swap_node(pos, machine_node) technic.swap_node(pos, machine_node)
meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier)) meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
meta:set_int(tier.."_EU_demand", 0) meta:set_int(tier.."_EU_demand", 0)
meta:set_int("src_time", 0)
return return
end end
meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
technic.swap_node(pos, machine_node.."_active") if eu_input < machine_demand[EU_upgrade+1] then
meta:set_string("infotext", S("%s Active"):format(machine_desc_tier)) -- Unpowered - go idle
if meta:get_int("src_time") < round(result.time*10) then
if not powered then
technic.swap_node(pos, machine_node) technic.swap_node(pos, machine_node)
meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier)) meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier))
end elseif eu_input >= machine_demand[EU_upgrade+1] then
return -- Powered
end technic.swap_node(pos, machine_node.."_active")
local output = result.output meta:set_string("infotext", S("%s Active"):format(machine_desc_tier))
if type(output) ~= "table" then output = { output } end
local output_stacks = {} meta:set_int("src_time", meta:get_int("src_time") + 1)
for _, o in ipairs(output) do if meta:get_int("src_time") >= result.time / data.speed then
table.insert(output_stacks, ItemStack(o)) meta:set_int("src_time", 0)
end local result_stack = ItemStack(result.output)
local room_for_output = true if inv:room_for_item("dst", result_stack) then
inv:set_size("dst_tmp", inv:get_size("dst"))
inv:set_list("dst_tmp", inv:get_list("dst"))
for _, o in ipairs(output_stacks) do
if not inv:room_for_item("dst_tmp", o) then
room_for_output = false
break
end
inv:add_item("dst_tmp", o)
end
if not room_for_output then
technic.swap_node(pos, machine_node)
meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
meta:set_int(tier.."_EU_demand", 0)
meta:set_int("src_time", round(result.time*10))
return
end
meta:set_int("src_time", meta:get_int("src_time") - round(result.time*10))
inv:set_list("src", result.new_input) inv:set_list("src", result.new_input)
inv:set_list("dst", inv:get_list("dst_tmp")) inv:add_item("dst", result_stack)
end end
end end
local tentry = tube_entry
if ltier == "lv" then
tentry = ""
end end
minetest.register_node("technic:"..ltier.."_"..machine_name, { meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
description = machine_desc:format(tier),
tiles = {
"technic_"..ltier.."_"..machine_name.."_top.png"..tentry,
"technic_"..ltier.."_"..machine_name.."_bottom.png"..tentry,
"technic_"..ltier.."_"..machine_name.."_side.png"..tentry,
"technic_"..ltier.."_"..machine_name.."_side.png"..tentry,
"technic_"..ltier.."_"..machine_name.."_side.png"..tentry,
"technic_"..ltier.."_"..machine_name.."_front.png"
},
paramtype2 = "facedir",
groups = groups,
tube = data.tube and tube or nil,
connect_sides = data.connect_sides or connect_default,
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos)
local form_buttons = ""
if not string.find(node.name, ":lv_") then
form_buttons = fs_helpers.cycling_button(
meta,
pipeworks.button_base,
"splitstacks",
{
pipeworks.button_off,
pipeworks.button_on
}
)..pipeworks.button_label
end end
meta:set_string("infotext", machine_desc:format(tier))
meta:set_int("tube_time", 0)
meta:set_string("formspec", formspec..form_buttons)
local inv = meta:get_inventory()
inv:set_size("src", input_size)
inv:set_size("dst", 4)
inv:set_size("upgrade1", 1)
inv:set_size("upgrade2", 1)
end,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
technic_run = run,
after_place_node = data.tube and pipeworks.after_place,
after_dig_node = technic.machine_after_dig_node,
on_receive_fields = function(pos, formname, fields, sender)
local node = minetest.get_node(pos)
if not pipeworks.may_configure(pos, sender) then return end
fs_helpers.on_receive_fields(pos, fields)
local meta = minetest.get_meta(pos)
local form_buttons = ""
if not string.find(node.name, ":lv_") then
form_buttons = fs_helpers.cycling_button(
meta,
pipeworks.button_base,
"splitstacks",
{
pipeworks.button_off,
pipeworks.button_on
}
)..pipeworks.button_label
end
meta:set_string("formspec", formspec..form_buttons)
end,
})
minetest.register_node("technic:"..ltier.."_"..machine_name.."_active",{
description = machine_desc:format(tier),
tiles = {
"technic_"..ltier.."_"..machine_name.."_top.png"..tentry,
"technic_"..ltier.."_"..machine_name.."_bottom.png"..tentry,
"technic_"..ltier.."_"..machine_name.."_side.png"..tentry,
"technic_"..ltier.."_"..machine_name.."_side.png"..tentry,
"technic_"..ltier.."_"..machine_name.."_side.png"..tentry,
"technic_"..ltier.."_"..machine_name.."_front_active.png"
},
paramtype2 = "facedir",
drop = "technic:"..ltier.."_"..machine_name,
groups = active_groups,
connect_sides = data.connect_sides or connect_default,
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
tube = data.tube and tube or nil,
can_dig = technic.machine_can_dig,
allow_metadata_inventory_put = technic.machine_inventory_put,
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
technic_run = run,
technic_disabled_machine_name = "technic:"..ltier.."_"..machine_name,
on_receive_fields = function(pos, formname, fields, sender)
local node = minetest.get_node(pos)
if not pipeworks.may_configure(pos, sender) then return end
fs_helpers.on_receive_fields(pos, fields)
local meta = minetest.get_meta(pos)
local form_buttons = ""
if not string.find(node.name, ":lv_") then
form_buttons = fs_helpers.cycling_button(
meta,
pipeworks.button_base,
"splitstacks",
{
pipeworks.button_off,
pipeworks.button_on
}
)..pipeworks.button_label
end
meta:set_string("formspec", formspec..form_buttons)
end,
}) })
technic.register_machine(tier, "technic:"..ltier.."_"..machine_name, technic.receiver) technic.register_machine(tier, "technic:"..ltier.."_"..machine_name, technic.receiver)

View File

@ -1,24 +1,18 @@
local have_ui = minetest.get_modpath("unified_inventory")
technic.recipes = { cooking = { input_size = 1, output_size = 1 } } technic.recipes = {cooking = {numitems = 1}}
function technic.register_recipe_type(typename, origdata) function technic.register_recipe_type(typename, desc, numitems)
local data = {} numitems = numitems or 1
for k, v in pairs(origdata) do data[k] = v end if unified_inventory and unified_inventory.register_craft_type then
data.input_size = data.input_size or 1
data.output_size = data.output_size or 1
if have_ui and unified_inventory.register_craft_type and data.output_size == 1 then
unified_inventory.register_craft_type(typename, { unified_inventory.register_craft_type(typename, {
description = data.description, description = desc,
width = data.input_size, height = numitems,
height = 1, width = 1,
}) })
end end
data.recipes = {} technic.recipes[typename] = {numitems = numitems, recipes = {}}
technic.recipes[typename] = data
end end
local function get_recipe_index(items) local function get_recipe_index(items)
if not items or type(items) ~= "table" then return false end
local l = {} local l = {}
for i, stack in ipairs(items) do for i, stack in ipairs(items) do
l[i] = ItemStack(stack):get_name() l[i] = ItemStack(stack):get_name()
@ -32,26 +26,16 @@ local function register_recipe(typename, data)
for i, stack in ipairs(data.input) do for i, stack in ipairs(data.input) do
data.input[i] = ItemStack(stack):to_string() data.input[i] = ItemStack(stack):to_string()
end end
if type(data.output) == "table" then
for i, v in ipairs(data.output) do
data.output[i] = ItemStack(data.output[i]):to_string()
end
else
data.output = ItemStack(data.output):to_string() data.output = ItemStack(data.output):to_string()
end
local recipe = {time = data.time, input = {}, output = data.output} local recipe = {time = data.time, input = {}, output = data.output}
local index = get_recipe_index(data.input) local index = get_recipe_index(data.input)
if not index then
print("[Technic] ignored registration of garbage recipe!")
return
end
for _, stack in ipairs(data.input) do for _, stack in ipairs(data.input) do
recipe.input[ItemStack(stack):get_name()] = ItemStack(stack):get_count() recipe.input[ItemStack(stack):get_name()] = ItemStack(stack):get_count()
end end
technic.recipes[typename].recipes[index] = recipe technic.recipes[typename].recipes[index] = recipe
if have_ui and technic.recipes[typename].output_size == 1 then if unified_inventory then
unified_inventory.register_craft({ unified_inventory.register_craft({
type = typename, type = typename,
output = data.output, output = data.output,
@ -81,15 +65,12 @@ function technic.get_recipe(typename, items)
end end
end end
local index = get_recipe_index(items) local index = get_recipe_index(items)
if not index then
print("[Technic] ignored registration of garbage recipe!")
return
end
local recipe = technic.recipes[typename].recipes[index] local recipe = technic.recipes[typename].recipes[index]
if recipe then if recipe then
local new_input = {} local new_input = {}
for i, stack in ipairs(items) do for i, stack in ipairs(items) do
if stack:get_count() < recipe.input[stack:get_name()] then if stack:get_count() < recipe.input[stack:get_name()] then
print(stack:get_name())
return nil return nil
else else
new_input[i] = ItemStack(stack) new_input[i] = ItemStack(stack)

View File

@ -5,46 +5,11 @@ function technic.register_solar_array(data)
local tier = data.tier local tier = data.tier
local ltier = string.lower(tier) local ltier = string.lower(tier)
local run = function(pos, node)
-- The action here is to make the solar array produce power
-- Power is dependent on the light level and the height above ground
-- There are many ways to cheat by using other light sources like lamps.
-- As there is no way to determine if light is sunlight that is just a shame.
-- To take care of some of it solar panels do not work outside daylight hours or if
-- built below 0m
local pos1 = {}
local machine_name = S("Arrayed Solar %s Generator"):format(tier)
pos1.y = pos.y + 1
pos1.x = pos.x
pos1.z = pos.z
technic.get_or_load_node(pos1)
local light = minetest.get_node_light(pos1, nil)
local time_of_day = minetest.get_timeofday()
local meta = minetest.get_meta(pos)
light = light or 0
-- turn on array only during day time and if sufficient light
-- I know this is counter intuitive when cheating by using other light sources.
if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > 0 then
local charge_to_give = math.floor((light + pos.y) * data.power)
charge_to_give = math.max(charge_to_give, 0)
charge_to_give = math.min(charge_to_give, data.power * 50)
meta:set_string("infotext", S("@1 Active (@2)", machine_name,
technic.EU_string(charge_to_give)))
meta:set_int(tier.."_EU_supply", charge_to_give)
else
meta:set_string("infotext", S("%s Idle"):format(machine_name))
meta:set_int(tier.."_EU_supply", 0)
end
end
minetest.register_node("technic:solar_array_"..ltier, { minetest.register_node("technic:solar_array_"..ltier, {
tiles = {"technic_"..ltier.."_solar_array_top.png", "technic_"..ltier.."_solar_array_bottom.png", tiles = {"technic_"..ltier.."_solar_array_top.png", "technic_"..ltier.."_solar_array_bottom.png",
"technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png",
"technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png"}, "technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png"},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1, ["technic_"..ltier]=1}, groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
connect_sides = {"bottom"},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
description = S("Arrayed Solar %s Generator"):format(tier), description = S("Arrayed Solar %s Generator"):format(tier),
active = false, active = false,
@ -59,7 +24,45 @@ function technic.register_solar_array(data)
local name = minetest.get_node(pos).name local name = minetest.get_node(pos).name
meta:set_int(tier.."_EU_supply", 0) meta:set_int(tier.."_EU_supply", 0)
end, end,
technic_run = run, })
minetest.register_abm({
nodenames = {"technic:solar_array_"..ltier},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
-- The action here is to make the solar array produce power
-- Power is dependent on the light level and the height above ground
-- 130m and above is optimal as it would be above cloud level.
-- Height gives 1/4 of the effect, light 3/4. Max. effect is 2880EU for the array.
-- There are many ways to cheat by using other light sources like lamps.
-- As there is no way to determine if light is sunlight that is just a shame.
-- To take care of some of it solar panels do not work outside daylight hours or if
-- built below -10m
local pos1 = {}
local machine_name = S("Arrayed Solar %s Generator"):format(tier)
pos1.y = pos.y + 1
pos1.x = pos.x
pos1.z = pos.z
local light = minetest.get_node_light(pos1, nil)
local time_of_day = minetest.get_timeofday()
local meta = minetest.get_meta(pos)
light = light or 0
-- turn on array only during day time and if sufficient light
-- I know this is counter intuitive when cheating by using other light sources.
if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > 0 then
local charge_to_give = math.floor((light + pos.y) * data.power)
charge_to_give = math.max(charge_to_give, 0)
charge_to_give = math.min(charge_to_give, data.power * 50)
meta:set_string("infotext", S("%s Active"):format(machine_name).." ("..charge_to_give.."EU)")
meta:set_int(tier.."_EU_supply", charge_to_give)
else
meta:set_string("infotext", S("%s Idle"):format(machine_name))
meta:set_int(tier.."_EU_supply", 0)
end
end,
}) })
technic.register_machine(tier, "technic:solar_array_"..ltier, technic.producer) technic.register_machine(tier, "technic:solar_array_"..ltier, technic.producer)

View File

@ -7,133 +7,47 @@
-- Once the receiver side is powered it will deliver power to the other side. -- Once the receiver side is powered it will deliver power to the other side.
-- Unused power is wasted just like any other producer! -- Unused power is wasted just like any other producer!
local digilines_path = minetest.get_modpath("digilines")
local S = technic.getter local S = technic.getter
local cable_entry = "^technic_cable_connection_overlay.png" minetest.register_node("technic:supply_converter", {
description = S("Supply Converter"),
local function set_supply_converter_formspec(meta) tiles = {"technic_supply_converter_top.png", "technic_supply_converter_bottom.png",
local formspec = "size[5,2.25]".. "technic_supply_converter_side.png", "technic_supply_converter_side.png",
"field[0.3,0.5;2,1;power;"..S("Input Power")..";"..meta:get_int("power").."]" "technic_supply_converter_side.png", "technic_supply_converter_side.png"},
if digilines_path then groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
formspec = formspec.. sounds = default.node_sound_wood_defaults(),
"field[2.3,0.5;3,1;channel;Digiline Channel;"..meta:get_string("channel").."]" drawtype = "nodebox",
end paramtype = "light",
-- The names for these toggle buttons are explicit about which node_box = {
-- state they'll switch to, so that multiple presses (arising type = "fixed",
-- from the ambiguity between lag and a missed press) only make fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- the single change that the user expects.
if meta:get_int("mesecon_mode") == 0 then
formspec = formspec.."button[0,1;5,1;mesecon_mode_1;"..S("Ignoring Mesecon Signal").."]"
else
formspec = formspec.."button[0,1;5,1;mesecon_mode_0;"..S("Controlled by Mesecon Signal").."]"
end
if meta:get_int("enabled") == 0 then
formspec = formspec.."button[0,1.75;5,1;enable;"..S("%s Disabled"):format(S("Supply Converter")).."]"
else
formspec = formspec.."button[0,1.75;5,1;disable;"..S("%s Enabled"):format(S("Supply Converter")).."]"
end
meta:set_string("formspec", formspec)
end
local supply_converter_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
local power = nil
if fields.power then
power = tonumber(fields.power) or 0
power = math.max(power, 0)
power = math.min(power, 10000)
power = 100 * math.floor(power / 100)
if power == meta:get_int("power") then power = nil end
end
if power then meta:set_int("power", power) end
if fields.channel then meta:set_string("channel", fields.channel) end
if fields.enable then meta:set_int("enabled", 1) end
if fields.disable then meta:set_int("enabled", 0) end
if fields.mesecon_mode_0 then meta:set_int("mesecon_mode", 0) end
if fields.mesecon_mode_1 then meta:set_int("mesecon_mode", 1) end
set_supply_converter_formspec(meta)
end
local mesecons = {
effector = {
action_on = function(pos, node)
minetest.get_meta(pos):set_int("mesecon_effect", 1)
end,
action_off = function(pos, node)
minetest.get_meta(pos):set_int("mesecon_effect", 0)
end
}
}
local digiline_def = {
receptor = {action = function() end},
effector = {
action = function(pos, node, channel, msg)
if type(msg) ~= "string" then
return
end
local meta = minetest.get_meta(pos)
if channel ~= meta:get_string("channel") then
return
end
msg = msg:lower()
if msg == "get" then
digilines.receptor_send(pos, digilines.rules.default, channel, {
enabled = meta:get_int("enabled"),
power = meta:get_int("power"),
mesecon_mode = meta:get_int("mesecon_mode")
})
return
elseif msg == "off" then
meta:set_int("enabled", 0)
elseif msg == "on" then
meta:set_int("enabled", 1)
elseif msg == "toggle" then
local onn = meta:get_int("enabled")
onn = 1-onn -- Mirror onn with pivot 0.5, so switch between 1 and 0.
meta:set_int("enabled", onn)
elseif msg:sub(1, 5) == "power" then
local power = tonumber(msg:sub(7))
if not power then
return
end
power = math.max(power, 0)
power = math.min(power, 10000)
power = 100 * math.floor(power / 100)
meta:set_int("power", power)
elseif msg:sub(1, 12) == "mesecon_mode" then
meta:set_int("mesecon_mode", tonumber(msg:sub(14)))
else
return
end
set_supply_converter_formspec(meta)
end
}, },
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", S("Supply Converter"))
meta:set_float("active", false)
end,
})
minetest.register_craft({
output = 'technic:supply_converter 1',
recipe = {
{'technic:stainless_steel_ingot', 'technic:rubber', 'technic:stainless_steel_ingot'},
{'technic:mv_transformer', 'technic:machine_casing', 'technic:lv_transformer'},
{'technic:mv_cable0', 'technic:rubber', 'technic:lv_cable0'},
} }
})
local run = function(pos, node, run_stage) minetest.register_abm({
-- run only in producer stage. nodenames = {"technic:supply_converter"},
if run_stage == technic.receiver then interval = 1,
return chance = 1,
end action = function(pos, node, active_object_count, active_object_count_wider)
local demand = 10000
local remain = 0.9 local remain = 0.9
-- Machine information -- Machine information
local machine_name = S("Supply Converter") local machine_name = S("Supply Converter")
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local enabled = meta:get_string("enabled")
if enabled == "" then
-- Backwards compatibility
minetest.registered_nodes["technic:supply_converter"].on_construct(pos)
enabled = true
else
enabled = enabled == "1"
end
enabled = enabled and (meta:get_int("mesecon_mode") == 0 or meta:get_int("mesecon_effect") ~= 0)
local demand = enabled and meta:get_int("power") or 0
local pos_up = {x=pos.x, y=pos.y+1, z=pos.z} local pos_up = {x=pos.x, y=pos.y+1, z=pos.z}
local pos_down = {x=pos.x, y=pos.y-1, z=pos.z} local pos_down = {x=pos.x, y=pos.y-1, z=pos.z}
@ -144,67 +58,21 @@ local run = function(pos, node, run_stage)
local to = technic.get_cable_tier(name_down) local to = technic.get_cable_tier(name_down)
if from and to then if from and to then
technic.switching_station_timeout_count(pos, from)
local input = meta:get_int(from.."_EU_input") local input = meta:get_int(from.."_EU_input")
meta:set_int(from.."_EU_demand", demand) meta:set_int(from.."_EU_demand", demand)
meta:set_int(from.."_EU_supply", 0) meta:set_int(from.."_EU_supply", 0)
meta:set_int(to.."_EU_demand", 0) meta:set_int(to.."_EU_demand", 0)
meta:set_int(to.."_EU_supply", input * remain) meta:set_int(to.."_EU_supply", input * remain)
meta:set_string("infotext", S("@1 (@2 @3 -> @4 @5)", machine_name, meta:set_string("infotext", machine_name
technic.EU_string(input), from, .." ("..input.." "..from.." -> "
technic.EU_string(input * remain), to)) ..input * remain.." "..to..")")
else else
meta:set_string("infotext", S("%s Has Bad Cabling"):format(machine_name)) meta:set_string("infotext", S("%s Has Bad Cabling"):format(machine_name))
if to then
meta:set_int(to.."_EU_supply", 0)
end
if from then
meta:set_int(from.."_EU_demand", 0)
end
return return
end end
end
minetest.register_node("technic:supply_converter", {
description = S("Supply Converter"),
tiles = {
"technic_supply_converter_tb.png"..cable_entry,
"technic_supply_converter_tb.png"..cable_entry,
"technic_supply_converter_side.png",
"technic_supply_converter_side.png",
"technic_supply_converter_side.png",
"technic_supply_converter_side.png"
},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
technic_machine=1, technic_all_tiers=1},
connect_sides = {"top", "bottom"},
sounds = default.node_sound_wood_defaults(),
on_receive_fields = supply_converter_receive_fields,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Supply Converter"))
if digilines_path then
meta:set_string("channel", "supply_converter"..minetest.pos_to_string(pos))
end
meta:set_int("power", 10000)
meta:set_int("enabled", 1)
meta:set_int("mesecon_mode", 0)
meta:set_int("mesecon_effect", 0)
set_supply_converter_formspec(meta)
end, end,
mesecons = mesecons,
digiline = digiline_def,
technic_run = run,
technic_on_disable = run,
})
minetest.register_craft({
output = 'technic:supply_converter 1',
recipe = {
{'technic:fine_gold_wire', 'technic:rubber', 'technic:doped_silicon_wafer'},
{'technic:mv_transformer', 'technic:machine_casing', 'technic:lv_transformer'},
{'technic:mv_cable', 'technic:rubber', 'technic:lv_cable'},
}
}) })
for tier, machines in pairs(technic.machines) do for tier, machines in pairs(technic.machines) do

View File

@ -1,147 +1,116 @@
-- See also technic/doc/api.md -- SWITCHING STATION
-- The switching station is the center of all power distribution on an electric network.
-- The station will collect all produced power from producers (PR) and batteries (BA)
-- and distribute it to receivers (RE) and depleted batteries (BA).
--
-- It works like this:
-- All PR,BA,RE nodes are indexed and tagged with the switching station.
-- The tagging is to allow more stations to be built without allowing a cheat
-- with duplicating power.
-- All the RE nodes are queried for their current EU demand. Those which are off
-- would require no or a small standby EU demand, while those which are on would
-- require more.
-- If the total demand is less than the available power they are all updated with the
-- demand number.
-- If any surplus exists from the PR nodes the batteries will be charged evenly with this.
-- If the total demand requires draw on the batteries they will be discharged evenly.
--
-- If the total demand is more than the available power all RE nodes will be shut down.
-- We have a brown-out situation.
--
-- Hence all the power distribution logic resides in this single node.
--
-- Nodes connected to the network will have one or more of these parameters as meta data:
-- <LV|MV|HV>_EU_supply : Exists for PR and BA node types. This is the EU value supplied by the node. Output
-- <LV|MV|HV>_EU_demand : Exists for RE and BA node types. This is the EU value the node requires to run. Output
-- <LV|MV|HV>_EU_input : Exists for RE and BA node types. This is the actual EU value the network can give the node. Input
--
-- The reason the LV|MV|HV type is prepended toe meta data is because some machine could require several supplies to work.
-- This way the supplies are separated per network.
technic.networks = {} technic.networks = {}
technic.cables = {}
technic.redundant_warn = {}
local mesecons_path = minetest.get_modpath("mesecons")
local digilines_path = minetest.get_modpath("digilines")
local S = technic.getter local S = technic.getter
local cable_entry = "^technic_cable_connection_overlay.png"
minetest.register_craft({ minetest.register_craft({
output = "technic:switching_station", output = "technic:switching_station",
recipe = { recipe = {
{"", "technic:lv_transformer", ""}, {"", "technic:lv_transformer", ""},
{"default:copper_ingot", "technic:machine_casing", "default:copper_ingot"}, {"default:copper_ingot", "technic:machine_casing", "default:copper_ingot"},
{"technic:lv_cable", "technic:lv_cable", "technic:lv_cable"} {"technic:lv_cable0", "technic:lv_cable0", "technic:lv_cable0"}
} }
}) })
local mesecon_def
if mesecons_path then
mesecon_def = {effector = {
rules = mesecon.rules.default,
}}
end
minetest.register_node("technic:switching_station",{ minetest.register_node("technic:switching_station",{
description = S("Switching Station"), description = S("Switching Station"),
tiles = { tiles = {"technic_water_mill_top_active.png", "technic_water_mill_top_active.png",
"technic_water_mill_top_active.png", "technic_water_mill_top_active.png", "technic_water_mill_top_active.png",
"technic_water_mill_top_active.png"..cable_entry, "technic_water_mill_top_active.png", "technic_water_mill_top_active.png"},
"technic_water_mill_top_active.png", groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
"technic_water_mill_top_active.png",
"technic_water_mill_top_active.png",
"technic_water_mill_top_active.png"},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_all_tiers=1},
connect_sides = {"bottom"},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
drawtype = "nodebox",
paramtype = "light",
node_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
},
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Switching Station")) meta:set_string("infotext", S("Switching Station"))
meta:set_string("active", 1)
meta:set_string("channel", "switching_station"..minetest.pos_to_string(pos))
meta:set_string("formspec", "field[channel;Channel;${channel}]")
local poshash = minetest.hash_node_position(pos)
technic.redundant_warn.poshash = nil
end, end,
after_dig_node = function(pos)
minetest.forceload_free_block(pos)
pos.y = pos.y - 1
minetest.forceload_free_block(pos)
local poshash = minetest.hash_node_position(pos)
technic.redundant_warn.poshash = nil
end,
on_receive_fields = function(pos, formname, fields, sender)
if not fields.channel then
return
end
local plname = sender:get_player_name()
if minetest.is_protected(pos, plname) then
minetest.record_protection_violation(pos, plname)
return
end
local meta = minetest.get_meta(pos)
meta:set_string("channel", fields.channel)
end,
mesecons = mesecon_def,
digiline = {
receptor = {action = function() end},
effector = {
action = function(pos, node, channel, msg)
if msg ~= "GET" and msg ~= "get" then
return
end
local meta = minetest.get_meta(pos)
if channel ~= meta:get_string("channel") then
return
end
digilines.receptor_send(pos, digilines.rules.default, channel, {
supply = meta:get_int("supply"),
demand = meta:get_int("demand")
}) })
--------------------------------------------------
-- Functions to help the machines on the electrical network
--------------------------------------------------
-- This one provides a timeout for a node in case it was disconnected from the network
-- A node must be touched by the station continuously in order to function
function technic.switching_station_timeout_count(pos, tier)
local meta = minetest.get_meta(pos)
local timeout = meta:get_int(tier.."_EU_timeout")
if timeout == 0 then
meta:set_int(tier.."_EU_input", 0)
else
meta:set_int(tier.."_EU_timeout", timeout - 1)
end
end end
},
},
})
-------------------------------------------------- --------------------------------------------------
-- Functions to traverse the electrical network -- Functions to traverse the electrical network
-------------------------------------------------- --------------------------------------------------
local function flatten(map)
local list = {}
for key, value in pairs(map) do
list[#list + 1] = value
end
return list
end
-- Add a wire node to the LV/MV/HV network -- Add a wire node to the LV/MV/HV network
local function add_network_node(nodes, pos, network_id) local add_new_cable_node = function(nodes, pos)
local node_id = minetest.hash_node_position(pos) -- Ignore if the node has already been added
technic.cables[node_id] = network_id for i = 1, #nodes do
if nodes[node_id] then if pos.x == nodes[i].x and
pos.y == nodes[i].y and
pos.z == nodes[i].z then
return false return false
end end
nodes[node_id] = pos end
table.insert(nodes, {x=pos.x, y=pos.y, z=pos.z, visited=1})
return true return true
end end
local function add_cable_node(nodes, pos, network_id, queue)
if add_network_node(nodes, pos, network_id) then
queue[#queue + 1] = pos
end
end
-- Generic function to add found connected nodes to the right classification array -- Generic function to add found connected nodes to the right classification array
local check_node_subp = function(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nodes, pos, machines, tier, sw_pos, from_below, network_id, queue) local check_node_subp = function(PR_nodes, RE_nodes, BA_nodes, all_nodes, pos, machines, tier)
technic.get_or_load_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local name = minetest.get_node(pos).name local name = minetest.get_node(pos).name
if technic.is_tier_cable(name, tier) then if technic.is_tier_cable(name, tier) then
add_cable_node(all_nodes, pos,network_id, queue) add_new_cable_node(all_nodes, pos)
elseif machines[name] then elseif machines[name] then
--dprint(name.." is a "..machines[name]) --dprint(name.." is a "..machines[name])
meta:set_string(tier.."_network",minetest.pos_to_string(sw_pos))
if machines[name] == technic.producer then if machines[name] == technic.producer then
add_network_node(PR_nodes, pos, network_id) add_new_cable_node(PR_nodes, pos)
elseif machines[name] == technic.receiver then elseif machines[name] == technic.receiver then
add_network_node(RE_nodes, pos, network_id) add_new_cable_node(RE_nodes, pos)
elseif machines[name] == technic.producer_receiver then elseif machines[name] == technic.producer_receiver then
add_network_node(PR_nodes, pos, network_id) add_new_cable_node(PR_nodes, pos)
add_network_node(RE_nodes, pos, network_id) add_new_cable_node(RE_nodes, pos)
elseif machines[name] == "SPECIAL" and
(pos.x ~= sw_pos.x or pos.y ~= sw_pos.y or pos.z ~= sw_pos.z) and
from_below then
-- Another switching station -> disable it
add_network_node(SP_nodes, pos, network_id)
meta:set_int("active", 0)
elseif machines[name] == technic.battery then elseif machines[name] == technic.battery then
add_network_node(BA_nodes, pos, network_id) add_new_cable_node(BA_nodes, pos)
end end
meta:set_int(tier.."_EU_timeout", 2) -- Touch node meta:set_int(tier.."_EU_timeout", 2) -- Touch node
@ -149,7 +118,8 @@ local check_node_subp = function(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nod
end end
-- Traverse a network given a list of machines and a cable type name -- Traverse a network given a list of machines and a cable type name
local traverse_network = function(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nodes, pos, machines, tier, sw_pos, network_id, queue) local traverse_network = function(PR_nodes, RE_nodes, BA_nodes, all_nodes, i, machines, tier)
local pos = all_nodes[i]
local positions = { local positions = {
{x=pos.x+1, y=pos.y, z=pos.z}, {x=pos.x+1, y=pos.y, z=pos.z},
{x=pos.x-1, y=pos.y, z=pos.z}, {x=pos.x-1, y=pos.y, z=pos.z},
@ -157,8 +127,9 @@ local traverse_network = function(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_no
{x=pos.x, y=pos.y-1, z=pos.z}, {x=pos.x, y=pos.y-1, z=pos.z},
{x=pos.x, y=pos.y, z=pos.z+1}, {x=pos.x, y=pos.y, z=pos.z+1},
{x=pos.x, y=pos.y, z=pos.z-1}} {x=pos.x, y=pos.y, z=pos.z-1}}
--print("ON")
for i, cur_pos in pairs(positions) do for i, cur_pos in pairs(positions) do
check_node_subp(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nodes, cur_pos, machines, tier, sw_pos, i == 3, network_id, queue) check_node_subp(PR_nodes, RE_nodes, BA_nodes, all_nodes, cur_pos, machines, tier)
end end
end end
@ -169,71 +140,36 @@ local touch_nodes = function(list, tier)
end end
end end
local get_network = function(sw_pos, pos1, tier) local get_network = function(pos1, tier)
local network_id = minetest.hash_node_position(pos1) local cached = technic.networks[minetest.hash_node_position(pos1)]
local cached = technic.networks[network_id]
if cached and cached.tier == tier then if cached and cached.tier == tier then
touch_nodes(cached.PR_nodes, tier) touch_nodes(cached.PR_nodes, tier)
touch_nodes(cached.BA_nodes, tier) touch_nodes(cached.BA_nodes, tier)
touch_nodes(cached.RE_nodes, tier) touch_nodes(cached.RE_nodes, tier)
for _, pos in ipairs(cached.SP_nodes) do
local meta = minetest.get_meta(pos)
meta:set_int("active", 0)
meta:set_string("active_pos", minetest.serialize(sw_pos))
end
return cached.PR_nodes, cached.BA_nodes, cached.RE_nodes return cached.PR_nodes, cached.BA_nodes, cached.RE_nodes
end end
local i = 1
local PR_nodes = {} local PR_nodes = {}
local BA_nodes = {} local BA_nodes = {}
local RE_nodes = {} local RE_nodes = {}
local SP_nodes = {} local all_nodes = {pos1}
local all_nodes = {} repeat
local queue = {} traverse_network(PR_nodes, RE_nodes, BA_nodes, all_nodes,
add_cable_node(all_nodes, pos1, network_id, queue) i, technic.machines[tier], tier)
while next(queue) do i = i + 1
local to_visit = {} until all_nodes[i] == nil
for _, pos in ipairs(queue) do technic.networks[minetest.hash_node_position(pos1)] = {tier = tier, PR_nodes = PR_nodes, RE_nodes = RE_nodes, BA_nodes = BA_nodes}
traverse_network(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nodes,
pos, technic.machines[tier], tier, sw_pos, network_id, to_visit)
end
queue = to_visit
end
PR_nodes = flatten(PR_nodes)
BA_nodes = flatten(BA_nodes)
RE_nodes = flatten(RE_nodes)
SP_nodes = flatten(SP_nodes)
all_nodes = flatten(all_nodes)
technic.networks[network_id] = {tier = tier, all_nodes = all_nodes, SP_nodes = SP_nodes,
PR_nodes = PR_nodes, RE_nodes = RE_nodes, BA_nodes = BA_nodes}
return PR_nodes, BA_nodes, RE_nodes return PR_nodes, BA_nodes, RE_nodes
end end
----------------------------------------------- -----------------------------------------------
-- The action code for the switching station -- -- The action code for the switching station --
----------------------------------------------- -----------------------------------------------
technic.powerctrl_state = true
minetest.register_chatcommand("powerctrl", {
params = "state",
description = "Enables or disables technic's switching station ABM",
privs = { basic_privs = true },
func = function(name, state)
if state == "on" then
technic.powerctrl_state = true
else
technic.powerctrl_state = false
end
end
})
minetest.register_abm({ minetest.register_abm({
nodenames = {"technic:switching_station"}, nodenames = {"technic:switching_station"},
label = "Switching Station", -- allows the mtt profiler to profile this abm individually
interval = 1, interval = 1,
chance = 1, chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider) action = function(pos, node, active_object_count, active_object_count_wider)
if not technic.powerctrl_state then return end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local meta1 = nil local meta1 = nil
local pos1 = {} local pos1 = {}
@ -251,84 +187,25 @@ minetest.register_abm({
-- Which kind of network are we on: -- Which kind of network are we on:
pos1 = {x=pos.x, y=pos.y-1, z=pos.z} pos1 = {x=pos.x, y=pos.y-1, z=pos.z}
--Disable if necessary
if meta:get_int("active") ~= 1 then
minetest.forceload_free_block(pos)
minetest.forceload_free_block(pos1)
meta:set_string("infotext",S("%s Already Present"):format(machine_name))
local poshash = minetest.hash_node_position(pos)
if not technic.redundant_warn[poshash] then
technic.redundant_warn[poshash] = true
print("[TECHNIC] Warning: redundant switching station found near "..minetest.pos_to_string(pos))
end
return
end
local name = minetest.get_node(pos1).name local name = minetest.get_node(pos1).name
local tier = technic.get_cable_tier(name) local tier = technic.get_cable_tier(name)
if tier then if tier then
-- Forceload switching station PR_nodes, BA_nodes, RE_nodes = get_network(pos1, tier)
minetest.forceload_block(pos)
minetest.forceload_block(pos1)
PR_nodes, BA_nodes, RE_nodes = get_network(pos, pos1, tier)
else else
--dprint("Not connected to a network") --dprint("Not connected to a network")
meta:set_string("infotext", S("%s Has No Network"):format(machine_name)) meta:set_string("infotext", S("%s Has No Network"):format(machine_name))
minetest.forceload_free_block(pos)
minetest.forceload_free_block(pos1)
return return
end end
--dprint("nodes="..table.getn(all_nodes)
-- Run all the nodes -- .." PR="..table.getn(PR_nodes)
local function run_nodes(list, run_stage) -- .." BA="..table.getn(BA_nodes)
for _, pos2 in ipairs(list) do -- .." RE="..table.getn(RE_nodes))
technic.get_or_load_node(pos2)
local node2 = minetest.get_node(pos2)
local nodedef
if node2 and node2.name then
nodedef = minetest.registered_nodes[node2.name]
end
if nodedef and nodedef.technic_run then
nodedef.technic_run(pos2, node2, run_stage)
end
end
end
run_nodes(PR_nodes, technic.producer)
run_nodes(RE_nodes, technic.receiver)
run_nodes(BA_nodes, technic.battery)
-- Strings for the meta data -- Strings for the meta data
local eu_demand_str = tier.."_EU_demand" local eu_demand_str = tier.."_EU_demand"
local eu_input_str = tier.."_EU_input" local eu_input_str = tier.."_EU_input"
local eu_supply_str = tier.."_EU_supply" local eu_supply_str = tier.."_EU_supply"
-- Distribute charge equally across multiple batteries.
local charge_total = 0
local battery_count = 0
for n, pos1 in pairs(BA_nodes) do
meta1 = minetest.get_meta(pos1)
local charge = meta1:get_int("internal_EU_charge")
if (meta1:get_int(eu_demand_str) ~= 0) then
charge_total = charge_total + charge
battery_count = battery_count + 1
end
end
local charge_distributed = math.floor(charge_total / battery_count)
for n, pos1 in pairs(BA_nodes) do
meta1 = minetest.get_meta(pos1)
if (meta1:get_int(eu_demand_str) ~= 0) then
meta1:set_int("internal_EU_charge", charge_distributed)
end
end
-- Get all the power from the PR nodes -- Get all the power from the PR nodes
local PR_eu_supply = 0 -- Total power local PR_eu_supply = 0 -- Total power
for _, pos1 in pairs(PR_nodes) do for _, pos1 in pairs(PR_nodes) do
@ -361,26 +238,9 @@ minetest.register_abm({
end end
--dprint("Total BA demand:"..BA_eu_demand) --dprint("Total BA demand:"..BA_eu_demand)
meta:set_string("infotext", S("@1. Supply: @2 Demand: @3", meta:set_string("infotext",
machine_name, technic.EU_string(PR_eu_supply), S("%s. Supply: %d Demand: %d"):format(
technic.EU_string(RE_eu_demand))) machine_name, PR_eu_supply, RE_eu_demand))
-- If mesecon signal and power supply or demand changed then
-- send them via digilines.
if mesecons_path and digilines_path and mesecon.is_powered(pos) then
if PR_eu_supply ~= meta:get_int("supply") or
RE_eu_demand ~= meta:get_int("demand") then
local channel = meta:get_string("channel")
digilines.receptor_send(pos, digilines.rules.default, channel, {
supply = PR_eu_supply,
demand = RE_eu_demand
})
end
end
-- Data that will be used by the power monitor
meta:set_int("supply",PR_eu_supply)
meta:set_int("demand",RE_eu_demand)
-- If the PR supply is enough for the RE demand supply them all -- If the PR supply is enough for the RE demand supply them all
if PR_eu_supply >= RE_eu_demand then if PR_eu_supply >= RE_eu_demand then
@ -443,64 +303,6 @@ minetest.register_abm({
meta1 = minetest.get_meta(pos1) meta1 = minetest.get_meta(pos1)
meta1:set_int(eu_input_str, 0) meta1:set_int(eu_input_str, 0)
end end
end,
})
-- Timeout ABM
-- Timeout for a node in case it was disconnected from the network
-- A node must be touched by the station continuously in order to function
local function switching_station_timeout_count(pos, tier)
local meta = minetest.get_meta(pos)
local timeout = meta:get_int(tier.."_EU_timeout")
if timeout <= 0 then
meta:set_int(tier.."_EU_input", 0) -- Not needed anymore <-- actually, it is for supply converter
return true
else
meta:set_int(tier.."_EU_timeout", timeout - 1)
return false
end
end
minetest.register_abm({
label = "Machines: timeout check",
nodenames = {"group:technic_machine"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos)
for tier, machines in pairs(technic.machines) do
if machines[node.name] and switching_station_timeout_count(pos, tier) then
local nodedef = minetest.registered_nodes[node.name]
if nodedef and nodedef.technic_disabled_machine_name then
node.name = nodedef.technic_disabled_machine_name
minetest.swap_node(pos, node)
elseif nodedef and nodedef.technic_on_disable then
nodedef.technic_on_disable(pos, node)
end
if nodedef then
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("%s Has No Network"):format(nodedef.description))
end
end
end
end,
})
--Re-enable disabled switching station if necessary, similar to the timeout above
minetest.register_abm({
label = "Machines: re-enable check",
nodenames = {"technic:switching_station"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos)
local pos1 = {x=pos.x,y=pos.y-1,z=pos.z}
local tier = technic.get_cable_tier(minetest.get_node(pos1).name)
if not tier then return end
if switching_station_timeout_count(pos, tier) then
local meta = minetest.get_meta(pos)
meta:set_int("active",1)
end
end, end,
}) })

View File

@ -1,238 +0,0 @@
# Blender v2.73 (sub 0) OBJ File: 'slope_test_cylinder_onetexture.blend'
# www.blender.org
o Cylinder_Cylinder.001
v 0.000000 -0.500000 -0.500000
v 0.000000 0.500000 -0.500000
v 0.097545 -0.500000 -0.490393
v 0.097545 0.500000 -0.490393
v 0.191342 -0.500000 -0.461940
v 0.191342 0.500000 -0.461940
v 0.277785 -0.500000 -0.415735
v 0.277785 0.500000 -0.415735
v 0.353553 -0.500000 -0.353554
v 0.353553 0.500000 -0.353554
v 0.415735 -0.500000 -0.277785
v 0.415735 0.500000 -0.277785
v 0.461940 -0.500000 -0.191342
v 0.461940 0.500000 -0.191342
v 0.490393 -0.500000 -0.097545
v 0.490393 0.500000 -0.097545
v 0.500000 -0.500000 -0.000000
v 0.500000 0.500000 -0.000000
v 0.490393 -0.500000 0.097545
v 0.490393 0.500000 0.097545
v 0.461940 -0.500000 0.191341
v 0.461940 0.500000 0.191341
v 0.415735 -0.500000 0.277785
v 0.415735 0.500000 0.277785
v 0.353553 -0.500000 0.353553
v 0.353553 0.500000 0.353553
v 0.277785 -0.500000 0.415735
v 0.277785 0.500000 0.415735
v 0.191342 -0.500000 0.461940
v 0.191342 0.500000 0.461940
v 0.097545 -0.500000 0.490392
v 0.097545 0.500000 0.490392
v -0.000000 -0.500000 0.500000
v -0.000000 0.500000 0.500000
v -0.097545 -0.500000 0.490392
v -0.097545 0.500000 0.490392
v -0.191342 -0.500000 0.461939
v -0.191342 0.500000 0.461939
v -0.277785 -0.500000 0.415734
v -0.277785 0.500000 0.415734
v -0.353554 -0.500000 0.353553
v -0.353554 0.500000 0.353553
v -0.415735 -0.500000 0.277785
v -0.415735 0.500000 0.277785
v -0.461940 -0.500000 0.191341
v -0.461940 0.500000 0.191341
v -0.490393 -0.500000 0.097545
v -0.490393 0.500000 0.097545
v -0.500000 -0.500000 -0.000001
v -0.500000 0.500000 -0.000001
v -0.490393 -0.500000 -0.097546
v -0.490393 0.500000 -0.097546
v -0.461940 -0.500000 -0.191342
v -0.461940 0.500000 -0.191342
v -0.415734 -0.500000 -0.277786
v -0.415734 0.500000 -0.277786
v -0.353553 -0.500000 -0.353554
v -0.353553 0.500000 -0.353554
v -0.277785 -0.500000 -0.415735
v -0.277785 0.500000 -0.415735
v -0.191341 -0.500000 -0.461940
v -0.191341 0.500000 -0.461940
v -0.097544 -0.500000 -0.490393
v -0.097544 0.500000 -0.490393
vt 0.499996 0.999997
vt 0.499995 0.000005
vt 0.562495 0.000004
vt 0.562496 0.999997
vt 0.624995 0.000003
vt 0.624997 0.999997
vt 0.687496 0.000002
vt 0.687497 0.999998
vt 0.749997 0.000001
vt 0.749997 0.999998
vt 0.812497 0.000001
vt 0.812497 0.999998
vt 0.874997 -0.000000
vt 0.874997 0.999998
vt 0.937498 -0.000000
vt 0.937498 0.999998
vt 0.999998 -0.000000
vt 0.999998 0.999998
vt 0.000005 0.999997
vt 0.000001 0.000024
vt 0.062500 0.000023
vt 0.062505 0.999996
vt 0.124999 0.000021
vt 0.125004 0.999996
vt 0.187498 0.000020
vt 0.187503 0.999995
vt 0.249997 0.000018
vt 0.250003 0.999994
vt 0.312497 0.000017
vt 0.312502 0.999994
vt 0.374997 0.000015
vt 0.375002 0.999993
vt 0.437496 0.000014
vt 0.437501 0.999993
vt 0.402487 0.009601
vt 0.597576 0.009614
vt 0.691371 0.038072
vt 0.777811 0.084282
vt 0.853576 0.146469
vt 0.915753 0.222242
vt 0.961953 0.308689
vt 0.990399 0.402487
vt 1.000000 0.500033
vt 0.990386 0.597577
vt 0.961928 0.691370
vt 0.915717 0.777811
vt 0.853531 0.853575
vt 0.777758 0.915753
vt 0.691312 0.961952
vt 0.597514 0.990398
vt 0.402424 0.990386
vt 0.308630 0.961928
vt 0.222188 0.915717
vt 0.146424 0.853531
vt 0.084248 0.777759
vt 0.038049 0.691313
vt 0.009602 0.597515
vt 0.000000 0.499970
vt 0.009614 0.402425
vt 0.038073 0.308630
vt 0.084283 0.222189
vt 0.146470 0.146424
vt 0.222243 0.084248
vt 0.308689 0.038048
vt 0.499927 0.999999
vt 0.084226 0.777725
vt 0.000000 0.499927
vt 0.222277 0.084224
vt 0.500074 0.000000
vt 0.915777 0.222279
vt 1.000000 0.500077
vt 0.777724 0.915775
vn 0.000000 -0.685700 -0.727900
vn 0.000000 0.685700 -0.727900
vn 0.142000 0.685700 -0.713900
vn 0.142000 -0.685700 -0.713900
vn 0.278500 0.685700 -0.672500
vn 0.278500 -0.685700 -0.672500
vn 0.404400 0.685700 -0.605200
vn 0.404400 -0.685700 -0.605200
vn 0.514700 0.685700 -0.514700
vn 0.514700 -0.685700 -0.514700
vn 0.605200 0.685700 -0.404400
vn 0.605200 -0.685700 -0.404400
vn 0.672500 0.685700 -0.278500
vn 0.672500 -0.685700 -0.278500
vn 0.713900 0.685700 -0.142000
vn 0.713900 -0.685700 -0.142000
vn 0.727900 0.685700 0.000000
vn 0.727900 -0.685700 0.000000
vn 0.713900 0.685700 0.142000
vn 0.713900 -0.685700 0.142000
vn 0.672500 0.685700 0.278500
vn 0.672500 -0.685700 0.278500
vn 0.605200 0.685700 0.404400
vn 0.605200 -0.685700 0.404400
vn 0.514700 0.685700 0.514700
vn 0.514700 -0.685700 0.514700
vn 0.404400 0.685700 0.605200
vn 0.404400 -0.685700 0.605200
vn 0.278500 0.685700 0.672500
vn 0.278500 -0.685700 0.672500
vn 0.142000 0.685700 0.713900
vn 0.142000 -0.685700 0.713900
vn 0.000000 0.685700 0.727900
vn 0.000000 -0.685700 0.727900
vn -0.142000 0.685700 0.713900
vn -0.142000 -0.685700 0.713900
vn -0.278500 0.685700 0.672500
vn -0.278500 -0.685700 0.672500
vn -0.404400 0.685700 0.605200
vn -0.404400 -0.685700 0.605200
vn -0.514700 0.685700 0.514700
vn -0.514700 -0.685700 0.514700
vn -0.605200 0.685700 0.404400
vn -0.605200 -0.685700 0.404400
vn -0.672500 0.685700 0.278500
vn -0.672500 -0.685700 0.278500
vn -0.713900 0.685700 0.142000
vn -0.713900 -0.685700 0.142000
vn -0.727900 0.685700 0.000000
vn -0.727900 -0.685700 0.000000
vn -0.713900 0.685700 -0.142000
vn -0.713900 -0.685700 -0.142000
vn -0.672500 0.685700 -0.278500
vn -0.672500 -0.685700 -0.278500
vn -0.605200 0.685700 -0.404400
vn -0.605200 -0.685700 -0.404400
vn -0.514700 0.685700 -0.514700
vn -0.514700 -0.685700 -0.514700
vn -0.404400 0.685700 -0.605200
vn -0.404400 -0.685700 -0.605200
vn -0.278500 0.685700 -0.672500
vn -0.278500 -0.685700 -0.672500
vn -0.142000 0.685700 -0.713900
vn -0.142000 -0.685700 -0.713900
s 1
f 1/1/1 2/2/2 4/3/3 3/4/4
f 3/4/4 4/3/3 6/5/5 5/6/6
f 5/6/6 6/5/5 8/7/7 7/8/8
f 7/8/8 8/7/7 10/9/9 9/10/10
f 9/10/10 10/9/9 12/11/11 11/12/12
f 11/12/12 12/11/11 14/13/13 13/14/14
f 13/14/14 14/13/13 16/15/15 15/16/16
f 15/16/16 16/15/15 18/17/17 17/18/18
f 17/19/18 18/20/17 20/21/19 19/22/20
f 19/22/20 20/21/19 22/23/21 21/24/22
f 21/24/22 22/23/21 24/25/23 23/26/24
f 23/26/24 24/25/23 26/27/25 25/28/26
f 25/28/26 26/27/25 28/29/27 27/30/28
f 27/30/28 28/29/27 30/31/29 29/32/30
f 29/32/30 30/31/29 32/33/31 31/34/32
f 31/34/32 32/33/31 34/2/33 33/1/34
f 33/1/34 34/2/33 36/3/35 35/4/36
f 35/4/36 36/3/35 38/5/37 37/6/38
f 37/6/38 38/5/37 40/7/39 39/8/40
f 39/8/40 40/7/39 42/9/41 41/10/42
f 41/10/42 42/9/41 44/11/43 43/12/44
f 43/12/44 44/11/43 46/13/45 45/14/46
f 45/14/46 46/13/45 48/15/47 47/16/48
f 47/16/48 48/15/47 50/17/49 49/18/50
f 49/19/50 50/20/49 52/21/51 51/22/52
f 51/22/52 52/21/51 54/23/53 53/24/54
f 53/24/54 54/23/53 56/25/55 55/26/56
f 55/26/56 56/25/55 58/27/57 57/28/58
f 57/28/58 58/27/57 60/29/59 59/30/60
f 59/30/60 60/29/59 62/31/61 61/32/62
f 4/35/3 2/2/2 64/36/63 62/37/61 60/38/59 58/39/57 56/40/55 54/41/53 52/42/51 50/43/49 48/44/47 46/45/45 44/46/43 42/47/41 40/48/39 38/49/37 36/50/35 34/1/33 32/51/31 30/52/29 28/53/27 26/54/25 24/55/23 22/56/21 20/57/19 18/58/17 16/59/15 14/60/13 12/61/11 10/62/9 8/63/7 6/64/5
f 63/34/64 64/33/63 2/2/2 1/1/1
f 61/32/62 62/31/61 64/33/63 63/34/64
f 1/65/1 3/51/4 5/52/6 7/53/8 9/54/10 11/66/12 13/56/14 15/57/16 17/67/18 19/59/20 21/60/22 23/61/24 25/62/26 27/68/28 29/64/30 31/35/32 33/69/34 35/36/36 37/37/38 39/38/40 41/39/42 43/70/44 45/41/46 47/42/48 49/71/50 51/44/52 53/45/54 55/46/56 57/47/58 59/72/60 61/49/62 63/50/64

View File

@ -1,238 +0,0 @@
# Blender v2.73 (sub 0) OBJ File: 'technic-cylinder-horizontal.blend'
# www.blender.org
o Cylinder_Cylinder.001
v 0.500000 0.000000 -0.500000
v -0.500000 0.000000 -0.500000
v 0.500000 0.097545 -0.490393
v -0.500000 0.097545 -0.490393
v 0.500000 0.191342 -0.461940
v -0.500000 0.191342 -0.461940
v 0.500000 0.277785 -0.415735
v -0.500000 0.277785 -0.415735
v 0.500000 0.353553 -0.353553
v -0.500000 0.353553 -0.353554
v 0.500000 0.415735 -0.277785
v -0.500000 0.415735 -0.277785
v 0.500000 0.461940 -0.191342
v -0.500000 0.461940 -0.191342
v 0.500000 0.490393 -0.097545
v -0.500000 0.490393 -0.097545
v 0.500000 0.500000 -0.000000
v -0.500000 0.500000 -0.000000
v 0.500000 0.490393 0.097545
v -0.500000 0.490393 0.097545
v 0.500000 0.461940 0.191342
v -0.500000 0.461940 0.191341
v 0.500000 0.415735 0.277785
v -0.500000 0.415735 0.277785
v 0.500000 0.353553 0.353553
v -0.500000 0.353553 0.353553
v 0.500000 0.277785 0.415735
v -0.500000 0.277785 0.415735
v 0.500000 0.191342 0.461940
v -0.500000 0.191342 0.461940
v 0.500000 0.097545 0.490393
v -0.500000 0.097545 0.490392
v 0.500000 -0.000000 0.500000
v -0.500000 -0.000000 0.500000
v 0.500000 -0.097546 0.490392
v -0.500000 -0.097545 0.490392
v 0.500000 -0.191342 0.461940
v -0.500000 -0.191342 0.461939
v 0.500000 -0.277785 0.415734
v -0.500000 -0.277785 0.415734
v 0.500000 -0.353554 0.353553
v -0.500000 -0.353554 0.353553
v 0.500000 -0.415735 0.277785
v -0.500000 -0.415735 0.277785
v 0.500000 -0.461940 0.191341
v -0.500000 -0.461940 0.191341
v 0.500000 -0.490393 0.097545
v -0.500000 -0.490393 0.097544
v 0.500000 -0.500000 -0.000001
v -0.500000 -0.500000 -0.000001
v 0.500000 -0.490393 -0.097546
v -0.500000 -0.490393 -0.097546
v 0.500000 -0.461940 -0.191342
v -0.500000 -0.461940 -0.191343
v 0.500000 -0.415734 -0.277786
v -0.500000 -0.415734 -0.277786
v 0.500000 -0.353553 -0.353554
v -0.500000 -0.353553 -0.353554
v 0.500000 -0.277785 -0.415735
v -0.500000 -0.277784 -0.415735
v 0.500000 -0.191341 -0.461940
v -0.500000 -0.191341 -0.461940
v 0.500000 -0.097544 -0.490393
v -0.500000 -0.097544 -0.490393
vt 0.000003 0.499996
vt 0.999995 0.499995
vt 0.999996 0.562495
vt 0.000002 0.562496
vt 0.999997 0.624995
vt 0.000003 0.624996
vt 0.999998 0.687496
vt 0.000002 0.687496
vt 0.999999 0.749997
vt 0.000002 0.749996
vt 0.999999 0.812497
vt 0.000002 0.812497
vt 1.000000 0.874997
vt 0.000001 0.874997
vt 1.000000 0.937498
vt 0.000001 0.937497
vt 1.000000 0.999998
vt 0.000001 0.999998
vt 0.000003 0.000005
vt 0.999976 0.000001
vt 0.999977 0.062500
vt 0.000003 0.062505
vt 0.999978 0.124999
vt 0.000004 0.125004
vt 0.999980 0.187498
vt 0.000005 0.187503
vt 0.999982 0.249997
vt 0.000005 0.250003
vt 0.999983 0.312497
vt 0.000006 0.312502
vt 0.999985 0.374997
vt 0.000007 0.375001
vt 0.999986 0.437496
vt 0.000007 0.437501
vt 0.009601 0.597512
vt 0.009614 0.402424
vt 0.038072 0.308628
vt 0.084283 0.222189
vt 0.146469 0.146424
vt 0.222242 0.084247
vt 0.308689 0.038047
vt 0.402487 0.009601
vt 0.500033 -0.000000
vt 0.597577 0.009613
vt 0.691371 0.038072
vt 0.777811 0.084283
vt 0.853575 0.146469
vt 0.915753 0.222242
vt 0.961952 0.308688
vt 0.990398 0.402486
vt 0.990386 0.597576
vt 0.961928 0.691370
vt 0.915717 0.777812
vt 0.853531 0.853576
vt 0.777759 0.915752
vt 0.691313 0.961951
vt 0.597515 0.990398
vt 0.499970 1.000000
vt 0.402425 0.990386
vt 0.308630 0.961927
vt 0.222189 0.915717
vt 0.146424 0.853530
vt 0.084248 0.777757
vt 0.038048 0.691311
vt 0.999999 0.500073
vt 0.777724 0.915774
vt 0.499927 0.999999
vt 0.084224 0.777723
vt 0.000000 0.499925
vt 0.222279 0.084223
vt 0.500078 -0.000000
vt 0.915775 0.222276
vn 0.685700 0.000000 -0.727900
vn -0.685700 0.000000 -0.727900
vn -0.685700 0.142000 -0.713900
vn 0.685700 0.142000 -0.713900
vn -0.685700 0.278500 -0.672500
vn 0.685700 0.278500 -0.672500
vn -0.685700 0.404400 -0.605200
vn 0.685700 0.404400 -0.605200
vn -0.685700 0.514700 -0.514700
vn 0.685700 0.514700 -0.514700
vn -0.685700 0.605200 -0.404400
vn 0.685700 0.605200 -0.404400
vn -0.685700 0.672500 -0.278500
vn 0.685700 0.672500 -0.278500
vn -0.685700 0.713900 -0.142000
vn 0.685700 0.713900 -0.142000
vn -0.685700 0.727900 0.000000
vn 0.685700 0.727900 0.000000
vn -0.685700 0.713900 0.142000
vn 0.685700 0.713900 0.142000
vn -0.685700 0.672500 0.278500
vn 0.685700 0.672500 0.278500
vn -0.685700 0.605200 0.404400
vn 0.685700 0.605200 0.404400
vn -0.685700 0.514700 0.514700
vn 0.685700 0.514700 0.514700
vn -0.685700 0.404400 0.605200
vn 0.685700 0.404400 0.605200
vn -0.685700 0.278500 0.672500
vn 0.685700 0.278500 0.672500
vn -0.685700 0.142000 0.713900
vn 0.685700 0.142000 0.713900
vn -0.685700 0.000000 0.727900
vn 0.685700 0.000000 0.727900
vn -0.685700 -0.142000 0.713900
vn 0.685700 -0.142000 0.713900
vn -0.685700 -0.278500 0.672500
vn 0.685700 -0.278500 0.672500
vn -0.685700 -0.404400 0.605200
vn 0.685700 -0.404400 0.605200
vn -0.685700 -0.514700 0.514700
vn 0.685700 -0.514700 0.514700
vn -0.685700 -0.605200 0.404400
vn 0.685700 -0.605200 0.404400
vn -0.685700 -0.672500 0.278500
vn 0.685700 -0.672500 0.278500
vn -0.685700 -0.713900 0.142000
vn 0.685700 -0.713900 0.142000
vn -0.685700 -0.727900 0.000000
vn 0.685700 -0.727900 0.000000
vn -0.685700 -0.713900 -0.142000
vn 0.685700 -0.713900 -0.142000
vn -0.685700 -0.672500 -0.278500
vn 0.685700 -0.672500 -0.278500
vn -0.685700 -0.605200 -0.404400
vn 0.685700 -0.605200 -0.404400
vn -0.685700 -0.514700 -0.514700
vn 0.685700 -0.514700 -0.514700
vn -0.685700 -0.404400 -0.605200
vn 0.685700 -0.404400 -0.605200
vn -0.685700 -0.278500 -0.672500
vn 0.685700 -0.278500 -0.672500
vn -0.685700 -0.142000 -0.713900
vn 0.685700 -0.142000 -0.713900
s 1
f 1/1/1 2/2/2 4/3/3 3/4/4
f 3/4/4 4/3/3 6/5/5 5/6/6
f 5/6/6 6/5/5 8/7/7 7/8/8
f 7/8/8 8/7/7 10/9/9 9/10/10
f 9/10/10 10/9/9 12/11/11 11/12/12
f 11/12/12 12/11/11 14/13/13 13/14/14
f 13/14/14 14/13/13 16/15/15 15/16/16
f 15/16/16 16/15/15 18/17/17 17/18/18
f 17/19/18 18/20/17 20/21/19 19/22/20
f 19/22/20 20/21/19 22/23/21 21/24/22
f 21/24/22 22/23/21 24/25/23 23/26/24
f 23/26/24 24/25/23 26/27/25 25/28/26
f 25/28/26 26/27/25 28/29/27 27/30/28
f 27/30/28 28/29/27 30/31/29 29/32/30
f 29/32/30 30/31/29 32/33/31 31/34/32
f 31/34/32 32/33/31 34/2/33 33/1/34
f 33/1/34 34/2/33 36/3/35 35/4/36
f 35/4/36 36/3/35 38/5/37 37/6/38
f 37/6/38 38/5/37 40/7/39 39/8/40
f 39/8/40 40/7/39 42/9/41 41/10/42
f 41/10/42 42/9/41 44/11/43 43/12/44
f 43/12/44 44/11/43 46/13/45 45/14/46
f 45/14/46 46/13/45 48/15/47 47/16/48
f 47/16/48 48/15/47 50/17/49 49/18/50
f 49/19/50 50/20/49 52/21/51 51/22/52
f 51/22/52 52/21/51 54/23/53 53/24/54
f 53/24/54 54/23/53 56/25/55 55/26/56
f 55/26/56 56/25/55 58/27/57 57/28/58
f 57/28/58 58/27/57 60/29/59 59/30/60
f 59/30/60 60/29/59 62/31/61 61/32/62
f 4/35/3 2/1/2 64/36/63 62/37/61 60/38/59 58/39/57 56/40/55 54/41/53 52/42/51 50/43/49 48/44/47 46/45/45 44/46/43 42/47/41 40/48/39 38/49/37 36/50/35 34/2/33 32/51/31 30/52/29 28/53/27 26/54/25 24/55/23 22/56/21 20/57/19 18/58/17 16/59/15 14/60/13 12/61/11 10/62/9 8/63/7 6/64/5
f 63/34/64 64/33/63 2/2/2 1/1/1
f 61/32/62 62/31/61 64/33/63 63/34/64
f 1/65/1 3/51/4 5/52/6 7/53/8 9/54/10 11/66/12 13/56/14 15/57/16 17/67/18 19/59/20 21/60/22 23/61/24 25/62/26 27/68/28 29/64/30 31/35/32 33/69/34 35/36/36 37/37/38 39/38/40 41/39/42 43/70/44 45/41/46 47/42/48 49/71/50 51/44/52 53/45/54 55/46/56 57/47/58 59/72/60 61/49/62 63/50/64

View File

@ -1,33 +0,0 @@
# Blender v2.73 (sub 0) OBJ File: 'technic-icorner.blend'
# www.blender.org
o Cube_Cube.000
v -0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 0.500000 0.500000
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 -0.500000 -0.500000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vn -0.000000 -0.000000 1.000000
vn -0.000000 -0.000000 -1.000000
vn 0.707100 0.707100 -0.000000
vn 1.000000 0.000000 -0.000000
vn 0.000000 -1.000000 -0.000000
vn -1.000000 -0.000000 -0.000000
vn 0.000000 0.707100 -0.707100
s off
f 6/1/1 1/2/1 7/3/1 8/4/1
f 2/1/2 5/3/2 3/4/2
f 2/1/3 1/2/3 5/4/3
f 6/2/4 8/3/4 9/4/4
f 9/1/5 8/2/5 7/3/5 3/4/5
f 3/3/6 7/4/6 1/1/6 2/2/6
f 1/1/7 6/2/7 9/3/7
l 1 4
l 3 4

View File

@ -1,33 +0,0 @@
# Blender v2.73 (sub 0) OBJ File: 'technic-icorner-upsdown.blend'
# www.blender.org
o Cube_Cube.000
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn -1.000000 0.000000 0.000000
vn 1.000000 -0.000000 0.000000
vn -0.000000 -0.707100 -0.707100
vn -0.000000 0.000000 -1.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 -0.000000 1.000000
vn 0.707100 -0.707100 -0.000000
s off
f 6/1/1 1/2/1 7/3/1 8/4/1
f 2/1/2 5/3/2 3/4/2
f 2/1/3 1/2/3 5/4/3
f 6/2/4 8/3/4 9/4/4
f 9/1/5 8/2/5 7/3/5 3/4/5
f 3/3/6 7/4/6 1/1/6 2/2/6
f 1/1/7 6/2/7 9/3/7
l 1 4
l 3 4

View File

@ -1,300 +0,0 @@
# Blender v2.73 (sub 0) OBJ File: 'slope_test_blob_onetexture.blend'
# www.blender.org
o Cube
v 0.213679 -0.450000 -0.213679
v -0.213679 -0.450000 0.213680
v 0.213680 -0.450000 0.213680
v -0.213679 -0.450000 -0.213679
v 0.213679 0.450000 -0.213679
v -0.213679 0.450000 -0.213679
v 0.213679 0.450000 0.213680
v 0.500000 -0.000003 0.500000
v 0.277785 -0.415735 0.277785
v -0.277785 -0.415735 0.277785
v 0.353553 -0.353554 0.353553
v -0.353553 -0.353554 0.353553
v -0.500000 -0.000002 0.500000
v 0.415735 -0.277786 0.415735
v -0.277785 0.415735 0.277785
v 0.277785 0.415735 0.277785
v -0.415735 -0.277785 0.415735
v 0.353554 0.353553 0.353554
v -0.500000 -0.000002 -0.499983
v 0.461940 -0.191342 0.461940
v -0.461940 -0.191342 0.461940
v -0.353553 0.353553 0.353554
v 0.490393 -0.097546 0.490393
v 0.500000 -0.000002 -0.500000
v 0.490393 0.097545 -0.490392
v 0.490393 0.097545 0.490393
v -0.490393 -0.097546 0.490393
v 0.490393 -0.097545 -0.490393
v 0.461940 0.191341 0.461940
v -0.461940 0.191341 0.461940
v 0.461940 0.191342 -0.461940
v -0.490393 0.097545 0.490393
v 0.415735 0.277785 0.415735
v -0.490393 0.097545 -0.490392
v -0.415735 0.277785 0.415735
v 0.461940 -0.191341 -0.461940
v 0.415735 0.277785 -0.415735
v -0.461940 0.191341 -0.461940
v -0.415735 0.277785 -0.415735
v 0.415735 -0.277785 -0.415735
v -0.490393 -0.097546 -0.490392
v 0.353553 0.353553 -0.353553
v -0.213679 0.450000 0.213680
v -0.353553 0.353553 -0.353553
v 0.277785 0.415735 -0.277785
v -0.461940 -0.191342 -0.461939
v 0.353554 -0.353553 -0.353554
v -0.277785 0.415735 -0.277785
v -0.415735 -0.277785 -0.415734
v 0.277786 -0.415735 -0.277785
v -0.353553 -0.353554 -0.353553
v -0.277785 -0.415735 -0.277784
vt 0.038487 0.679029
vt 0.010047 0.589789
vt 0.990397 0.589790
vt 0.915772 0.767073
vt 0.084671 0.767071
vt 0.961957 0.679029
vt 0.852473 0.146294
vt 0.914576 0.232749
vt 0.084146 0.232744
vt 0.712776 0.000003
vt 0.221926 0.061588
vt 0.285951 0.000000
vt 0.285945 0.999818
vt 0.221920 0.938229
vt 0.712771 0.999818
vt 0.009578 0.589789
vt 0.989138 0.589792
vt 0.960721 0.679031
vt 0.286638 0.000000
vt 0.777884 0.061589
vt 0.222561 0.061589
vt 0.777608 0.938229
vt 0.222164 0.938229
vt 0.146413 0.853527
vt 0.286255 0.999818
vt 0.713517 0.999818
vt 0.776800 0.061592
vt 0.146251 0.146290
vt 0.000000 0.499907
vt 0.989139 0.410032
vt 0.998734 0.499910
vt 0.853618 0.146291
vt 0.915772 0.232746
vt 0.146826 0.146290
vt 0.961957 0.320789
vt 0.084672 0.232745
vt 0.990397 0.410029
vt 0.038487 0.320789
vt 0.776796 0.938230
vt 0.777790 0.938229
vt 0.146467 0.853526
vt 0.853556 0.853527
vt 0.146825 0.853526
vt 1.000000 0.499907
vt 0.010047 0.410028
vt 0.146246 0.853527
vt 0.222559 0.938228
vt 0.777882 0.938230
vt 0.915737 0.767073
vt 0.084287 0.767072
vt 0.038083 0.679029
vt 0.961941 0.679029
vt 0.037995 0.679029
vt 0.960723 0.320792
vt 0.037998 0.320787
vt 0.009580 0.410028
vt 0.990167 0.589790
vt 0.999772 0.499909
vt 0.961721 0.679029
vt 0.084246 0.767072
vt 0.915526 0.767072
vt 0.853359 0.853527
vt 0.914573 0.767074
vt 0.084142 0.767072
vt 0.852470 0.853528
vt 0.777609 0.061590
vt 0.853360 0.146293
vt 0.222166 0.061589
vt 0.146414 0.146291
vt 0.915527 0.232748
vt 0.084247 0.232746
vt 0.961721 0.320791
vt 0.038052 0.320789
vt 0.990167 0.410031
vt 0.713686 0.999818
vt 0.749950 0.250050
vt 0.749950 0.749950
vt 0.250050 0.749950
vt 0.250050 0.250050
vt 0.713807 0.000000
vt 0.286258 0.000000
vt 0.713519 0.000001
vt 0.250050 0.250050
vt 0.749950 0.250050
vt 0.749950 0.749950
vt 0.286636 0.999817
vt 0.777791 0.061589
vt 0.146467 0.146291
vt 0.084287 0.232745
vt 0.915737 0.232746
vt 0.961941 0.320789
vt 0.000444 0.499907
vt 0.713687 0.000000
vt 0.713805 0.999818
vn -0.620400 0.479600 0.620400
vn -0.683900 0.254100 0.683900
vn 0.683900 0.254100 0.683900
vn 0.531000 0.660300 0.531000
vn -0.531000 0.660300 0.531000
vn 0.620400 0.479600 0.620400
vn -0.429700 -0.794100 0.429700
vn -0.531000 -0.660300 0.531000
vn -0.531000 -0.660300 -0.531000
vn -0.185700 -0.964900 0.185700
vn -0.325800 -0.887500 -0.325800
vn -0.185700 -0.964900 -0.185700
vn -0.185700 0.964900 -0.185700
vn -0.325800 0.887500 -0.325800
vn -0.185700 0.964900 0.185700
vn -0.683900 0.254000 -0.683900
vn 0.325800 -0.887500 0.325800
vn -0.325800 -0.887500 0.325800
vn 0.325800 0.887500 -0.325800
vn 0.429700 0.794100 -0.429700
vn 0.185700 0.964900 -0.185700
vn -0.429700 -0.794100 -0.429700
vn -0.707100 0.000000 -0.707100
vn -0.683900 -0.254100 0.683900
vn -0.707100 0.000000 0.707100
vn 0.429700 -0.794100 0.429700
vn 0.531000 -0.660300 0.531000
vn 0.620400 -0.479600 0.620400
vn 0.683900 -0.254100 0.683900
vn -0.620400 -0.479600 0.620400
vn -0.325800 0.887500 0.325800
vn 0.185700 0.964900 0.185700
vn 0.325800 0.887500 0.325800
vn 0.429700 0.794100 0.429700
vn -0.429700 0.794100 0.429700
vn 0.707100 0.000000 0.707100
vn -0.429700 0.794100 -0.429700
vn 0.531000 0.660300 -0.531000
vn 0.683900 0.254100 -0.683900
vn 0.707100 0.000000 -0.707100
vn 0.620400 0.479600 -0.620400
vn -0.620400 0.479600 -0.620400
vn -0.620400 -0.479600 -0.620400
vn -0.683900 -0.254000 -0.683900
vn 0.683900 -0.254100 -0.683900
vn -0.531000 0.660300 -0.531000
vn 0.325800 -0.887500 -0.325800
vn 0.429700 -0.794100 -0.429700
vn 0.531000 -0.660300 -0.531000
vn 0.620400 -0.479600 -0.620400
vn 0.185700 -0.964900 -0.185700
vn 0.185700 -0.964900 0.185700
s 1
f 30/1/1 32/2/2 26/3/3
f 33/4/4 35/5/5 29/6/6
f 12/7/7 17/8/8 49/9/9
f 2/10/10 52/11/11 4/12/12
f 6/13/13 48/14/14 43/15/15
f 34/16/16 32/17/2 30/18/1
f 2/19/10 9/20/17 10/21/18
f 48/22/14 45/23/19 42/24/20
f 5/25/21 45/23/19 6/26/13
f 10/27/18 12/7/7 51/28/22
f 19/29/23 27/30/24 13/31/25
f 9/20/17 11/32/26 10/21/18
f 11/32/26 14/33/27 12/34/7
f 14/33/27 20/35/28 17/36/8
f 20/35/28 23/37/29 21/38/30
f 43/15/15 48/14/14 15/39/31
f 7/25/32 16/23/33 45/40/19
f 18/41/34 42/42/20 45/40/19
f 29/6/6 30/1/1 26/3/3
f 22/43/35 33/4/4 18/42/34
f 26/3/3 32/2/2 8/44/36
f 8/44/36 27/45/24 23/37/29
f 11/32/26 12/34/7 10/21/18
f 14/33/27 17/36/8 12/34/7
f 20/35/28 21/38/30 17/36/8
f 23/37/29 27/45/24 21/38/30
f 10/27/18 52/11/11 2/10/10
f 15/39/31 48/14/14 44/46/37
f 22/43/35 35/5/5 33/4/4
f 15/47/31 22/43/35 16/48/33
f 37/49/38 42/42/20 18/41/34
f 33/50/4 29/51/6 37/49/38
f 8/29/36 25/3/39 26/16/3
f 24/44/40 25/3/39 8/29/36
f 29/51/6 26/16/3 31/52/41
f 26/16/3 25/3/39 31/52/41
f 29/51/6 31/52/41 37/49/38
f 38/53/42 34/16/16 30/18/1
f 19/29/23 32/17/2 34/16/16
f 13/31/25 32/17/2 19/29/23
f 17/8/8 21/54/30 46/55/43
f 21/54/30 27/30/24 41/56/44
f 8/29/36 28/37/45 24/44/40
f 34/57/16 25/16/39 19/58/23
f 38/59/42 31/51/41 34/57/16
f 31/51/41 25/16/39 34/57/16
f 37/60/38 38/59/42 39/61/46
f 37/60/38 31/51/41 38/59/42
f 44/62/37 42/24/20 37/60/38
f 38/53/42 30/18/1 35/63/5
f 39/64/46 35/63/5 22/65/35
f 52/66/11 51/67/22 50/68/47
f 51/67/22 47/69/48 50/68/47
f 51/67/22 49/70/9 47/69/48
f 49/70/9 40/71/49 47/69/48
f 49/70/9 46/72/43 40/71/49
f 46/72/43 36/73/50 40/71/49
f 19/58/23 28/56/45 41/74/44
f 46/72/43 41/74/44 36/73/50
f 41/74/44 28/56/45 36/73/50
f 22/43/35 18/42/34 16/48/33
f 5/75/21 7/25/32 45/40/19
f 2/76/10 4/77/12 1/78/51 3/79/52
f 44/62/37 48/22/14 42/24/20
f 35/5/5 30/1/1 29/6/6
f 3/80/52 9/20/17 2/19/10
f 45/23/19 48/22/14 6/26/13
f 1/81/51 52/66/11 50/68/47
f 39/61/46 44/62/37 37/60/38
f 52/66/11 1/81/51 4/82/12
f 24/29/40 28/56/45 19/58/23
f 7/78/32 5/83/21 6/84/13 43/85/15
f 24/29/40 19/58/23 25/16/39
f 15/47/31 16/48/33 43/86/15
f 22/65/35 44/46/37 39/64/46
f 39/64/46 38/53/42 35/63/5
f 41/56/44 27/30/24 19/29/23
f 46/55/43 21/54/30 41/56/44
f 49/9/9 17/8/8 46/55/43
f 51/28/22 12/7/7 49/9/9
f 52/11/11 10/27/18 51/28/22
f 9/68/17 50/87/47 11/88/26
f 50/87/47 47/32/48 11/88/26
f 11/88/26 47/32/48 14/89/27
f 47/32/48 40/90/49 14/89/27
f 14/89/27 40/90/49 20/73/28
f 40/90/49 36/91/50 20/73/28
f 23/56/29 28/37/45 8/29/36
f 20/73/28 36/91/50 23/56/29
f 36/91/50 28/37/45 23/56/29
f 13/92/25 8/44/36 32/2/2
f 50/87/47 9/68/17 1/93/51
f 13/92/25 27/45/24 8/44/36
f 16/23/33 18/41/34 45/40/19
f 22/65/35 15/39/31 44/46/37
f 9/68/17 3/81/52 1/93/51
f 33/50/4 37/49/38 18/41/34
f 43/86/15 16/48/33 7/94/32

View File

@ -1,132 +0,0 @@
# Blender v2.73 (sub 0) OBJ File: 'slope_test_quarter_round_onetexture.blend'
# www.blender.org
o Cylinder
v -0.500000 0.490393 -0.097545
v 0.500000 0.490393 -0.097545
v -0.500000 0.461940 -0.191342
v 0.500000 0.461940 -0.191342
v -0.500000 0.415735 -0.277785
v 0.500000 0.415735 -0.277785
v -0.500000 0.353553 -0.353553
v 0.500000 0.353553 -0.353553
v -0.500000 0.277785 -0.415735
v 0.500000 0.277785 -0.415735
v -0.500000 0.191342 -0.461940
v 0.500000 0.191342 -0.461940
v -0.500000 0.097545 -0.490393
v 0.500000 0.097545 -0.490393
v 0.500000 -0.000000 -0.500000
v 0.500000 0.490393 -0.097545
v -0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.000000 -0.500000
v -0.500000 0.500000 -0.000000
v 0.500000 0.500000 0.000000
v -0.500000 0.490393 -0.097545
v -0.500000 0.461940 -0.191342
v -0.500000 0.415735 -0.277785
v -0.500000 0.353553 -0.353553
v -0.500000 0.277785 -0.415735
v -0.500000 0.191342 -0.461940
v -0.500000 0.097545 -0.490393
v -0.500000 0.000000 0.000000
v -0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 0.500000 0.500000
v -0.500000 0.000000 -0.500000
v -0.500000 0.500000 -0.000000
v 0.500000 0.461940 -0.191342
v 0.500000 0.415735 -0.277785
v 0.500000 0.353553 -0.353553
v 0.500000 0.277785 -0.415735
v 0.500000 0.191342 -0.461940
v 0.500000 0.097545 -0.490393
v 0.500000 -0.000000 -0.500000
v 0.500000 -0.000000 -0.000000
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 0.500000 0.500000
v 0.500000 0.500000 0.000000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
vt 1.000000 0.000000
vt 1.000000 0.500000
vt 0.500001 0.500000
vt 0.500001 1.000000
vt 0.000003 1.000000
vt 0.000003 0.000000
vt 0.597546 0.990393
vt 0.691342 0.961940
vt 1.000000 1.000000
vt 0.990393 0.597545
vt 0.961940 0.691341
vt 0.777786 0.915735
vt 0.853554 0.853553
vt 0.915735 0.777785
vt 0.146446 0.853552
vt 0.084265 0.777783
vt 0.038060 0.691340
vt 0.308658 0.961938
vt 0.222214 0.915733
vt 0.000000 0.499999
vt 0.402454 0.990391
vt 0.009607 0.597544
vt 1.000000 0.375000
vt 0.000000 0.375000
vt 0.000000 0.250000
vt 1.000000 0.250000
vt 0.000000 0.125000
vt 1.000000 0.125000
vt 0.000000 0.875000
vt 1.000000 0.875000
vt 0.000000 0.750000
vt 1.000000 0.750000
vt 0.000000 0.625000
vt 1.000000 0.625000
vn 1.000000 -0.000000 0.000000
vn -0.000000 0.000000 1.000000
vn -0.000000 -1.000000 0.000000
vn -1.000000 0.000000 0.000000
vn 0.000000 0.980800 -0.195100
vn 0.000000 0.923900 -0.382700
vn -0.000000 0.831500 -0.555600
vn -0.000000 0.707100 -0.707100
vn -0.000000 0.555600 -0.831500
vn -0.000000 0.382700 -0.923900
vn -0.000000 0.195100 -0.980800
vn 0.000000 1.000000 -0.000000
vn 0.000000 0.998800 -0.049100
vn -0.000000 0.049100 -0.998800
vn -0.000000 0.000000 -1.000000
s off
f 46/1/1 44/2/1 45/3/1 49/4/1 48/5/1 47/6/1
f 16/7/1 49/4/1 45/3/1 38/8/1
f 55/5/2 53/6/2 54/1/2 56/9/2
f 43/10/1 42/11/1 45/3/1 44/2/1
f 39/12/1 38/8/1 45/3/1 40/13/1
f 41/14/1 40/13/1 45/3/1 42/11/1
f 50/9/3 51/5/3 52/6/3 17/1/3
f 28/15/4 29/16/4 30/17/4 32/3/4
f 26/18/4 27/19/4 28/15/4 32/3/4
f 35/9/4 37/4/4 32/3/4 36/20/4 34/6/4 33/1/4
f 37/4/4 25/21/4 26/18/4 32/3/4
f 30/17/4 31/22/4 36/20/4 32/3/4
s 1
f 1/23/5 2/24/5 4/25/6 3/26/6
f 3/26/6 4/25/6 6/27/7 5/28/7
f 5/28/7 6/27/7 8/6/8 7/1/8
f 7/9/8 8/5/8 10/29/9 9/30/9
f 9/30/9 10/29/9 12/31/10 11/32/10
f 11/32/10 12/31/10 14/33/11 13/34/11
f 21/5/12 24/20/13 23/2/13 20/9/12
f 13/34/11 14/33/11 15/20/14 22/2/14
f 23/2/13 24/20/13 2/24/5 1/23/5
f 18/1/15 22/2/14 15/20/14 19/6/15

View File

@ -1,23 +0,0 @@
# Blender v2.73 (sub 0) OBJ File: 'technic-ocorner.blend'
# www.blender.org
o Cube_Cube.002
v -0.500000 0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vn 0.000000 -1.000000 -0.000000
vn 0.000000 0.000000 1.000000
vn -1.000000 -0.000000 0.000000
vn -0.000000 0.707100 -0.707100
vn 0.707100 0.707100 -0.000000
s off
f 3/1/1 2/2/1 4/3/1 5/4/1
f 1/2/2 3/3/2 5/4/2
f 1/1/3 2/3/3 3/4/3
f 1/1/4 4/3/4 2/4/4
f 1/2/5 5/3/5 4/4/5

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