Merge remote-tracking branch 'origin/master' into HEAD

This commit is contained in:
Thomas Rudin 2018-09-19 11:28:26 +02:00
commit e1a8876fc4
36 changed files with 1177 additions and 499 deletions

View File

@ -4,3 +4,5 @@ concrete
unifieddyes? unifieddyes?
intllib? intllib?
moreblocks? moreblocks?
steel?
streetsmod?

View File

@ -103,7 +103,7 @@ if minetest.get_modpath("moreblocks") then
end end
local iclip_def = { local iclip_def = {
description = "Insulator/cable clip", description = S("Insulator/cable clip"),
drawtype = "mesh", drawtype = "mesh",
mesh = "technic_insulator_clip.obj", mesh = "technic_insulator_clip.obj",
tiles = {"technic_insulator_clip.png"}, tiles = {"technic_insulator_clip.png"},
@ -113,7 +113,7 @@ local iclip_def = {
} }
local iclipfence_def = { local iclipfence_def = {
description = "Insulator/cable clip", description = S("Insulator/cable clip"),
tiles = {"technic_insulator_clip.png"}, tiles = {"technic_insulator_clip.png"},
is_ground_content = false, is_ground_content = false,
paramtype = "light", paramtype = "light",
@ -146,27 +146,60 @@ local iclipfence_def = {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
} }
local sclip_tex = {
"technic_insulator_clip.png",
{ name = "strut.png^steel_strut_overlay.png", color = "white" },
{ name = "strut.png", color = "white" }
}
local streetsmod = minetest.get_modpath("streets") or minetest.get_modpath ("steelsupport")
-- cheapie's fork breaks it into several individual mods, with differernt names for the same content.
if streetsmod then
sclip_tex = {
"technic_insulator_clip.png",
{ name = "streets_support.png^technic_steel_strut_overlay.png", color = "white" },
{ name = "streets_support.png", color = "white" }
}
end
local sclip_def = {
description = S("Steel strut with insulator/cable clip"),
drawtype = "mesh",
mesh = "technic_steel_strut_with_insulator_clip.obj",
tiles = sclip_tex,
paramtype = "light",
paramtype2 = "wallmounted",
is_ground_content = false,
sounds = default.node_sound_stone_defaults(),
groups = { choppy=1, cracky=1 },
backface_culling = false
}
if minetest.get_modpath("unifieddyes") then if minetest.get_modpath("unifieddyes") then
iclip_def.paramtype2 = "colorwallmounted" iclip_def.paramtype2 = "colorwallmounted"
iclip_def.palette = "unifieddyes_palette_colorwallmounted.png" iclip_def.palette = "unifieddyes_palette_colorwallmounted.png"
iclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing) iclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing)
unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing)
end 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} iclip_def.groups = {choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1}
iclipfence_def.paramtype2 = "color" iclipfence_def.paramtype2 = "color"
iclipfence_def.palette = "unifieddyes_palette_extended.png" iclipfence_def.palette = "unifieddyes_palette_extended.png"
iclipfence_def.on_construct = unifieddyes.on_construct 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.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
sclip_def.paramtype2 = "colorwallmounted"
sclip_def.palette = "unifieddyes_palette_colorwallmounted.png"
sclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing)
unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
end
sclip_def.groups = {choppy=1, cracky=1, ud_param2_colorable = 1}
end end
minetest.register_node(":technic:insulator_clip", iclip_def) minetest.register_node(":technic:insulator_clip", iclip_def)
minetest.register_node(":technic:insulator_clip_fencepost", iclipfence_def) minetest.register_node(":technic:insulator_clip_fencepost", iclipfence_def)
minetest.register_node(":technic:steel_strut_with_insulator_clip", sclip_def)
minetest.register_craft({ minetest.register_craft({
output = "technic:insulator_clip", output = "technic:insulator_clip",
@ -185,3 +218,94 @@ minetest.register_craft({
{ "technic:raw_latex", "default:fence_wood", "technic:raw_latex"}, { "technic:raw_latex", "default:fence_wood", "technic:raw_latex"},
} }
}) })
local steelmod = minetest.get_modpath("steel")
if steelmod then
minetest.register_craft({
output = "technic:steel_strut_with_insulator_clip",
recipe = {
{"technic:insulator_clip_fencepost"},
{"steel:strut_mount"}
}
})
minetest.register_craft({
output = "technic:steel_strut_with_insulator_clip",
recipe = {
{"technic:insulator_clip_fencepost", "" },
{"steel:strut", "default:steel_ingot" },
}
})
end
if streetsmod then
minetest.register_craft({
output = "technic:steel_strut_with_insulator_clip",
recipe = {
{"technic:insulator_clip_fencepost", "" },
{"streets:steel_support", "default:steel_ingot" },
}
})
end
if minetest.get_modpath("unifieddyes") then
unifieddyes.register_color_craft({
output = "technic:insulator_clip_fencepost",
palette = "extended",
type = "shapeless",
neutral_node = "technic:insulator_clip_fencepost",
recipe = {
"NEUTRAL_NODE",
"MAIN_DYE"
}
})
unifieddyes.register_color_craft({
output = "technic:insulator_clip",
palette = "wallmounted",
type = "shapeless",
neutral_node = "technic:insulator_clip",
recipe = {
"NEUTRAL_NODE",
"MAIN_DYE"
}
})
unifieddyes.register_color_craft({
output = "technic:steel_strut_with_insulator_clip",
palette = "wallmounted",
type = "shapeless",
neutral_node = "",
recipe = {
"technic:steel_strut_with_insulator_clip",
"MAIN_DYE"
}
})
if steelmod then
unifieddyes.register_color_craft({
output = "technic:steel_strut_with_insulator_clip",
palette = "wallmounted",
neutral_node = "",
recipe = {
{ "technic:insulator_clip_fencepost", "MAIN_DYE" },
{ "steel:strut_mount", "" },
}
})
end
if streetsmod then
unifieddyes.register_color_craft({
output = "technic:steel_strut_with_insulator_clip",
palette = "wallmounted",
neutral_node = "technic:steel_strut_with_insulator_clip",
recipe = {
{ "technic:insulator_clip_fencepost", "MAIN_DYE" },
{ "streets:steel_support", "default:steel_ingot" },
}
})
end
end

View File

@ -0,0 +1,246 @@
# Blender v2.79 (sub 0) OBJ File: 'technic steel strut with insulator clip.blend'
# www.blender.org
o Cube_Cube_Material.001
v -0.375000 0.500532 -0.250000
v -0.249997 0.562500 -0.249997
v 0.249997 0.562500 -0.249997
v 0.375000 0.500532 -0.250000
v 0.249997 0.562500 0.249997
v 0.375000 0.500532 0.250000
v -0.249997 0.562500 0.249997
v -0.375000 0.500532 0.250000
v 0.187500 0.562500 -0.187500
v -0.168668 0.718750 0.168668
v 0.168668 0.718750 0.168668
v 0.187500 0.750000 0.187500
v -0.187500 0.750000 0.187500
v 0.168668 0.718750 -0.168668
v 0.187500 0.750000 -0.187500
v -0.168668 0.718750 -0.168668
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 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.250000 0.750000 0.250000
v -0.168668 0.593750 0.168668
v 0.168668 0.593750 0.168668
v 0.187500 0.625000 0.187500
v -0.187500 0.625000 0.187500
v 0.168668 0.593750 -0.168668
v 0.187500 0.625000 -0.187500
v -0.168668 0.593750 -0.168668
v -0.187500 0.625000 -0.187500
v -0.168668 0.656250 0.168668
v 0.168668 0.656250 0.168668
v 0.187500 0.687500 0.187500
v -0.187500 0.687500 0.187500
v 0.168668 0.656250 -0.168668
v 0.187500 0.687500 -0.187500
v -0.168668 0.656250 -0.168668
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.562500 -0.187500
v -0.499468 -0.499468 -0.499468
v -0.499468 0.500000 -0.499468
v 0.499468 -0.499468 -0.499468
v -0.499468 -0.499468 0.499468
v -0.499468 0.500000 0.499468
v 0.499468 -0.499468 0.499468
v 0.499468 0.500000 -0.499468
v 0.499468 0.500000 0.499468
vt 1.000000 0.875000
vt 0.937500 0.750000
vt 0.937500 0.250000
vt 1.000000 0.125000
vt 0.250000 0.875000
vt 0.250000 0.750000
vt 0.750000 0.750000
vt 0.750000 0.875000
vt 0.000000 0.125000
vt 0.062500 0.250000
vt 0.062500 0.750000
vt 0.000000 0.875000
vt 0.750000 0.250000
vt 0.687500 0.687500
vt 0.687500 0.312500
vt 0.312500 0.687500
vt 0.250000 0.250000
vt 0.312500 0.312500
vt 0.331332 1.218750
vt 0.668668 1.218750
vt 0.687500 1.250000
vt 0.312500 1.250000
vt 0.531250 0.666667
vt 0.531250 0.333333
vt 0.500000 0.312500
vt 0.500000 0.687500
vt 0.531250 0.333333
vt 0.531250 0.666667
vt 0.500000 0.687500
vt 0.500000 0.312500
vt 0.331332 1.218750
vt 0.668668 1.218750
vt 0.687500 1.250000
vt 0.312500 1.250000
vt 0.687500 0.312500
vt 0.750000 0.250000
vt 0.750000 0.750000
vt 0.687500 0.687500
vt 0.500000 0.250000
vt 0.500000 0.750000
vt 0.000000 0.750000
vt 0.000000 0.250000
vt 0.500000 0.250000
vt 0.000000 0.250000
vt 0.000000 0.750000
vt 0.500000 0.750000
vt 0.500000 0.250000
vt 0.500000 0.750000
vt 0.000000 0.750000
vt 0.000000 0.250000
vt 0.000000 0.250000
vt 0.500000 0.750000
vt 0.250000 0.250000
vt 0.750000 0.250000
vt 0.750000 0.750000
vt 0.250000 0.750000
vt 0.250000 0.750000
vt 0.312500 0.687500
vt 0.250000 0.250000
vt 0.312500 0.312500
vt 0.250000 0.125000
vt 0.750000 0.125000
vt 0.331332 1.093750
vt 0.668668 1.093750
vt 0.687500 1.125000
vt 0.312500 1.125000
vt 0.656250 0.666667
vt 0.656250 0.333333
vt 0.625000 0.312500
vt 0.625000 0.687500
vt 0.656250 0.333333
vt 0.656250 0.666667
vt 0.625000 0.687500
vt 0.625000 0.312500
vt 0.331332 1.093750
vt 0.668668 1.093750
vt 0.687500 1.125000
vt 0.312500 1.125000
vt 0.331332 1.156250
vt 0.668668 1.156250
vt 0.687500 1.187500
vt 0.312500 1.187500
vt 0.593750 0.666667
vt 0.593750 0.333333
vt 0.562500 0.312500
vt 0.562500 0.687500
vt 0.593750 0.333333
vt 0.593750 0.666667
vt 0.562500 0.687500
vt 0.562500 0.312500
vt 0.331332 1.156250
vt 0.668668 1.156250
vt 0.687500 1.187500
vt 0.312500 1.187500
vt 0.312500 1.062500
vt 0.687500 1.062500
vt 0.687500 0.312500
vt 0.687500 0.312500
vt 0.687500 0.687500
vt 0.312500 1.062500
vt 0.687500 1.062500
vt 0.000000 0.750000
vt 0.000000 0.250000
vt 1.000000 0.250000
vt 1.000000 0.750000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.000000 -0.000000
vt 1.000000 -0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.000000 -0.000000
vt 1.000000 -0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 1.000000 -0.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 0.000000 0.000000
vt -0.000000 0.000000
vn 0.0000 0.0000 -1.0000
vn 0.4442 0.8960 -0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 -0.0000
vn 0.0000 -0.5161 0.8565
vn 0.8565 -0.5161 0.0000
vn -0.8565 -0.5161 0.0000
vn 0.0000 -0.5161 -0.8565
vn -0.0000 -1.0000 -0.0000
vn 1.0000 -0.0000 0.0000
vn -1.0000 0.0000 -0.0000
vn -0.4442 0.8960 -0.0000
vn -0.0000 0.5161 0.8565
vn 0.8565 0.5161 -0.0000
vn -0.8565 0.5161 -0.0000
vn 0.0000 0.5161 -0.8565
g Cube_Cube_Material.001_Cube_Cube_Material.001_clip
s 1
f 1/1/1 2/2/1 3/3/1 4/4/1
f 4/5/2 3/6/2 5/7/2 6/8/2
f 6/9/3 5/10/3 7/11/3 8/12/3
f 7/13/4 5/7/4 42/14/4 43/15/4
f 5/7/4 3/6/4 9/16/4 42/14/4
f 2/17/4 7/13/4 43/15/4 44/18/4
f 3/6/4 2/17/4 44/18/4 9/16/4
f 10/19/5 11/20/5 12/21/5 13/22/5
f 11/23/6 14/24/6 15/25/6 12/26/6
f 16/27/7 10/28/7 13/29/7 17/30/7
f 14/31/8 16/32/8 17/33/8 15/34/8
f 15/35/9 18/36/9 19/37/9 12/38/9
f 20/39/1 21/40/1 22/41/1 18/42/1
f 18/43/10 22/44/10 23/45/10 19/46/10
f 19/47/3 23/48/3 24/49/3 25/50/3
f 21/51/11 20/39/11 25/52/11 24/49/11
f 21/53/4 24/54/4 23/55/4 22/56/4
f 12/38/9 19/37/9 25/57/9 13/58/9
f 13/58/9 25/57/9 20/59/9 17/60/9
f 17/60/9 20/59/9 18/36/9 15/35/9
f 2/17/12 1/61/12 8/62/12 7/13/12
f 26/63/5 27/64/5 28/65/5 29/66/5
f 27/67/6 30/68/6 31/69/6 28/70/6
f 32/71/7 26/72/7 29/73/7 33/74/7
f 30/75/8 32/76/8 33/77/8 31/78/8
f 34/79/5 35/80/5 36/81/5 37/82/5
f 35/83/6 38/84/6 39/85/6 36/86/6
f 40/87/7 34/88/7 37/89/7 41/90/7
f 38/91/8 40/92/8 41/93/8 39/94/8
f 37/82/13 36/81/13 11/20/13 10/19/13
f 36/86/14 39/85/14 14/24/14 11/23/14
f 41/90/15 37/89/15 10/28/15 16/27/15
f 39/94/16 41/93/16 16/32/16 14/31/16
f 43/95/13 42/96/13 27/64/13 26/63/13
f 42/14/14 9/97/14 30/68/14 27/67/14
f 44/98/15 43/99/15 26/72/15 32/71/15
f 9/100/16 44/101/16 32/76/16 30/75/16
f 29/66/13 28/65/13 35/80/13 34/79/13
f 28/70/14 31/69/14 38/84/14 35/83/14
f 33/74/15 29/73/15 34/88/15 40/87/15
f 31/78/16 33/77/16 40/92/16 38/91/16
f 8/102/9 1/103/9 4/104/9 6/105/9
g Cube_Cube_Material.001_Cube_Cube_Material.001_sides_with_band
s off
f 47/106/10 51/107/10 52/108/10 50/109/10
f 48/110/11 49/111/11 46/112/11 45/113/11
f 47/114/9 50/115/9 48/116/9 45/117/9
f 51/118/4 46/112/4 49/111/4 52/119/4
g Cube_Cube_Material.001_Cube_Cube_Material.001_sides_without_band
f 45/113/1 46/120/1 51/107/1 47/121/1
f 50/109/3 52/119/3 49/111/3 48/122/3

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 B

View File

@ -14,8 +14,13 @@ The technic modpack depends on some other modpacks:
* pipeworks, which supports the automation of item transport * pipeworks, which supports the automation of item transport
* moreores, which provides some additional ore types * moreores, which provides some additional ore types
This manual doesn't explain how to use these other modpacks, which ought This manual doesn't explain how to use these other modpacks, which have
to (but actually don't) have their own manuals. their own manuals:
* [Minetest Game Documentation](https://wiki.minetest.net/Main_Page)
* [Mesecons Documentation](http://mesecons.net/items.html)
* [Pipeworks Documentation](https://github.com/minetest-mods/pipeworks/wiki)
* [Moreores Forum Post](https://forum.minetest.net/viewtopic.php?t=549)
Recipes for constructable items in technic are generally not guessable, Recipes for constructable items in technic are generally not guessable,
and are also not specifically documented here. You should use a and are also not specifically documented here. You should use a
@ -68,10 +73,11 @@ own for its electrical conductivity, or as the base component of alloys.
Although common, it is very heavily used, and most of the time it will Although common, it is very heavily used, and most of the time it will
be the material that most limits your activity. be the material that most limits your activity.
Tin is supplied by the moreores mod. It is found from elevation +8 Tin is part of the basic Minetest game (having migrated there from
downwards, with no elevation-dependent variations in abundance beyond moreores). It is found from elevation +8 downwards, with no
that point. It is a common metal. Its main use in pure form is as a elevation-dependent variations in abundance beyond that point.
component of electrical batteries. Apart from that its main purpose is It is a common metal. Its main use in pure form is as a component
of electrical batteries. Apart from that its main purpose is
as the secondary ingredient in bronze (the base being copper), but bronze as the secondary ingredient in bronze (the base being copper), but bronze
is itself little used. Its abundance is well in excess of its usage, is itself little used. Its abundance is well in excess of its usage,
so you will usually have a surplus of it. so you will usually have a surplus of it.
@ -986,7 +992,7 @@ through a side.
The furnace, alloy furnace, grinder, extractor, compressor, and centrifuge The furnace, alloy furnace, grinder, extractor, compressor, and centrifuge
have much in common. Each implements some industrial process that have much in common. Each implements some industrial process that
transforms items into other items, and they manner in which they present transforms items into other items, and the manner in which they present
these processes as powered machines is essentially identical. these processes as powered machines is essentially identical.
Most of the processing machines operate on inputs of only a single type Most of the processing machines operate on inputs of only a single type
@ -1011,7 +1017,7 @@ input slot, this is perfectly simple behavior. The alloy furnace is more
complex: it will put an arriving item in either input slot, preferring to complex: it will put an arriving item in either input slot, preferring to
stack it with existing items of the same type. It doesn't matter which stack it with existing items of the same type. It doesn't matter which
slot each of the alloy furnace's inputs is in, so it doesn't matter that slot each of the alloy furnace's inputs is in, so it doesn't matter that
there's no direct control ovar that, but there is a risk that supplying there's no direct control over that, but there is a risk that supplying
a lot of one item type through tubes will result in both slots containing a lot of one item type through tubes will result in both slots containing
the same type of item, leaving no room for the second input. the same type of item, leaving no room for the second input.
@ -1195,7 +1201,7 @@ power generators
### fuel-fired generators ### ### fuel-fired generators ###
The fiel-fired generators are electrical power generators that generate The fuel-fired generators are electrical power generators that generate
power by the combustion of fuel. Versions of them are available for power by the combustion of fuel. Versions of them are available for
all three voltages (LV, MV, and HV). These are all capable of burning all three voltages (LV, MV, and HV). These are all capable of burning
any type of combustible fuel, such as coal. They are relatively easy any type of combustible fuel, such as coal. They are relatively easy

View File

@ -164,7 +164,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'},
{'moreores:tin_ingot', 'moreores:tin_ingot', 'moreores:tin_ingot'}, {'default:tin_ingot', 'default:tin_ingot', 'default:tin_ingot'},
} }
}) })

View File

@ -11,9 +11,12 @@ switching station handles the network activity.
Helper functions 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)` * `technic.pretty_num(num)`
* Converts the number `num` to a human-readable string. * Converts the number `num` to a human-readable string with SI prefixes
* Use this function when showing players power values.
* `technic.swap_node(pos, nodename)` * `technic.swap_node(pos, nodename)`
* Same as `mintest.swap_node` but it only changes the nodename. * Same as `mintest.swap_node` but it only changes the nodename.
* It uses `minetest.get_node` before swapping to ensure the new nodename * It uses `minetest.get_node` before swapping to ensure the new nodename

View File

@ -1,23 +1,56 @@
local digit_sep_esc local constant_digit_count = technic.config:get("constant_digit_count")
do
local sep = technic.config:get("digit_separator")
sep = tonumber(sep) and string.char(sep) or sep or " "
-- Escape for gsub
for magic in ("().%+-*?[^$"):gmatch(".") do
if sep == magic then
sep = "%"..sep
end
end
digit_sep_esc = sep
end
-- converts a number to a readable string with SI prefix, e.g. 10000 → "10 k",
-- 15 → "15 ", 0.1501 → "150.1 m"
-- 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) function technic.pretty_num(num)
local str, k = tostring(num), nil -- the small number added is due to floating point inaccuracy
repeat local b = math.floor(math.log10(math.abs(num)) +0.000001)
str, k = str:gsub("^(-?%d+)(%d%d%d)", "%1"..digit_sep_esc.."%2") local pref_i
until k == 0 if b ~= 0 then
return str -- 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
num = num * 10 ^ (-3 * pref_i)
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 end

View File

@ -48,7 +48,7 @@ local twosize_products = {
} }
local cnc_formspec = local cnc_formspec =
"invsize[9,11;]".. "size[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; ]"..

View File

@ -35,7 +35,8 @@ local run = function(pos, node)
local charge_to_give = math.floor((light + pos1.y) * 3) local charge_to_give = math.floor((light + pos1.y) * 3)
charge_to_give = math.max(charge_to_give, 0) charge_to_give = math.max(charge_to_give, 0)
charge_to_give = math.min(charge_to_give, 200) charge_to_give = math.min(charge_to_give, 200)
meta:set_string("infotext", S("@1 Active (@2 EU)", machine_name, technic.pretty_num(charge_to_give))) 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) meta:set_int("LV_EU_supply", charge_to_give)
else else
meta:set_string("infotext", S("%s Idle"):format(machine_name)) meta:set_string("infotext", S("%s Idle"):format(machine_name))

View File

@ -1,6 +1,6 @@
-- 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 120EUs) -- It is a LV EU supplyer and fairly low yield (max 180EUs)
-- It is a little under half as good as the thermal generator. -- It is a little over half as good as the thermal generator.
local S = technic.getter local S = technic.getter
@ -29,11 +29,9 @@ end
local run = function(pos, node) local run = function(pos, node)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local water_flow = 0 local water_flow = 0
local lava_nodes = 0
local production_level = 0 local production_level = 0
local eu_supply = 0 local eu_supply = 0
local max_output = 35 * 45 -- four param2's at 15 makes 60, cap it lower for "overload protection" local max_output = 4 * 45 -- keeping it around 180, little more than previous 150 :)
-- (plus we want the gen to report 100% if three sides have full flow)
local positions = { local positions = {
{x=pos.x+1, y=pos.y, z=pos.z}, {x=pos.x+1, y=pos.y, z=pos.z},
@ -49,7 +47,7 @@ local run = function(pos, node)
end end
end end
eu_supply = math.min(35 * water_flow, max_output) eu_supply = math.min(4 * water_flow, max_output)
production_level = math.floor(100 * eu_supply / max_output) production_level = math.floor(100 * eu_supply / max_output)
meta:set_int("LV_EU_supply", eu_supply) meta:set_int("LV_EU_supply", eu_supply)

View File

@ -0,0 +1,105 @@
-- 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,6 +13,7 @@ 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")

View File

@ -19,7 +19,7 @@ minetest.register_craft({
local workshop_demand = {5000, 3500, 2000} local workshop_demand = {5000, 3500, 2000}
local workshop_formspec = local workshop_formspec =
"invsize[8,9;]".. "size[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_name;upgrade1;1,3;1,1;]"..

View File

@ -60,7 +60,8 @@ local run = function(pos, node)
elseif check == true then elseif check == true then
local power = math.min(pos.y * 100, 5000) local power = math.min(pos.y * 100, 5000)
meta:set_int("MV_EU_supply", power) meta:set_int("MV_EU_supply", power)
meta:set_string("infotext", S("@1 (@2 EU)", machine_name, technic.pretty_num(power))) meta:set_string("infotext", S("@1 (@2)", machine_name,
technic.EU_string(power)))
end end
-- check == nil: assume nothing has changed -- check == nil: assume nothing has changed
end end

View File

@ -99,7 +99,7 @@ local function make_on(mark, length)
if node.name == "technic:constructor_mk"..mark.."_off" then if node.name == "technic:constructor_mk"..mark.."_off" then
technic.swap_node(pos, "technic:constructor_mk"..mark.."_on") technic.swap_node(pos, "technic:constructor_mk"..mark.."_on")
nodeupdate(pos) minetest.check_for_falling(pos)
for i = 1, length do for i = 1, length do
place_pos = vector.add(place_pos, dir) place_pos = vector.add(place_pos, dir)
local place_node = minetest.get_node(place_pos) local place_node = minetest.get_node(place_pos)
@ -113,7 +113,7 @@ local function make_off(mark)
return function(pos, node) return function(pos, node)
if node.name == "technic:constructor_mk"..mark.."_on" then if node.name == "technic:constructor_mk"..mark.."_on" then
technic.swap_node(pos,"technic:constructor_mk"..mark.."_off") technic.swap_node(pos,"technic:constructor_mk"..mark.."_off")
nodeupdate(pos) minetest.check_for_falling(pos)
end end
end end
end end

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") and minetest.get_modpath("unified_inventory") == nil local infinite_stacks = minetest.settings:get_bool("creative_mode")
and minetest.get_modpath("unified_inventory") == nil
local frames_pos = {} local frames_pos = {}
@ -12,45 +12,60 @@ 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 return 1 end if y_int > -0.45 and y_int < 0.45 and z_int > -0.45 and z_int < 0.45 then
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 return 2 end if y_int > -0.45 and y_int < 0.45 and z_int > -0.45 and z_int < 0.45 then
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 return 3 end if x_int > -0.45 and x_int < 0.45 and z_int > -0.45 and z_int < 0.45 then
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 return 4 end if x_int > -0.45 and x_int < 0.45 and z_int > -0.45 and z_int < 0.45 then
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 return 5 end if x_int > -0.45 and x_int < 0.45 and y_int > -0.45 and y_int < 0.45 then
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 return 6 end if x_int > -0.45 and x_int < 0.45 and y_int > -0.45 and y_int < 0.45 then
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
@ -68,7 +83,9 @@ 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 return true end if p.x == pos.x and p.y == pos.y and p.z == pos.z then
return true
end
end end
return false return false
end end
@ -100,22 +117,33 @@ 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 frames_pos[pos_to_string(npos)]) and not(pos_in_list(poslist,npos)) then 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
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()
nodelist[#(nodelist)+1] = {oldpos = pos, pos = vector.add(pos, vect), node = node, meta = meta} local timer = minetest.get_node_timer(pos)
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
@ -125,14 +153,20 @@ local function move_nodes_vect(poslist,vect,must_not_move,owner)
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, __)
@ -140,19 +174,20 @@ 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") ~= nil) and (string.find(name, "pipeworks") ~= nil)) return string.find(name, "tube") and string.find(name, "pipeworks")
end end
-- Frames -- Frames
for xm = 0, 1 do for xm = 0, 1 do
for xp = 0, 1 do for xp = 0, 1 do
@ -166,6 +201,7 @@ local b=7/16
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 },
@ -201,7 +237,7 @@ local nodeboxes= {
table.insert(nodeboxes, { -b, -b, -a, b, b, -b }) table.insert(nodeboxes, { -b, -b, -a, b, b, -b })
end end
local nameext=tostring(xm)..tostring(xp)..tostring(ym)..tostring(yp)..tostring(zm)..tostring(zp) local nameext = string.format("%d%d%d%d%d%d", xm, xp, ym, yp, zm, 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
@ -223,33 +259,44 @@ local nodeboxes= {
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={{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}} 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 }
}
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,-7+pface,-7+pface))) local newstate = tostring(1 - tonumber(string.sub(nodename, pface - 7, pface - 7)))
if pface <= 5 then if pface <= 5 then
nodename=string.sub(nodename,1,-7+pface-1)..newstate..string.sub(nodename,-7+pface+1) nodename = string.sub(nodename, 1, pface - 7 - 1)..newstate..string.sub(nodename, pface - 7 + 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()
@ -258,7 +305,9 @@ local nodeboxes= {
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
@ -268,11 +317,13 @@ local nodeboxes= {
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
@ -291,7 +342,7 @@ local nodeboxes= {
-- 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 = {x=pos.x, y=pos.y, z=pos.z} local pos_copy = vector.new(pos)
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
@ -346,15 +397,17 @@ minetest.register_entity("technic:frame_entity", {
set_node = function(self, node) set_node = function(self, node)
self.node = node self.node = node
local pos = self.object:getpos() local pos = vector.round(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
@ -379,8 +432,7 @@ 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 = self.object:getpos() local pos = vector.round(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,
@ -396,18 +448,21 @@ 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, -7+pface, -7+pface))) local newstate = tostring(1 - tonumber(string.sub(nodename, pface - 7, pface - 7)))
if pface <= 5 then if pface <= 5 then
nodename = string.sub(nodename, 1, -7+pface-1)..newstate..string.sub(nodename, -7+pface+1) nodename = string.sub(nodename, 1, pface - 7 - 1)..newstate..string.sub(nodename, pface - 7 + 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,
@ -417,14 +472,19 @@ 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
local pos_under = {x = math.floor(pos.x+0.5), y = math.floor(pos.y+0.5), z = math.floor(pos.z+0.5)} if pface == nil then
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
@ -471,7 +531,11 @@ 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] = {pos = n.pos, oldpos = n.oldpos, name = frames_pos[pos_to_string(n.oldpos)]} to_move[#to_move + 1] = {
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
@ -481,7 +545,8 @@ 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 entity.name == "technic:damage_entity") then if entity and (entity.name == "technic:frame_entity" or
entity.name == "technic:damage_entity") then
obj:setpos(t.pos) obj:setpos(t.pos)
end end
end end
@ -511,10 +576,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)
@ -534,39 +599,55 @@ local function get_connected_nodes(pos)
end end
local function frame_motor_on(pos, node) local function frame_motor_on(pos, node)
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}} 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 }
}
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 = {"pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png", tiles = {
"technic_lv_cable.png", "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"
},
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 = ({{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] 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]
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
}) })
@ -575,13 +656,19 @@ minetest.register_node("technic:frame_motor",{
-- Templates -- Templates
local function template_connected(pos, c, connectors) local function template_connected(pos, c, connectors)
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 local vects = {
{ 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 nodename == "technic:template_connector")then if not pos_in_list(c, pos1) and (nodename == "technic:template" or
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
@ -624,6 +711,7 @@ 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
@ -631,6 +719,7 @@ 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
@ -650,25 +739,27 @@ 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 = {}
@ -681,7 +772,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
@ -701,6 +792,7 @@ 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
@ -722,7 +814,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
@ -732,6 +824,7 @@ 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
@ -806,7 +899,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)
@ -835,14 +928,18 @@ 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 = {{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 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 }
}
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)
@ -860,8 +957,14 @@ end
minetest.register_node("technic:template_motor", { minetest.register_node("technic:template_motor", {
description = S("Template Motor"), description = S("Template Motor"),
tiles = {"pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png", tiles = {
"technic_lv_cable.png", "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"
},
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

@ -55,7 +55,7 @@ minetest.register_craft({
local function set_injector_formspec(meta) local function set_injector_formspec(meta)
local is_stack = meta:get_string("mode") == "whole stacks" local is_stack = meta:get_string("mode") == "whole stacks"
meta:set_string("formspec", meta:set_string("formspec",
"invsize[8,9;]".. "size[8,9;]"..
"item_image[0,0;1,1;technic:injector]".. "item_image[0,0;1,1;technic:injector]"..
"label[1,0;"..S("Self-Contained Injector").."]".. "label[1,0;"..S("Self-Contained Injector").."]"..
(is_stack and (is_stack and

View File

@ -55,7 +55,7 @@ minetest.register_abm({
local demand = sw_meta:get_int("demand") local demand = sw_meta:get_int("demand")
meta:set_string("infotext", meta:set_string("infotext",
S("Power Monitor. Supply: @1 Demand: @2", S("Power Monitor. Supply: @1 Demand: @2",
technic.pretty_num(supply), technic.pretty_num(demand))) technic.EU_string(supply), technic.EU_string(demand)))
else else
meta:set_string("infotext",S("Power Monitor Has No Network")) meta:set_string("infotext",S("Power Monitor Has No Network"))
end end

View File

@ -13,7 +13,7 @@ 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", "moreores:tin_ingot", "default:bronze_ingot 4"}, {"default:copper_ingot 3", "default: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", 3},
{"technic:wrought_iron_ingot", "technic:coal_dust", "technic:carbon_steel_ingot", 3}, {"technic:wrought_iron_ingot", "technic:coal_dust", "technic:carbon_steel_ingot", 3},
{"technic:carbon_steel_dust", "technic:coal_dust", "technic:cast_iron_dust", 3}, {"technic:carbon_steel_dust", "technic:coal_dust", "technic:cast_iron_dust", 3},

View File

@ -18,7 +18,7 @@ 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", "moreores:tin_ingot", "group:wood"}, {"group:wood", "default:tin_ingot", "group:wood"},
{"group:wood", "default:copper_ingot", "group:wood"}, {"group:wood", "default:copper_ingot", "group:wood"},
} }
}) })
@ -256,7 +256,8 @@ function technic.register_battery_box(data)
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", formspec..add_on_off_buttons(meta, ltier, charge_percent))
local infotext = S("@1 Battery Box: @2 / @3", tier, local infotext = S("@1 Battery Box: @2 / @3", tier,
technic.pretty_num(current_charge), technic.pretty_num(max_charge)) technic.EU_string(current_charge),
technic.EU_string(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

View File

@ -35,7 +35,7 @@ function technic.register_generator(data)
for k, v in pairs(groups) do active_groups[k] = v end for k, v in pairs(groups) do active_groups[k] = v end
local generator_formspec = local generator_formspec =
"invsize[8,9;]".. "size[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]"..

View File

@ -15,6 +15,7 @@ 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"},
{"technic:chromium_lump", "technic:chromium_dust 2"}, {"technic:chromium_lump", "technic:chromium_dust 2"},
{"technic:uranium_lump", "technic:uranium_dust 2"}, {"technic:uranium_lump", "technic:uranium_dust 2"},
{"technic:zinc_lump", "technic:zinc_dust 2"}, {"technic:zinc_lump", "technic:zinc_dust 2"},
@ -43,7 +44,6 @@ end
if minetest.get_modpath("moreores") then if minetest.get_modpath("moreores") then
table.insert(recipes, {"moreores:mithril_lump", "technic:mithril_dust 2"}) table.insert(recipes, {"moreores:mithril_lump", "technic:mithril_dust 2"})
table.insert(recipes, {"moreores:silver_lump", "technic:silver_dust 2"}) table.insert(recipes, {"moreores:silver_lump", "technic:silver_dust 2"})
table.insert(recipes, {"moreores:tin_lump", "technic:tin_dust 2"})
end end
if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then
@ -96,7 +96,7 @@ 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("Stone", "default:stone")
register_dust("Sulfur", nil) register_dust("Sulfur", nil)
register_dust("Tin", "moreores:tin_ingot") 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

View File

@ -44,7 +44,7 @@ function technic.register_base_machine(data)
for k, v in pairs(groups) do active_groups[k] = v end for k, v in pairs(groups) do active_groups[k] = v end
local formspec = local formspec =
"invsize[8,9;]".. "size[8,9;]"..
"list[current_name;src;"..(4-input_size)..",1;"..input_size..",1;]".. "list[current_name;src;"..(4-input_size)..",1;"..input_size..",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;]"..

View File

@ -30,7 +30,8 @@ function technic.register_solar_array(data)
local charge_to_give = math.floor((light + pos.y) * data.power) local charge_to_give = math.floor((light + pos.y) * data.power)
charge_to_give = math.max(charge_to_give, 0) charge_to_give = math.max(charge_to_give, 0)
charge_to_give = math.min(charge_to_give, data.power * 50) charge_to_give = math.min(charge_to_give, data.power * 50)
meta:set_string("infotext", S("@1 Active (@2 EU)", machine_name, technic.pretty_num(charge_to_give))) 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) meta:set_int(tier.."_EU_supply", charge_to_give)
else else
meta:set_string("infotext", S("%s Idle"):format(machine_name)) meta:set_string("infotext", S("%s Idle"):format(machine_name))

View File

@ -149,7 +149,9 @@ local run = function(pos, node, run_stage)
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, technic.pretty_num(input), from, technic.pretty_num(input * remain), to)) meta:set_string("infotext", S("@1 (@2 @3 -> @4 @5)", machine_name,
technic.EU_string(input), from,
technic.EU_string(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 if to then

View File

@ -361,9 +361,9 @@ minetest.register_abm({
end end
--dprint("Total BA demand:"..BA_eu_demand) --dprint("Total BA demand:"..BA_eu_demand)
meta:set_string("infotext", meta:set_string("infotext", S("@1. Supply: @2 Demand: @3",
S("@1. Supply: @2 Demand: @3", machine_name, technic.EU_string(PR_eu_supply),
machine_name, technic.pretty_num(PR_eu_supply), technic.pretty_num(RE_eu_demand))) technic.EU_string(RE_eu_demand)))
-- If mesecon signal and power supply or demand changed then -- If mesecon signal and power supply or demand changed then
-- send them via digilines. -- send them via digilines.

View File

@ -54,6 +54,7 @@ local rad_resistance_node = {
["default:lava_source"] = 17, ["default:lava_source"] = 17,
["default:mese"] = 21, ["default:mese"] = 21,
["default:mossycobble"] = 15, ["default:mossycobble"] = 15,
["default:tinblock"] = 37,
["pbj_pup:pbj_pup"] = 10000, ["pbj_pup:pbj_pup"] = 10000,
["pbj_pup:pbj_pup_candies"] = 10000, ["pbj_pup:pbj_pup_candies"] = 10000,
["gloopblocks:rainbow_block_diagonal"] = 5000, ["gloopblocks:rainbow_block_diagonal"] = 5000,
@ -76,6 +77,7 @@ local rad_resistance_node = {
["default:stone_with_gold"] = 34, ["default:stone_with_gold"] = 34,
["default:stone_with_iron"] = 20, ["default:stone_with_iron"] = 20,
["default:stone_with_mese"] = 17, ["default:stone_with_mese"] = 17,
["default:stone_with_tin"] = 19,
["default:stonebrick"] = 17, ["default:stonebrick"] = 17,
["default:water_flowing"] = 2.8, ["default:water_flowing"] = 2.8,
["default:water_source"] = 5.6, ["default:water_source"] = 5.6,
@ -141,10 +143,8 @@ local rad_resistance_node = {
["moreblocks:wood_tile_up"] = 1.7, ["moreblocks:wood_tile_up"] = 1.7,
["moreores:mineral_mithril"] = 18, ["moreores:mineral_mithril"] = 18,
["moreores:mineral_silver"] = 21, ["moreores:mineral_silver"] = 21,
["moreores:mineral_tin"] = 19,
["moreores:mithril_block"] = 26, ["moreores:mithril_block"] = 26,
["moreores:silver_block"] = 53, ["moreores:silver_block"] = 53,
["moreores:tin_block"] = 37,
["snow:snow_brick"] = 2.8, ["snow:snow_brick"] = 2.8,
["technic:brass_block"] = 43, ["technic:brass_block"] = 43,
["technic:carbon_steel_block"] = 40, ["technic:carbon_steel_block"] = 40,

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 669 B

View File

@ -6,7 +6,7 @@ local S = technic.getter
minetest.register_craft({ minetest.register_craft({
output = 'technic:mining_drill', output = 'technic:mining_drill',
recipe = { recipe = {
{'moreores:tin_ingot', 'technic:diamond_drill_head', 'moreores:tin_ingot'}, {'default:tin_ingot', 'technic:diamond_drill_head', 'default:tin_ingot'},
{'technic:stainless_steel_ingot', 'technic:motor', 'technic:stainless_steel_ingot'}, {'technic:stainless_steel_ingot', 'technic:motor', 'technic:stainless_steel_ingot'},
{'', 'technic:red_energy_crystal', 'default:copper_ingot'}, {'', 'technic:red_energy_crystal', 'default:copper_ingot'},
} }

View File

@ -4,43 +4,43 @@ local mining_lasers_list = {
{"2", 14, 200000, 2000}, {"2", 14, 200000, 2000},
{"3", 21, 650000, 3000}, {"3", 21, 650000, 3000},
} }
local allow_entire_discharging = true
local S = technic.getter local S = technic.getter
minetest.register_craft({ minetest.register_craft({
output = 'technic:laser_mk1', output = "technic:laser_mk1",
recipe = { recipe = {
{'default:diamond', 'technic:brass_ingot', 'default:obsidian_glass'}, {"default:diamond", "technic:brass_ingot", "default:obsidian_glass"},
{'', 'technic:brass_ingot', 'technic:red_energy_crystal'}, {"", "technic:brass_ingot", "technic:red_energy_crystal"},
{'', '', 'default:copper_ingot'}, {"", "", "default:copper_ingot"},
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = 'technic:laser_mk2', output = "technic:laser_mk2",
recipe = { recipe = {
{'default:diamond', 'technic:carbon_steel_ingot', 'technic:laser_mk1'}, {"default:diamond", "technic:carbon_steel_ingot", "technic:laser_mk1"},
{'', 'technic:carbon_steel_ingot', 'technic:green_energy_crystal'}, {"", "technic:carbon_steel_ingot", "technic:green_energy_crystal"},
{'', '', 'default:copper_ingot'}, {"", "", "default:copper_ingot"},
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = 'technic:laser_mk3', output = "technic:laser_mk3",
recipe = { recipe = {
{'default:diamond', 'technic:carbon_steel_ingot', 'technic:laser_mk2'}, {"default:diamond", "technic:carbon_steel_ingot", "technic:laser_mk2"},
{'', 'technic:carbon_steel_ingot', 'technic:blue_energy_crystal'}, {"", "technic:carbon_steel_ingot", "technic:blue_energy_crystal"},
{'', '', 'default:copper_ingot'}, {"", "", "default:copper_ingot"},
} }
}) })
local function laser_node(pos, node, player) local function laser_node(pos, node, player)
local def = minetest.registered_nodes[node.name] local def = minetest.registered_nodes[node.name]
if def and def.liquidtype ~= "none" then if def.liquidtype ~= "none" and def.buildable_to then
minetest.remove_node(pos) minetest.remove_node(pos)
minetest.add_particle({ minetest.add_particle({
pos = pos, pos = pos,
velocity = {x=0, y=2, z=0}, velocity = {x = 0, y = 1.5 + math.random(), z = 0},
acceleration = {x = 0, y = -1, z = 0}, acceleration = {x = 0, y = -1, z = 0},
expirationtime = 1.5,
size = 6 + math.random() * 2, size = 6 + math.random() * 2,
texture = "smoke_puff.png^[transform" .. math.random(0, 7), texture = "smoke_puff.png^[transform" .. math.random(0, 7),
}) })
@ -49,11 +49,15 @@ local function laser_node(pos, node, player)
minetest.node_dig(pos, node, player) minetest.node_dig(pos, node, player)
end end
local no_destroy = { local keep_node = {air = true}
["air"] = true, local function can_keep_node(name)
["default:lava_source"] = true, if keep_node[name] ~= nil then
["default:lava_flowing"] = true, return keep_node[name]
} end
keep_node[name] = minetest.get_item_group(name, "hot") ~= 0
return keep_node[name]
end
local function laser_shoot(player, range, particle_texture, sound) local function laser_shoot(player, range, particle_texture, sound)
local player_pos = player:getpos() local player_pos = player:getpos()
local player_name = player:get_player_name() local player_name = player:get_player_name()
@ -61,12 +65,12 @@ local function laser_shoot(player, range, particle_texture, sound)
local start_pos = vector.new(player_pos) local start_pos = vector.new(player_pos)
-- Adjust to head height -- Adjust to head height
start_pos.y = start_pos.y + 1.6 start_pos.y = start_pos.y + (player:get_properties().eye_height or 1.625)
minetest.add_particle({ minetest.add_particle({
pos = startpos, pos = start_pos,
velocity = dir, velocity = dir,
acceleration = vector.multiply(dir, 50), acceleration = vector.multiply(dir, 50),
expirationtime = range / 11, expirationtime = (math.sqrt(1 + 100 * (range + 0.4)) - 1) / 50,
size = 1, size = 1,
texture = particle_texture .. "^[transform" .. math.random(0, 7), texture = particle_texture .. "^[transform" .. math.random(0, 7),
}) })
@ -76,42 +80,48 @@ local function laser_shoot(player, range, particle_texture, sound)
minetest.record_protection_violation(pos, player_name) minetest.record_protection_violation(pos, player_name)
break break
end end
local node = minetest.get_node_or_nil(pos) local node = minetest.get_node(pos)
if not node then if node.name == "ignore"
or not minetest.registered_nodes[node.name] then
break break
end end
if not no_destroy[node.name] then if not can_keep_node(node.name) then
laser_node(pos, node, player) laser_node(pos, node, player)
end end
end end
end end
for _, m in pairs(mining_lasers_list) do for _, m in pairs(mining_lasers_list) do
technic.register_power_tool("technic:laser_mk"..m[1], m[3]) technic.register_power_tool("technic:laser_mk"..m[1], m[3])
minetest.register_tool("technic:laser_mk"..m[1], { minetest.register_tool("technic:laser_mk"..m[1], {
description = S("Mining Laser Mk%d"):format(m[1]), description = S("Mining Laser Mk%d"):format(m[1]),
inventory_image = "technic_mining_laser_mk"..m[1]..".png", inventory_image = "technic_mining_laser_mk"..m[1]..".png",
range = 0,
stack_max = 1, stack_max = 1,
wear_represents = "technic_RE_charge", wear_represents = "technic_RE_charge",
on_refill = technic.refill_RE_charge, on_refill = technic.refill_RE_charge,
on_use = function(itemstack, user) on_use = function(itemstack, user)
local meta = minetest.deserialize(itemstack:get_metadata()) local meta = minetest.deserialize(itemstack:get_metadata())
if not meta or not meta.charge then if not meta or not meta.charge or meta.charge == 0 then
return return
end end
-- If there's enough charge left, fire the laser local range = m[2]
if meta.charge >= m[4] then if meta.charge < m[4] then
laser_shoot(user, m[2], "technic_laser_beam_mk"..m[1]..".png", "technic_laser_mk"..m[1]) if not allow_entire_discharging then
return
end
-- If charge is too low, give the laser a shorter range
range = range * meta.charge / m[4]
end
laser_shoot(user, range, "technic_laser_beam_mk" .. m[1] .. ".png",
"technic_laser_mk" .. m[1])
if not technic.creative_mode then if not technic.creative_mode then
meta.charge = meta.charge - m[4] meta.charge = math.max(meta.charge - m[4], 0)
technic.set_RE_wear(itemstack, meta.charge, m[3]) technic.set_RE_wear(itemstack, meta.charge, m[3])
itemstack:set_metadata(minetest.serialize(meta)) itemstack:set_metadata(minetest.serialize(meta))
end end
end
return itemstack return itemstack
end, end,
}) })
end end

View File

@ -15,3 +15,11 @@ dofile(modpath.."/silver_chest.lua")
dofile(modpath.."/gold_chest.lua") dofile(modpath.."/gold_chest.lua")
dofile(modpath.."/mithril_chest.lua") dofile(modpath.."/mithril_chest.lua")
minetest.register_lbm({
name = "technic_chests:fix_wooden_chests",
nodenames = {"default:chest"},
action = function(pos, node)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", "")
end
})

View File

@ -1,13 +1,41 @@
local uranium_params = {offset = 0, scale = 1, spread = {x = 100, y = 100, z = 100}, seed = 420, octaves = 3, persist = 0.7} local uranium_params = {
offset = 0,
scale = 1,
spread = {x = 100, y = 100, z = 100},
seed = 420,
octaves = 3,
persist = 0.7
}
local uranium_threshold = 0.55 local uranium_threshold = 0.55
local chromium_params = {offset = 0, scale = 1, spread = {x = 100, y = 100, z = 100}, seed = 421, octaves = 3, persist = 0.7} local chromium_params = {
offset = 0,
scale = 1,
spread = {x = 100, y = 100, z = 100},
seed = 421,
octaves = 3,
persist = 0.7
}
local chromium_threshold = 0.55 local chromium_threshold = 0.55
local zinc_params = {offset = 0, scale = 1, spread = {x = 100, y = 100, z = 100}, seed = 422, octaves = 3, persist = 0.7} local zinc_params = {
offset = 0,
scale = 1,
spread = {x = 100, y = 100, z = 100},
seed = 422,
octaves = 3,
persist = 0.7
}
local zinc_threshold = 0.5 local zinc_threshold = 0.5
local lead_params = {offset = 0, scale = 1, spread = {x = 100, y = 100, z = 100}, seed = 423, octaves = 3, persist = 0.7} local lead_params = {
offset = 0,
scale = 1,
spread = {x = 100, y = 100, z = 100},
seed = 423,
octaves = 3,
persist = 0.7
}
local lead_threshold = 0.3 local lead_threshold = 0.3
minetest.register_ore({ minetest.register_ore({
@ -119,14 +147,11 @@ minetest.register_ore({
-- Sulfur -- Sulfur
local sulfur_buf = {} local sulfur_buf = {}
local sulfur_noise= nil local sulfur_noise
minetest.register_on_generated(function(minp, maxp, seed) minetest.register_on_generated(function(minp, maxp)
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local a = VoxelArea:new{ local a = VoxelArea:new({MinEdge=emin, MaxEdge=emax})
MinEdge = {x = emin.x, y = emin.y, z = emin.z},
MaxEdge = {x = emax.x, y = emax.y, z = emax.z},
}
local data = vm:get_data(sulfur_buf) local data = vm:get_data(sulfur_buf)
local pr = PseudoRandom(17 * minp.x + 42 * minp.y + 101 * minp.z) local pr = PseudoRandom(17 * minp.x + 42 * minp.y + 101 * minp.z)
sulfur_noise = sulfur_noise or minetest.get_perlin(9876, 3, 0.5, 100) sulfur_noise = sulfur_noise or minetest.get_perlin(9876, 3, 0.5, 100)
@ -141,11 +166,16 @@ minetest.register_on_generated(function(minp, maxp, seed)
for y = minp.y + math.floor(grid_size / 2), maxp.y, grid_size do for y = minp.y + math.floor(grid_size / 2), maxp.y, grid_size do
for z = minp.z + math.floor(grid_size / 2), maxp.z, grid_size do for z = minp.z + math.floor(grid_size / 2), maxp.z, grid_size do
local c = data[a:index(x, y, z)] local c = data[a:index(x, y, z)]
if (c == c_lava or c == c_lava_flowing) and sulfur_noise:get3d({x = x, y = z, z = z}) >= 0.4 then if (c == c_lava or c == c_lava_flowing)
for xx = math.max(minp.x, x - grid_size), math.min(maxp.x, x + grid_size) do and sulfur_noise:get3d({x = x, y = z, z = z}) >= 0.4 then
for yy = math.max(minp.y, y - grid_size), math.min(maxp.y, y + grid_size) do for i in a:iter(
for zz = math.max(minp.z, z - grid_size), math.min(maxp.z, z + grid_size) do math.max(minp.x, x - grid_size),
local i = a:index(xx, yy, zz) math.max(minp.y, y - grid_size),
math.max(minp.z, z - grid_size),
math.min(maxp.x, x + grid_size),
math.min(maxp.y, y + grid_size),
math.min(maxp.z, z + grid_size)
) do
if data[i] == c_stone and pr:next(1, 10) <= 7 then if data[i] == c_stone and pr:next(1, 10) <= 7 then
data[i] = c_sulfur data[i] = c_sulfur
end end
@ -154,8 +184,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
end end
end end
end
end
vm:set_data(data) vm:set_data(data)
vm:write_to_map(data) vm:write_to_map(data)
@ -173,7 +201,10 @@ minetest.register_ore({
y_min = -31000, y_min = -31000,
y_max = -50, y_max = -50,
noise_threshold = 0.4, noise_threshold = 0.4,
noise_params = {offset=0, scale=15, spread={x=150, y=150, z=150}, seed=23, octaves=3, persist=0.70} noise_params = {
offset = 0, scale = 15, spread = {x = 150, y = 150, z = 150},
seed = 23, octaves = 3, persist = 0.70
}
}) })
end end
@ -188,7 +219,9 @@ minetest.register_ore({
y_min = -31000, y_min = -31000,
y_max = -150, y_max = -150,
noise_threshold = 0.4, noise_threshold = 0.4,
noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} noise_params = {
offset = 0, scale = 15, spread = {x = 130, y = 130, z = 130},
seed = 24, octaves = 3, persist = 0.70
}
}) })
end end

View File

@ -120,7 +120,7 @@ minetest.register_tool("wrench:wrench", {
return return
end end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if def.owned then if def.owned and not minetest.check_player_privs(placer, "protection_bypass") then
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
if owner and owner ~= player_name then if owner and owner ~= player_name then
minetest.log("action", player_name.. minetest.log("action", player_name..