diff options
Diffstat (limited to 'technic')
862 files changed, 18202 insertions, 0 deletions
diff --git a/technic/.mailmap b/technic/.mailmap new file mode 100644 index 0000000..cf45bc3 --- /dev/null +++ b/technic/.mailmap @@ -0,0 +1,4 @@ +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> diff --git a/technic/README.md b/technic/README.md new file mode 100644 index 0000000..406deab --- /dev/null +++ b/technic/README.md @@ -0,0 +1,23 @@ +Technic +======= + +Credits for contributing to the project (in alphabetical order): + * kpoppel + * Nekogloop + * Nore/Ekdohibs + * ShadowNinja + * VanessaE + * And many others... + +FAQ +--- + +1. My technic circuit doesn't work. No power is distrubuted. + * A: Make sure you have a switching station connected. + +License +------- + +Unless otherwise stated, all components of this modpack are licensed under the +LGPL, V2 or later. See also the individual mod folders for their +secondary/alternate licenses, if any. diff --git a/technic/concrete/depends.txt b/technic/concrete/depends.txt new file mode 100644 index 0000000..c48fe0d --- /dev/null +++ b/technic/concrete/depends.txt @@ -0,0 +1,3 @@ +default +intllib? + diff --git a/technic/concrete/init.lua b/technic/concrete/init.lua new file mode 100644 index 0000000..d1fa1aa --- /dev/null +++ b/technic/concrete/init.lua @@ -0,0 +1,274 @@ +--Minetest 0.4.7 mod: concrete +--(c) 2013 by RealBadAngel <mk@realbadangel.pl> + +local technic = rawget(_G, "technic") or {} +technic.concrete_posts = {} + +-- Boilerplate to support localized strings if intllib mod is installed. +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end + +minetest.register_alias("technic:concrete_post", "technic:concrete_post0") +minetest.register_alias("technic:concrete_post32", "technic:concrete_post12") +minetest.register_alias("technic:concrete_post33", "technic:concrete_post3") +minetest.register_alias("technic:concrete_post34", "technic:concrete_post28") +minetest.register_alias("technic:concrete_post35", "technic:concrete_post19") + +local steel_ingot +if minetest.get_modpath("technic_worldgen") then + steel_ingot = "technic:carbon_steel_ingot" +else + steel_ingot = "default:steel_ingot" +end + +minetest.register_craft({ + output = 'technic:rebar 6', + recipe = { + {'','', steel_ingot}, + {'',steel_ingot,''}, + {steel_ingot, '', ''}, + } +}) + +minetest.register_craft({ + output = 'technic:concrete 5', + recipe = { + {'default:stone','technic:rebar','default:stone'}, + {'technic:rebar','default:stone','technic:rebar'}, + {'default:stone','technic:rebar','default:stone'}, + } +}) + +minetest.register_craft({ + output = 'technic:concrete_post_platform 6', + recipe = { + {'technic:concrete','technic:concrete_post0','technic:concrete'}, + } +}) + +minetest.register_craft({ + output = 'technic:concrete_post0 12', + recipe = { + {'default:stone','technic:rebar','default:stone'}, + {'default:stone','technic:rebar','default:stone'}, + {'default:stone','technic:rebar','default:stone'}, +} +}) + +minetest.register_craft({ + output = 'technic:blast_resistant_concrete 5', + recipe = { + {'technic:concrete','technic:composite_plate','technic:concrete'}, + {'technic:composite_plate','technic:concrete','technic:composite_plate'}, + {'technic:concrete','technic:composite_plate','technic:concrete'}, + } +}) + +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", { + description = S("Rebar"), + inventory_image = "technic_rebar.png", +}) + +minetest.register_node(":technic:concrete", { + description = S("Concrete Block"), + tiles = {"technic_concrete_block.png",}, + groups = {cracky=1, level=2, concrete=1}, + 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", { + description = S("Blast-resistant Concrete Block"), + tiles = {"technic_blast_resistant_concrete_block.png",}, + groups={cracky=1, level=3, concrete=1}, + sounds = default.node_sound_stone_defaults(), + after_place_node = function(pos, player, 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:concrete_post_platform", { + description = S("Concrete Post Platform"), + tiles = {"technic_concrete_block.png",}, + groups={cracky=1, level=2}, + sounds = default.node_sound_stone_defaults(), + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {box_platform} + }, + on_place = function (itemstack, placer, pointed_thing) + local node = minetest.get_node(pointed_thing.under) + if not technic.concrete_posts[node.name] then + return minetest.item_place_node(itemstack, placer, pointed_thing) + end + local links = technic.concrete_posts[node.name] + if links[6] ~= 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], links[5], 1}) + minetest.set_node(pointed_thing.under, {name="technic:concrete_post"..id}) + itemstack:take_item() + placer:set_wielded_item(itemstack) + return itemstack + end, +}) + +local function gen_post_nodebox(x1, x2, z1, z2, y, platform) + local box + local xx = x1 + x2 + local zz = z1 + z2 + if ((xx == 2 and zz == 0) or (xx == 0 and zz == 2)) and y == 0 then + box = {} + else + box = {box_center} + end + if x1 ~= 0 then + table.insert(box, box_x1) + end + 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 + +function technic.get_post_id(links) + return (links[1] * 1) + (links[2] * 2) + + (links[3] * 4) + (links[4] * 8) + + (links[5] * 16) + (links[6] * 32) +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}, + {x=pos.x, y=pos.y-1, z=pos.z}, + {x=pos.x, y=pos.y+1, z=pos.z}, + } + + local links = {0, 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 + + if links[5] == 1 or links[6] == 1 then + links[5] = 1 + links[6] = 0 + 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[6] = oldlinks[6] + 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 y = 0, 1 do +for platform = 0, 1 do + local links = {x1, x2, z1, z2, y, 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"), + tiles = {"technic_concrete_block.png"}, + groups = groups, + sounds = default.node_sound_stone_defaults(), + drop = drop, + paramtype = "light", + sunlight_propagates = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = gen_post_nodebox(x1, x2, z1, z2, y, platform), + }, + after_place_node = function(pos, placer, itemstack) + technic.update_posts(pos, true) + end, + after_dig_node = after_dig_node, + }) +end +end +end +end +end +end + diff --git a/technic/concrete/locale/de.txt b/technic/concrete/locale/de.txt new file mode 100644 index 0000000..83fdc19 --- /dev/null +++ b/technic/concrete/locale/de.txt @@ -0,0 +1,10 @@ +# German Translation for technic_concrete +# Deutsche Übersetzung von technic_concrete +# by Xanthin + +Rebar = Bewehrungsstab +Concrete Block = Betonblock +Blast-resistant Concrete Block = Explosionsbestaendiger Betonblock +Concrete Post Platform = Betonpfostenplattform +Concrete Post = Betonpfosten + diff --git a/technic/concrete/locale/template.txt b/technic/concrete/locale/template.txt new file mode 100644 index 0000000..451adaf --- /dev/null +++ b/technic/concrete/locale/template.txt @@ -0,0 +1,8 @@ +# technic_concrete translation template + +Rebar = +Concrete Block = +Blast-resistant Concrete Block = +Concrete Post Platform = +Concrete Post = + diff --git a/technic/concrete/locale/tr.txt b/technic/concrete/locale/tr.txt new file mode 100644 index 0000000..179d29b --- /dev/null +++ b/technic/concrete/locale/tr.txt @@ -0,0 +1,7 @@ +# 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 diff --git a/technic/concrete/textures/technic_blast_resistant_concrete_block.png b/technic/concrete/textures/technic_blast_resistant_concrete_block.png Binary files differnew file mode 100644 index 0000000..b7d8588 --- /dev/null +++ b/technic/concrete/textures/technic_blast_resistant_concrete_block.png diff --git a/technic/concrete/textures/technic_concrete_block.png b/technic/concrete/textures/technic_concrete_block.png Binary files differnew file mode 100644 index 0000000..cd94594 --- /dev/null +++ b/technic/concrete/textures/technic_concrete_block.png diff --git a/technic/concrete/textures/technic_rebar.png b/technic/concrete/textures/technic_rebar.png Binary files differnew file mode 100644 index 0000000..16d1fc5 --- /dev/null +++ b/technic/concrete/textures/technic_rebar.png diff --git a/technic/concrete/textures/x32/technic_concrete_block.png b/technic/concrete/textures/x32/technic_concrete_block.png Binary files differnew file mode 100644 index 0000000..91364f3 --- /dev/null +++ b/technic/concrete/textures/x32/technic_concrete_block.png diff --git a/technic/concrete/textures/x32/technic_rebar.png b/technic/concrete/textures/x32/technic_rebar.png Binary files differnew file mode 100644 index 0000000..16d1fc5 --- /dev/null +++ b/technic/concrete/textures/x32/technic_rebar.png diff --git a/technic/extranodes/depends.txt b/technic/extranodes/depends.txt new file mode 100644 index 0000000..6335bfd --- /dev/null +++ b/technic/extranodes/depends.txt @@ -0,0 +1,5 @@ +default +technic_worldgen +concrete +intllib? +moreblocks? diff --git a/technic/extranodes/init.lua b/technic/extranodes/init.lua new file mode 100644 index 0000000..22a1d9f --- /dev/null +++ b/technic/extranodes/init.lua @@ -0,0 +1,103 @@ +-- Minetest 0.4.6 mod: extranodes +-- namespace: technic +-- Boilerplate to support localized strings if intllib mod is installed. +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end + +if minetest.get_modpath("moreblocks") then + + -- register stairsplus/circular_saw nodes + -- we skip blast resistant concrete and uranium intentionally + -- chrome seems to be too hard of a metal to be actually sawable + + stairsplus:register_all("technic", "marble", "technic:marble", { + description=S("Marble"), + groups={cracky=3, not_in_creative_inventory=1}, + tiles={"technic_marble.png"}, + }) + + stairsplus:register_all("technic", "marble_bricks", "technic:marble_bricks", { + description=S("Marble Bricks"), + groups={cracky=3, not_in_creative_inventory=1}, + tiles={"technic_marble_bricks.png"}, + }) + + 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) + minetest.register_alias(modname .. ":slab_" .. origname, newmod..":slab_" .. newname) + minetest.register_alias(modname .. ":slab_" .. origname .. "_inverted", newmod..":slab_" .. newname .. "_inverted") + minetest.register_alias(modname .. ":slab_" .. origname .. "_wall", newmod..":slab_" .. newname .. "_wall") + minetest.register_alias(modname .. ":slab_" .. origname .. "_quarter", newmod..":slab_" .. newname .. "_quarter") + minetest.register_alias(modname .. ":slab_" .. origname .. "_quarter_inverted", newmod..":slab_" .. newname .. "_quarter_inverted") + minetest.register_alias(modname .. ":slab_" .. origname .. "_quarter_wall", newmod..":slab_" .. newname .. "_quarter_wall") + minetest.register_alias(modname .. ":slab_" .. origname .. "_three_quarter", newmod..":slab_" .. newname .. "_three_quarter") + minetest.register_alias(modname .. ":slab_" .. origname .. "_three_quarter_inverted", newmod..":slab_" .. newname .. "_three_quarter_inverted") + minetest.register_alias(modname .. ":slab_" .. origname .. "_three_quarter_wall", newmod..":slab_" .. newname .. "_three_quarter_wall") + minetest.register_alias(modname .. ":stair_" .. origname, newmod..":stair_" .. newname) + minetest.register_alias(modname .. ":stair_" .. origname .. "_inverted", newmod..":stair_" .. newname .. "_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. "_wall", newmod..":stair_" .. newname .. "_wall") + minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half", newmod..":stair_" .. newname .. "_wall_half") + minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half_inverted", newmod..":stair_" .. newname .. "_wall_half_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. "_half", newmod..":stair_" .. newname .. "_half") + minetest.register_alias(modname .. ":stair_" .. origname .. "_half_inverted", newmod..":stair_" .. newname .. "_half_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. "_right_half", newmod..":stair_" .. newname .. "_right_half") + minetest.register_alias(modname .. ":stair_" .. origname .. "_right_half_inverted", newmod..":stair_" .. newname .. "_right_half_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half", newmod..":stair_" .. newname .. "_wall_half") + minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half_inverted", newmod..":stair_" .. newname .. "_wall_half_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. "_inner", newmod..":stair_" .. newname .. "_inner") + minetest.register_alias(modname .. ":stair_" .. origname .. "_inner_inverted", newmod..":stair_" .. newname .. "_inner_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. "_outer", newmod..":stair_" .. newname .. "_outer") + minetest.register_alias(modname .. ":stair_" .. origname .. "_outer_inverted", newmod..":stair_" .. newname .. "_outer_inverted") + minetest.register_alias(modname .. ":panel_" .. origname .. "_bottom", newmod..":panel_" .. newname .. "_bottom") + minetest.register_alias(modname .. ":panel_" .. origname .. "_top", newmod..":panel_" .. newname .. "_top") + minetest.register_alias(modname .. ":panel_" .. origname .. "_vertical", newmod..":panel_" .. newname .. "_vertical") + minetest.register_alias(modname .. ":micro_" .. origname .. "_bottom", newmod..":micro_" .. newname .. "_bottom") + minetest.register_alias(modname .. ":micro_" .. origname .. "_top", newmod..":micro_" .. newname .. "_top") + end + + register_technic_stairs_alias("stairsplus", "concrete", "technic", "concrete") + register_technic_stairs_alias("stairsplus", "marble", "technic", "marble") + register_technic_stairs_alias("stairsplus", "granite", "technic", "granite") + register_technic_stairs_alias("stairsplus", "marble_bricks", "technic", "marble_bricks") + +end diff --git a/technic/extranodes/locale/de.txt b/technic/extranodes/locale/de.txt new file mode 100644 index 0000000..f3c017e --- /dev/null +++ b/technic/extranodes/locale/de.txt @@ -0,0 +1,9 @@ +# German Translation for technic_extranodes +# Deutsche Übersetzung von technic_extranodes +# by Xanthin + +Marble = Marmor +Marble Bricks = Marmorziegel +Granite = Granit +Concrete = Beton + diff --git a/technic/extranodes/locale/template.txt b/technic/extranodes/locale/template.txt new file mode 100644 index 0000000..2ffe498 --- /dev/null +++ b/technic/extranodes/locale/template.txt @@ -0,0 +1,7 @@ +# technic_extranodes translation template + +Marble = +Marble Bricks = +Granite = +Concrete = + diff --git a/technic/extranodes/locale/tr.txt b/technic/extranodes/locale/tr.txt new file mode 100644 index 0000000..90d8154 --- /dev/null +++ b/technic/extranodes/locale/tr.txt @@ -0,0 +1,6 @@ +# turkish translation by mahmutelmas06 + +Marble = Mermer +Marble Bricks = Mermer tuğla +Granite = Granit +Concrete = Beton diff --git a/technic/manual.md b/technic/manual.md new file mode 100644 index 0000000..9031792 --- /dev/null +++ b/technic/manual.md @@ -0,0 +1,1488 @@ +Minetest technic modpack user manual +==================================== + +The technic modpack extends the Minetest game with many new elements, +mainly constructable machines and tools. It is a large modpack, and +tends to dominate gameplay when it is used. This manual describes how +to use the technic modpack, mainly from a player's perspective. + +The technic modpack depends on some other modpacks: + +* the basic Minetest game +* mesecons, which supports the construction of logic systems based on + signalling elements +* pipeworks, which supports the automation of item transport +* moreores, which provides some additional ore types + +This manual doesn't explain how to use these other modpacks, which ought +to (but actually don't) have their own manuals. + +Recipes for constructable items in technic are generally not guessable, +and are also not specifically documented here. You should use a +craft guide mod to look up the recipes in-game. For the best possible +guidance, use the unified\_inventory mod, with which technic registers +its specialised recipe types. + +substances +---------- + +### ore ### + +The technic mod makes extensive use of not just the default ores but also +some that are added by mods. You will need to mine for all the ore types +in the course of the game. Each ore type is found at a specific range of +elevations, and while the ranges mostly overlap, some have non-overlapping +ranges, so you will ultimately need to mine at more than one elevation +to find all the ores. Also, because one of the best elevations to mine +at is very deep, you will be unable to mine there early in the game. + +Elevation is measured in meters, relative to a reference plane that +is not quite sea level. (The standard sea level is at an elevation +of about +1.4.) Positive elevations are above the reference plane and +negative elevations below. Because elevations are always described this +way round, greater numbers when higher, we avoid the word "depth". + +The ores that matter in technic are coal, iron, copper, tin, zinc, +chromium, uranium, silver, gold, mithril, mese, and diamond. + +Coal is part of the basic Minetest game. It is found from elevation ++64 downwards, so is available right on the surface at the start of +the game, but it is far less abundant above elevation 0 than below. +It is initially used as a fuel, driving important machines in the early +part of the game. It becomes less important as a fuel once most of your +machines are electrically powered, but burning fuel remains a way to +generate electrical power. Coal is also used, usually in dust form, as +an ingredient in alloying recipes, wherever elemental carbon is required. + +Iron is part of the basic Minetest game. It is found from elevation ++2 downwards, and its abundance increases in stages as one descends, +reaching its maximum from elevation -64 downwards. It is a common metal, +used frequently as a structural component. In technic, unlike the basic +game, iron is used in multiple forms, mainly alloys based on iron and +including carbon (coal). + +Copper is part of the basic Minetest game (having migrated there from +moreores). It is found from elevation -16 downwards, but is more abundant +from elevation -64 downwards. It is a common metal, used either on its +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 +be the material that most limits your activity. + +Tin is supplied by the moreores mod. It is found from elevation +8 +downwards, with no elevation-dependent variations in abundance beyond +that point. 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 +is itself little used. Its abundance is well in excess of its usage, +so you will usually have a surplus of it. + +Zinc is supplied by technic. It is found from elevation +2 downwards, +with no elevation-dependent variations in abundance beyond that point. +It is a common metal. Its main use is as the secondary ingredient +in brass (the base being copper), but brass is itself little used. +Its abundance is well in excess of its usage, so you will usually have +a surplus of it. + +Chromium is supplied by technic. It is found from elevation -100 +downwards, with no elevation-dependent variations in abundance beyond +that point. It is a moderately common metal. Its main use is as the +secondary ingredient in stainless steel (the base being iron). + +Uranium is supplied by technic. It is found only from elevation -80 down +to -300; using it therefore requires one to mine above elevation -300 even +though deeper mining is otherwise more productive. It is a moderately +common metal, useful only for reasons related to radioactivity: it forms +the fuel for nuclear reactors, and is also one of the best radiation +shielding materials available. It is not difficult to find enough uranium +ore to satisfy these uses. Beware that the ore is slightly radioactive: +it will slightly harm you if you stand as close as possible to it. +It is safe when more than a meter away or when mined. + +Silver is supplied by the moreores mod. It is found from elevation -2 +downwards, with no elevation-dependent variations in abundance beyond +that point. It is a semi-precious metal. It is little used, being most +notably used in electrical items due to its conductivity, being the best +conductor of all the pure elements. + +Gold is part of the basic Minetest game (having migrated there from +moreores). It is found from elevation -64 downwards, but is more +abundant from elevation -256 downwards. It is a precious metal. It is +little used, being most notably used in electrical items due to its +combination of good conductivity (third best of all the pure elements) +and corrosion resistance. + +Mithril is supplied by the moreores mod. It is found from elevation +-512 downwards, the deepest ceiling of any minable substance, with +no elevation-dependent variations in abundance beyond that point. +It is a rare precious metal, and unlike all the other metals described +here it is entirely fictional, being derived from J. R. R. Tolkien's +Middle-Earth setting. It is little used. + +Mese is part of the basic Minetest game. It is found from elevation +-64 downwards. The ore is more abundant from elevation -256 downwards, +and from elevation -1024 downwards there are also occasional blocks of +solid mese (each yielding as much mese as nine blocks of ore). It is a +precious gemstone, and unlike diamond it is entirely fictional. It is +used in many recipes, though mainly not in large quantities, wherever +some magical quality needs to be imparted. + +Diamond is part of the basic Minetest game (having migrated there from +technic). It is found from elevation -128 downwards, but is more abundant +from elevation -256 downwards. It is a precious gemstone. It is used +moderately, mainly for reasons connected to its extreme hardness. + +### rock ### + +In addition to the ores, there are multiple kinds of rock that need to be +mined in their own right, rather than for minerals. The rock types that +matter in technic are standard stone, desert stone, marble, and granite. + +Standard stone is part of the basic Minetest game. It is extremely +common. As in the basic game, when dug it yields cobblestone, which can +be cooked to turn it back into standard stone. Cobblestone is used in +recipes only for some relatively primitive machines. Standard stone is +used in a couple of machine recipes. These rock types gain additional +significance with technic because the grinder can be used to turn them +into dirt and sand. This, especially when combined with an automated +cobblestone generator, can be an easier way to acquire sand than +collecting it where it occurs naturally. + +Desert stone is part of the basic Minetest game. It is found specifically +in desert biomes, and only from elevation +2 upwards. Although it is +easily accessible, therefore, its quantity is ultimately quite limited. +It is used in a few recipes. + +Marble is supplied by technic. It is found in dense clusters from +elevation -50 downwards. It has mainly decorative use, but also appears +in one machine recipe. + +Granite is supplied by technic. It is found in dense clusters from +elevation -150 downwards. It is much harder to dig than standard stone, +so impedes mining when it is encountered. It has mainly decorative use, +but also appears in a couple of machine recipes. + +### rubber ### + +Rubber is a biologically-derived material that has industrial uses due +to its electrical resistivity and its impermeability. In technic, it +is used in a few recipes, and it must be acquired by tapping rubber trees. + +If you have the moretrees mod installed, the rubber trees you need +are those defined by that mod. If not, technic supplies a copy of the +moretrees rubber tree. + +Extracting rubber requires a specific tool, a tree tap. Using the tree +tap (by left-clicking) on a rubber tree trunk block extracts a lump of +raw latex from the trunk. Each trunk block can be repeatedly tapped for +latex, at intervals of several minutes; its appearance changes to show +whether it is currently ripe for tapping. Each tree has several trunk +blocks, so several latex lumps can be extracted from a tree in one visit. + +Raw latex isn't used directly. It must be vulcanized to produce finished +rubber. This can be performed by alloying the latex with coal dust. + +### metal ### + +Many of the substances important in technic are metals, and there is +a common pattern in how metals are handled. Generally, each metal can +exist in five forms: ore, lump, dust, ingot, and block. With a couple of +tricky exceptions in mods outside technic, metals are only *used* in dust, +ingot, and block forms. Metals can be readily converted between these +three forms, but can't be converted from them back to ore or lump forms. + +As in the basic Minetest game, a "lump" of metal is acquired directly by +digging ore, and will then be processed into some other form for use. +A lump is thus more akin to ore than to refined metal. (In real life, +metal ore rarely yields lumps ("nuggets") of pure metal directly. +More often the desired metal is chemically bound into the rock as an +oxide or some other compound, and the ore must be chemically processed +to yield pure metal.) + +Not all metals occur directly as ore. Generally, elemental metals (those +consisting of a single chemical element) occur as ore, and alloys (those +consisting of a mixture of multiple elements) do not. In fact, if the +fictional mithril is taken to be elemental, this pattern is currently +followed perfectly. (It is not clear in the Middle-Earth setting whether +mithril is elemental or an alloy.) This might change in the future: +in real life some alloys do occur as ore, and some elemental metals +rarely occur naturally outside such alloys. Metals that do not occur +as ore also lack the "lump" form. + +The basic Minetest game offers a single way to refine metals: cook a lump +in a furnace to produce an ingot. With technic this refinement method +still exists, but is rarely used outside the early part of the game, +because technic offers a more efficient method once some machines have +been built. The grinder, available only in electrically-powered forms, +can grind a metal lump into two piles of metal dust. Each dust pile +can then be cooked into an ingot, yielding two ingots from one lump. +This doubling of material value means that you should only cook a lump +directly when you have no choice, mainly early in the game when you +haven't yet built a grinder. + +An ingot can also be ground back to (one pile of) dust. Thus it is always +possible to convert metal between ingot and dust forms, at the expense +of some energy consumption. Nine ingots of a metal can be crafted into +a block, which can be used for building. The block can also be crafted +back to nine ingots. Thus it is possible to freely convert metal between +ingot and block forms, which is convenient to store the metal compactly. +Every metal has dust, ingot, and block forms. + +Alloying recipes in which a metal is the base ingredient, to produce a +metal alloy, always come in two forms, using the metal either as dust +or as an ingot. If the secondary ingredient is also a metal, it must +be supplied in the same form as the base ingredient. The output alloy +is also returned in the same form. For example, brass can be produced +by alloying two copper ingots with one zinc ingot to make three brass +ingots, or by alloying two piles of copper dust with one pile of zinc +dust to make three piles of brass dust. The two ways of alloying produce +equivalent results. + +### iron and its alloys ### + +Iron forms several important alloys. In real-life history, iron was the +second metal to be used as the base component of deliberately-constructed +alloys (the first was copper), and it was the first metal whose working +required processes of any metallurgical sophistication. The game +mechanics around iron broadly imitate the historical progression of +processes around it, rather than the less-varied modern processes. + +The two-component alloying system of iron with carbon is of huge +importance, both in the game and in real life. The basic Minetest game +doesn't distinguish between these pure iron and these alloys at all, +but technic introduces a distinction based on the carbon content, and +renames some items of the basic game accordingly. + +The iron/carbon spectrum is represented in the game by three metal +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. +In real-life history 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. Historically 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. In real life 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, armor, skyscrapers, large bridges, and machines. + +In real-life history, the first form of iron to be refined was +wrought iron, which is nearly pure iron, having low carbon content. +It was produced from ore by a low-temperature furnace process (the +"bloomery") in which the ore/iron remains solid and impurities (slag) +are progressively removed by hammering ("working", hence "wrought"). +This began in the middle East, around 1800 BCE. + +Historically, the next forms of iron to be refined were those of high +carbon content. This was the result of the development of a more +sophisticated kind of furnace, the blast furnace, capable of reaching +higher temperatures. The real advantage of the blast furnace is that it +melts the metal, allowing it to be cast straight into a shape supplied by +a mould, rather than having to be gradually beaten into the desired shape. +A side effect of the blast furnace is that carbon from the furnace's fuel +is unavoidably incorporated into the metal. Normally iron is processed +twice through the blast furnace: once producing "pig iron", which has +very high carbon content and lots of impurities but lower melting point, +casting it into rough ingots, then remelting the pig iron and casting it +into the final moulds. The result is called "cast iron". Pig iron was +first produced in China around 1200 BCE, and cast iron later in the 5th +century BCE. Incidentally, the Chinese did not have the bloomery process, +so this was their first iron refining process, and, unlike the rest of +the world, their first wrought iron was made from pig iron rather than +directly from ore. + +Carbon steel, with intermediate carbon content, was developed much later, +in Europe in the 17th century CE. It required a more sophisticated +process, because the blast furnace made it extremely difficult to achieve +a controlled carbon content. Tweaks of the blast furnace would sometimes +produce an intermediate carbon content by luck, but the first processes to +reliably produce steel were based on removing almost all the carbon from +pig iron and then explicitly mixing a controlled amount of carbon back in. + +In the game, the bloomery process is represented by ordinary cooking +or grinding of an iron lump. The lump represents unprocessed ore, +and is identified only as "iron", not specifically as wrought iron. +This standard refining process produces dust or an ingot which is +specifically identified as wrought iron. Thus the standard refining +process produces the (nearly) pure metal. + +Cast iron is trickier. You might expect from the real-life notes above +that cooking an iron lump (representing ore) would produce pig iron that +can then be cooked again to produce cast iron. This is kind of the case, +but not exactly, because as already noted cooking an iron lump produces +wrought iron. The game doesn't distinguish between low-temperature +and high-temperature cooking processes: the same furnace is used not +just to cast all kinds of metal but also to cook food. So there is no +distinction between cooking processes to produce distinct wrought iron +and pig iron. But repeated cooking *is* available as a game mechanic, +and is indeed used to produce cast iron: re-cooking a wrought iron ingot +produces a cast iron ingot. So pig iron isn't represented in the game as +a distinct item; instead wrought iron stands in for pig iron in addition +to its realistic uses as wrought iron. + +Carbon steel is produced by a more regular in-game process: alloying +wrought iron with coal dust (which is essentially carbon). This bears +a fair resemblance to the historical development of carbon steel. +This alloying recipe is relatively time-consuming for the amount of +material processed, when compared against other alloying recipes, and +carbon steel is heavily used, so it is wise to alloy it in advance, +when you're not waiting for it. + +There are additional recipes that permit all three of these types of iron +to be converted into each other. Alloying carbon steel again with coal +dust produces cast iron, with its higher carbon content. Cooking carbon +steel or cast iron produces wrought iron, in an abbreviated form of the +bloomery process. + +There's one more iron alloy in the game: stainless steel. It is managed +in a completely regular manner, created by alloying carbon steel with +chromium. + +### uranium enrichment ### + +When uranium is to be used to fuel a nuclear reactor, it is not +sufficient to merely isolate and refine uranium metal. It is necessary +to control its isotopic composition, because the different isotopes +behave differently in nuclear processes. + +The main isotopes of interest are U-235 and U-238. U-235 is good at +sustaining a nuclear chain reaction, because when a U-235 nucleus is +bombarded with a neutron it will usually fission (split) into fragments. +It is therefore described as "fissile". U-238, on the other hand, +is not fissile: if bombarded with a neutron it will usually capture it, +becoming U-239, which is very unstable and quickly decays into semi-stable +(and fissile) plutonium-239. + +Inconveniently, the fissile U-235 makes up only about 0.7% of natural +uranium, almost all of the other 99.3% being U-238. Natural uranium +therefore doesn't make a great nuclear fuel. (In real life there are +a small number of reactor types that can use it, but technic doesn't +have such a reactor.) Better nuclear fuel needs to contain a higher +proportion of U-235. + +Achieving a higher U-235 content isn't as simple as separating the U-235 +from the U-238 and just using the required amount of U-235. Because +U-235 and U-238 are both uranium, and therefore chemically identical, +they cannot be chemically separated, in the way that different elements +are separated from each other when refining metal. They do differ +in atomic mass, so they can be separated by centrifuging, but because +their atomic masses are very close, centrifuging doesn't separate them +very well. They cannot be separated completely, but it is possible to +produce uranium that has the isotopes mixed in different proportions. +Uranium with a significantly larger fissile U-235 fraction than natural +uranium is called "enriched", and that with a significantly lower fissile +fraction is called "depleted". + +A single pass through a centrifuge produces two output streams, one with +a fractionally higher fissile proportion than the input, and one with a +fractionally lower fissile proportion. To alter the fissile proportion +by a significant amount, these output streams must be centrifuged again, +repeatedly. The usual arrangement is a "cascade", a linear arrangement +of many centrifuges. Each centrifuge takes as input uranium with some +specific fissile proportion, and passes its two output streams to the +two adjacent centrifuges. Natural uranium is input somewhere in the +middle of the cascade, and the two ends of the cascade produce properly +enriched and depleted uranium. + +Fuel for technic's nuclear reactor consists of enriched uranium of which +3.5% is fissile. (This is a typical value for a real-life light water +reactor, a common type for power generation.) To enrich uranium in the +game, it must first be in dust form: the centrifuge will not operate +on ingots. (In real life uranium enrichment is done with the uranium +in the form of a gas.) It is best to grind uranium lumps directly to +dust, rather than cook them to ingots first, because this yields twice +as much metal dust. When uranium is in refined form (dust, ingot, or +block), the name of the inventory item indicates its fissile proportion. +Uranium of any available fissile proportion can be put through all the +usual processes for metal. + +A single centrifuge operation takes two uranium dust piles, and produces +as output one dust pile with a fissile proportion 0.1% higher and one with +a fissile proportion 0.1% lower. Uranium can be enriched up to the 3.5% +required for nuclear fuel, and depleted down to 0.0%. Thus a cascade +covering the full range of fissile fractions requires 34 cascade stages. +(In real life, enriching to 3.5% uses thousands of cascade stages. +Also, centrifuging is less effective when the input isotope ratio +is more skewed, so the steps in fissile proportion are smaller for +relatively depleted uranium. Zero fissile content is only asymptotically +approachable, and natural uranium relatively cheap, so uranium is normally +only depleted to around 0.3%. On the other hand, much higher enrichment +than 3.5% isn't much more difficult than enriching that far.) + +Although centrifuges can be used manually, it is not feasible to perform +uranium enrichment by hand. It is a practical necessity to set up +an automated cascade, using pneumatic tubes to transfer uranium dust +piles between centrifuges. Because both outputs from a centrifuge are +ejected into the same tube, sorting tubes are needed to send the outputs +in different directions along the cascade. It is possible to send items +into the centrifuges through the same tubes that take the outputs, so the +simplest version of the cascade structure has a line of 34 centrifuges +linked by a line of 34 sorting tube segments. + +Assuming that the cascade depletes uranium all the way to 0.0%, +producing one unit of 3.5%-fissile uranium requires the input of five +units of 0.7%-fissile (natural) uranium, takes 490 centrifuge operations, +and produces four units of 0.0%-fissile (fully depleted) uranium as a +byproduct. It is possible to reduce the number of required centrifuge +operations by using more natural uranium input and outputting only +partially depleted uranium, but (unlike in real life) this isn't usually +an economical approach. The 490 operations are not spread equally over +the cascade stages: the busiest stage is the one taking 0.7%-fissile +uranium, which performs 28 of the 490 operations. The least busy is the +one taking 3.4%-fissile uranium, which performs 1 of the 490 operations. + +A centrifuge cascade will consume quite a lot of energy. It is +worth putting a battery upgrade in each centrifuge. (Only one can be +accommodated, because a control logic unit upgrade is also required for +tube operation.) An MV centrifuge, the only type presently available, +draws 7 kEU/s in this state, and takes 5 s for each uranium centrifuging +operation. It thus takes 35 kEU per operation, and the cascade requires +17.15 MEU to produce each unit of enriched uranium. It takes five units +of enriched uranium to make each fuel rod, and six rods to fuel a reactor, +so the enrichment cascade requires 514.5 MEU to process a full set of +reactor fuel. This is about 0.85% of the 6.048 GEU that the reactor +will generate from that fuel. + +If there is enough power available, and enough natural uranium input, +to keep the cascade running continuously, and exactly one centrifuge +at each stage, then the overall speed of the cascade is determined by +the busiest stage, the 0.7% stage. It can perform its 28 operations +towards the enrichment of a single uranium unit in 140 s, so that is +the overall cycle time of the cascade. It thus takes 70 min to enrich +a full set of reactor fuel. While the cascade is running at this full +speed, its average power consumption is 122.5 kEU/s. The instantaneous +power consumption varies from second to second over the 140 s cycle, +and the maximum possible instantaneous power consumption (with all 34 +centrifuges active simultaneously) is 238 kEU/s. It is recommended to +have some battery boxes to smooth out these variations. + +If the power supplied to the centrifuge cascade averages less than +122.5 kEU/s, then the cascade can't run continuously. (Also, if the +power supply is intermittent, such as solar, then continuous operation +requires more battery boxes to smooth out the supply variations, even if +the average power is high enough.) Because it's automated and doesn't +require continuous player attention, having the cascade run at less +than full speed shouldn't be a major problem. The enrichment work will +consume the same energy overall regardless of how quickly it's performed, +and the speed will vary in direct proportion to the average power supply +(minus any supply lost because battery boxes filled completely). + +If there is insufficient power to run both the centrifuge cascade at +full speed and whatever other machines require power, all machines on +the same power network as the centrifuge will be forced to run at the +same fractional speed. This can be inconvenient, especially if use +of the other machines is less automated than the centrifuge cascade. +It can be avoided by putting the centrifuge cascade on a separate power +network from other machines, and limiting the proportion of the generated +power that goes to it. + +If there is sufficient power and it is desired to enrich uranium faster +than a single cascade can, the process can be speeded up more economically +than by building an entire second cascade. Because the stages of the +cascade do different proportions of the work, it is possible to add a +second and subsequent centrifuges to only the busiest stages, and have +the less busy stages still keep up with only a single centrifuge each. + +Another possible approach to uranium enrichment is to have no fixed +assignment of fissile proportions to centrifuges, dynamically putting +whatever uranium is available into whichever centrifuges are available. +Theoretically all of the centrifuges can be kept almost totally busy all +the time, making more efficient use of capital resources, and the number +of centrifuges used can be as little (down to one) or as large as desired. +The difficult part is that it is not sufficient to put each uranium dust +pile individually into whatever centrifuge is available: they must be +input in matched pairs. Any odd dust pile in a centrifuge will not be +processed and will prevent that centrifuge from accepting any other input. + +### concrete ### + +Concrete is a synthetic building material. The technic modpack implements +it in the game. + +Two forms of concrete are available as building blocks: ordinary +"concrete" and more advanced "blast-resistant concrete". Despite its +name, the latter has no special resistance to explosions or to any other +means of destruction. + +Concrete can also be used to make fences. They act just like wooden +fences, but aren't flammable. Confusingly, the item that corresponds +to a wooden "fence" is called "concrete post". Posts placed adjacently +will implicitly create fence between them. Fencing also appears between +a post and adjacent concrete block. + +industrial processes +-------------------- + +### alloying ### + +In technic, alloying is a way of combining items to create other items, +distinct from standard crafting. Alloying always uses inputs of exactly +two distinct types, and produces a single output. Like cooking, which +takes a single input, it is performed using a powered machine, known +generically as an "alloy furnace". An alloy furnace always has two +input slots, and it doesn't matter which way round the two ingredients +are placed in the slots. Many alloying recipes require one or both +slots to contain a stack of more than one of the ingredient item: the +quantity required of each ingredient is part of the recipe. + +As with the furnaces used for cooking, there are multiple kinds of alloy +furnace, powered in different ways. The most-used alloy furnaces are +electrically powered. There is also an alloy furnace that is powered +by directly burning fuel, just like the basic cooking furnace. Building +almost any electrical machine, including the electrically-powered alloy +furnaces, requires a machine casing component, one ingredient of which +is brass, an alloy. It is therefore necessary to use the fuel-fired +alloy furnace in the early part of the game, on the way to building +electrical machinery. + +Alloying recipes are mainly concerned with metals. These recipes +combine a base metal with some other element, most often another metal, +to produce a new metal. This is discussed in the section on metal. +There are also a few alloying recipes in which the base ingredient is +non-metallic, such as the recipe for the silicon wafer. + +### grinding, extracting, and compressing ### + +Grinding, extracting, and compressing are three distinct, but very +similar, ways of converting one item into another. They are all quite +similar to the cooking found in the basic Minetest game. Each uses +an input consisting of a single item type, and produces a single +output. They are all performed using powered machines, respectively +known generically as a "grinder", "extractor", and "compressor". +Some compressing recipes require the input to be a stack of more than +one of the input item: the quantity required is part of the recipe. +Grinding and extracting recipes never require such a stacked input. + +There are multiple kinds of grinder, extractor, and compressor. Unlike +cooking furnaces and alloy furnaces, there are none that directly burn +fuel; they are all electrically powered. + +Grinding recipes always produce some kind of dust, loosely speaking, +as output. The most important grinding recipes are concerned with metals: +every metal lump or ingot can be ground into metal dust. Coal can also +be ground into dust, and burning the dust as fuel produces much more +energy than burning the original coal lump. There are a few other +grinding recipes that make block types from the basic Minetest game +more interconvertible: standard stone can be ground to standard sand, +desert stone to desert sand, cobblestone to gravel, and gravel to dirt. + +Extracting is a miscellaneous category, used for a small group +of processes that just don't fit nicely anywhere else. (Its name is +notably vaguer than those of the other kinds of processing.) It is used +for recipes that produce dye, mainly from flowers. (However, for those +recipes using flowers, the basic Minetest game provides parallel crafting +recipes that are easier to use and produce more dye, and those recipes +are not suppressed by technic.) Its main use is to generate rubber from +raw latex, which it does three times as efficiently as merely cooking +the latex. Extracting was also formerly used for uranium enrichment for +use as nuclear fuel, but this use has been superseded by a new enrichment +system using the centrifuge. + +Compressing recipes are mainly used to produce a few relatively advanced +artificial item types, such as the copper and carbon plates used in +advanced machine recipes. There are also a couple of compressing recipes +making natural block types more interconvertible. + +### centrifuging ### + +Centrifuging is another way of using a machine to convert items. +Centrifuging takes an input of a single item type, and produces outputs +of two distinct types. The input may be required to be a stack of +more than one of the input item: the quantity required is part of +the recipe. Centrifuging is only performed by a single machine type, +the MV (electrically-powered) centrifuge. + +Currently, centrifuging recipes don't appear in the unified\_inventory +craft guide, because unified\_inventory can't yet handle recipes with +multiple outputs. + +Generally, centrifuging separates the input item into constituent +substances, but it can only work when the input is reasonably fluid, +and in marginal cases it is quite destructive to item structure. +(In real life, centrifuges require their input to be mainly fluid, that +is either liquid or gas. Few items in the game are described as liquid +or gas, so the concept of the centrifuge is stretched a bit to apply to +finely-divided solids.) + +The main use of centrifuging is in uranium enrichment, where it +separates the isotopes of uranium dust that otherwise appears uniform. +Enrichment is a necessary process before uranium can be used as nuclear +fuel, and the radioactivity of uranium blocks is also affected by its +isotopic composition. + +A secondary use of centrifuging is to separate the components of +metal alloys. This can only be done using the dust form of the alloy. +It recovers both components of binary metal/metal alloys. It can't +recover the carbon from steel or cast iron. + +chests +------ + +The technic mod replaces the basic Minetest game's single type of +chest with a range of chests that have different sizes and features. +The chest types are identified by the materials from which they are made; +the better chests are made from more exotic materials. The chest types +form a linear sequence, each being (with one exception noted below) +strictly more powerful than the preceding one. The sequence begins with +the wooden chest from the basic game, and each later chest type is built +by upgrading a chest of the preceding type. The chest types are: + +1. wooden chest: 8×4 (32) slots +2. iron chest: 9×5 (45) slots +3. copper chest: 12×5 (60) slots +4. silver chest: 12×6 (72) slots +5. gold chest: 15×6 (90) slots +6. mithril chest: 15×6 (90) slots + +The iron and later chests have the ability to sort their contents, +when commanded by a button in their interaction forms. Item types are +sorted in the same order used in the unified\_inventory craft guide. +The copper and later chests also have an auto-sorting facility that can +be enabled from the interaction form. An auto-sorting chest automatically +sorts its contents whenever a player closes the chest. The contents will +then usually be in a sorted state when the chest is opened, but may not +be if pneumatic tubes have operated on the chest while it was closed, +or if two players have the chest open simultaneously. + +The silver and gold chests, but not the mithril chest, have a built-in +sign-like capability. They can be given a textual label, which will +be visible when hovering over the chest. The gold chest, but again not +the mithril chest, can be further labelled with a colored patch that is +visible from a moderate distance. + +The mithril chest is currently an exception to the upgrading system. +It has only as many inventory slots as the preceding (gold) type, and has +fewer of the features. It has no feature that other chests don't have: +it is strictly weaker than the gold chest. It is planned that in the +future it will acquire some unique features, but for now the only reason +to use it is aesthetic. + +The size of the largest chests is dictated by the maximum size +of interaction form that the game engine can successfully display. +If in the future the engine becomes capable of handling larger forms, +by scaling them to fit the screen, the sequence of chest sizes will +likely be revised. + +As with the chest of the basic Minetest game, each chest type comes +in both locked and unlocked flavors. All of the chests work with the +pneumatic tubes of the pipeworks mod. + +radioactivity +------------- + +The technic mod adds radioactivity to the game, as a hazard that can +harm player characters. Certain substances in the game are radioactive, +and when placed as blocks in the game world will damage nearby players. +Conversely, some substances attenuate radiation, and so can be used +for shielding. The radioactivity system is based on reality, but is +not an attempt at serious simulation: like the rest of the game, it has +many simplifications and deliberate deviations from reality in the name +of game balance. + +In real life radiological hazards can be roughly divided into three +categories based on the time scale over which they act: prompt radiation +damage (such as radiation burns) that takes effect immediately; radiation +poisoning that becomes visible in hours and lasts weeks; and cumulative +effects such as increased cancer risk that operate over decades. +The game's version of radioactivity causes only prompt damage, not +any delayed effects. Damage comes in the abstracted form of removing +the player's hit points, and is immediately visible to the player. +As with all other kinds of damage in the game, the player can restore +the hit points by eating food items. High-nutrition foods, such as the +pie baskets supplied by the bushes\_classic mod, are a useful tool in +dealing with radiological hazards. + +Only a small range of items in the game are radioactive. From the technic +mod, the only radioactive items are uranium ore, refined uranium blocks, +nuclear reactor cores (when operating), and the materials released when +a nuclear reactor melts down. Other mods can plug into the technic +system to make their own block types radioactive. Radioactive items +are harmless when held in inventories. They only cause radiation damage +when placed as blocks in the game world. + +The rate at which damage is caused by a radioactive block depends on the +distance between the source and the player. Distance matters because the +damaging radiation is emitted equally in all directions by the source, +so with distance it spreads out, so less of it will strike a target +of any specific size. The amount of radiation absorbed by a target +thus varies in proportion to the inverse square of the distance from +the source. The game imitates this aspect of real-life radioactivity, +but with some simplifications. While in real life the inverse square law +is only really valid for sources and targets that are small relative to +the distance between them, in the game it is applied even when the source +and target are large and close together. Specifically, the distance is +measured from the center of the radioactive block to the abdomen of the +player character. For extremely close encounters, such as where the +player swims in a radioactive liquid, there is an enforced lower limit +on the effective distance. + +Different types of radioactive block emit different amounts of radiation. +The least radioactive of the radioactive block types is uranium ore, +which causes 0.25 HP/s damage to a player 1 m away. A block of refined +but unenriched uranium, as an example, is nine times as radioactive, +and so will cause 2.25 HP/s damage to a player 1 m away. By the inverse +square law, the damage caused by that uranium block reduces by a factor +of four at twice the distance, that is to 0.5625 HP/s at a distance of 2 +m, or by a factor of nine at three times the distance, that is to 0.25 +HP/s at a distance of 3 m. Other radioactive block types are far more +radioactive than these: the most radioactive of all, the result of a +nuclear reactor melting down, is 1024 times as radioactive as uranium ore. + +Uranium blocks are radioactive to varying degrees depending on their +isotopic composition. An isotope being fissile, and thus good as +reactor fuel, is essentially uncorrelated with it being radioactive. +The fissile U-235 is about six times as radioactive than the non-fissile +U-238 that makes up the bulk of natural uranium, so one might expect that +enriching from 0.7% fissile to 3.5% fissile (or depleting to 0.0%) would +only change the radioactivity of uranium by a few percent. But actually +the radioactivity of enriched uranium is dominated by the non-fissile +U-234, which makes up only about 50 parts per million of natural uranium +but is about 19000 times more radioactive than U-238. The radioactivity +of natural uranium comes just about half from U-238 and half from U-234, +and the uranium gets enriched in U-234 along with the U-235. This makes +3.5%-fissile uranium about three times as radioactive as natural uranium, +and 0.0%-fissile uranium about half as radioactive as natural uranium. + +Radiation is attenuated by the shielding effect of material along the +path between the radioactive block and the player. In general, only +blocks of homogeneous material contribute to the shielding effect: for +example, a block of solid metal has a shielding effect, but a machine +does not, even though the machine's ingredients include a metal case. +The shielding effect of each block type is based on the real-life +resistance of the material to ionising radiation, but for game balance +the effectiveness of shielding is scaled down from real life, more so +for stronger shield materials than for weaker ones. Also, whereas in +real life materials have different shielding effects against different +types of radiation, the game only has one type of damaging radiation, +and so only one set of shielding values. + +Almost any solid or liquid homogeneous material has some shielding value. +At the low end of the scale, 5 meters of wooden planks nearly halves +radiation, though in that case the planks probably contribute more +to safety by forcing the player to stay 5 m further away from the +source than by actual attenuation. Dirt halves radiation in 2.4 m, +and stone in 1.7 m. When a shield must be deliberately constructed, +the preferred materials are metals, the denser the better. Iron and +steel halve radiation in 1.1 m, copper in 1.0 m, and silver in 0.95 m. +Lead would halve in 0.69 m if it were in the game, but it's not, which +poses a bit of a problem due to the drawbacks of the three materials in +the game that are better shielding than silver. Gold halves radiation +in 0.53 m (factor of 3.7 per meter), but is a bit scarce to use for +this purpose. Uranium halves radiation in 0.31 m (factor of 9.4 per +meter), but is itself radioactive. The very best shielding in the game +is nyancat material (nyancats and their rainbow blocks), which halves +radiation in 0.22 m (factor of 24 per meter), but is extremely scarce. + +If the theoretical radiation damage from a particular source is +sufficiently small, due to distance and shielding, then no damage at all +will actually occur. This means that for any particular radiation source +and shielding arrangement there is a safe distance to which a player can +approach without harm. The safe distance is where the radiation damage +would theoretically be 0.25 HP/s. This damage threshold is applied +separately for each radiation source, so to be safe in a multi-source +situation it is only necessary to be safe from each source individually. + +The best way to use uranium as shielding is in a two-layer structure, +of uranium and some non-radioactive material. The uranium layer should +be nearer to the primary radiation source and the non-radioactive layer +nearer to the player. The uranium provides a great deal of shielding +against the primary source, and the other material shields against +the uranium layer. Due to the damage threshold mechanism, a meter of +dirt is sufficient to shield fully against a layer of fully-depleted +(0.0%-fissile) uranium. Obviously this is only worthwhile when the +primary radiation source is more radioactive than a uranium block. + +When constructing permanent radiation shielding, it is necessary to +pay attention to the geometry of the structure, and particularly to any +holes that have to be made in the shielding, for example to accommodate +power cables. Any hole that is aligned with the radiation source makes a +"shine path" through which a player may be irradiated when also aligned. +Shine paths can be avoided by using bent paths for cables, passing +through unaligned holes in multiple shield layers. If the desired +shielding effect depends on multiple layers, a hole in one layer still +produces a partial shine path, along which the shielding is reduced, +so the positioning of holes in each layer must still be considered. +Tricky shine paths can also be addressed by just keeping players out of +the dangerous area. + +electrical power +---------------- + +Most machines in technic are electrically powered. To operate them it is +necessary to construct an electrical power network. The network links +together power generators and power-consuming machines, connecting them +using power cables. + +There are three tiers of electrical networking: low voltage (LV), +medium voltage (MV), and high voltage (HV). Each network must operate +at a single voltage, and most electrical items are specific to a single +voltage. Generally, the machines of higher tiers are more powerful, +but consume more energy and are more expensive to build, than machines +of lower tiers. It is normal to build networks of all three tiers, +in ascending order as one progresses through the game, but it is not +strictly necessary to do this. Building HV equipment requires some parts +that can only be manufactured using electrical machines, either LV or MV, +so it is not possible to build an HV network first, but it is possible +to skip either LV or MV on the way to HV. + +Each voltage has its own cable type, with distinctive insulation. Cable +segments connect to each other and to compatible machines automatically. +Incompatible electrical items don't connect. All non-cable electrical +items must be connected via cable: they don't connect directly to each +other. Most electrical items can connect to cables in any direction, +but there are a couple of important exceptions noted below. + +To be useful, an electrical network must connect at least one power +generator to at least one power-consuming machine. In addition to these +items, the network must have a "switching station" in order to operate: +no energy will flow without one. Unlike most electrical items, the +switching station is not voltage-specific: the same item will manage +a network of any tier. However, also unlike most electrical items, +it is picky about the direction in which it is connected to the cable: +the cable must be directly below the switching station. + +Hovering over a network's switching station will show the aggregate energy +supply and demand, which is useful for troubleshooting. Electrical energy +is measured in "EU", and power (energy flow) in EU per second (EU/s). +Energy is shifted around a network instantaneously once per second. + +In a simple network with only generators and consumers, if total +demand exceeds total supply then no energy will flow, the machines +will do nothing, and the generators' output will be lost. To handle +this situation, it is recommended to add a battery box to the network. +A battery box will store generated energy, and when enough has been +stored to run the consumers for one second it will deliver it to the +consumers, letting them run part-time. It also stores spare energy +when supply exceeds demand, to let consumers run full-time when their +demand occasionally peaks above the supply. More battery boxes can +be added to cope with larger periods of mismatched supply and demand, +such as those resulting from using solar generators (which only produce +energy in the daytime). + +When there are electrical networks of multiple tiers, it can be appealing +to generate energy on one tier and transfer it to another. The most +direct way to do this is with the "supply converter", which can be +directly wired into two networks. It is another tier-independent item, +and also particular about the direction of cable connections: it must +have the cable of one network directly above, and the cable of another +network directly below. The supply converter demands 10000 EU/s from +the network above, and when this network gives it power it supplies 9000 +EU/s to the network below. Thus it is only 90% efficient, unlike most of +the electrical system which is 100% efficient in moving energy around. +To transfer more than 10000 EU/s between networks, connect multiple +supply converters in parallel. + +powered machines +---------------- + +### powered machine tiers ### + +Each powered machine takes its power in some specific form, being +either fuel-fired (burning fuel directly) or electrically powered at +some specific voltage. There is a general progression through the +game from using fuel-fired machines to electrical machines, and to +higher electrical voltages. The most important kinds of machine come +in multiple variants that are powered in different ways, so the earlier +ones can be superseded. However, some machines are only available for +a specific power tier, so the tier can't be entirely superseded. + +### powered machine upgrades ### + +Some machines have inventory slots that are used to upgrade them in +some way. Generally, machines of MV and HV tiers have two upgrade slots, +and machines of lower tiers (fuel-fired and LV) do not. Any item can +be placed in an upgrade slot, but only specific items will have any +upgrading effect. It is possible to have multiple upgrades of the same +type, but this can't be achieved by stacking more than one upgrade item +in one slot: it is necessary to put the same kind of item in more than one +upgrade slot. The ability to upgrade machines is therefore very limited. +Two kinds of upgrade are currently possible: an energy upgrade and a +tube upgrade. + +An energy upgrade consists of a battery item, the same kind of battery +that serves as a mobile energy store. The effect of an energy upgrade +is to improve in some way the machine's use of electrical energy, most +often by making it use less energy. The upgrade effect has no relation +to energy stored in the battery: the battery's charge level is irrelevant +and will not be affected. + +A tube upgrade consists of a control logic unit item. The effect of a +tube upgrade is to make the machine able, or more able, to eject items +it has finished with into pneumatic tubes. The machines that can take +this kind of upgrade are in any case capable of accepting inputs from +pneumatic tubes. These upgrades are essential in using powered machines +as components in larger automated systems. + +### tubes with powered machines ### + +Generally, powered machines of MV and HV tiers can work with pneumatic +tubes, and those of lower tiers cannot. (As an exception, the fuel-fired +furnace from the basic Minetest game can accept inputs through tubes, +but can't output into tubes.) + +If a machine can accept inputs through tubes at all, then this +is a capability of the basic machine, not requiring any upgrade. +Most item-processing machines take only one kind of input, and in that +case they will accept that input from any direction. This doesn't match +how tubes visually connect to the machines: generally tubes will visually +connect to any face except the front, but an item passing through a tube +in front of the machine will actually be accepted into the machine. + +A minority of machines take more than one kind of input, and in that +case the input slot into which an arriving item goes is determined by the +direction from which it arrives. In this case the machine may be picky +about the direction of arriving items, associating each input type with +a single face of the machine and not accepting inputs at all through the +remaining faces. Again, the visual connection of tubes doesn't match: +generally tubes will still visually connect to any face except the front, +thus connecting to faces that neither accept inputs nor emit outputs. + +Machines do not accept items from tubes into non-input inventory slots: +the output slots or upgrade slots. Output slots are normally filled +only by the processing operation of the machine, and upgrade slots must +be filled manually. + +Powered machines generally do not eject outputs into tubes without +an upgrade. One tube upgrade will make them eject outputs at a slow +rate; a second tube upgrade will increase the rate. Whether the slower +rate is adequate depends on how it compares to the rate at which the +machine produces outputs, and on how the machine is being used as part +of a larger construct. The machine always ejects its outputs through a +particular face, usually a side. Due to a bug, the side through which +outputs are ejected is not consistent: when the machine is rotated one +way, the direction of ejection is rotated the other way. This will +probably be fixed some day, but because a straightforward fix would +break half the machines already in use, the fix may be tied to some +larger change such as free selection of the direction of ejection. + +### battery boxes ### + +The primary purpose of battery boxes is to temporarily store electrical +energy to let an electrical network cope with mismatched supply and +demand. They have a secondary purpose of charging and discharging +powered tools. They are thus a mixture of electrical infrastructure, +powered machine, and generator. + +MV and HV battery boxes have upgrade slots. Energy upgrades increase +the capacity of a battery box, each by 10% of the un-upgraded capacity. +This increase is far in excess of the capacity of the battery that forms +the upgrade. + +For charging and discharging of power tools, rather than having input and +output slots, each battery box has a charging slot and a discharging slot. +A fully charged/discharged item stays in its slot. The rates at which a +battery box can charge and discharge increase with voltage, so it can +be worth building a battery box of higher tier before one has other +infrastructure of that tier, just to get access to faster charging. + +MV and HV battery boxes work with pneumatic tubes. An item can be input +to the charging slot through the bottom of the battery box, or to the +discharging slot through the top. Items are not accepted through the +front, back, or sides. With a tube upgrade, fully charged/discharged +tools (as appropriate for their slot) will be ejected through a side. + +### processing machines ### + +The furnace, alloy furnace, grinder, extractor, compressor, and centrifuge +have much in common. Each implements some industrial process that +transforms items into other items, and they manner in which they present +these processes as powered machines is essentially identical. + +Most of the processing machines operate on inputs of only a single type +at a time, and correspondingly have only a single input slot. The alloy +furnace is an exception: it operates on inputs of two distinct types at +once, and correspondingly has two input slots. It doesn't matter which +way round the alloy furnace's inputs are placed in the two slots. + +The processing machines are mostly available in variants for multiple +tiers. The furnace and alloy furnace are each available in fuel-fired, +LV, and MV forms. The grinder, extractor, and compressor are each +available in LV and MV forms. The centrifuge is the only single-tier +processing machine, being only available in MV form. The higher-tier +machines process items faster than the lower-tier ones, but also have +higher power consumption, usually taking more energy overall to perform +the same amount of processing. The MV machines have upgrade slots, +and energy upgrades reduce their energy consumption. + +The MV machines can work with pneumatic tubes. They accept inputs via +tubes from any direction. For most of the machines, having only a single +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 +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 +there's no direct control ovar that, but there is a risk that supplying +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 MV machines can be given a tube upgrade to make them automatically +eject output items into pneumatic tubes. The items are always ejected +through a side, though which side it is depends on the machine's +orientation, due to a bug. Output items are always ejected singly. +For some machines, such as the grinder, the ejection rate with a +single tube upgrade doesn't keep up with the rate at which items can +be processed. A second tube upgrade increases the ejection rate. + +The LV and fuel-fired machines do not work with pneumatic tubes, except +that the fuel-fired furnace (actually part of the basic Minetest game) +can accept inputs from tubes. Items arriving through the bottom of +the furnace go into the fuel slot, and items arriving from all other +directions go into the input slot. + +### music player ### + +The music player is an LV powered machine that plays audio recordings. +It offers a selection of up to nine tracks. The technic modpack doesn't +include specific music tracks for this purpose; they have to be installed +separately. + +The music player gives the impression that the music is being played in +the Minetest world. The music only plays as long as the music player +is in place and is receiving electrical power, and the choice of music +is controlled by interaction with the machine. The sound also appears +to emanate specifically from the music player: the ability to hear it +depends on the player's distance from the music player. However, the +game engine doesn't currently support any other positional cues for +sound, such as attenuation, panning, or HRTF. The impression of the +sound being located in the Minetest world is also compromised by the +subjective nature of track choice: the specific music that is played to +a player depends on what media the player has installed. + +### CNC machine ### + +The CNC machine is an LV powered machine that cuts building blocks into a +variety of sub-block shapes that are not covered by the crafting recipes +of the stairs mod and its variants. Most of the target shapes are not +rectilinear, involving diagonal or curved surfaces. + +Only certain kinds of building material can be processed in the CNC +machine. + +### tool workshop ### + +The tool workshop is an MV powered machine that repairs mechanically-worn +tools, such as pickaxes and the other ordinary digging tools. It has +a single slot for a tool to be repaired, and gradually repairs the +tool while it is powered. For any single tool, equal amounts of tool +wear, resulting from equal amounts of tool use, take equal amounts of +repair effort. Also, all repairable tools currently take equal effort +to repair equal percentages of wear. The amount of tool use enabled by +equal amounts of repair therefore depends on the tool type. + +The mechanical wear that the tool workshop repairs is always indicated in +inventory displays by a colored bar overlaid on the tool image. The bar +can be seen to fill and change color as the tool workshop operates, +eventually disappearing when the repair is complete. However, not every +item that shows such a wear bar is using it to show mechanical wear. +A wear bar can also be used to indicate charging of a power tool with +stored electrical energy, or filling of a container, or potentially for +all sorts of other uses. The tool workshop won't affect items that use +wear bars to indicate anything other than mechanical wear. + +The tool workshop has upgrade slots. Energy upgrades reduce its power +consumption. + +It can work with pneumatic tubes. Tools to be repaired are accepted +via tubes from any direction. With a tube upgrade, the tool workshop +will also eject fully-repaired tools via one side, the choice of side +depending on the machine's orientation, as for processing machines. It is +safe to put into the tool workshop a tool that is already fully repaired: +assuming the presence of a tube upgrade, the tool will be quickly ejected. +Furthermore, any item of unrepairable type will also be ejected as if +fully repaired. (Due to a historical limitation of the basic Minetest +game, it is impossible for the tool workshop to distinguish between a +fully-repaired tool and any item type that never displays a wear bar.) + +### quarry ### + +The quarry is an HV powered machine that automatically digs out a +large area. The region that it digs out is a cuboid with a square +horizontal cross section, located immediately behind the quarry machine. +The quarry's action is slow and energy-intensive, but requires little +player effort. + +The size of the quarry's horizontal cross section is configurable through +the machine's interaction form. A setting referred to as "radius" +is an integer number of meters which can vary from 2 to 8 inclusive. +The horizontal cross section is a square with side length of twice the +radius plus one meter, thus varying from 5 to 17 inclusive. Vertically, +the quarry always digs from 3 m above the machine to 100 m below it, +inclusive, a total vertical height of 104 m. + +Whatever the quarry digs up is ejected through the top of the machine, +as if from a pneumatic tube. Normally a tube should be placed there +to convey the material into a sorting system, processing machines, or +at least chests. A chest may be placed directly above the machine to +capture the output without sorting, but is liable to overflow. + +If the quarry encounters something that cannot be dug, such as a liquid, +a locked chest, or a protected area, it will skip past that and attempt +to continue digging. However, anything remaining in the quarry area +after the machine has attempted to dig there will prevent the machine +from digging anything directly below it, all the way to the bottom +of the quarry. An undiggable block therefore casts a shadow of undug +blocks below it. If liquid is encountered, it is quite likely to flow +across the entire cross section of the quarry, preventing all digging. +The depth at which the quarry is currently attempting to dig is reported +in its interaction form, and can be manually reset to the top of the +quarry, which is useful to do if an undiggable obstruction has been +manually removed. + +The quarry consumes 10 kEU per block dug, which is quite a lot of energy. +With most of what is dug being mere stone, it is usually not economically +favorable to power a quarry from anything other than solar power. +In particular, one cannot expect to power a quarry by burning the coal +that it digs up. + +Given sufficient power, the quarry digs at a rate of one block per second. +This is rather tedious to wait for. Unfortunately, leaving the quarry +unattended normally means that the Minetest server won't keep the machine +running: it needs a player nearby. This can be resolved by using a world +anchor. The digging is still quite slow, and independently of whether a +world anchor is used the digging can be speeded up by placing multiple +quarry machines with overlapping digging areas. Four can be placed to +dig identical areas, one on each side of the square cross section. + +### forcefield emitter ### + +The forcefield emitter is an HV powered machine that generates a +forcefield remeniscent of those seen in many science-fiction stories. + +The emitter can be configured to generate a forcefield of either +spherical or cubical shape, in either case centered on the emitter. +The size of the forcefield is configured using a radius parameter that +is an integer number of meters which can vary from 5 to 20 inclusive. +For a spherical forcefield this is simply the radius of the forcefield; +for a cubical forcefield it is the distance from the emitter to the +center of each square face. + +The power drawn by the emitter is proportional to the surface area of +the forcefield being generated. A spherical forcefield is therefore the +cheapest way to enclose a specified volume of space with a forcefield, +if the shape of the space doesn't matter. A cubical forcefield is less +efficient at enclosing volume, but is cheaper than the larger spherical +forcefield that would be required if it is necessary to enclose a +cubical space. + +The emitter is normally controlled merely through its interaction form, +which has an enable/disable toggle. However, it can also (via the form) +be placed in a mesecon-controlled mode. If mesecon control is enabled, +the emitter must be receiving a mesecon signal in addition to being +manually enabled, in order for it to generate the forcefield. + +The forcefield itself behaves largely as if solid, despite being +immaterial: it cannot be traversed, and prevents access to blocks behind +it. It is transparent, but not totally invisible. It cannot be dug. +Some effects can pass through it, however, such as the beam of a mining +laser, and explosions. In fact, explosions as currently implemented by +the tnt mod actually temporarily destroy the forcefield itself; the tnt +mod assumes too much about the regularity of node types. + +The forcefield occupies space that would otherwise have been air, but does +not replace or otherwise interfere with materials that are solid, liquid, +or otherwise not just air. If such an object blocking the forcefield is +removed, the forcefield will quickly extend into the now-available space, +but it does not do so instantly: there is a brief moment when the space +is air and can be traversed. + +It is possible to have a doorway in a forcefield, by placing in advance, +in space that the forcefield would otherwise occupy, some non-air blocks +that can be walked through. For example, a door suffices, and can be +opened and closed while the forcefield is in place. + +power generators +---------------- + +### fuel-fired generators ### + +The fiel-fired generators are electrical power generators that generate +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 +any type of combustible fuel, such as coal. They are relatively easy +to build, and so tend to be the first kind of generator used to power +electrical machines. In this role they form an intermediate step between +the directly fuel-fired machines and a more mature electrical network +powered by means other than fuel combustion. They are also, by virtue of +simplicity and controllability, a useful fallback or peak load generator +for electrical networks that normally use more sophisticated generators. + +The MV and HV fuel-fired generators can accept fuel via pneumatic tube, +from any direction. + +Keeping a fuel-fired generator fully fuelled is usually wasteful, because +it will burn fuel as long as it has any, even if there is no demand for +the electrical power that it generates. This is unlike the directly +fuel-fired machines, which only burn fuel when they have work to do. +To satisfy intermittent demand without waste, a fuel-fired generator must +only be given fuel when there is either demand for the energy or at least +sufficient battery capacity on the network to soak up the excess energy. + +The higher-tier fuel-fired generators get much more energy out of a +fuel item than the lower-tier ones. The difference is much more than +is needed to overcome the inefficiency of supply converters, so it is +worth operating fuel-fired generators at a higher tier than the machines +being powered. + +### solar generators ### + +The solar generators are electrical power generators that generate power +from sunlight. Versions of them are available for all three voltages +(LV, MV, and HV). There are four types in total, two LV and one each +of MV and HV, forming a sequence of four tiers. The higher-tier ones +are each built mainly from three solar generators of the next tier down, +and their outputs scale in rough accordance, tripling at each tier. + +To operate, an arrayed solar generator must be at elevation +1 or above +and have a transparent block (typically air) immediately above it. +It will generate power only when the block above is well lit during +daylight hours. It will generate more power at higher elevation, +reaching maximum output at elevation +36 or higher when sunlit. The small +solar generator has similar rules with slightly different thresholds. +These rules are an attempt to ensure that the generator will only operate +from sunlight, but it is actually possible to fool them to some extent +with light sources such as meselamps. + +### hydro generator ### + +The hydro generator is an LV power generator that generates a small amount +of power from the natural motion of water. To operate, the generator must +be horizontally adjacent to water. It doesn't matter whether the water +consists of source blocks or flowing blocks. Having water adjacent on +more than one side, up to the full four, increases the generator's output. +The water itself is unaffected by the generator. + +### geothermal generator ### + +The geothermal generator is an LV power generator that generates a small +amount of power from the temperature difference between lava and water. +To operate, the generator must be horizontally adjacent to both lava +and water. It doesn't matter whether the liquids consist of source +blocks or flowing blocks. + +Beware that if lava and water blocks are adjacent to each other then the +lava will be solidified into stone or obsidian. If the lava adjacent to +the generator is thus destroyed, the generator will stop producing power. +Currently, in the default Minetest game, lava is destroyed even if +it is only diagonally adjacent to water. Under these circumstances, +the only way to operate the geothermal generator is with it adjacent +to one lava block and one water block, which are on opposite sides of +the generator. If diagonal adjacency doesn't destroy lava, such as with +the gloopblocks mod, then it is possible to have more than one lava or +water block adjacent to the geothermal generator. This increases the +generator's output, with the maximum output achieved with two adjacent +blocks of each liquid. + +### wind generator ### + +The wind generator is an MV power generator that generates a moderate +amount of energy from wind. To operate, the generator must be placed +atop a column of at least 20 wind mill frame blocks, and must be at +an elevation of +30 or higher. It generates more at higher elevation, +reaching maximum output at elevation +50 or higher. Its surroundings +don't otherwise matter; it doesn't actually need to be in open air. + +### nuclear generator ### + +The nuclear generator (nuclear reactor) is an HV power generator that +generates a large amount of energy from the controlled fission of +uranium-235. It must be fuelled, with uranium fuel rods, but consumes +the fuel quite slowly in relation to the rate at which it is likely to +be mined. The operation of a nuclear reactor poses radiological hazards +to which some thought must be given. Economically, the use of nuclear +power requires a high capital investment, and a secure infrastructure, +but rewards the investment well. + +Nuclear fuel is made from uranium. Natural uranium doesn't have a +sufficiently high proportion of U-235, so it must first be enriched +via centrifuge. Producing one unit of 3.5%-fissile uranium requires +the input of five units of 0.7%-fissile (natural) uranium, and produces +four units of 0.0%-fissile (fully depleted) uranium as a byproduct. +It takes five ingots of 3.5%-fissile uranium to make each fuel rod, and +six rods to fuel a reactor. It thus takes the input of the equivalent +of 150 ingots of natural uranium, which can be obtained from the mining +of 75 blocks of uranium ore, to make a full set of reactor fuel. + +The nuclear reactor is a large multi-block structure. Only one block in +the structure, the reactor core, is of a type that is truly specific to +the reactor; the rest of the structure consists of blocks that have mainly +non-nuclear uses. The reactor core is where all the generator-specific +action happens: it is where the fuel rods are inserted, and where the +power cable must connect to draw off the generated power. + +The reactor structure consists of concentric layers, each a cubical +shell, around the core. Immediately around the core is a layer of water, +representing the reactor coolant; water blocks may be either source blocks +or flowing blocks. Around that is a layer of stainless steel blocks, +representing the reactor pressure vessel, and around that a layer of +blast-resistant concrete blocks, representing a containment structure. +It is customary, though no longer mandatory, to surround this with a +layer of ordinary concrete blocks. The mandatory reactor structure +makes a 7×7×7 cube, and the full customary structure a +9×9×9 cube. + +The layers surrounding the core don't have to be absolutely complete. +Indeed, if they were complete, it would be impossible to cable the core to +a power network. The cable makes it necessary to have at least one block +missing from each surrounding layer. The water layer is only permitted +to have one water block missing of the 26 possible. The steel layer may +have up to two blocks missing of the 98 possible, and the blast-resistant +concrete layer may have up to two blocks missing of the 218 possible. +Thus it is possible to have not only a cable duct, but also a separate +inspection hole through the solid layers. The separate inspection hole +is of limited use: the cable duct can serve double duty. + +Once running, the reactor core is significantly radioactive. The layers +of reactor structure provide quite a lot of shielding, but not enough +to make the reactor safe to be around, in two respects. Firstly, the +shortest possible path from the core to a player outside the reactor +is sufficiently short, and has sufficiently little shielding material, +that it will damage the player. This only affects a player who is +extremely close to the reactor, and close to a face rather than a vertex. +The customary additional layer of ordinary concrete around the reactor +adds sufficient distance and shielding to negate this risk, but it can +also be addressed by just keeping extra distance (a little over two +meters of air). + +The second radiological hazard of a running reactor arises from shine +paths; that is, specific paths from the core that lack sufficient +shielding. The necessary cable duct, if straight, forms a perfect +shine path, because the cable itself has no radiation shielding effect. +Any secondary inspection hole also makes a shine path, along which the +only shielding material is the water of the reactor coolant. The shine +path aspect of the cable duct can be ameliorated by adding a kink in the +cable, but this still yields paths with reduced shielding. Ultimately, +shine paths must be managed either with specific shielding outside the +mandatory structure, or with additional no-go areas. + +The radioactivity of an operating reactor core makes starting up a reactor +hazardous, and can come as a surprise because the non-operating core +isn't radioactive at all. The radioactive damage is survivable, but it is +normally preferable to avoid it by some care around the startup sequence. +To start up, the reactor must have a full set of fuel inserted, have all +the mandatory structure around it, and be cabled to a switching station. +Only the fuel insertion requires direct access to the core, so irradiation +of the player can be avoided by making one of the other two criteria be +the last one satisfied. Completing the cabling to a switching station +is the easiest to do from a safe distance. + +Once running, the reactor will generate 100 kEU/s for a week (168 hours, +604800 seconds), a total of 6.048 GEU from one set of fuel. After the +week is up, it will stop generating and no longer be radioactive. It can +then be refuelled to run for another week. It is not really intended +to be possible to pause a running reactor, but actually disconnecting +it from a switching station will have the effect of pausing the week. +This will probably change in the future. A paused reactor is still +radioactive, just not generating electrical power. + +A running reactor can't be safely dismantled, and not only because +dismantling the reactor implies removing the shielding that makes +it safe to be close to the core. The mandatory parts of the reactor +structure are not just mandatory in order to start the reactor; they're +mandatory in order to keep it intact. If the structure around the core +gets damaged, and remains damaged, the core will eventually melt down. +How long there is before meltdown depends on the extent of the damage; +if only one mandatory block is missing, meltdown will follow in 100 +seconds. While the structure of a running reactor is in a damaged state, +heading towards meltdown, a siren built into the reactor core will sound. +If the structure is rectified, the siren will signal all-clear. If the +siren stops sounding without signalling all-clear, then it was stopped +by meltdown. + +If meltdown is imminent because of damaged reactor structure, digging the +reactor core is not a way to avert it. Digging the core of a running +reactor causes instant meltdown. The only way to dismantle a reactor +without causing meltdown is to start by waiting for it to finish the +week-long burning of its current set of fuel. Once a reactor is no longer +operating, it can be dismantled by ordinary means, with no special risks. + +Meltdown, if it occurs, destroys the reactor and poses a major +environmental hazard. The reactor core melts, becoming a hot, highly +radioactive liquid known as "corium". A single meltdown yields a single +corium source block, where the core used to be. Corium flows, and the +flowing corium is very destructive to whatever it comes into contact with. +Flowing corium also randomly solidifies into a radioactive solid called +"Chernobylite". The random solidification and random destruction of +solid blocks means that the flow of corium is constantly changing. +This combined with the severe radioactivity makes corium much more +challenging to deal with than lava. If a meltdown is left to its own +devices, it gets worse over time, as the corium works its way through +the reactor structure and starts to flow over a variety of paths. +It is best to tackle a meltdown quickly; the priority is to extinguish +the corium source block, normally by dropping gravel into it. Only the +most motivated should attempt to pick up the corium in a bucket. + +administrative world anchor +--------------------------- + +A world anchor is an object in the Minetest world that causes the server +to keep surrounding parts of the world running even when no players +are nearby. It is mainly used to allow machines to run unattended: +normally machines are suspended when not near a player. The technic +mod supplies a form of world anchor, as a placable block, but it is not +straightforwardly available to players. There is no recipe for it, so it +is only available if explicitly spawned into existence by someone with +administrative privileges. In a single-player world, the single player +normally has administrative privileges, and can obtain a world anchor +by entering the chat command "/give singleplayer technic:admin\_anchor". + +The world anchor tries to force a cubical area, centered upon the anchor, +to stay loaded. The distance from the anchor to the most distant map +nodes that it will keep loaded is referred to as the "radius", and can be +set in the world anchor's interaction form. The radius can be set as low +as 0, meaning that the anchor only tries to keep itself loaded, or as high +as 255, meaning that it will operate on a 511×511×511 cube. +Larger radii are forbidden, to avoid typos causing the server excessive +work; to keep a larger area loaded, use multiple anchors. Also use +multiple anchors if the area to be kept loaded is not well approximated +by a cube. + +The world is always kept loaded in units of 16×16×16 cubes, +confusingly known as "map blocks". The anchor's configured radius takes +no account of map block boundaries, but the anchor's effect is actually to +keep loaded each map block that contains any part of the configured cube. +The anchor's interaction form includes a status note showing how many map +blocks this is, and how many of those it is successfully keeping loaded. +When the anchor is disabled, as it is upon placement, it will always +show that it is keeping no map blocks loaded; this does not indicate +any kind of failure. + +The world anchor can optionally be locked. When it is locked, only +the anchor's owner, the player who placed it, can reconfigure it or +remove it. Only the owner can lock it. Locking an anchor is useful +if the use of anchors is being tightly controlled by administrators: +an administrator can set up a locked anchor and be sure that it will +not be set by ordinary players to an unapproved configuration. + +The server limits the ability of world anchors to keep parts of the world +loaded, to avoid overloading the server. The total number of map blocks +that can be kept loaded in this way is set by the server configuration +item "max\_forceloaded\_blocks" (in minetest.conf), which defaults to +only 16. For comparison, each player normally keeps 125 map blocks loaded +(a radius of 32). If an enabled world anchor shows that it is failing to +keep all the map blocks loaded that it would like to, this can be fixed +by increasing max\_forceloaded\_blocks by the amount of the shortfall. + +The tight limit on force-loading is the reason why the world anchor is +not directly available to players. With the limit so low both by default +and in common practice, the only feasible way to determine where world +anchors should be used is for administrators to decide it directly. + +subjects missing from this manual +--------------------------------- + +This manual needs to be extended with sections on: + +* powered tools + * tool charging + * battery and energy crystals + * chainsaw + * flashlight + * mining lasers + * mining drills + * prospector + * sonic screwdriver +* liquid cans +* wrench +* frames +* templates diff --git a/technic/modpack.txt b/technic/modpack.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/technic/modpack.txt @@ -0,0 +1 @@ + diff --git a/technic/technic/README.md b/technic/technic/README.md new file mode 100644 index 0000000..b6aa05f --- /dev/null +++ b/technic/technic/README.md @@ -0,0 +1,27 @@ +Technic +======= + +License +------- + +Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel) + +Technic chests code is licensed under the GNU LGPLv2+. + +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) + * Everything else. + +CC BY-SA 3.0: <http://creativecommons.org/licenses/by-sa/3.0/> diff --git a/technic/technic/config.lua b/technic/technic/config.lua new file mode 100644 index 0000000..81a2224 --- /dev/null +++ b/technic/technic/config.lua @@ -0,0 +1,18 @@ +technic.config = technic.config or Settings(minetest.get_worldpath().."/technic.conf") + +local conf_table = technic.config:to_table() + +local defaults = { + enable_mining_drill = "true", + enable_mining_laser = "true", + enable_flashlight = "false", + enable_wind_mill = "false", + enable_frames = "false", + enable_corium_griefing = "true", +} + +for k, v in pairs(defaults) do + if conf_table[k] == nil then + technic.config:set(k, v) + end +end diff --git a/technic/technic/crafts.lua b/technic/technic/crafts.lua new file mode 100644 index 0000000..8a8cd37 --- /dev/null +++ b/technic/technic/crafts.lua @@ -0,0 +1,193 @@ +-- check if we have the necessary dependencies to allow actually using these materials in the crafts +local mesecons_materials = minetest.get_modpath("mesecons_materials") + +-- tubes crafting recipes + +minetest.register_craft({ + output = 'pipeworks:accelerator_tube_1', + recipe = { + {'technic:copper_coil', 'pipeworks:tube_1', 'technic:copper_coil'}, + } +}) + +minetest.register_craft({ + output = 'pipeworks:teleport_tube_1', + recipe = { + {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'}, + {'pipeworks:tube_1', 'technic:control_logic_unit', 'pipeworks:tube_1'}, + {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'}, + } +}) + +minetest.register_craft({ + output = 'technic:diamond_drill_head', + recipe = { + {'technic:stainless_steel_ingot', 'default:diamond', 'technic:stainless_steel_ingot'}, + {'default:diamond', '', 'default:diamond'}, + {'technic:stainless_steel_ingot', 'default:diamond', 'technic:stainless_steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:green_energy_crystal', + recipe = { + {'default:gold_ingot', 'technic:battery', 'dye:green'}, + {'technic:battery', 'technic:red_energy_crystal', 'technic:battery'}, + {'dye:green', 'technic:battery', 'default:gold_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:blue_energy_crystal', + recipe = { + {'moreores:mithril_ingot', 'technic:battery', 'dye:blue'}, + {'technic:battery', 'technic:green_energy_crystal', 'technic:battery'}, + {'dye:blue', 'technic:battery', 'moreores:mithril_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:red_energy_crystal', + recipe = { + {'moreores:silver_ingot', 'technic:battery', 'dye:red'}, + {'technic:battery', 'default:diamondblock', 'technic:battery'}, + {'dye:red', 'technic:battery', 'moreores:silver_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:fine_copper_wire 2', + recipe = { + {'', 'default:copper_ingot', ''}, + {'', 'default:copper_ingot', ''}, + {'', 'default:copper_ingot', ''}, + } +}) + +minetest.register_craft({ + output = 'technic:fine_gold_wire 2', + recipe = { + {'', 'default:gold_ingot', ''}, + {'', 'default:gold_ingot', ''}, + {'', 'default:gold_ingot', ''}, + } +}) + +minetest.register_craft({ + output = 'technic:fine_silver_wire 2', + recipe = { + {'', 'moreores:silver_ingot', ''}, + {'', 'moreores:silver_ingot', ''}, + {'', 'moreores:silver_ingot', ''}, + } +}) + +minetest.register_craft({ + output = 'technic:copper_coil 1', + recipe = { + {'technic:fine_copper_wire', 'technic:wrought_iron_ingot', 'technic:fine_copper_wire'}, + {'technic:wrought_iron_ingot', '', 'technic:wrought_iron_ingot'}, + {'technic:fine_copper_wire', 'technic:wrought_iron_ingot', 'technic:fine_copper_wire'}, + } +}) + +minetest.register_craft({ + output = 'technic:motor', + recipe = { + {'technic:carbon_steel_ingot', 'technic:copper_coil', 'technic:carbon_steel_ingot'}, + {'technic:carbon_steel_ingot', 'technic:copper_coil', 'technic:carbon_steel_ingot'}, + {'technic:carbon_steel_ingot', 'default:copper_ingot', 'technic:carbon_steel_ingot'}, + } +}) + +local isolation = mesecons_materials and "mesecons_materials:fiber" or "technic:rubber" + +minetest.register_craft({ + output = 'technic:lv_transformer', + recipe = { + {isolation, 'technic:wrought_iron_ingot', isolation}, + {'technic:copper_coil', 'technic:wrought_iron_ingot', 'technic:copper_coil'}, + {'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:mv_transformer', + recipe = { + {isolation, 'technic:carbon_steel_ingot', isolation}, + {'technic:copper_coil', 'technic:carbon_steel_ingot', 'technic:copper_coil'}, + {'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:hv_transformer', + recipe = { + {isolation, 'technic:stainless_steel_ingot', isolation}, + {'technic:copper_coil', 'technic:stainless_steel_ingot', 'technic:copper_coil'}, + {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:control_logic_unit', + recipe = { + {'', 'technic:fine_gold_wire', ''}, + {'default:copper_ingot', 'technic:silicon_wafer', 'default:copper_ingot'}, + {'', 'technic:chromium_ingot', ''}, + } +}) + +minetest.register_craft({ + output = 'technic:mixed_metal_ingot 9', + recipe = { + {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, + {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, + {'moreores:tin_ingot', 'moreores:tin_ingot', 'moreores:tin_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:carbon_cloth', + recipe = { + {'technic:graphite', 'technic:graphite', 'technic:graphite'} + } +}) + +minetest.register_craft({ + output = "technic:machine_casing", + recipe = { + { "technic:cast_iron_ingot", "technic:cast_iron_ingot", "technic:cast_iron_ingot" }, + { "technic:cast_iron_ingot", "technic:brass_ingot", "technic:cast_iron_ingot" }, + { "technic:cast_iron_ingot", "technic:cast_iron_ingot", "technic:cast_iron_ingot" }, + }, +}) + +-- Remove some recipes +-- Bronze +minetest.register_craft({ + type = "shapeless", + output = "default:bronze_ingot 0", + recipe = {"default:copper_ingot", "default:steel_ingot"} +}) + +-- Accelerator tube +minetest.register_craft({ + output = "pipeworks:accelerator_tube_1 0", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:mese_crystal_fragment", "default:steel_ingot", "default:mese_crystal_fragment" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +-- Teleport tube +minetest.register_craft({ + output = "pipeworks:teleport_tube_1 0", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:desert_stone", "default:mese", "default:desert_stone" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + diff --git a/technic/technic/depends.txt b/technic/technic/depends.txt new file mode 100644 index 0000000..746fe34 --- /dev/null +++ b/technic/technic/depends.txt @@ -0,0 +1,8 @@ +default +pipeworks +technic_worldgen +bucket? +mesecons_mvps? +intllib? +unified_inventory? +vector_extras? diff --git a/technic/technic/helpers.lua b/technic/technic/helpers.lua new file mode 100644 index 0000000..e8efcf3 --- /dev/null +++ b/technic/technic/helpers.lua @@ -0,0 +1,67 @@ +--load config +local sepchar = nil +do + local sepcode = technic.config:get("thousand_separator") + --default is SI style + sepchar = sepcode and string.char(sepcode) or " " + baresepchar = sepchar + --handling if sepchar is magic... + for magic in string.gmatch("().%+-*?[^$", ".") do + if sepchar == magic then sepchar = "%"..sepchar end + end +end + +-- Only changes name, keeps other params +function technic.swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name ~= name then + node.name = name + minetest.swap_node(pos, node) + end + return node.name +end + +-- Fully charge RE chargeable item. +-- Must be defined early to reference in item definitions. +function technic.refill_RE_charge(stack) + local max_charge = technic.power_tools[stack:get_name()] + if not max_charge then return stack end + technic.set_RE_wear(stack, max_charge, max_charge) + local meta = minetest.deserialize(stack:get_metadata()) or {} + meta.charge = max_charge + stack:set_metadata(minetest.serialize(meta)) + return stack +end + +local function resolve_name(function_name) + local a = _G + for key in string.gmatch(function_name, "([^%.]+)(%.?)") do + if a[key] then + a = a[key] + else + return nil + end + end + return a +end + +function technic.function_exists(function_name) + return type(resolve_name(function_name)) == 'function' +end + +-- if the node is loaded, returns it. If it isn't loaded, load it and return nil. +function technic.get_or_load_node(pos) + local node_or_nil = minetest.get_node_or_nil(pos) + if node_or_nil then return node_or_nil end + local vm = VoxelManip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + return nil +end + +function technic.prettynum(num) + local str, k = tostring(num), nil + repeat + str, k = str:gsub("^(-?%d+)(%d%d%d)", "%1"..sepchar.."%2") + until k == 0 + return str +end
\ No newline at end of file diff --git a/technic/technic/init.lua b/technic/technic/init.lua new file mode 100644 index 0000000..25361af --- /dev/null +++ b/technic/technic/init.lua @@ -0,0 +1,54 @@ +-- Minetest 0.4.7 mod: technic +-- namespace: technic +-- (c) 2012-2013 by RealBadAngel <mk@realbadangel.pl> + +technic = rawget(_G, "technic") or {} +technic.creative_mode = minetest.setting_getbool("creative_mode") + +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 + +local load_start = os.clock() +local modpath = minetest.get_modpath("technic") +technic.modpath = modpath + +-- Boilerplate to support intllib +if minetest.get_modpath("intllib") then + technic.getter = intllib.Getter() +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 +end +local S = technic.getter + +-- Read configuration file +dofile(modpath.."/config.lua") + +-- Helper functions +dofile(modpath.."/helpers.lua") + +-- Items +dofile(modpath.."/items.lua") + +-- Craft recipes for items +dofile(modpath.."/crafts.lua") + +-- Register functions +dofile(modpath.."/register.lua") + +-- Machines +dofile(modpath.."/machines/init.lua") + +-- Tools +dofile(modpath.."/tools/init.lua") + +-- Aliases for legacy node/item names +dofile(modpath.."/legacy.lua") + +if minetest.setting_getbool("log_mods") then + print(S("[Technic] Loaded in %f seconds"):format(os.clock() - load_start)) +end + diff --git a/technic/technic/items.lua b/technic/technic/items.lua new file mode 100644 index 0000000..27e05e4 --- /dev/null +++ b/technic/technic/items.lua @@ -0,0 +1,221 @@ + +local S = technic.getter + +minetest.register_craftitem("technic:silicon_wafer", { + description = S("Silicon Wafer"), + inventory_image = "technic_silicon_wafer.png", +}) + +minetest.register_craftitem( "technic:doped_silicon_wafer", { + description = S("Doped Silicon Wafer"), + inventory_image = "technic_doped_silicon_wafer.png", +}) + +minetest.register_craftitem("technic:uranium_fuel", { + description = S("Uranium Fuel"), + inventory_image = "technic_uranium_fuel.png", +}) + +minetest.register_craftitem( "technic:diamond_drill_head", { + description = S("Diamond Drill Head"), + inventory_image = "technic_diamond_drill_head.png", +}) + +minetest.register_tool("technic:blue_energy_crystal", { + description = S("Blue Energy Crystal"), + inventory_image = minetest.inventorycube( + "technic_diamond_block_blue.png", + "technic_diamond_block_blue.png", + "technic_diamond_block_blue.png"), + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + tool_capabilities = { + max_drop_level = 0, + groupcaps = { + fleshy = {times={}, uses=10000, maxlevel=0} + } + } +}) + +minetest.register_tool("technic:green_energy_crystal", { + description = S("Green Energy Crystal"), + inventory_image = minetest.inventorycube( + "technic_diamond_block_green.png", + "technic_diamond_block_green.png", + "technic_diamond_block_green.png"), + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + tool_capabilities = { + max_drop_level = 0, + groupcaps = { + fleshy = {times={}, uses=10000, maxlevel=0} + } + } +}) + +minetest.register_tool("technic:red_energy_crystal", { + description = S("Red Energy Crystal"), + inventory_image = minetest.inventorycube( + "technic_diamond_block_red.png", + "technic_diamond_block_red.png", + "technic_diamond_block_red.png"), + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + tool_capabilities = { + max_drop_level = 0, + groupcaps = { + fleshy = {times={}, uses=10000, maxlevel=0} + } + } +}) + + +minetest.register_craftitem("technic:fine_copper_wire", { + description = S("Fine Copper Wire"), + inventory_image = "technic_fine_copper_wire.png", +}) + +minetest.register_craftitem("technic:fine_gold_wire", { + description = S("Fine Gold Wire"), + inventory_image = "technic_fine_gold_wire.png", +}) + +minetest.register_craftitem("technic:fine_silver_wire", { + description = S("Fine Silver Wire"), + inventory_image = "technic_fine_silver_wire.png", +}) + +minetest.register_craftitem("technic:copper_coil", { + description = S("Copper Coil"), + inventory_image = "technic_copper_coil.png", +}) + +minetest.register_craftitem("technic:motor", { + description = S("Electric Motor"), + inventory_image = "technic_motor.png", +}) + +minetest.register_craftitem("technic:lv_transformer", { + description = S("Low Voltage Transformer"), + inventory_image = "technic_lv_transformer.png", +}) + +minetest.register_craftitem("technic:mv_transformer", { + description = S("Medium Voltage Transformer"), + inventory_image = "technic_mv_transformer.png", +}) + +minetest.register_craftitem( "technic:hv_transformer", { + description = S("High Voltage Transformer"), + inventory_image = "technic_hv_transformer.png", +}) + +minetest.register_craftitem( "technic:control_logic_unit", { + description = S("Control Logic Unit"), + inventory_image = "technic_control_logic_unit.png", +}) + +minetest.register_craftitem("technic:mixed_metal_ingot", { + description = S("Mixed Metal Ingot"), + inventory_image = "technic_mixed_metal_ingot.png", +}) + +minetest.register_craftitem("technic:composite_plate", { + description = S("Composite Plate"), + inventory_image = "technic_composite_plate.png", +}) + +minetest.register_craftitem("technic:copper_plate", { + description = S("Copper Plate"), + inventory_image = "technic_copper_plate.png", +}) + +minetest.register_craftitem("technic:carbon_plate", { + description = S("Carbon Plate"), + inventory_image = "technic_carbon_plate.png", +}) + +minetest.register_craftitem("technic:graphite", { + description = S("Graphite"), + inventory_image = "technic_graphite.png", +}) + +minetest.register_craftitem("technic:carbon_cloth", { + description = S("Carbon Cloth"), + inventory_image = "technic_carbon_cloth.png", +}) + +minetest.register_node("technic:machine_casing", { + description = S("Machine Casing"), + groups = {cracky=2}, + sunlight_propagates = true, + paramtype = "light", + drawtype = "allfaces", + tiles = {"technic_machine_casing.png"}, + 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=1000. This yields radioactive=2065 + -- for a fully-depleted uranium block and radioactive=5286 for + -- a 3.5%-fissile uranium block. + (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=math.floor(1000*math.sqrt((1+5.55*p/35) * 9 / (1+5.55*7/35)) + 0.5)}, + 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 diff --git a/technic/technic/legacy.lua b/technic/technic/legacy.lua new file mode 100644 index 0000000..8360a71 --- /dev/null +++ b/technic/technic/legacy.lua @@ -0,0 +1,38 @@ + +-- Aliases to convert from legacy node/item names + +technic.legacy_nodenames = { + ["technic:alloy_furnace"] = "technic:lv_alloy_furnace", + ["technic:alloy_furnace_active"] = "technic:lv_alloy_furnace_active", + ["technic:battery_box"] = "technic:lv_battery_box0", + ["technic:battery_box1"] = "technic:lv_battery_box1", + ["technic:battery_box2"] = "technic:lv_battery_box2", + ["technic:battery_box3"] = "technic:lv_battery_box3", + ["technic:battery_box4"] = "technic:lv_battery_box4", + ["technic:battery_box5"] = "technic:lv_battery_box5", + ["technic:battery_box6"] = "technic:lv_battery_box6", + ["technic:battery_box7"] = "technic:lv_battery_box7", + ["technic:battery_box8"] = "technic:lv_battery_box8", + ["technic:electric_furnace"] = "technic:lv_electric_furnace", + ["technic:electric_furnace_active"] = "technic:lv_electric_furnace_active", + ["technic:grinder"] = "technic:lv_grinder", + ["technic:grinder_active"] = "technic:lv_grinder_active", + ["technic:extractor"] = "technic:lv_extractor", + ["technic:extractor_active"] = "technic:lv_extractor_active", + ["technic:compressor"] = "technic:lv_compressor", + ["technic:compressor_active"] = "technic:lv_compressor_active", + ["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:generator"] = "technic:lv_generator", + ["technic:generator_active"] = "technic:lv_generator_active", + ["technic:iron_dust"] = "technic:wrought_iron_dust", + ["technic:enriched_uranium"] = "technic:uranium35_ingot", +} + +for old, new in pairs(technic.legacy_nodenames) do + minetest.register_alias(old, new) +end + diff --git a/technic/technic/locale/de.txt b/technic/technic/locale/de.txt new file mode 100644 index 0000000..855ec5a --- /dev/null +++ b/technic/technic/locale/de.txt @@ -0,0 +1,204 @@ +# German Translation for Technic Mod +# Deutsche Uebersetzung des Technic Mods +# by Xanthin + +## Misc +[Technic] Loaded in %f seconds = [Technic] ist in %f Sekunden geladen + +## Items +Silicon Wafer = Siliziumscheibe +Doped Silicon Wafer = Dotierte Siliziumscheibe +Enriched Uranium = Angereichertes Uran +Uranium Fuel = Uranbrennstoff +Diamond Drill Head = Diamantbohrkopf +Blue Energy Crystal = Blauer Energiekristall +Green Energy Crystal = Gruener Energiekristall +Red Energy Crystal = Roter Energiekristall +Fine Copper Wire = Feinkupferdraht +Copper Coil = Kupferspule +Electric Motor = Elektromotor +Low Voltage Transformer = Niederspannungstransformator +Medium Voltage Transformer = Mittelspannungstransformator +High Voltage Transformer = Hochspannungstransformator +Control Logic Unit = Steuer- und Regelungseinheit +Mixed Metal Ingot = Mischmetallbarren +Composite Plate = Verbundplatte +Copper Plate = Kupferplatte +Carbon Plate = Kohlefaserplatte +Graphite = Graphit +Carbon Cloth = Kohlefasergewebe +Raw Latex = Rohlatex +Rubber Fiber = Gummifaser +%.1f%%-Fissile Uranium Ingot = +%.1f%%-Fissile Uranium Block = + +## Machine misc +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. +# $1: Machine name (Includes tier) +@1 Active (@2 EU) = @1 ist eingeschaltet (@2 EU) +%s Active = %s ist eingeschaltet +%s Disabled = %s ist ausgeschaltet +%s Enabled = +%s Idle = %s ist bereit +%s Improperly Placed = %s ist falsch plaziert +%s Unpowered = %s hat keine Stromversorgung +%s Out Of Fuel = %s hat keinen Brennstoff +%s Has Bad Cabling = %s ist falsch verkabelt +%s Has No Network = %s hat kein Netzwerk +%s Finished = %s ist fertig +Enable/Disable = Einschalten/Ausschalten +Range = Reichweite +Upgrade Slots = Verbesserungsfaecher +In: = Rein: +Out: = Raus: +Slot %d = Fach %d +Itemwise = Einzelstuecke +Stackwise = Ganzer Stapel +Owner: = +Unlocked = +Locked = +Radius: = +Enabled = +Disabled = + +## Machine names +# $1: Tier +%s Alloy Furnace = %s Legierungsofen +%s Battery Box = %s Batteriebox +%s Cable = %s Kabel +%s CNC Machine = %s CNC-Maschine +%s Compressor = %s Kompressor +%s Extractor = %s Extraktor +%s Forcefield Emitter = %s Kraftfeld-Emitter +%s Furnace = %s Ofen +%s Grinder = %s Schleifmaschine +%s Music Player = %s Musikspieler +%s Quarry = %s Steinbruch +%s Tool Workshop = %s Werkzeugwerkstatt +Arrayed Solar %s Generator = %s Solaranlage +Fuel-Fired %s Generator = %s Kohle-Generator +Geothermal %s Generator = %s Geothermie-Generator +Hydro %s Generator = %s Wassermuehle +Nuclear %s Generator Core = %s Reaktorkern +Small Solar %s Generator = %s Solarmodul +Wind %s Generator = %s Windmuehle +Self-Contained Injector = Selbstversorger-Injektor +Constructor Mk%d = Konstruktor Modell %d +Frame = Rahmen +Frame Motor = Rahmenmotor +Template = Schablone +Template (replacing) = Schablone (ersetzend) +Template motor = Schablonenmotor +Template tool = Schablonenwerkzeug +Battery Box = Batteriebox +Supply Converter = Stromumwandler +Switching Station = Schaltanlage +Fuel-Fired Alloy Furnace = Kohle-Legierungsofen +Fuel-Fired Furnace = Kohle-Ofen +Wind Mill Frame = Windmuehlengeruest +Forcefield = Kraftfeld +Nuclear Reactor Rod Compartment = Brennstabfaecher +Administrative World Anchor = + +## Machine-specific +# $1: Pruduced EU +Charge = Aufladen +Discharge = Entladen +Power level = Energiestufe +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = @1 Batteriebox: @2/@3 +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = @1. Versorgung: @2 Bedarf: @3 +Production at %d%% = Produktion bei %d%% +Choose Milling Program: = Waehle ein Fraesprogramm: +Slim Elements half / normal height: = Schmale Elemente von halber / normaler Hoehe: +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 +Cylinder = Zylinder +Element Cross = Halbes Kreuzelement +Element Cross Double = Kreuzelement +Element Edge = Halbes Eckelement +Element Edge Double = Eckelement +Element End = Halbes Endelement +Element End Double = Endelement +Element Straight = Halbes aufrechtes Element +Element Straight Double = Aufrechtes Element +Element T = Halbes T-Element +Element T Double = T-Element +Horizontal Cylinder = Liegender Zylinder +One Curved Edge Block = Block mit einer abgerundeten Kante +Pyramid = Pyramide +Slope = Schraege +Slope Edge = Schraege mit Ecke +Slope Inner Edge = Schraege mit Innenecke +Slope Lying = Liegende Schraege +Slope Upside Down = Umgedrehte Schraege +Slope Upside Down Edge = Umgedrehte Schraege mit Ecke +Slope Upside Down Inner Edge = Umgedrehte Schraege mit Innenecke +Sphere = Kugel +Spike = Spitze +Stick = Stange +Two Curved Edge Block = Block mit zwei abgerundeten Kanten +Brick = Ziegel: +Cobble = Pflasterstein: +Dirt = Erde: +Leaves = Laub: +Sandstone = Sandstein: +Stone = Stein: +Tree = Baumstamm: +Wooden = Holz: + +## Grinder Recipes +# $1: Name +%s Dust = %sstaub +Akalin = Akalin +Alatro = Alatro +Arol = Arol +Brass = Messing +Bronze = Bronze +Carbon Steel = Kohlenstoffstahl +Cast Iron = Gusseisen +Chromium = Chrom +Coal = Kohle +Copper = Kupfer +Gold = Gold +Mithril = Mithril +Silver = Silber +Stainless Steel = Edelstahl +Talinite = Talinite +Tin = Zinn +Wrought Iron = Schmiedeeisen +Zinc = Zink +%.1f%%-Fissile Uranium = + +## Tools +RE Battery = Akkubatterie +Water Can = Wasserkanister +Lava Can = Lavakanister +Chainsaw = Kettensaege +Flashlight = Taschenlampe +3 nodes deep. = 3 Bloecke tief. +3 nodes tall. = 3 Bloecke hoch. +3 nodes wide. = 3 Bloecke breit. +3x3 nodes. = 3x3 Bloecke. +Use while sneaking to change Mining Drill Mk%d modes. = Halte die Shift-Taste beim Benutzen gedrueckt, um die Funktion des Bergbaubohrers Modell %d zu aendern. +Mining Drill Mk%d Mode %d = Bergbaubohrer Modell %d Funktion %d +Mining Drill Mk%d = Bergbaubohrer Modell %d +Mining Laser Mk%d = Bergbaulaser Modell %d +Single node. = Einzelblock +Sonic Screwdriver = Schallschraubendreher +Tree Tap = Baumzapfhahn + +## Craft descriptions +Alloy cooking = +Grinding = +Compressing = +Extracting = diff --git a/technic/technic/locale/es.txt b/technic/technic/locale/es.txt new file mode 100644 index 0000000..7945d65 --- /dev/null +++ b/technic/technic/locale/es.txt @@ -0,0 +1,197 @@ +# Spanish Translation for Technic Mod +# Traduccion al Español del Mod Technic +# Autor: Diego Martínez <kaeza> + +## Misc +[Technic] Loaded in %f seconds = [Technic] Cargado en %f segundos + +## Items +Silicon Wafer = Oblea de Silicio +Doped Silicon Wafer = Oblea de Silicio Dopada +Enriched Uranium = Uranio Enriquecido +Uranium Fuel = Combustible de Uranio +Diamond Drill Head = Mecha de Taladro de Diamante +Blue Energy Crystal = Cristal de Energia Azul +Green Energy Crystal = Cristal de Energia Verde +Red Energy Crystal = Cristal de Energia Rojo +Fine Copper Wire = Cable Fino de Cobre +Copper Coil = Resorte de Cobre +Electric Motor = Motor Electrico +Low Voltage Transformer = Transformador de Bajo Voltaje +Medium Voltage Transformer = Transformador de Voltaje Medio +High Voltage Transformer = Transformador de Alto Voltaje +Control Logic Unit = Unidad Logica de Control +Mixed Metal Ingot = Lingote de Metal Mezclado +Composite Plate = Placa de Compuestos +Copper Plate = Placa de Cobre +Carbon Plate = Placa de Carbon +Graphite = Grafito +Carbon Cloth = Tela de Carbon +Raw Latex = Latex Crudo +Rubber Fiber = Fibra de Hule +%.1f%%-Fissile Uranium Ingot = +%.1f%%-Fissile Uranium Block = + +## Machine misc +Machine cannot be removed because it is not empty = La maquina no puede removerse porque no esta vacia +Inventory move disallowed due to protection = +# $1: Machine name (Includes tier) +@1 Active (@2 EU) = @1 Activo (@2 EU) +%s Active = %s Activo +%s Enabled = +%s Idle = %s Quieto +%s Unpowered = %s Sin Energia +%s Out Of Fuel = %s Sin Combustible +%s Has Bad Cabling = %s Tiene Mal Cableado +%s Has No Network = %s No Tiene Una Red +%s Finished = %s Terminado +%s Disabled = %s Deshabilitado +%s Improperly Placed = %s No Colocado Apropiadamente +Range = Alcance +Enable/Disable = Habilitar/Deshabilitar +Itemwise = +Stackwise = +Owner: = +Unlocked = +Locked = +Radius: = +Enabled = +Disabled = + +## Machine names +# $1: Tier +%s Alloy Furnace = Horno de Aleacion %s +%s Battery Box = Caja de Bateria %s +%s Cable = Cable %s +%s CNC Machine = Maquina CNC %s +%s Compressor = Compresor %s +%s Extractor = Extractor %s +%s Forcefield Emitter = Emisor de Campo de Fuerza %s +%s Furnace = Horno %s +%s Grinder = Amoladora %s +%s Music Player = Reproductor de Musica %s +%s Quarry = Cantera %s +%s Tool Workshop = Taller de Herramientas %s +Arrayed Solar %s Generator = Panel Solar %s +Fuel-Fired %s Generator = Generador a Carbon %s +Geothermal %s Generator = Generador Geotermico %s +Hydro %s Generator = Molino de Agua %s +Nuclear %s Generator Core = Nucleo de Reactor Nuclear %s +Small Solar %s Generator = Panel Solar %s +Wind %s Generator = Molino de Viento %s +Self-Contained Injector = +Constructor Mk%d = +Frame = +Frame Motor = +Template = +Template (replacing) = +Template Motor = +Template Tool = +Supply Converter = Convertidor de Alimentacion +Switching Station = Estacion de Conmutacion +Battery Box = Caja de Baterias +Fuel-Fired Alloy Furnace = Horno de Aleacion a Carbon +Fuel-Fired Furnace = Horno a Carbon +Forcefield = Campo de Fuerza +Nuclear Reactor Rod Compartment = Compartimiento para Vara de Reactor Nuclear +Wind Mill Frame = Armazon de Molino de Viento +Administrative World Anchor = + +## Machine-specific +# $1: Pruduced EU +Charge = Cargar +Discharge = Descargar +Power level = Nivel de Poder +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = Caja de Bateria @1: @2/@3 +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = @1. Alimentacion: @2 Demanda: @3 +# $1: Production percent +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 +Element Edge = Elemento Borde +Tree = Arbol +Element Cross Double = Elemento Cruz Doble +Spike = Pica +Element Edge Double = Elemento Borde Doble +Two Curved Edge Block = Dos Bloques de Borde Curvados +Pyramid = Piramide +Slope Upside Down Inner Edge = Borde Interno de Rampa Al Reves +Slope Upside Down Edge = Borde de Rampa Al Reves +Element Straight Double = Elemento Doble Recto +Sphere = Esfera +Element End Double = Doble Fin de Elemento +Element Straight = Recta de Elemento +Horizontal Cylinder = Cilindro Horizontal +Slope Inner Edge = Borde Interno de Rampa +One Curved Edge Block = Un Bloque de Borde Curvado +Element Cross = Cruce de Elementos +Stick = Varita +Element End = Fin de Elemento +Slope Lying = Rampa en Reposo +Slope Upside Down = Rampa Al Reves +Slope Edge = Borde de Rampa +Slope = Rampa +Element T = Elemento T +Cylinder = Cilindro +Cobble = Adoquines +Stone = Piedra +Brick = Ladrillo +Dirt = Tierra +Sandstone = Arenisca +Wooden = Madera +Leaves = Hojas + +## Grinder Recipes +# $1: Name +%s Dust = Polvo de %s +Akalin = Akalina +Alatro = Alatro +Arol = Arol +Brass = Laton +Bronze = Bronce +Carbon Steel = Acero al Carbono +Cast Iron = Hierro Fundido +Chromium = Cromo +Coal = Carbon +Copper = Cobre +Gold = Oro +Mithril = Mitrilo +Silver = Plata +Stainless Steel = Acero Inoxidable +Talinite = Talinita +Tin = Estanio +Wrought Iron = Hierro Forjado +Zinc = Zinc +%.1f%%-Fissile Uranium = + +## Tools +RE Battery = +Water Can = Bidon de Agua +Lava Can = Bidon de Lava +Chainsaw = Motosierra +Flashlight = Linterna +3 nodes deep. = 3 nodos de profundo. +3 nodes tall. = 3 nodos de alto. +3 nodes wide. = 3 nodos de ancho. +3x3 nodes. = 3x3 nodos. +Use while sneaking to change Mining Drill Mk%d modes. = Manten pulsado Mayus y Usar para cambiar el modo del Taladro de Mineria Mk%d. +Mining Drill Mk%d Mode %d = Taladro de Mineria Mk%d Modo %d +Mining Drill Mk%d = Taladro de Mineria Mk%d +Mining Laser Mk%d = Laser de Mineria Mk%d +Single node. = Nodo simple. +Sonic Screwdriver = Destonillador Sonico +Tree Tap = Grifo de Arbol + +## Craft descriptions +Alloy cooking = +Grinding = +Compressing = +Extracting = diff --git a/technic/technic/locale/it.txt b/technic/technic/locale/it.txt new file mode 100644 index 0000000..59ba7f6 --- /dev/null +++ b/technic/technic/locale/it.txt @@ -0,0 +1,201 @@ + +## Misc +[Technic] Loaded in %f seconds = [Technic] caricato in %f secondi + +## Items +Silicon Wafer = Wafer di silicone +Doped Silicon Wafer = Wafer di silicone dopato +Enriched Uranium = Uranio arricchito +Uranium Fuel = Uranio Combustibile +Diamond Drill Head = Trivella diamantata +Blue Energy Crystal = Cristallo energetico blu +Green Energy Crystal = Cristallo energetico verde +Red Energy Crystal = Cristallo energetico rosso +Fine Copper Wire = Filo di rame fine +Copper Coil = Bobina di rame +Electric Motor = Motore elettrico +Low Voltage Transformer = Trasformatore in bassa tensione +Medium Voltage Transformer = Trasformatore in media tensione +High Voltage Transformer = Trasformatore in alta tensione +Control Logic Unit = Unità di controllo logica +Mixed Metal Ingot = Lingotto in lega ibrida +Composite Plate = Lastra composita +Copper Plate = Lastra di rame +Carbon Plate = Lastra in carbonio +Graphite = Lastra in graffite +Carbon Cloth = Fibra di carbonio +Raw Latex = Latex grezzo +Rubber Fiber = Fibra di gomma +%.1f%%-Fissile Uranium Ingot = +%.1f%%-Fissile Uranium Block = + +## Machine misc +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 +# $1: Machine name (Includes tier) +@1 Active (@2 EU) = @1 Attivo (@2 EU) +%s Active = %s Attivo +%s Disabled = %s Disabilitato +%s Enabled = +%s Idle = %s Inattivo +%s Improperly Placed = %s Piazzato impropiamente +%s Unpowered = %s Non alimentato +%s Out Of Fuel = %s senza carburante +%s Has Bad Cabling = %s ha un cablaggio scorretto +%s Has No Network = %s non è collegata +%s Finished = %s Finito +Enable/Disable = Abilita/Disabilita +Range = Raggio +Upgrade Slots = +In: = Ingresso: +Out: = Uscita: +Slot %d = +Itemwise = Singolo elemento +Stackwise = pila completa +Owner: = +Unlocked = +Locked = +Radius: = +Enabled = +Disabled = + +## Machine names +# $1: Tier +%s Alloy Furnace = %s Fornace per leghe +%s Battery Box = %s Box batterie +%s Cable = Cavo %s +%s CNC Machine = Tornio CNC %s +%s Compressor = Compressore %s +%s Extractor = Estrattore %s +%s Forcefield Emitter = Emettitore di campo di forza %s +%s Furnace = %s Fornace +%s Grinder = %s Tritatutto +%s Music Player = Music Player %s +%s Quarry = Cava %s +%s Tool Workshop = Officina per attrezzi %s +Arrayed Solar %s Generator = %s Pannello Solare +Fuel-Fired %s Generator = %s Generatore a carbone +Geothermal %s Generator = %s Generatore Geotermico +Hydro %s Generator = Turbina Elettrica %s +Nuclear %s Generator Core = Reattore nucleare %s +Small Solar %s Generator = %s Pannello solare +Wind %s Generator = %s Generatore eolico +Self-Contained Injector = Ignettore +Constructor Mk%d = Costruttore Mk%d +Frame = Cornice +Frame Motor = Cornice del motore +Template = +Template (replacing) = Template (rimpiazzato) +Template Motor = +Template Tool = +Battery Box = Box batterie +Supply Converter = Trasformatore +Switching Station = Stazione di controllo +Fuel-Fired Alloy Furnace = Fornace per leghe a carbone +Fuel-Fired Furnace = Fornace a carbone +Wind Mill Frame = Pala eolica +Forcefield = Campo di forza +Nuclear Reactor Rod Compartment = Compartimento combustibile nucleare +Administrative World Anchor = + +## Machine-specific +# $1: Pruduced EU +Charge = Carica +Discharge = Scarica +Power level = Livello di potenza +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = @1 Box Batterie: @2/@3 +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = @1. Prodotto: @2 Consumato: @3 +Production at %d%% = Produzione a %d%% +Choose Milling Program: = Scegliere un programma di Fresatura +Slim Elements half / normal height: = Metà elementi sottili / altezza normale: +Current track %s = Traccia corrente %s +Stopped = +Keeping %d/%d map blocks loaded = +Digging not started = +Digging finished = +Digging %d m above machine = +Digging %d m below machine = + +## CNC +Cylinder = Cilindro +Element Cross = Elemento a croce +Element Cross Double = Elemento a croce doppio +Element Edge = Elemento bordo +Element Edge Double = Elemento bordo doppio +Element End = Elemento finale +Element End Double = Elemento finale doppio +Element Straight = Elemento dritto +Element Straight Double = Elemento dritto doppio +Element T = Elemento a T +Element T Double = Elemento a T doppio +Horizontal Cylinder = Cilindro orizzontale +One Curved Edge Block = Blocco con bordo curvo +Pyramid = Piramide +Slope = Inclinato +Slope Edge = Bordo inclinato +Slope Inner Edge = Bordo interno inclinato +Slope Lying = Pendenza bugiarda +Slope Upside Down = Pendenza capovolta +Slope Upside Down Edge = Bordo inclinato capovolto +Slope Upside Down Inner Edge = Bordo interno inclinato capovolto +Sphere = Sfera +Spike = Spuntone +Stick = Bastone +Two Curved Edge Block = Blocco con bordo a doppia curva +Brick = Mattone +Cobble = Ciottolato +Dirt = Terra +Leaves = Foglie +Sandstone = Arenaria +Stone = Pietra +Tree = Albero +Wooden = Legno + +## Grinder Recipes +# $1: Name +%s Dust = Polvere di %s +Akalin = Alcalino +Alatro = Alatro +Arol = Arol +Brass = Ottone +Bronze = Bronzo +Carbon Steel = Acciaio al Carbonio +Cast Iron = Ghisa +Chromium = Cromo +Coal = Carbone +Copper = Rame +Gold = Oro +Mithril = Mithril +Silver = Argento +Stainless Steel = Acciaio Inossidabile +Talinite = Talinite +Tin = Stagno +Wrought Iron = Ferro Battuto +Zinc = Zinco +%.1f%%-Fissile Uranium = + +## Tools +RE Battery = +Water Can = Serbatoio d'acqua +Lava Can = Serbatoio di lava +Chainsaw = Motosega +Flashlight = Torcia +3 nodes deep. = 3 nodi in profondità. +3 nodes tall. = 3 nodi in altezza. +3 nodes wide. = 3 nodi in larghezza. +3x3 nodes. = 3x3 nodi. +Use while sneaking to change Mining Drill Mk%d modes. = Premi shift (freccia grossa) e usa per cambiare modalità nella trivella da miniera Mk%d. +Mining Drill Mk%d Mode %d = Trivella mk%d in modalità %d +Mining Drill Mk%d = Trivella da miniera mk%d +Mining Laser Mk%d = Laser da miniera mk%d +Single node. = Nodo singolo. +Sonic Screwdriver = Cacciavite sonico +Tree Tap = Batti albero + +## Craft descriptions +Alloy cooking = Cottura lege +Grinding = Macinazione +Compressing = Compressione +Extracting = Estrazione diff --git a/technic/technic/locale/template.txt b/technic/technic/locale/template.txt new file mode 100644 index 0000000..0464241 --- /dev/null +++ b/technic/technic/locale/template.txt @@ -0,0 +1,211 @@ +# template.txt +# Template for translations of Technic + + +## Misc +[Technic] Loaded in %f seconds = + +## Items +Silicon Wafer = +Doped Silicon Wafer = +Enriched Uranium = +Uranium Fuel = +Diamond Drill Head = +Blue Energy Crystal = +Green Energy Crystal = +Red Energy Crystal = +Fine Copper Wire = +Copper Coil = +Electric Motor = +Low Voltage Transformer = +Medium Voltage Transformer = +High Voltage Transformer = +Control Logic Unit = +Mixed Metal Ingot = +Composite Plate = +Copper Plate = +Carbon Plate = +Graphite = +Carbon Cloth = +Raw Latex = +Rubber Fiber = +%.1f%%-Fissile Uranium Ingot = +%.1f%%-Fissile Uranium Block = + +## Machine misc +Machine cannot be removed because it is not empty = +Inventory move disallowed due to protection = +# $1: Machine name (Includes tier) +@1 Active (@2 EU) = +%s Active = +%s Disabled = +%s Enabled = +%s Idle = +%s Improperly Placed = +%s is empty = +%s Unpowered = +%s Out Of Fuel = +%s Has Bad Cabling = +%s (Slave) = +%s Has No Network = +%s Finished = +Enable/Disable = +Range = +Upgrade Slots = +In: = +Out: = +Slot %d = +Itemwise = +Stackwise = +Ignoring Mesecon Signal = +Controlled by Mesecon Signal = +Owner: = +Unlocked = +Locked = +Radius: = +Enabled = +Disabled = + +## Machine names +# $1: Tier +%s Alloy Furnace = +%s Battery Box = +%s Cable = +%s CNC Machine = +%s Centrifuge = +%s Compressor = +%s Extractor = +%s Forcefield Emitter = +%s Furnace = +%s Grinder = +%s Music Player = +%s Quarry = +%s Tool Workshop = +Arrayed Solar %s Generator = +Fuel-Fired %s Generator = +Geothermal %s Generator = +Hydro %s Generator = +Nuclear %s Generator Core = +Small Solar %s Generator = +Wind %s Generator = +Self-Contained Injector = +Constructor Mk%d = +Frame = +Frame Motor = +Template = +Template (replacing) = +Template Motor = +Template Tool = +Battery Box = +Supply Converter = +Switching Station = +Fuel-Fired Alloy Furnace = +Fuel-Fired Furnace = +Wind Mill Frame = +Forcefield = +Nuclear Reactor Rod Compartment = +Administrative World Anchor = + +## Machine-specific +# $1: Pruduced EU +Charge = +Discharge = +Power level = +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = +Production at %d%% = +Choose Milling Program: = +Slim Elements half / normal height: = +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 +Cylinder = +Element Cross = +Element Cross Double = +Element Edge = +Element Edge Double = +Element End = +Element End Double = +Element Straight = +Element Straight Double = +Element T = +Element T Double = +Horizontal Cylinder = +One Curved Edge Block = +Pyramid = +Slope = +Slope Edge = +Slope Inner Edge = +Slope Lying = +Slope Upside Down = +Slope Upside Down Edge = +Slope Upside Down Inner Edge = +Sphere = +Spike = +Stick = +Two Curved Edge Block = +Brick = +Cobble = +Dirt = +Leaves = +Sandstone = +Stone = +Tree = +Wooden = + +## Grinder Recipes +# $1: Name +%s Dust = +Akalin = +Alatro = +Arol = +Brass = +Bronze = +Carbon Steel = +Cast Iron = +Chromium = +Coal = +Copper = +Gold = +Mithril = +Silver = +Stainless Steel = +Talinite = +Tin = +Wrought Iron = +Zinc = +%.1f%%-Fissile Uranium = + +## Tools +RE Battery = +Water Can = +Lava Can = +Chainsaw = +Flashlight = +3 nodes deep. = +3 nodes tall. = +3 nodes wide. = +3x3 nodes. = +Use while sneaking to change Mining Drill Mk%d modes. = +Mining Drill Mk%d Mode %d = +Mining Drill Mk%d = +Mining Laser Mk%d = +Single node. = +Sonic Screwdriver = +Tree Tap = + +## Craft descriptions +Alloy cooking = +Grinding = +Compressing = +Extracting = +Separating = diff --git a/technic/technic/machines/HV/battery_box.lua b/technic/technic/machines/HV/battery_box.lua new file mode 100644 index 0000000..1e054ec --- /dev/null +++ b/technic/technic/machines/HV/battery_box.lua @@ -0,0 +1,21 @@ +-- HV battery box +minetest.register_craft({ + output = 'technic:hv_battery_box0', + recipe = { + {'technic:mv_battery_box0', 'technic:mv_battery_box0', 'technic:mv_battery_box0'}, + {'technic:mv_battery_box0', 'technic:hv_transformer', 'technic:mv_battery_box0'}, + {'', 'technic:hv_cable0', ''}, + } +}) + +technic.register_battery_box({ + tier = "HV", + max_charge = 1000000, + charge_rate = 100000, + discharge_rate = 400000, + charge_step = 10000, + discharge_step = 40000, + upgrade = 1, + tube = 1, +}) + diff --git a/technic/technic/machines/HV/cables.lua b/technic/technic/machines/HV/cables.lua new file mode 100644 index 0000000..25297c8 --- /dev/null +++ b/technic/technic/machines/HV/cables.lua @@ -0,0 +1,12 @@ + +minetest.register_craft({ + output = 'technic:hv_cable0 3', + recipe = { + {'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'}, + {'technic:mv_cable0', 'technic:mv_cable0', 'technic:mv_cable0'}, + {'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'}, + } +}) + +technic.register_cable("HV", 3/16) + diff --git a/technic/technic/machines/HV/forcefield.lua b/technic/technic/machines/HV/forcefield.lua new file mode 100644 index 0000000..0f0836d --- /dev/null +++ b/technic/technic/machines/HV/forcefield.lua @@ -0,0 +1,261 @@ +--- Forcefield generator. +-- @author ShadowNinja +-- +-- Forcefields are powerful barriers but they consume huge amounts of power. +-- The forcefield Generator is an HV machine. + +-- How expensive is the generator? +-- Leaves room for upgrades lowering the power drain? +local forcefield_power_drain = 10 + +local S = technic.getter + +minetest.register_craft({ + output = "technic:forcefield_emitter_off", + recipe = { + {"default:mese", "technic:motor", "default:mese" }, + {"technic:deployer_off", "technic:machine_casing", "technic:deployer_off"}, + {"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 add up by detecting if one hits another. +-- ___ __ +-- / \/ \ +-- | | +-- \___/\___/ + +local function update_forcefield(pos, meta, active, first) + local shape = meta:get_int("shape") + local range = meta:get_int("range") + local vm = VoxelManip() + local MinEdge, MaxEdge = vm:read_from_map(vector.subtract(pos, range), + vector.add(pos, range)) + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + local data = vm:get_data() + + local c_air = minetest.get_content_id("air") + local c_field = minetest.get_content_id("technic:forcefield") + + for z = -range, range do + for y = -range, range do + local vi = area:index(pos.x + (-range), pos.y + y, pos.z + z) + for x = -range, range do + local relevant + if shape == 0 then + local squared = x * x + y * y + z * z + 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 + elseif not active and cid == c_field then + data[vi] = c_air + end + end + vi = vi + 1 + end + end + end + + vm:set_data(data) + vm:update_liquids() + 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() + end +end + +local function set_forcefield_formspec(meta) + local formspec = "size[5,2.25]".. + "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 + formspec = formspec.."button[0,1.75;5,1;enable;"..S("%s Disabled"):format(S("%s Forcefield Emitter"):format("HV")).."]" + else + formspec = formspec.."button[0,1.75;5,1;disable;"..S("%s Enabled"):format(S("%s Forcefield Emitter"):format("HV")).."]" + end + meta:set_string("formspec", formspec) +end + +local forcefield_receive_fields = function(pos, formname, fields, sender) + local meta = minetest.get_meta(pos) + local range = nil + if fields.range then + range = tonumber(fields.range) or 0 + -- Smallest field is 5. Anything less is asking for trouble. + -- Largest is 20. It is a matter of pratical node handling. + -- At the maximim range updating the forcefield takes about 0.2s + range = math.max(range, 5) + range = math.min(range, 20) + if range == meta:get_int("range") then range = nil end + end + if fields.shape0 or fields.shape1 or range then + update_forcefield(pos, meta, false) + end + if range then meta:set_int("range", range) 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.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) +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 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", { + description = S("%s Forcefield Emitter"):format("HV"), + tiles = {"technic_forcefield_emitter_off.png"}, + groups = {cracky = 1, technic_machine = 1}, + on_receive_fields = forcefield_receive_fields, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("HV_EU_input", 0) + meta:set_int("HV_EU_demand", 0) + meta:set_int("range", 10) + meta:set_int("enabled", 0) + meta:set_int("mesecon_mode", 0) + meta:set_int("mesecon_effect", 0) + meta:set_string("infotext", S("%s Forcefield Emitter"):format("HV")) + set_forcefield_formspec(meta) + end, + mesecons = mesecons, + technic_run = run, +}) + +minetest.register_node("technic:forcefield_emitter_on", { + description = S("%s Forcefield Emitter"):format("HV"), + tiles = {"technic_forcefield_emitter_on.png"}, + groups = {cracky = 1, technic_machine = 1, not_in_creative_inventory=1}, + drop = "technic:forcefield_emitter_off", + on_receive_fields = forcefield_receive_fields, + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + update_forcefield(pos, meta, false) + end, + mesecons = mesecons, + 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, +}) + +minetest.register_node("technic:forcefield", { + description = S("%s Forcefield"):format("HV"), + sunlight_propagates = true, + drawtype = "glasslike", + groups = {not_in_creative_inventory=1}, + paramtype = "light", + light_source = 15, + diggable = false, + drop = '', + tiles = {{ + name = "technic_forcefield_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.0, + }, + }}, +}) + + +if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("technic:forcefield") +end + +technic.register_machine("HV", "technic:forcefield_emitter_on", technic.receiver) +technic.register_machine("HV", "technic:forcefield_emitter_off", technic.receiver) + diff --git a/technic/technic/machines/HV/generator.lua b/technic/technic/machines/HV/generator.lua new file mode 100644 index 0000000..aa83590 --- /dev/null +++ b/technic/technic/machines/HV/generator.lua @@ -0,0 +1,13 @@ +minetest.register_alias("hv_generator", "technic:hv_generator") + +minetest.register_craft({ + output = 'technic:hv_generator', + recipe = { + {'technic:carbon_plate', 'technic:mv_generator', 'technic:composite_plate'}, + {'pipeworks:tube_1', 'technic:hv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:hv_cable0', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_generator({tier="HV", tube=1, supply=1200}) + diff --git a/technic/technic/machines/HV/init.lua b/technic/technic/machines/HV/init.lua new file mode 100644 index 0000000..d7136b4 --- /dev/null +++ b/technic/technic/machines/HV/init.lua @@ -0,0 +1,18 @@ + +technic.register_tier("HV", "High Voltage") + +local path = technic.modpath.."/machines/HV" + +-- Wiring stuff +dofile(path.."/cables.lua") +dofile(path.."/battery_box.lua") + +-- Generators +dofile(path.."/solar_array.lua") +dofile(path.."/nuclear_reactor.lua") +dofile(path.."/generator.lua") + +-- Machines +dofile(path.."/quarry.lua") +dofile(path.."/forcefield.lua") + diff --git a/technic/technic/machines/HV/nuclear_reactor.lua b/technic/technic/machines/HV/nuclear_reactor.lua new file mode 100644 index 0000000..3aa1ba8 --- /dev/null +++ b/technic/technic/machines/HV/nuclear_reactor.lua @@ -0,0 +1,723 @@ +-- The enriched uranium rod driven EU generator. +-- 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)) +-- Provides HV EUs that can be down converted as needed. +-- +-- 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! + +local burn_ticks = 7 * 24 * 60 * 60 -- (seconds). +local power_supply = 100000 -- EUs +local fuel_type = "technic:uranium_fuel" -- The reactor burns this stuff + +local S = technic.getter + +if not vector.length_square then + vector.length_square = function (v) + return v.x*v.x + v.y*v.y + v.z*v.z + end +end + +-- FIXME: recipe must make more sense like a rod recepticle, steam chamber, HV generator? +minetest.register_craft({ + output = 'technic:hv_nuclear_reactor_core', + recipe = { + {'technic:carbon_plate', 'default:obsidian_glass', 'technic:carbon_plate'}, + {'technic:composite_plate', 'technic:machine_casing', 'technic:composite_plate'}, + {'technic:stainless_steel_ingot', 'technic:hv_cable0', 'technic:stainless_steel_ingot'}, + } +}) + +local generator_formspec = + "invsize[8,9;]".. + "label[0,0;"..S("Nuclear Reactor Rod Compartment").."]".. + "list[current_name;src;2,1;3,2;]".. + "list[current_player;main;0,5;8,4;]".. + "listring[]" + +-- "Boxy sphere" +local nodebox = { + { -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 = {} +local function siren_set_state(pos, newstate) + local hpos = minetest.hash_node_position(pos) + local siren = reactor_siren[hpos] + if not siren then + if newstate == "off" then return end + siren = {state="off"} + reactor_siren[hpos] = siren + end + if newstate == "danger" and siren.state ~= "danger" then + if siren.handle then minetest.sound_stop(siren.handle) end + siren.handle = minetest.sound_play("technic_hv_nuclear_reactor_siren_danger_loop", {pos=pos, gain=1.5, loop=true, max_hear_distance=48}) + siren.state = "danger" + elseif newstate == "clear" then + if siren.handle then minetest.sound_stop(siren.handle) end + local clear_handle = minetest.sound_play("technic_hv_nuclear_reactor_siren_clear", {pos=pos, gain=1.5, loop=false, max_hear_distance=48}) + siren.handle = clear_handle + siren.state = "clear" + minetest.after(10, function () + if siren.handle == clear_handle then + minetest.sound_stop(clear_handle) + if reactor_siren[hpos] == siren then + reactor_siren[hpos] = nil + end + end + end) + elseif newstate == "off" and siren.state ~= "off" then + if siren.handle then minetest.sound_stop(siren.handle) end + siren.handle = nil + reactor_siren[hpos] = nil + end +end +local function siren_danger(pos, meta) + meta:set_int("siren", 1) + siren_set_state(pos, "danger") +end +local function siren_clear(pos, meta) + if meta:get_int("siren") ~= 0 then + siren_set_state(pos, "clear") + meta:set_int("siren", 0) + end +end + +-- The standard reactor structure consists of a 9x9x9 cube. A cross +-- section through the middle: +-- +-- CCCC CCCC +-- CBBB BBBC +-- 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 are only in the middle, and the man-hole +-- is optional. +-- +-- 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. +local reactor_structure_badness = function(pos) + local vm = VoxelManip() + local pos1 = vector.subtract(pos, 3) + local pos2 = vector.add(pos, 3) + local MinEdge, MaxEdge = vm:read_from_map(pos1, pos2) + local data = vm:get_data() + local area = VoxelArea:new({MinEdge=MinEdge, MaxEdge=MaxEdge}) + + local c_blast_concrete = minetest.get_content_id("technic:blast_resistant_concrete") + local c_stainless_steel = minetest.get_content_id("technic:stainless_steel_block") + local c_water_source = minetest.get_content_id("default:water_source") + local c_water_flowing = minetest.get_content_id("default:water_flowing") + + local blastlayer, steellayer, waterlayer = 0, 0, 0 + + for z = pos1.z, pos2.z do + for y = pos1.y, pos2.y do + for x = pos1.x, pos2.x do + local cid = data[area:index(x, y, z)] + if x == pos1.x or x == pos2.x or + y == pos1.y or y == pos2.y or + z == pos1.z or z == pos2.z then + if cid == c_blast_concrete then + blastlayer = blastlayer + 1 + end + elseif x == pos1.x+1 or x == pos2.x-1 or + y == pos1.y+1 or y == pos2.y-1 or + z == pos1.z+1 or z == pos2.z-1 then + if cid == c_stainless_steel then + steellayer = steellayer + 1 + end + elseif x == pos1.x+2 or x == pos2.x-2 or + y == pos1.y+2 or y == pos2.y-2 or + z == pos1.z+2 or z == pos2.z-2 then + if cid == c_water_source or cid == c_water_flowing then + waterlayer = waterlayer + 1 + end + end + end + end + end + if waterlayer > 25 then waterlayer = 25 end + if steellayer > 96 then steellayer = 96 end + if blastlayer > 216 then blastlayer = 216 end + return (25 - waterlayer) + (96 - steellayer) + (216 - blastlayer) +end + +local function meltdown_reactor(pos) + print("A reactor melted down at "..minetest.pos_to_string(pos)) + minetest.set_node(pos, {name="technic:corium_source"}) +end + +minetest.register_abm({ + nodenames = {"technic:hv_nuclear_reactor_core_active"}, + interval = 1, + 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", accum_badness - 1) + siren_clear(pos, meta) + end + else + siren_danger(pos, meta) + accum_badness = accum_badness + badness + if accum_badness >= 100 then + meltdown_reactor(pos) + else + meta:set_int("structure_accumulated_badness", accum_badness) + end + end + end, +}) + +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local machine_name = S("Nuclear %s Generator Core"):format("HV") + local burn_time = meta:get_int("burn_time") or 0 + + if burn_time >= burn_ticks or burn_time == 0 then + local inv = meta:get_inventory() + if not inv:is_empty("src") then + local srclist = inv:get_list("src") + local correct_fuel_count = 0 + for _, srcstack in pairs(srclist) do + if srcstack then + if srcstack:get_name() == fuel_type then + correct_fuel_count = correct_fuel_count + 1 + end + end + end + -- Check that the reactor is complete as well + -- as the correct number of correct fuel + if correct_fuel_count == 6 and + reactor_structure_badness(pos) == 0 then + meta:set_int("burn_time", 1) + technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active") + meta:set_int("HV_EU_supply", power_supply) + for idx, srcstack in pairs(srclist) do + srcstack:take_item() + inv:set_stack("src", idx, srcstack) + end + return + end + end + meta:set_int("HV_EU_supply", 0) + meta:set_int("burn_time", 0) + meta:set_string("infotext", S("%s Idle"):format(machine_name)) + 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 + burn_time = burn_time + 1 + meta:set_int("burn_time", burn_time) + local percent = math.floor(burn_time / burn_ticks * 100) + meta:set_string("infotext", machine_name.." ("..percent.."%)") + meta:set_int("HV_EU_supply", power_supply) + end +end + +minetest.register_node("technic:hv_nuclear_reactor_core", { + description = S("Nuclear %s Generator Core"):format("HV"), + tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", + "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", + "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"}, + groups = {cracky=1, technic_machine=1}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + drawtype="nodebox", + paramtype = "light", + stack_max = 1, + node_box = { + type = "fixed", + fixed = nodebox + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Nuclear %s Generator Core"):format("HV")) + meta:set_int("HV_EU_supply", 0) + -- Signal to the switching station that this device burns some + -- sort of fuel and needs special handling + meta:set_int("HV_EU_from_fuel", 1) + meta:set_int("burn_time", 0) + meta:set_string("formspec", generator_formspec) + local inv = meta:get_inventory() + inv:set_size("src", 6) + end, + can_dig = technic.machine_can_dig, + on_destruct = function(pos) siren_set_state(pos, "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", + "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", + "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"}, + groups = {cracky=1, technic_machine=1, radioactive=11000, 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, + after_dig_node = meltdown_reactor, + on_destruct = function(pos) siren_set_state(pos, "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_active", technic.producer) + +-- radioactivity + +-- Radiation resistance represents the extent to which a material +-- attenuates radiation passing through it; i.e., how good a radiation +-- shield it is. This is identified per node type. For materials that +-- exist in real life, the radiation resistance value that this system +-- uses for a node type consisting of a solid cube of that material is the +-- (approximate) number of halvings of ionising radiation that is achieved +-- by a metre of the material in real life. This is approximately +-- proportional to density, which provides a good way to estimate it. +-- Homogeneous mixtures of materials have radiation resistance computed +-- by a simple weighted mean. Note that the amount of attenuation that +-- a material achieves in-game is not required to be (and is not) the +-- same as the attenuation achieved in real life. +-- +-- Radiation resistance for a node type may be specified in the node +-- definition, under the key "radiation_resistance". As an interim +-- measure, until node definitions widely include this, this code +-- knows a bunch of values for particular node types in several mods, +-- and values for groups of node types. The node definition takes +-- precedence if it specifies a value. Nodes for which no value at +-- all is known are taken to provide no radiation resistance at all; +-- this is appropriate for the majority of node types. Only node types +-- consisting of a fairly homogeneous mass of material should report +-- non-zero radiation resistance; anything with non-uniform geometry +-- or complex internal structure should show no radiation resistance. +-- Fractional resistance values are permitted; two significant figures +-- is the recommended precision. +local default_radiation_resistance_per_node = { + ["default:brick"] = 13, + ["default:bronzeblock"] = 45, + ["default:clay"] = 15, + ["default:coalblock"] = 9.6, + ["default:cobble"] = 15, + ["default:copperblock"] = 46, + ["default:desert_cobble"] = 15, + ["default:desert_sand"] = 10, + ["default:desert_stone"] = 17, + ["default:desert_stonebrick"] = 17, + ["default:diamondblock"] = 24, + ["default:dirt"] = 8.2, + ["default:dirt_with_grass"] = 8.2, + ["default:dirt_with_grass_footsteps"] = 8.2, + ["default:dirt_with_snow"] = 8.2, + ["default:glass"] = 17, + ["default:goldblock"] = 170, + ["default:gravel"] = 10, + ["default:ice"] = 5.6, + ["default:lava_flowing"] = 8.5, + ["default:lava_source"] = 17, + ["default:mese"] = 21, + ["default:mossycobble"] = 15, + ["default:nyancat"] = 1000, + ["default:nyancat_rainbow"] = 1000, + ["default:obsidian"] = 18, + ["default:obsidian_glass"] = 18, + ["default:sand"] = 10, + ["default:sandstone"] = 15, + ["default:sandstonebrick"] = 15, + ["default:snowblock"] = 1.7, + ["default:steelblock"] = 40, + ["default:stone"] = 17, + ["default:stone_with_coal"] = 16, + ["default:stone_with_copper"] = 20, + ["default:stone_with_diamond"] = 18, + ["default:stone_with_gold"] = 34, + ["default:stone_with_iron"] = 20, + ["default:stone_with_mese"] = 17, + ["default:stonebrick"] = 17, + ["default:water_flowing"] = 2.8, + ["default:water_source"] = 5.6, + ["farming:desert_sand_soil"] = 10, + ["farming:desert_sand_soil_wet"] = 10, + ["farming:soil"] = 8.2, + ["farming:soil_wet"] = 8.2, + ["glooptest:akalin_crystal_glass"] = 21, + ["glooptest:akalinblock"] = 40, + ["glooptest:alatro_crystal_glass"] = 21, + ["glooptest:alatroblock"] = 40, + ["glooptest:amethystblock"] = 18, + ["glooptest:arol_crystal_glass"] = 21, + ["glooptest:crystal_glass"] = 21, + ["glooptest:emeraldblock"] = 19, + ["glooptest:heavy_crystal_glass"] = 21, + ["glooptest:mineral_akalin"] = 20, + ["glooptest:mineral_alatro"] = 20, + ["glooptest:mineral_amethyst"] = 17, + ["glooptest:mineral_arol"] = 20, + ["glooptest:mineral_desert_coal"] = 16, + ["glooptest:mineral_desert_iron"] = 20, + ["glooptest:mineral_emerald"] = 17, + ["glooptest:mineral_kalite"] = 20, + ["glooptest:mineral_ruby"] = 18, + ["glooptest:mineral_sapphire"] = 18, + ["glooptest:mineral_talinite"] = 20, + ["glooptest:mineral_topaz"] = 18, + ["glooptest:reinforced_crystal_glass"] = 21, + ["glooptest:rubyblock"] = 27, + ["glooptest:sapphireblock"] = 27, + ["glooptest:talinite_crystal_glass"] = 21, + ["glooptest:taliniteblock"] = 40, + ["glooptest:topazblock"] = 24, + ["mesecons_extrawires:mese_powered"] = 21, + ["moreblocks:cactus_brick"] = 13, + ["moreblocks:cactus_checker"] = 8.5, + ["moreblocks:circle_stone_bricks"] = 17, + ["moreblocks:clean_glass"] = 17, + ["moreblocks:coal_checker"] = 9.0, + ["moreblocks:coal_glass"] = 17, + ["moreblocks:coal_stone"] = 17, + ["moreblocks:coal_stone_bricks"] = 17, + ["moreblocks:glow_glass"] = 17, + ["moreblocks:grey_bricks"] = 15, + ["moreblocks:iron_checker"] = 11, + ["moreblocks:iron_glass"] = 17, + ["moreblocks:iron_stone"] = 17, + ["moreblocks:iron_stone_bricks"] = 17, + ["moreblocks:plankstone"] = 9.3, + ["moreblocks:split_stone_tile"] = 15, + ["moreblocks:split_stone_tile_alt"] = 15, + ["moreblocks:stone_tile"] = 15, + ["moreblocks:super_glow_glass"] = 17, + ["moreblocks:tar"] = 7.0, + ["moreblocks:wood_tile"] = 1.7, + ["moreblocks:wood_tile_center"] = 1.7, + ["moreblocks:wood_tile_down"] = 1.7, + ["moreblocks:wood_tile_flipped"] = 1.7, + ["moreblocks:wood_tile_full"] = 1.7, + ["moreblocks:wood_tile_left"] = 1.7, + ["moreblocks:wood_tile_right"] = 1.7, + ["moreblocks:wood_tile_up"] = 1.7, + ["moreores:mineral_mithril"] = 18, + ["moreores:mineral_silver"] = 21, + ["moreores:mineral_tin"] = 19, + ["moreores:mithril_block"] = 26, + ["moreores:silver_block"] = 53, + ["moreores:tin_block"] = 37, + ["snow:snow_brick"] = 2.8, + ["technic:brass_block"] = 43, + ["technic:carbon_steel_block"] = 40, + ["technic:cast_iron_block"] = 40, + ["technic:chernobylite_block"] = 40, + ["technic:chromium_block"] = 37, + ["technic:corium_flowing"] = 40, + ["technic:corium_source"] = 80, + ["technic:granite"] = 18, + ["technic:lead_block"] = 80, + ["technic:marble"] = 18, + ["technic:marble_bricks"] = 18, + ["technic:mineral_chromium"] = 19, + ["technic:mineral_uranium"] = 71, + ["technic:mineral_zinc"] = 19, + ["technic:stainless_steel_block"] = 40, + ["technic:zinc_block"] = 36, + ["tnt:tnt"] = 11, + ["tnt:tnt_burning"] = 11, +} +local default_radiation_resistance_per_group = { + concrete = 16, + tree = 3.4, + uranium_block = 500, + wood = 1.7, +} +local cache_radiation_resistance = {} +local function node_radiation_resistance(nodename) + local eff = cache_radiation_resistance[nodename] + if eff then return eff end + local def = minetest.registered_nodes[nodename] or {groups={}} + eff = def.radiation_resistance or default_radiation_resistance_per_node[nodename] + if not eff then + for g, v in pairs(def.groups) do + if v > 0 and default_radiation_resistance_per_group[g] then + eff = default_radiation_resistance_per_group[g] + break + end + end + end + if not eff then eff = 0 end + cache_radiation_resistance[nodename] = eff + return eff +end + +-- Radioactive nodes cause damage to nearby players. The damage +-- effect depends on the intrinsic strength of the radiation source, +-- the distance between the source and the player, and the shielding +-- effect of the intervening material. These determine a rate of damage; +-- total damage caused is the integral of this over time. +-- +-- In the absence of effective shielding, for a specific source the +-- damage rate varies realistically in inverse proportion to the square +-- of the distance. (Distance is measured to the player's abdomen, +-- not to the nominal player position which corresponds to the foot.) +-- However, if the player is inside a non-walkable (liquid or gaseous) +-- radioactive node, the nominal distance could go to zero, yielding +-- infinite damage. In that case, the player's body is displacing the +-- radioactive material, so the effective distance should remain non-zero. +-- We therefore apply a lower distance bound of sqrt(0.75) m, which is +-- the maximum distance one can get from the node centre within the node. +-- +-- A radioactive node is identified by being in the "radioactive" group, +-- and the group value signifies the strength of the radiation source. +-- The group value is the distance in millimetres from a node at which +-- an unshielded player will be damaged by 0.25 HP/s. Or, equivalently, +-- it is 2000 times the square root of the damage rate in HP/s that an +-- unshielded player 1 m away will take. +-- +-- Shielding is assessed by sampling every 0.25 m along the path +-- from the source to the player, ignoring the source node itself. +-- The summed shielding values from the sampled nodes yield a measure +-- of the total amount of shielding on the path. As in reality, +-- shielding causes exponential attenuation of radiation. However, the +-- effect is scaled down relative to real life. A metre of a node with +-- radiation resistance value R yields attenuation of sqrt(R)*0.1 nepers. +-- (In real life it would be about R*0.69 nepers, by the definition +-- of the radiation resistance values.) The sqrt part of this formula +-- scales down the differences between shielding types, reflecting the +-- game's simplification of making expensive materials such as gold +-- readily available in cubic metres. The multiplicative factor in the +-- formula scales down the difference between shielded and unshielded +-- safe distances, avoiding the latter becoming impractically large. +-- +-- Damage is processed at rates down to 0.25 HP/s, which in the absence of +-- shielding is attained at the distance specified by the "radioactive" +-- group value. Computed damage rates below 0.25 HP/s result in no +-- damage at all to the player. This gives the player an opportunity +-- to be safe, and limits the range at which source/player interactions +-- need to be considered. +local assumed_abdomen_offset = vector.new(0, 1, 0) +local assumed_abdomen_offset_length = vector.length(assumed_abdomen_offset) +local cache_scaled_shielding = {} + +local damage_enabled = minetest.setting_getbool("enable_damage") + +if damage_enabled then + minetest.register_abm({ + nodenames = {"group:radioactive"}, + interval = 1, + chance = 1, + action = function (pos, node) + local strength = minetest.registered_nodes[node.name].groups.radioactive + for _, o in ipairs(minetest.get_objects_inside_radius(pos, strength*0.001 + assumed_abdomen_offset_length)) do + if o:is_player() then + local rel = vector.subtract(vector.add(o:getpos(), assumed_abdomen_offset), pos) + local dist_sq = vector.length_square(rel) + local dist = math.sqrt(dist_sq) + local dirstep = dist == 0 and vector.new(0,0,0) or vector.divide(rel, dist*4) + local intpos = pos + local shielding = 0 + for intdist = 0.25, dist, 0.25 do + intpos = vector.add(intpos, dirstep) + local intnodepos = vector.round(intpos) + if not vector.equals(intnodepos, pos) then + local sname = minetest.get_node(intnodepos).name + local sval = cache_scaled_shielding[sname] + if not sval then + sval = math.sqrt(node_radiation_resistance(sname)) * -0.025 + cache_scaled_shielding[sname] = sval + end + shielding = shielding + sval + end + end + local dmg_rate = 0.25e-6 * strength*strength * math.exp(shielding) / math.max(0.75, dist_sq) + if dmg_rate >= 0.25 then + local dmg_int = math.floor(dmg_rate) + if math.random() < dmg_rate-dmg_int then + dmg_int = dmg_int + 1 + end + if dmg_int > 0 then + o:set_hp(math.max(o:get_hp() - dmg_int, 0)) + end + end + end + end + end, + }) +end + +-- radioactive materials that can result from destroying a reactor +local corium_griefing = 1 +if (not technic.config:get_bool("enable_corium_griefing")) then + corium_griefing = 0 +end + +for _, state in ipairs({ "flowing", "source" }) do + minetest.register_node("technic:corium_"..state, { + description = S(state == "source" and "Corium Source" or "Flowing Corium"), + drawtype = (state == "source" and "liquid" or "flowingliquid"), + [state == "source" and "tiles" or "special_tiles"] = {{ + name = "technic_corium_"..state.."_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }}, + paramtype = "light", + paramtype2 = (state == "flowing" and "flowingliquid" or nil), + light_source = (state == "source" and 8 or 5), + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 1, + liquidtype = state, + liquid_alternative_flowing = "technic:corium_flowing", + liquid_alternative_source = "technic:corium_source", + liquid_viscosity = LAVA_VISC, + liquid_renewable = false, + damage_per_second = 6, + post_effect_color = { a=192, r=80, g=160, b=80 }, + groups = { + liquid = 2, + hot = 3, + igniter = corium_griefing, + radioactive = (state == "source" and 32000 or 16000), + not_in_creative_inventory = (state == "flowing" and 1 or nil), + }, + }) +end + +if bucket and bucket.register_liquid then + bucket.register_liquid( + "technic:corium_source", + "technic:corium_flowing", + "technic:bucket_corium", + "technic_bucket_corium.png", + "Corium Bucket" + ) +end + +minetest.register_node("technic:chernobylite_block", { + description = S("Chernobylite Block"), + tiles = { "technic_chernobylite_block.png" }, + is_ground_content = true, + groups = { cracky=1, radioactive=5000, level=2 }, + sounds = default.node_sound_stone_defaults(), + light_source = 2, + +}) + +minetest.register_abm({ + nodenames = {"group:water"}, + neighbors = {"technic:corium_source"}, + interval = 1, + chance = 1, + action = function (pos, node) + minetest.remove_node(pos) + end, +}) + +if (corium_griefing == 1) then + minetest.register_abm({ + nodenames = {"technic:corium_flowing"}, + interval = 5, + chance = 10, + action = function (pos, node) + minetest.set_node(pos, {name="technic:chernobylite_block"}) + end, + }) + minetest.register_abm({ + nodenames = { "technic:corium_source", "technic:corium_flowing" }, + interval = 4, + chance = 4, + action = function (pos, node) + for _, offset in ipairs({ + vector.new(1,0,0), + vector.new(-1,0,0), + vector.new(0,0,1), + vector.new(0,0,-1), + vector.new(0,-1,0), + }) do + if math.random(8) == 1 then + minetest.dig_node(vector.add(pos, offset)) + end + end + end, + }) +end diff --git a/technic/technic/machines/HV/quarry.lua b/technic/technic/machines/HV/quarry.lua new file mode 100644 index 0000000..60805cc --- /dev/null +++ b/technic/technic/machines/HV/quarry.lua @@ -0,0 +1,251 @@ + +local S = technic.getter + +minetest.register_craft({ + recipe = { + {"technic:carbon_plate", "pipeworks:filter", "technic:composite_plate"}, + {"technic:motor", "technic:machine_casing", "technic:diamond_drill_head"}, + {"technic:carbon_steel_block", "technic:hv_cable0", "technic:carbon_steel_block"}}, + output = "technic:quarry", +}) + +local quarry_dig_above_nodes = 3 -- How far above the quarry we will dig nodes +local quarry_max_depth = 100 +local quarry_demand = 10000 + +local function set_quarry_formspec(meta) + local radius = meta:get_int("size") + local formspec = "size[6,4.3]".. + "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 + formspec = formspec.."button[4,1;2,1;enable;"..S("Disabled").."]" + else + formspec = formspec.."button[4,1;2,1;disable;"..S("Enabled").."]" + 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) +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 meta = minetest.get_meta(pos) + if fields.size and string.find(fields.size, "^[0-9]+$") then + local size = tonumber(fields.size) + if size >= 2 and size <= 8 and size ~= meta:get_int("size") then + meta:set_int("size", size) + meta:set_int("dug", 0) + end + end + if fields.enable then meta:set_int("enabled", 1) 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_demand(meta) +end + +local function quarry_handle_purge(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local i = 0 + 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, vector.new(0, 1, 0), 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 endpos = vector.add(vector.add(vector.add(startpos, + vector.new(0, -quarry_dig_above_nodes-quarry_max_depth, 0)), + vector.multiply(pdir, diameter-1)), + vector.multiply(qdir, diameter-1)) + local vm = VoxelManip() + local minpos, maxpos = vm:read_from_map(startpos, endpos) + local area = VoxelArea:new({MinEdge=minpos, MaxEdge=maxpos}) + local data = vm:get_data() + local c_air = minetest.get_content_id("air") + 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} + if not dignodedef.diggable or (dignodedef.can_dig and not dignodedef.can_dig(digpos, nil)) then + can_dig = false + end + end + + if can_dig then + for ay = startpos.y, digpos.y+1, -1 do + local checkpos = {x=digpos.x, y=ay, z=digpos.z} + local checknode = technic.get_or_load_node(checkpos) or minetest.get_node(checkpos) + if checknode.name ~= "air" then + can_dig = false + break + end + end + end + nd = nd + 1 + if can_dig then + minetest.remove_node(digpos) + local drops = minetest.get_node_drops(dignode.name, "") + for _, dropped_item in ipairs(drops) do + local left = inv:add_item("cache", dropped_item) + while not left:is_empty() do + meta:set_int("purge_on", 1) + quarry_handle_purge(pos) + 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 + set_quarry_formspec(meta) + set_quarry_demand(meta) +end + +local function send_move_error(player) + minetest.chat_send_player(player:get_player_name(), + S("Manually taking/removing from cache by hand is not possible. ".. + "If you can't wait, restart or disable the quarry to start automatic purge.")) + return 0 +end + +minetest.register_node("technic:quarry", { + description = S("%s Quarry"):format("HV"), + tiles = {"technic_carbon_steel_block.png", "technic_carbon_steel_block.png", + "technic_carbon_steel_block.png", "technic_carbon_steel_block.png", + "technic_carbon_steel_block.png^default_tool_mesepick.png", "technic_carbon_steel_block.png"}, + inventory_image = minetest.inventorycube("technic_carbon_steel_block.png", + "technic_carbon_steel_block.png^default_tool_mesepick.png", + "technic_carbon_steel_block.png"), + paramtype2 = "facedir", + groups = {cracky=2, tubedevice=1, technic_machine = 1}, + tube = { + connect_sides = {top = 1}, + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("%s Quarry"):format("HV")) + meta:set_int("size", 4) + set_quarry_formspec(meta) + set_quarry_demand(meta) + end, + after_place_node = function(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + pipeworks.scan_for_tube_objects(pos) + 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, + 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) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return send_move_error(player) + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + return send_move_error(player) + end +}) + +technic.register_machine("HV", "technic:quarry", technic.receiver) diff --git a/technic/technic/machines/HV/solar_array.lua b/technic/technic/machines/HV/solar_array.lua new file mode 100644 index 0000000..414291a --- /dev/null +++ b/technic/technic/machines/HV/solar_array.lua @@ -0,0 +1,14 @@ +-- The high voltage solar array is an assembly of medium voltage arrays. +-- Solar arrays are not able to store large amounts of energy. + +minetest.register_craft({ + output = 'technic:solar_array_hv 1', + recipe = { + {'technic:solar_array_mv', 'technic:solar_array_mv', 'technic:solar_array_mv'}, + {'technic:carbon_plate', 'technic:hv_transformer', 'technic:composite_plate'}, + {'', 'technic:hv_cable0', ''}, + } +}) + +technic.register_solar_array({tier="HV", power=100}) + diff --git a/technic/technic/machines/LV/alloy_furnace.lua b/technic/technic/machines/LV/alloy_furnace.lua new file mode 100644 index 0000000..bdf2f31 --- /dev/null +++ b/technic/technic/machines/LV/alloy_furnace.lua @@ -0,0 +1,14 @@ +-- LV Alloy furnace + +-- FIXME: kpoppel: I'd like to introduce an induction heating element here... +minetest.register_craft({ + output = 'technic:lv_alloy_furnace', + recipe = { + {'default:brick', 'default:brick', 'default:brick'}, + {'default:brick', 'technic:machine_casing', 'default:brick'}, + {'default:brick', 'technic:lv_cable0', 'default:brick'}, + } +}) + +technic.register_alloy_furnace({tier = "LV", speed = 1, demand = {300}}) + diff --git a/technic/technic/machines/LV/battery_box.lua b/technic/technic/machines/LV/battery_box.lua new file mode 100644 index 0000000..429bcd6 --- /dev/null +++ b/technic/technic/machines/LV/battery_box.lua @@ -0,0 +1,19 @@ + +minetest.register_craft({ + output = 'technic:lv_battery_box0', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'technic:battery', 'technic:machine_casing', 'technic:battery'}, + {'technic:battery', 'technic:lv_cable0', 'technic:battery'}, + } +}) + +technic.register_battery_box({ + tier = "LV", + max_charge = 40000, + charge_rate = 1000, + discharge_rate = 4000, + charge_step = 500, + discharge_step = 800, +}) + diff --git a/technic/technic/machines/LV/cables.lua b/technic/technic/machines/LV/cables.lua new file mode 100644 index 0000000..e18eae1 --- /dev/null +++ b/technic/technic/machines/LV/cables.lua @@ -0,0 +1,14 @@ + +minetest.register_alias("lv_cable", "technic:lv_cable0") + +minetest.register_craft({ + output = 'technic:lv_cable0 6', + recipe = { + {'default:paper', 'default:paper', 'default:paper'}, + {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}, + {'default:paper', 'default:paper', 'default:paper'}, + } +}) + +technic.register_cable("LV", 2/16) + diff --git a/technic/technic/machines/LV/cnc.lua b/technic/technic/machines/LV/cnc.lua new file mode 100644 index 0000000..dd67e9b --- /dev/null +++ b/technic/technic/machines/LV/cnc.lua @@ -0,0 +1,237 @@ +-- Technic CNC v1.0 by kpoppel +-- Based on the NonCubic Blocks MOD v1.4 by yves_de_beck + +-- Idea: +-- Somehow have a tabbed/paged panel if the number of shapes should expand +-- beyond what is available in the panel today. +-- I could imagine some form of API allowing modders to come with their own node +-- box definitions and easily stuff it in the this machine for production. + +local S = technic.getter + +local shape = {} +local onesize_products = { + slope = 2, + slope_edge = 1, + slope_inner_edge = 1, + pyramid = 2, + spike = 1, + cylinder = 2, + oblate_spheroid = 1, + sphere = 1, + stick = 8, + slope_upsdown = 2, + slope_edge_upsdown = 1, + slope_inner_edge_upsdown = 1, + cylinder_horizontal = 2, + slope_lying = 2, + onecurvededge = 1, + twocurvededge = 1, +} +local twosize_products = { + element_straight = 4, + element_end = 2, + element_cross = 1, + element_t = 1, + element_edge = 2, +} + +local cnc_formspec = + "invsize[9,11;]".. + "label[1,0;"..S("Choose Milling Program:").."]".. + "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[3,0.5;1,1;technic_cnc_slope_inner_edge.png;slope_inner_edge; ]".. + "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[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[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[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[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[2,2.5;1,1;technic_cnc_onecurvededge.png;onecurvededge; ]".. + "image_button[3,2.5;1,1;technic_cnc_twocurvededge.png;twocurvededge; ]".. + + "label[1,3.5;"..S("Slim Elements half / normal height:").."]".. + + "image_button[1,4;1,0.5;technic_cnc_full.png;full; ]".. + "image_button[1,4.5;1,0.5;technic_cnc_half.png;half; ]".. + "image_button[2,4;1,1;technic_cnc_element_straight.png;element_straight; ]".. + "image_button[3,4;1,1;technic_cnc_element_end.png;element_end; ]".. + "image_button[4,4;1,1;technic_cnc_element_cross.png;element_cross; ]".. + "image_button[5,4;1,1;technic_cnc_element_t.png;element_t; ]".. + "image_button[6,4;1,1;technic_cnc_element_edge.png;element_edge; ]".. + + "label[0, 5.5;"..S("In:").."]".. + "list[current_name;src;0.5,5.5;1,1;]".. + "label[4, 5.5;"..S("Out:").."]".. + "list[current_name;dst;5,5.5;4,1;]".. + + "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; + +-- The form handler is declared here because we need it in both the inactive and active modes +-- in order to be able to change programs wile it is running. +local function form_handler(pos, formname, fields, sender) + -- REGISTER MILLING PROGRAMS AND OUTPUTS: + ------------------------------------------ + -- Program for half/full size + if fields["full"] then + size = 1 + return + end + + if fields["half"] then + size = 2 + return + end + + -- Resolve the node name and the number of items to make + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local inputstack = inv:get_stack("src", 1) + local inputname = inputstack:get_name() + local multiplier = 0 + for k, _ in pairs(fields) do + -- Set a multipier for the half/full size capable blocks + if twosize_products[k] ~= nil then + multiplier = size * twosize_products[k] + else + multiplier = onesize_products[k] + end + + if onesize_products[k] ~= nil or twosize_products[k] ~= nil then + meta:set_float( "cnc_multiplier", multiplier) + meta:set_string("cnc_user", sender:get_player_name()) + end + + if onesize_products[k] ~= nil or (twosize_products[k] ~= nil and size==2) then + meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k) + --print(inputname .. "_technic_cnc_" .. k) + break + end + + if twosize_products[k] ~= nil and size==1 then + meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k .. "_double") + --print(inputname .. "_technic_cnc_" .. k .. "_double") + break + end + end + return +end + +-- Action code performing the transformation +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local eu_input = meta:get_int("LV_EU_input") + local machine_name = S("%s CNC Machine"):format("LV") + local machine_node = "technic:cnc" + local demand = 450 + + local result = meta:get_string("cnc_product") + if inv:is_empty("src") or + (not minetest.registered_nodes[result]) or + (not inv:room_for_item("dst", result)) then + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Idle"):format(machine_name)) + meta:set_string("cnc_product", "") + meta:set_int("LV_EU_demand", 0) + return + end + + if eu_input < demand then + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + elseif eu_input >= demand then + technic.swap_node(pos, machine_node.."_active") + meta:set_string("infotext", S("%s Active"):format(machine_name)) + meta:set_int("src_time", meta:get_int("src_time") + 1) + if meta:get_int("src_time") >= 3 then -- 3 ticks per output + meta:set_int("src_time", 0) + srcstack = inv:get_stack("src", 1) + srcstack:take_item() + inv:set_stack("src", 1, srcstack) + inv:add_item("dst", result.." "..meta:get_int("cnc_multiplier")) + end + end + meta:set_int("LV_EU_demand", demand) +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, technic_machine=1}, + 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"}, + paramtype2 = "facedir", + drop = "technic:cnc", + groups = {cracky=2, technic_machine=1, 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, + technic_run = run, + technic_disabled_machine_name = "technic:cnc", +}) + +technic.register_machine("LV", "technic:cnc", 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'}, + }, +}) + diff --git a/technic/technic/machines/LV/cnc_api.lua b/technic/technic/machines/LV/cnc_api.lua new file mode 100644 index 0000000..f5aae5c --- /dev/null +++ b/technic/technic/machines/LV/cnc_api.lua @@ -0,0 +1,369 @@ +-- API for the technic CNC machine +-- Again code is adapted from the NonCubic Blocks MOD v1.4 by yves_de_beck + +local S = technic.getter + +technic.cnc = {} + +-- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES: +------------------------------------------------------ + +-- Define slope boxes for the various nodes +------------------------------------------- +technic.cnc.programs = { + { suffix = "technic_cnc_stick", + model = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}, + desc = S("Stick") + }, + + { suffix = "technic_cnc_element_end_double", + model = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5}, + desc = S("Element End Double") + }, + + { suffix = "technic_cnc_element_cross_double", + model = { + {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.5, -0.5, -0.3, -0.3, 0.5, 0.3}}, + desc = S("Element Cross Double") + }, + + { suffix = "technic_cnc_element_t_double", + model = { + {-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.3, -0.5, -0.3, 0.5, 0.5, 0.3}}, + desc = S("Element T Double") + }, + + { suffix = "technic_cnc_element_edge_double", + model = { + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}}, + desc = S("Element Edge Double") + }, + + { suffix = "technic_cnc_element_straight_double", + model = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, + desc = S("Element Straight Double") + }, + + { suffix = "technic_cnc_element_end", + model = {-0.3, -0.5, -0.3, 0.3, 0, 0.5}, + desc = S("Element End") + }, + + { suffix = "technic_cnc_element_cross", + model = { + {0.3, -0.5, -0.3, 0.5, 0, 0.3}, + {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}}, + desc = S("Element Cross") + }, + + { suffix = "technic_cnc_element_t", + model = { + {-0.3, -0.5, -0.5, 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}}, + desc = S("Element T") + }, + + { suffix = "technic_cnc_element_edge", + model = { + {-0.3, -0.5, -0.5, 0.3, 0, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}}, + desc = S("Element Edge") + }, + + { suffix = "technic_cnc_element_straight", + model = {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, + 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", + model = "technic_sphere.obj", + desc = S("Sphere") + }, + + { suffix = "technic_cnc_cylinder_horizontal", + model = "technic_cylinder_horizontal.obj", + desc = S("Horizontal Cylinder") + }, + + { suffix = "technic_cnc_cylinder", + model = "technic_cylinder.obj", + desc = S("Cylinder") + }, + + { suffix = "technic_cnc_twocurvededge", + model = "technic_two_curved_edge.obj", + desc = S("Two Curved Edge/Corner Block") + }, + + { suffix = "technic_cnc_onecurvededge", + model = "technic_one_curved_edge.obj", + desc = S("One Curved Edge Block") + }, + + { suffix = "technic_cnc_spike", + model = "technic_pyramid_spike.obj", + 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", + model = "technic_pyramid.obj", + 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", + model = "technic_innercorner_upsdown.obj", + desc = S("Slope Upside Down Inner Edge/Corner"), + 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", + model = "technic_outercorner_upsdown.obj", + desc = S("Slope Upside Down Outer Edge/Corner"), + 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", + model = "technic_innercorner.obj", + desc = S("Slope Inner Edge/Corner"), + 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", + model = "technic_outercorner.obj", + desc = S("Slope Outer Edge/Corner"), + 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", + model = "technic_slope_upsdown.obj", + 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", + model = "technic_slope_horizontal.obj", + 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", + model = "technic_slope.obj", + 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 +technic.cnc.programs_disable = { + -- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick + -- ... + ["default:dirt"] = {"technic_cnc_oblate_spheroid", "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"} +} + +-- Generic function for registering all the different node types +function technic.cnc.register_program(recipeitem, suffix, model, groups, images, description, cbox, sbox) + + 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, { + description = description, + drawtype = dtype, + node_box = nodeboxdef, + mesh = meshdef, + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + groups = groups, + selection_box = sbox, + collision_box = cbox + }) +end + +-- function to iterate over all the programs the CNC machine knows +function technic.cnc.register_all(recipeitem, groups, images, description) + for _, data in ipairs(technic.cnc.programs) do + -- Disable node creation for disabled node types for some material + local do_register = true + if technic.cnc.programs_disable[recipeitem] ~= nil then + for __, disable in ipairs(technic.cnc.programs_disable[recipeitem]) do + if disable == data.suffix then + do_register = false + end + end + end + -- Create the node if it passes the test + if do_register then + technic.cnc.register_program(recipeitem, data.suffix, data.model, + groups, images, description.." "..data.desc, data.cbox, data.sbox) + end + end +end + + +-- 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) + + technic.cnc.register_slope(recipeitem, groups, images, desc_slope) + technic.cnc.register_slope_lying(recipeitem, groups, images, desc_slope_lying) + technic.cnc.register_slope_upsdown(recipeitem, groups, images, desc_slope_upsdown) + technic.cnc.register_slope_edge(recipeitem, groups, images, desc_slope_edge) + technic.cnc.register_slope_inner_edge(recipeitem, groups, images, desc_slope_inner_edge) + technic.cnc.register_slope_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_edge) + technic.cnc.register_slope_inner_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_inner_edge) + technic.cnc.register_pyramid(recipeitem, groups, images, desc_pyramid) + technic.cnc.register_spike(recipeitem, groups, images, desc_spike) + technic.cnc.register_onecurvededge(recipeitem, groups, images, desc_onecurvededge) + technic.cnc.register_twocurvededge(recipeitem, groups, images, desc_twocurvededge) + technic.cnc.register_cylinder(recipeitem, groups, images, desc_cylinder) + technic.cnc.register_cylinder_horizontal(recipeitem, groups, images, desc_cylinder_horizontal) + technic.cnc.register_spheroid(recipeitem, groups, images, desc_spheroid) + 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_t(recipeitem, groups, images, desc_element_t) + technic.cnc.register_element_cross(recipeitem, groups, images, desc_element_cross) + technic.cnc.register_element_end(recipeitem, groups, images, desc_element_end) +end + +-- REGISTER STICKS: noncubic.register_xyz(recipeitem, groups, images, desc_element_xyz) +------------------------------------------------------------------------------------------------------------ +function technic.cnc.register_stick_etc(recipeitem, groups, images, desc_stick) + technic.cnc.register_stick(recipeitem, groups, images, desc_stick) +end + +function technic.cnc.register_elements(recipeitem, groups, images, desc_element_straight_double, desc_element_edge_double, desc_element_t_double, desc_element_cross_double, desc_element_end_double) + technic.cnc.register_element_straight_double(recipeitem, groups, images, desc_element_straight_double) + technic.cnc.register_element_edge_double(recipeitem, groups, images, desc_element_edge_double) + technic.cnc.register_element_t_double(recipeitem, groups, images, desc_element_t_double) + technic.cnc.register_element_cross_double(recipeitem, groups, images, desc_element_cross_double) + technic.cnc.register_element_end_double(recipeitem, groups, images, desc_element_end_double) +end + diff --git a/technic/technic/machines/LV/cnc_nodes.lua b/technic/technic/machines/LV/cnc_nodes.lua new file mode 100644 index 0000000..05be9af --- /dev/null +++ b/technic/technic/machines/LV/cnc_nodes.lua @@ -0,0 +1,91 @@ +-- REGISTER MATERIALS AND PROPERTIES FOR NONCUBIC ELEMENTS: +----------------------------------------------------------- + +local S = technic.getter + +-- DIRT +------- +technic.cnc.register_all("default:dirt", + {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + {"default_grass.png", "default_dirt.png", "default_grass.png"}, + S("Dirt")) +-- WOOD +------- +technic.cnc.register_all("default:wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"default_wood.png"}, + S("Wooden")) +-- STONE +-------- +technic.cnc.register_all("default:stone", + {cracky=3, not_in_creative_inventory=1}, + {"default_stone.png"}, + S("Stone")) +-- COBBLE +--------- +technic.cnc.register_all("default:cobble", + {cracky=3, not_in_creative_inventory=1}, + {"default_cobble.png"}, + S("Cobble")) +-- BRICK +-------- +technic.cnc.register_all("default:brick", + {cracky=3, not_in_creative_inventory=1}, + {"default_brick.png"}, + S("Brick")) + +-- SANDSTONE +------------ +technic.cnc.register_all("default:sandstone", + {crumbly=2, cracky=3, not_in_creative_inventory=1}, + {"default_sandstone.png"}, + S("Sandstone")) + +-- LEAVES +--------- +technic.cnc.register_all("default:leaves", + {snappy=2, choppy=2, oddly_breakable_by_hand=3, not_in_creative_inventory=1}, + {"default_leaves.png"}, + S("Leaves")) +-- TREE +------- +technic.cnc.register_all("default:tree", + {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, wood=1, not_in_creative_inventory=1}, + {"default_tree.png"}, + S("Tree")) + +-- WROUGHT IRON +--------------- +technic.cnc.register_all("default:steelblock", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"technic_wrought_iron_block.png"}, + S("Wrought Iron")) + +-- Bronze +-------- +technic.cnc.register_all("default:bronzeblock", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"default_bronze_block.png"}, + S("Bronze")) + +-- Stainless Steel +-------- +technic.cnc.register_all("technic:stainless_steel_block", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"technic_stainless_steel_block.png"}, + S("Stainless Steel")) + +-- Marble +------------ +technic.cnc.register_all("technic:marble", + {cracky=3, not_in_creative_inventory=1}, + {"technic_marble.png"}, + S("Marble")) + +-- Granite +------------ +technic.cnc.register_all("technic:granite", + {cracky=1, not_in_creative_inventory=1}, + {"technic_granite.png"}, + S("Granite")) + diff --git a/technic/technic/machines/LV/compressor.lua b/technic/technic/machines/LV/compressor.lua new file mode 100644 index 0000000..e2bde40 --- /dev/null +++ b/technic/technic/machines/LV/compressor.lua @@ -0,0 +1,13 @@ + +minetest.register_alias("compressor", "technic:lv_compressor") + +minetest.register_craft({ + output = 'technic:lv_compressor', + recipe = { + {'default:stone', 'technic:motor', 'default:stone'}, + {'mesecons:piston', 'technic:machine_casing', 'mesecons:piston'}, + {'technic:fine_silver_wire', 'technic:lv_cable0', 'technic:fine_silver_wire'}, + } +}) + +technic.register_compressor({tier = "LV", demand = {300}, speed = 1}) diff --git a/technic/technic/machines/LV/electric_furnace.lua b/technic/technic/machines/LV/electric_furnace.lua new file mode 100644 index 0000000..cc4daff --- /dev/null +++ b/technic/technic/machines/LV/electric_furnace.lua @@ -0,0 +1,16 @@ +-- LV Electric Furnace +-- This is a faster version of the stone furnace which runs on EUs + +-- FIXME: kpoppel I'd like to introduce an induction heating element here also +minetest.register_craft({ + output = 'technic:electric_furnace', + recipe = { + {'default:cobble', 'default:cobble', 'default:cobble'}, + {'default:cobble', 'technic:machine_casing', 'default:cobble'}, + {'default:cobble', 'technic:lv_cable0', 'default:cobble'}, + } +}) + +technic.register_electric_furnace({tier="LV", demand={300}, speed = 2}) + + diff --git a/technic/technic/machines/LV/extractor.lua b/technic/technic/machines/LV/extractor.lua new file mode 100644 index 0000000..363d2e3 --- /dev/null +++ b/technic/technic/machines/LV/extractor.lua @@ -0,0 +1,13 @@ + +minetest.register_alias("extractor", "technic:lv_extractor") + +minetest.register_craft({ + output = 'technic:lv_extractor', + recipe = { + {'technic:treetap', 'technic:motor', 'technic:treetap'}, + {'technic:treetap', 'technic:machine_casing', 'technic:treetap'}, + {'', 'technic:lv_cable0', ''}, + } +}) + +technic.register_extractor({tier = "LV", demand = {300}, speed = 1}) diff --git a/technic/technic/machines/LV/generator.lua b/technic/technic/machines/LV/generator.lua new file mode 100644 index 0000000..999dbc5 --- /dev/null +++ b/technic/technic/machines/LV/generator.lua @@ -0,0 +1,18 @@ +-- The electric generator. +-- A simple device to get started on the electric machines. +-- Inefficient and expensive in fuel (200EU per tick) +-- Also only allows for LV machinery to run. + +minetest.register_alias("lv_generator", "technic:lv_generator") + +minetest.register_craft({ + output = 'technic:lv_generator', + recipe = { + {'default:stone', 'default:furnace', 'default:stone'}, + {'default:stone', 'technic:machine_casing', 'default:stone'}, + {'default:stone', 'technic:lv_cable0', 'default:stone'}, + } +}) + +technic.register_generator({tier="LV", supply=200}) + diff --git a/technic/technic/machines/LV/geothermal.lua b/technic/technic/machines/LV/geothermal.lua new file mode 100644 index 0000000..e88d3c9 --- /dev/null +++ b/technic/technic/machines/LV/geothermal.lua @@ -0,0 +1,111 @@ +-- A geothermal EU generator +-- Using hot lava and water this device can create energy from steam +-- The machine is only producing LV EUs and can thus not drive more advanced equipment +-- The output is a little more than the coal burning generator (max 300EUs) + +minetest.register_alias("geothermal", "technic:geothermal") + +local S = technic.getter + +minetest.register_craft({ + output = 'technic:geothermal', + recipe = { + {'technic:granite', 'default:diamond', 'technic:granite'}, + {'technic:fine_copper_wire', 'technic:machine_casing', 'technic:fine_copper_wire'}, + {'technic:granite', 'technic:lv_cable0', 'technic:granite'}, + } +}) + +minetest.register_craftitem("technic:geothermal", { + description = S("Geothermal %s Generator"):format("LV"), +}) + +local check_node_around = function(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:lava_source" or node.name == "default:lava_flowing" then return 2 end + return 0 +end + +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local water_nodes = 0 + local lava_nodes = 0 + local production_level = 0 + local eu_supply = 0 + + -- Correct positioning is water on one side and lava on the other. + -- The two cannot be adjacent because the lava the turns into obsidian or rock. + -- To get to 100% production stack the water and lava one extra block down as well: + -- WGL (W=Water, L=Lava, G=the generator, |=an LV cable) + -- W|L + + local positions = { + {x=pos.x+1, y=pos.y, z=pos.z}, + {x=pos.x+1, y=pos.y-1, z=pos.z}, + {x=pos.x-1, y=pos.y, z=pos.z}, + {x=pos.x-1, y=pos.y-1, z=pos.z}, + {x=pos.x, y=pos.y, z=pos.z+1}, + {x=pos.x, y=pos.y-1, z=pos.z+1}, + {x=pos.x, y=pos.y, z=pos.z-1}, + {x=pos.x, y=pos.y-1, z=pos.z-1}, + } + for _, p in pairs(positions) do + local check = check_node_around(p) + if check == 1 then water_nodes = water_nodes + 1 end + if check == 2 then lava_nodes = lava_nodes + 1 end + end + + if water_nodes == 1 and lava_nodes == 1 then production_level = 25; eu_supply = 50 end + if water_nodes == 2 and lava_nodes == 1 then production_level = 50; eu_supply = 100 end + if water_nodes == 1 and lava_nodes == 2 then production_level = 75; eu_supply = 200 end + if water_nodes == 2 and lava_nodes == 2 then production_level = 100; eu_supply = 300 end + + if production_level > 0 then + meta:set_int("LV_EU_supply", eu_supply) + end + + meta:set_string("infotext", + S("Geothermal %s Generator"):format("LV").." ("..production_level.."%)") + + if production_level > 0 and minetest.get_node(pos).name == "technic:geothermal" then + technic.swap_node (pos, "technic:geothermal_active") + return + end + if production_level == 0 then + technic.swap_node(pos, "technic:geothermal") + meta:set_int("LV_EU_supply", 0) + 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"}, + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=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("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, 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_active", technic.producer) + diff --git a/technic/technic/machines/LV/grinder.lua b/technic/technic/machines/LV/grinder.lua new file mode 100644 index 0000000..da9ea29 --- /dev/null +++ b/technic/technic/machines/LV/grinder.lua @@ -0,0 +1,13 @@ + +minetest.register_alias("grinder", "technic:lv_grinder") +minetest.register_craft({ + output = 'technic:lv_grinder', + recipe = { + {'default:desert_stone', 'default:diamond', 'default:desert_stone'}, + {'default:desert_stone', 'technic:machine_casing', 'default:desert_stone'}, + {'technic:granite', 'technic:lv_cable0', 'technic:granite'}, + } +}) + +technic.register_grinder({tier="LV", demand={200}, speed=1}) + diff --git a/technic/technic/machines/LV/init.lua b/technic/technic/machines/LV/init.lua new file mode 100644 index 0000000..30523c9 --- /dev/null +++ b/technic/technic/machines/LV/init.lua @@ -0,0 +1,29 @@ + +technic.register_tier("LV", "Low Voltage") + +local path = technic.modpath.."/machines/LV" + +-- Wiring stuff +dofile(path.."/cables.lua") +dofile(path.."/battery_box.lua") + +-- Generators +dofile(path.."/solar_panel.lua") +dofile(path.."/solar_array.lua") +dofile(path.."/geothermal.lua") +dofile(path.."/water_mill.lua") +dofile(path.."/generator.lua") + +-- Machines +dofile(path.."/alloy_furnace.lua") +dofile(path.."/electric_furnace.lua") +dofile(path.."/grinder.lua") +dofile(path.."/extractor.lua") +dofile(path.."/compressor.lua") + +dofile(path.."/music_player.lua") + +dofile(path.."/cnc.lua") +dofile(path.."/cnc_api.lua") +dofile(path.."/cnc_nodes.lua") + diff --git a/technic/technic/machines/LV/music_player.lua b/technic/technic/machines/LV/music_player.lua new file mode 100644 index 0000000..dc7e2d0 --- /dev/null +++ b/technic/technic/machines/LV/music_player.lua @@ -0,0 +1,130 @@ +-- LV Music player. +-- The player can play music. But it is high ampage! + +local S = technic.getter + +minetest.register_alias("music_player", "technic:music_player") +minetest.register_craft({ + output = 'technic:music_player', + recipe = { + {'technic:chromium_ingot', 'default:diamond', 'technic:chromium_ingot'}, + {'default:diamond', 'technic:machine_casing', 'default:diamond'}, + {'default:mossycobble', 'technic:lv_cable0', 'default:mossycobble'}, + } +}) + +local music_handles = {} + +local function play_track(pos, track) + return minetest.sound_play("technic_track"..tostring(track), + {pos = pos, gain = 1.0, loop = true, max_hear_distance = 72,}) +end + +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local eu_input = meta:get_int("LV_EU_input") + local machine_name = S("%s Music Player"):format("LV") + local machine_node = "technic:music_player" + local demand = 150 + + local current_track = meta:get_int("current_track") + local pos_hash = minetest.hash_node_position(pos) + local music_handle = music_handles[pos_hash] + + -- Setup meta data if it does not exist. + if not eu_input then + meta:set_int("LV_EU_demand", demand) + meta:set_int("LV_EU_input", 0) + return + end + + if meta:get_int("active") == 0 then + meta:set_string("infotext", S("%s Idle"):format(machine_name)) + meta:set_int("LV_EU_demand", 0) + return + end + + if eu_input < demand then + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + if music_handle then + minetest.sound_stop(music_handle) + music_handle = nil + end + elseif eu_input >= demand then + meta:set_string("infotext", S("%s Active"):format(machine_name)) + if not music_handle then + music_handle = play_track(pos, current_track) + end + end + music_handles[pos_hash] = music_handle + meta:set_int("LV_EU_demand", demand) +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}, + 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) + diff --git a/technic/technic/machines/LV/solar_array.lua b/technic/technic/machines/LV/solar_array.lua new file mode 100644 index 0000000..4d2c3b3 --- /dev/null +++ b/technic/technic/machines/LV/solar_array.lua @@ -0,0 +1,18 @@ +-- The solar array is an assembly of panels into a powerful array +-- The assembly can deliver more energy than the individual panel because +-- of the transformer unit which converts the panel output variations into +-- a stable supply. +-- Solar arrays are not able to store large amounts of energy. +-- The LV arrays are used to make medium voltage arrays. + +minetest.register_craft({ + output = 'technic:solar_array_lv 1', + recipe = { + {'technic:solar_panel', 'technic:solar_panel', 'technic:solar_panel'}, + {'technic:carbon_steel_ingot', 'technic:lv_transformer', 'technic:carbon_steel_ingot'}, + {'', 'technic:lv_cable0', ''}, + } +}) + +technic.register_solar_array({tier="LV", power=10}) + diff --git a/technic/technic/machines/LV/solar_panel.lua b/technic/technic/machines/LV/solar_panel.lua new file mode 100644 index 0000000..41dff95 --- /dev/null +++ b/technic/technic/machines/LV/solar_panel.lua @@ -0,0 +1,67 @@ +-- Solar panels are the building blocks of LV solar arrays +-- They can however also be used separately but with reduced efficiency due to the missing transformer. +-- Individual panels are less efficient than when the panels are combined into full arrays. + +local S = technic.getter + +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 EU)", machine_name, technic.prettynum(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", { + tiles = {"technic_solar_panel_top.png", "technic_solar_panel_bottom.png", "technic_solar_panel_side.png", + "technic_solar_panel_side.png", "technic_solar_panel_side.png", "technic_solar_panel_side.png"}, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1}, + sounds = default.node_sound_wood_defaults(), + description = S("Small Solar %s Generator"):format("LV"), + active = false, + drawtype = "nodebox", + paramtype = "light", + is_ground_content = true, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("LV_EU_supply", 0) + meta:set_string("infotext", S("Small Solar %s Generator"):format("LV")) + 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:fine_silver_wire', 'technic:lv_cable0', 'mesecons_materials:glue'}, + + } +}) + +technic.register_machine("LV", "technic:solar_panel", technic.producer) + diff --git a/technic/technic/machines/LV/water_mill.lua b/technic/technic/machines/LV/water_mill.lua new file mode 100644 index 0000000..9088d1d --- /dev/null +++ b/technic/technic/machines/LV/water_mill.lua @@ -0,0 +1,102 @@ +-- 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 little under half as good as the thermal generator. + +local S = technic.getter + +minetest.register_alias("water_mill", "technic:water_mill") + +minetest.register_craft({ + output = 'technic:water_mill', + recipe = { + {'technic:marble', 'default:diamond', 'technic:marble'}, + {'group:wood', 'technic:machine_casing', 'group:wood'}, + {'technic:marble', 'technic:lv_cable0', 'technic:marble'}, + } +}) + +local function check_node_around_mill(pos) + local node = minetest.get_node(pos) + if node.name == "default:water_flowing" or + node.name == "default:water_source" then + return true + end + return false +end + +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local water_nodes = 0 + local lava_nodes = 0 + local production_level = 0 + local eu_supply = 0 + + 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 + local check = check_node_around_mill(p) + if check then + water_nodes = water_nodes + 1 + end + end + + production_level = 25 * water_nodes + eu_supply = 30 * water_nodes + + if production_level > 0 then + meta:set_int("LV_EU_supply", eu_supply) + end + + meta:set_string("infotext", + S("Hydro %s Generator"):format("LV").." ("..production_level.."%)") + + if production_level > 0 and + minetest.get_node(pos).name == "technic:water_mill" then + technic.swap_node (pos, "technic:water_mill_active") + meta:set_int("LV_EU_supply", 0) + return + end + if production_level == 0 then + technic.swap_node(pos, "technic:water_mill") + 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", + "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}, + 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, 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_active", technic.producer) + diff --git a/technic/technic/machines/MV/alloy_furnace.lua b/technic/technic/machines/MV/alloy_furnace.lua new file mode 100644 index 0000000..a1918fd --- /dev/null +++ b/technic/technic/machines/MV/alloy_furnace.lua @@ -0,0 +1,14 @@ +-- MV alloy furnace + +minetest.register_craft({ + output = 'technic:mv_alloy_furnace', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_alloy_furnace', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'}, + } +}) + + +technic.register_alloy_furnace({tier = "MV", speed = 1.5, upgrade = 1, tube = 1, demand = {3000, 2000, 1000}}) + diff --git a/technic/technic/machines/MV/battery_box.lua b/technic/technic/machines/MV/battery_box.lua new file mode 100644 index 0000000..45437c1 --- /dev/null +++ b/technic/technic/machines/MV/battery_box.lua @@ -0,0 +1,22 @@ +-- MV Battery box + +minetest.register_craft({ + output = 'technic:mv_battery_box0', + recipe = { + {'technic:lv_battery_box0', 'technic:lv_battery_box0', 'technic:lv_battery_box0'}, + {'technic:lv_battery_box0', 'technic:mv_transformer', 'technic:lv_battery_box0'}, + {'', 'technic:mv_cable0', ''}, + } +}) + +technic.register_battery_box({ + tier = "MV", + max_charge = 200000, + charge_rate = 20000, + discharge_rate = 80000, + charge_step = 2000, + discharge_step = 8000, + upgrade = 1, + tube = 1, +}) + diff --git a/technic/technic/machines/MV/cables.lua b/technic/technic/machines/MV/cables.lua new file mode 100644 index 0000000..b1a34c8 --- /dev/null +++ b/technic/technic/machines/MV/cables.lua @@ -0,0 +1,14 @@ + +minetest.register_alias("mv_cable", "technic:mv_cable0") + +minetest.register_craft({ + output = 'technic:mv_cable0 3', + recipe ={ + {'technic:rubber', 'technic:rubber', 'technic:rubber'}, + {'technic:lv_cable0', 'technic:lv_cable0', 'technic:lv_cable0'}, + {'technic:rubber', 'technic:rubber', 'technic:rubber'}, + } +}) + +technic.register_cable("MV", 2.5/16) + diff --git a/technic/technic/machines/MV/centrifuge.lua b/technic/technic/machines/MV/centrifuge.lua new file mode 100644 index 0000000..5bf24bf --- /dev/null +++ b/technic/technic/machines/MV/centrifuge.lua @@ -0,0 +1,16 @@ +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_cable0", "pipeworks:mese_filter" }, + } +}) + +technic.register_centrifuge({ + tier = "MV", + demand = { 8000, 7000, 6000 }, + speed = 2, + upgrade = 1, + tube = 1, +}) diff --git a/technic/technic/machines/MV/compressor.lua b/technic/technic/machines/MV/compressor.lua new file mode 100644 index 0000000..5b36cc5 --- /dev/null +++ b/technic/technic/machines/MV/compressor.lua @@ -0,0 +1,12 @@ +-- MV compressor + +minetest.register_craft({ + output = 'technic:mv_compressor', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_compressor', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_compressor({tier = "MV", demand = {800, 600, 400}, speed = 2, upgrade = 1, tube = 1}) diff --git a/technic/technic/machines/MV/electric_furnace.lua b/technic/technic/machines/MV/electric_furnace.lua new file mode 100644 index 0000000..1f6b1c2 --- /dev/null +++ b/technic/technic/machines/MV/electric_furnace.lua @@ -0,0 +1,18 @@ +-- MV Electric Furnace +-- This is a faster version of the stone furnace which runs on EUs +-- In addition to this it can be upgraded with microcontrollers and batteries +-- This new version uses the batteries to lower the power consumption of the machine +-- Also in addition this furnace can be attached to the pipe system from the pipeworks mod. + +-- FIXME: kpoppel I'd like to introduce an induction heating element here also +minetest.register_craft({ + output = 'technic:mv_electric_furnace', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_electric_furnace', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_electric_furnace({tier="MV", upgrade=1, tube=1, demand={2000, 1000, 500}, speed=4}) + diff --git a/technic/technic/machines/MV/extractor.lua b/technic/technic/machines/MV/extractor.lua new file mode 100644 index 0000000..fdef5b2 --- /dev/null +++ b/technic/technic/machines/MV/extractor.lua @@ -0,0 +1,12 @@ +-- MV extractor + +minetest.register_craft({ + output = 'technic:mv_extractor', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_extractor', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_extractor({tier = "MV", demand = {800, 600, 400}, speed = 2, upgrade = 1, tube = 1}) diff --git a/technic/technic/machines/MV/generator.lua b/technic/technic/machines/MV/generator.lua new file mode 100644 index 0000000..4ae24b8 --- /dev/null +++ b/technic/technic/machines/MV/generator.lua @@ -0,0 +1,13 @@ +minetest.register_alias("generator_mv", "technic:generator_mv") + +minetest.register_craft({ + output = 'technic:mv_generator', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_generator', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_generator({tier="MV", tube=1, supply=600}) + diff --git a/technic/technic/machines/MV/grinder.lua b/technic/technic/machines/MV/grinder.lua new file mode 100644 index 0000000..dac536c --- /dev/null +++ b/technic/technic/machines/MV/grinder.lua @@ -0,0 +1,13 @@ +-- MV grinder + +minetest.register_craft({ + output = 'technic:mv_grinder', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_grinder', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_grinder({tier="MV", demand={600, 450, 300}, speed=2, upgrade=1, tube=1}) + diff --git a/technic/technic/machines/MV/init.lua b/technic/technic/machines/MV/init.lua new file mode 100644 index 0000000..72a98b6 --- /dev/null +++ b/technic/technic/machines/MV/init.lua @@ -0,0 +1,32 @@ + +technic.register_tier("MV", "Medium Voltage") + +local path = technic.modpath.."/machines/MV" + +-- Wiring stuff +dofile(path.."/cables.lua") +dofile(path.."/battery_box.lua") + +-- Generators +if technic.config:get_bool("enable_wind_mill") then + dofile(path.."/wind_mill.lua") +end +dofile(path.."/generator.lua") +dofile(path.."/solar_array.lua") + +-- Machines +dofile(path.."/alloy_furnace.lua") +dofile(path.."/electric_furnace.lua") +dofile(path.."/grinder.lua") +dofile(path.."/extractor.lua") +dofile(path.."/compressor.lua") +dofile(path.."/centrifuge.lua") + +dofile(path.."/tool_workshop.lua") + +-- The power radiator supplies appliances with inductive coupled power: +-- Lighting and associated textures is taken directly from VanessaE's homedecor and made electric. +-- This is currently useless, slow, and mostly copied +--dofile(path.."/power_radiator.lua") +--dofile(path.."/lighting.lua") + diff --git a/technic/technic/machines/MV/lighting.lua b/technic/technic/machines/MV/lighting.lua new file mode 100644 index 0000000..76fcb20 --- /dev/null +++ b/technic/technic/machines/MV/lighting.lua @@ -0,0 +1,590 @@ +-- NOTE: The code is takes directly from VanessaE's homedecor mod. +-- I just made it the lights into indictive appliances for this mod. + +-- This file supplies electric powered glowlights + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if (minetest.get_modpath("intllib")) then + dofile(minetest.get_modpath("intllib").."/intllib.lua") + S = intllib.Getter(minetest.get_current_modname()) +else + S = function (s) return s end +end + +function technic_homedecor_node_is_owned(pos, placer) + local ownername = false + if type(IsPlayerNodeOwner) == "function" then -- node_ownership mod + if HasOwner(pos, placer) then + if not IsPlayerNodeOwner(pos, placer:get_player_name()) then + if type(getLastOwner) == "function" then -- ...is an old version + ownername = getLastOwner(pos) + elseif type(GetNodeOwnerName) == "function" then -- ...is a recent version + ownername = GetNodeOwnerName(pos) + else + ownername = S("someone") + end + end + end + + elseif type(isprotect) == "function" then -- glomie's protection mod + if not isprotect(5, pos, placer) then + ownername = S("someone") + end + elseif type(protector) == "table" and type(protector.can_dig) == "function" then -- Zeg9's protection mod + if not protector.can_dig(5, pos, placer) then + ownername = S("someone") + end + end + + if ownername ~= false then + minetest.chat_send_player(placer:get_player_name(), S("Sorry, %s owns that spot."):format(ownername) ) + return true + else + return false + end +end + +local dirs1 = {20, 23, 22, 21} +local dirs2 = {9, 18, 7, 12} + +local technic_homedecor_rotate_and_place = function(itemstack, placer, pointed_thing) + if not technic_homedecor_node_is_owned(pointed_thing.under, placer) + and not technic_homedecor_node_is_owned(pointed_thing.above, placer) then + local node = minetest.get_node(pointed_thing.under) + if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].on_rightclick then + + local above = pointed_thing.above + local under = pointed_thing.under + local pitch = placer:get_look_pitch() + local pname = minetest.get_node(under).name + local node = minetest.get_node(above) + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + local wield_name = itemstack:get_name() + + if not minetest.registered_nodes[pname] + or not minetest.registered_nodes[pname].on_rightclick then + + local iswall = (above.x ~= under.x) or (above.z ~= under.z) + local isceiling = (above.x == under.x) and (above.z == under.z) and (pitch > 0) + local pos1 = above + + if minetest.registered_nodes[pname]["buildable_to"] then + pos1 = under + iswall = false + end + + if not minetest.registered_nodes[minetest.get_node(pos1).name]["buildable_to"] then return end + + if iswall then + minetest.add_node(pos1, {name = wield_name, param2 = dirs2[fdir+1] }) -- place wall variant + elseif isceiling then + minetest.add_node(pos1, {name = wield_name, param2 = 20 }) -- place upside down variant + else + minetest.add_node(pos1, {name = wield_name, param2 = 0 }) -- place right side up + end + + if not homedecor_expect_infinite_stacks then + itemstack:take_item() + return itemstack + end + end + else + minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) + end + end +end + +-- Yellow -- Half node +minetest.register_node('technic:homedecor_glowlight_half_yellow', { + description = S("Yellow Glowlight (thick)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thick)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_half_yellow_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_half_yellow_active', { + description = S("Yellow Glowlight (thick)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = LIGHT_MAX, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_half_yellow", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thick)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_half_yellow") + end +}) + +-- Yellow -- Quarter node +minetest.register_node('technic:homedecor_glowlight_quarter_yellow', { + description = S("Yellow Glowlight (thin)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thin)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_quarter_yellow_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_quarter_yellow_active', { + description = S("Yellow Glowlight (thin)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = LIGHT_MAX-1, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_quarter_yellow", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thin)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_quarter_yellow") + end +}) + + +-- White -- half node +minetest.register_node('technic:homedecor_glowlight_half_white', { + description = S("White Glowlight (thick)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "White Glowlight (thick)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_half_white_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_half_white_active', { + description = S("White Glowlight (thick)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = LIGHT_MAX, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_half_white", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "White Glowlight (thick)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_half_white") + end +}) + +-- White -- Quarter node +minetest.register_node('technic:homedecor_glowlight_quarter_white', { + description = S("White Glowlight (thin)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "White Glowlight (thin)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_quarter_white_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_quarter_white_active', { + description = S("White Glowlight (thin)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = LIGHT_MAX-1, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_quarter_white", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "White Glowlight (thin)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_quarter_white") + end +}) + +-- Glowlight "cubes" - yellow +minetest.register_node('technic:homedecor_glowlight_small_cube_yellow', { + description = S("Yellow Glowlight (small cube)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_cube_yellow_tb.png', + 'technic_homedecor_glowlight_cube_yellow_tb.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + node_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 50, "Yellow Glowlight (small cube)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 50, "technic:homedecor_glowlight_small_cube_yellow_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_small_cube_yellow_active', { + description = S("Yellow Glowlight (small cube)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_cube_yellow_tb.png', + 'technic_homedecor_glowlight_cube_yellow_tb.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + node_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = LIGHT_MAX-1, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_small_cube_yellow", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 50, "Yellow Glowlight (small cube)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_small_cube_yellow") + end +}) + +-- Glowlight "cubes" - white +minetest.register_node('technic:homedecor_glowlight_small_cube_white', { + description = S("White Glowlight (small cube)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_cube_white_tb.png', + 'technic_homedecor_glowlight_cube_white_tb.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + node_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 50, "White Glowlight (small cube)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 50, "technic:homedecor_glowlight_small_cube_white_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_small_cube_white_active', { + description = S("White Glowlight (small cube)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_cube_white_tb.png', + 'technic_homedecor_glowlight_cube_white_tb.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + node_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = LIGHT_MAX-1, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_small_cube_white", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 50, "White Glowlight (small cube)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_small_cube_white") + end +}) + +technic.register_inductive_machine("technic:homedecor_glowlight_half_yellow") +technic.register_inductive_machine("technic:homedecor_glowlight_half_white") +technic.register_inductive_machine("technic:homedecor_glowlight_quarter_yellow") +technic.register_inductive_machine("technic:homedecor_glowlight_quarter_white") +technic.register_inductive_machine("technic:homedecor_glowlight_small_cube_yellow") +technic.register_inductive_machine("technic:homedecor_glowlight_small_cube_white") diff --git a/technic/technic/machines/MV/power_radiator.lua b/technic/technic/machines/MV/power_radiator.lua new file mode 100644 index 0000000..560f8a9 --- /dev/null +++ b/technic/technic/machines/MV/power_radiator.lua @@ -0,0 +1,220 @@ +-- The power radiator fuctions like an inductive charger +-- only better in the game setting. +-- The purpose is to allow small appliances to receive power +-- without the overhead of the wiring needed for larger machines. +-- +-- The power radiator will consume power corresponding to the +-- sum(power rating of the attached appliances)/0.06 +-- Using inductive power transfer is very inefficient so this is +-- set to the factor 0.06. +-- +-- Punching the radiator will toggle the power state of all attached appliances. + +local power_radius = 12 + +------------------------------------------------------------------ +-- API for inductive powered nodes: +-- Use the functions below to set the corresponding callbacks +-- Also two nodes are needed: The inactive and the active one. The active must be called <name>_active . +------------------------------------------------------------------ +-- Register a new appliance using this function + +technic.inductive_nodes = {} +technic.register_inductive_machine = function(name) + table.insert(technic.inductive_nodes, name) + table.insert(technic.inductive_nodes, name.."_active") +end + +-- Appliances: +-- has_supply: pos of supply node if the appliance has a power radiator near with sufficient power for the demand else "" +-- EU_demand: The power demand of the device. +-- EU_charge: Actual use. set to EU_demand if active==1 +-- active: set to 1 if the device is on +technic.inductive_on_construct = function(pos, eu_demand, infotext) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", infotext) + meta:set_int("technic_inductive_power_machine", 1) + meta:set_int("EU_demand", eu_demand) -- The power demand of this appliance + meta:set_int("EU_charge", 0) -- The actual power draw of this appliance + meta:set_string("has_supply", "") -- Register whether we are powered or not. For use with several radiators. + meta:set_int("active", 0) -- If the appliance can be turned on and off by using it use this. +end + +technic.inductive_on_punch_off = function(pos, eu_charge, swapnode) + local meta = minetest.get_meta(pos) + if meta:get_string("has_supply") ~= "" then + technic.swap_node(pos, swapnode) + meta:set_int("active", 1) + meta:set_int("EU_charge",eu_charge) + --print("-----------") + --print("Turn on:") + --print("EU_charge: "..meta:get_int("EU_charge")) + --print("has_supply: "..meta:get_string("has_supply")) + --print("<----------->") + end +end + +technic.inductive_on_punch_on = function(pos, eu_charge, swapnode) + local meta = minetest.get_meta(pos) + technic.swap_node(pos, swapnode) + meta:set_int("active", 0) + meta:set_int("EU_charge",eu_charge) + --print("-----------") + --print("Turn off:") + --print("EU_charge: "..meta:get_int("EU_charge")) + --print("has_supply: "..meta:get_string("has_supply")) + --print("<---------->") +end + +local shutdown_inductive_appliances = function(pos) + -- The supply radius + local rad = power_radius + -- If the radiator is removed. turn off all appliances in region + -- If another radiator is near it will turn on the appliances again + local positions = minetest.find_nodes_in_area( + {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad}, + {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad}, + technic.inductive_nodes) + for _, pos1 in pairs(positions) do + local meta1 = minetest.get_meta(pos1) + -- If the appliance is belonging to this node + if meta1:get_string("has_supply") == pos.x..pos.y..pos.z then + local nodename = minetest.get_node(pos1).name + -- Swap the node and make sure it is off and unpowered + if string.sub(nodename, -7) == "_active" then + technic.swap_node(pos1, string.sub(nodename, 1, -8)) + meta1:set_int("active", 0) + meta1:set_int("EU_charge", 0) + end + meta1:set_string("has_supply", "") + end + end +end + +local toggle_on_off_inductive_appliances = function(pos, node, puncher) + if pos == nil then return end + -- The supply radius + local rad = power_radius + local positions = minetest.find_nodes_in_area( + {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad}, + {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad}, + technic.inductive_nodes) + for _, pos1 in pairs(positions) do + local meta1 = minetest.get_meta(pos1) + if meta1:get_string("has_supply") == pos.x..pos.y..pos.z then + minetest.punch_node(pos1) + end + end +end + +minetest.register_node("technic:power_radiator", { + description = "MV Power Radiator", + tiles = {"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}, + sounds = default.node_sound_wood_defaults(), + drawtype = "nodebox", + paramtype = "light", + is_ground_content = true, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("MV_EU_demand",1) -- Demand on the primary side when idle + meta:set_int("connected_EU_demand",0) -- Potential demand of connected appliances + meta:set_string("infotext", "MV Power Radiator") + end, + on_dig = function(pos, node, digger) + shutdown_inductive_appliances(pos) + return minetest.node_dig(pos, node, digger) + end, + on_punch = function(pos, node, puncher) + toggle_on_off_inductive_appliances(pos, node, puncher) + 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({ + nodenames = {"technic:power_radiator"}, + 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("MV_EU_input") + local eu_demand = meta:get_int("MV_EU_demand") + + -- Power off automatically if no longer connected to a switching station + technic.switching_station_timeout_count(pos, "MV") + + if eu_input == 0 then + -- No power + meta:set_string("infotext", "MV Power Radiator is unpowered"); + -- meta:set_int("active", 1) -- used for setting textures someday maybe + shutdown_inductive_appliances(pos) + meta:set_int("connected_EU_demand", 0) + meta:set_int("MV_EU_demand",1) + elseif eu_input == eu_demand then + -- Powered and ready + + -- The maximum EU sourcing a single radiator can provide. + local max_charge = 30000 -- == the max EU demand of the radiator + local connected_EU_demand = meta:get_int("connected_EU_demand") + + -- Efficiency factor + local eff_factor = 0.06 + -- The supply radius + local rad = power_radius + + local meta1 = nil + local pos1 = {} + local used_charge = 0 + + -- Index all nodes within supply range + local positions = minetest.find_nodes_in_area( + {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad}, + {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad}, + technic.inductive_nodes) + for _, pos1 in pairs(positions) do + local meta1 = minetest.get_meta(pos1) + -- If not supplied see if this node can handle it. + if meta1:get_string("has_supply") == "" then + -- if demand surpasses the capacity of this node, don't bother adding it. + local app_eu_demand = math.floor(meta1:get_int("EU_demand") / eff_factor) + if connected_EU_demand + app_eu_demand <= max_charge then + -- We can power the appliance. Register, and spend power if it is on. + connected_EU_demand = connected_EU_demand + app_eu_demand + + meta1:set_string("has_supply", pos.x..pos.y..pos.z) + --Always 0: used_charge = math.floor(used_charge + meta1:get_int("EU_charge") / eff_factor) + end + elseif meta1:get_string("has_supply") == pos.x..pos.y..pos.z then + -- The appliance has power from this node. Spend power if it is on. + used_charge = used_charge + math.floor(meta1:get_int("EU_charge") / eff_factor) + end + meta:set_string("infotext", "MV Power Radiator is powered (" + ..math.floor(used_charge / max_charge * 100) + .."% of maximum power)"); + if used_charge == 0 then + meta:set_int("MV_EU_demand", 1) -- Still idle + else + meta:set_int("MV_EU_demand", used_charge) + end + end + -- Save state + meta:set_int("connected_EU_demand", connected_EU_demand) + end + end, +}) + +technic.register_machine("MV", "technic:power_radiator", technic.receiver) + diff --git a/technic/technic/machines/MV/solar_array.lua b/technic/technic/machines/MV/solar_array.lua new file mode 100644 index 0000000..227d8ee --- /dev/null +++ b/technic/technic/machines/MV/solar_array.lua @@ -0,0 +1,14 @@ + +minetest.register_craft({ + output = 'technic:solar_array_mv 1', + recipe = { + {'technic:solar_array_lv', 'technic:solar_array_lv', 'technic:solar_array_lv'}, + {'technic:carbon_steel_ingot', 'technic:mv_transformer', 'technic:carbon_steel_ingot'}, + {'', 'technic:mv_cable0', ''}, + } +}) + +technic.register_solar_array({tier="MV", power=30}) + +-- compatibility alias for upgrading from old versions of technic +minetest.register_alias("technic:solar_panel_mv", "technic:solar_array_mv") diff --git a/technic/technic/machines/MV/tool_workshop.lua b/technic/technic/machines/MV/tool_workshop.lua new file mode 100644 index 0000000..318b1ec --- /dev/null +++ b/technic/technic/machines/MV/tool_workshop.lua @@ -0,0 +1,117 @@ +-- Tool workshop +-- This machine repairs tools. + +minetest.register_alias("tool_workshop", "technic:tool_workshop") + +local S = technic.getter + +minetest.register_craft({ + output = 'technic:tool_workshop', + recipe = { + {'group:wood', 'default:diamond', 'group:wood'}, + {'mesecons_pistons:piston_sticky_off', 'technic:machine_casing', 'technic:carbon_cloth'}, + {'default:obsidian', 'technic:mv_cable0', 'default:obsidian'}, + } +}) + +local workshop_demand = {5000, 3500, 2000} + +local workshop_formspec = + "invsize[8,9;]".. + "list[current_name;src;3,1;1,1;]".. + "label[0,0;"..S("%s Tool Workshop"):format("MV").."]".. + "list[current_name;upgrade1;1,3;1,1;]".. + "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) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local eu_input = meta:get_int("MV_EU_input") + local machine_name = S("%s Tool Workshop"):format("MV") + local machine_node = "technic:tool_workshop" + + -- Setup meta data if it does not exist. + if not eu_input then + meta:set_int("MV_EU_demand", workshop_demand[1]) + meta:set_int("MV_EU_input", 0) + return + end + + local EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta) + + local repairable = false + local srcstack = inv:get_stack("src", 1) + if not srcstack:is_empty() then + local itemdef = minetest.registered_items[srcstack:get_name()] + if itemdef and + (not itemdef.wear_represents or + itemdef.wear_represents == "mechanical_wear") and + srcstack:get_wear() ~= 0 then + repairable = true + 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 + meta:set_string("infotext", S("%s Idle"):format(machine_name)) + meta:set_int("MV_EU_demand", 0) + return + end + + if eu_input < workshop_demand[EU_upgrade+1] then + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + elseif eu_input >= workshop_demand[EU_upgrade+1] then + meta:set_string("infotext", S("%s Active"):format(machine_name)) + srcstack:add_wear(-1000) + inv:set_stack("src", 1, srcstack) + end + meta:set_int("MV_EU_demand", workshop_demand[EU_upgrade+1]) +end + +minetest.register_node("technic:tool_workshop", { + description = S("%s Tool Workshop"):format("MV"), + paramtype2 = "facedir", + 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, technic_machine=1, tubedevice=1, tubedevice_receiver=1}, + 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) + diff --git a/technic/technic/machines/MV/wind_mill.lua b/technic/technic/machines/MV/wind_mill.lua new file mode 100644 index 0000000..c553051 --- /dev/null +++ b/technic/technic/machines/MV/wind_mill.lua @@ -0,0 +1,87 @@ + +local S = technic.getter + +minetest.register_craft({ + output = 'technic:wind_mill_frame 5', + recipe = { + {'technic:carbon_steel_ingot', '', 'technic:carbon_steel_ingot'}, + {'', 'technic:carbon_steel_ingot', ''}, + {'technic:carbon_steel_ingot', '', 'technic:carbon_steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:wind_mill', + recipe = { + {'', 'technic:motor', ''}, + {'technic:carbon_steel_ingot', 'technic:carbon_steel_block', 'technic:carbon_steel_ingot'}, + {'', 'technic:mv_cable0', ''}, + } +}) + +minetest.register_node("technic:wind_mill_frame", { + description = S("Wind Mill Frame"), + drawtype = "glasslike_framed", + tiles = {"technic_carbon_steel_block.png", "default_glass.png"}, + sunlight_propagates = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + paramtype = "light", +}) + +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 + +local run = function(pos, node) + 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", S("@1 (@2 EU)", machine_name, technic.prettynum(power))) +end + +minetest.register_node("technic:wind_mill", { + description = S("Wind %s Generator"):format("MV"), + tiles = {"technic_carbon_steel_block.png"}, + paramtype2 = "facedir", + groups = {cracky=1, technic_machine=1}, + sounds = default.node_sound_stone_defaults(), + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Main box + {-0.1, -0.1, -0.5, 0.1, 0.1, -0.6}, -- Shaft + {-0.1, -1, -0.6, 0.1, 1, -0.7}, -- Vertical blades + {-1, -0.1, -0.6, 1, 0.1, -0.7}, -- Horizontal blades + } + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Wind %s Generator"):format("MV")) + meta:set_int("MV_EU_supply", 0) + end, + technic_run = run, +}) + +technic.register_machine("MV", "technic:wind_mill", technic.producer) + diff --git a/technic/technic/machines/init.lua b/technic/technic/machines/init.lua new file mode 100644 index 0000000..ad79eab --- /dev/null +++ b/technic/technic/machines/init.lua @@ -0,0 +1,14 @@ +local path = technic.modpath.."/machines" + +dofile(path.."/register/init.lua") + +-- Tiers +dofile(path.."/LV/init.lua") +dofile(path.."/MV/init.lua") +dofile(path.."/HV/init.lua") + +dofile(path.."/switching_station.lua") +dofile(path.."/supply_converter.lua") + +dofile(path.."/other/init.lua") + diff --git a/technic/technic/machines/other/anchor.lua b/technic/technic/machines/other/anchor.lua new file mode 100644 index 0000000..1c15bd2 --- /dev/null +++ b/technic/technic/machines/other/anchor.lua @@ -0,0 +1,109 @@ +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, +}) diff --git a/technic/technic/machines/other/coal_alloy_furnace.lua b/technic/technic/machines/other/coal_alloy_furnace.lua new file mode 100644 index 0000000..58af679 --- /dev/null +++ b/technic/technic/machines/other/coal_alloy_furnace.lua @@ -0,0 +1,177 @@ + +-- Fuel driven alloy furnace. This uses no EUs: + +local S = technic.getter + +minetest.register_craft({ + output = 'technic:coal_alloy_furnace', + recipe = { + {'default:brick', 'default:brick', 'default:brick'}, + {'default:brick', '', 'default:brick'}, + {'default:brick', 'default:brick', 'default:brick'}, + } +}) + +local machine_name = S("Fuel-Fired Alloy Furnace") +local formspec = + "size[8,9]".. + "label[0,0;"..machine_name.."]".. + "image[2,2;1,1;default_furnace_fire_bg.png]".. + "list[current_name;fuel;2,3;1,1;]".. + "list[current_name;src;2,1;2,1;]".. + "list[current_name;dst;5,1;2,2;]".. + "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", { + description = machine_name, + tiles = {"technic_coal_alloy_furnace_top.png", "technic_coal_alloy_furnace_bottom.png", + "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_side.png", + "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_front.png"}, + paramtype2 = "facedir", + groups = {cracky=2}, + legacy_facedir_simple = true, + sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec) + meta:set_string("infotext", machine_name) + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("src", 2) + 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, +}) + +minetest.register_node("technic:coal_alloy_furnace_active", { + description = machine_name, + tiles = {"technic_coal_alloy_furnace_top.png", "technic_coal_alloy_furnace_bottom.png", + "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_side.png", + "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_front_active.png"}, + paramtype2 = "facedir", + light_source = 8, + drop = "technic:coal_alloy_furnace", + groups = {cracky=2, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + sounds = default.node_sound_stone_defaults(), + can_dig = 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:coal_alloy_furnace", "technic:coal_alloy_furnace_active"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if inv:get_size("src") == 1 then -- Old furnace -> convert it + inv:set_size("src", 2) + inv:set_stack("src", 2, inv:get_stack("src2", 1)) + inv:set_size("src2", 0) + end + + local recipe = nil + + for i, name in pairs({ + "fuel_totaltime", + "fuel_time", + "src_totaltime", + "src_time"}) do + if not meta:get_float(name) then + meta:set_float(name, 0.0) + end + end + + -- Get what to cook if anything + local result = technic.get_recipe("alloy", inv:get_list("src")) + + local was_active = false + + if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then + was_active = true + meta:set_int("fuel_time", meta:get_int("fuel_time") + 1) + if result then + meta:set_int("src_time", meta:get_int("src_time") + 1) + if meta:get_int("src_time") >= result.time then + meta:set_int("src_time", 0) + local result_stack = ItemStack(result.output) + if inv:room_for_item("dst", result_stack) then + inv:set_list("src", result.new_input) + inv:add_item("dst", result_stack) + end + end + else + meta:set_int("src_time", 0) + end + end + + if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then + local percent = math.floor(meta:get_float("fuel_time") / + meta:get_float("fuel_totaltime") * 100) + meta:set_string("infotext", S("%s Active"):format(machine_name).." ("..percent.."%)") + technic.swap_node(pos, "technic:coal_alloy_furnace_active") + meta:set_string("formspec", + "size[8,9]".. + "label[0,0;"..machine_name.."]".. + "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100 - percent)..":default_furnace_fire_fg.png]".. + "list[current_name;fuel;2,3;1,1;]".. + "list[current_name;src;2,1;2,1;]".. + "list[current_name;dst;5,1;2,2;]".. + "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 + end + + local recipe = technic.get_recipe("alloy", inv:get_list("src")) + + if not recipe then + if was_active then + meta:set_string("infotext", S("%s is empty"):format(machine_name)) + technic.swap_node(pos, "technic:coal_alloy_furnace") + meta:set_string("formspec", formspec) + end + return + end + + -- Next take a hard look at the fuel situation + local fuel = nil + local afterfuel + local fuellist = inv:get_list("fuel") + + if fuellist then + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + end + + if fuel.time <= 0 then + meta:set_string("infotext", S("%s Out Of Fuel"):format(machine_name)) + technic.swap_node(pos, "technic:coal_alloy_furnace") + meta:set_string("formspec", formspec) + return + end + + meta:set_string("fuel_totaltime", fuel.time) + meta:set_string("fuel_time", 0) + + inv:set_stack("fuel", 1, afterfuel.items[1]) + end, +}) + diff --git a/technic/technic/machines/other/coal_furnace.lua b/technic/technic/machines/other/coal_furnace.lua new file mode 100644 index 0000000..53a0f8b --- /dev/null +++ b/technic/technic/machines/other/coal_furnace.lua @@ -0,0 +1,5 @@ +local S = technic.getter + +if minetest.registered_nodes["default:furnace"].description == "Furnace" then + minetest.override_item("default:furnace", { description = S("Fuel-Fired Furnace") }) +end diff --git a/technic/technic/machines/other/constructor.lua b/technic/technic/machines/other/constructor.lua new file mode 100644 index 0000000..3396ac7 --- /dev/null +++ b/technic/technic/machines/other/constructor.lua @@ -0,0 +1,189 @@ + +local S = technic.getter + +local function deploy_node(inv, slot_name, pos, node, machine_node) + 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(drops[i]) + end + else + minetest.remove_node(pos) + end + return + end + if not inv:is_empty(slot_name) then + local stack = inv:get_list(slot_name)[1] + local def = stack:get_definition() + if def.type == "node" then + minetest.set_node(pos, { + name = stack:get_name(), + param2 = machine_node.param2 + }) + stack:take_item() + inv:set_stack(slot_name, 1, stack) + elseif def.type == "craft" then + if def.on_place then + -- Use pcall to avoid nil placer errors. + -- TODO: Do without pcall. + local ok, stk = pcall(def.on_place, stack, nil, { + -- Fake pointed_thing + type = "node", + above = pos, + under = {x=pos.x, y=pos.y-1, z=pos.z}, + }) + if ok then + inv:set_stack(slot_name, 1, stk or stack) + return + end + end + minetest.item_place_object(stack, nil, { + -- Fake pointed_thing + type = "node", + above = pos, + under = pos, + }) + inv:set_stack(slot_name, 1, nil) + end + end +end + +minetest.register_craft({ + type = "shapeless", + output = 'technic:constructor_mk1_off 1', + recipe = {'technic:nodebreaker_off', 'technic:deployer_off'}, + +}) +minetest.register_craft({ + type = "shapeless", + output = 'technic:constructor_mk2_off 1', + recipe = {'technic:constructor_mk1_off', 'technic:constructor_mk1_off'}, + +}) + +minetest.register_craft({ + type = "shapeless", + output = 'technic:constructor_mk3_off 1', + recipe = {'technic:constructor_mk2_off', 'technic:constructor_mk2_off'}, + +}) + +local function make_on(mark, length) + return function(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local dir = vector.new() + if node.param2 == 3 then dir.x = 1 end + if node.param2 == 2 then dir.z = 1 end + if node.param2 == 1 then dir.x = -1 end + if node.param2 == 0 then dir.z = -1 end + + local place_pos = vector.new(pos) + + if node.name == "technic:constructor_mk"..mark.."_off" then + technic.swap_node(pos, "technic:constructor_mk"..mark.."_on") + nodeupdate(pos) + 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 + +local function make_off(mark) + return function(pos, node) + if node.name == "technic:constructor_mk"..mark.."_on" then + technic.swap_node(pos,"technic:constructor_mk"..mark.."_off") + nodeupdate(pos) + end + end +end + + +local function make_constructor(mark, length) + minetest.register_node("technic:constructor_mk"..mark.."_off", { + description = S("Constructor Mk%d"):format(mark), + tiles = {"technic_constructor_mk"..mark.."_top_off.png", + "technic_constructor_mk"..mark.."_bottom_off.png", + "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", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, mesecon = 2}, + mesecons = {effector = {action_on = make_on(mark, length)}}, + sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local formspec = "size[8,9;]".. + "label[0,0;"..S("Constructor Mk%d"):format(mark).."]".. + "list[current_player;main;0,5;8,4;]" + for i = 1, length do + formspec = formspec + .."label[5,"..(i - 1)..";"..S("Slot %d"):format(i).."]" + .."list[current_name;slot"..i + ..";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() + for i = 1, length do + inv:set_size("slot"..i, 1) + end + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for i = 1, length do + if not inv:is_empty("slot"..i) then + return false + end + 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_mk"..mark.."_on", { + tiles = {"technic_constructor_mk"..mark.."_top_on.png", + "technic_constructor_mk"..mark.."_bottom_on.png", + "technic_constructor_mk"..mark.."_side2_on.png", + "technic_constructor_mk"..mark.."_side1_on.png", + "technic_constructor_back.png", + "technic_constructor_front_on.png"}, + paramtype2 = "facedir", + drop = "technic:constructor_mk"..mark.."_off", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + mesecon=2, not_in_creative_inventory=1}, + mesecons= {effector = {action_off = make_off(mark)}}, + 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, + }) +end + +make_constructor(1, 1) +make_constructor(2, 2) +make_constructor(3, 4) + diff --git a/technic/technic/machines/other/frames.lua b/technic/technic/machines/other/frames.lua new file mode 100644 index 0000000..b3f39b9 --- /dev/null +++ b/technic/technic/machines/other/frames.lua @@ -0,0 +1,928 @@ + +local S = technic.getter + +frames = {} + +local infinite_stacks = minetest.setting_getbool("creative_mode") and minetest.get_modpath("unified_inventory") == nil + +local frames_pos = {} + +-- Helpers + +local function get_face(pos,ppos,pvect) + -- 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} + if pvect.x>0 then + local t=(-0.5-ppos.x)/pvect.x + local y_int=ppos.y+t*pvect.y + 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 + elseif pvect.x<0 then + local t=(0.5-ppos.x)/pvect.x + local y_int=ppos.y+t*pvect.y + 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 + end + if pvect.y>0 then + local t=(-0.5-ppos.y)/pvect.y + local x_int=ppos.x+t*pvect.x + 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 + elseif pvect.y<0 then + local t=(0.5-ppos.y)/pvect.y + local x_int=ppos.x+t*pvect.x + 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 + end + if pvect.z>0 then + local t=(-0.5-ppos.z)/pvect.z + local x_int=ppos.x+t*pvect.x + 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 + elseif pvect.z<0 then + local t=(0.5-ppos.z)/pvect.z + local x_int=ppos.x+t*pvect.x + 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 + end +end + +local function lines(str) + local t = {} + local function helper(line) table.insert(t, line) return "" end + helper((str:gsub("(.-)\r?\n", helper))) + return t +end + +local function pos_to_string(pos) + if pos.x == 0 then pos.x = 0 end -- Fix for signed 0 + if pos.y == 0 then pos.y = 0 end -- Fix for signed 0 + if pos.z == 0 then pos.z = 0 end -- Fix for signed 0 + return tostring(pos.x).."\n"..tostring(pos.y).."\n"..tostring(pos.z) +end + +local function pos_from_string(str) + local l = lines(str) + return {x = tonumber(l[1]), y = tonumber(l[2]), z = tonumber(l[3])} +end + +local function pos_in_list(l,pos) + 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 + end + return false +end + +local function table_empty(table) + for _, __ in pairs(table) do + return false + end + return true +end + +local function add_table(table,toadd) + local i = 1 + while true do + o = table[i] + if o == toadd then return end + if o == nil then break end + i = i+1 + end + table[i] = toadd +end + +local function move_nodes_vect(poslist,vect,must_not_move,owner) + if minetest.is_protected then + for _,pos in ipairs(poslist) do + local npos=vector.add(pos,vect) + if minetest.is_protected(pos, owner) or minetest.is_protected(npos, owner) then + return + end + end + end + for _,pos in ipairs(poslist) do + local npos=vector.add(pos,vect) + 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 + return + 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 + local nodelist = {} + for _, pos in ipairs(poslist) do + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos):to_table() + nodelist[#(nodelist)+1] = {oldpos = pos, pos = vector.add(pos, vect), node = node, meta = meta} + end + local objects = {} + for _, pos in ipairs(poslist) do + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + local entity = object:get_luaentity() + if not entity or not mesecon.is_mvps_unmov(entity.name) then + add_table(objects, object) + end + end + end + for _, obj in ipairs(objects) do + obj:setpos(vector.add(obj:getpos(), vect)) + end + for _,n in ipairs(nodelist) do + local npos = n.pos + minetest.set_node(npos, n.node) + local meta = minetest.get_meta(npos) + meta:from_table(n.meta) + for __,pos in ipairs(poslist) do + if npos.x == pos.x and npos.y == pos.y and npos.z == pos.z then + table.remove(poslist, __) + break + end + end + end + for __, pos in ipairs(poslist) do + minetest.remove_node(pos) + end + for _, callback in ipairs(mesecon.on_mvps_move) do + callback(nodelist) + end +end + +local function is_supported_node(name) + return ((string.find(name, "tube") ~= nil) and (string.find(name, "pipeworks") ~= nil)) +end + + +-- Frames +for xm=0,1 do +for xp=0,1 do +for ym=0,1 do +for yp=0,1 do +for zm=0,1 do +for zp=0,1 do + +local a=8/16 +local b=7/16 +local nodeboxes= { + { -a, -a, -a, -b, a, -b }, + { -a, -a, b, -b, a, a }, + { b, -a, b, a, a, a }, + { b, -a, -a, a, a, -b }, + + { -b, b, -a, b, a, -b }, + { -b, -a, -a, b, -b, -b }, + + { -b, b, b, b, a, a }, + { -b, -a, b, b, -b, a }, + + { b, b, -b, a, a, b }, + { b, -a, -b, a, -b, b }, + + { -a, b, -b, -b, a, b }, + { -a, -a, -b, -b, -b, b }, + } + + if yp==0 then + table.insert(nodeboxes, {-b,b,-b, b,a,b}) + end + if ym==0 then + table.insert(nodeboxes, {-b,-a,-b, b,-b,b}) + end + if xp==0 then + table.insert(nodeboxes, {b,b,b,a,-b,-b}) + end + if xm==0 then + table.insert(nodeboxes, {-a,-b,-b,-b,b,b}) + end + if zp==0 then + table.insert(nodeboxes, {-b,-b,b, b,b,a}) + end + if zm==0 then + table.insert(nodeboxes, {-b,-b,-a, b,b,-b}) + end + + 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} + if nameext~="111111" then groups.not_in_creative_inventory=1 end + + + minetest.register_node("technic:frame_"..nameext,{ + description = S("Frame"), + tiles = {"technic_frame.png"}, + groups=groups, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed=nodeboxes, + }, + selection_box = { + type="fixed", + fixed={-0.5,-0.5,-0.5,0.5,0.5,0.5} + }, + paramtype = "light", + frame=1, + drop="technic:frame_111111", + sunlight_propagates = true, + frame_connect_all=function(nodename) + 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}} + for i,dir in ipairs(l1) do + if string.sub(nodename,-7+i,-7+i)=="1" then + l2[#(l2)+1]=dir + end + end + return l2 + end, + on_punch=function(pos,node,puncher) + local ppos=puncher:getpos() + local pvect=puncher:get_look_dir() + local pface=get_face(pos,ppos,pvect) + if pface==nil then return end + local nodename=node.name + local newstate=tostring(1-tonumber(string.sub(nodename,-7+pface,-7+pface))) + if pface<=5 then + nodename=string.sub(nodename,1,-7+pface-1)..newstate..string.sub(nodename,-7+pface+1) + else + nodename=string.sub(nodename,1,-2)..newstate + end + node.name=nodename + minetest.set_node(pos,node) + end, + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + if minetest.is_protected(pos, placer:get_player_name()) then + minetest.log("action", placer:get_player_name() + .. " tried to place " .. itemstack:get_name() + .. " at protected position " + .. minetest.pos_to_string(pos)) + minetest.record_protection_violation(pos, placer:get_player_name()) + return itemstack + end + if pos == nil then return end + local node = minetest.get_node(pos) + if node.name ~= "air" then + if is_supported_node(node.name) then + obj = minetest.add_entity(pos, "technic:frame_entity") + obj:get_luaentity():set_node({name=itemstack:get_name()}) + end + else + minetest.set_node(pos, {name = itemstack:get_name()}) + end + if not infinite_stacks then + itemstack:take_item() + end + return itemstack + end, + on_rightclick = function(pos, node, placer, itemstack, pointed_thing) + if is_supported_node(itemstack:get_name()) then + if minetest.is_protected(pos, placer:get_player_name()) then + minetest.log("action", placer:get_player_name() + .. " tried to place " .. itemstack:get_name() + .. " at protected position " + .. minetest.pos_to_string(pos)) + minetest.record_protection_violation(pos, placer:get_player_name()) + return itemstack + end + + minetest.set_node(pos, {name = itemstack:get_name()}) + + local take_item = true + local def = minetest.registered_items[itemstack:get_name()] + -- Run callback + if def.after_place_node then + -- Copy place_to because callback can modify it + local pos_copy = {x=pos.x, y=pos.y, z=pos.z} + if def.after_place_node(pos_copy, placer, itemstack) then + take_item = false + end + end + + -- Run script hook + local _, callback + for _, callback in ipairs(minetest.registered_on_placenodes) do + -- Copy pos and node because callback can modify them + local pos_copy = {x=pos.x, y=pos.y, z=pos.z} + local newnode_copy = {name=def.name, param1=0, param2=0} + local oldnode_copy = {name="air", param1=0, param2=0} + if callback(pos_copy, newnode_copy, placer, oldnode_copy, itemstack) then + take_item = false + end + end + + if take_item then + itemstack:take_item() + end + + obj = minetest.add_entity(pos, "technic:frame_entity") + obj:get_luaentity():set_node({name=node.name}) + + return itemstack + else + --local pointed_thing = {type = "node", under = pos} + if pointed_thing then + minetest.item_place_node(itemstack, placer, pointed_thing) + end + end + end, + }) + +end +end +end +end +end +end + +minetest.register_entity("technic:frame_entity", { + initial_properties = { + physical = true, + collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, + visual = "wielditem", + textures = {}, + visual_size = {x=0.667, y=0.667}, + }, + + node = {}, + + set_node = function(self, node) + self.node = node + 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 + local stack = ItemStack(node.name) + local itemtable = stack:to_table() + local itemname = nil + if itemtable then + itemname = stack:to_table().name + end + local item_texture = nil + local item_type = "" + if minetest.registered_items[itemname] then + item_texture = minetest.registered_items[itemname].inventory_image + item_type = minetest.registered_items[itemname].type + end + prop = { + is_visible = true, + textures = {node.name}, + } + self.object:set_properties(prop) + end, + + get_staticdata = function(self) + return self.node.name + end, + + on_activate = function(self, staticdata) + self.object:set_armor_groups({immortal=1}) + self:set_node({name=staticdata}) + end, + + dig = function(self) + minetest.handle_node_drops(self.object:getpos(), {ItemStack("technic:frame_111111")}, self.last_puncher) + 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 + self.object:remove() + end, + + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir) + local pos = self.object:getpos() + if self.damage_object == nil then + self.damage_object = minetest.add_entity(pos, "technic:damage_entity") + self.damage_object:get_luaentity().remaining_time = 0.25 + self.damage_object:get_luaentity().frame_object = self + self.damage_object:get_luaentity().texture_index = 0 + self.damage_object:get_luaentity().texture_change_time = 0.15 + else + self.damage_object:get_luaentity().remaining_time = 0.25 + end + self.last_puncher = puncher + local ppos = puncher:getpos() + local pvect = puncher:get_look_dir() + local pface = get_face(pos,ppos,pvect) + if pface == nil then return end + local nodename = self.node.name + local newstate = tostring(1-tonumber(string.sub(nodename, -7+pface, -7+pface))) + if pface <= 5 then + nodename = string.sub(nodename, 1, -7+pface-1)..newstate..string.sub(nodename, -7+pface+1) + else + nodename = string.sub(nodename, 1, -2)..newstate + end + self.node.name = nodename + self:set_node(self.node) + end, + + on_rightclick = function(self, clicker) + local pos = self.object:getpos() + local ppos = clicker:getpos() + local pvect = clicker:get_look_dir() + 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)} + 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)] + pos_above[index] = pos_above[index] + 2*((pface+1)%2) - 1 + local pointed_thing = {type = "node", under = pos_under, above = pos_above} + local itemstack = clicker:get_wielded_item() + local itemdef = minetest.registered_items[itemstack:get_name()] + if itemdef ~= nil then + itemdef.on_place(itemstack, clicker, pointed_thing) + end + end, +}) + +local crack = "crack_anylength.png^[verticalframe:5:0" +minetest.register_entity("technic:damage_entity", { + initial_properties = { + visual = "cube", + visual_size = {x=1.01, y=1.01}, + textures = {crack, crack, crack, crack, crack, crack}, + collisionbox = {0, 0, 0, 0, 0, 0}, + physical = false, + }, + on_step = function(self, dtime) + if self.remaining_time == nil then + self.object:remove() + self.frame_object.damage_object = nil + end + self.remaining_time = self.remaining_time - dtime + if self.remaining_time < 0 then + self.object:remove() + self.frame_object.damage_object = nil + end + self.texture_change_time = self.texture_change_time - dtime + if self.texture_change_time < 0 then + self.texture_change_time = self.texture_change_time + 0.15 + self.texture_index = self.texture_index + 1 + if self.texture_index == 5 then + self.object:remove() + self.frame_object.damage_object = nil + self.frame_object:dig() + end + local ct = "crack_anylength.png^[verticalframe:5:"..self.texture_index + self.object:set_properties({textures = {ct, ct, ct, ct, ct, ct}}) + end + end, +}) + +mesecon.register_mvps_unmov("technic:frame_entity") +mesecon.register_mvps_unmov("technic:damage_entity") +mesecon.register_on_mvps_move(function(moved_nodes) + local to_move = {} + for _, n in ipairs(moved_nodes) do + 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)]} + frames_pos[pos_to_string(n.oldpos)] = nil + end + end + if #to_move > 0 then + for _, t in ipairs(to_move) do + frames_pos[pos_to_string(t.pos)] = t.name + local objects = minetest.get_objects_inside_radius(t.oldpos, 0.1) + for _, obj in ipairs(objects) do + local entity = obj:get_luaentity() + if entity and (entity.name == "technic:frame_entity" or entity.name == "technic:damage_entity") then + obj:setpos(t.pos) + end + end + end + end +end) + +minetest.register_on_dignode(function(pos, node) + if frames_pos[pos_to_string(pos)] ~= nil then + minetest.set_node(pos, {name = frames_pos[pos_to_string(pos)]}) + frames_pos[pos_to_string(pos)] = nil + local objects = minetest.get_objects_inside_radius(pos, 0.1) + for _, obj in ipairs(objects) do + local entity = obj:get_luaentity() + if entity and (entity.name == "technic:frame_entity" or entity.name == "technic:damage_entity") then + obj:remove() + end + end + end +end) + +-- Frame motor +local function connected(pos,c,adj) + for _,vect in ipairs(adj) do + local pos1=vector.add(pos,vect) + local nodename=minetest.get_node(pos1).name + if frames_pos[pos_to_string(pos1)] then + nodename = frames_pos[pos_to_string(pos1)] + end + 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(pos1,vect)) then + c[#(c)+1]=pos1 + if minetest.registered_nodes[nodename].frame==1 then + local adj=minetest.registered_nodes[nodename].frame_connect_all(nodename) + connected(pos1,c,adj) + end + end + end +end + +local function get_connected_nodes(pos) + c={pos} + local nodename=minetest.get_node(pos).name + if frames_pos[pos_to_string(pos)] then + nodename = frames_pos[pos_to_string(pos)] + end + connected(pos,c,minetest.registered_nodes[nodename].frame_connect_all(nodename)) + return c +end + +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 nnodepos = vector.add(pos, dirs[math.floor(node.param2/4)+1]) + local dir = minetest.facedir_to_dir(node.param2) + local nnode=minetest.get_node(nnodepos) + if frames_pos[pos_to_string(nnodepos)] then + nnode.name = frames_pos[pos_to_string(nnodepos)] + end + local meta = minetest.get_meta(pos) + if meta:get_int("last_moved") == minetest.get_gametime() then + return + end + local owner = meta:get_string("owner") + if minetest.registered_nodes[nnode.name].frame==1 then + local connected_nodes=get_connected_nodes(nnodepos) + move_nodes_vect(connected_nodes,dir,pos,owner) + end + minetest.get_meta(vector.add(pos, dir)):set_int("last_moved", minetest.get_gametime()) +end + +minetest.register_node("technic:frame_motor",{ + description = S("Frame Motor"), + tiles = {"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}, + paramtype2 = "facedir", + mesecons={effector={action_on=frame_motor_on}}, + after_place_node = function(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + end, + frames_can_connect=function(pos,dir) + 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] + return dir2.x~=-dir.x or dir2.y~=-dir.y or dir2.z~=-dir.z + end +}) + + + +-- Templates +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 pos1=vector.add(pos,vect) + local nodename=minetest.get_node(pos1).name + if not(pos_in_list(c,pos1)) and (nodename=="technic:template" or nodename == "technic:template_connector")then + local meta = minetest.get_meta(pos1) + if meta:get_string("connected") == "" then + c[#(c)+1]=pos1 + template_connected(pos1,c,connectors) + if nodename == "technic:template_connector" then + connectors[#connectors+1] = pos1 + end + end + end + end +end + +local function get_templates(pos) + local c = {pos} + local connectors + if minetest.get_node(pos).name == "technic:template_connector" then + connectors = {pos} + else + connectors = {} + end + template_connected(pos,c,connectors) + return c, connectors +end + +local function swap_template(pos, new) + local meta = minetest.get_meta(pos) + local saved_node = meta:get_string("saved_node") + meta:set_string("saved_node", "") + technic.swap_node(pos, new) + local meta = minetest.get_meta(pos) + meta:set_string("saved_node", saved_node) +end + +local function save_node(pos) + local node = minetest.get_node(pos) + if node.name == "air" then + minetest.set_node(pos, {name="technic:template"}) + return + end + if node.name == "technic:template" then + swap_template(pos, "technic:template_connector") + local meta = minetest.get_meta(pos) + meta:set_string("connected", "") + return + end + local meta = minetest.get_meta(pos) + local meta0 = meta:to_table() + for _, list in pairs(meta0.inventory) do + for key, stack in pairs(list) do + list[key] = stack:to_string() + end + end + node.meta = meta0 + minetest.set_node(pos, {name="technic:template"}) + return node +end + +local function restore_node(pos, node) + minetest.set_node(pos, node) + local meta = minetest.get_meta(pos) + for _, list in pairs(node.meta.inventory) do + for key, stack in pairs(list) do + list[key] = ItemStack(stack) + end + end + meta:from_table(node.meta) +end + +local function expand_template(pos) + local meta = minetest.get_meta(pos) + local c = meta:get_string("connected") + if c == "" then return end + c = minetest.deserialize(c) + for _, vect in ipairs(c) do + local pos1 = vector.add(pos, vect) + local saved_node = save_node(pos1) + local meta1 = minetest.get_meta(pos1) + if saved_node ~= nil then + meta1:set_string("saved_node", minetest.serialize(saved_node)) + else + --meta1:set_string("saved_node", "") + end + end +end + +local function compress_templates(pos) + local templates, connectors = get_templates(pos) + if #connectors == 0 then + connectors = {pos} + end + for _, cn in ipairs(connectors) do + local meta = minetest.get_meta(cn) + local c = {} + for _,p in ipairs(templates) do + local np = vector.subtract(p, cn) + if not pos_in_list(c,np) then + c[#c+1] = np + end + end + local cc = {} + for _,p in ipairs(connectors) do + local np = vector.subtract(p, cn) + if (np.x ~= 0 or np.y ~= 0 or np.z ~= 0) then + cc[pos_to_string(np)] = true + end + end + swap_template(cn, "technic:template") + meta:set_string("connected", minetest.serialize(c)) + meta:set_string("connectors_connected", minetest.serialize(cc)) + end + + for _,p in ipairs(templates) do + if not pos_in_list(connectors, p) then + minetest.set_node(p, {name = "air"}) + end + end +end + +local function template_drops(pos, node, oldmeta, digger) + local c = oldmeta.fields.connected + local cc = oldmeta.fields.connectors_connected + local drops + if c == "" or c == nil then + drops = {"technic:template 1"} + else + if cc == "" or cc == nil then + drops = {"technic:template 1"} + else + local dcc = minetest.deserialize(cc) + if not table_empty(dcc) then + drops = {} + for sp, _ in pairs(dcc) do + local ssp = pos_from_string(sp) + local p = vector.add(ssp, pos) + local meta = minetest.get_meta(p) + local d = minetest.deserialize(meta:get_string("connectors_connected")) + if d ~= nil then + d[pos_to_string({x=-ssp.x, y=-ssp.y, z=-ssp.z})] = nil + meta:set_string("connectors_connected", minetest.serialize(d)) + end + end + else + local stack_max = 99 + local num = #(minetest.deserialize(c)) + drops = {} + while num > stack_max do + drops[#drops+1] = "technic:template "..stack_max + num = num - stack_max + end + drops[#drops+1] = "technic:template "..num + end + end + end + minetest.handle_node_drops(pos, drops, digger) +end + +local function template_on_destruct(pos, node) + local meta = minetest.get_meta(pos) + local saved_node = meta:get_string("saved_node") + if saved_node ~= "" then + local nnode = minetest.deserialize(saved_node) + minetest.after(0, restore_node, pos, nnode) + end +end + +minetest.register_node("technic:template",{ + description = S("Template"), + tiles = {"technic_mv_cable.png"}, + drop = "", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + on_destruct = template_on_destruct, + after_dig_node = template_drops, + on_punch = function(pos,node,puncher) + swap_template(pos, "technic:template_disabled") + end +}) + +minetest.register_node("technic:template_disabled",{ + description = S("Template"), + tiles = {"technic_hv_cable.png"}, + drop = "", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1}, + on_destruct = template_on_destruct, + after_dig_node = template_drops, + on_punch = function(pos,node,puncher) + local meta = minetest.get_meta(pos) + swap_template(pos, "technic:template_connector") + end +}) + +minetest.register_node("technic:template_connector",{ + description = S("Template"), + tiles = {"technic_lv_cable.png"}, + drop = "", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1}, + on_destruct = template_on_destruct, + after_dig_node = template_drops, + on_punch = function(pos,node,puncher) + swap_template(pos, "technic:template") + end +}) + +minetest.register_craftitem("technic:template_replacer",{ + description = S("Template (replacing)"), + inventory_image = "technic_template_replacer.png", + on_place = function(itemstack, placer, pointed_thing) + local p = pointed_thing.under + if minetest.is_protected and minetest.is_protected(p, placer:get_player_name()) then + return nil + end + local node = minetest.get_node(p) + if node.name == "technic:template" then return end + local saved_node = save_node(p) + itemstack:take_item() + if saved_node ~= nil then + local meta = minetest.get_meta(p) + meta:set_string("saved_node", minetest.serialize(saved_node)) + end + return itemstack + end +}) + +minetest.register_tool("technic:template_tool",{ + description = S("Template Tool"), + inventory_image = "technic_template_tool.png", + on_use = function(itemstack, puncher, pointed_thing) + local pos = pointed_thing.under + if pos == nil or (minetest.is_protected and minetest.is_protected(pos, puncher:get_player_name())) then + return nil + end + local node = minetest.get_node(pos) + if node.name ~= "technic:template" and node.name ~= "technic:template_connector" then return end + local meta = minetest.get_meta(pos) + local c2 = meta:get_string("connected") + if c2 ~= "" then + expand_template(pos) + else + compress_templates(pos) + end + + end +}) + + + +-- Template motor +local function get_template_nodes(pos) + local meta = minetest.get_meta(pos) + local connected = meta:get_string("connected") + if connected == "" then return {} end + local adj = minetest.deserialize(connected) + local c = {} + for _,vect in ipairs(adj) do + local pos1=vector.add(pos,vect) + local nodename=minetest.get_node(pos1).name + if not(pos_in_list(c,pos1)) and nodename~="air" then + c[#(c)+1]=pos1 + end + end + return c +end + +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 nnodepos = vector.add(pos, dirs[math.floor(node.param2/4)+1]) + local dir = minetest.facedir_to_dir(node.param2) + local nnode=minetest.get_node(nnodepos) + local meta = minetest.get_meta(pos) + if meta:get_int("last_moved") == minetest.get_gametime() then + return + end + local owner = meta:get_string("owner") + if nnode.name == "technic:template" then + local connected_nodes=get_template_nodes(nnodepos) + move_nodes_vect(connected_nodes,dir,pos,owner) + end + minetest.get_meta(vector.add(pos, dir)):set_int("last_moved", minetest.get_gametime()) +end + +minetest.register_node("technic:template_motor",{ + description = S("Template Motor"), + tiles = {"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}, + paramtype2 = "facedir", + mesecons={effector={action_on=template_motor_on}}, + after_place_node = function(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + end, +}) + +-- Crafts +minetest.register_craft({ + output = 'technic:frame_111111', + recipe = { + {'', 'default:stick', ''}, + {'default:stick', 'technic:brass_ingot', 'default:stick'}, + {'', 'default:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'technic:frame_motor', + recipe = { + {'', 'technic:frame_111111', ''}, + {'group:mesecon_conductor_craftable', 'technic:motor', 'group:mesecon_conductor_craftable'}, + {'', 'technic:frame_111111', ''}, + } +}) + +minetest.register_craft({ + output = 'technic:template 10', + recipe = { + {'', 'technic:brass_ingot', ''}, + {'technic:brass_ingot', 'default:mese_crystal', 'technic:brass_ingot'}, + {'', 'technic:brass_ingot', ''}, + } +}) + +minetest.register_craft({ + output = 'technic:template_replacer', + recipe = {{'technic:template'}} +}) + +minetest.register_craft({ + output = 'technic:template', + recipe = {{'technic:template_replacer'}} +}) + +minetest.register_craft({ + output = 'technic:template_motor', + recipe = { + {'', 'technic:template', ''}, + {'group:mesecon_conductor_craftable', 'technic:motor', 'group:mesecon_conductor_craftable'}, + {'', 'technic:template', ''}, + } +}) + +minetest.register_craft({ + output = 'technic:template_tool', + recipe = { + {'', 'technic:template', ''}, + {'default:mese_crystal', 'default:stick', 'default:mese_crystal'}, + {'', 'default:stick', ''}, + } +}) diff --git a/technic/technic/machines/other/init.lua b/technic/technic/machines/other/init.lua new file mode 100644 index 0000000..f4a82f0 --- /dev/null +++ b/technic/technic/machines/other/init.lua @@ -0,0 +1,15 @@ +local path = technic.modpath.."/machines/other" + +-- mesecons and tubes related +dofile(path.."/injector.lua") +dofile(path.."/constructor.lua") + +if technic.config:get_bool("enable_frames") and minetest.get_modpath("mesecons_mvps") ~= nil then + dofile(path.."/frames.lua") +end + +-- Coal-powered machines +dofile(path.."/coal_alloy_furnace.lua") +dofile(path.."/coal_furnace.lua") + +dofile(path.."/anchor.lua") diff --git a/technic/technic/machines/other/injector.lua b/technic/technic/machines/other/injector.lua new file mode 100644 index 0000000..ec8966c --- /dev/null +++ b/technic/technic/machines/other/injector.lua @@ -0,0 +1,118 @@ + +local S = technic.getter + +local function inject_items (pos) + local meta=minetest.get_meta(pos) + local inv = meta:get_inventory() + local mode=meta:get_string("mode") + if mode=="single items" then + local i=0 + for _,stack in ipairs(inv:get_list("main")) do + i=i+1 + if stack then + local item0=stack:to_table() + if item0 then + item0["count"] = "1" + technic.tube_inject_item(pos, pos, vector.new(0, -1, 0), item0) + stack:take_item(1) + inv:set_stack("main", i, stack) + return + end + end + end + end + if mode=="whole stacks" then + local i=0 + for _,stack in ipairs(inv:get_list("main")) do + i=i+1 + if stack then + local item0=stack:to_table() + if item0 then + technic.tube_inject_item(pos, pos, vector.new(0, -1, 0), item0) + stack:clear() + inv:set_stack("main", i, stack) + return + end + end + end + end + +end + +minetest.register_craft({ + output = 'technic:injector 1', + recipe = { + {'', 'technic:control_logic_unit',''}, + {'', 'default:chest',''}, + {'', 'pipeworks:tube_1',''}, + } +}) + +local function set_injector_formspec(meta) + local is_stack = meta:get_string("mode") == "whole stacks" + meta:set_string("formspec", + "invsize[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[]") +end + +minetest.register_node("technic:injector", { + description = S("Self-Contained Injector"), + tiles = {"technic_injector_top.png", "technic_injector_bottom.png", "technic_injector_side.png", + "technic_injector_side.png", "technic_injector_side.png", "technic_injector_side.png"}, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, tubedevice=1, tubedevice_receiver=1}, + tube = { + can_insert = function(pos, node, stack, direction) + return minetest.get_meta(pos):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, front=1, back=1, top=1, bottom=1}, + }, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Self-Contained Injector")) + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + meta:set_string("mode","single items") + set_injector_formspec(meta) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + on_receive_fields = function(pos, formanme, fields, sender) + local meta = minetest.get_meta(pos) + if fields.mode_item then meta:set_string("mode", "single items") end + if fields.mode_stack then meta:set_string("mode", "whole stacks") end + set_injector_formspec(meta) + 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, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig +}) + +minetest.register_abm({ + nodenames = {"technic:injector"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local pos1 = vector.add(pos, vector.new(0, -1, 0)) + local node1 = minetest.get_node(pos1) + if minetest.get_item_group(node1.name, "tubedevice") > 0 then + inject_items(pos) + end + end, +}) + diff --git a/technic/technic/machines/register/alloy_furnace.lua b/technic/technic/machines/register/alloy_furnace.lua new file mode 100644 index 0000000..879e528 --- /dev/null +++ b/technic/technic/machines/register/alloy_furnace.lua @@ -0,0 +1,10 @@ + +local S = technic.getter + +function technic.register_alloy_furnace(data) + data.typename = "alloy" + data.machine_name = "alloy_furnace" + data.machine_desc = S("%s Alloy Furnace") + technic.register_base_machine(data) +end + diff --git a/technic/technic/machines/register/alloy_recipes.lua b/technic/technic/machines/register/alloy_recipes.lua new file mode 100644 index 0000000..bd09bd6 --- /dev/null +++ b/technic/technic/machines/register/alloy_recipes.lua @@ -0,0 +1,35 @@ + +local S = technic.getter + +technic.register_recipe_type("alloy", { + description = S("Alloying"), + input_size = 2, +}) + +function technic.register_alloy_recipe(data) + data.time = data.time or 6 + technic.register_recipe("alloy", data) +end + +local recipes = { + {"technic:copper_dust 3", "technic:tin_dust", "technic:bronze_dust 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_ingot", "technic:coal_dust", "technic:carbon_steel_ingot", 3}, + {"technic:carbon_steel_dust", "technic:coal_dust", "technic:cast_iron_dust", 3}, + {"technic:carbon_steel_ingot", "technic:coal_dust", "technic:cast_iron_ingot", 3}, + {"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:copper_dust 2", "technic:zinc_dust", "technic:brass_dust 3"}, + {"default:copper_ingot 2", "technic:zinc_ingot", "technic:brass_ingot 3"}, + {"default:sand 2", "technic:coal_dust 2", "technic: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 + technic.register_alloy_recipe({input = {data[1], data[2]}, output = data[3], time = data[4]}) +end diff --git a/technic/technic/machines/register/battery_box.lua b/technic/technic/machines/register/battery_box.lua new file mode 100644 index 0000000..82edca0 --- /dev/null +++ b/technic/technic/machines/register/battery_box.lua @@ -0,0 +1,291 @@ + +local S = technic.getter + +technic.register_power_tool("technic:battery", 10000) +technic.register_power_tool("technic:red_energy_crystal", 50000) +technic.register_power_tool("technic:green_energy_crystal", 150000) +technic.register_power_tool("technic:blue_energy_crystal", 450000) + +minetest.register_craft({ + output = 'technic:battery', + recipe = { + {'group:wood', 'default:copper_ingot', 'group:wood'}, + {'group:wood', 'moreores:tin_ingot', 'group:wood'}, + {'group:wood', 'default:copper_ingot', 'group:wood'}, + } +}) + +minetest.register_tool("technic:battery", { + description = S("RE Battery"), + inventory_image = "technic_battery.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + tool_capabilities = { + charge = 0, + max_drop_level = 0, + groupcaps = { + fleshy = {times={}, uses=10000, maxlevel=0} + } + } +}) + +local tube = { + insert_object = function(pos, node, stack, direction) + if direction.y == 0 then + return stack + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y > 0 then + return inv:add_item("src", stack) + else + return inv:add_item("dst", stack) + end + end, + can_insert = function(pos, node, stack, direction) + if direction.y == 0 then + return false + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y > 0 then + return inv:room_for_item("src", stack) + else + return inv:room_for_item("dst", stack) + end + end, + connect_sides = {left=1, right=1, back=1, top=1, bottom=1}, +} + +function technic.register_battery_box(data) + local tier = data.tier + local ltier = string.lower(tier) + + local formspec = + "invsize[8,9;]".. + "image[1,1;1,2;technic_power_meter_bg.png]".. + "list[current_name;src;3,1;1,1;]".. + "image[4,1;1,1;technic_battery_reload.png]".. + "list[current_name;dst;5,1;1,1;]".. + "label[0,0;"..S("%s Battery Box"):format(tier).."]".. + "label[3,0;"..S("Charge").."]".. + "label[5,0;"..S("Discharge").."]".. + "label[1,3;"..S("Power level").."]".. + "list[current_player;main;0,5;8,4;]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]" + + if data.upgrade then + formspec = formspec.. + "list[current_name;upgrade1;3.5,3;1,1;]".. + "list[current_name;upgrade2;4.5,3;1,1;]".. + "label[3.5,4;"..S("Upgrade Slots").."]".. + "listring[current_name;upgrade1]".. + "listring[current_player;main]".. + "listring[current_name;upgrade2]".. + "listring[current_player;main]" + end + + local run = function(pos, node) + local meta = minetest.get_meta(pos) + local eu_input = meta:get_int(tier.."_EU_input") + local current_charge = meta:get_int("internal_EU_charge") + + 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) + + -- Charge/discharge the battery with the input EUs + if eu_input >= 0 then + current_charge = math.min(current_charge + eu_input, max_charge) + else + current_charge = math.max(current_charge + eu_input, 0) + end + + -- Charging/discharging tools here + local tool_full, tool_empty + current_charge, tool_full = technic.charge_tools(meta, + current_charge, data.charge_step) + current_charge, tool_empty = technic.discharge_tools(meta, + current_charge, data.discharge_step, + max_charge) + + if data.tube then + local inv = meta:get_inventory() + technic.handle_machine_pipeworks(pos, tube_upgrade, + function(pos, x_velocity, z_velocity) + if tool_full and not inv:is_empty("src") then + technic.send_items(pos, x_velocity, z_velocity, "src") + elseif tool_empty and not inv:is_empty("dst") then + technic.send_items(pos, x_velocity, z_velocity, "dst") + end + end) + end + + -- We allow batteries to charge on less than the demand + meta:set_int(tier.."_EU_demand", + math.min(data.charge_rate, max_charge - current_charge)) + meta:set_int(tier.."_EU_supply", + math.min(data.discharge_rate, current_charge)) + meta:set_int("internal_EU_charge", current_charge) + + -- Select node textures + local charge_count = math.ceil((current_charge / max_charge) * 8) + charge_count = math.min(charge_count, 8) + charge_count = math.max(charge_count, 0) + local last_count = meta:get_float("last_side_shown") + if charge_count ~= last_count then + technic.swap_node(pos,"technic:"..ltier.."_battery_box"..charge_count) + meta:set_float("last_side_shown", charge_count) + end + + local charge_percent = math.floor(current_charge / max_charge * 100) + meta:set_string("formspec", + formspec.. + "image[1,1;1,2;technic_power_meter_bg.png" + .."^[lowpart:"..charge_percent + ..":technic_power_meter_fg.png]") + + local infotext = S("@1 Battery Box: @2/@3", tier, + technic.prettynum(current_charge), technic.prettynum(max_charge)) + if eu_input == 0 then + infotext = S("%s Idle"):format(infotext) + end + meta:set_string("infotext", infotext) + end + + for i = 0, 8 do + local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1} + 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 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) + 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, + after_place_node = data.tube and pipeworks.after_place, + after_dig_node = technic.machine_after_dig_node + }) + end + + -- Register as a battery type + -- Battery type machines function as power reservoirs and can both receive and give back power + for i = 0, 8 do + technic.register_machine(tier, "technic:"..ltier.."_battery_box"..i, technic.battery) + end + +end -- End registration + + +function technic.charge_tools(meta, batt_charge, charge_step) + local inv = meta:get_inventory() + if inv:is_empty("src") then + return batt_charge, false + end + local src_stack = inv:get_stack("src", 1) + + local tool_name = src_stack:get_name() + if not technic.power_tools[tool_name] then + return batt_charge, false + end + -- Set meta data for the tool if it didn't do it itself + local src_meta = minetest.deserialize(src_stack:get_metadata()) or {} + if not src_meta.charge then + src_meta.charge = 0 + end + -- Do the charging + local item_max_charge = technic.power_tools[tool_name] + local tool_charge = src_meta.charge + if tool_charge >= item_max_charge then + return batt_charge, true + elseif batt_charge <= 0 then + return batt_charge, false + end + charge_step = math.min(charge_step, batt_charge) + charge_step = math.min(charge_step, item_max_charge - tool_charge) + tool_charge = tool_charge + charge_step + batt_charge = batt_charge - charge_step + technic.set_RE_wear(src_stack, tool_charge, item_max_charge) + src_meta.charge = tool_charge + src_stack:set_metadata(minetest.serialize(src_meta)) + inv:set_stack("src", 1, src_stack) + return batt_charge, (tool_charge == item_max_charge) +end + + +function technic.discharge_tools(meta, batt_charge, charge_step, max_charge) + local inv = meta:get_inventory() + if inv:is_empty("dst") then + return batt_charge, false + end + srcstack = inv:get_stack("dst", 1) + local toolname = srcstack:get_name() + if technic.power_tools[toolname] == nil then + return batt_charge, false + end + -- Set meta data for the tool if it didn't do it itself :-( + local src_meta = minetest.deserialize(srcstack:get_metadata()) + src_meta = src_meta or {} + if not src_meta.charge then + src_meta.charge = 0 + end + + -- Do the discharging + local item_max_charge = technic.power_tools[toolname] + local tool_charge = src_meta.charge + if tool_charge <= 0 then + return batt_charge, true + elseif batt_charge >= max_charge then + return batt_charge, false + end + charge_step = math.min(charge_step, max_charge - batt_charge) + charge_step = math.min(charge_step, tool_charge) + tool_charge = tool_charge - charge_step + batt_charge = batt_charge + charge_step + technic.set_RE_wear(srcstack, tool_charge, item_max_charge) + src_meta.charge = tool_charge + srcstack:set_metadata(minetest.serialize(src_meta)) + inv:set_stack("dst", 1, srcstack) + return batt_charge, (tool_charge == 0) +end + diff --git a/technic/technic/machines/register/cables.lua b/technic/technic/machines/register/cables.lua new file mode 100644 index 0000000..a1e7bc8 --- /dev/null +++ b/technic/technic/machines/register/cables.lua @@ -0,0 +1,177 @@ + +local S = technic.getter + +local cable_itstr_to_tier = {} + +function technic.register_cable(tier, size) + local ltier = string.lower(tier) + + for x1 = 0, 1 do + 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}) + + cable_itstr_to_tier["technic:"..ltier.."_cable"..id] = tier + + 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), + tiles = {"technic_"..ltier.."_cable.png"}, + inventory_image = "technic_"..ltier.."_cable_wield.png", + wield_image = "technic_"..ltier.."_cable_wield.png", + groups = groups, + sounds = default.node_sound_wood_defaults(), + drop = "technic:"..ltier.."_cable0", + paramtype = "light", + sunlight_propagates = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = technic.gen_cable_nodebox(x1, y1, z1, x2, y2, z2, size) + }, + on_construct = function() + technic.networks = {} + end, + on_destruct = function() + technic.networks = {} + end, + after_place_node = function(pos) + local node = minetest.get_node(pos) + technic.update_cables(pos, technic.get_cable_tier(node.name)) + end, + after_dig_node = function(pos, oldnode) + local tier = technic.get_cable_tier(oldnode.name) + technic.update_cables(pos, tier, true) + end + }) + end + end + end + end + end + end +end + +minetest.register_on_placenode(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) + + +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 + + +function technic.is_tier_cable(name, tier) + return cable_itstr_to_tier[name] and cable_itstr_to_tier[name] == tier +end + + +function technic.get_cable_tier(name) + return cable_itstr_to_tier[name] +end + + +function technic.cables_should_connect(pos1, pos2, tier) + local name = minetest.get_node(pos2).name + + if name == "technic:switching_station" then + return pos2.y == pos1.y + 1 and "machine" or false + elseif name == "technic:supply_converter" then + return math.abs(pos2.y - pos1.y) == 1 and "machine" or false + elseif 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 + diff --git a/technic/technic/machines/register/centrifuge.lua b/technic/technic/machines/register/centrifuge.lua new file mode 100644 index 0000000..dd05977 --- /dev/null +++ b/technic/technic/machines/register/centrifuge.lua @@ -0,0 +1,8 @@ +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 diff --git a/technic/technic/machines/register/centrifuge_recipes.lua b/technic/technic/machines/register/centrifuge_recipes.lua new file mode 100644 index 0000000..05642f5 --- /dev/null +++ b/technic/technic/machines/register/centrifuge_recipes.lua @@ -0,0 +1,38 @@ +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" }, +} + +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] } }) +end diff --git a/technic/technic/machines/register/common.lua b/technic/technic/machines/register/common.lua new file mode 100644 index 0000000..ce0eee6 --- /dev/null +++ b/technic/technic/machines/register/common.lua @@ -0,0 +1,214 @@ + +local S = technic.getter + +-- handles the machine upgrades every tick +function technic.handle_machine_upgrades(meta) + -- Get the names of the upgrades + local inv = meta:get_inventory() + + local srcstack = inv:get_stack("upgrade1", 1) + local upg_item1 = srcstack and srcstack:get_name() + + srcstack = inv:get_stack("upgrade2", 1) + local upg_item2 = srcstack and srcstack:get_name() + + -- Save some power by installing battery upgrades. + -- Tube loading speed can be upgraded using control logic units. + local EU_upgrade = 0 + local tube_upgrade = 0 + + if upg_item1 == "technic:control_logic_unit" then + tube_upgrade = tube_upgrade + 1 + elseif upg_item1 == "technic:battery" then + EU_upgrade = EU_upgrade + 1 + end + + if upg_item2 == "technic:control_logic_unit" then + tube_upgrade = tube_upgrade + 1 + elseif upg_item2 == "technic:battery" then + EU_upgrade = EU_upgrade + 1 + end + + return EU_upgrade, tube_upgrade +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) + -- Send items on their way in the pipe system. + if output_name == nil then + output_name = "dst" + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local i = 0 + for _, stack in ipairs(inv:get_list(output_name)) do + i = i + 1 + if stack then + local item0 = stack:to_table() + if item0 then + item0["count"] = "1" + technic.tube_inject_item(pos, pos, vector.new(x_velocity, 0, z_velocity), item0) + stack:take_item(1) + inv:set_stack(output_name, i, stack) + return + end + end + end +end + + +function technic.smelt_item(meta, result, speed) + local inv = meta:get_inventory() + meta:set_int("cook_time", meta:get_int("cook_time") + 1) + if meta:get_int("cook_time") < result.time / speed then + return + end + local result + local afterfuel + result, afterfuel = minetest.get_craft_result({method = "cooking", width = 1, items = inv:get_list("src")}) + + if result and result.item then + meta:set_int("cook_time", 0) + -- check if there's room for output in "dst" list + if inv:room_for_item("dst", result.item) then + inv:set_stack("src", 1, afterfuel.items[1]) + inv:add_item("dst", result.item) + end + end +end + +function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function) + if send_function == nil then + send_function = technic.send_items + end + + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local pos1 = vector.new(pos) + local x_velocity = 0 + local z_velocity = 0 + + -- Output is on the left side of the furnace + if node.param2 == 3 then pos1.z = pos1.z - 1 z_velocity = -1 end + if node.param2 == 2 then pos1.x = pos1.x - 1 x_velocity = -1 end + if node.param2 == 1 then pos1.z = pos1.z + 1 z_velocity = 1 end + if node.param2 == 0 then pos1.x = pos1.x + 1 x_velocity = 1 end + + local output_tube_connected = false + local node1 = minetest.get_node(pos1) + if minetest.get_item_group(node1.name, "tubedevice") > 0 then + output_tube_connected = true + end + local tube_time = meta:get_int("tube_time") + tube_upgrade + if tube_time >= 2 then + tube_time = 0 + if output_tube_connected then + send_function(pos, x_velocity, z_velocity) + end + end + meta:set_int("tube_time", tube_time) +end + +function technic.machine_can_dig(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if not inv:is_empty("src") or not inv:is_empty("dst") then + if player then + minetest.chat_send_player(player:get_player_name(), + S("Machine cannot be removed because it is not empty")) + end + return false + end + + return true +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.item_drop(stack, "", pos) + 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.item_drop(stack, "", pos) + end + end + end + + if minetest.registered_nodes[oldnode.name].tube then + pipeworks.after_dig(pos, oldnode, oldmetadata, player) + end +end + +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 + 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 +end + +function technic.machine_inventory_put(pos, listname, index, stack, player) + return inv_change(pos, player, stack:get_count(), nil, listname, stack) +end + +function technic.machine_inventory_take(pos, listname, index, stack, player) + return inv_change(pos, player, stack:get_count(), listname, nil, stack) +end + +function technic.machine_inventory_move(pos, from_list, from_index, + 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, from_list, to_list, stack) +end + diff --git a/technic/technic/machines/register/compressor.lua b/technic/technic/machines/register/compressor.lua new file mode 100644 index 0000000..49830d7 --- /dev/null +++ b/technic/technic/machines/register/compressor.lua @@ -0,0 +1,9 @@ + +local S = technic.getter + +function technic.register_compressor(data) + data.typename = "compressing" + data.machine_name = "compressor" + data.machine_desc = S("%s Compressor") + technic.register_base_machine(data) +end diff --git a/technic/technic/machines/register/compressor_recipes.lua b/technic/technic/machines/register/compressor_recipes.lua new file mode 100644 index 0000000..872be04 --- /dev/null +++ b/technic/technic/machines/register/compressor_recipes.lua @@ -0,0 +1,34 @@ + +local S = technic.getter + +technic.register_recipe_type("compressing", { description = S("Compressing") }) + +function technic.register_compressor_recipe(data) + data.time = data.time or 4 + technic.register_recipe("compressing", data) +end + +local recipes = { + {"default:snowblock", "default:ice"}, + {"default:sand 2", "default:sandstone"}, + {"default:desert_sand", "default:desert_stone"}, + {"technic:mixed_metal_ingot", "technic:composite_plate"}, + {"default:copper_ingot 5", "technic:copper_plate"}, + {"technic:coal_dust 4", "technic:graphite"}, + {"technic:carbon_cloth", "technic:carbon_plate"}, + {"technic:uranium35_ingot 5", "technic:uranium_fuel"}, +} + +-- defuse the default sandstone recipe, since we have the compressor to take over in a more realistic manner +minetest.register_craft({ + output = "default:sand 0", + recipe = { + {'group:sand', 'group:sand'}, + {'group:sand', 'group:sand'} + }, +}) + +for _, data in pairs(recipes) do + technic.register_compressor_recipe({input = {data[1]}, output = data[2]}) +end + diff --git a/technic/technic/machines/register/electric_furnace.lua b/technic/technic/machines/register/electric_furnace.lua new file mode 100644 index 0000000..44de16c --- /dev/null +++ b/technic/technic/machines/register/electric_furnace.lua @@ -0,0 +1,9 @@ + +local S = technic.getter + +function technic.register_electric_furnace(data) + data.typename = "cooking" + data.machine_name = "electric_furnace" + data.machine_desc = S("%s Furnace") + technic.register_base_machine(data) +end diff --git a/technic/technic/machines/register/extractor.lua b/technic/technic/machines/register/extractor.lua new file mode 100644 index 0000000..eeef9ff --- /dev/null +++ b/technic/technic/machines/register/extractor.lua @@ -0,0 +1,9 @@ + +local S = technic.getter + +function technic.register_extractor(data) + data.typename = "extracting" + data.machine_name = "extractor" + data.machine_desc = S("%s Extractor") + technic.register_base_machine(data) +end diff --git a/technic/technic/machines/register/extractor_recipes.lua b/technic/technic/machines/register/extractor_recipes.lua new file mode 100644 index 0000000..1de0ba0 --- /dev/null +++ b/technic/technic/machines/register/extractor_recipes.lua @@ -0,0 +1,59 @@ + +local S = technic.getter + +technic.register_recipe_type("extracting", { description = S("Extracting") }) + +function technic.register_extractor_recipe(data) + data.time = data.time or 4 + technic.register_recipe("extracting", data) +end + +if minetest.get_modpath("dye") then + -- check if we are using dye or unifieddyes + 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"}, + {"default:grass_1", "dye:green 1"}, + {"default:dry_shrub", "dye:brown 1"}, + {"default:junglegrass", "dye:green 2"}, + {"default:cactus", "dye:green 4"}, + {"flowers:geranium", "dye:blue 4"}, + {"flowers:dandelion_white", "dye:white 4"}, + {"flowers:dandelion_yellow", "dye:yellow 4"}, + {"flowers:tulip", "dye:orange 4"}, + {"flowers:rose", "dye:red 4"}, + {"flowers:viola", "dye:violet 4"}, + {"bushes:blackberry", unifieddyes and "unifieddyes:magenta_s50 4" or "dye:violet 4"}, + {"bushes:blueberry", unifieddyes and "unifieddyes:magenta_s50 4" or "dye:magenta 4"}, + } + + for _, data in ipairs(dye_recipes) do + technic.register_extractor_recipe({input = {data[1]}, output = data[2]}) + 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 diff --git a/technic/technic/machines/register/generator.lua b/technic/technic/machines/register/generator.lua new file mode 100644 index 0000000..31c1cef --- /dev/null +++ b/technic/technic/machines/register/generator.lua @@ -0,0 +1,173 @@ +local S = technic.getter + +local tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("src", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("src", stack) + end, + connect_sides = {left=1, right=1, back=1, top=1, bottom=1}, +} + +function technic.register_generator(data) + local tier = data.tier + local ltier = string.lower(tier) + + local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1} + local active_groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1, not_in_creative_inventory=1} + if data.tube then + groups.tubedevice = 1 + groups.tubedevice_receiver = 1 + active_groups.tubedevice = 1 + active_groups.tubedevice_receiver = 1 + end + + local generator_formspec = + "invsize[8,9;]".. + "label[0,0;"..S("Fuel-Fired %s Generator"):format(tier).."]".. + "list[current_name;src;3,1;1,1;]".. + "image[4,1;1,1;default_furnace_fire_bg.png]".. + "list[current_player;main;0,5;8,4;]".. + "listring[]" + + local desc = S("Fuel-Fired %s Generator"):format(tier) + + local run = function(pos, node) + local meta = minetest.get_meta(pos) + local burn_time = meta:get_int("burn_time") + local burn_totaltime = meta:get_int("burn_totaltime") + -- If more to burn and the energy produced was used: produce some more + if burn_time > 0 then + meta:set_int(tier.."_EU_supply", data.supply) + burn_time = burn_time - 1 + meta:set_int("burn_time", burn_time) + end + -- Burn another piece of fuel + if burn_time == 0 then + local inv = meta:get_inventory() + if not inv:is_empty("src") then + local fuellist = inv:get_list("src") + local fuel + local afterfuel + fuel, afterfuel = minetest.get_craft_result( + {method = "fuel", width = 1, + items = fuellist}) + if not fuel or fuel.time == 0 then + meta:set_string("infotext", S("%s Out Of Fuel"):format(desc)) + technic.swap_node(pos, "technic:"..ltier.."_generator") + meta:set_int(tier.."_EU_supply", 0) + return + end + meta:set_int("burn_time", fuel.time) + meta:set_int("burn_totaltime", fuel.time) + inv:set_stack("src", 1, afterfuel.items[1]) + technic.swap_node(pos, "technic:"..ltier.."_generator_active") + meta:set_int(tier.."_EU_supply", data.supply) + else + technic.swap_node(pos, "technic:"..ltier.."_generator") + meta:set_int(tier.."_EU_supply", 0) + end + end + if burn_totaltime == 0 then burn_totaltime = 1 end + local percent = math.floor((burn_time / burn_totaltime) * 100) + meta:set_string("infotext", desc.." ("..percent.."%)") + 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[]") + end + + 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, + technic_run = run, + after_place_node = data.tube and pipeworks.after_place, + after_dig_node = technic.machine_after_dig_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, + 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(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) + 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[]") + return true + end, + }) + + technic.register_machine(tier, "technic:"..ltier.."_generator", technic.producer) + technic.register_machine(tier, "technic:"..ltier.."_generator_active", technic.producer) +end + diff --git a/technic/technic/machines/register/grinder.lua b/technic/technic/machines/register/grinder.lua new file mode 100644 index 0000000..19ea094 --- /dev/null +++ b/technic/technic/machines/register/grinder.lua @@ -0,0 +1,9 @@ + +local S = technic.getter + +function technic.register_grinder(data) + data.typename = "grinding" + data.machine_name = "grinder" + data.machine_desc = S("%s Grinder") + technic.register_base_machine(data) +end diff --git a/technic/technic/machines/register/grinder_recipes.lua b/technic/technic/machines/register/grinder_recipes.lua new file mode 100644 index 0000000..87c6ade --- /dev/null +++ b/technic/technic/machines/register/grinder_recipes.lua @@ -0,0 +1,161 @@ + +local S = technic.getter + +technic.register_recipe_type("grinding", { description = S("Grinding") }) + +function technic.register_grinder_recipe(data) + data.time = data.time or 3 + technic.register_recipe("grinding", data) +end + +local recipes = { + -- Dusts + {"default:coal_lump", "technic:coal_dust 2"}, + {"default:copper_lump", "technic:copper_dust 2"}, + {"default:desert_stone", "default:desert_sand"}, + {"default:gold_lump", "technic:gold_dust 2"}, + {"default:iron_lump", "technic:wrought_iron_dust 2"}, + {"technic:chromium_lump", "technic:chromium_dust 2"}, + {"technic:uranium_lump", "technic:uranium_dust 2"}, + {"technic:zinc_lump", "technic:zinc_dust 2"}, + {"technic:lead_lump", "technic:lead_dust 2"}, + {"technic:sulfur_lump", "technic:sulfur_dust 2"}, + + -- Other + {"default:cobble", "default:gravel"}, + {"default:gravel", "default:dirt"}, + {"default:stone", "default:sand"}, + {"default:sandstone", "default:sand 2"}, -- reverse recipe can be found in the compressor +} + +-- defuse the sandstone -> 4 sand recipe to avoid infinite sand bugs (also consult the inverse compressor recipe) +minetest.register_craft({ + output = "default:sandstone 0", + 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"}) + table.insert(recipes, {"moreores:tin_lump", "technic:tin_dust 2"}) +end + +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:kalite_lump", "technic:kalite_dust 2"}) + table.insert(recipes, {"gloopores:arol_lump", "technic:arol_dust 2"}) + table.insert(recipes, {"gloopores:talinite_lump", "technic:talinite_dust 2"}) + table.insert(recipes, {"gloopores:akalin_lump", "technic:akalin_dust 2"}) +end + +if minetest.get_modpath("homedecor") then + table.insert(recipes, {"home_decor:brass_ingot", "technic:brass_dust 1"}) +end + +for _, data in pairs(recipes) do + technic.register_grinder_recipe({input = {data[1]}, output = data[2]}) +end + +-- defuse common grinder unfriendly recipes +if minetest.get_modpath("fake_fire") then -- from homedecor_modpack + minetest.register_craft({ output='default:cobble 0', recipe={{'default:cobble'}}}) + minetest.register_craft({ output='default:gravel 0', recipe={{'default:gravel'}}}) +end + +-- dusts +local function register_dust(name, ingot) + local lname = string.lower(name) + lname = string.gsub(lname, ' ', '_') + minetest.register_craftitem("technic:"..lname.."_dust", { + description = S("%s Dust"):format(S(name)), + inventory_image = "technic_"..lname.."_dust.png", + }) + if ingot then + minetest.register_craft({ + type = "cooking", + recipe = "technic:"..lname.."_dust", + output = ingot, + }) + technic.register_grinder_recipe({ input = {ingot}, output = "technic:"..lname.."_dust 1" }) + end +end + +-- Sorted alphibeticaly +register_dust("Brass", "technic:brass_ingot") +register_dust("Bronze", "default:bronze_ingot") +register_dust("Carbon Steel", "technic:carbon_steel_ingot") +register_dust("Cast Iron", "technic:cast_iron_ingot") +register_dust("Chromium", "technic:chromium_ingot") +register_dust("Coal", nil) +register_dust("Copper", "default:copper_ingot") +register_dust("Lead", "technic:lead_ingot") +register_dust("Gold", "default:gold_ingot") +register_dust("Mithril", "moreores:mithril_ingot") +register_dust("Silver", "moreores:silver_ingot") +register_dust("Stainless Steel", "technic:stainless_steel_ingot") +register_dust("Sulfur", nil) +register_dust("Tin", "moreores:tin_ingot") +register_dust("Wrought Iron", "technic:wrought_iron_ingot") +register_dust("Zinc", "technic:zinc_ingot") +if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then + register_dust("Akalin", "glooptest:akalin_ingot") + register_dust("Alatro", "glooptest:alatro_ingot") + register_dust("Arol", "glooptest:arol_ingot") + register_dust("Kalite", nil) + register_dust("Talinite", "glooptest:talinite_ingot") +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({ + type = "fuel", + recipe = "technic:coal_dust", + 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 diff --git a/technic/technic/machines/register/grindings.lua b/technic/technic/machines/register/grindings.lua new file mode 100644 index 0000000..9231166 --- /dev/null +++ b/technic/technic/machines/register/grindings.lua @@ -0,0 +1,62 @@ +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 diff --git a/technic/technic/machines/register/init.lua b/technic/technic/machines/register/init.lua new file mode 100644 index 0000000..1667d75 --- /dev/null +++ b/technic/technic/machines/register/init.lua @@ -0,0 +1,33 @@ +local path = technic.modpath.."/machines/register" + +dofile(path.."/common.lua") + +-- Wiring stuff +dofile(path.."/cables.lua") +dofile(path.."/battery_box.lua") + +-- Generators +dofile(path.."/solar_array.lua") +dofile(path.."/generator.lua") + +-- API for machines +dofile(path.."/recipes.lua") +dofile(path.."/machine_base.lua") + +-- Recipes +dofile(path.."/alloy_recipes.lua") +dofile(path.."/grinder_recipes.lua") +dofile(path.."/extractor_recipes.lua") +dofile(path.."/compressor_recipes.lua") +dofile(path.."/centrifuge_recipes.lua") + +-- Multi-Machine Recipes +dofile(path.."/grindings.lua") + +-- Machines +dofile(path.."/alloy_furnace.lua") +dofile(path.."/electric_furnace.lua") +dofile(path.."/grinder.lua") +dofile(path.."/extractor.lua") +dofile(path.."/compressor.lua") +dofile(path.."/centrifuge.lua") diff --git a/technic/technic/machines/register/machine_base.lua b/technic/technic/machines/register/machine_base.lua new file mode 100644 index 0000000..0c46261 --- /dev/null +++ b/technic/technic/machines/register/machine_base.lua @@ -0,0 +1,197 @@ + +local S = technic.getter + +local tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("src", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("src", stack) + end, + connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1}, +} + +local function round(v) + return math.floor(v + 0.5) +end + +function technic.register_base_machine(data) + local typename = data.typename + local input_size = technic.recipes[typename].input_size + local machine_name = data.machine_name + local machine_desc = data.machine_desc + local tier = data.tier + local ltier = string.lower(tier) + + local groups = {cracky = 2, technic_machine = 1} + local active_groups = {cracky = 2, technic_machine = 1, not_in_creative_inventory = 1} + if data.tube then + groups.tubedevice = 1 + groups.tubedevice_receiver = 1 + active_groups.tubedevice = 1 + active_groups.tubedevice_receiver = 1 + end + + + local formspec = + "invsize[8,9;]".. + "list[current_name;src;"..(4-input_size)..",1;"..input_size..",1;]".. + "list[current_name;dst;5,1;2,2;]".. + "list[current_player;main;0,5;8,4;]".. + "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 + formspec = formspec.. + "list[current_name;upgrade1;1,3;1,1;]".. + "list[current_name;upgrade2;2,3;1,1;]".. + "label[1,4;"..S("Upgrade Slots").."]".. + "listring[current_name;upgrade1]".. + "listring[current_player;main]".. + "listring[current_name;upgrade2]".. + "listring[current_player;main]" + end + + local run = function(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local eu_input = meta:get_int(tier.."_EU_input") + + local machine_desc_tier = machine_desc:format(tier) + local machine_node = "technic:"..ltier.."_"..machine_name + local machine_demand = data.demand + + -- Setup meta data if it does not exist. + if not eu_input then + meta:set_int(tier.."_EU_demand", machine_demand[1]) + meta:set_int(tier.."_EU_input", 0) + return + end + + local EU_upgrade, tube_upgrade = 0, 0 + if data.upgrade then + EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta) + end + if data.tube then + technic.handle_machine_pipeworks(pos, tube_upgrade) + 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")) + if not result 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", 0) + return + end + meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1]) + technic.swap_node(pos, machine_node.."_active") + meta:set_string("infotext", S("%s Active"):format(machine_desc_tier)) + if meta:get_int("src_time") < round(result.time*10) then + if not powered then + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier)) + end + return + end + local output = result.output + if type(output) ~= "table" then output = { output } end + local output_stacks = {} + for _, o in ipairs(output) do + table.insert(output_stacks, ItemStack(o)) + end + local room_for_output = true + 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("dst", inv:get_list("dst_tmp")) + end + end + + 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", 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 + }) + + 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, + technic_run = run, + technic_disabled_machine_name = "technic:"..ltier.."_"..machine_name, + }) + + technic.register_machine(tier, "technic:"..ltier.."_"..machine_name, technic.receiver) + technic.register_machine(tier, "technic:"..ltier.."_"..machine_name.."_active", technic.receiver) + +end -- End registration + diff --git a/technic/technic/machines/register/recipes.lua b/technic/technic/machines/register/recipes.lua new file mode 100644 index 0000000..d30fd4f --- /dev/null +++ b/technic/technic/machines/register/recipes.lua @@ -0,0 +1,107 @@ +local have_ui = minetest.get_modpath("unified_inventory") + +technic.recipes = { cooking = { input_size = 1, output_size = 1 } } +function technic.register_recipe_type(typename, origdata) + local data = {} + for k, v in pairs(origdata) do data[k] = v end + 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, { + description = data.description, + width = data.input_size, + height = 1, + }) + end + data.recipes = {} + technic.recipes[typename] = data +end + +local function get_recipe_index(items) + if not items or type(items) ~= "table" then return false end + local l = {} + for i, stack in ipairs(items) do + l[i] = ItemStack(stack):get_name() + end + table.sort(l) + return table.concat(l, "/") +end + +local function register_recipe(typename, data) + -- Handle aliases + for i, stack in ipairs(data.input) do + data.input[i] = ItemStack(stack):to_string() + 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() + end + + local recipe = {time = data.time, input = {}, output = data.output} + 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 + recipe.input[ItemStack(stack):get_name()] = ItemStack(stack):get_count() + end + + technic.recipes[typename].recipes[index] = recipe + if unified_inventory and technic.recipes[typename].output_size == 1 then + unified_inventory.register_craft({ + type = typename, + output = data.output, + items = data.input, + width = 0, + }) + end +end + +function technic.register_recipe(typename, data) + minetest.after(0.01, register_recipe, typename, data) -- Handle aliases +end + +function technic.get_recipe(typename, items) + if typename == "cooking" then -- Already builtin in Minetest, so use that + local result, new_input = minetest.get_craft_result({ + method = "cooking", + width = 1, + items = items}) + -- Compatibility layer + if not result or result.time == 0 then + return nil + else + return {time = result.time, + new_input = new_input.items, + output = result.item} + end + end + 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] + if recipe then + local new_input = {} + for i, stack in ipairs(items) do + if stack:get_count() < recipe.input[stack:get_name()] then + return nil + else + new_input[i] = ItemStack(stack) + new_input[i]:take_item(recipe.input[stack:get_name()]) + end + end + return {time = recipe.time, + new_input = new_input, + output = recipe.output} + else + return nil + end +end + + diff --git a/technic/technic/machines/register/solar_array.lua b/technic/technic/machines/register/solar_array.lua new file mode 100644 index 0000000..39f50d2 --- /dev/null +++ b/technic/technic/machines/register/solar_array.lua @@ -0,0 +1,65 @@ + +local S = technic.getter + +function technic.register_solar_array(data) + local tier = data.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 EU)", machine_name, technic.prettynum(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, { + 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"}, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1}, + sounds = default.node_sound_wood_defaults(), + description = S("Arrayed Solar %s Generator"):format(tier), + active = false, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local name = minetest.get_node(pos).name + meta:set_int(tier.."_EU_supply", 0) + end, + technic_run = run, + }) + + technic.register_machine(tier, "technic:solar_array_"..ltier, technic.producer) +end + diff --git a/technic/technic/machines/supply_converter.lua b/technic/technic/machines/supply_converter.lua new file mode 100644 index 0000000..ffcd40d --- /dev/null +++ b/technic/technic/machines/supply_converter.lua @@ -0,0 +1,80 @@ +-- The supply converter is a generic device which can convert from +-- LV to MV and back, and HV to MV and back. +-- The machine is configured by the wiring below and above it. +-- +-- It works like this: +-- The top side is setup as the receiver side, the bottom as the producer side. +-- Once the receiver side is powered it will deliver power to the other side. +-- Unused power is wasted just like any other producer! + +local S = technic.getter + +local run = function(pos, node) + local demand = 10000 + local remain = 0.9 + -- Machine information + local machine_name = S("Supply Converter") + local meta = minetest.get_meta(pos) + + 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 name_up = minetest.get_node(pos_up).name + local name_down = minetest.get_node(pos_down).name + + local from = technic.get_cable_tier(name_up) + local to = technic.get_cable_tier(name_down) + + if from and to then + local input = meta:get_int(from.."_EU_input") + meta:set_int(from.."_EU_demand", demand) + meta:set_int(from.."_EU_supply", 0) + meta:set_int(to.."_EU_demand", 0) + meta:set_int(to.."_EU_supply", input * remain) + meta:set_string("infotext", S("@1 (@2 @3 -> @4 @5)", machine_name, technic.prettynum(input), from, technic.prettynum(input * remain), to)) + else + 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 + end + +end + +minetest.register_node("technic:supply_converter", { + description = S("Supply Converter"), + tiles = {"technic_supply_converter_top.png", "technic_supply_converter_bottom.png", + "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}, + 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) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Supply Converter")) + meta:set_float("active", false) + end, + technic_run = 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_cable0', 'technic:rubber', 'technic:lv_cable0'}, + } +}) + +for tier, machines in pairs(technic.machines) do + technic.register_machine(tier, "technic:supply_converter", technic.producer_receiver) +end + diff --git a/technic/technic/machines/switching_station.lua b/technic/technic/machines/switching_station.lua new file mode 100644 index 0000000..d6f23a3 --- /dev/null +++ b/technic/technic/machines/switching_station.lua @@ -0,0 +1,404 @@ +-- 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 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 = {} + +local S = technic.getter + +minetest.register_craft({ + output = "technic:switching_station", + recipe = { + {"", "technic:lv_transformer", ""}, + {"default:copper_ingot", "technic:machine_casing", "default:copper_ingot"}, + {"technic:lv_cable0", "technic:lv_cable0", "technic:lv_cable0"} + } +}) + +minetest.register_node("technic:switching_station",{ + description = S("Switching Station"), + 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"}, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + 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) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Switching Station")) + meta:set_string("active", 1) + end, +}) + +-------------------------------------------------- +-- Functions to traverse the electrical network +-------------------------------------------------- + +-- Add a wire node to the LV/MV/HV network +local add_new_cable_node = function(nodes, pos) + -- Ignore if the node has already been added + for i = 1, #nodes do + if pos.x == nodes[i].x and + pos.y == nodes[i].y and + pos.z == nodes[i].z then + return false + end + end + table.insert(nodes, {x=pos.x, y=pos.y, z=pos.z, visited=1}) + return true +end + +-- 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) + technic.get_or_load_node(pos) + local meta = minetest.get_meta(pos) + local name = minetest.get_node(pos).name + + if technic.is_tier_cable(name, tier) then + add_new_cable_node(all_nodes, pos) + elseif machines[name] then + --dprint(name.." is a "..machines[name]) + if machines[name] == technic.producer then + add_new_cable_node(PR_nodes, pos) + elseif machines[name] == technic.receiver then + add_new_cable_node(RE_nodes, pos) + elseif machines[name] == technic.producer_receiver then + add_new_cable_node(PR_nodes, pos) + 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_new_cable_node(SP_nodes, pos) + meta:set_int("active", 0) + meta:set_string("active_pos", minetest.serialize(sw_pos)) + elseif machines[name] == technic.battery then + add_new_cable_node(BA_nodes, pos) + end + + meta:set_int(tier.."_EU_timeout", 2) -- Touch node + end +end + +-- 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, i, machines, tier, sw_pos) + local pos = all_nodes[i] + 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}} + --print("ON") + 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) + end +end + +local touch_nodes = function(list, tier) + for _, pos in ipairs(list) do + local meta = minetest.get_meta(pos) + meta:set_int(tier.."_EU_timeout", 2) -- Touch node + end +end + +local get_network = function(sw_pos, pos1, tier) + local cached = technic.networks[minetest.hash_node_position(pos1)] + if cached and cached.tier == tier then + touch_nodes(cached.PR_nodes, tier) + touch_nodes(cached.BA_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 + end + local i = 1 + local PR_nodes = {} + local BA_nodes = {} + local RE_nodes = {} + local SP_nodes = {} + local all_nodes = {pos1} + repeat + traverse_network(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nodes, + i, technic.machines[tier], tier, sw_pos) + i = i + 1 + until all_nodes[i] == nil + technic.networks[minetest.hash_node_position(pos1)] = {tier = tier, PR_nodes = PR_nodes, + RE_nodes = RE_nodes, BA_nodes = BA_nodes, SP_nodes = SP_nodes} + return PR_nodes, BA_nodes, RE_nodes +end + +----------------------------------------------- +-- The action code for the switching station -- +----------------------------------------------- +minetest.register_abm({ + nodenames = {"technic:switching_station"}, + label = "Switching Station", -- allows the mtt profiler to profile this abm individually + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.get_meta(pos) + local meta1 = nil + local pos1 = {} + local PR_EU = 0 -- EUs from PR nodes + local BA_PR_EU = 0 -- EUs from BA nodes (discharching) + local BA_RE_EU = 0 -- EUs to BA nodes (charging) + local RE_EU = 0 -- EUs to RE nodes + + local tier = "" + local PR_nodes + local BA_nodes + local RE_nodes + local machine_name = S("Switching Station") + + if meta:get_int("active") ~= 1 then + meta:set_int("active", 1) + local active_pos = minetest.deserialize(meta:get_string("active_pos")) + if active_pos then + local meta1 = minetest.get_meta(active_pos) + meta:set_string("infotext", S("%s (Slave)"):format(meta1:get_string("infotext"))) + end + return + end + + -- Which kind of network are we on: + pos1 = {x=pos.x, y=pos.y-1, z=pos.z} + + local name = minetest.get_node(pos1).name + local tier = technic.get_cable_tier(name) + if tier then + PR_nodes, BA_nodes, RE_nodes = get_network(pos, pos1, tier) + else + --dprint("Not connected to a network") + meta:set_string("infotext", S("%s Has No Network"):format(machine_name)) + return + end + + -- Run all the nodes + local function run_nodes(list) + for _, pos2 in ipairs(list) do + 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) + end + end + end + + run_nodes(PR_nodes) + run_nodes(RE_nodes) + run_nodes(BA_nodes) + + -- Strings for the meta data + local eu_demand_str = tier.."_EU_demand" + local eu_input_str = tier.."_EU_input" + 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 + local PR_eu_supply = 0 -- Total power + for _, pos1 in pairs(PR_nodes) do + meta1 = minetest.get_meta(pos1) + PR_eu_supply = PR_eu_supply + meta1:get_int(eu_supply_str) + end + --dprint("Total PR supply:"..PR_eu_supply) + + -- Get all the demand from the RE nodes + local RE_eu_demand = 0 + for _, pos1 in pairs(RE_nodes) do + meta1 = minetest.get_meta(pos1) + RE_eu_demand = RE_eu_demand + meta1:get_int(eu_demand_str) + end + --dprint("Total RE demand:"..RE_eu_demand) + + -- Get all the power from the BA nodes + local BA_eu_supply = 0 + for _, pos1 in pairs(BA_nodes) do + meta1 = minetest.get_meta(pos1) + BA_eu_supply = BA_eu_supply + meta1:get_int(eu_supply_str) + end + --dprint("Total BA supply:"..BA_eu_supply) + + -- Get all the demand from the BA nodes + local BA_eu_demand = 0 + for _, pos1 in pairs(BA_nodes) do + meta1 = minetest.get_meta(pos1) + BA_eu_demand = BA_eu_demand + meta1:get_int(eu_demand_str) + end + --dprint("Total BA demand:"..BA_eu_demand) + + meta:set_string("infotext", + S("@1. Supply: @2 Demand: @3", + machine_name, technic.prettynum(PR_eu_supply), technic.prettynum(RE_eu_demand))) + + -- If the PR supply is enough for the RE demand supply them all + if PR_eu_supply >= RE_eu_demand then + --dprint("PR_eu_supply"..PR_eu_supply.." >= RE_eu_demand"..RE_eu_demand) + for _, pos1 in pairs(RE_nodes) do + meta1 = minetest.get_meta(pos1) + local eu_demand = meta1:get_int(eu_demand_str) + meta1:set_int(eu_input_str, eu_demand) + end + -- We have a surplus, so distribute the rest equally to the BA nodes + -- Let's calculate the factor of the demand + PR_eu_supply = PR_eu_supply - RE_eu_demand + local charge_factor = 0 -- Assume all batteries fully charged + if BA_eu_demand > 0 then + charge_factor = PR_eu_supply / BA_eu_demand + end + for n, pos1 in pairs(BA_nodes) do + meta1 = minetest.get_meta(pos1) + local eu_demand = meta1:get_int(eu_demand_str) + meta1:set_int(eu_input_str, math.floor(eu_demand * charge_factor)) + --dprint("Charging battery:"..math.floor(eu_demand*charge_factor)) + end + return + end + + -- If the PR supply is not enough for the RE demand we will discharge the batteries too + if PR_eu_supply + BA_eu_supply >= RE_eu_demand then + --dprint("PR_eu_supply "..PR_eu_supply.."+BA_eu_supply "..BA_eu_supply.." >= RE_eu_demand"..RE_eu_demand) + for _, pos1 in pairs(RE_nodes) do + meta1 = minetest.get_meta(pos1) + local eu_demand = meta1:get_int(eu_demand_str) + meta1:set_int(eu_input_str, eu_demand) + end + -- We have a deficit, so distribute to the BA nodes + -- Let's calculate the factor of the supply + local charge_factor = 0 -- Assume all batteries depleted + if BA_eu_supply > 0 then + charge_factor = (PR_eu_supply - RE_eu_demand) / BA_eu_supply + end + for n,pos1 in pairs(BA_nodes) do + meta1 = minetest.get_meta(pos1) + local eu_supply = meta1:get_int(eu_supply_str) + meta1:set_int(eu_input_str, math.floor(eu_supply * charge_factor)) + --dprint("Discharging battery:"..math.floor(eu_supply*charge_factor)) + end + return + end + + -- If the PR+BA supply is not enough for the RE demand: Power only the batteries + local charge_factor = 0 -- Assume all batteries fully charged + if BA_eu_demand > 0 then + charge_factor = PR_eu_supply / BA_eu_demand + end + for n, pos1 in pairs(BA_nodes) do + meta1 = minetest.get_meta(pos1) + local eu_demand = meta1:get_int(eu_demand_str) + meta1:set_int(eu_input_str, math.floor(eu_demand * charge_factor)) + end + for n, pos1 in pairs(RE_nodes) do + meta1 = minetest.get_meta(pos1) + meta1:set_int(eu_input_str, 0) + 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({ + nodenames = {"group:technic_machine"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + 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, +}) + +for tier, machines in pairs(technic.machines) do + -- SPECIAL will not be traversed + technic.register_machine(tier, "technic:switching_station", "SPECIAL") +end + diff --git a/technic/technic/models/technic_cylinder.obj b/technic/technic/models/technic_cylinder.obj new file mode 100644 index 0000000..2622347 --- /dev/null +++ b/technic/technic/models/technic_cylinder.obj @@ -0,0 +1,238 @@ +# 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 diff --git a/technic/technic/models/technic_cylinder_horizontal.obj b/technic/technic/models/technic_cylinder_horizontal.obj new file mode 100644 index 0000000..d00b1d6 --- /dev/null +++ b/technic/technic/models/technic_cylinder_horizontal.obj @@ -0,0 +1,238 @@ +# 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 diff --git a/technic/technic/models/technic_innercorner.obj b/technic/technic/models/technic_innercorner.obj new file mode 100644 index 0000000..c962aeb --- /dev/null +++ b/technic/technic/models/technic_innercorner.obj @@ -0,0 +1,33 @@ +# 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 diff --git a/technic/technic/models/technic_innercorner_upsdown.obj b/technic/technic/models/technic_innercorner_upsdown.obj new file mode 100644 index 0000000..68eb560 --- /dev/null +++ b/technic/technic/models/technic_innercorner_upsdown.obj @@ -0,0 +1,33 @@ +# 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 diff --git a/technic/technic/models/technic_oblate_spheroid.obj b/technic/technic/models/technic_oblate_spheroid.obj new file mode 100644 index 0000000..e949f5b --- /dev/null +++ b/technic/technic/models/technic_oblate_spheroid.obj @@ -0,0 +1,300 @@ +# 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 diff --git a/technic/technic/models/technic_one_curved_edge.obj b/technic/technic/models/technic_one_curved_edge.obj new file mode 100644 index 0000000..bb82040 --- /dev/null +++ b/technic/technic/models/technic_one_curved_edge.obj @@ -0,0 +1,132 @@ +# 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 diff --git a/technic/technic/models/technic_outercorner.obj b/technic/technic/models/technic_outercorner.obj new file mode 100644 index 0000000..60ccae6 --- /dev/null +++ b/technic/technic/models/technic_outercorner.obj @@ -0,0 +1,23 @@ +# 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 diff --git a/technic/technic/models/technic_outercorner_upsdown.obj b/technic/technic/models/technic_outercorner_upsdown.obj new file mode 100644 index 0000000..c89de8a --- /dev/null +++ b/technic/technic/models/technic_outercorner_upsdown.obj @@ -0,0 +1,23 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_ocorner_onetexture.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 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 1.000000 -0.000000 +vn -1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.707100 -0.707100 0.000000 +vn -0.000000 -0.707100 -0.707100 +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 diff --git a/technic/technic/models/technic_pyramid.obj b/technic/technic/models/technic_pyramid.obj new file mode 100644 index 0000000..a618dcf --- /dev/null +++ b/technic/technic/models/technic_pyramid.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_pyramid_short_onetexture.blend' +# 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.000000 0.000000 -0.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.500000 0.500000 +vn 0.000000 -1.000000 0.000000 +vn -0.707100 0.707100 -0.000000 +vn 0.000000 0.707100 -0.707100 +vn 0.707100 0.707100 0.000000 +vn -0.000000 0.707100 0.707100 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 3/4/2 5/5/2 4/3/2 +f 5/5/3 1/3/3 4/4/3 +f 1/4/4 5/5/4 2/3/4 +f 2/4/5 5/5/5 3/3/5 diff --git a/technic/technic/models/technic_pyramid_spike.obj b/technic/technic/models/technic_pyramid_spike.obj new file mode 100644 index 0000000..b305af2 --- /dev/null +++ b/technic/technic/models/technic_pyramid_spike.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_pyramid_onetexture.blend' +# 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.000000 0.500000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.500000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.894400 0.447200 -0.000000 +vn 0.000000 0.447200 -0.894400 +vn 0.894400 0.447200 0.000000 +vn -0.000000 0.447200 0.894400 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 3/4/2 5/5/2 4/3/2 +f 5/5/3 1/3/3 4/4/3 +f 1/4/4 5/5/4 2/3/4 +f 2/4/5 5/5/5 3/3/5 diff --git a/technic/technic/models/technic_slope.obj b/technic/technic/models/technic_slope.obj new file mode 100644 index 0000000..f6f4860 --- /dev/null +++ b/technic/technic/models/technic_slope.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_slope_onetexture.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 +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 -1.000000 -0.000000 +vn -1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.707100 -0.707100 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 4/3/2 3/4/2 5/1/2 6/2/2 +f 2/1/3 5/3/3 3/4/3 +f 1/2/4 4/3/4 6/4/4 +f 2/1/5 1/2/5 6/3/5 5/4/5 diff --git a/technic/technic/models/technic_slope_horizontal.obj b/technic/technic/models/technic_slope_horizontal.obj new file mode 100644 index 0000000..4866a92 --- /dev/null +++ b/technic/technic/models/technic_slope_horizontal.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'technic-slope-horizontal.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 +v 0.500000 0.500000 -0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 1.000000 -0.000000 -0.000000 +vn -0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 -0.000000 +vn -0.707100 0.000000 -0.707100 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 4/1/2 3/2/2 5/3/2 6/4/2 +f 2/3/3 5/1/3 3/2/3 +f 1/4/4 4/1/4 6/2/4 +f 2/3/5 1/4/5 6/1/5 5/2/5 diff --git a/technic/technic/models/technic_slope_upsdown.obj b/technic/technic/models/technic_slope_upsdown.obj new file mode 100644 index 0000000..6880595 --- /dev/null +++ b/technic/technic/models/technic_slope_upsdown.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_slope_onetexture.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 +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 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 -0.000000 +vn 1.000000 -0.000000 0.000000 +vn -1.000000 0.000000 -0.000000 +vn -0.000000 -0.707100 -0.707100 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 4/3/2 3/4/2 5/1/2 6/2/2 +f 2/1/3 5/3/3 3/4/3 +f 1/2/4 4/3/4 6/4/4 +f 2/1/5 1/2/5 6/3/5 5/4/5 diff --git a/technic/technic/models/technic_sphere.obj b/technic/technic/models/technic_sphere.obj new file mode 100644 index 0000000..772b570 --- /dev/null +++ b/technic/technic/models/technic_sphere.obj @@ -0,0 +1,1927 @@ +# Blender v2.73 (sub 0) OBJ File: 'globe.blend' +# www.blender.org +o Sphere +v -0.097545 0.490393 0.000000 +v -0.191342 0.461940 0.000000 +v -0.277785 0.415735 0.000000 +v -0.353553 0.353553 0.000000 +v -0.415735 0.277785 0.000000 +v -0.461940 0.191342 0.000000 +v -0.490393 0.097545 0.000000 +v -0.500000 0.000000 0.000000 +v -0.490393 -0.097545 0.000000 +v -0.461940 -0.191342 0.000000 +v -0.415735 -0.277785 0.000000 +v -0.353553 -0.353553 0.000000 +v -0.277785 -0.415735 0.000000 +v -0.191342 -0.461940 0.000000 +v -0.097545 -0.490393 0.000000 +v -0.095671 0.490393 -0.019030 +v -0.187665 0.461940 -0.037329 +v -0.272448 0.415735 -0.054193 +v -0.346760 0.353553 -0.068975 +v -0.407747 0.277785 -0.081106 +v -0.453064 0.191342 -0.090120 +v -0.480970 0.097545 -0.095671 +v -0.490393 0.000000 -0.097545 +v -0.480970 -0.097545 -0.095671 +v -0.453064 -0.191342 -0.090120 +v -0.407747 -0.277785 -0.081106 +v -0.346760 -0.353553 -0.068975 +v -0.272448 -0.415735 -0.054193 +v -0.187665 -0.461940 -0.037329 +v -0.095671 -0.490393 -0.019030 +v -0.090120 0.490393 -0.037329 +v -0.176777 0.461940 -0.073223 +v -0.256640 0.415735 -0.106304 +v -0.326641 0.353553 -0.135299 +v -0.384089 0.277785 -0.159095 +v -0.426777 0.191342 -0.176777 +v -0.453064 0.097545 -0.187665 +v -0.461940 0.000000 -0.191342 +v -0.453064 -0.097545 -0.187665 +v -0.426777 -0.191342 -0.176777 +v -0.384089 -0.277785 -0.159095 +v -0.326641 -0.353553 -0.135299 +v -0.256640 -0.415735 -0.106304 +v -0.176777 -0.461940 -0.073223 +v -0.090120 -0.490393 -0.037329 +v -0.081106 0.490393 -0.054193 +v -0.159095 0.461940 -0.106304 +v -0.230970 0.415735 -0.154329 +v -0.293969 0.353553 -0.196424 +v -0.345671 0.277785 -0.230970 +v -0.384089 0.191342 -0.256640 +v -0.407746 0.097545 -0.272448 +v -0.415735 0.000000 -0.277785 +v -0.407746 -0.097545 -0.272448 +v -0.384089 -0.191342 -0.256640 +v -0.345671 -0.277785 -0.230970 +v -0.293969 -0.353553 -0.196424 +v -0.230970 -0.415735 -0.154329 +v -0.159095 -0.461940 -0.106304 +v -0.081106 -0.490393 -0.054193 +v -0.068975 0.490393 -0.068975 +v -0.135299 0.461940 -0.135299 +v -0.196424 0.415735 -0.196424 +v -0.250000 0.353553 -0.250000 +v -0.293969 0.277785 -0.293969 +v -0.326641 0.191342 -0.326641 +v -0.346760 0.097545 -0.346760 +v -0.353553 0.000000 -0.353554 +v -0.346760 -0.097545 -0.346760 +v -0.326641 -0.191342 -0.326641 +v -0.293969 -0.277785 -0.293969 +v -0.250000 -0.353553 -0.250000 +v -0.196424 -0.415735 -0.196424 +v -0.135299 -0.461940 -0.135299 +v -0.068975 -0.490393 -0.068975 +v -0.054193 0.490393 -0.081106 +v -0.106304 0.461940 -0.159095 +v -0.154329 0.415735 -0.230970 +v -0.196424 0.353553 -0.293969 +v -0.230970 0.277785 -0.345671 +v -0.256640 0.191342 -0.384089 +v -0.272447 0.097545 -0.407747 +v -0.277785 0.000000 -0.415735 +v -0.272447 -0.097545 -0.407747 +v -0.256640 -0.191342 -0.384089 +v -0.230970 -0.277785 -0.345671 +v -0.196424 -0.353553 -0.293969 +v -0.154329 -0.415735 -0.230970 +v -0.106304 -0.461940 -0.159095 +v -0.054193 -0.490393 -0.081106 +v -0.037329 0.490393 -0.090120 +v -0.073223 0.461940 -0.176777 +v -0.106304 0.415735 -0.256640 +v -0.135299 0.353553 -0.326641 +v -0.159095 0.277785 -0.384089 +v -0.176777 0.191342 -0.426777 +v -0.187665 0.097545 -0.453064 +v -0.191342 0.000000 -0.461940 +v -0.187665 -0.097545 -0.453064 +v -0.176777 -0.191342 -0.426777 +v -0.159095 -0.277785 -0.384089 +v -0.135299 -0.353553 -0.326641 +v -0.106304 -0.415735 -0.256640 +v -0.073223 -0.461940 -0.176777 +v -0.037329 -0.490393 -0.090120 +v -0.019030 0.490393 -0.095671 +v -0.037329 0.461940 -0.187665 +v -0.054193 0.415735 -0.272448 +v -0.068975 0.353553 -0.346760 +v -0.081106 0.277785 -0.407747 +v -0.090120 0.191342 -0.453064 +v -0.095671 0.097545 -0.480970 +v -0.097545 0.000000 -0.490393 +v -0.095671 -0.097545 -0.480970 +v -0.090120 -0.191342 -0.453064 +v -0.081106 -0.277785 -0.407747 +v -0.068975 -0.353553 -0.346760 +v -0.054193 -0.415735 -0.272448 +v -0.037329 -0.461940 -0.187665 +v -0.019030 -0.490393 -0.095671 +v 0.000000 0.490393 -0.097545 +v 0.000000 0.461940 -0.191342 +v 0.000000 0.415735 -0.277785 +v 0.000000 0.353553 -0.353553 +v 0.000000 0.277785 -0.415735 +v 0.000000 0.191342 -0.461940 +v 0.000000 0.097545 -0.490393 +v 0.000000 0.000000 -0.500000 +v 0.000000 -0.097545 -0.490393 +v 0.000000 -0.191342 -0.461940 +v 0.000000 -0.277785 -0.415735 +v 0.000000 -0.353553 -0.353553 +v 0.000000 -0.415735 -0.277785 +v 0.000000 -0.461940 -0.191342 +v 0.000000 -0.490393 -0.097545 +v 0.019030 0.490393 -0.095671 +v 0.037329 0.461940 -0.187665 +v 0.054193 0.415735 -0.272448 +v 0.068975 0.353553 -0.346760 +v 0.081106 0.277785 -0.407747 +v 0.090120 0.191342 -0.453064 +v 0.095671 0.097545 -0.480970 +v 0.097545 0.000000 -0.490393 +v 0.095671 -0.097545 -0.480970 +v 0.090120 -0.191342 -0.453064 +v 0.081106 -0.277785 -0.407747 +v 0.068975 -0.353553 -0.346760 +v 0.054193 -0.415735 -0.272448 +v 0.037329 -0.461940 -0.187665 +v 0.019030 -0.490393 -0.095671 +v 0.037329 0.490393 -0.090120 +v 0.073224 0.461940 -0.176777 +v 0.106304 0.415735 -0.256640 +v 0.135299 0.353553 -0.326641 +v 0.159095 0.277785 -0.384089 +v 0.176777 0.191342 -0.426777 +v 0.187665 0.097545 -0.453064 +v 0.191342 0.000000 -0.461940 +v 0.187665 -0.097545 -0.453064 +v 0.176777 -0.191342 -0.426777 +v 0.159095 -0.277785 -0.384089 +v 0.135299 -0.353553 -0.326641 +v 0.106304 -0.415735 -0.256640 +v 0.073223 -0.461940 -0.176777 +v 0.037329 -0.490393 -0.090120 +v 0.054193 0.490393 -0.081106 +v 0.106304 0.461940 -0.159095 +v 0.154329 0.415735 -0.230970 +v 0.196424 0.353553 -0.293969 +v 0.230970 0.277785 -0.345671 +v 0.256640 0.191342 -0.384089 +v 0.272448 0.097545 -0.407747 +v 0.277785 0.000000 -0.415735 +v 0.272448 -0.097545 -0.407747 +v 0.256640 -0.191342 -0.384089 +v 0.230970 -0.277785 -0.345671 +v 0.196424 -0.353553 -0.293969 +v 0.154329 -0.415735 -0.230970 +v 0.106304 -0.461940 -0.159095 +v 0.054193 -0.490393 -0.081106 +v 0.068975 0.490393 -0.068975 +v 0.135299 0.461940 -0.135299 +v 0.196424 0.415735 -0.196424 +v 0.250000 0.353553 -0.250000 +v 0.293969 0.277785 -0.293969 +v 0.326641 0.191342 -0.326641 +v 0.346760 0.097545 -0.346760 +v 0.353554 0.000000 -0.353553 +v 0.346760 -0.097545 -0.346760 +v 0.326641 -0.191342 -0.326641 +v 0.293969 -0.277785 -0.293969 +v 0.250000 -0.353553 -0.250000 +v 0.196424 -0.415735 -0.196424 +v 0.135299 -0.461940 -0.135299 +v 0.068975 -0.490393 -0.068975 +v 0.081106 0.490393 -0.054193 +v 0.159095 0.461940 -0.106304 +v 0.230970 0.415735 -0.154329 +v 0.293969 0.353553 -0.196424 +v 0.345671 0.277785 -0.230970 +v 0.384089 0.191342 -0.256640 +v 0.407747 0.097545 -0.272447 +v 0.415735 0.000000 -0.277785 +v 0.407747 -0.097545 -0.272447 +v 0.384089 -0.191342 -0.256640 +v 0.345671 -0.277785 -0.230970 +v 0.293969 -0.353553 -0.196424 +v 0.230970 -0.415735 -0.154329 +v 0.159095 -0.461940 -0.106304 +v 0.081106 -0.490393 -0.054193 +v 0.090120 0.490393 -0.037329 +v 0.176777 0.461940 -0.073223 +v 0.256640 0.415735 -0.106304 +v 0.326641 0.353553 -0.135299 +v 0.384089 0.277785 -0.159095 +v 0.426777 0.191342 -0.176777 +v 0.453064 0.097545 -0.187665 +v 0.461940 0.000000 -0.191342 +v 0.453064 -0.097545 -0.187665 +v 0.426777 -0.191342 -0.176777 +v 0.384089 -0.277785 -0.159095 +v 0.326641 -0.353553 -0.135299 +v 0.256640 -0.415735 -0.106304 +v 0.176777 -0.461940 -0.073223 +v 0.090120 -0.490393 -0.037329 +v 0.095671 0.490393 -0.019030 +v 0.187665 0.461940 -0.037329 +v 0.272448 0.415735 -0.054193 +v 0.346760 0.353553 -0.068975 +v 0.407747 0.277785 -0.081106 +v 0.453064 0.191342 -0.090120 +v 0.480970 0.097545 -0.095671 +v 0.490393 0.000000 -0.097545 +v 0.480970 -0.097545 -0.095671 +v 0.453064 -0.191342 -0.090120 +v 0.407747 -0.277785 -0.081106 +v 0.346760 -0.353553 -0.068975 +v 0.272448 -0.415735 -0.054193 +v 0.187665 -0.461940 -0.037329 +v 0.095671 -0.490393 -0.019030 +v 0.097545 0.490393 0.000000 +v 0.191342 0.461940 -0.000000 +v 0.277785 0.415735 -0.000000 +v 0.353554 0.353553 0.000000 +v 0.415735 0.277785 0.000000 +v 0.461940 0.191342 -0.000000 +v 0.490393 0.097545 0.000000 +v 0.500000 0.000000 0.000000 +v 0.490393 -0.097545 0.000000 +v 0.461940 -0.191342 -0.000000 +v 0.415735 -0.277785 0.000000 +v 0.353554 -0.353553 0.000000 +v 0.277785 -0.415735 0.000000 +v 0.191342 -0.461940 -0.000000 +v 0.097545 -0.490393 -0.000000 +v 0.095671 0.490393 0.019030 +v 0.187665 0.461940 0.037329 +v 0.272448 0.415735 0.054193 +v 0.346760 0.353553 0.068975 +v 0.407747 0.277785 0.081106 +v 0.453064 0.191342 0.090120 +v 0.480970 0.097545 0.095671 +v 0.490393 0.000000 0.097545 +v 0.480970 -0.097545 0.095671 +v 0.453064 -0.191342 0.090120 +v 0.407747 -0.277785 0.081106 +v 0.346760 -0.353553 0.068975 +v 0.272448 -0.415735 0.054193 +v 0.187665 -0.461940 0.037329 +v 0.095671 -0.490393 0.019030 +v 0.090120 0.490393 0.037329 +v 0.176777 0.461940 0.073223 +v 0.256640 0.415735 0.106304 +v 0.326641 0.353553 0.135299 +v 0.384089 0.277785 0.159095 +v 0.426777 0.191342 0.176777 +v 0.453064 0.097545 0.187665 +v 0.461940 0.000000 0.191342 +v 0.453064 -0.097545 0.187665 +v 0.426777 -0.191342 0.176777 +v 0.384089 -0.277785 0.159095 +v 0.326641 -0.353553 0.135299 +v 0.256640 -0.415735 0.106304 +v 0.176777 -0.461940 0.073223 +v 0.090120 -0.490393 0.037329 +v 0.081106 0.490393 0.054193 +v 0.159095 0.461940 0.106304 +v 0.230970 0.415735 0.154329 +v 0.293969 0.353553 0.196424 +v 0.345671 0.277785 0.230970 +v 0.384089 0.191342 0.256640 +v 0.407747 0.097545 0.272448 +v 0.415735 0.000000 0.277785 +v 0.407747 -0.097545 0.272448 +v 0.384089 -0.191342 0.256640 +v 0.345671 -0.277785 0.230970 +v 0.293969 -0.353553 0.196424 +v 0.230970 -0.415735 0.154329 +v 0.159095 -0.461940 0.106304 +v 0.081106 -0.490393 0.054193 +v 0.068975 0.490393 0.068975 +v 0.135299 0.461940 0.135299 +v 0.196424 0.415735 0.196424 +v 0.250000 0.353553 0.250000 +v 0.293969 0.277785 0.293969 +v 0.326641 0.191342 0.326641 +v 0.346760 0.097545 0.346760 +v 0.353553 0.000000 0.353553 +v 0.346760 -0.097545 0.346760 +v 0.326641 -0.191342 0.326641 +v 0.293969 -0.277785 0.293969 +v 0.250000 -0.353553 0.250000 +v 0.196424 -0.415735 0.196424 +v 0.135299 -0.461940 0.135299 +v 0.068975 -0.490393 0.068975 +v 0.054193 0.490393 0.081106 +v 0.106304 0.461940 0.159095 +v 0.154329 0.415735 0.230970 +v 0.196424 0.353553 0.293969 +v 0.230970 0.277785 0.345671 +v 0.256640 0.191342 0.384089 +v 0.272448 0.097545 0.407746 +v 0.277785 0.000000 0.415735 +v 0.272448 -0.097545 0.407746 +v 0.256640 -0.191342 0.384089 +v 0.230970 -0.277785 0.345671 +v 0.196424 -0.353553 0.293969 +v 0.154329 -0.415735 0.230970 +v 0.106304 -0.461940 0.159095 +v 0.054193 -0.490393 0.081106 +v 0.037329 0.490393 0.090120 +v 0.073223 0.461940 0.176777 +v 0.106304 0.415735 0.256640 +v 0.135299 0.353553 0.326641 +v 0.159095 0.277785 0.384089 +v 0.176777 0.191342 0.426777 +v 0.187665 0.097545 0.453064 +v 0.191342 0.000000 0.461940 +v 0.187665 -0.097545 0.453064 +v 0.176777 -0.191342 0.426777 +v 0.159095 -0.277785 0.384089 +v 0.135299 -0.353553 0.326641 +v 0.106304 -0.415735 0.256640 +v 0.073223 -0.461940 0.176777 +v 0.037329 -0.490393 0.090120 +v 0.019030 0.490393 0.095671 +v 0.037329 0.461940 0.187665 +v 0.054193 0.415735 0.272448 +v 0.068975 0.353553 0.346760 +v 0.081106 0.277785 0.407746 +v 0.090120 0.191342 0.453064 +v 0.095671 0.097545 0.480970 +v 0.097545 0.000000 0.490393 +v 0.095671 -0.097545 0.480970 +v 0.090120 -0.191342 0.453064 +v 0.081106 -0.277785 0.407746 +v 0.068975 -0.353553 0.346760 +v 0.054193 -0.415735 0.272447 +v 0.037329 -0.461940 0.187665 +v 0.019030 -0.490393 0.095671 +v 0.000000 0.490393 0.097545 +v 0.000000 0.461940 0.191342 +v 0.000000 0.415735 0.277785 +v 0.000000 0.353553 0.353553 +v 0.000000 0.277785 0.415735 +v 0.000000 0.191342 0.461940 +v 0.000000 0.097545 0.490392 +v 0.000000 0.000000 0.500000 +v 0.000000 -0.097545 0.490392 +v 0.000000 -0.191342 0.461940 +v 0.000000 -0.277785 0.415735 +v 0.000000 -0.353553 0.353553 +v 0.000000 -0.415735 0.277785 +v 0.000000 -0.461940 0.191342 +v 0.000000 -0.490393 0.097545 +v -0.019030 0.490393 0.095671 +v -0.037329 0.461940 0.187665 +v -0.054193 0.415735 0.272448 +v -0.068975 0.353553 0.346760 +v -0.081106 0.277785 0.407746 +v -0.090120 0.191342 0.453064 +v -0.095671 0.097545 0.480970 +v -0.097545 0.000000 0.490393 +v -0.095671 -0.097545 0.480970 +v -0.090120 -0.191342 0.453064 +v -0.081106 -0.277785 0.407746 +v -0.068975 -0.353553 0.346760 +v -0.054193 -0.415735 0.272447 +v -0.037329 -0.461940 0.187665 +v -0.019030 -0.490393 0.095671 +v -0.037329 0.490393 0.090120 +v -0.073223 0.461940 0.176777 +v -0.106304 0.415735 0.256640 +v -0.135299 0.353553 0.326641 +v -0.159095 0.277785 0.384089 +v -0.176777 0.191342 0.426777 +v -0.187665 0.097545 0.453063 +v -0.191342 0.000000 0.461940 +v -0.187665 -0.097545 0.453063 +v -0.176777 -0.191342 0.426777 +v -0.159095 -0.277785 0.384089 +v -0.135299 -0.353553 0.326641 +v -0.106304 -0.415735 0.256640 +v -0.073223 -0.461940 0.176777 +v -0.037329 -0.490393 0.090120 +v -0.054193 0.490393 0.081106 +v -0.106304 0.461940 0.159095 +v -0.154329 0.415735 0.230970 +v -0.196424 0.353553 0.293969 +v -0.230970 0.277785 0.345671 +v -0.256640 0.191342 0.384089 +v -0.272447 0.097545 0.407746 +v -0.277785 0.000000 0.415735 +v -0.272447 -0.097545 0.407746 +v -0.256640 -0.191342 0.384089 +v -0.230970 -0.277785 0.345671 +v -0.196424 -0.353553 0.293969 +v -0.154329 -0.415735 0.230970 +v -0.106304 -0.461940 0.159095 +v -0.054193 -0.490393 0.081106 +v -0.068975 0.490393 0.068975 +v -0.135299 0.461940 0.135299 +v -0.196424 0.415735 0.196424 +v -0.250000 0.353553 0.250000 +v -0.293969 0.277785 0.293969 +v -0.326641 0.191342 0.326641 +v -0.346760 0.097545 0.346760 +v -0.353553 0.000000 0.353553 +v -0.346760 -0.097545 0.346760 +v -0.326641 -0.191342 0.326641 +v -0.293969 -0.277785 0.293969 +v -0.250000 -0.353553 0.250000 +v -0.196424 -0.415735 0.196424 +v -0.135299 -0.461940 0.135299 +v -0.068975 -0.490393 0.068975 +v -0.081106 0.490393 0.054193 +v -0.159095 0.461940 0.106304 +v -0.230970 0.415735 0.154329 +v -0.293969 0.353553 0.196424 +v -0.345671 0.277785 0.230970 +v -0.384089 0.191342 0.256640 +v -0.407746 0.097545 0.272447 +v -0.415735 0.000000 0.277785 +v -0.407746 -0.097545 0.272447 +v -0.384089 -0.191342 0.256640 +v -0.345671 -0.277785 0.230970 +v -0.293969 -0.353553 0.196424 +v -0.230970 -0.415735 0.154329 +v -0.159095 -0.461940 0.106304 +v -0.081106 -0.490393 0.054193 +v -0.090120 0.490393 0.037329 +v -0.176776 0.461940 0.073223 +v -0.256640 0.415735 0.106304 +v -0.326641 0.353553 0.135299 +v -0.384089 0.277785 0.159095 +v -0.426776 0.191342 0.176777 +v -0.453063 0.097545 0.187665 +v -0.461939 0.000000 0.191342 +v -0.453063 -0.097545 0.187665 +v -0.426776 -0.191342 0.176777 +v -0.384089 -0.277785 0.159095 +v -0.326641 -0.353553 0.135299 +v -0.256640 -0.415735 0.106304 +v -0.176776 -0.461940 0.073223 +v -0.090120 -0.490393 0.037329 +v -0.095671 0.490393 0.019030 +v -0.187665 0.461940 0.037329 +v -0.272447 0.415735 0.054193 +v -0.346760 0.353553 0.068975 +v -0.407746 0.277785 0.081106 +v -0.453063 0.191342 0.090120 +v -0.480969 0.097545 0.095671 +v -0.490392 0.000000 0.097545 +v -0.480969 -0.097545 0.095671 +v -0.453063 -0.191342 0.090120 +v -0.407746 -0.277785 0.081106 +v -0.346760 -0.353553 0.068975 +v -0.272447 -0.415735 0.054193 +v -0.187665 -0.461940 0.037329 +v -0.095671 -0.490393 0.019030 +v -0.013167 -0.495196 0.000000 +v -0.005039 0.495196 0.012165 +v -0.013167 0.495196 0.000000 +v -0.012914 0.495196 -0.002569 +v -0.012914 -0.495196 -0.002569 +v -0.012165 0.495196 -0.005039 +v -0.012165 -0.495196 -0.005039 +v -0.010948 0.495196 -0.007315 +v -0.010948 -0.495196 -0.007315 +v -0.009311 0.495196 -0.009311 +v -0.009311 -0.495196 -0.009311 +v -0.007315 0.495196 -0.010948 +v -0.007315 -0.495196 -0.010948 +v -0.005039 0.495196 -0.012165 +v -0.005039 -0.495196 -0.012165 +v -0.002569 0.495196 -0.012914 +v -0.002569 -0.495196 -0.012914 +v 0.000000 0.495196 -0.013167 +v 0.000000 -0.495196 -0.013167 +v 0.002569 0.495196 -0.012914 +v 0.002569 -0.495196 -0.012914 +v 0.005039 0.495196 -0.012165 +v 0.005039 -0.495196 -0.012165 +v 0.007316 0.495196 -0.010948 +v 0.007316 -0.495196 -0.010948 +v 0.009311 0.495196 -0.009311 +v 0.009311 -0.495196 -0.009311 +v 0.010948 0.495196 -0.007315 +v 0.010948 -0.495196 -0.007315 +v 0.012165 0.495196 -0.005039 +v 0.012165 -0.495196 -0.005039 +v 0.012915 0.495196 -0.002569 +v 0.012915 -0.495196 -0.002569 +v 0.013168 0.495196 0.000000 +v 0.013168 -0.495196 0.000000 +v 0.012915 0.495196 0.002569 +v 0.012915 -0.495196 0.002569 +v 0.012165 0.495196 0.005039 +v 0.012165 -0.495196 0.005039 +v 0.010948 0.495196 0.007315 +v 0.010948 -0.495196 0.007315 +v 0.009311 0.495196 0.009311 +v 0.009311 -0.495196 0.009311 +v 0.007316 0.495196 0.010948 +v 0.007316 -0.495196 0.010948 +v 0.005039 0.495196 0.012165 +v 0.005039 -0.495196 0.012165 +v 0.002569 0.495196 0.012914 +v 0.002569 -0.495196 0.012914 +v 0.000000 0.495196 0.013167 +v 0.000000 -0.495196 0.013167 +v -0.002569 0.495196 0.012914 +v -0.002569 -0.495196 0.012914 +v -0.005039 -0.495196 0.012165 +v -0.007315 0.495196 0.010948 +v -0.007315 -0.495196 0.010948 +v -0.009311 0.495196 0.009311 +v -0.009311 -0.495196 0.009311 +v -0.010948 0.495196 0.007315 +v -0.010948 -0.495196 0.007315 +v -0.012165 0.495196 0.005039 +v -0.012165 -0.495196 0.005039 +v -0.012914 0.495196 0.002569 +v -0.012914 -0.495196 0.002569 +vt 0.437500 0.750000 +vt 0.437500 0.812500 +vt 0.375000 0.812500 +vt 0.375000 0.750000 +vt 0.437500 0.062500 +vt 0.437500 0.125000 +vt 0.375000 0.125000 +vt 0.375000 0.062500 +vt 0.437500 0.875000 +vt 0.437500 0.937500 +vt 0.375000 0.937500 +vt 0.375000 0.875000 +vt 0.437500 0.187500 +vt 0.437500 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.187500 +vt 0.437500 0.312500 +vt 0.437500 0.375000 +vt 0.375000 0.375000 +vt 0.375000 0.312500 +vt 0.437500 0.437500 +vt 0.437500 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.437500 +vt 0.437500 0.562500 +vt 0.437500 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.437500 0.687500 +vt 0.375000 0.687500 +vt 0.312500 0.437500 +vt 0.312500 0.375000 +vt 0.312500 0.562500 +vt 0.312500 0.500000 +vt 0.312500 0.687500 +vt 0.312500 0.625000 +vt 0.312500 0.812500 +vt 0.312500 0.750000 +vt 0.312500 0.125000 +vt 0.312500 0.062500 +vt 0.312500 0.937500 +vt 0.312500 0.875000 +vt 0.312500 0.250000 +vt 0.312500 0.187500 +vt 0.312500 0.312500 +vt 0.250000 0.437500 +vt 0.250000 0.375000 +vt 0.250000 0.562500 +vt 0.250000 0.500000 +vt 0.250000 0.687500 +vt 0.250000 0.625000 +vt 0.250000 0.812500 +vt 0.250000 0.750000 +vt 0.250000 0.125000 +vt 0.250000 0.062500 +vt 0.250000 0.937500 +vt 0.250000 0.875000 +vt 0.250000 0.250000 +vt 0.250000 0.187500 +vt 0.250000 0.312500 +vt 0.187500 0.437500 +vt 0.187500 0.375000 +vt 0.187500 0.562500 +vt 0.187500 0.500000 +vt 0.187500 0.687500 +vt 0.187500 0.625000 +vt 0.187500 0.812500 +vt 0.187500 0.750000 +vt 0.187500 0.125000 +vt 0.187500 0.062500 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.187500 0.250000 +vt 0.187500 0.187500 +vt 0.187500 0.312500 +vt 0.125000 0.437500 +vt 0.125000 0.375000 +vt 0.125000 0.562500 +vt 0.125000 0.500000 +vt 0.125000 0.687500 +vt 0.125000 0.625000 +vt 0.125000 0.812500 +vt 0.125000 0.750000 +vt 0.125000 0.125000 +vt 0.125000 0.062500 +vt 0.125000 0.937500 +vt 0.125000 0.875000 +vt 0.125000 0.250000 +vt 0.125000 0.187500 +vt 0.125000 0.312500 +vt 0.062500 0.437500 +vt 0.062500 0.375000 +vt 0.062500 0.562500 +vt 0.062500 0.500000 +vt 0.062500 0.687500 +vt 0.062500 0.625000 +vt 0.062500 0.812500 +vt 0.062500 0.750000 +vt 0.062500 0.125000 +vt 0.062500 0.062500 +vt 0.062500 0.937500 +vt 0.062500 0.875000 +vt 0.062500 0.250000 +vt 0.062500 0.187500 +vt 0.062500 0.312500 +vt 0.000000 0.437500 +vt 0.000000 0.375000 +vt 0.000000 0.562500 +vt 0.000000 0.500000 +vt 0.000000 0.687500 +vt 0.000000 0.625000 +vt 0.000000 0.812500 +vt 0.000000 0.750000 +vt 0.000000 0.125000 +vt 0.000000 0.062500 +vt 0.000000 0.937500 +vt 0.000000 0.875000 +vt 0.000000 0.250000 +vt 0.000000 0.187500 +vt 0.000000 0.312500 +vt 1.000000 0.375000 +vt 1.000000 0.437500 +vt 0.937500 0.437500 +vt 0.937500 0.375000 +vt 1.000000 0.500000 +vt 1.000000 0.562500 +vt 0.937500 0.562500 +vt 0.937500 0.500000 +vt 1.000000 0.625000 +vt 1.000000 0.687500 +vt 0.937500 0.687500 +vt 0.937500 0.625000 +vt 1.000000 0.750000 +vt 1.000000 0.812500 +vt 0.937500 0.812500 +vt 0.937500 0.750000 +vt 1.000000 0.062500 +vt 1.000000 0.125000 +vt 0.937500 0.125000 +vt 0.937500 0.062500 +vt 1.000000 0.875000 +vt 1.000000 0.937500 +vt 0.937500 0.937500 +vt 0.937500 0.875000 +vt 1.000000 0.187500 +vt 1.000000 0.250000 +vt 0.937500 0.250000 +vt 0.937500 0.187500 +vt 1.000000 0.312500 +vt 0.937500 0.312500 +vt 0.875000 0.437500 +vt 0.875000 0.375000 +vt 0.875000 0.562500 +vt 0.875000 0.500000 +vt 0.875000 0.687500 +vt 0.875000 0.625000 +vt 0.875000 0.812500 +vt 0.875000 0.750000 +vt 0.875000 0.125000 +vt 0.875000 0.062500 +vt 0.875000 0.937500 +vt 0.875000 0.875000 +vt 0.875000 0.250000 +vt 0.875000 0.187500 +vt 0.875000 0.312500 +vt 0.812500 0.437500 +vt 0.812500 0.375000 +vt 0.812500 0.562500 +vt 0.812500 0.500000 +vt 0.812500 0.687500 +vt 0.812500 0.625000 +vt 0.812500 0.812500 +vt 0.812500 0.750000 +vt 0.812500 0.125000 +vt 0.812500 0.062500 +vt 0.812500 0.937500 +vt 0.812500 0.875000 +vt 0.812500 0.250000 +vt 0.812500 0.187500 +vt 0.812500 0.312500 +vt 0.750000 0.437500 +vt 0.750000 0.375000 +vt 0.750000 0.562500 +vt 0.750000 0.500000 +vt 0.750000 0.687500 +vt 0.750000 0.625000 +vt 0.750000 0.812500 +vt 0.750000 0.750000 +vt 0.750000 0.125000 +vt 0.750000 0.062500 +vt 0.750000 0.937500 +vt 0.750000 0.875000 +vt 0.750000 0.250000 +vt 0.750000 0.187500 +vt 0.750000 0.312500 +vt 0.687500 0.437500 +vt 0.687500 0.375000 +vt 0.687500 0.562500 +vt 0.687500 0.500000 +vt 0.687500 0.687500 +vt 0.687500 0.625000 +vt 0.687500 0.812500 +vt 0.687500 0.750000 +vt 0.687500 0.125000 +vt 0.687500 0.062500 +vt 0.687500 0.937500 +vt 0.687500 0.875000 +vt 0.687500 0.250000 +vt 0.687500 0.187500 +vt 0.687500 0.312500 +vt 0.625000 0.437500 +vt 0.625000 0.375000 +vt 0.625000 0.562500 +vt 0.625000 0.500000 +vt 0.625000 0.687500 +vt 0.625000 0.625000 +vt 0.625000 0.812500 +vt 0.625000 0.750000 +vt 0.625000 0.125000 +vt 0.625000 0.062500 +vt 0.625000 0.937500 +vt 0.625000 0.875000 +vt 0.625000 0.250000 +vt 0.625000 0.187500 +vt 0.625000 0.312500 +vt 0.562500 0.437500 +vt 0.562500 0.375000 +vt 0.562500 0.562500 +vt 0.562500 0.500000 +vt 0.562500 0.687500 +vt 0.562500 0.625000 +vt 0.562500 0.812500 +vt 0.562500 0.750000 +vt 0.562500 0.125000 +vt 0.562500 0.062500 +vt 0.562500 0.937500 +vt 0.562500 0.875000 +vt 0.562500 0.250000 +vt 0.562500 0.187500 +vt 0.562500 0.312500 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.500000 0.562500 +vt 0.500000 0.500000 +vt 0.500000 0.687500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.500000 0.750000 +vt 0.500000 0.125000 +vt 0.500000 0.062500 +vt 0.500000 0.937500 +vt 0.500000 0.875000 +vt 0.500000 0.250000 +vt 0.500000 0.187500 +vt 0.500000 0.312500 +vt 0.437500 0.000000 +vt 0.375000 0.000000 +vt 0.312500 0.000000 +vt 0.250000 0.000000 +vt 0.187500 0.000000 +vt 0.125000 0.000000 +vt 0.062500 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.875000 0.000000 +vt 0.812500 0.000000 +vt 0.750000 0.000000 +vt 0.687500 0.000000 +vt 0.625000 0.000000 +vt 0.562500 0.000000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.437500 1.000000 +vt 0.562500 1.000000 +vt 0.625000 1.000000 +vt 0.687500 1.000000 +vt 0.750000 1.000000 +vt 0.812500 1.000000 +vt 0.875000 1.000000 +vt 0.937500 1.000000 +vt 1.000000 1.000000 +vt 0.062500 1.000000 +vt -0.000000 1.000000 +vt 0.125000 1.000000 +vt 0.187500 1.000000 +vt 0.250000 1.000000 +vt 0.312500 1.000000 +vt 0.375000 1.000000 +vt 0.031303 0.999906 +vt 0.037377 0.999307 +vt 0.043218 0.997535 +vt 0.048601 0.994658 +vt 0.053319 0.990786 +vt 0.057192 0.986068 +vt 0.060069 0.980685 +vt 0.061841 0.974844 +vt 0.062439 0.968769 +vt 0.061841 0.962695 +vt 0.060069 0.956854 +vt 0.057192 0.951471 +vt 0.053319 0.946753 +vt 0.048601 0.942881 +vt 0.043218 0.940004 +vt 0.037377 0.938232 +vt 0.031303 0.937633 +vt 0.025229 0.938232 +vt 0.019388 0.940004 +vt 0.014005 0.942881 +vt 0.009286 0.946753 +vt 0.005414 0.951471 +vt 0.002537 0.956854 +vt 0.000765 0.962695 +vt 0.000167 0.968770 +vt 0.000765 0.974844 +vt 0.002537 0.980685 +vt 0.005414 0.986068 +vt 0.009286 0.990786 +vt 0.014005 0.994658 +vt 0.019388 0.997535 +vt 0.025229 0.999307 +vn -0.710100 0.704000 0.000000 +vn -0.559800 0.828600 0.000000 +vn -0.549000 0.828600 -0.109200 +vn -0.696500 0.704000 -0.138500 +vn -0.182000 -0.983300 0.000000 +vn -0.387900 -0.921700 0.000000 +vn -0.380400 -0.921700 -0.075700 +vn -0.178400 -0.983300 -0.035500 +vn -0.387900 0.921700 0.000000 +vn -0.182000 0.983300 0.000000 +vn -0.178400 0.983300 -0.035500 +vn -0.380400 0.921700 -0.075700 +vn -0.559800 -0.828600 0.000000 +vn -0.710100 -0.704000 0.000000 +vn -0.696500 -0.704000 -0.138500 +vn -0.549000 -0.828600 -0.109200 +vn -0.833300 -0.552800 0.000000 +vn -0.924700 -0.380500 0.000000 +vn -0.907000 -0.380500 -0.180400 +vn -0.817300 -0.552800 -0.162600 +vn -0.981000 -0.193900 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.980800 0.000000 -0.195100 +vn -0.962200 -0.193900 -0.191400 +vn -0.981000 0.193900 0.000000 +vn -0.924700 0.380500 0.000000 +vn -0.907000 0.380500 -0.180400 +vn -0.962200 0.193900 -0.191400 +vn -0.833300 0.552800 0.000000 +vn -0.817300 0.552800 -0.162600 +vn -0.906300 -0.193900 -0.375400 +vn -0.854400 -0.380500 -0.353900 +vn -0.906300 0.193900 -0.375400 +vn -0.923900 0.000000 -0.382700 +vn -0.769900 0.552800 -0.318900 +vn -0.854400 0.380500 -0.353900 +vn -0.517100 0.828600 -0.214200 +vn -0.656100 0.704000 -0.271700 +vn -0.358300 -0.921700 -0.148400 +vn -0.168100 -0.983300 -0.069600 +vn -0.168100 0.983300 -0.069600 +vn -0.358300 0.921700 -0.148400 +vn -0.656100 -0.704000 -0.271700 +vn -0.517100 -0.828600 -0.214200 +vn -0.769900 -0.552800 -0.318900 +vn -0.815700 -0.193900 -0.545000 +vn -0.768900 -0.380500 -0.513700 +vn -0.815700 0.193900 -0.545000 +vn -0.831400 0.000000 -0.555600 +vn -0.692900 0.552800 -0.463000 +vn -0.768900 0.380500 -0.513700 +vn -0.465400 0.828600 -0.311000 +vn -0.590400 0.704000 -0.394500 +vn -0.322500 -0.921700 -0.215500 +vn -0.151300 -0.983300 -0.101100 +vn -0.151300 0.983300 -0.101100 +vn -0.322500 0.921700 -0.215500 +vn -0.590400 -0.704000 -0.394500 +vn -0.465400 -0.828600 -0.311000 +vn -0.692900 -0.552800 -0.463000 +vn -0.693700 -0.193900 -0.693700 +vn -0.653900 -0.380500 -0.653900 +vn -0.693700 0.193900 -0.693700 +vn -0.707100 0.000000 -0.707100 +vn -0.589300 0.552800 -0.589300 +vn -0.653900 0.380500 -0.653900 +vn -0.395800 0.828600 -0.395800 +vn -0.502100 0.704000 -0.502100 +vn -0.274300 -0.921700 -0.274300 +vn -0.128600 -0.983300 -0.128600 +vn -0.128600 0.983300 -0.128600 +vn -0.274300 0.921700 -0.274300 +vn -0.502100 -0.704000 -0.502100 +vn -0.395800 -0.828600 -0.395800 +vn -0.589300 -0.552800 -0.589300 +vn -0.545000 -0.193900 -0.815700 +vn -0.513700 -0.380500 -0.768900 +vn -0.545000 0.193900 -0.815700 +vn -0.555600 0.000000 -0.831400 +vn -0.463000 0.552800 -0.692900 +vn -0.513700 0.380500 -0.768900 +vn -0.311000 0.828600 -0.465400 +vn -0.394500 0.704000 -0.590400 +vn -0.215500 -0.921700 -0.322500 +vn -0.101100 -0.983300 -0.151300 +vn -0.101100 0.983300 -0.151300 +vn -0.215500 0.921700 -0.322500 +vn -0.394500 -0.704000 -0.590400 +vn -0.311000 -0.828600 -0.465400 +vn -0.463000 -0.552800 -0.692900 +vn -0.375400 -0.193900 -0.906300 +vn -0.353900 -0.380500 -0.854400 +vn -0.375400 0.193900 -0.906300 +vn -0.382700 0.000000 -0.923900 +vn -0.318900 0.552800 -0.769900 +vn -0.353900 0.380500 -0.854400 +vn -0.214200 0.828600 -0.517100 +vn -0.271700 0.704000 -0.656100 +vn -0.148400 -0.921700 -0.358300 +vn -0.069600 -0.983300 -0.168100 +vn -0.069600 0.983300 -0.168100 +vn -0.148400 0.921700 -0.358300 +vn -0.271700 -0.704000 -0.656100 +vn -0.214200 -0.828600 -0.517100 +vn -0.318900 -0.552800 -0.769900 +vn -0.191400 -0.193900 -0.962200 +vn -0.180400 -0.380500 -0.907000 +vn -0.191400 0.193900 -0.962200 +vn -0.195100 0.000000 -0.980800 +vn -0.162600 0.552800 -0.817300 +vn -0.180400 0.380500 -0.907000 +vn -0.109200 0.828600 -0.549000 +vn -0.138500 0.704000 -0.696500 +vn -0.075700 -0.921700 -0.380400 +vn -0.035500 -0.983300 -0.178400 +vn -0.035500 0.983300 -0.178400 +vn -0.075700 0.921700 -0.380400 +vn -0.138500 -0.704000 -0.696500 +vn -0.109200 -0.828600 -0.549000 +vn -0.162600 -0.552800 -0.817300 +vn 0.000000 -0.193900 -0.981000 +vn 0.000000 -0.380500 -0.924700 +vn 0.000000 0.193900 -0.981000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.552800 -0.833300 +vn 0.000000 0.380500 -0.924700 +vn 0.000000 0.828600 -0.559800 +vn 0.000000 0.704000 -0.710100 +vn 0.000000 -0.921700 -0.387900 +vn 0.000000 -0.983300 -0.182000 +vn 0.000000 0.983300 -0.182000 +vn 0.000000 0.921700 -0.387900 +vn 0.000000 -0.704000 -0.710100 +vn 0.000000 -0.828600 -0.559800 +vn 0.000000 -0.552800 -0.833300 +vn 0.191400 -0.193900 -0.962200 +vn 0.180400 -0.380500 -0.907000 +vn 0.191400 0.193900 -0.962200 +vn 0.195100 0.000000 -0.980800 +vn 0.162600 0.552800 -0.817300 +vn 0.180400 0.380500 -0.907000 +vn 0.109200 0.828600 -0.549000 +vn 0.138500 0.704000 -0.696500 +vn 0.075700 -0.921700 -0.380400 +vn 0.035500 -0.983300 -0.178400 +vn 0.035500 0.983300 -0.178400 +vn 0.075700 0.921700 -0.380400 +vn 0.138500 -0.704000 -0.696500 +vn 0.109200 -0.828600 -0.549000 +vn 0.162600 -0.552800 -0.817300 +vn 0.375400 -0.193900 -0.906300 +vn 0.353900 -0.380500 -0.854400 +vn 0.375400 0.193900 -0.906300 +vn 0.382700 0.000000 -0.923900 +vn 0.318900 0.552800 -0.769900 +vn 0.353900 0.380500 -0.854400 +vn 0.214200 0.828600 -0.517100 +vn 0.271700 0.704000 -0.656100 +vn 0.148400 -0.921700 -0.358300 +vn 0.069600 -0.983300 -0.168100 +vn 0.069600 0.983300 -0.168100 +vn 0.148400 0.921700 -0.358300 +vn 0.271700 -0.704000 -0.656100 +vn 0.214200 -0.828600 -0.517100 +vn 0.318900 -0.552800 -0.769900 +vn 0.545000 -0.193900 -0.815700 +vn 0.513700 -0.380500 -0.768900 +vn 0.545000 0.193900 -0.815700 +vn 0.555600 0.000000 -0.831400 +vn 0.463000 0.552800 -0.692900 +vn 0.513700 0.380500 -0.768900 +vn 0.311000 0.828600 -0.465400 +vn 0.394500 0.704000 -0.590400 +vn 0.215500 -0.921700 -0.322500 +vn 0.101100 -0.983300 -0.151300 +vn 0.101100 0.983300 -0.151300 +vn 0.215500 0.921700 -0.322500 +vn 0.394500 -0.704000 -0.590400 +vn 0.311000 -0.828600 -0.465400 +vn 0.463000 -0.552800 -0.692900 +vn 0.693700 -0.193900 -0.693700 +vn 0.653900 -0.380500 -0.653900 +vn 0.693700 0.193900 -0.693700 +vn 0.707100 0.000000 -0.707100 +vn 0.589300 0.552800 -0.589300 +vn 0.653900 0.380500 -0.653900 +vn 0.395800 0.828600 -0.395800 +vn 0.502100 0.704000 -0.502100 +vn 0.274300 -0.921700 -0.274300 +vn 0.128600 -0.983300 -0.128600 +vn 0.128600 0.983300 -0.128600 +vn 0.274300 0.921700 -0.274300 +vn 0.502100 -0.704000 -0.502100 +vn 0.395800 -0.828600 -0.395800 +vn 0.589300 -0.552800 -0.589300 +vn 0.815700 -0.193900 -0.545000 +vn 0.768900 -0.380500 -0.513700 +vn 0.815700 0.193900 -0.545000 +vn 0.831400 0.000000 -0.555600 +vn 0.692900 0.552800 -0.463000 +vn 0.768900 0.380500 -0.513700 +vn 0.465400 0.828600 -0.311000 +vn 0.590400 0.704000 -0.394500 +vn 0.322500 -0.921700 -0.215500 +vn 0.151300 -0.983300 -0.101100 +vn 0.151300 0.983300 -0.101100 +vn 0.322500 0.921700 -0.215500 +vn 0.590400 -0.704000 -0.394500 +vn 0.465400 -0.828600 -0.311000 +vn 0.692900 -0.552800 -0.463000 +vn 0.906300 -0.193900 -0.375400 +vn 0.854400 -0.380500 -0.353900 +vn 0.906300 0.193900 -0.375400 +vn 0.923900 0.000000 -0.382700 +vn 0.769900 0.552800 -0.318900 +vn 0.854400 0.380500 -0.353900 +vn 0.517100 0.828600 -0.214200 +vn 0.656100 0.704000 -0.271700 +vn 0.358300 -0.921700 -0.148400 +vn 0.168100 -0.983300 -0.069600 +vn 0.168100 0.983300 -0.069600 +vn 0.358300 0.921700 -0.148400 +vn 0.656100 -0.704000 -0.271700 +vn 0.517100 -0.828600 -0.214200 +vn 0.769900 -0.552800 -0.318900 +vn 0.962200 -0.193900 -0.191400 +vn 0.907000 -0.380500 -0.180400 +vn 0.962200 0.193900 -0.191400 +vn 0.980800 0.000000 -0.195100 +vn 0.817300 0.552800 -0.162600 +vn 0.907000 0.380500 -0.180400 +vn 0.549000 0.828600 -0.109200 +vn 0.696500 0.704000 -0.138500 +vn 0.380400 -0.921700 -0.075700 +vn 0.178400 -0.983300 -0.035500 +vn 0.178400 0.983300 -0.035500 +vn 0.380400 0.921700 -0.075700 +vn 0.696500 -0.704000 -0.138500 +vn 0.549000 -0.828600 -0.109200 +vn 0.817300 -0.552800 -0.162600 +vn 0.981000 -0.193900 0.000000 +vn 0.924700 -0.380500 0.000000 +vn 0.981000 0.193900 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.833300 0.552800 0.000000 +vn 0.924700 0.380500 0.000000 +vn 0.559800 0.828600 0.000000 +vn 0.710100 0.704000 0.000000 +vn 0.387900 -0.921700 0.000000 +vn 0.182000 -0.983300 0.000000 +vn 0.182000 0.983300 0.000000 +vn 0.387900 0.921700 0.000000 +vn 0.710100 -0.704000 0.000000 +vn 0.559800 -0.828600 0.000000 +vn 0.833300 -0.552800 0.000000 +vn 0.962200 -0.193900 0.191400 +vn 0.907000 -0.380500 0.180400 +vn 0.962200 0.193900 0.191400 +vn 0.980800 0.000000 0.195100 +vn 0.817300 0.552800 0.162600 +vn 0.907000 0.380500 0.180400 +vn 0.549000 0.828600 0.109200 +vn 0.696500 0.704000 0.138500 +vn 0.380400 -0.921700 0.075700 +vn 0.178400 -0.983300 0.035500 +vn 0.178400 0.983300 0.035500 +vn 0.380400 0.921700 0.075700 +vn 0.696500 -0.704000 0.138500 +vn 0.549000 -0.828600 0.109200 +vn 0.817300 -0.552800 0.162600 +vn 0.906300 -0.193900 0.375400 +vn 0.854400 -0.380500 0.353900 +vn 0.906300 0.193900 0.375400 +vn 0.923900 0.000000 0.382700 +vn 0.769900 0.552800 0.318900 +vn 0.854400 0.380500 0.353900 +vn 0.517100 0.828600 0.214200 +vn 0.656100 0.704000 0.271700 +vn 0.358300 -0.921700 0.148400 +vn 0.168100 -0.983300 0.069600 +vn 0.168100 0.983300 0.069600 +vn 0.358300 0.921700 0.148400 +vn 0.656100 -0.704000 0.271700 +vn 0.517100 -0.828600 0.214200 +vn 0.769900 -0.552800 0.318900 +vn 0.815700 -0.193900 0.545000 +vn 0.768900 -0.380500 0.513700 +vn 0.815700 0.193900 0.545000 +vn 0.831400 0.000000 0.555600 +vn 0.692900 0.552800 0.463000 +vn 0.768900 0.380500 0.513700 +vn 0.465400 0.828600 0.311000 +vn 0.590400 0.704000 0.394500 +vn 0.322500 -0.921700 0.215500 +vn 0.151300 -0.983300 0.101100 +vn 0.151300 0.983300 0.101100 +vn 0.322500 0.921700 0.215500 +vn 0.590400 -0.704000 0.394500 +vn 0.465400 -0.828600 0.311000 +vn 0.692900 -0.552800 0.463000 +vn 0.693700 -0.193900 0.693700 +vn 0.653900 -0.380500 0.653900 +vn 0.693700 0.193900 0.693700 +vn 0.707100 0.000000 0.707100 +vn 0.589300 0.552800 0.589300 +vn 0.653900 0.380500 0.653900 +vn 0.395800 0.828600 0.395800 +vn 0.502100 0.704000 0.502100 +vn 0.274300 -0.921700 0.274300 +vn 0.128600 -0.983300 0.128600 +vn 0.128600 0.983300 0.128600 +vn 0.274300 0.921700 0.274300 +vn 0.502100 -0.704000 0.502100 +vn 0.395800 -0.828600 0.395800 +vn 0.589300 -0.552800 0.589300 +vn 0.545000 -0.193900 0.815700 +vn 0.513700 -0.380500 0.768900 +vn 0.545000 0.193900 0.815700 +vn 0.555600 0.000000 0.831400 +vn 0.463000 0.552800 0.692900 +vn 0.513700 0.380500 0.768900 +vn 0.311000 0.828600 0.465400 +vn 0.394500 0.704000 0.590400 +vn 0.215500 -0.921700 0.322500 +vn 0.101100 -0.983300 0.151300 +vn 0.101100 0.983300 0.151300 +vn 0.215500 0.921700 0.322500 +vn 0.394500 -0.704000 0.590400 +vn 0.311000 -0.828600 0.465400 +vn 0.463000 -0.552800 0.692900 +vn 0.375400 -0.193900 0.906300 +vn 0.353900 -0.380500 0.854400 +vn 0.375400 0.193900 0.906300 +vn 0.382700 0.000000 0.923900 +vn 0.318900 0.552800 0.769900 +vn 0.353900 0.380500 0.854400 +vn 0.214200 0.828600 0.517100 +vn 0.271700 0.704000 0.656100 +vn 0.148400 -0.921700 0.358300 +vn 0.069600 -0.983300 0.168100 +vn 0.069600 0.983300 0.168100 +vn 0.148400 0.921700 0.358300 +vn 0.271700 -0.704000 0.656100 +vn 0.214200 -0.828600 0.517100 +vn 0.318900 -0.552800 0.769900 +vn 0.191400 -0.193900 0.962200 +vn 0.180400 -0.380500 0.907000 +vn 0.191400 0.193900 0.962200 +vn 0.195100 0.000000 0.980800 +vn 0.162600 0.552800 0.817300 +vn 0.180400 0.380500 0.907000 +vn 0.109200 0.828600 0.549000 +vn 0.138500 0.704000 0.696500 +vn 0.075700 -0.921700 0.380400 +vn 0.035500 -0.983300 0.178400 +vn 0.035500 0.983300 0.178400 +vn 0.075700 0.921700 0.380400 +vn 0.138500 -0.704000 0.696500 +vn 0.109200 -0.828600 0.549000 +vn 0.162600 -0.552800 0.817300 +vn 0.000000 -0.193900 0.981000 +vn 0.000000 -0.380500 0.924700 +vn 0.000000 0.193900 0.981000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.552800 0.833300 +vn 0.000000 0.380500 0.924700 +vn 0.000000 0.828600 0.559800 +vn 0.000000 0.704000 0.710100 +vn 0.000000 -0.921700 0.387900 +vn 0.000000 -0.983300 0.182000 +vn 0.000000 0.983300 0.182000 +vn 0.000000 0.921700 0.387900 +vn 0.000000 -0.704000 0.710100 +vn 0.000000 -0.828600 0.559800 +vn 0.000000 -0.552800 0.833300 +vn -0.191400 -0.193900 0.962200 +vn -0.180400 -0.380500 0.907000 +vn -0.191400 0.193900 0.962200 +vn -0.195100 0.000000 0.980800 +vn -0.162600 0.552800 0.817300 +vn -0.180400 0.380500 0.907000 +vn -0.109200 0.828600 0.549000 +vn -0.138500 0.704000 0.696500 +vn -0.075700 -0.921700 0.380400 +vn -0.035500 -0.983300 0.178400 +vn -0.035500 0.983300 0.178400 +vn -0.075700 0.921700 0.380400 +vn -0.138500 -0.704000 0.696500 +vn -0.109200 -0.828600 0.549000 +vn -0.162600 -0.552800 0.817300 +vn -0.375400 -0.193900 0.906300 +vn -0.353900 -0.380500 0.854400 +vn -0.375400 0.193900 0.906300 +vn -0.382700 0.000000 0.923900 +vn -0.318900 0.552800 0.769900 +vn -0.353900 0.380500 0.854400 +vn -0.214200 0.828600 0.517100 +vn -0.271700 0.704000 0.656100 +vn -0.148400 -0.921700 0.358300 +vn -0.069600 -0.983300 0.168100 +vn -0.069600 0.983300 0.168100 +vn -0.148400 0.921700 0.358300 +vn -0.271700 -0.704000 0.656100 +vn -0.214200 -0.828600 0.517100 +vn -0.318900 -0.552800 0.769900 +vn -0.545000 -0.193900 0.815700 +vn -0.513700 -0.380500 0.768900 +vn -0.545000 0.193900 0.815700 +vn -0.555600 0.000000 0.831400 +vn -0.463000 0.552800 0.692900 +vn -0.513700 0.380500 0.768900 +vn -0.311000 0.828600 0.465400 +vn -0.394500 0.704000 0.590400 +vn -0.215500 -0.921700 0.322500 +vn -0.101100 -0.983300 0.151300 +vn -0.101100 0.983300 0.151300 +vn -0.215500 0.921700 0.322500 +vn -0.394500 -0.704000 0.590400 +vn -0.311000 -0.828600 0.465400 +vn -0.463000 -0.552800 0.692900 +vn -0.693700 -0.193900 0.693700 +vn -0.653900 -0.380500 0.653900 +vn -0.693700 0.193900 0.693700 +vn -0.707100 0.000000 0.707100 +vn -0.589300 0.552800 0.589300 +vn -0.653900 0.380500 0.653900 +vn -0.395800 0.828600 0.395800 +vn -0.502100 0.704000 0.502100 +vn -0.274300 -0.921700 0.274300 +vn -0.128600 -0.983300 0.128600 +vn -0.128600 0.983300 0.128600 +vn -0.274300 0.921700 0.274300 +vn -0.502100 -0.704000 0.502100 +vn -0.395800 -0.828600 0.395800 +vn -0.589300 -0.552800 0.589300 +vn -0.815700 -0.193900 0.545000 +vn -0.768900 -0.380500 0.513700 +vn -0.815700 0.193900 0.545000 +vn -0.831400 0.000000 0.555600 +vn -0.692900 0.552800 0.463000 +vn -0.768900 0.380500 0.513700 +vn -0.465400 0.828600 0.311000 +vn -0.590400 0.704000 0.394500 +vn -0.322500 -0.921700 0.215500 +vn -0.151300 -0.983300 0.101100 +vn -0.151300 0.983300 0.101100 +vn -0.322500 0.921700 0.215500 +vn -0.590400 -0.704000 0.394500 +vn -0.465400 -0.828600 0.311000 +vn -0.692900 -0.552800 0.463000 +vn -0.906300 -0.193900 0.375400 +vn -0.854400 -0.380500 0.353900 +vn -0.906300 0.193900 0.375400 +vn -0.923900 0.000000 0.382700 +vn -0.769900 0.552800 0.318900 +vn -0.854400 0.380500 0.353900 +vn -0.517100 0.828600 0.214200 +vn -0.656100 0.704000 0.271700 +vn -0.358300 -0.921700 0.148400 +vn -0.168100 -0.983300 0.069600 +vn -0.168100 0.983300 0.069600 +vn -0.358300 0.921700 0.148400 +vn -0.656100 -0.704000 0.271700 +vn -0.517100 -0.828600 0.214200 +vn -0.769900 -0.552800 0.318900 +vn -0.962200 -0.193900 0.191400 +vn -0.907000 -0.380500 0.180400 +vn -0.962200 0.193900 0.191400 +vn -0.980800 0.000000 0.195100 +vn -0.817300 0.552800 0.162600 +vn -0.907000 0.380500 0.180400 +vn -0.549000 0.828600 0.109200 +vn -0.696500 0.704000 0.138500 +vn -0.380400 -0.921700 0.075700 +vn -0.178400 -0.983300 0.035500 +vn -0.178400 0.983300 0.035500 +vn -0.380400 0.921700 0.075700 +vn -0.696500 -0.704000 0.138500 +vn -0.549000 -0.828600 0.109200 +vn -0.817300 -0.552800 0.162600 +vn -0.030200 -0.999500 0.000000 +vn -0.029600 -0.999500 -0.005900 +vn -0.027900 -0.999500 -0.011500 +vn -0.025100 -0.999500 -0.016800 +vn -0.021300 -0.999500 -0.021300 +vn -0.016800 -0.999500 -0.025100 +vn -0.011500 -0.999500 -0.027900 +vn -0.005900 -0.999500 -0.029600 +vn 0.000000 -0.999500 -0.030200 +vn 0.005900 -0.999500 -0.029600 +vn 0.011500 -0.999500 -0.027900 +vn 0.016800 -0.999500 -0.025100 +vn 0.021300 -0.999500 -0.021300 +vn 0.025100 -0.999500 -0.016800 +vn 0.027900 -0.999500 -0.011500 +vn 0.029600 -0.999500 -0.005900 +vn 0.030200 -0.999500 0.000000 +vn 0.029600 -0.999500 0.005900 +vn 0.027900 -0.999500 0.011500 +vn 0.025100 -0.999500 0.016800 +vn 0.021300 -0.999500 0.021300 +vn 0.016800 -0.999500 0.025100 +vn 0.011500 -0.999500 0.027900 +vn 0.005900 -0.999500 0.029600 +vn 0.000000 -0.999500 0.030200 +vn -0.005900 -0.999500 0.029600 +vn -0.011500 -0.999500 0.027900 +vn -0.016800 -0.999500 0.025100 +vn -0.021300 -0.999500 0.021300 +vn -0.025100 -0.999500 0.016800 +vn -0.027900 -0.999500 0.011500 +vn -0.029600 -0.999500 0.005900 +vn -0.029600 0.999500 0.005900 +vn -0.030200 0.999500 0.000000 +vn -0.027900 0.999500 0.011500 +vn -0.025100 0.999500 0.016800 +vn -0.021300 0.999500 0.021300 +vn -0.016800 0.999500 0.025100 +vn -0.011500 0.999500 0.027900 +vn -0.005900 0.999500 0.029600 +vn 0.000000 0.999500 0.030200 +vn 0.005900 0.999500 0.029600 +vn 0.011500 0.999500 0.027900 +vn 0.016800 0.999500 0.025100 +vn 0.021300 0.999500 0.021300 +vn 0.025100 0.999500 0.016800 +vn 0.027900 0.999500 0.011500 +vn 0.029600 0.999500 0.005900 +vn 0.030200 0.999500 0.000000 +vn 0.029600 0.999500 -0.005900 +vn 0.027900 0.999500 -0.011500 +vn 0.025100 0.999500 -0.016800 +vn 0.021300 0.999500 -0.021300 +vn 0.016800 0.999500 -0.025100 +vn 0.011500 0.999500 -0.027900 +vn 0.005900 0.999500 -0.029600 +vn 0.000000 0.999500 -0.030200 +vn -0.005900 0.999500 -0.029600 +vn -0.011500 0.999500 -0.027900 +vn -0.016800 0.999500 -0.025100 +vn -0.021300 0.999500 -0.021300 +vn -0.025100 0.999500 -0.016800 +vn -0.027900 0.999500 -0.011500 +vn -0.029600 0.999500 -0.005900 +s 1 +f 4/1/1 3/2/2 18/3/3 19/4/4 +f 15/5/5 14/6/6 29/7/7 30/8/8 +f 2/9/9 1/10/10 16/11/11 17/12/12 +f 13/13/13 12/14/14 27/15/15 28/16/16 +f 11/17/17 10/18/18 25/19/19 26/20/20 +f 9/21/21 8/22/22 23/23/23 24/24/24 +f 7/25/25 6/26/26 21/27/27 22/28/28 +f 5/29/29 4/1/1 19/4/4 20/30/30 +f 3/2/2 2/9/9 17/12/12 18/3/3 +f 14/6/6 13/13/13 28/16/16 29/7/7 +f 12/14/14 11/17/17 26/20/20 27/15/15 +f 10/18/18 9/21/21 24/24/24 25/19/19 +f 8/22/22 7/25/25 22/28/28 23/23/23 +f 6/26/26 5/29/29 20/30/30 21/27/27 +f 25/19/19 24/24/24 39/31/31 40/32/32 +f 23/23/23 22/28/28 37/33/33 38/34/34 +f 21/27/27 20/30/30 35/35/35 36/36/36 +f 19/4/4 18/3/3 33/37/37 34/38/38 +f 30/8/8 29/7/7 44/39/39 45/40/40 +f 17/12/12 16/11/11 31/41/41 32/42/42 +f 28/16/16 27/15/15 42/43/43 43/44/44 +f 26/20/20 25/19/19 40/32/32 41/45/45 +f 24/24/24 23/23/23 38/34/34 39/31/31 +f 22/28/28 21/27/27 36/36/36 37/33/33 +f 20/30/30 19/4/4 34/38/38 35/35/35 +f 18/3/3 17/12/12 32/42/42 33/37/37 +f 29/7/7 28/16/16 43/44/44 44/39/39 +f 27/15/15 26/20/20 41/45/45 42/43/43 +f 40/32/32 39/31/31 54/46/46 55/47/47 +f 38/34/34 37/33/33 52/48/48 53/49/49 +f 36/36/36 35/35/35 50/50/50 51/51/51 +f 34/38/38 33/37/37 48/52/52 49/53/53 +f 45/40/40 44/39/39 59/54/54 60/55/55 +f 32/42/42 31/41/41 46/56/56 47/57/57 +f 43/44/44 42/43/43 57/58/58 58/59/59 +f 41/45/45 40/32/32 55/47/47 56/60/60 +f 39/31/31 38/34/34 53/49/49 54/46/46 +f 37/33/33 36/36/36 51/51/51 52/48/48 +f 35/35/35 34/38/38 49/53/53 50/50/50 +f 33/37/37 32/42/42 47/57/57 48/52/52 +f 44/39/39 43/44/44 58/59/59 59/54/54 +f 42/43/43 41/45/45 56/60/60 57/58/58 +f 55/47/47 54/46/46 69/61/61 70/62/62 +f 53/49/49 52/48/48 67/63/63 68/64/64 +f 51/51/51 50/50/50 65/65/65 66/66/66 +f 49/53/53 48/52/52 63/67/67 64/68/68 +f 60/55/55 59/54/54 74/69/69 75/70/70 +f 47/57/57 46/56/56 61/71/71 62/72/72 +f 58/59/59 57/58/58 72/73/73 73/74/74 +f 56/60/60 55/47/47 70/62/62 71/75/75 +f 54/46/46 53/49/49 68/64/64 69/61/61 +f 52/48/48 51/51/51 66/66/66 67/63/63 +f 50/50/50 49/53/53 64/68/68 65/65/65 +f 48/52/52 47/57/57 62/72/72 63/67/67 +f 59/54/54 58/59/59 73/74/74 74/69/69 +f 57/58/58 56/60/60 71/75/75 72/73/73 +f 70/62/62 69/61/61 84/76/76 85/77/77 +f 68/64/64 67/63/63 82/78/78 83/79/79 +f 66/66/66 65/65/65 80/80/80 81/81/81 +f 64/68/68 63/67/67 78/82/82 79/83/83 +f 75/70/70 74/69/69 89/84/84 90/85/85 +f 62/72/72 61/71/71 76/86/86 77/87/87 +f 73/74/74 72/73/73 87/88/88 88/89/89 +f 71/75/75 70/62/62 85/77/77 86/90/90 +f 69/61/61 68/64/64 83/79/79 84/76/76 +f 67/63/63 66/66/66 81/81/81 82/78/78 +f 65/65/65 64/68/68 79/83/83 80/80/80 +f 63/67/67 62/72/72 77/87/87 78/82/82 +f 74/69/69 73/74/74 88/89/89 89/84/84 +f 72/73/73 71/75/75 86/90/90 87/88/88 +f 85/77/77 84/76/76 99/91/91 100/92/92 +f 83/79/79 82/78/78 97/93/93 98/94/94 +f 81/81/81 80/80/80 95/95/95 96/96/96 +f 79/83/83 78/82/82 93/97/97 94/98/98 +f 90/85/85 89/84/84 104/99/99 105/100/100 +f 77/87/87 76/86/86 91/101/101 92/102/102 +f 88/89/89 87/88/88 102/103/103 103/104/104 +f 86/90/90 85/77/77 100/92/92 101/105/105 +f 84/76/76 83/79/79 98/94/94 99/91/91 +f 82/78/78 81/81/81 96/96/96 97/93/93 +f 80/80/80 79/83/83 94/98/98 95/95/95 +f 78/82/82 77/87/87 92/102/102 93/97/97 +f 89/84/84 88/89/89 103/104/104 104/99/99 +f 87/88/88 86/90/90 101/105/105 102/103/103 +f 100/92/92 99/91/91 114/106/106 115/107/107 +f 98/94/94 97/93/93 112/108/108 113/109/109 +f 96/96/96 95/95/95 110/110/110 111/111/111 +f 94/98/98 93/97/97 108/112/112 109/113/113 +f 105/100/100 104/99/99 119/114/114 120/115/115 +f 92/102/102 91/101/101 106/116/116 107/117/117 +f 103/104/104 102/103/103 117/118/118 118/119/119 +f 101/105/105 100/92/92 115/107/107 116/120/120 +f 99/91/91 98/94/94 113/109/109 114/106/106 +f 97/93/93 96/96/96 111/111/111 112/108/108 +f 95/95/95 94/98/98 109/113/113 110/110/110 +f 93/97/97 92/102/102 107/117/117 108/112/112 +f 104/99/99 103/104/104 118/119/119 119/114/114 +f 102/103/103 101/105/105 116/120/120 117/118/118 +f 115/121/107 114/122/106 129/123/121 130/124/122 +f 113/125/109 112/126/108 127/127/123 128/128/124 +f 111/129/111 110/130/110 125/131/125 126/132/126 +f 109/133/113 108/134/112 123/135/127 124/136/128 +f 120/137/115 119/138/114 134/139/129 135/140/130 +f 107/141/117 106/142/116 121/143/131 122/144/132 +f 118/145/119 117/146/118 132/147/133 133/148/134 +f 116/149/120 115/121/107 130/124/122 131/150/135 +f 114/122/106 113/125/109 128/128/124 129/123/121 +f 112/126/108 111/129/111 126/132/126 127/127/123 +f 110/130/110 109/133/113 124/136/128 125/131/125 +f 108/134/112 107/141/117 122/144/132 123/135/127 +f 119/138/114 118/145/119 133/148/134 134/139/129 +f 117/146/118 116/149/120 131/150/135 132/147/133 +f 130/124/122 129/123/121 144/151/136 145/152/137 +f 128/128/124 127/127/123 142/153/138 143/154/139 +f 126/132/126 125/131/125 140/155/140 141/156/141 +f 124/136/128 123/135/127 138/157/142 139/158/143 +f 135/140/130 134/139/129 149/159/144 150/160/145 +f 122/144/132 121/143/131 136/161/146 137/162/147 +f 133/148/134 132/147/133 147/163/148 148/164/149 +f 131/150/135 130/124/122 145/152/137 146/165/150 +f 129/123/121 128/128/124 143/154/139 144/151/136 +f 127/127/123 126/132/126 141/156/141 142/153/138 +f 125/131/125 124/136/128 139/158/143 140/155/140 +f 123/135/127 122/144/132 137/162/147 138/157/142 +f 134/139/129 133/148/134 148/164/149 149/159/144 +f 132/147/133 131/150/135 146/165/150 147/163/148 +f 145/152/137 144/151/136 159/166/151 160/167/152 +f 143/154/139 142/153/138 157/168/153 158/169/154 +f 141/156/141 140/155/140 155/170/155 156/171/156 +f 139/158/143 138/157/142 153/172/157 154/173/158 +f 150/160/145 149/159/144 164/174/159 165/175/160 +f 137/162/147 136/161/146 151/176/161 152/177/162 +f 148/164/149 147/163/148 162/178/163 163/179/164 +f 146/165/150 145/152/137 160/167/152 161/180/165 +f 144/151/136 143/154/139 158/169/154 159/166/151 +f 142/153/138 141/156/141 156/171/156 157/168/153 +f 140/155/140 139/158/143 154/173/158 155/170/155 +f 138/157/142 137/162/147 152/177/162 153/172/157 +f 149/159/144 148/164/149 163/179/164 164/174/159 +f 147/163/148 146/165/150 161/180/165 162/178/163 +f 160/167/152 159/166/151 174/181/166 175/182/167 +f 158/169/154 157/168/153 172/183/168 173/184/169 +f 156/171/156 155/170/155 170/185/170 171/186/171 +f 154/173/158 153/172/157 168/187/172 169/188/173 +f 165/175/160 164/174/159 179/189/174 180/190/175 +f 152/177/162 151/176/161 166/191/176 167/192/177 +f 163/179/164 162/178/163 177/193/178 178/194/179 +f 161/180/165 160/167/152 175/182/167 176/195/180 +f 159/166/151 158/169/154 173/184/169 174/181/166 +f 157/168/153 156/171/156 171/186/171 172/183/168 +f 155/170/155 154/173/158 169/188/173 170/185/170 +f 153/172/157 152/177/162 167/192/177 168/187/172 +f 164/174/159 163/179/164 178/194/179 179/189/174 +f 162/178/163 161/180/165 176/195/180 177/193/178 +f 175/182/167 174/181/166 189/196/181 190/197/182 +f 173/184/169 172/183/168 187/198/183 188/199/184 +f 171/186/171 170/185/170 185/200/185 186/201/186 +f 169/188/173 168/187/172 183/202/187 184/203/188 +f 180/190/175 179/189/174 194/204/189 195/205/190 +f 167/192/177 166/191/176 181/206/191 182/207/192 +f 178/194/179 177/193/178 192/208/193 193/209/194 +f 176/195/180 175/182/167 190/197/182 191/210/195 +f 174/181/166 173/184/169 188/199/184 189/196/181 +f 172/183/168 171/186/171 186/201/186 187/198/183 +f 170/185/170 169/188/173 184/203/188 185/200/185 +f 168/187/172 167/192/177 182/207/192 183/202/187 +f 179/189/174 178/194/179 193/209/194 194/204/189 +f 177/193/178 176/195/180 191/210/195 192/208/193 +f 190/197/182 189/196/181 204/211/196 205/212/197 +f 188/199/184 187/198/183 202/213/198 203/214/199 +f 186/201/186 185/200/185 200/215/200 201/216/201 +f 184/203/188 183/202/187 198/217/202 199/218/203 +f 195/205/190 194/204/189 209/219/204 210/220/205 +f 182/207/192 181/206/191 196/221/206 197/222/207 +f 193/209/194 192/208/193 207/223/208 208/224/209 +f 191/210/195 190/197/182 205/212/197 206/225/210 +f 189/196/181 188/199/184 203/214/199 204/211/196 +f 187/198/183 186/201/186 201/216/201 202/213/198 +f 185/200/185 184/203/188 199/218/203 200/215/200 +f 183/202/187 182/207/192 197/222/207 198/217/202 +f 194/204/189 193/209/194 208/224/209 209/219/204 +f 192/208/193 191/210/195 206/225/210 207/223/208 +f 205/212/197 204/211/196 219/226/211 220/227/212 +f 203/214/199 202/213/198 217/228/213 218/229/214 +f 201/216/201 200/215/200 215/230/215 216/231/216 +f 199/218/203 198/217/202 213/232/217 214/233/218 +f 210/220/205 209/219/204 224/234/219 225/235/220 +f 197/222/207 196/221/206 211/236/221 212/237/222 +f 208/224/209 207/223/208 222/238/223 223/239/224 +f 206/225/210 205/212/197 220/227/212 221/240/225 +f 204/211/196 203/214/199 218/229/214 219/226/211 +f 202/213/198 201/216/201 216/231/216 217/228/213 +f 200/215/200 199/218/203 214/233/218 215/230/215 +f 198/217/202 197/222/207 212/237/222 213/232/217 +f 209/219/204 208/224/209 223/239/224 224/234/219 +f 207/223/208 206/225/210 221/240/225 222/238/223 +f 220/227/212 219/226/211 234/241/226 235/242/227 +f 218/229/214 217/228/213 232/243/228 233/244/229 +f 216/231/216 215/230/215 230/245/230 231/246/231 +f 214/233/218 213/232/217 228/247/232 229/248/233 +f 225/235/220 224/234/219 239/249/234 240/250/235 +f 212/237/222 211/236/221 226/251/236 227/252/237 +f 223/239/224 222/238/223 237/253/238 238/254/239 +f 221/240/225 220/227/212 235/242/227 236/255/240 +f 219/226/211 218/229/214 233/244/229 234/241/226 +f 217/228/213 216/231/216 231/246/231 232/243/228 +f 215/230/215 214/233/218 229/248/233 230/245/230 +f 213/232/217 212/237/222 227/252/237 228/247/232 +f 224/234/219 223/239/224 238/254/239 239/249/234 +f 222/238/223 221/240/225 236/255/240 237/253/238 +f 235/242/227 234/241/226 249/21/241 250/18/242 +f 233/244/229 232/243/228 247/25/243 248/22/244 +f 231/246/231 230/245/230 245/29/245 246/26/246 +f 229/248/233 228/247/232 243/2/247 244/1/248 +f 240/250/235 239/249/234 254/6/249 255/5/250 +f 227/252/237 226/251/236 241/10/251 242/9/252 +f 238/254/239 237/253/238 252/14/253 253/13/254 +f 236/255/240 235/242/227 250/18/242 251/17/255 +f 234/241/226 233/244/229 248/22/244 249/21/241 +f 232/243/228 231/246/231 246/26/246 247/25/243 +f 230/245/230 229/248/233 244/1/248 245/29/245 +f 228/247/232 227/252/237 242/9/252 243/2/247 +f 239/249/234 238/254/239 253/13/254 254/6/249 +f 237/253/238 236/255/240 251/17/255 252/14/253 +f 250/18/242 249/21/241 264/24/256 265/19/257 +f 248/22/244 247/25/243 262/28/258 263/23/259 +f 246/26/246 245/29/245 260/30/260 261/27/261 +f 244/1/248 243/2/247 258/3/262 259/4/263 +f 255/5/250 254/6/249 269/7/264 270/8/265 +f 242/9/252 241/10/251 256/11/266 257/12/267 +f 253/13/254 252/14/253 267/15/268 268/16/269 +f 251/17/255 250/18/242 265/19/257 266/20/270 +f 249/21/241 248/22/244 263/23/259 264/24/256 +f 247/25/243 246/26/246 261/27/261 262/28/258 +f 245/29/245 244/1/248 259/4/263 260/30/260 +f 243/2/247 242/9/252 257/12/267 258/3/262 +f 254/6/249 253/13/254 268/16/269 269/7/264 +f 252/14/253 251/17/255 266/20/270 267/15/268 +f 265/19/257 264/24/256 279/31/271 280/32/272 +f 263/23/259 262/28/258 277/33/273 278/34/274 +f 261/27/261 260/30/260 275/35/275 276/36/276 +f 259/4/263 258/3/262 273/37/277 274/38/278 +f 270/8/265 269/7/264 284/39/279 285/40/280 +f 257/12/267 256/11/266 271/41/281 272/42/282 +f 268/16/269 267/15/268 282/43/283 283/44/284 +f 266/20/270 265/19/257 280/32/272 281/45/285 +f 264/24/256 263/23/259 278/34/274 279/31/271 +f 262/28/258 261/27/261 276/36/276 277/33/273 +f 260/30/260 259/4/263 274/38/278 275/35/275 +f 258/3/262 257/12/267 272/42/282 273/37/277 +f 269/7/264 268/16/269 283/44/284 284/39/279 +f 267/15/268 266/20/270 281/45/285 282/43/283 +f 280/32/272 279/31/271 294/46/286 295/47/287 +f 278/34/274 277/33/273 292/48/288 293/49/289 +f 276/36/276 275/35/275 290/50/290 291/51/291 +f 274/38/278 273/37/277 288/52/292 289/53/293 +f 285/40/280 284/39/279 299/54/294 300/55/295 +f 272/42/282 271/41/281 286/56/296 287/57/297 +f 283/44/284 282/43/283 297/58/298 298/59/299 +f 281/45/285 280/32/272 295/47/287 296/60/300 +f 279/31/271 278/34/274 293/49/289 294/46/286 +f 277/33/273 276/36/276 291/51/291 292/48/288 +f 275/35/275 274/38/278 289/53/293 290/50/290 +f 273/37/277 272/42/282 287/57/297 288/52/292 +f 284/39/279 283/44/284 298/59/299 299/54/294 +f 282/43/283 281/45/285 296/60/300 297/58/298 +f 295/47/287 294/46/286 309/61/301 310/62/302 +f 293/49/289 292/48/288 307/63/303 308/64/304 +f 291/51/291 290/50/290 305/65/305 306/66/306 +f 289/53/293 288/52/292 303/67/307 304/68/308 +f 300/55/295 299/54/294 314/69/309 315/70/310 +f 287/57/297 286/56/296 301/71/311 302/72/312 +f 298/59/299 297/58/298 312/73/313 313/74/314 +f 296/60/300 295/47/287 310/62/302 311/75/315 +f 294/46/286 293/49/289 308/64/304 309/61/301 +f 292/48/288 291/51/291 306/66/306 307/63/303 +f 290/50/290 289/53/293 304/68/308 305/65/305 +f 288/52/292 287/57/297 302/72/312 303/67/307 +f 299/54/294 298/59/299 313/74/314 314/69/309 +f 297/58/298 296/60/300 311/75/315 312/73/313 +f 310/62/302 309/61/301 324/76/316 325/77/317 +f 308/64/304 307/63/303 322/78/318 323/79/319 +f 306/66/306 305/65/305 320/80/320 321/81/321 +f 304/68/308 303/67/307 318/82/322 319/83/323 +f 315/70/310 314/69/309 329/84/324 330/85/325 +f 302/72/312 301/71/311 316/86/326 317/87/327 +f 313/74/314 312/73/313 327/88/328 328/89/329 +f 311/75/315 310/62/302 325/77/317 326/90/330 +f 309/61/301 308/64/304 323/79/319 324/76/316 +f 307/63/303 306/66/306 321/81/321 322/78/318 +f 305/65/305 304/68/308 319/83/323 320/80/320 +f 303/67/307 302/72/312 317/87/327 318/82/322 +f 314/69/309 313/74/314 328/89/329 329/84/324 +f 312/73/313 311/75/315 326/90/330 327/88/328 +f 325/77/317 324/76/316 339/91/331 340/92/332 +f 323/79/319 322/78/318 337/93/333 338/94/334 +f 321/81/321 320/80/320 335/95/335 336/96/336 +f 319/83/323 318/82/322 333/97/337 334/98/338 +f 330/85/325 329/84/324 344/99/339 345/100/340 +f 317/87/327 316/86/326 331/101/341 332/102/342 +f 328/89/329 327/88/328 342/103/343 343/104/344 +f 326/90/330 325/77/317 340/92/332 341/105/345 +f 324/76/316 323/79/319 338/94/334 339/91/331 +f 322/78/318 321/81/321 336/96/336 337/93/333 +f 320/80/320 319/83/323 334/98/338 335/95/335 +f 318/82/322 317/87/327 332/102/342 333/97/337 +f 329/84/324 328/89/329 343/104/344 344/99/339 +f 327/88/328 326/90/330 341/105/345 342/103/343 +f 340/92/332 339/91/331 354/106/346 355/107/347 +f 338/94/334 337/93/333 352/108/348 353/109/349 +f 336/96/336 335/95/335 350/110/350 351/111/351 +f 334/98/338 333/97/337 348/112/352 349/113/353 +f 345/100/340 344/99/339 359/114/354 360/115/355 +f 332/102/342 331/101/341 346/116/356 347/117/357 +f 343/104/344 342/103/343 357/118/358 358/119/359 +f 341/105/345 340/92/332 355/107/347 356/120/360 +f 339/91/331 338/94/334 353/109/349 354/106/346 +f 337/93/333 336/96/336 351/111/351 352/108/348 +f 335/95/335 334/98/338 349/113/353 350/110/350 +f 333/97/337 332/102/342 347/117/357 348/112/352 +f 344/99/339 343/104/344 358/119/359 359/114/354 +f 342/103/343 341/105/345 356/120/360 357/118/358 +f 355/121/347 354/122/346 369/123/361 370/124/362 +f 353/125/349 352/126/348 367/127/363 368/128/364 +f 351/129/351 350/130/350 365/131/365 366/132/366 +f 349/133/353 348/134/352 363/135/367 364/136/368 +f 360/137/355 359/138/354 374/139/369 375/140/370 +f 347/141/357 346/142/356 361/143/371 362/144/372 +f 358/145/359 357/146/358 372/147/373 373/148/374 +f 356/149/360 355/121/347 370/124/362 371/150/375 +f 354/122/346 353/125/349 368/128/364 369/123/361 +f 352/126/348 351/129/351 366/132/366 367/127/363 +f 350/130/350 349/133/353 364/136/368 365/131/365 +f 348/134/352 347/141/357 362/144/372 363/135/367 +f 359/138/354 358/145/359 373/148/374 374/139/369 +f 357/146/358 356/149/360 371/150/375 372/147/373 +f 370/124/362 369/123/361 384/151/376 385/152/377 +f 368/128/364 367/127/363 382/153/378 383/154/379 +f 366/132/366 365/131/365 380/155/380 381/156/381 +f 364/136/368 363/135/367 378/157/382 379/158/383 +f 375/140/370 374/139/369 389/159/384 390/160/385 +f 362/144/372 361/143/371 376/161/386 377/162/387 +f 373/148/374 372/147/373 387/163/388 388/164/389 +f 371/150/375 370/124/362 385/152/377 386/165/390 +f 369/123/361 368/128/364 383/154/379 384/151/376 +f 367/127/363 366/132/366 381/156/381 382/153/378 +f 365/131/365 364/136/368 379/158/383 380/155/380 +f 363/135/367 362/144/372 377/162/387 378/157/382 +f 374/139/369 373/148/374 388/164/389 389/159/384 +f 372/147/373 371/150/375 386/165/390 387/163/388 +f 385/152/377 384/151/376 399/166/391 400/167/392 +f 383/154/379 382/153/378 397/168/393 398/169/394 +f 381/156/381 380/155/380 395/170/395 396/171/396 +f 379/158/383 378/157/382 393/172/397 394/173/398 +f 390/160/385 389/159/384 404/174/399 405/175/400 +f 377/162/387 376/161/386 391/176/401 392/177/402 +f 388/164/389 387/163/388 402/178/403 403/179/404 +f 386/165/390 385/152/377 400/167/392 401/180/405 +f 384/151/376 383/154/379 398/169/394 399/166/391 +f 382/153/378 381/156/381 396/171/396 397/168/393 +f 380/155/380 379/158/383 394/173/398 395/170/395 +f 378/157/382 377/162/387 392/177/402 393/172/397 +f 389/159/384 388/164/389 403/179/404 404/174/399 +f 387/163/388 386/165/390 401/180/405 402/178/403 +f 400/167/392 399/166/391 414/181/406 415/182/407 +f 398/169/394 397/168/393 412/183/408 413/184/409 +f 396/171/396 395/170/395 410/185/410 411/186/411 +f 394/173/398 393/172/397 408/187/412 409/188/413 +f 405/175/400 404/174/399 419/189/414 420/190/415 +f 392/177/402 391/176/401 406/191/416 407/192/417 +f 403/179/404 402/178/403 417/193/418 418/194/419 +f 401/180/405 400/167/392 415/182/407 416/195/420 +f 399/166/391 398/169/394 413/184/409 414/181/406 +f 397/168/393 396/171/396 411/186/411 412/183/408 +f 395/170/395 394/173/398 409/188/413 410/185/410 +f 393/172/397 392/177/402 407/192/417 408/187/412 +f 404/174/399 403/179/404 418/194/419 419/189/414 +f 402/178/403 401/180/405 416/195/420 417/193/418 +f 415/182/407 414/181/406 429/196/421 430/197/422 +f 413/184/409 412/183/408 427/198/423 428/199/424 +f 411/186/411 410/185/410 425/200/425 426/201/426 +f 409/188/413 408/187/412 423/202/427 424/203/428 +f 420/190/415 419/189/414 434/204/429 435/205/430 +f 407/192/417 406/191/416 421/206/431 422/207/432 +f 418/194/419 417/193/418 432/208/433 433/209/434 +f 416/195/420 415/182/407 430/197/422 431/210/435 +f 414/181/406 413/184/409 428/199/424 429/196/421 +f 412/183/408 411/186/411 426/201/426 427/198/423 +f 410/185/410 409/188/413 424/203/428 425/200/425 +f 408/187/412 407/192/417 422/207/432 423/202/427 +f 419/189/414 418/194/419 433/209/434 434/204/429 +f 417/193/418 416/195/420 431/210/435 432/208/433 +f 430/197/422 429/196/421 444/211/436 445/212/437 +f 428/199/424 427/198/423 442/213/438 443/214/439 +f 426/201/426 425/200/425 440/215/440 441/216/441 +f 424/203/428 423/202/427 438/217/442 439/218/443 +f 435/205/430 434/204/429 449/219/444 450/220/445 +f 422/207/432 421/206/431 436/221/446 437/222/447 +f 433/209/434 432/208/433 447/223/448 448/224/449 +f 431/210/435 430/197/422 445/212/437 446/225/450 +f 429/196/421 428/199/424 443/214/439 444/211/436 +f 427/198/423 426/201/426 441/216/441 442/213/438 +f 425/200/425 424/203/428 439/218/443 440/215/440 +f 423/202/427 422/207/432 437/222/447 438/217/442 +f 434/204/429 433/209/434 448/224/449 449/219/444 +f 432/208/433 431/210/435 446/225/450 447/223/448 +f 445/212/437 444/211/436 459/226/451 460/227/452 +f 443/214/439 442/213/438 457/228/453 458/229/454 +f 441/216/441 440/215/440 455/230/455 456/231/456 +f 439/218/443 438/217/442 453/232/457 454/233/458 +f 450/220/445 449/219/444 464/234/459 465/235/460 +f 437/222/447 436/221/446 451/236/461 452/237/462 +f 448/224/449 447/223/448 462/238/463 463/239/464 +f 446/225/450 445/212/437 460/227/452 461/240/465 +f 444/211/436 443/214/439 458/229/454 459/226/451 +f 442/213/438 441/216/441 456/231/456 457/228/453 +f 440/215/440 439/218/443 454/233/458 455/230/455 +f 438/217/442 437/222/447 452/237/462 453/232/457 +f 449/219/444 448/224/449 463/239/464 464/234/459 +f 447/223/448 446/225/450 461/240/465 462/238/463 +f 460/227/452 459/226/451 474/241/466 475/242/467 +f 458/229/454 457/228/453 472/243/468 473/244/469 +f 456/231/456 455/230/455 470/245/470 471/246/471 +f 454/233/458 453/232/457 468/247/472 469/248/473 +f 465/235/460 464/234/459 479/249/474 480/250/475 +f 452/237/462 451/236/461 466/251/476 467/252/477 +f 463/239/464 462/238/463 477/253/478 478/254/479 +f 461/240/465 460/227/452 475/242/467 476/255/480 +f 459/226/451 458/229/454 473/244/469 474/241/466 +f 457/228/453 456/231/456 471/246/471 472/243/468 +f 455/230/455 454/233/458 469/248/473 470/245/470 +f 453/232/457 452/237/462 467/252/477 468/247/472 +f 464/234/459 463/239/464 478/254/479 479/249/474 +f 462/238/463 461/240/465 476/255/480 477/253/478 +f 481/256/481 15/5/5 30/8/8 485/257/482 +f 485/257/482 30/8/8 45/40/40 487/258/483 +f 487/258/483 45/40/40 60/55/55 489/259/484 +f 489/259/484 60/55/55 75/70/70 491/260/485 +f 491/260/485 75/70/70 90/85/85 493/261/486 +f 493/261/486 90/85/85 105/100/100 495/262/487 +f 495/262/487 105/100/100 120/115/115 497/263/488 +f 497/264/488 120/137/115 135/140/130 499/265/489 +f 499/265/489 135/140/130 150/160/145 501/266/490 +f 501/266/490 150/160/145 165/175/160 503/267/491 +f 503/267/491 165/175/160 180/190/175 505/268/492 +f 505/268/492 180/190/175 195/205/190 507/269/493 +f 507/269/493 195/205/190 210/220/205 509/270/494 +f 509/270/494 210/220/205 225/235/220 511/271/495 +f 511/271/495 225/235/220 240/250/235 513/272/496 +f 513/272/496 240/250/235 255/5/250 515/256/497 +f 515/256/497 255/5/250 270/8/265 517/257/498 +f 517/257/498 270/8/265 285/40/280 519/258/499 +f 519/258/499 285/40/280 300/55/295 521/259/500 +f 521/259/500 300/55/295 315/70/310 523/260/501 +f 523/260/501 315/70/310 330/85/325 525/261/502 +f 525/261/502 330/85/325 345/100/340 527/262/503 +f 527/262/503 345/100/340 360/115/355 529/263/504 +f 529/264/504 360/137/355 375/140/370 531/265/505 +f 531/265/505 375/140/370 390/160/385 533/266/506 +f 533/266/506 390/160/385 405/175/400 534/267/507 +f 534/267/507 405/175/400 420/190/415 536/268/508 +f 536/268/508 420/190/415 435/205/430 538/269/509 +f 538/269/509 435/205/430 450/220/445 540/270/510 +f 540/270/510 450/220/445 465/235/460 542/271/511 +f 542/271/511 465/235/460 480/250/475 544/272/512 +f 475/242/467 474/241/466 9/21/21 10/18/18 +f 473/244/469 472/243/468 7/25/25 8/22/22 +f 471/246/471 470/245/470 5/29/29 6/26/26 +f 469/248/473 468/247/472 3/2/2 4/1/1 +f 480/250/475 479/249/474 14/6/6 15/5/5 +f 467/252/477 466/251/476 1/10/10 2/9/9 +f 478/254/479 477/253/478 12/14/14 13/13/13 +f 476/255/480 475/242/467 10/18/18 11/17/17 +f 474/241/466 473/244/469 8/22/22 9/21/21 +f 472/243/468 471/246/471 6/26/26 7/25/25 +f 470/245/470 469/248/473 4/1/1 5/29/29 +f 544/272/512 480/250/475 15/5/5 481/256/481 +f 468/247/472 467/252/477 2/9/9 3/2/2 +f 479/249/474 478/254/479 13/13/13 14/6/6 +f 477/253/478 476/255/480 11/17/17 12/14/14 +f 466/251/476 543/273/513 483/274/514 1/10/10 +f 451/236/461 541/275/515 543/273/513 466/251/476 +f 436/221/446 539/276/516 541/275/515 451/236/461 +f 421/206/431 537/277/517 539/276/516 436/221/446 +f 406/191/416 535/278/518 537/277/517 421/206/431 +f 391/176/401 482/279/519 535/278/518 406/191/416 +f 376/161/386 532/280/520 482/279/519 391/176/401 +f 361/143/371 530/281/521 532/280/520 376/161/386 +f 346/142/356 528/282/522 530/281/521 361/143/371 +f 331/101/341 526/283/523 528/284/522 346/116/356 +f 316/86/326 524/285/524 526/283/523 331/101/341 +f 301/71/311 522/286/525 524/285/524 316/86/326 +f 286/56/296 520/287/526 522/286/525 301/71/311 +f 271/41/281 518/288/527 520/287/526 286/56/296 +f 256/11/266 516/289/528 518/288/527 271/41/281 +f 241/10/251 514/274/529 516/289/528 256/11/266 +f 226/251/236 512/273/530 514/274/529 241/10/251 +f 211/236/221 510/275/531 512/273/530 226/251/236 +f 196/221/206 508/276/532 510/275/531 211/236/221 +f 181/206/191 506/277/533 508/276/532 196/221/206 +f 166/191/176 504/278/534 506/277/533 181/206/191 +f 151/176/161 502/279/535 504/278/534 166/191/176 +f 136/161/146 500/280/536 502/279/535 151/176/161 +f 121/143/131 498/281/537 500/280/536 136/161/146 +f 106/142/116 496/282/538 498/281/537 121/143/131 +f 91/101/101 494/283/539 496/284/538 106/116/116 +f 76/86/86 492/285/540 494/283/539 91/101/101 +f 61/71/71 490/286/541 492/285/540 76/86/86 +f 46/56/56 488/287/542 490/286/541 61/71/71 +f 31/41/41 486/288/543 488/287/542 46/56/56 +f 16/11/11 484/289/544 486/288/543 31/41/41 +f 1/10/10 483/274/514 484/289/544 16/11/11 +f 543/290/513 541/291/515 539/292/516 537/293/517 535/294/518 482/295/519 532/296/520 530/297/521 528/298/522 526/299/523 524/300/524 522/301/525 520/302/526 518/303/527 516/304/528 514/305/529 512/306/530 510/307/531 508/308/532 506/309/533 504/310/534 502/311/535 500/312/536 498/313/537 496/314/538 494/315/539 492/316/540 490/317/541 488/318/542 486/319/543 484/320/544 483/321/514 +f 544/290/512 481/291/481 485/292/482 487/293/483 489/294/484 491/295/485 493/296/486 495/297/487 497/298/488 499/299/489 501/300/490 503/301/491 505/302/492 507/303/493 509/304/494 511/305/495 513/306/496 515/307/497 517/308/498 519/309/499 521/310/500 523/311/501 525/312/502 527/313/503 529/314/504 531/315/505 533/316/506 534/317/507 536/318/508 538/319/509 540/320/510 542/321/511 diff --git a/technic/technic/models/technic_two_curved_edge.obj b/technic/technic/models/technic_two_curved_edge.obj new file mode 100644 index 0000000..a468ddf --- /dev/null +++ b/technic/technic/models/technic_two_curved_edge.obj @@ -0,0 +1,207 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_quarter_round_corner_onetexture.blend' +# www.blender.org +o corner1_Cylinder +v 0.415732 0.277783 0.499997 +v 0.461936 0.191340 0.499997 +v 0.415735 0.277783 -0.415732 +v 0.461940 0.191340 -0.461937 +v 0.490389 0.097544 0.499997 +v 0.353551 0.353551 0.499997 +v 0.353555 0.353551 -0.353551 +v 0.499996 -0.000000 0.499997 +v 0.277783 0.415732 0.499997 +v 0.490393 0.097544 -0.490389 +v 0.277787 0.415732 -0.277784 +v 0.191340 0.461936 0.499997 +v 0.191344 0.461937 -0.191341 +v 0.097544 0.490389 0.499997 +v 0.097547 0.490391 -0.097545 +v -0.000000 0.499996 0.499997 +v -0.499997 0.499997 0.499997 +v -0.499997 0.499997 -0.000030 +v -0.499997 0.415735 -0.277785 +v -0.499997 0.461940 -0.191342 +v -0.499997 0.490393 -0.097545 +v -0.500000 -0.500000 -0.500000 +v -0.499997 -0.499997 0.499997 +v 0.000000 0.499998 0.000000 +v -0.499998 0.000014 -0.499999 +v -0.499997 0.353553 -0.353554 +v -0.499998 0.097545 -0.490393 +v -0.499997 0.277785 -0.415735 +v -0.499998 0.191342 -0.461940 +v 0.499997 -0.000000 -0.499996 +v 0.500000 -0.500000 -0.500000 +v 0.499997 -0.499997 0.499997 +v -0.499997 -0.499997 0.499997 +v -0.499997 0.499997 0.499997 +v -0.499997 0.499997 -0.000030 +v -0.499997 0.415735 -0.277785 +v -0.499997 0.461940 -0.191342 +v -0.499997 0.490393 -0.097545 +v -0.500000 -0.500000 -0.500000 +v -0.499998 0.000014 -0.499999 +v -0.499997 0.353553 -0.353554 +v -0.499998 0.097545 -0.490393 +v -0.499997 0.277785 -0.415735 +v -0.499998 0.191342 -0.461940 +v -0.499998 -0.033351 0.033348 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.499997 -0.499997 0.499997 +v 0.415732 0.277783 0.499997 +v 0.461936 0.191340 0.499997 +v 0.490389 0.097544 0.499997 +v 0.353551 0.353551 0.499997 +v 0.499996 -0.000000 0.499997 +v 0.277783 0.415732 0.499997 +v 0.191340 0.461936 0.499997 +v -0.499997 -0.499997 0.499997 +v 0.097544 0.490389 0.499997 +v -0.000000 0.499996 0.499997 +v -0.499997 0.499997 0.499997 +v -0.033351 -0.033351 0.499997 +v 0.499997 -0.499997 0.499997 +vt 1.000000 0.500100 +vt 0.990395 0.597625 +vt 0.466756 0.466756 +vt 1.000000 0.000200 +vt 0.000201 0.000201 +vt 0.597626 0.990394 +vt 0.500101 1.000000 +vt 0.691404 0.961947 +vt 0.777830 0.915751 +vt 0.853583 0.853583 +vt 0.915752 0.777829 +vt 0.000201 1.000000 +vt 0.961948 0.691403 +vt -0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.533443 0.466757 +vt 0.000202 0.500115 +vt 0.402575 0.990397 +vt 0.308797 0.961949 +vt 0.222371 0.915753 +vt 0.146617 0.853584 +vt 0.084449 0.777831 +vt 0.038253 0.691405 +vt 0.009806 0.597626 +vt 0.999996 0.125448 +vt 0.222353 0.125462 +vt 0.146597 0.000612 +vt 0.999995 0.000594 +vt 0.000178 0.874582 +vt 0.915751 0.874577 +vt 0.853580 0.999436 +vt 0.000178 0.999439 +vt 0.999808 0.625427 +vt 0.009599 0.625446 +vt -0.000005 0.500594 +vt 0.999807 0.500594 +vt 0.597441 0.374574 +vt 0.499912 0.499435 +vt 0.000000 0.499434 +vt 0.000000 0.374576 +vt 0.999999 0.375154 +vt 1.000000 0.499969 +vt 0.500093 0.500015 +vt 0.402562 0.375164 +vt 0.999812 0.999983 +vt 0.146415 1.000000 +vt 0.084244 0.875149 +vt 0.999811 0.875131 +vt 0.990396 0.624861 +vt 0.961947 0.749719 +vt 0.000178 0.749724 +vt 0.000178 0.624866 +vt 0.777649 0.124857 +vt 0.691221 0.249715 +vt 0.000001 0.249719 +vt 0.000001 0.124861 +vt 0.308782 0.250314 +vt 0.999998 0.250301 +vt 0.853403 -0.000000 +vt 0.038047 0.750298 +vt 0.999809 0.750280 +vt 0.000177 0.500008 +vt 0.000000 0.500000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +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.831500 -0.555600 +vn 0.325800 0.887500 -0.325800 +vn 0.429700 0.794100 -0.429700 +vn 0.000000 0.707100 -0.707100 +vn 0.831500 0.555600 0.000000 +vn 0.531000 0.660300 -0.531000 +vn 0.707100 0.707100 0.000000 +vn 0.000000 0.195100 -0.980800 +vn 0.683900 0.254100 -0.683900 +vn 0.705500 0.067100 -0.705500 +vn 0.000000 0.049100 -0.998800 +vn 0.123100 0.984700 -0.123100 +vn 0.036800 0.998600 -0.036800 +vn 0.049100 0.998800 0.000000 +vn 0.195100 0.980800 0.000000 +vn 0.000000 0.980800 -0.195100 +vn 0.000000 0.998800 -0.049100 +vn 0.000000 0.555600 -0.831500 +vn 0.620400 0.479600 -0.620400 +vn 0.923900 0.382700 0.000000 +vn 0.980800 0.195100 0.000000 +vn 0.223300 0.948800 -0.223200 +vn 0.382700 0.923900 0.000000 +vn 0.555600 0.831500 0.000000 +vn 0.000000 0.923900 -0.382700 +vn 0.000000 0.382700 -0.923900 +vn 0.998800 0.049100 0.000000 +vn 0.707100 0.000000 -0.707100 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +s off +f 53/1/1 51/2/1 60/3/1 +f 61/4/1 53/1/1 60/3/1 56/5/1 +f 57/6/1 58/7/1 60/3/1 +f 55/8/1 57/6/1 60/3/1 +f 54/9/1 55/8/1 60/3/1 +f 52/10/1 54/9/1 60/3/1 +f 49/11/1 52/10/1 60/3/1 +f 59/12/1 56/5/1 60/3/1 58/7/1 +f 50/13/1 49/11/1 60/3/1 +f 48/14/2 23/15/2 46/16/2 47/17/2 +f 39/5/3 33/4/3 45/18/3 40/19/3 +f 35/7/3 38/20/3 45/18/3 +f 38/20/3 37/21/3 45/18/3 +f 37/21/3 36/22/3 45/18/3 +f 36/22/3 41/23/3 45/18/3 +f 41/23/3 43/24/3 45/18/3 +f 43/24/3 44/25/3 45/18/3 +f 44/25/3 42/26/3 45/18/3 +f 42/26/3 40/19/3 45/18/3 +f 34/16/3 35/7/3 45/18/3 33/4/3 +f 51/2/1 50/13/1 60/3/1 +s 1 +f 19/27/4 11/28/5 7/29/6 26/30/7 +f 1/31/8 3/32/9 7/33/6 6/34/10 +f 27/35/11 10/36/12 30/37/13 25/38/14 +f 15/39/15 24/40/16 16/41/17 14/42/18 +f 21/43/19 18/44/20 24/45/16 15/46/15 +f 26/47/7 7/48/6 3/49/9 28/50/21 +f 10/51/12 4/52/22 2/53/23 5/54/24 +f 11/55/5 13/56/25 12/57/26 9/58/27 +f 21/43/19 15/46/15 13/59/25 20/60/28 +f 20/60/28 13/59/25 11/28/5 19/27/4 +f 9/58/27 6/14/10 7/61/6 11/55/5 +f 4/52/22 3/32/9 1/31/8 2/53/23 +f 3/49/9 4/62/22 29/63/29 28/50/21 +f 10/51/12 5/54/24 8/64/30 30/44/13 +f 29/63/29 4/62/22 10/36/12 27/35/11 +f 25/44/14 30/65/13 31/14/31 22/15/32 +f 16/66/17 24/67/16 18/44/20 17/16/33 +f 8/65/30 32/14/34 31/15/31 30/44/13 +f 12/57/26 13/56/25 15/39/15 14/42/18 diff --git a/technic/technic/register.lua b/technic/technic/register.lua new file mode 100644 index 0000000..8f75b81 --- /dev/null +++ b/technic/technic/register.lua @@ -0,0 +1,58 @@ +-- This file includes the functions and data structures for registering machines and tools for LV, MV, HV types. +-- We use the technic namespace for these functions and data to avoid eventual conflict. + +technic.receiver = "RE" +technic.producer = "PR" +technic.producer_receiver = "PR_RE" +technic.battery = "BA" + +technic.machines = {} +technic.power_tools = {} +technic.networks = {} + + +function technic.register_tier(tier, description) + technic.machines[tier] = {} +end + +function technic.register_machine(tier, nodename, machine_type) + if not technic.machines[tier] then + return + end + technic.machines[tier][nodename] = machine_type +end + +function technic.register_power_tool(craftitem, max_charge) + technic.power_tools[craftitem] = max_charge +end + + +-- Utility functions. Not sure exactly what they do.. water.lua uses the two first. +function technic.get_RE_item_load(load1, max_load) + if load1 == 0 then load1 = 65535 end + local temp = 65536 - load1 + temp = temp / 65535 * max_load + return math.floor(temp + 0.5) +end + +function technic.set_RE_item_load(load1, max_load) + if load1 == 0 then return 65535 end + local temp = load1 / max_load * 65535 + temp = 65536 - temp + return math.floor(temp) +end + +-- Wear down a tool depending on the remaining charge. +function technic.set_RE_wear(itemstack, item_load, max_load) + if (minetest.registered_items[itemstack:get_name()].wear_represents or "mechanical_wear") ~= "technic_RE_charge" then return itemstack end + local temp + if item_load == 0 then + temp = 0 + else + temp = 65536 - math.floor(item_load / max_load * 65535) + if temp > 65535 then temp = 65535 end + if temp < 1 then temp = 1 end + end + itemstack:set_wear(temp) + return itemstack +end diff --git a/technic/technic/sounds/chainsaw.ogg b/technic/technic/sounds/chainsaw.ogg Binary files differnew file mode 100644 index 0000000..5fe7552 --- /dev/null +++ b/technic/technic/sounds/chainsaw.ogg diff --git a/technic/technic/sounds/item_drop_pickup.1.ogg b/technic/technic/sounds/item_drop_pickup.1.ogg Binary files differnew file mode 100644 index 0000000..2ae432d --- /dev/null +++ b/technic/technic/sounds/item_drop_pickup.1.ogg diff --git a/technic/technic/sounds/item_drop_pickup.2.ogg b/technic/technic/sounds/item_drop_pickup.2.ogg Binary files differnew file mode 100644 index 0000000..f58bf08 --- /dev/null +++ b/technic/technic/sounds/item_drop_pickup.2.ogg diff --git a/technic/technic/sounds/item_drop_pickup.3.ogg b/technic/technic/sounds/item_drop_pickup.3.ogg Binary files differnew file mode 100644 index 0000000..cf57c94 --- /dev/null +++ b/technic/technic/sounds/item_drop_pickup.3.ogg diff --git a/technic/technic/sounds/item_drop_pickup.4.ogg b/technic/technic/sounds/item_drop_pickup.4.ogg Binary files differnew file mode 100644 index 0000000..bfe99d9 --- /dev/null +++ b/technic/technic/sounds/item_drop_pickup.4.ogg diff --git a/technic/technic/sounds/mining_drill.ogg b/technic/technic/sounds/mining_drill.ogg Binary files differnew file mode 100644 index 0000000..1493544 --- /dev/null +++ b/technic/technic/sounds/mining_drill.ogg diff --git a/technic/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg b/technic/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg Binary files differnew file mode 100644 index 0000000..3332deb --- /dev/null +++ b/technic/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg diff --git a/technic/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.ogg b/technic/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.ogg Binary files differnew file mode 100644 index 0000000..3d290b0 --- /dev/null +++ b/technic/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.ogg diff --git a/technic/technic/sounds/technic_laser_mk1.0.ogg b/technic/technic/sounds/technic_laser_mk1.0.ogg Binary files differnew file mode 100644 index 0000000..19be080 --- /dev/null +++ b/technic/technic/sounds/technic_laser_mk1.0.ogg diff --git a/technic/technic/sounds/technic_laser_mk1.1.ogg b/technic/technic/sounds/technic_laser_mk1.1.ogg Binary files differnew file mode 100644 index 0000000..7792be1 --- /dev/null +++ b/technic/technic/sounds/technic_laser_mk1.1.ogg diff --git a/technic/technic/sounds/technic_laser_mk2.0.ogg b/technic/technic/sounds/technic_laser_mk2.0.ogg Binary files differnew file mode 100644 index 0000000..2cf1548 --- /dev/null +++ b/technic/technic/sounds/technic_laser_mk2.0.ogg diff --git a/technic/technic/sounds/technic_laser_mk2.1.ogg b/technic/technic/sounds/technic_laser_mk2.1.ogg Binary files differnew file mode 100644 index 0000000..b3f9afb --- /dev/null +++ b/technic/technic/sounds/technic_laser_mk2.1.ogg diff --git a/technic/technic/sounds/technic_laser_mk2.2.ogg b/technic/technic/sounds/technic_laser_mk2.2.ogg Binary files differnew file mode 100644 index 0000000..a4ee091 --- /dev/null +++ b/technic/technic/sounds/technic_laser_mk2.2.ogg diff --git a/technic/technic/sounds/technic_laser_mk3.1.ogg b/technic/technic/sounds/technic_laser_mk3.1.ogg Binary files differnew file mode 100644 index 0000000..f948913 --- /dev/null +++ b/technic/technic/sounds/technic_laser_mk3.1.ogg diff --git a/technic/technic/sounds/technic_laser_mk3.2.ogg b/technic/technic/sounds/technic_laser_mk3.2.ogg Binary files differnew file mode 100644 index 0000000..636c306 --- /dev/null +++ b/technic/technic/sounds/technic_laser_mk3.2.ogg diff --git a/technic/technic/sounds/technic_prospector_hit.ogg b/technic/technic/sounds/technic_prospector_hit.ogg Binary files differnew file mode 100644 index 0000000..3a8ad2d --- /dev/null +++ b/technic/technic/sounds/technic_prospector_hit.ogg diff --git a/technic/technic/sounds/technic_prospector_miss.ogg b/technic/technic/sounds/technic_prospector_miss.ogg Binary files differnew file mode 100644 index 0000000..0f050d0 --- /dev/null +++ b/technic/technic/sounds/technic_prospector_miss.ogg diff --git a/technic/technic/sounds/technic_sonic_screwdriver.ogg b/technic/technic/sounds/technic_sonic_screwdriver.ogg Binary files differnew file mode 100644 index 0000000..471bb72 --- /dev/null +++ b/technic/technic/sounds/technic_sonic_screwdriver.ogg diff --git a/technic/technic/sounds/vacuumcleaner.ogg b/technic/technic/sounds/vacuumcleaner.ogg Binary files differnew file mode 100644 index 0000000..39d72de --- /dev/null +++ b/technic/technic/sounds/vacuumcleaner.ogg diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png Binary files differnew file mode 100644 index 0000000..2848f89 --- /dev/null +++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_16.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_16.png Binary files differnew file mode 100644 index 0000000..4661177 --- /dev/null +++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_16.png diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_256.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_256.png Binary files differnew file mode 100644 index 0000000..5187fab --- /dev/null +++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_256.png diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_32.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_32.png Binary files differnew file mode 100644 index 0000000..3d380da --- /dev/null +++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_32.png diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png Binary files differnew file mode 100644 index 0000000..ba2bd89 --- /dev/null +++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png Binary files differnew file mode 100644 index 0000000..2fa8f18 --- /dev/null +++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png diff --git a/technic/technic/textures/power_meter.png b/technic/technic/textures/power_meter.png Binary files differnew file mode 100644 index 0000000..9f96cac --- /dev/null +++ b/technic/technic/textures/power_meter.png diff --git a/technic/technic/textures/technic_acacia_grindings.png b/technic/technic/textures/technic_acacia_grindings.png Binary files differnew file mode 100644 index 0000000..bcfefc9 --- /dev/null +++ b/technic/technic/textures/technic_acacia_grindings.png diff --git a/technic/technic/textures/technic_admin_anchor.png b/technic/technic/textures/technic_admin_anchor.png Binary files differnew file mode 100644 index 0000000..7ce9b4c --- /dev/null +++ b/technic/technic/textures/technic_admin_anchor.png diff --git a/technic/technic/textures/technic_akalin_dust.png b/technic/technic/textures/technic_akalin_dust.png Binary files differnew file mode 100644 index 0000000..052b0ac --- /dev/null +++ b/technic/technic/textures/technic_akalin_dust.png diff --git a/technic/technic/textures/technic_alatro_dust.png b/technic/technic/textures/technic_alatro_dust.png Binary files differnew file mode 100644 index 0000000..172af25 --- /dev/null +++ b/technic/technic/textures/technic_alatro_dust.png diff --git a/technic/technic/textures/technic_arol_dust.png b/technic/technic/textures/technic_arol_dust.png Binary files differnew file mode 100644 index 0000000..1a575ed --- /dev/null +++ b/technic/technic/textures/technic_arol_dust.png diff --git a/technic/technic/textures/technic_battery.png b/technic/technic/textures/technic_battery.png Binary files differnew file mode 100644 index 0000000..ee83b74 --- /dev/null +++ b/technic/technic/textures/technic_battery.png diff --git a/technic/technic/textures/technic_battery_box_side.png b/technic/technic/textures/technic_battery_box_side.png Binary files differnew file mode 100644 index 0000000..98a22d6 --- /dev/null +++ b/technic/technic/textures/technic_battery_box_side.png diff --git a/technic/technic/textures/technic_battery_box_side8.png b/technic/technic/textures/technic_battery_box_side8.png Binary files differnew file mode 100644 index 0000000..65806f4 --- /dev/null +++ b/technic/technic/textures/technic_battery_box_side8.png diff --git a/technic/technic/textures/technic_battery_box_side_mv.png b/technic/technic/textures/technic_battery_box_side_mv.png Binary files differnew file mode 100644 index 0000000..06a4be5 --- /dev/null +++ b/technic/technic/textures/technic_battery_box_side_mv.png diff --git a/technic/technic/textures/technic_battery_meter_fg.png b/technic/technic/textures/technic_battery_meter_fg.png Binary files differnew file mode 100644 index 0000000..2f19bc7 --- /dev/null +++ b/technic/technic/textures/technic_battery_meter_fg.png diff --git a/technic/technic/textures/technic_battery_reload.png b/technic/technic/textures/technic_battery_reload.png Binary files differnew file mode 100644 index 0000000..4ce48d8 --- /dev/null +++ b/technic/technic/textures/technic_battery_reload.png diff --git a/technic/technic/textures/technic_bronze_dust.png b/technic/technic/textures/technic_bronze_dust.png Binary files differnew file mode 100644 index 0000000..a613205 --- /dev/null +++ b/technic/technic/textures/technic_bronze_dust.png diff --git a/technic/technic/textures/technic_bucket_corium.png b/technic/technic/textures/technic_bucket_corium.png Binary files differnew file mode 100644 index 0000000..82da7ca --- /dev/null +++ b/technic/technic/textures/technic_bucket_corium.png diff --git a/technic/technic/textures/technic_carbon_cloth.png b/technic/technic/textures/technic_carbon_cloth.png Binary files differnew file mode 100644 index 0000000..65a6dab --- /dev/null +++ b/technic/technic/textures/technic_carbon_cloth.png diff --git a/technic/technic/textures/technic_carbon_plate.png b/technic/technic/textures/technic_carbon_plate.png Binary files differnew file mode 100644 index 0000000..5da83b8 --- /dev/null +++ b/technic/technic/textures/technic_carbon_plate.png diff --git a/technic/technic/textures/technic_carbon_steel_dust.png b/technic/technic/textures/technic_carbon_steel_dust.png Binary files differnew file mode 100644 index 0000000..0fa8a17 --- /dev/null +++ b/technic/technic/textures/technic_carbon_steel_dust.png diff --git a/technic/technic/textures/technic_cast_iron_dust.png b/technic/technic/textures/technic_cast_iron_dust.png Binary files differnew file mode 100644 index 0000000..b5690ac --- /dev/null +++ b/technic/technic/textures/technic_cast_iron_dust.png diff --git a/technic/technic/textures/technic_chainsaw.png b/technic/technic/textures/technic_chainsaw.png Binary files differnew file mode 100644 index 0000000..1a69893 --- /dev/null +++ b/technic/technic/textures/technic_chainsaw.png diff --git a/technic/technic/textures/technic_chernobylite_block.png b/technic/technic/textures/technic_chernobylite_block.png Binary files differnew file mode 100644 index 0000000..a837c66 --- /dev/null +++ b/technic/technic/textures/technic_chernobylite_block.png diff --git a/technic/technic/textures/technic_chromium_dust.png b/technic/technic/textures/technic_chromium_dust.png Binary files differnew file mode 100644 index 0000000..0e48069 --- /dev/null +++ b/technic/technic/textures/technic_chromium_dust.png diff --git a/technic/technic/textures/technic_cnc_bottom.png b/technic/technic/textures/technic_cnc_bottom.png Binary files differnew file mode 100644 index 0000000..e600cb1 --- /dev/null +++ b/technic/technic/textures/technic_cnc_bottom.png diff --git a/technic/technic/textures/technic_cnc_cylinder.png b/technic/technic/textures/technic_cnc_cylinder.png Binary files differnew file mode 100644 index 0000000..48921bd --- /dev/null +++ b/technic/technic/textures/technic_cnc_cylinder.png diff --git a/technic/technic/textures/technic_cnc_cylinder_horizontal.png b/technic/technic/textures/technic_cnc_cylinder_horizontal.png Binary files differnew file mode 100644 index 0000000..82eb24c --- /dev/null +++ b/technic/technic/textures/technic_cnc_cylinder_horizontal.png diff --git a/technic/technic/textures/technic_cnc_element_cross.png b/technic/technic/textures/technic_cnc_element_cross.png Binary files differnew file mode 100644 index 0000000..cc66571 --- /dev/null +++ b/technic/technic/textures/technic_cnc_element_cross.png diff --git a/technic/technic/textures/technic_cnc_element_edge.png b/technic/technic/textures/technic_cnc_element_edge.png Binary files differnew file mode 100644 index 0000000..1245ea7 --- /dev/null +++ b/technic/technic/textures/technic_cnc_element_edge.png diff --git a/technic/technic/textures/technic_cnc_element_end.png b/technic/technic/textures/technic_cnc_element_end.png Binary files differnew file mode 100644 index 0000000..562eb2b --- /dev/null +++ b/technic/technic/textures/technic_cnc_element_end.png diff --git a/technic/technic/textures/technic_cnc_element_straight.png b/technic/technic/textures/technic_cnc_element_straight.png Binary files differnew file mode 100644 index 0000000..d42966e --- /dev/null +++ b/technic/technic/textures/technic_cnc_element_straight.png diff --git a/technic/technic/textures/technic_cnc_element_t.png b/technic/technic/textures/technic_cnc_element_t.png Binary files differnew file mode 100644 index 0000000..a462764 --- /dev/null +++ b/technic/technic/textures/technic_cnc_element_t.png diff --git a/technic/technic/textures/technic_cnc_front.png b/technic/technic/textures/technic_cnc_front.png Binary files differnew file mode 100644 index 0000000..6cc0490 --- /dev/null +++ b/technic/technic/textures/technic_cnc_front.png diff --git a/technic/technic/textures/technic_cnc_front_active.png b/technic/technic/textures/technic_cnc_front_active.png Binary files differnew file mode 100644 index 0000000..f7a3c7f --- /dev/null +++ b/technic/technic/textures/technic_cnc_front_active.png diff --git a/technic/technic/textures/technic_cnc_full.png b/technic/technic/textures/technic_cnc_full.png Binary files differnew file mode 100644 index 0000000..60f8a81 --- /dev/null +++ b/technic/technic/textures/technic_cnc_full.png diff --git a/technic/technic/textures/technic_cnc_half.png b/technic/technic/textures/technic_cnc_half.png Binary files differnew file mode 100644 index 0000000..2c4d3a8 --- /dev/null +++ b/technic/technic/textures/technic_cnc_half.png diff --git a/technic/technic/textures/technic_cnc_milling_background.png b/technic/technic/textures/technic_cnc_milling_background.png Binary files differnew file mode 100644 index 0000000..6a9c2f4 --- /dev/null +++ b/technic/technic/textures/technic_cnc_milling_background.png diff --git a/technic/technic/textures/technic_cnc_oblate_spheroid.png b/technic/technic/textures/technic_cnc_oblate_spheroid.png Binary files differnew file mode 100644 index 0000000..b196e7d --- /dev/null +++ b/technic/technic/textures/technic_cnc_oblate_spheroid.png diff --git a/technic/technic/textures/technic_cnc_onecurvededge.png b/technic/technic/textures/technic_cnc_onecurvededge.png Binary files differnew file mode 100644 index 0000000..8325846 --- /dev/null +++ b/technic/technic/textures/technic_cnc_onecurvededge.png diff --git a/technic/technic/textures/technic_cnc_pyramid.png b/technic/technic/textures/technic_cnc_pyramid.png Binary files differnew file mode 100644 index 0000000..d8cc713 --- /dev/null +++ b/technic/technic/textures/technic_cnc_pyramid.png diff --git a/technic/technic/textures/technic_cnc_side.png b/technic/technic/textures/technic_cnc_side.png Binary files differnew file mode 100644 index 0000000..1ecbbac --- /dev/null +++ b/technic/technic/textures/technic_cnc_side.png diff --git a/technic/technic/textures/technic_cnc_slope.png b/technic/technic/textures/technic_cnc_slope.png Binary files differnew file mode 100644 index 0000000..493d560 --- /dev/null +++ b/technic/technic/textures/technic_cnc_slope.png diff --git a/technic/technic/textures/technic_cnc_slope_edge.png b/technic/technic/textures/technic_cnc_slope_edge.png Binary files differnew file mode 100644 index 0000000..1b601c4 --- /dev/null +++ b/technic/technic/textures/technic_cnc_slope_edge.png diff --git a/technic/technic/textures/technic_cnc_slope_edge_upsdwn.png b/technic/technic/textures/technic_cnc_slope_edge_upsdwn.png Binary files differnew file mode 100644 index 0000000..350c22d --- /dev/null +++ b/technic/technic/textures/technic_cnc_slope_edge_upsdwn.png diff --git a/technic/technic/textures/technic_cnc_slope_inner_edge.png b/technic/technic/textures/technic_cnc_slope_inner_edge.png Binary files differnew file mode 100644 index 0000000..3f5ab9e --- /dev/null +++ b/technic/technic/textures/technic_cnc_slope_inner_edge.png diff --git a/technic/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png b/technic/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png Binary files differnew file mode 100644 index 0000000..a1fee78 --- /dev/null +++ b/technic/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png diff --git a/technic/technic/textures/technic_cnc_slope_lying.png b/technic/technic/textures/technic_cnc_slope_lying.png Binary files differnew file mode 100644 index 0000000..099ed59 --- /dev/null +++ b/technic/technic/textures/technic_cnc_slope_lying.png diff --git a/technic/technic/textures/technic_cnc_slope_upsdwn.png b/technic/technic/textures/technic_cnc_slope_upsdwn.png Binary files differnew file mode 100644 index 0000000..2a34b8b --- /dev/null +++ b/technic/technic/textures/technic_cnc_slope_upsdwn.png diff --git a/technic/technic/textures/technic_cnc_sphere.png b/technic/technic/textures/technic_cnc_sphere.png Binary files differnew file mode 100644 index 0000000..791b32b --- /dev/null +++ b/technic/technic/textures/technic_cnc_sphere.png diff --git a/technic/technic/textures/technic_cnc_spike.png b/technic/technic/textures/technic_cnc_spike.png Binary files differnew file mode 100644 index 0000000..b445b40 --- /dev/null +++ b/technic/technic/textures/technic_cnc_spike.png diff --git a/technic/technic/textures/technic_cnc_stick.png b/technic/technic/textures/technic_cnc_stick.png Binary files differnew file mode 100644 index 0000000..acaf1cb --- /dev/null +++ b/technic/technic/textures/technic_cnc_stick.png diff --git a/technic/technic/textures/technic_cnc_top.png b/technic/technic/textures/technic_cnc_top.png Binary files differnew file mode 100644 index 0000000..5123334 --- /dev/null +++ b/technic/technic/textures/technic_cnc_top.png diff --git a/technic/technic/textures/technic_cnc_top_active.png b/technic/technic/textures/technic_cnc_top_active.png Binary files differnew file mode 100644 index 0000000..2bc9d81 --- /dev/null +++ b/technic/technic/textures/technic_cnc_top_active.png diff --git a/technic/technic/textures/technic_cnc_twocurvededge.png b/technic/technic/textures/technic_cnc_twocurvededge.png Binary files differnew file mode 100644 index 0000000..b50a257 --- /dev/null +++ b/technic/technic/textures/technic_cnc_twocurvededge.png diff --git a/technic/technic/textures/technic_coal_alloy_furnace_bottom.png b/technic/technic/textures/technic_coal_alloy_furnace_bottom.png Binary files differnew file mode 100644 index 0000000..077dec5 --- /dev/null +++ b/technic/technic/textures/technic_coal_alloy_furnace_bottom.png diff --git a/technic/technic/textures/technic_coal_alloy_furnace_front.png b/technic/technic/textures/technic_coal_alloy_furnace_front.png Binary files differnew file mode 100644 index 0000000..d9d93dd --- /dev/null +++ b/technic/technic/textures/technic_coal_alloy_furnace_front.png diff --git a/technic/technic/textures/technic_coal_alloy_furnace_front_active.png b/technic/technic/textures/technic_coal_alloy_furnace_front_active.png Binary files differnew file mode 100644 index 0000000..ffc4e0a --- /dev/null +++ b/technic/technic/textures/technic_coal_alloy_furnace_front_active.png diff --git a/technic/technic/textures/technic_coal_alloy_furnace_side.png b/technic/technic/textures/technic_coal_alloy_furnace_side.png Binary files differnew file mode 100644 index 0000000..d5c7066 --- /dev/null +++ b/technic/technic/textures/technic_coal_alloy_furnace_side.png diff --git a/technic/technic/textures/technic_coal_alloy_furnace_top.png b/technic/technic/textures/technic_coal_alloy_furnace_top.png Binary files differnew file mode 100644 index 0000000..6424fc0 --- /dev/null +++ b/technic/technic/textures/technic_coal_alloy_furnace_top.png diff --git a/technic/technic/textures/technic_coal_dust.png b/technic/technic/textures/technic_coal_dust.png Binary files differnew file mode 100644 index 0000000..a1486c6 --- /dev/null +++ b/technic/technic/textures/technic_coal_dust.png diff --git a/technic/technic/textures/technic_common_tree_grindings.png b/technic/technic/textures/technic_common_tree_grindings.png Binary files differnew file mode 100644 index 0000000..e17bb69 --- /dev/null +++ b/technic/technic/textures/technic_common_tree_grindings.png diff --git a/technic/technic/textures/technic_composite_plate.png b/technic/technic/textures/technic_composite_plate.png Binary files differnew file mode 100644 index 0000000..79b7b8d --- /dev/null +++ b/technic/technic/textures/technic_composite_plate.png diff --git a/technic/technic/textures/technic_constructor_back.png b/technic/technic/textures/technic_constructor_back.png Binary files differnew file mode 100644 index 0000000..f002363 --- /dev/null +++ b/technic/technic/textures/technic_constructor_back.png diff --git a/technic/technic/textures/technic_constructor_front_off.png b/technic/technic/textures/technic_constructor_front_off.png Binary files differnew file mode 100644 index 0000000..f3f7856 --- /dev/null +++ b/technic/technic/textures/technic_constructor_front_off.png diff --git a/technic/technic/textures/technic_constructor_front_on.png b/technic/technic/textures/technic_constructor_front_on.png Binary files differnew file mode 100644 index 0000000..d733765 --- /dev/null +++ b/technic/technic/textures/technic_constructor_front_on.png diff --git a/technic/technic/textures/technic_constructor_mk1_bottom_off.png b/technic/technic/textures/technic_constructor_mk1_bottom_off.png Binary files differnew file mode 100644 index 0000000..0c52557 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk1_bottom_off.png diff --git a/technic/technic/textures/technic_constructor_mk1_bottom_on.png b/technic/technic/textures/technic_constructor_mk1_bottom_on.png Binary files differnew file mode 100644 index 0000000..0c46c57 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk1_bottom_on.png diff --git a/technic/technic/textures/technic_constructor_mk1_side1_off.png b/technic/technic/textures/technic_constructor_mk1_side1_off.png Binary files differnew file mode 100644 index 0000000..e64ddbe --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk1_side1_off.png diff --git a/technic/technic/textures/technic_constructor_mk1_side1_on.png b/technic/technic/textures/technic_constructor_mk1_side1_on.png Binary files differnew file mode 100644 index 0000000..eda98d8 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk1_side1_on.png diff --git a/technic/technic/textures/technic_constructor_mk1_side2_off.png b/technic/technic/textures/technic_constructor_mk1_side2_off.png Binary files differnew file mode 100644 index 0000000..b33fcfb --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk1_side2_off.png diff --git a/technic/technic/textures/technic_constructor_mk1_side2_on.png b/technic/technic/textures/technic_constructor_mk1_side2_on.png Binary files differnew file mode 100644 index 0000000..17e4786 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk1_side2_on.png diff --git a/technic/technic/textures/technic_constructor_mk1_top_off.png b/technic/technic/textures/technic_constructor_mk1_top_off.png Binary files differnew file mode 100644 index 0000000..9f3846c --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk1_top_off.png diff --git a/technic/technic/textures/technic_constructor_mk1_top_on.png b/technic/technic/textures/technic_constructor_mk1_top_on.png Binary files differnew file mode 100644 index 0000000..5c8d6fb --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk1_top_on.png diff --git a/technic/technic/textures/technic_constructor_mk2_bottom_off.png b/technic/technic/textures/technic_constructor_mk2_bottom_off.png Binary files differnew file mode 100644 index 0000000..e926dda --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk2_bottom_off.png diff --git a/technic/technic/textures/technic_constructor_mk2_bottom_on.png b/technic/technic/textures/technic_constructor_mk2_bottom_on.png Binary files differnew file mode 100644 index 0000000..52d739b --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk2_bottom_on.png diff --git a/technic/technic/textures/technic_constructor_mk2_side1_off.png b/technic/technic/textures/technic_constructor_mk2_side1_off.png Binary files differnew file mode 100644 index 0000000..2fd42a2 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk2_side1_off.png diff --git a/technic/technic/textures/technic_constructor_mk2_side1_on.png b/technic/technic/textures/technic_constructor_mk2_side1_on.png Binary files differnew file mode 100644 index 0000000..4c75c83 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk2_side1_on.png diff --git a/technic/technic/textures/technic_constructor_mk2_side2_off.png b/technic/technic/textures/technic_constructor_mk2_side2_off.png Binary files differnew file mode 100644 index 0000000..f6407e7 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk2_side2_off.png diff --git a/technic/technic/textures/technic_constructor_mk2_side2_on.png b/technic/technic/textures/technic_constructor_mk2_side2_on.png Binary files differnew file mode 100644 index 0000000..e40db48 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk2_side2_on.png diff --git a/technic/technic/textures/technic_constructor_mk2_top_off.png b/technic/technic/textures/technic_constructor_mk2_top_off.png Binary files differnew file mode 100644 index 0000000..e5227d1 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk2_top_off.png diff --git a/technic/technic/textures/technic_constructor_mk2_top_on.png b/technic/technic/textures/technic_constructor_mk2_top_on.png Binary files differnew file mode 100644 index 0000000..9762bd6 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk2_top_on.png diff --git a/technic/technic/textures/technic_constructor_mk3_bottom_off.png b/technic/technic/textures/technic_constructor_mk3_bottom_off.png Binary files differnew file mode 100644 index 0000000..606d97e --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk3_bottom_off.png diff --git a/technic/technic/textures/technic_constructor_mk3_bottom_on.png b/technic/technic/textures/technic_constructor_mk3_bottom_on.png Binary files differnew file mode 100644 index 0000000..878e4ff --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk3_bottom_on.png diff --git a/technic/technic/textures/technic_constructor_mk3_side1_off.png b/technic/technic/textures/technic_constructor_mk3_side1_off.png Binary files differnew file mode 100644 index 0000000..84dd7eb --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk3_side1_off.png diff --git a/technic/technic/textures/technic_constructor_mk3_side1_on.png b/technic/technic/textures/technic_constructor_mk3_side1_on.png Binary files differnew file mode 100644 index 0000000..2741d2d --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk3_side1_on.png diff --git a/technic/technic/textures/technic_constructor_mk3_side2_off.png b/technic/technic/textures/technic_constructor_mk3_side2_off.png Binary files differnew file mode 100644 index 0000000..75a5031 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk3_side2_off.png diff --git a/technic/technic/textures/technic_constructor_mk3_side2_on.png b/technic/technic/textures/technic_constructor_mk3_side2_on.png Binary files differnew file mode 100644 index 0000000..0a150ed --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk3_side2_on.png diff --git a/technic/technic/textures/technic_constructor_mk3_top_off.png b/technic/technic/textures/technic_constructor_mk3_top_off.png Binary files differnew file mode 100644 index 0000000..c716752 --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk3_top_off.png diff --git a/technic/technic/textures/technic_constructor_mk3_top_on.png b/technic/technic/textures/technic_constructor_mk3_top_on.png Binary files differnew file mode 100644 index 0000000..acbe85b --- /dev/null +++ b/technic/technic/textures/technic_constructor_mk3_top_on.png diff --git a/technic/technic/textures/technic_control_logic_unit.png b/technic/technic/textures/technic_control_logic_unit.png Binary files differnew file mode 100644 index 0000000..c7b4b16 --- /dev/null +++ b/technic/technic/textures/technic_control_logic_unit.png diff --git a/technic/technic/textures/technic_copper_coil.png b/technic/technic/textures/technic_copper_coil.png Binary files differnew file mode 100644 index 0000000..db6db1a --- /dev/null +++ b/technic/technic/textures/technic_copper_coil.png diff --git a/technic/technic/textures/technic_copper_dust.png b/technic/technic/textures/technic_copper_dust.png Binary files differnew file mode 100644 index 0000000..cad33ea --- /dev/null +++ b/technic/technic/textures/technic_copper_dust.png diff --git a/technic/technic/textures/technic_copper_plate.png b/technic/technic/textures/technic_copper_plate.png Binary files differnew file mode 100644 index 0000000..99a49c8 --- /dev/null +++ b/technic/technic/textures/technic_copper_plate.png diff --git a/technic/technic/textures/technic_corium_flowing_animated.png b/technic/technic/textures/technic_corium_flowing_animated.png Binary files differnew file mode 100644 index 0000000..1d29f16 --- /dev/null +++ b/technic/technic/textures/technic_corium_flowing_animated.png diff --git a/technic/technic/textures/technic_corium_source_animated.png b/technic/technic/textures/technic_corium_source_animated.png Binary files differnew file mode 100644 index 0000000..6c3ee56 --- /dev/null +++ b/technic/technic/textures/technic_corium_source_animated.png diff --git a/technic/technic/textures/technic_deployer_back.png b/technic/technic/textures/technic_deployer_back.png Binary files differnew file mode 100644 index 0000000..12e5a31 --- /dev/null +++ b/technic/technic/textures/technic_deployer_back.png diff --git a/technic/technic/textures/technic_deployer_bottom.png b/technic/technic/textures/technic_deployer_bottom.png Binary files differnew file mode 100644 index 0000000..febbe18 --- /dev/null +++ b/technic/technic/textures/technic_deployer_bottom.png diff --git a/technic/technic/textures/technic_deployer_front_off.png b/technic/technic/textures/technic_deployer_front_off.png Binary files differnew file mode 100644 index 0000000..9593112 --- /dev/null +++ b/technic/technic/textures/technic_deployer_front_off.png diff --git a/technic/technic/textures/technic_deployer_front_on.png b/technic/technic/textures/technic_deployer_front_on.png Binary files differnew file mode 100644 index 0000000..f78de4c --- /dev/null +++ b/technic/technic/textures/technic_deployer_front_on.png diff --git a/technic/technic/textures/technic_deployer_side.png b/technic/technic/textures/technic_deployer_side.png Binary files differnew file mode 100644 index 0000000..73af8f8 --- /dev/null +++ b/technic/technic/textures/technic_deployer_side.png diff --git a/technic/technic/textures/technic_deployer_side1.png b/technic/technic/textures/technic_deployer_side1.png Binary files differnew file mode 100644 index 0000000..8ef28d3 --- /dev/null +++ b/technic/technic/textures/technic_deployer_side1.png diff --git a/technic/technic/textures/technic_deployer_side2.png b/technic/technic/textures/technic_deployer_side2.png Binary files differnew file mode 100644 index 0000000..ccb2cb9 --- /dev/null +++ b/technic/technic/textures/technic_deployer_side2.png diff --git a/technic/technic/textures/technic_deployer_top.png b/technic/technic/textures/technic_deployer_top.png Binary files differnew file mode 100644 index 0000000..262c9f6 --- /dev/null +++ b/technic/technic/textures/technic_deployer_top.png diff --git a/technic/technic/textures/technic_diamond_block_blue.png b/technic/technic/textures/technic_diamond_block_blue.png Binary files differnew file mode 100644 index 0000000..9f59fba --- /dev/null +++ b/technic/technic/textures/technic_diamond_block_blue.png diff --git a/technic/technic/textures/technic_diamond_block_green.png b/technic/technic/textures/technic_diamond_block_green.png Binary files differnew file mode 100644 index 0000000..585c4b8 --- /dev/null +++ b/technic/technic/textures/technic_diamond_block_green.png diff --git a/technic/technic/textures/technic_diamond_block_red.png b/technic/technic/textures/technic_diamond_block_red.png Binary files differnew file mode 100644 index 0000000..ed30957 --- /dev/null +++ b/technic/technic/textures/technic_diamond_block_red.png diff --git a/technic/technic/textures/technic_diamond_drill_head.png b/technic/technic/textures/technic_diamond_drill_head.png Binary files differnew file mode 100644 index 0000000..e3d31e8 --- /dev/null +++ b/technic/technic/textures/technic_diamond_drill_head.png diff --git a/technic/technic/textures/technic_doped_silicon_wafer.png b/technic/technic/textures/technic_doped_silicon_wafer.png Binary files differnew file mode 100644 index 0000000..6365137 --- /dev/null +++ b/technic/technic/textures/technic_doped_silicon_wafer.png diff --git a/technic/technic/textures/technic_fine_copper_wire.png b/technic/technic/textures/technic_fine_copper_wire.png Binary files differnew file mode 100644 index 0000000..3e663bb --- /dev/null +++ b/technic/technic/textures/technic_fine_copper_wire.png diff --git a/technic/technic/textures/technic_fine_gold_wire.png b/technic/technic/textures/technic_fine_gold_wire.png Binary files differnew file mode 100644 index 0000000..54a7a52 --- /dev/null +++ b/technic/technic/textures/technic_fine_gold_wire.png diff --git a/technic/technic/textures/technic_fine_silver_wire.png b/technic/technic/textures/technic_fine_silver_wire.png Binary files differnew file mode 100644 index 0000000..f40a52b --- /dev/null +++ b/technic/technic/textures/technic_fine_silver_wire.png diff --git a/technic/technic/textures/technic_flashlight.png b/technic/technic/textures/technic_flashlight.png Binary files differnew file mode 100644 index 0000000..8e7b75a --- /dev/null +++ b/technic/technic/textures/technic_flashlight.png diff --git a/technic/technic/textures/technic_forcefield_animated.png b/technic/technic/textures/technic_forcefield_animated.png Binary files differnew file mode 100644 index 0000000..7763840 --- /dev/null +++ b/technic/technic/textures/technic_forcefield_animated.png diff --git a/technic/technic/textures/technic_forcefield_emitter_off.png b/technic/technic/textures/technic_forcefield_emitter_off.png Binary files differnew file mode 100644 index 0000000..4c4582f --- /dev/null +++ b/technic/technic/textures/technic_forcefield_emitter_off.png diff --git a/technic/technic/textures/technic_forcefield_emitter_on.png b/technic/technic/textures/technic_forcefield_emitter_on.png Binary files differnew file mode 100644 index 0000000..1f32af6 --- /dev/null +++ b/technic/technic/textures/technic_forcefield_emitter_on.png diff --git a/technic/technic/textures/technic_frame.png b/technic/technic/textures/technic_frame.png Binary files differnew file mode 100644 index 0000000..4998120 --- /dev/null +++ b/technic/technic/textures/technic_frame.png diff --git a/technic/technic/textures/technic_geothermal_side.png b/technic/technic/textures/technic_geothermal_side.png Binary files differnew file mode 100644 index 0000000..90fb430 --- /dev/null +++ b/technic/technic/textures/technic_geothermal_side.png diff --git a/technic/technic/textures/technic_geothermal_top.png b/technic/technic/textures/technic_geothermal_top.png Binary files differnew file mode 100644 index 0000000..601ff15 --- /dev/null +++ b/technic/technic/textures/technic_geothermal_top.png diff --git a/technic/technic/textures/technic_geothermal_top_active.png b/technic/technic/textures/technic_geothermal_top_active.png Binary files differnew file mode 100644 index 0000000..f02bec6 --- /dev/null +++ b/technic/technic/textures/technic_geothermal_top_active.png diff --git a/technic/technic/textures/technic_gold_dust.png b/technic/technic/textures/technic_gold_dust.png Binary files differnew file mode 100644 index 0000000..48c24ae --- /dev/null +++ b/technic/technic/textures/technic_gold_dust.png diff --git a/technic/technic/textures/technic_graphite.png b/technic/technic/textures/technic_graphite.png Binary files differnew file mode 100644 index 0000000..00cd0ee --- /dev/null +++ b/technic/technic/textures/technic_graphite.png diff --git a/technic/technic/textures/technic_grinder_front.png b/technic/technic/textures/technic_grinder_front.png Binary files differnew file mode 100644 index 0000000..a28dbc1 --- /dev/null +++ b/technic/technic/textures/technic_grinder_front.png diff --git a/technic/technic/textures/technic_grinder_side.png b/technic/technic/textures/technic_grinder_side.png Binary files differnew file mode 100644 index 0000000..af562f2 --- /dev/null +++ b/technic/technic/textures/technic_grinder_side.png diff --git a/technic/technic/textures/technic_grinder_top.png b/technic/technic/textures/technic_grinder_top.png Binary files differnew file mode 100644 index 0000000..b074e13 --- /dev/null +++ b/technic/technic/textures/technic_grinder_top.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides.png b/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides.png Binary files differnew file mode 100644 index 0000000..9121999 --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.png b/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.png Binary files differnew file mode 100644 index 0000000..c8006eb --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_white_tb.png b/technic/technic/textures/technic_homedecor_glowlight_cube_white_tb.png Binary files differnew file mode 100644 index 0000000..b2e355a --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_cube_white_tb.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.png b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.png Binary files differnew file mode 100644 index 0000000..b79be07 --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.png b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.png Binary files differnew file mode 100644 index 0000000..a9d397a --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.png b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.png Binary files differnew file mode 100644 index 0000000..daf03ab --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_thick_white_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thick_white_sides.png Binary files differnew file mode 100644 index 0000000..44c2b36 --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_thick_white_sides.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.png Binary files differnew file mode 100644 index 0000000..937999e --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.png Binary files differnew file mode 100644 index 0000000..769b054 --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.png Binary files differnew file mode 100644 index 0000000..57820f1 --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_thin_white_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thin_white_sides.png Binary files differnew file mode 100644 index 0000000..0a337a5 --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_thin_white_sides.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.png Binary files differnew file mode 100644 index 0000000..0fd3b1e --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.png Binary files differnew file mode 100644 index 0000000..55bb6c0 --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.png Binary files differnew file mode 100644 index 0000000..4b28a27 --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_white_tb.png b/technic/technic/textures/technic_homedecor_glowlight_white_tb.png Binary files differnew file mode 100644 index 0000000..fdc8a4d --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_white_tb.png diff --git a/technic/technic/textures/technic_homedecor_glowlight_yellow_tb.png b/technic/technic/textures/technic_homedecor_glowlight_yellow_tb.png Binary files differnew file mode 100644 index 0000000..ffd9c58 --- /dev/null +++ b/technic/technic/textures/technic_homedecor_glowlight_yellow_tb.png diff --git a/technic/technic/textures/technic_hv_battery_box_bottom.png b/technic/technic/textures/technic_hv_battery_box_bottom.png Binary files differnew file mode 100644 index 0000000..996b2d4 --- /dev/null +++ b/technic/technic/textures/technic_hv_battery_box_bottom.png diff --git a/technic/technic/textures/technic_hv_battery_box_side.png b/technic/technic/textures/technic_hv_battery_box_side.png Binary files differnew file mode 100644 index 0000000..fffd8ea --- /dev/null +++ b/technic/technic/textures/technic_hv_battery_box_side.png diff --git a/technic/technic/textures/technic_hv_battery_box_top.png b/technic/technic/textures/technic_hv_battery_box_top.png Binary files differnew file mode 100644 index 0000000..49dee71 --- /dev/null +++ b/technic/technic/textures/technic_hv_battery_box_top.png diff --git a/technic/technic/textures/technic_hv_cable.png b/technic/technic/textures/technic_hv_cable.png Binary files differnew file mode 100644 index 0000000..7cb368d --- /dev/null +++ b/technic/technic/textures/technic_hv_cable.png diff --git a/technic/technic/textures/technic_hv_cable_wield.png b/technic/technic/textures/technic_hv_cable_wield.png Binary files differnew file mode 100644 index 0000000..7b9ca58 --- /dev/null +++ b/technic/technic/textures/technic_hv_cable_wield.png diff --git a/technic/technic/textures/technic_hv_down_converter_bottom.png b/technic/technic/textures/technic_hv_down_converter_bottom.png Binary files differnew file mode 100644 index 0000000..996b2d4 --- /dev/null +++ b/technic/technic/textures/technic_hv_down_converter_bottom.png diff --git a/technic/technic/textures/technic_hv_down_converter_side.png b/technic/technic/textures/technic_hv_down_converter_side.png Binary files differnew file mode 100644 index 0000000..ab904f1 --- /dev/null +++ b/technic/technic/textures/technic_hv_down_converter_side.png diff --git a/technic/technic/textures/technic_hv_down_converter_top.png b/technic/technic/textures/technic_hv_down_converter_top.png Binary files differnew file mode 100644 index 0000000..996b2d4 --- /dev/null +++ b/technic/technic/textures/technic_hv_down_converter_top.png diff --git a/technic/technic/textures/technic_hv_generator_front.png b/technic/technic/textures/technic_hv_generator_front.png Binary files differnew file mode 100644 index 0000000..6a14686 --- /dev/null +++ b/technic/technic/textures/technic_hv_generator_front.png diff --git a/technic/technic/textures/technic_hv_generator_front_active.png b/technic/technic/textures/technic_hv_generator_front_active.png Binary files differnew file mode 100644 index 0000000..d92c699 --- /dev/null +++ b/technic/technic/textures/technic_hv_generator_front_active.png diff --git a/technic/technic/textures/technic_hv_generator_side.png b/technic/technic/textures/technic_hv_generator_side.png Binary files differnew file mode 100644 index 0000000..3073e0f --- /dev/null +++ b/technic/technic/textures/technic_hv_generator_side.png diff --git a/technic/technic/textures/technic_hv_generator_top.png b/technic/technic/textures/technic_hv_generator_top.png Binary files differnew file mode 100644 index 0000000..646168c --- /dev/null +++ b/technic/technic/textures/technic_hv_generator_top.png diff --git a/technic/technic/textures/technic_hv_grinder_bottom.png b/technic/technic/textures/technic_hv_grinder_bottom.png Binary files differnew file mode 100644 index 0000000..fa2c135 --- /dev/null +++ b/technic/technic/textures/technic_hv_grinder_bottom.png diff --git a/technic/technic/textures/technic_hv_grinder_front.png b/technic/technic/textures/technic_hv_grinder_front.png Binary files differnew file mode 100644 index 0000000..a5bca0a --- /dev/null +++ b/technic/technic/textures/technic_hv_grinder_front.png diff --git a/technic/technic/textures/technic_hv_grinder_front_active.png b/technic/technic/textures/technic_hv_grinder_front_active.png Binary files differnew file mode 100644 index 0000000..4077630 --- /dev/null +++ b/technic/technic/textures/technic_hv_grinder_front_active.png diff --git a/technic/technic/textures/technic_hv_grinder_side.png b/technic/technic/textures/technic_hv_grinder_side.png Binary files differnew file mode 100644 index 0000000..c3063c4 --- /dev/null +++ b/technic/technic/textures/technic_hv_grinder_side.png diff --git a/technic/technic/textures/technic_hv_grinder_side_tube.png b/technic/technic/textures/technic_hv_grinder_side_tube.png Binary files differnew file mode 100644 index 0000000..43bcca5 --- /dev/null +++ b/technic/technic/textures/technic_hv_grinder_side_tube.png diff --git a/technic/technic/textures/technic_hv_grinder_top.png b/technic/technic/textures/technic_hv_grinder_top.png Binary files differnew file mode 100644 index 0000000..e0df36b --- /dev/null +++ b/technic/technic/textures/technic_hv_grinder_top.png diff --git a/technic/technic/textures/technic_hv_nuclear_reactor_core.png b/technic/technic/textures/technic_hv_nuclear_reactor_core.png Binary files differnew file mode 100644 index 0000000..4661177 --- /dev/null +++ b/technic/technic/textures/technic_hv_nuclear_reactor_core.png diff --git a/technic/technic/textures/technic_hv_solar_array_bottom.png b/technic/technic/textures/technic_hv_solar_array_bottom.png Binary files differnew file mode 100644 index 0000000..596e79a --- /dev/null +++ b/technic/technic/textures/technic_hv_solar_array_bottom.png diff --git a/technic/technic/textures/technic_hv_solar_array_side.png b/technic/technic/textures/technic_hv_solar_array_side.png Binary files differnew file mode 100644 index 0000000..a3aa8c7 --- /dev/null +++ b/technic/technic/textures/technic_hv_solar_array_side.png diff --git a/technic/technic/textures/technic_hv_solar_array_top.png b/technic/technic/textures/technic_hv_solar_array_top.png Binary files differnew file mode 100644 index 0000000..b7f0b43 --- /dev/null +++ b/technic/technic/textures/technic_hv_solar_array_top.png diff --git a/technic/technic/textures/technic_hv_transformer.png b/technic/technic/textures/technic_hv_transformer.png Binary files differnew file mode 100644 index 0000000..e1d4c98 --- /dev/null +++ b/technic/technic/textures/technic_hv_transformer.png diff --git a/technic/technic/textures/technic_injector_bottom.png b/technic/technic/textures/technic_injector_bottom.png Binary files differnew file mode 100644 index 0000000..39916bd --- /dev/null +++ b/technic/technic/textures/technic_injector_bottom.png diff --git a/technic/technic/textures/technic_injector_side.png b/technic/technic/textures/technic_injector_side.png Binary files differnew file mode 100644 index 0000000..a5419a1 --- /dev/null +++ b/technic/technic/textures/technic_injector_side.png diff --git a/technic/technic/textures/technic_injector_top.png b/technic/technic/textures/technic_injector_top.png Binary files differnew file mode 100644 index 0000000..440649c --- /dev/null +++ b/technic/technic/textures/technic_injector_top.png diff --git a/technic/technic/textures/technic_kalite_dust.png b/technic/technic/textures/technic_kalite_dust.png Binary files differnew file mode 100644 index 0000000..3a9e10f --- /dev/null +++ b/technic/technic/textures/technic_kalite_dust.png diff --git a/technic/technic/textures/technic_laser_beam_mk1.png b/technic/technic/textures/technic_laser_beam_mk1.png Binary files differnew file mode 100644 index 0000000..4cf9b3e --- /dev/null +++ b/technic/technic/textures/technic_laser_beam_mk1.png diff --git a/technic/technic/textures/technic_laser_beam_mk2.png b/technic/technic/textures/technic_laser_beam_mk2.png Binary files differnew file mode 100644 index 0000000..9e27a8c --- /dev/null +++ b/technic/technic/textures/technic_laser_beam_mk2.png diff --git a/technic/technic/textures/technic_laser_beam_mk3.png b/technic/technic/textures/technic_laser_beam_mk3.png Binary files differnew file mode 100644 index 0000000..5a17e83 --- /dev/null +++ b/technic/technic/textures/technic_laser_beam_mk3.png diff --git a/technic/technic/textures/technic_lava_can.png b/technic/technic/textures/technic_lava_can.png Binary files differnew file mode 100644 index 0000000..abe1a8c --- /dev/null +++ b/technic/technic/textures/technic_lava_can.png diff --git a/technic/technic/textures/technic_light.png b/technic/technic/textures/technic_light.png Binary files differnew file mode 100644 index 0000000..334cb07 --- /dev/null +++ b/technic/technic/textures/technic_light.png diff --git a/technic/technic/textures/technic_lv_alloy_furnace_bottom.png b/technic/technic/textures/technic_lv_alloy_furnace_bottom.png Binary files differnew file mode 100644 index 0000000..2c0aaee --- /dev/null +++ b/technic/technic/textures/technic_lv_alloy_furnace_bottom.png diff --git a/technic/technic/textures/technic_lv_alloy_furnace_front.png b/technic/technic/textures/technic_lv_alloy_furnace_front.png Binary files differnew file mode 100644 index 0000000..2d65cda --- /dev/null +++ b/technic/technic/textures/technic_lv_alloy_furnace_front.png diff --git a/technic/technic/textures/technic_lv_alloy_furnace_front_active.png b/technic/technic/textures/technic_lv_alloy_furnace_front_active.png Binary files differnew file mode 100644 index 0000000..1ced989 --- /dev/null +++ b/technic/technic/textures/technic_lv_alloy_furnace_front_active.png diff --git a/technic/technic/textures/technic_lv_alloy_furnace_side.png b/technic/technic/textures/technic_lv_alloy_furnace_side.png Binary files differnew file mode 100644 index 0000000..778ad88 --- /dev/null +++ b/technic/technic/textures/technic_lv_alloy_furnace_side.png diff --git a/technic/technic/textures/technic_lv_alloy_furnace_top.png b/technic/technic/textures/technic_lv_alloy_furnace_top.png Binary files differnew file mode 100644 index 0000000..706793b --- /dev/null +++ b/technic/technic/textures/technic_lv_alloy_furnace_top.png diff --git a/technic/technic/textures/technic_lv_battery_box_bottom.png b/technic/technic/textures/technic_lv_battery_box_bottom.png Binary files differnew file mode 100644 index 0000000..a6124e6 --- /dev/null +++ b/technic/technic/textures/technic_lv_battery_box_bottom.png diff --git a/technic/technic/textures/technic_lv_battery_box_side.png b/technic/technic/textures/technic_lv_battery_box_side.png Binary files differnew file mode 100644 index 0000000..24d4e4e --- /dev/null +++ b/technic/technic/textures/technic_lv_battery_box_side.png diff --git a/technic/technic/textures/technic_lv_battery_box_top.png b/technic/technic/textures/technic_lv_battery_box_top.png Binary files differnew file mode 100644 index 0000000..b32100f --- /dev/null +++ b/technic/technic/textures/technic_lv_battery_box_top.png diff --git a/technic/technic/textures/technic_lv_cable.png b/technic/technic/textures/technic_lv_cable.png Binary files differnew file mode 100644 index 0000000..0071bc9 --- /dev/null +++ b/technic/technic/textures/technic_lv_cable.png diff --git a/technic/technic/textures/technic_lv_cable_wield.png b/technic/technic/textures/technic_lv_cable_wield.png Binary files differnew file mode 100644 index 0000000..bc7704d --- /dev/null +++ b/technic/technic/textures/technic_lv_cable_wield.png diff --git a/technic/technic/textures/technic_lv_compressor_back.png b/technic/technic/textures/technic_lv_compressor_back.png Binary files differnew file mode 100644 index 0000000..11286e3 --- /dev/null +++ b/technic/technic/textures/technic_lv_compressor_back.png diff --git a/technic/technic/textures/technic_lv_compressor_bottom.png b/technic/technic/textures/technic_lv_compressor_bottom.png Binary files differnew file mode 100644 index 0000000..886f27e --- /dev/null +++ b/technic/technic/textures/technic_lv_compressor_bottom.png diff --git a/technic/technic/textures/technic_lv_compressor_front.png b/technic/technic/textures/technic_lv_compressor_front.png Binary files differnew file mode 100644 index 0000000..007d6de --- /dev/null +++ b/technic/technic/textures/technic_lv_compressor_front.png diff --git a/technic/technic/textures/technic_lv_compressor_front_active.png b/technic/technic/textures/technic_lv_compressor_front_active.png Binary files differnew file mode 100644 index 0000000..b3d27c0 --- /dev/null +++ b/technic/technic/textures/technic_lv_compressor_front_active.png diff --git a/technic/technic/textures/technic_lv_compressor_side.png b/technic/technic/textures/technic_lv_compressor_side.png Binary files differnew file mode 100644 index 0000000..87acda6 --- /dev/null +++ b/technic/technic/textures/technic_lv_compressor_side.png diff --git a/technic/technic/textures/technic_lv_compressor_top.png b/technic/technic/textures/technic_lv_compressor_top.png Binary files differnew file mode 100644 index 0000000..786b859 --- /dev/null +++ b/technic/technic/textures/technic_lv_compressor_top.png diff --git a/technic/technic/textures/technic_lv_electric_furnace_bottom.png b/technic/technic/textures/technic_lv_electric_furnace_bottom.png Binary files differnew file mode 100644 index 0000000..15fa6de --- /dev/null +++ b/technic/technic/textures/technic_lv_electric_furnace_bottom.png diff --git a/technic/technic/textures/technic_lv_electric_furnace_front.png b/technic/technic/textures/technic_lv_electric_furnace_front.png Binary files differnew file mode 100644 index 0000000..755aadf --- /dev/null +++ b/technic/technic/textures/technic_lv_electric_furnace_front.png diff --git a/technic/technic/textures/technic_lv_electric_furnace_front_active.png b/technic/technic/textures/technic_lv_electric_furnace_front_active.png Binary files differnew file mode 100644 index 0000000..de7f1f9 --- /dev/null +++ b/technic/technic/textures/technic_lv_electric_furnace_front_active.png diff --git a/technic/technic/textures/technic_lv_electric_furnace_side.png b/technic/technic/textures/technic_lv_electric_furnace_side.png Binary files differnew file mode 100644 index 0000000..80cf742 --- /dev/null +++ b/technic/technic/textures/technic_lv_electric_furnace_side.png diff --git a/technic/technic/textures/technic_lv_electric_furnace_top.png b/technic/technic/textures/technic_lv_electric_furnace_top.png Binary files differnew file mode 100644 index 0000000..fbadd9a --- /dev/null +++ b/technic/technic/textures/technic_lv_electric_furnace_top.png diff --git a/technic/technic/textures/technic_lv_extractor_bottom.png b/technic/technic/textures/technic_lv_extractor_bottom.png Binary files differnew file mode 100644 index 0000000..aecd719 --- /dev/null +++ b/technic/technic/textures/technic_lv_extractor_bottom.png diff --git a/technic/technic/textures/technic_lv_extractor_front.png b/technic/technic/textures/technic_lv_extractor_front.png Binary files differnew file mode 100644 index 0000000..1bd7e9a --- /dev/null +++ b/technic/technic/textures/technic_lv_extractor_front.png diff --git a/technic/technic/textures/technic_lv_extractor_front_active.png b/technic/technic/textures/technic_lv_extractor_front_active.png Binary files differnew file mode 100644 index 0000000..7f8b30a --- /dev/null +++ b/technic/technic/textures/technic_lv_extractor_front_active.png diff --git a/technic/technic/textures/technic_lv_extractor_side.png b/technic/technic/textures/technic_lv_extractor_side.png Binary files differnew file mode 100644 index 0000000..99d9486 --- /dev/null +++ b/technic/technic/textures/technic_lv_extractor_side.png diff --git a/technic/technic/textures/technic_lv_extractor_top.png b/technic/technic/textures/technic_lv_extractor_top.png Binary files differnew file mode 100644 index 0000000..e7d9ff9 --- /dev/null +++ b/technic/technic/textures/technic_lv_extractor_top.png diff --git a/technic/technic/textures/technic_lv_generator_front.png b/technic/technic/textures/technic_lv_generator_front.png Binary files differnew file mode 100644 index 0000000..2d64844 --- /dev/null +++ b/technic/technic/textures/technic_lv_generator_front.png diff --git a/technic/technic/textures/technic_lv_generator_front_active.png b/technic/technic/textures/technic_lv_generator_front_active.png Binary files differnew file mode 100644 index 0000000..4e57ca0 --- /dev/null +++ b/technic/technic/textures/technic_lv_generator_front_active.png diff --git a/technic/technic/textures/technic_lv_generator_side.png b/technic/technic/textures/technic_lv_generator_side.png Binary files differnew file mode 100644 index 0000000..5cbcbef --- /dev/null +++ b/technic/technic/textures/technic_lv_generator_side.png diff --git a/technic/technic/textures/technic_lv_generator_top.png b/technic/technic/textures/technic_lv_generator_top.png Binary files differnew file mode 100644 index 0000000..e2f3db3 --- /dev/null +++ b/technic/technic/textures/technic_lv_generator_top.png diff --git a/technic/technic/textures/technic_lv_grinder_bottom.png b/technic/technic/textures/technic_lv_grinder_bottom.png Binary files differnew file mode 100644 index 0000000..aecd719 --- /dev/null +++ b/technic/technic/textures/technic_lv_grinder_bottom.png diff --git a/technic/technic/textures/technic_lv_grinder_front.png b/technic/technic/textures/technic_lv_grinder_front.png Binary files differnew file mode 100644 index 0000000..1bd7e9a --- /dev/null +++ b/technic/technic/textures/technic_lv_grinder_front.png diff --git a/technic/technic/textures/technic_lv_grinder_front_active.png b/technic/technic/textures/technic_lv_grinder_front_active.png Binary files differnew file mode 100644 index 0000000..7f8b30a --- /dev/null +++ b/technic/technic/textures/technic_lv_grinder_front_active.png diff --git a/technic/technic/textures/technic_lv_grinder_side.png b/technic/technic/textures/technic_lv_grinder_side.png Binary files differnew file mode 100644 index 0000000..99d9486 --- /dev/null +++ b/technic/technic/textures/technic_lv_grinder_side.png diff --git a/technic/technic/textures/technic_lv_grinder_top.png b/technic/technic/textures/technic_lv_grinder_top.png Binary files differnew file mode 100644 index 0000000..e7d9ff9 --- /dev/null +++ b/technic/technic/textures/technic_lv_grinder_top.png diff --git a/technic/technic/textures/technic_lv_solar_array_bottom.png b/technic/technic/textures/technic_lv_solar_array_bottom.png Binary files differnew file mode 100644 index 0000000..9e888e3 --- /dev/null +++ b/technic/technic/textures/technic_lv_solar_array_bottom.png diff --git a/technic/technic/textures/technic_lv_solar_array_side.png b/technic/technic/textures/technic_lv_solar_array_side.png Binary files differnew file mode 100644 index 0000000..b22447e --- /dev/null +++ b/technic/technic/textures/technic_lv_solar_array_side.png diff --git a/technic/technic/textures/technic_lv_solar_array_top.png b/technic/technic/textures/technic_lv_solar_array_top.png Binary files differnew file mode 100644 index 0000000..cabd315 --- /dev/null +++ b/technic/technic/textures/technic_lv_solar_array_top.png diff --git a/technic/technic/textures/technic_lv_transformer.png b/technic/technic/textures/technic_lv_transformer.png Binary files differnew file mode 100644 index 0000000..613b196 --- /dev/null +++ b/technic/technic/textures/technic_lv_transformer.png diff --git a/technic/technic/textures/technic_machine_bottom.png b/technic/technic/textures/technic_machine_bottom.png Binary files differnew file mode 100644 index 0000000..48a47b0 --- /dev/null +++ b/technic/technic/textures/technic_machine_bottom.png diff --git a/technic/technic/textures/technic_machine_casing.png b/technic/technic/textures/technic_machine_casing.png Binary files differnew file mode 100644 index 0000000..d596733 --- /dev/null +++ b/technic/technic/textures/technic_machine_casing.png diff --git a/technic/technic/textures/technic_mining_drill.png b/technic/technic/textures/technic_mining_drill.png Binary files differnew file mode 100644 index 0000000..171888d --- /dev/null +++ b/technic/technic/textures/technic_mining_drill.png diff --git a/technic/technic/textures/technic_mining_drill_mk2.png b/technic/technic/textures/technic_mining_drill_mk2.png Binary files differnew file mode 100644 index 0000000..30be719 --- /dev/null +++ b/technic/technic/textures/technic_mining_drill_mk2.png diff --git a/technic/technic/textures/technic_mining_drill_mk3.png b/technic/technic/textures/technic_mining_drill_mk3.png Binary files differnew file mode 100644 index 0000000..30de896 --- /dev/null +++ b/technic/technic/textures/technic_mining_drill_mk3.png diff --git a/technic/technic/textures/technic_mining_laser_mk1.png b/technic/technic/textures/technic_mining_laser_mk1.png Binary files differnew file mode 100644 index 0000000..29faeb4 --- /dev/null +++ b/technic/technic/textures/technic_mining_laser_mk1.png diff --git a/technic/technic/textures/technic_mining_laser_mk2.png b/technic/technic/textures/technic_mining_laser_mk2.png Binary files differnew file mode 100644 index 0000000..2d67c0f --- /dev/null +++ b/technic/technic/textures/technic_mining_laser_mk2.png diff --git a/technic/technic/textures/technic_mining_laser_mk3.png b/technic/technic/textures/technic_mining_laser_mk3.png Binary files differnew file mode 100644 index 0000000..db9ee26 --- /dev/null +++ b/technic/technic/textures/technic_mining_laser_mk3.png diff --git a/technic/technic/textures/technic_mithril_dust.png b/technic/technic/textures/technic_mithril_dust.png Binary files differnew file mode 100644 index 0000000..adfbe6c --- /dev/null +++ b/technic/technic/textures/technic_mithril_dust.png diff --git a/technic/technic/textures/technic_mixed_metal_ingot.png b/technic/technic/textures/technic_mixed_metal_ingot.png Binary files differnew file mode 100644 index 0000000..8f6847b --- /dev/null +++ b/technic/technic/textures/technic_mixed_metal_ingot.png diff --git a/technic/technic/textures/technic_motor.png b/technic/technic/textures/technic_motor.png Binary files differnew file mode 100644 index 0000000..77d4b91 --- /dev/null +++ b/technic/technic/textures/technic_motor.png diff --git a/technic/technic/textures/technic_music_player_bottom.png b/technic/technic/textures/technic_music_player_bottom.png Binary files differnew file mode 100644 index 0000000..bd8fd55 --- /dev/null +++ b/technic/technic/textures/technic_music_player_bottom.png diff --git a/technic/technic/textures/technic_music_player_side.png b/technic/technic/textures/technic_music_player_side.png Binary files differnew file mode 100644 index 0000000..6c34fea --- /dev/null +++ b/technic/technic/textures/technic_music_player_side.png diff --git a/technic/technic/textures/technic_music_player_top.png b/technic/technic/textures/technic_music_player_top.png Binary files differnew file mode 100644 index 0000000..0d34563 --- /dev/null +++ b/technic/technic/textures/technic_music_player_top.png diff --git a/technic/technic/textures/technic_mv_alloy_furnace_bottom.png b/technic/technic/textures/technic_mv_alloy_furnace_bottom.png Binary files differnew file mode 100644 index 0000000..2c0aaee --- /dev/null +++ b/technic/technic/textures/technic_mv_alloy_furnace_bottom.png diff --git a/technic/technic/textures/technic_mv_alloy_furnace_front.png b/technic/technic/textures/technic_mv_alloy_furnace_front.png Binary files differnew file mode 100644 index 0000000..a5dac82 --- /dev/null +++ b/technic/technic/textures/technic_mv_alloy_furnace_front.png diff --git a/technic/technic/textures/technic_mv_alloy_furnace_front_active.png b/technic/technic/textures/technic_mv_alloy_furnace_front_active.png Binary files differnew file mode 100644 index 0000000..f6e69a9 --- /dev/null +++ b/technic/technic/textures/technic_mv_alloy_furnace_front_active.png diff --git a/technic/technic/textures/technic_mv_alloy_furnace_side.png b/technic/technic/textures/technic_mv_alloy_furnace_side.png Binary files differnew file mode 100644 index 0000000..0430479 --- /dev/null +++ b/technic/technic/textures/technic_mv_alloy_furnace_side.png diff --git a/technic/technic/textures/technic_mv_alloy_furnace_side_tube.png b/technic/technic/textures/technic_mv_alloy_furnace_side_tube.png Binary files differnew file mode 100644 index 0000000..1800eed --- /dev/null +++ b/technic/technic/textures/technic_mv_alloy_furnace_side_tube.png diff --git a/technic/technic/textures/technic_mv_alloy_furnace_top.png b/technic/technic/textures/technic_mv_alloy_furnace_top.png Binary files differnew file mode 100644 index 0000000..f44e3c0 --- /dev/null +++ b/technic/technic/textures/technic_mv_alloy_furnace_top.png diff --git a/technic/technic/textures/technic_mv_battery_box_bottom.png b/technic/technic/textures/technic_mv_battery_box_bottom.png Binary files differnew file mode 100644 index 0000000..a610660 --- /dev/null +++ b/technic/technic/textures/technic_mv_battery_box_bottom.png diff --git a/technic/technic/textures/technic_mv_battery_box_side.png b/technic/technic/textures/technic_mv_battery_box_side.png Binary files differnew file mode 100644 index 0000000..06a4be5 --- /dev/null +++ b/technic/technic/textures/technic_mv_battery_box_side.png diff --git a/technic/technic/textures/technic_mv_battery_box_top.png b/technic/technic/textures/technic_mv_battery_box_top.png Binary files differnew file mode 100644 index 0000000..b32100f --- /dev/null +++ b/technic/technic/textures/technic_mv_battery_box_top.png diff --git a/technic/technic/textures/technic_mv_cable.png b/technic/technic/textures/technic_mv_cable.png Binary files differnew file mode 100644 index 0000000..2819d2b --- /dev/null +++ b/technic/technic/textures/technic_mv_cable.png diff --git a/technic/technic/textures/technic_mv_cable_wield.png b/technic/technic/textures/technic_mv_cable_wield.png Binary files differnew file mode 100644 index 0000000..2d41e27 --- /dev/null +++ b/technic/technic/textures/technic_mv_cable_wield.png diff --git a/technic/technic/textures/technic_mv_centrifuge_bottom.png b/technic/technic/textures/technic_mv_centrifuge_bottom.png Binary files differnew file mode 100644 index 0000000..6dcd40f --- /dev/null +++ b/technic/technic/textures/technic_mv_centrifuge_bottom.png diff --git a/technic/technic/textures/technic_mv_centrifuge_front.png b/technic/technic/textures/technic_mv_centrifuge_front.png Binary files differnew file mode 100644 index 0000000..e278a33 --- /dev/null +++ b/technic/technic/textures/technic_mv_centrifuge_front.png diff --git a/technic/technic/textures/technic_mv_centrifuge_front_active.png b/technic/technic/textures/technic_mv_centrifuge_front_active.png Binary files differnew file mode 100644 index 0000000..4cef912 --- /dev/null +++ b/technic/technic/textures/technic_mv_centrifuge_front_active.png diff --git a/technic/technic/textures/technic_mv_centrifuge_side.png b/technic/technic/textures/technic_mv_centrifuge_side.png Binary files differnew file mode 100644 index 0000000..eeef44a --- /dev/null +++ b/technic/technic/textures/technic_mv_centrifuge_side.png diff --git a/technic/technic/textures/technic_mv_centrifuge_top.png b/technic/technic/textures/technic_mv_centrifuge_top.png Binary files differnew file mode 100644 index 0000000..813bbf8 --- /dev/null +++ b/technic/technic/textures/technic_mv_centrifuge_top.png diff --git a/technic/technic/textures/technic_mv_compressor_back.png b/technic/technic/textures/technic_mv_compressor_back.png Binary files differnew file mode 100644 index 0000000..11286e3 --- /dev/null +++ b/technic/technic/textures/technic_mv_compressor_back.png diff --git a/technic/technic/textures/technic_mv_compressor_bottom.png b/technic/technic/textures/technic_mv_compressor_bottom.png Binary files differnew file mode 100644 index 0000000..886f27e --- /dev/null +++ b/technic/technic/textures/technic_mv_compressor_bottom.png diff --git a/technic/technic/textures/technic_mv_compressor_front.png b/technic/technic/textures/technic_mv_compressor_front.png Binary files differnew file mode 100644 index 0000000..007d6de --- /dev/null +++ b/technic/technic/textures/technic_mv_compressor_front.png diff --git a/technic/technic/textures/technic_mv_compressor_front_active.png b/technic/technic/textures/technic_mv_compressor_front_active.png Binary files differnew file mode 100644 index 0000000..b3d27c0 --- /dev/null +++ b/technic/technic/textures/technic_mv_compressor_front_active.png diff --git a/technic/technic/textures/technic_mv_compressor_side.png b/technic/technic/textures/technic_mv_compressor_side.png Binary files differnew file mode 100644 index 0000000..87acda6 --- /dev/null +++ b/technic/technic/textures/technic_mv_compressor_side.png diff --git a/technic/technic/textures/technic_mv_compressor_top.png b/technic/technic/textures/technic_mv_compressor_top.png Binary files differnew file mode 100644 index 0000000..786b859 --- /dev/null +++ b/technic/technic/textures/technic_mv_compressor_top.png diff --git a/technic/technic/textures/technic_mv_down_converter_bottom.png b/technic/technic/textures/technic_mv_down_converter_bottom.png Binary files differnew file mode 100644 index 0000000..a610660 --- /dev/null +++ b/technic/technic/textures/technic_mv_down_converter_bottom.png diff --git a/technic/technic/textures/technic_mv_down_converter_side.png b/technic/technic/textures/technic_mv_down_converter_side.png Binary files differnew file mode 100644 index 0000000..6492d5c --- /dev/null +++ b/technic/technic/textures/technic_mv_down_converter_side.png diff --git a/technic/technic/textures/technic_mv_down_converter_top.png b/technic/technic/textures/technic_mv_down_converter_top.png Binary files differnew file mode 100644 index 0000000..a610660 --- /dev/null +++ b/technic/technic/textures/technic_mv_down_converter_top.png diff --git a/technic/technic/textures/technic_mv_electric_furnace_bottom.png b/technic/technic/textures/technic_mv_electric_furnace_bottom.png Binary files differnew file mode 100644 index 0000000..e2e445e --- /dev/null +++ b/technic/technic/textures/technic_mv_electric_furnace_bottom.png diff --git a/technic/technic/textures/technic_mv_electric_furnace_front.png b/technic/technic/textures/technic_mv_electric_furnace_front.png Binary files differnew file mode 100644 index 0000000..81c33cf --- /dev/null +++ b/technic/technic/textures/technic_mv_electric_furnace_front.png diff --git a/technic/technic/textures/technic_mv_electric_furnace_front_active.png b/technic/technic/textures/technic_mv_electric_furnace_front_active.png Binary files differnew file mode 100644 index 0000000..2523f0e --- /dev/null +++ b/technic/technic/textures/technic_mv_electric_furnace_front_active.png diff --git a/technic/technic/textures/technic_mv_electric_furnace_side.png b/technic/technic/textures/technic_mv_electric_furnace_side.png Binary files differnew file mode 100644 index 0000000..cd22a73 --- /dev/null +++ b/technic/technic/textures/technic_mv_electric_furnace_side.png diff --git a/technic/technic/textures/technic_mv_electric_furnace_side_tube.png b/technic/technic/textures/technic_mv_electric_furnace_side_tube.png Binary files differnew file mode 100644 index 0000000..bfeba18 --- /dev/null +++ b/technic/technic/textures/technic_mv_electric_furnace_side_tube.png diff --git a/technic/technic/textures/technic_mv_electric_furnace_top.png b/technic/technic/textures/technic_mv_electric_furnace_top.png Binary files differnew file mode 100644 index 0000000..635b6b7 --- /dev/null +++ b/technic/technic/textures/technic_mv_electric_furnace_top.png diff --git a/technic/technic/textures/technic_mv_extractor_bottom.png b/technic/technic/textures/technic_mv_extractor_bottom.png Binary files differnew file mode 100644 index 0000000..70f34ee --- /dev/null +++ b/technic/technic/textures/technic_mv_extractor_bottom.png diff --git a/technic/technic/textures/technic_mv_extractor_front.png b/technic/technic/textures/technic_mv_extractor_front.png Binary files differnew file mode 100644 index 0000000..18648c2 --- /dev/null +++ b/technic/technic/textures/technic_mv_extractor_front.png diff --git a/technic/technic/textures/technic_mv_extractor_front_active.png b/technic/technic/textures/technic_mv_extractor_front_active.png Binary files differnew file mode 100644 index 0000000..ee86ade --- /dev/null +++ b/technic/technic/textures/technic_mv_extractor_front_active.png diff --git a/technic/technic/textures/technic_mv_extractor_side.png b/technic/technic/textures/technic_mv_extractor_side.png Binary files differnew file mode 100644 index 0000000..cbe3673 --- /dev/null +++ b/technic/technic/textures/technic_mv_extractor_side.png diff --git a/technic/technic/textures/technic_mv_extractor_top.png b/technic/technic/textures/technic_mv_extractor_top.png Binary files differnew file mode 100644 index 0000000..2259d64 --- /dev/null +++ b/technic/technic/textures/technic_mv_extractor_top.png diff --git a/technic/technic/textures/technic_mv_generator_front.png b/technic/technic/textures/technic_mv_generator_front.png Binary files differnew file mode 100644 index 0000000..570e0c5 --- /dev/null +++ b/technic/technic/textures/technic_mv_generator_front.png diff --git a/technic/technic/textures/technic_mv_generator_front_active.png b/technic/technic/textures/technic_mv_generator_front_active.png Binary files differnew file mode 100644 index 0000000..3006a17 --- /dev/null +++ b/technic/technic/textures/technic_mv_generator_front_active.png diff --git a/technic/technic/textures/technic_mv_generator_side.png b/technic/technic/textures/technic_mv_generator_side.png Binary files differnew file mode 100644 index 0000000..21c0d41 --- /dev/null +++ b/technic/technic/textures/technic_mv_generator_side.png diff --git a/technic/technic/textures/technic_mv_generator_top.png b/technic/technic/textures/technic_mv_generator_top.png Binary files differnew file mode 100644 index 0000000..7afa5a1 --- /dev/null +++ b/technic/technic/textures/technic_mv_generator_top.png diff --git a/technic/technic/textures/technic_mv_grinder_bottom.png b/technic/technic/textures/technic_mv_grinder_bottom.png Binary files differnew file mode 100644 index 0000000..70f34ee --- /dev/null +++ b/technic/technic/textures/technic_mv_grinder_bottom.png diff --git a/technic/technic/textures/technic_mv_grinder_front.png b/technic/technic/textures/technic_mv_grinder_front.png Binary files differnew file mode 100644 index 0000000..18648c2 --- /dev/null +++ b/technic/technic/textures/technic_mv_grinder_front.png diff --git a/technic/technic/textures/technic_mv_grinder_front_active.png b/technic/technic/textures/technic_mv_grinder_front_active.png Binary files differnew file mode 100644 index 0000000..ee86ade --- /dev/null +++ b/technic/technic/textures/technic_mv_grinder_front_active.png diff --git a/technic/technic/textures/technic_mv_grinder_side.png b/technic/technic/textures/technic_mv_grinder_side.png Binary files differnew file mode 100644 index 0000000..cbe3673 --- /dev/null +++ b/technic/technic/textures/technic_mv_grinder_side.png diff --git a/technic/technic/textures/technic_mv_grinder_side_tube.png b/technic/technic/textures/technic_mv_grinder_side_tube.png Binary files differnew file mode 100644 index 0000000..196b7c1 --- /dev/null +++ b/technic/technic/textures/technic_mv_grinder_side_tube.png diff --git a/technic/technic/textures/technic_mv_grinder_top.png b/technic/technic/textures/technic_mv_grinder_top.png Binary files differnew file mode 100644 index 0000000..2259d64 --- /dev/null +++ b/technic/technic/textures/technic_mv_grinder_top.png diff --git a/technic/technic/textures/technic_mv_solar_array_bottom.png b/technic/technic/textures/technic_mv_solar_array_bottom.png Binary files differnew file mode 100644 index 0000000..596e79a --- /dev/null +++ b/technic/technic/textures/technic_mv_solar_array_bottom.png diff --git a/technic/technic/textures/technic_mv_solar_array_side.png b/technic/technic/textures/technic_mv_solar_array_side.png Binary files differnew file mode 100644 index 0000000..917b9ed --- /dev/null +++ b/technic/technic/textures/technic_mv_solar_array_side.png diff --git a/technic/technic/textures/technic_mv_solar_array_top.png b/technic/technic/textures/technic_mv_solar_array_top.png Binary files differnew file mode 100644 index 0000000..cdb7cf7 --- /dev/null +++ b/technic/technic/textures/technic_mv_solar_array_top.png diff --git a/technic/technic/textures/technic_mv_transformer.png b/technic/technic/textures/technic_mv_transformer.png Binary files differnew file mode 100644 index 0000000..7c4688e --- /dev/null +++ b/technic/technic/textures/technic_mv_transformer.png diff --git a/technic/technic/textures/technic_nodebreaker_back.png b/technic/technic/textures/technic_nodebreaker_back.png Binary files differnew file mode 100644 index 0000000..0af7422 --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_back.png diff --git a/technic/technic/textures/technic_nodebreaker_bottom.png b/technic/technic/textures/technic_nodebreaker_bottom.png Binary files differnew file mode 100644 index 0000000..ff1a2c6 --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_bottom.png diff --git a/technic/technic/textures/technic_nodebreaker_bottom_off.png b/technic/technic/textures/technic_nodebreaker_bottom_off.png Binary files differnew file mode 100644 index 0000000..0f456eb --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_bottom_off.png diff --git a/technic/technic/textures/technic_nodebreaker_bottom_on.png b/technic/technic/textures/technic_nodebreaker_bottom_on.png Binary files differnew file mode 100644 index 0000000..6c4811a --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_bottom_on.png diff --git a/technic/technic/textures/technic_nodebreaker_front_off.png b/technic/technic/textures/technic_nodebreaker_front_off.png Binary files differnew file mode 100644 index 0000000..488fd0a --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_front_off.png diff --git a/technic/technic/textures/technic_nodebreaker_front_on.png b/technic/technic/textures/technic_nodebreaker_front_on.png Binary files differnew file mode 100644 index 0000000..4904e8b --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_front_on.png diff --git a/technic/technic/textures/technic_nodebreaker_side.png b/technic/technic/textures/technic_nodebreaker_side.png Binary files differnew file mode 100644 index 0000000..aefd7c8 --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_side.png diff --git a/technic/technic/textures/technic_nodebreaker_side1.png b/technic/technic/textures/technic_nodebreaker_side1.png Binary files differnew file mode 100644 index 0000000..8cb8634 --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_side1.png diff --git a/technic/technic/textures/technic_nodebreaker_side1_off.png b/technic/technic/textures/technic_nodebreaker_side1_off.png Binary files differnew file mode 100644 index 0000000..857face --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_side1_off.png diff --git a/technic/technic/textures/technic_nodebreaker_side1_on.png b/technic/technic/textures/technic_nodebreaker_side1_on.png Binary files differnew file mode 100644 index 0000000..c756f09 --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_side1_on.png diff --git a/technic/technic/textures/technic_nodebreaker_side2.png b/technic/technic/textures/technic_nodebreaker_side2.png Binary files differnew file mode 100644 index 0000000..c2855d0 --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_side2.png diff --git a/technic/technic/textures/technic_nodebreaker_side2_off.png b/technic/technic/textures/technic_nodebreaker_side2_off.png Binary files differnew file mode 100644 index 0000000..4c62f98 --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_side2_off.png diff --git a/technic/technic/textures/technic_nodebreaker_side2_on.png b/technic/technic/textures/technic_nodebreaker_side2_on.png Binary files differnew file mode 100644 index 0000000..b9e4823 --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_side2_on.png diff --git a/technic/technic/textures/technic_nodebreaker_top.png b/technic/technic/textures/technic_nodebreaker_top.png Binary files differnew file mode 100644 index 0000000..941d333 --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_top.png diff --git a/technic/technic/textures/technic_nodebreaker_top_off.png b/technic/technic/textures/technic_nodebreaker_top_off.png Binary files differnew file mode 100644 index 0000000..9139afe --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_top_off.png diff --git a/technic/technic/textures/technic_nodebreaker_top_on.png b/technic/technic/textures/technic_nodebreaker_top_on.png Binary files differnew file mode 100644 index 0000000..4b0a661 --- /dev/null +++ b/technic/technic/textures/technic_nodebreaker_top_on.png diff --git a/technic/technic/textures/technic_power_meter.png b/technic/technic/textures/technic_power_meter.png Binary files differnew file mode 100644 index 0000000..f1e5120 --- /dev/null +++ b/technic/technic/textures/technic_power_meter.png diff --git a/technic/technic/textures/technic_power_meter0.png b/technic/technic/textures/technic_power_meter0.png Binary files differnew file mode 100644 index 0000000..1b1e662 --- /dev/null +++ b/technic/technic/textures/technic_power_meter0.png diff --git a/technic/technic/textures/technic_power_meter1.png b/technic/technic/textures/technic_power_meter1.png Binary files differnew file mode 100644 index 0000000..eb6be3b --- /dev/null +++ b/technic/technic/textures/technic_power_meter1.png diff --git a/technic/technic/textures/technic_power_meter2.png b/technic/technic/textures/technic_power_meter2.png Binary files differnew file mode 100644 index 0000000..e3a3772 --- /dev/null +++ b/technic/technic/textures/technic_power_meter2.png diff --git a/technic/technic/textures/technic_power_meter3.png b/technic/technic/textures/technic_power_meter3.png Binary files differnew file mode 100644 index 0000000..6333035 --- /dev/null +++ b/technic/technic/textures/technic_power_meter3.png diff --git a/technic/technic/textures/technic_power_meter4.png b/technic/technic/textures/technic_power_meter4.png Binary files differnew file mode 100644 index 0000000..6346dbd --- /dev/null +++ b/technic/technic/textures/technic_power_meter4.png diff --git a/technic/technic/textures/technic_power_meter5.png b/technic/technic/textures/technic_power_meter5.png Binary files differnew file mode 100644 index 0000000..80f79c6 --- /dev/null +++ b/technic/technic/textures/technic_power_meter5.png diff --git a/technic/technic/textures/technic_power_meter6.png b/technic/technic/textures/technic_power_meter6.png Binary files differnew file mode 100644 index 0000000..fe91bf5 --- /dev/null +++ b/technic/technic/textures/technic_power_meter6.png diff --git a/technic/technic/textures/technic_power_meter7.png b/technic/technic/textures/technic_power_meter7.png Binary files differnew file mode 100644 index 0000000..e02dd6d --- /dev/null +++ b/technic/technic/textures/technic_power_meter7.png diff --git a/technic/technic/textures/technic_power_meter8.png b/technic/technic/textures/technic_power_meter8.png Binary files differnew file mode 100644 index 0000000..a12064c --- /dev/null +++ b/technic/technic/textures/technic_power_meter8.png diff --git a/technic/technic/textures/technic_power_meter_bg.png b/technic/technic/textures/technic_power_meter_bg.png Binary files differnew file mode 100644 index 0000000..9667cda --- /dev/null +++ b/technic/technic/textures/technic_power_meter_bg.png diff --git a/technic/technic/textures/technic_power_meter_fg.png b/technic/technic/textures/technic_power_meter_fg.png Binary files differnew file mode 100644 index 0000000..7f2dde8 --- /dev/null +++ b/technic/technic/textures/technic_power_meter_fg.png diff --git a/technic/technic/textures/technic_prospector.png b/technic/technic/textures/technic_prospector.png Binary files differnew file mode 100644 index 0000000..2f9ee6c --- /dev/null +++ b/technic/technic/textures/technic_prospector.png diff --git a/technic/technic/textures/technic_raw_latex.png b/technic/technic/textures/technic_raw_latex.png Binary files differnew file mode 100644 index 0000000..49bb11b --- /dev/null +++ b/technic/technic/textures/technic_raw_latex.png diff --git a/technic/technic/textures/technic_rubber.png b/technic/technic/textures/technic_rubber.png Binary files differnew file mode 100644 index 0000000..9ed4a9d --- /dev/null +++ b/technic/technic/textures/technic_rubber.png diff --git a/technic/technic/textures/technic_rubber_leaves.png b/technic/technic/textures/technic_rubber_leaves.png Binary files differnew file mode 100644 index 0000000..ae013e0 --- /dev/null +++ b/technic/technic/textures/technic_rubber_leaves.png diff --git a/technic/technic/textures/technic_rubber_sapling.png b/technic/technic/textures/technic_rubber_sapling.png Binary files differnew file mode 100644 index 0000000..e5c9f5d --- /dev/null +++ b/technic/technic/textures/technic_rubber_sapling.png diff --git a/technic/technic/textures/technic_rubber_tree_empty.png b/technic/technic/textures/technic_rubber_tree_empty.png Binary files differnew file mode 100644 index 0000000..1792951 --- /dev/null +++ b/technic/technic/textures/technic_rubber_tree_empty.png diff --git a/technic/technic/textures/technic_rubber_tree_full.png b/technic/technic/textures/technic_rubber_tree_full.png Binary files differnew file mode 100644 index 0000000..08067ef --- /dev/null +++ b/technic/technic/textures/technic_rubber_tree_full.png diff --git a/technic/technic/textures/technic_rubber_tree_grindings.png b/technic/technic/textures/technic_rubber_tree_grindings.png Binary files differnew file mode 100644 index 0000000..9f2f5d6 --- /dev/null +++ b/technic/technic/textures/technic_rubber_tree_grindings.png diff --git a/technic/technic/textures/technic_sawdust.png b/technic/technic/textures/technic_sawdust.png Binary files differnew file mode 100644 index 0000000..976e7f9 --- /dev/null +++ b/technic/technic/textures/technic_sawdust.png diff --git a/technic/technic/textures/technic_screwdriver.png b/technic/technic/textures/technic_screwdriver.png Binary files differnew file mode 100644 index 0000000..bd2da22 --- /dev/null +++ b/technic/technic/textures/technic_screwdriver.png diff --git a/technic/technic/textures/technic_silicon_wafer.png b/technic/technic/textures/technic_silicon_wafer.png Binary files differnew file mode 100644 index 0000000..78aef20 --- /dev/null +++ b/technic/technic/textures/technic_silicon_wafer.png diff --git a/technic/technic/textures/technic_silver_dust.png b/technic/technic/textures/technic_silver_dust.png Binary files differnew file mode 100644 index 0000000..19a5754 --- /dev/null +++ b/technic/technic/textures/technic_silver_dust.png diff --git a/technic/technic/textures/technic_solar_panel_bottom.png b/technic/technic/textures/technic_solar_panel_bottom.png Binary files differnew file mode 100644 index 0000000..9e888e3 --- /dev/null +++ b/technic/technic/textures/technic_solar_panel_bottom.png diff --git a/technic/technic/textures/technic_solar_panel_side.png b/technic/technic/textures/technic_solar_panel_side.png Binary files differnew file mode 100644 index 0000000..b22447e --- /dev/null +++ b/technic/technic/textures/technic_solar_panel_side.png diff --git a/technic/technic/textures/technic_solar_panel_top.png b/technic/technic/textures/technic_solar_panel_top.png Binary files differnew file mode 100644 index 0000000..492764b --- /dev/null +++ b/technic/technic/textures/technic_solar_panel_top.png diff --git a/technic/technic/textures/technic_sonic_screwdriver.png b/technic/technic/textures/technic_sonic_screwdriver.png Binary files differnew file mode 100644 index 0000000..9b26b81 --- /dev/null +++ b/technic/technic/textures/technic_sonic_screwdriver.png diff --git a/technic/technic/textures/technic_stainless_steel_dust.png b/technic/technic/textures/technic_stainless_steel_dust.png Binary files differnew file mode 100644 index 0000000..6398be8 --- /dev/null +++ b/technic/technic/textures/technic_stainless_steel_dust.png diff --git a/technic/technic/textures/technic_stainless_steel_ingot.png b/technic/technic/textures/technic_stainless_steel_ingot.png Binary files differnew file mode 100644 index 0000000..7ec5e00 --- /dev/null +++ b/technic/technic/textures/technic_stainless_steel_ingot.png diff --git a/technic/technic/textures/technic_supply_converter_bottom.png b/technic/technic/textures/technic_supply_converter_bottom.png Binary files differnew file mode 100644 index 0000000..a610660 --- /dev/null +++ b/technic/technic/textures/technic_supply_converter_bottom.png diff --git a/technic/technic/textures/technic_supply_converter_side.png b/technic/technic/textures/technic_supply_converter_side.png Binary files differnew file mode 100644 index 0000000..6492d5c --- /dev/null +++ b/technic/technic/textures/technic_supply_converter_side.png diff --git a/technic/technic/textures/technic_supply_converter_top.png b/technic/technic/textures/technic_supply_converter_top.png Binary files differnew file mode 100644 index 0000000..a610660 --- /dev/null +++ b/technic/technic/textures/technic_supply_converter_top.png diff --git a/technic/technic/textures/technic_talinite_dust.png b/technic/technic/textures/technic_talinite_dust.png Binary files differnew file mode 100644 index 0000000..f228206 --- /dev/null +++ b/technic/technic/textures/technic_talinite_dust.png diff --git a/technic/technic/textures/technic_tin_dust.png b/technic/technic/textures/technic_tin_dust.png Binary files differnew file mode 100644 index 0000000..98e6f3f --- /dev/null +++ b/technic/technic/textures/technic_tin_dust.png diff --git a/technic/technic/textures/technic_tool_mode1.png b/technic/technic/textures/technic_tool_mode1.png Binary files differnew file mode 100644 index 0000000..571dbe5 --- /dev/null +++ b/technic/technic/textures/technic_tool_mode1.png diff --git a/technic/technic/textures/technic_tool_mode2.png b/technic/technic/textures/technic_tool_mode2.png Binary files differnew file mode 100644 index 0000000..891aa82 --- /dev/null +++ b/technic/technic/textures/technic_tool_mode2.png diff --git a/technic/technic/textures/technic_tool_mode3.png b/technic/technic/textures/technic_tool_mode3.png Binary files differnew file mode 100644 index 0000000..cd099a7 --- /dev/null +++ b/technic/technic/textures/technic_tool_mode3.png diff --git a/technic/technic/textures/technic_tool_mode4.png b/technic/technic/textures/technic_tool_mode4.png Binary files differnew file mode 100644 index 0000000..62f50d7 --- /dev/null +++ b/technic/technic/textures/technic_tool_mode4.png diff --git a/technic/technic/textures/technic_tool_mode5.png b/technic/technic/textures/technic_tool_mode5.png Binary files differnew file mode 100644 index 0000000..c918314 --- /dev/null +++ b/technic/technic/textures/technic_tool_mode5.png diff --git a/technic/technic/textures/technic_tool_mode6.png b/technic/technic/textures/technic_tool_mode6.png Binary files differnew file mode 100644 index 0000000..9268f47 --- /dev/null +++ b/technic/technic/textures/technic_tool_mode6.png diff --git a/technic/technic/textures/technic_tool_mode7.png b/technic/technic/textures/technic_tool_mode7.png Binary files differnew file mode 100644 index 0000000..5ba572a --- /dev/null +++ b/technic/technic/textures/technic_tool_mode7.png diff --git a/technic/technic/textures/technic_tool_mode8.png b/technic/technic/textures/technic_tool_mode8.png Binary files differnew file mode 100644 index 0000000..b2655b6 --- /dev/null +++ b/technic/technic/textures/technic_tool_mode8.png diff --git a/technic/technic/textures/technic_tool_mode9.png b/technic/technic/textures/technic_tool_mode9.png Binary files differnew file mode 100644 index 0000000..2077afb --- /dev/null +++ b/technic/technic/textures/technic_tool_mode9.png diff --git a/technic/technic/textures/technic_tree_tap.png b/technic/technic/textures/technic_tree_tap.png Binary files differnew file mode 100644 index 0000000..542f30f --- /dev/null +++ b/technic/technic/textures/technic_tree_tap.png diff --git a/technic/technic/textures/technic_uranium_dust.png b/technic/technic/textures/technic_uranium_dust.png Binary files differnew file mode 100644 index 0000000..9c211dc --- /dev/null +++ b/technic/technic/textures/technic_uranium_dust.png diff --git a/technic/technic/textures/technic_uranium_fuel.png b/technic/technic/textures/technic_uranium_fuel.png Binary files differnew file mode 100644 index 0000000..0a32c62 --- /dev/null +++ b/technic/technic/textures/technic_uranium_fuel.png diff --git a/technic/technic/textures/technic_vacuum.png b/technic/technic/textures/technic_vacuum.png Binary files differnew file mode 100644 index 0000000..1ef5815 --- /dev/null +++ b/technic/technic/textures/technic_vacuum.png diff --git a/technic/technic/textures/technic_water_can.png b/technic/technic/textures/technic_water_can.png Binary files differnew file mode 100644 index 0000000..eec75db --- /dev/null +++ b/technic/technic/textures/technic_water_can.png diff --git a/technic/technic/textures/technic_water_mill_side.png b/technic/technic/textures/technic_water_mill_side.png Binary files differnew file mode 100644 index 0000000..f4bdb16 --- /dev/null +++ b/technic/technic/textures/technic_water_mill_side.png diff --git a/technic/technic/textures/technic_water_mill_top.png b/technic/technic/textures/technic_water_mill_top.png Binary files differnew file mode 100644 index 0000000..601ff15 --- /dev/null +++ b/technic/technic/textures/technic_water_mill_top.png diff --git a/technic/technic/textures/technic_water_mill_top_active.png b/technic/technic/textures/technic_water_mill_top_active.png Binary files differnew file mode 100644 index 0000000..f02bec6 --- /dev/null +++ b/technic/technic/textures/technic_water_mill_top_active.png diff --git a/technic/technic/textures/technic_workshop_bottom.png b/technic/technic/textures/technic_workshop_bottom.png Binary files differnew file mode 100644 index 0000000..bd8fd55 --- /dev/null +++ b/technic/technic/textures/technic_workshop_bottom.png diff --git a/technic/technic/textures/technic_workshop_side.png b/technic/technic/textures/technic_workshop_side.png Binary files differnew file mode 100644 index 0000000..9e3e7a7 --- /dev/null +++ b/technic/technic/textures/technic_workshop_side.png diff --git a/technic/technic/textures/technic_workshop_top.png b/technic/technic/textures/technic_workshop_top.png Binary files differnew file mode 100644 index 0000000..feae141 --- /dev/null +++ b/technic/technic/textures/technic_workshop_top.png diff --git a/technic/technic/textures/technic_wrought_iron_dust.png b/technic/technic/textures/technic_wrought_iron_dust.png Binary files differnew file mode 100644 index 0000000..ad23c62 --- /dev/null +++ b/technic/technic/textures/technic_wrought_iron_dust.png diff --git a/technic/technic/textures/technic_zinc_dust.png b/technic/technic/textures/technic_zinc_dust.png Binary files differnew file mode 100644 index 0000000..bbd826c --- /dev/null +++ b/technic/technic/textures/technic_zinc_dust.png diff --git a/technic/technic/textures/technicx32/technic_akalin_dust.png b/technic/technic/textures/technicx32/technic_akalin_dust.png Binary files differnew file mode 100644 index 0000000..90f3bac --- /dev/null +++ b/technic/technic/textures/technicx32/technic_akalin_dust.png diff --git a/technic/technic/textures/technicx32/technic_alatro_dust.png b/technic/technic/textures/technicx32/technic_alatro_dust.png Binary files differnew file mode 100644 index 0000000..1199614 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_alatro_dust.png diff --git a/technic/technic/textures/technicx32/technic_alloy_furnace_front.png b/technic/technic/textures/technicx32/technic_alloy_furnace_front.png Binary files differnew file mode 100644 index 0000000..9123fb6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_alloy_furnace_front.png diff --git a/technic/technic/textures/technicx32/technic_alloy_furnace_front_active.png b/technic/technic/textures/technicx32/technic_alloy_furnace_front_active.png Binary files differnew file mode 100644 index 0000000..4dda2e6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_alloy_furnace_front_active.png diff --git a/technic/technic/textures/technicx32/technic_alloy_furnace_side.png b/technic/technic/textures/technicx32/technic_alloy_furnace_side.png Binary files differnew file mode 100644 index 0000000..b5bd428 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_alloy_furnace_side.png diff --git a/technic/technic/textures/technicx32/technic_alloy_furnace_top.png b/technic/technic/textures/technicx32/technic_alloy_furnace_top.png Binary files differnew file mode 100644 index 0000000..67ef4b7 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_alloy_furnace_top.png diff --git a/technic/technic/textures/technicx32/technic_arol_dust.png b/technic/technic/textures/technicx32/technic_arol_dust.png Binary files differnew file mode 100644 index 0000000..f5a392f --- /dev/null +++ b/technic/technic/textures/technicx32/technic_arol_dust.png diff --git a/technic/technic/textures/technicx32/technic_battery.png b/technic/technic/textures/technicx32/technic_battery.png Binary files differnew file mode 100644 index 0000000..ee83b74 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_battery.png diff --git a/technic/technic/textures/technicx32/technic_battery_box_bottom.png b/technic/technic/textures/technicx32/technic_battery_box_bottom.png Binary files differnew file mode 100644 index 0000000..03c7ccc --- /dev/null +++ b/technic/technic/textures/technicx32/technic_battery_box_bottom.png diff --git a/technic/technic/textures/technicx32/technic_battery_box_side0.png b/technic/technic/textures/technicx32/technic_battery_box_side0.png Binary files differnew file mode 100644 index 0000000..2662ac0 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_battery_box_side0.png diff --git a/technic/technic/textures/technicx32/technic_battery_box_top.png b/technic/technic/textures/technicx32/technic_battery_box_top.png Binary files differnew file mode 100644 index 0000000..4953a32 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_battery_box_top.png diff --git a/technic/technic/textures/technicx32/technic_battery_reload.png b/technic/technic/textures/technicx32/technic_battery_reload.png Binary files differnew file mode 100644 index 0000000..164b4ac --- /dev/null +++ b/technic/technic/textures/technicx32/technic_battery_reload.png diff --git a/technic/technic/textures/technicx32/technic_brass_dust.png b/technic/technic/textures/technicx32/technic_brass_dust.png Binary files differnew file mode 100644 index 0000000..f86167a --- /dev/null +++ b/technic/technic/textures/technicx32/technic_brass_dust.png diff --git a/technic/technic/textures/technicx32/technic_bronze_dust.png b/technic/technic/textures/technicx32/technic_bronze_dust.png Binary files differnew file mode 100644 index 0000000..0a2401e --- /dev/null +++ b/technic/technic/textures/technicx32/technic_bronze_dust.png diff --git a/technic/technic/textures/technicx32/technic_carbon_steel_dust.png b/technic/technic/textures/technicx32/technic_carbon_steel_dust.png Binary files differnew file mode 100644 index 0000000..0bf350f --- /dev/null +++ b/technic/technic/textures/technicx32/technic_carbon_steel_dust.png diff --git a/technic/technic/textures/technicx32/technic_cast_iron_dust.png b/technic/technic/textures/technicx32/technic_cast_iron_dust.png Binary files differnew file mode 100644 index 0000000..f355094 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_cast_iron_dust.png diff --git a/technic/technic/textures/technicx32/technic_chainsaw.png b/technic/technic/textures/technicx32/technic_chainsaw.png Binary files differnew file mode 100644 index 0000000..b7ceee6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_chainsaw.png diff --git a/technic/technic/textures/technicx32/technic_chromium_dust.png b/technic/technic/textures/technicx32/technic_chromium_dust.png Binary files differnew file mode 100644 index 0000000..a33358b --- /dev/null +++ b/technic/technic/textures/technicx32/technic_chromium_dust.png diff --git a/technic/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png Binary files differnew file mode 100644 index 0000000..7a5eed7 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png diff --git a/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front.png b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front.png Binary files differnew file mode 100644 index 0000000..b00bef3 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front.png diff --git a/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png Binary files differnew file mode 100644 index 0000000..b41f619 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png diff --git a/technic/technic/textures/technicx32/technic_coal_alloy_furnace_side.png b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_side.png Binary files differnew file mode 100644 index 0000000..3db8daa --- /dev/null +++ b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_side.png diff --git a/technic/technic/textures/technicx32/technic_coal_alloy_furnace_top.png b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_top.png Binary files differnew file mode 100644 index 0000000..c648fe8 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_top.png diff --git a/technic/technic/textures/technicx32/technic_coal_dust.png b/technic/technic/textures/technicx32/technic_coal_dust.png Binary files differnew file mode 100644 index 0000000..0fe7db7 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_coal_dust.png diff --git a/technic/technic/textures/technicx32/technic_constructor_back.png b/technic/technic/textures/technicx32/technic_constructor_back.png Binary files differnew file mode 100644 index 0000000..6baf788 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_back.png diff --git a/technic/technic/textures/technicx32/technic_constructor_front_off.png b/technic/technic/textures/technicx32/technic_constructor_front_off.png Binary files differnew file mode 100644 index 0000000..f878e55 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_front_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_front_on.png b/technic/technic/textures/technicx32/technic_constructor_front_on.png Binary files differnew file mode 100644 index 0000000..89189d6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_front_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_off.png b/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_off.png Binary files differnew file mode 100644 index 0000000..205dcc4 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_on.png b/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_on.png Binary files differnew file mode 100644 index 0000000..9896c52 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_side1_off.png b/technic/technic/textures/technicx32/technic_constructor_mk1_side1_off.png Binary files differnew file mode 100644 index 0000000..e8a01ff --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk1_side1_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_side1_on.png b/technic/technic/textures/technicx32/technic_constructor_mk1_side1_on.png Binary files differnew file mode 100644 index 0000000..c897942 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk1_side1_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_side2_off.png b/technic/technic/textures/technicx32/technic_constructor_mk1_side2_off.png Binary files differnew file mode 100644 index 0000000..8da65f6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk1_side2_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_side2_on.png b/technic/technic/textures/technicx32/technic_constructor_mk1_side2_on.png Binary files differnew file mode 100644 index 0000000..da8ed34 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk1_side2_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_top_off.png b/technic/technic/textures/technicx32/technic_constructor_mk1_top_off.png Binary files differnew file mode 100644 index 0000000..7d8c7e0 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk1_top_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_top_on.png b/technic/technic/textures/technicx32/technic_constructor_mk1_top_on.png Binary files differnew file mode 100644 index 0000000..439caf5 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk1_top_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_off.png b/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_off.png Binary files differnew file mode 100644 index 0000000..83c5b07 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_on.png b/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_on.png Binary files differnew file mode 100644 index 0000000..9ad76f4 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_side1_off.png b/technic/technic/textures/technicx32/technic_constructor_mk2_side1_off.png Binary files differnew file mode 100644 index 0000000..584dfe3 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk2_side1_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_side1_on.png b/technic/technic/textures/technicx32/technic_constructor_mk2_side1_on.png Binary files differnew file mode 100644 index 0000000..fe02042 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk2_side1_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_side2_off.png b/technic/technic/textures/technicx32/technic_constructor_mk2_side2_off.png Binary files differnew file mode 100644 index 0000000..fd9ad74 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk2_side2_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_side2_on.png b/technic/technic/textures/technicx32/technic_constructor_mk2_side2_on.png Binary files differnew file mode 100644 index 0000000..f51411a --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk2_side2_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_top_off.png b/technic/technic/textures/technicx32/technic_constructor_mk2_top_off.png Binary files differnew file mode 100644 index 0000000..e3e3292 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk2_top_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_top_on.png b/technic/technic/textures/technicx32/technic_constructor_mk2_top_on.png Binary files differnew file mode 100644 index 0000000..83043d4 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk2_top_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_off.png b/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_off.png Binary files differnew file mode 100644 index 0000000..5f46154 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_on.png b/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_on.png Binary files differnew file mode 100644 index 0000000..f76f29b --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_side1_off.png b/technic/technic/textures/technicx32/technic_constructor_mk3_side1_off.png Binary files differnew file mode 100644 index 0000000..0ea1fc0 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk3_side1_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_side1_on.png b/technic/technic/textures/technicx32/technic_constructor_mk3_side1_on.png Binary files differnew file mode 100644 index 0000000..ba86332 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk3_side1_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_side2_off.png b/technic/technic/textures/technicx32/technic_constructor_mk3_side2_off.png Binary files differnew file mode 100644 index 0000000..8e8dce4 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk3_side2_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_side2_on.png b/technic/technic/textures/technicx32/technic_constructor_mk3_side2_on.png Binary files differnew file mode 100644 index 0000000..12dff69 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk3_side2_on.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_top_off.png b/technic/technic/textures/technicx32/technic_constructor_mk3_top_off.png Binary files differnew file mode 100644 index 0000000..705f255 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk3_top_off.png diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_top_on.png b/technic/technic/textures/technicx32/technic_constructor_mk3_top_on.png Binary files differnew file mode 100644 index 0000000..cef077e --- /dev/null +++ b/technic/technic/textures/technicx32/technic_constructor_mk3_top_on.png diff --git a/technic/technic/textures/technicx32/technic_control_logic_unit.png b/technic/technic/textures/technicx32/technic_control_logic_unit.png Binary files differnew file mode 100644 index 0000000..6ed00eb --- /dev/null +++ b/technic/technic/textures/technicx32/technic_control_logic_unit.png diff --git a/technic/technic/textures/technicx32/technic_copper_coil.png b/technic/technic/textures/technicx32/technic_copper_coil.png Binary files differnew file mode 100644 index 0000000..db6db1a --- /dev/null +++ b/technic/technic/textures/technicx32/technic_copper_coil.png diff --git a/technic/technic/textures/technicx32/technic_copper_dust.png b/technic/technic/textures/technicx32/technic_copper_dust.png Binary files differnew file mode 100644 index 0000000..68678ed --- /dev/null +++ b/technic/technic/textures/technicx32/technic_copper_dust.png diff --git a/technic/technic/textures/technicx32/technic_deployer_back.png b/technic/technic/textures/technicx32/technic_deployer_back.png Binary files differnew file mode 100644 index 0000000..0bc8df9 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_deployer_back.png diff --git a/technic/technic/textures/technicx32/technic_deployer_bottom.png b/technic/technic/textures/technicx32/technic_deployer_bottom.png Binary files differnew file mode 100644 index 0000000..ff1a2c6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_deployer_bottom.png diff --git a/technic/technic/textures/technicx32/technic_deployer_front_off.png b/technic/technic/textures/technicx32/technic_deployer_front_off.png Binary files differnew file mode 100644 index 0000000..d0f6f55 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_deployer_front_off.png diff --git a/technic/technic/textures/technicx32/technic_deployer_front_on.png b/technic/technic/textures/technicx32/technic_deployer_front_on.png Binary files differnew file mode 100644 index 0000000..368ce32 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_deployer_front_on.png diff --git a/technic/technic/textures/technicx32/technic_deployer_side.png b/technic/technic/textures/technicx32/technic_deployer_side.png Binary files differnew file mode 100644 index 0000000..aefd7c8 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_deployer_side.png diff --git a/technic/technic/textures/technicx32/technic_deployer_side1.png b/technic/technic/textures/technicx32/technic_deployer_side1.png Binary files differnew file mode 100644 index 0000000..8cb8634 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_deployer_side1.png diff --git a/technic/technic/textures/technicx32/technic_deployer_side2.png b/technic/technic/textures/technicx32/technic_deployer_side2.png Binary files differnew file mode 100644 index 0000000..c2855d0 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_deployer_side2.png diff --git a/technic/technic/textures/technicx32/technic_deployer_top.png b/technic/technic/textures/technicx32/technic_deployer_top.png Binary files differnew file mode 100644 index 0000000..941d333 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_deployer_top.png diff --git a/technic/technic/textures/technicx32/technic_diamond_block_blue.png b/technic/technic/textures/technicx32/technic_diamond_block_blue.png Binary files differnew file mode 100644 index 0000000..d89bd6e --- /dev/null +++ b/technic/technic/textures/technicx32/technic_diamond_block_blue.png diff --git a/technic/technic/textures/technicx32/technic_diamond_block_green.png b/technic/technic/textures/technicx32/technic_diamond_block_green.png Binary files differnew file mode 100644 index 0000000..996b254 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_diamond_block_green.png diff --git a/technic/technic/textures/technicx32/technic_diamond_block_red.png b/technic/technic/textures/technicx32/technic_diamond_block_red.png Binary files differnew file mode 100644 index 0000000..52fd893 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_diamond_block_red.png diff --git a/technic/technic/textures/technicx32/technic_diamond_drill_head.png b/technic/technic/textures/technicx32/technic_diamond_drill_head.png Binary files differnew file mode 100644 index 0000000..e3d31e8 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_diamond_drill_head.png diff --git a/technic/technic/textures/technicx32/technic_doped_silicon_wafer.png b/technic/technic/textures/technicx32/technic_doped_silicon_wafer.png Binary files differnew file mode 100644 index 0000000..6ff06a6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_doped_silicon_wafer.png diff --git a/technic/technic/textures/technicx32/technic_electric_furnace_bottom.png b/technic/technic/textures/technicx32/technic_electric_furnace_bottom.png Binary files differnew file mode 100644 index 0000000..d16ac47 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_electric_furnace_bottom.png diff --git a/technic/technic/textures/technicx32/technic_electric_furnace_front.png b/technic/technic/textures/technicx32/technic_electric_furnace_front.png Binary files differnew file mode 100644 index 0000000..dfee663 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_electric_furnace_front.png diff --git a/technic/technic/textures/technicx32/technic_electric_furnace_front_active.png b/technic/technic/textures/technicx32/technic_electric_furnace_front_active.png Binary files differnew file mode 100644 index 0000000..038eec4 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_electric_furnace_front_active.png diff --git a/technic/technic/textures/technicx32/technic_electric_furnace_side.png b/technic/technic/textures/technicx32/technic_electric_furnace_side.png Binary files differnew file mode 100644 index 0000000..cf345e7 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_electric_furnace_side.png diff --git a/technic/technic/textures/technicx32/technic_electric_furnace_top.png b/technic/technic/textures/technicx32/technic_electric_furnace_top.png Binary files differnew file mode 100644 index 0000000..d3309ec --- /dev/null +++ b/technic/technic/textures/technicx32/technic_electric_furnace_top.png diff --git a/technic/technic/textures/technicx32/technic_fine_copper_wire.png b/technic/technic/textures/technicx32/technic_fine_copper_wire.png Binary files differnew file mode 100644 index 0000000..36e2ed6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_fine_copper_wire.png diff --git a/technic/technic/textures/technicx32/technic_fine_gold_wire.png b/technic/technic/textures/technicx32/technic_fine_gold_wire.png Binary files differnew file mode 100644 index 0000000..be2a38a --- /dev/null +++ b/technic/technic/textures/technicx32/technic_fine_gold_wire.png diff --git a/technic/technic/textures/technicx32/technic_fine_silver_wire.png b/technic/technic/textures/technicx32/technic_fine_silver_wire.png Binary files differnew file mode 100644 index 0000000..d43cb6a --- /dev/null +++ b/technic/technic/textures/technicx32/technic_fine_silver_wire.png diff --git a/technic/technic/textures/technicx32/technic_flashlight.png b/technic/technic/textures/technicx32/technic_flashlight.png Binary files differnew file mode 100644 index 0000000..01afdbb --- /dev/null +++ b/technic/technic/textures/technicx32/technic_flashlight.png diff --git a/technic/technic/textures/technicx32/technic_generator_front.png b/technic/technic/textures/technicx32/technic_generator_front.png Binary files differnew file mode 100644 index 0000000..2d64844 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_generator_front.png diff --git a/technic/technic/textures/technicx32/technic_generator_front_active.png b/technic/technic/textures/technicx32/technic_generator_front_active.png Binary files differnew file mode 100644 index 0000000..4e57ca0 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_generator_front_active.png diff --git a/technic/technic/textures/technicx32/technic_generator_side.png b/technic/technic/textures/technicx32/technic_generator_side.png Binary files differnew file mode 100644 index 0000000..5cbcbef --- /dev/null +++ b/technic/technic/textures/technicx32/technic_generator_side.png diff --git a/technic/technic/textures/technicx32/technic_generator_top.png b/technic/technic/textures/technicx32/technic_generator_top.png Binary files differnew file mode 100644 index 0000000..e2f3db3 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_generator_top.png diff --git a/technic/technic/textures/technicx32/technic_geothermal_side.png b/technic/technic/textures/technicx32/technic_geothermal_side.png Binary files differnew file mode 100644 index 0000000..90fb430 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_geothermal_side.png diff --git a/technic/technic/textures/technicx32/technic_geothermal_top.png b/technic/technic/textures/technicx32/technic_geothermal_top.png Binary files differnew file mode 100644 index 0000000..601ff15 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_geothermal_top.png diff --git a/technic/technic/textures/technicx32/technic_geothermal_top_active.png b/technic/technic/textures/technicx32/technic_geothermal_top_active.png Binary files differnew file mode 100644 index 0000000..f02bec6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_geothermal_top_active.png diff --git a/technic/technic/textures/technicx32/technic_gold_dust.png b/technic/technic/textures/technicx32/technic_gold_dust.png Binary files differnew file mode 100644 index 0000000..e545bb6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_gold_dust.png diff --git a/technic/technic/textures/technicx32/technic_grinder_front.png b/technic/technic/textures/technicx32/technic_grinder_front.png Binary files differnew file mode 100644 index 0000000..a28dbc1 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_grinder_front.png diff --git a/technic/technic/textures/technicx32/technic_grinder_side.png b/technic/technic/textures/technicx32/technic_grinder_side.png Binary files differnew file mode 100644 index 0000000..af562f2 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_grinder_side.png diff --git a/technic/technic/textures/technicx32/technic_grinder_top.png b/technic/technic/textures/technicx32/technic_grinder_top.png Binary files differnew file mode 100644 index 0000000..b074e13 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_grinder_top.png diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_bottom.png b/technic/technic/textures/technicx32/technic_hv_grinder_bottom.png Binary files differnew file mode 100644 index 0000000..d854193 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_grinder_bottom.png diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_front.png b/technic/technic/textures/technicx32/technic_hv_grinder_front.png Binary files differnew file mode 100644 index 0000000..f20cb22 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_grinder_front.png diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_front_active.png b/technic/technic/textures/technicx32/technic_hv_grinder_front_active.png Binary files differnew file mode 100644 index 0000000..d1fa468 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_grinder_front_active.png diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_side.png b/technic/technic/textures/technicx32/technic_hv_grinder_side.png Binary files differnew file mode 100644 index 0000000..35cf031 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_grinder_side.png diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_side_tube.png b/technic/technic/textures/technicx32/technic_hv_grinder_side_tube.png Binary files differnew file mode 100644 index 0000000..5b5b450 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_grinder_side_tube.png diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_top.png b/technic/technic/textures/technicx32/technic_hv_grinder_top.png Binary files differnew file mode 100644 index 0000000..7869ea8 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_grinder_top.png diff --git a/technic/technic/textures/technicx32/technic_hv_nuclear_reactor_core.png b/technic/technic/textures/technicx32/technic_hv_nuclear_reactor_core.png Binary files differnew file mode 100644 index 0000000..3d380da --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_nuclear_reactor_core.png diff --git a/technic/technic/textures/technicx32/technic_hv_solar_array_bottom.png b/technic/technic/textures/technicx32/technic_hv_solar_array_bottom.png Binary files differnew file mode 100644 index 0000000..94c8222 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_solar_array_bottom.png diff --git a/technic/technic/textures/technicx32/technic_hv_solar_array_side.png b/technic/technic/textures/technicx32/technic_hv_solar_array_side.png Binary files differnew file mode 100644 index 0000000..d39d3d8 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_solar_array_side.png diff --git a/technic/technic/textures/technicx32/technic_hv_solar_array_top.png b/technic/technic/textures/technicx32/technic_hv_solar_array_top.png Binary files differnew file mode 100644 index 0000000..3e1b9e0 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_solar_array_top.png diff --git a/technic/technic/textures/technicx32/technic_hv_transformer.png b/technic/technic/textures/technicx32/technic_hv_transformer.png Binary files differnew file mode 100644 index 0000000..7794644 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_hv_transformer.png diff --git a/technic/technic/textures/technicx32/technic_injector_bottom.png b/technic/technic/textures/technicx32/technic_injector_bottom.png Binary files differnew file mode 100644 index 0000000..39916bd --- /dev/null +++ b/technic/technic/textures/technicx32/technic_injector_bottom.png diff --git a/technic/technic/textures/technicx32/technic_injector_side.png b/technic/technic/textures/technicx32/technic_injector_side.png Binary files differnew file mode 100644 index 0000000..a5419a1 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_injector_side.png diff --git a/technic/technic/textures/technicx32/technic_injector_top.png b/technic/technic/textures/technicx32/technic_injector_top.png Binary files differnew file mode 100644 index 0000000..440649c --- /dev/null +++ b/technic/technic/textures/technicx32/technic_injector_top.png diff --git a/technic/technic/textures/technicx32/technic_kalite_dust.png b/technic/technic/textures/technicx32/technic_kalite_dust.png Binary files differnew file mode 100644 index 0000000..595edb5 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_kalite_dust.png diff --git a/technic/technic/textures/technicx32/technic_laser_beam.png b/technic/technic/textures/technicx32/technic_laser_beam.png Binary files differnew file mode 100644 index 0000000..4814a9b --- /dev/null +++ b/technic/technic/textures/technicx32/technic_laser_beam.png diff --git a/technic/technic/textures/technicx32/technic_lava_can.png b/technic/technic/textures/technicx32/technic_lava_can.png Binary files differnew file mode 100644 index 0000000..80d15a6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_lava_can.png diff --git a/technic/technic/textures/technicx32/technic_light.png b/technic/technic/textures/technicx32/technic_light.png Binary files differnew file mode 100644 index 0000000..334cb07 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_light.png diff --git a/technic/technic/textures/technicx32/technic_lv_grinder_bottom.png b/technic/technic/textures/technicx32/technic_lv_grinder_bottom.png Binary files differnew file mode 100644 index 0000000..816b969 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_lv_grinder_bottom.png diff --git a/technic/technic/textures/technicx32/technic_lv_grinder_front.png b/technic/technic/textures/technicx32/technic_lv_grinder_front.png Binary files differnew file mode 100644 index 0000000..7451ca9 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_lv_grinder_front.png diff --git a/technic/technic/textures/technicx32/technic_lv_grinder_front_active.png b/technic/technic/textures/technicx32/technic_lv_grinder_front_active.png Binary files differnew file mode 100644 index 0000000..8e17e4d --- /dev/null +++ b/technic/technic/textures/technicx32/technic_lv_grinder_front_active.png diff --git a/technic/technic/textures/technicx32/technic_lv_grinder_side.png b/technic/technic/textures/technicx32/technic_lv_grinder_side.png Binary files differnew file mode 100644 index 0000000..908287b --- /dev/null +++ b/technic/technic/textures/technicx32/technic_lv_grinder_side.png diff --git a/technic/technic/textures/technicx32/technic_lv_grinder_top.png b/technic/technic/textures/technicx32/technic_lv_grinder_top.png Binary files differnew file mode 100644 index 0000000..8520baf --- /dev/null +++ b/technic/technic/textures/technicx32/technic_lv_grinder_top.png diff --git a/technic/technic/textures/technicx32/technic_lv_solar_array_bottom.png b/technic/technic/textures/technicx32/technic_lv_solar_array_bottom.png Binary files differnew file mode 100644 index 0000000..94c8222 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_lv_solar_array_bottom.png diff --git a/technic/technic/textures/technicx32/technic_lv_solar_array_side.png b/technic/technic/textures/technicx32/technic_lv_solar_array_side.png Binary files differnew file mode 100644 index 0000000..d39d3d8 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_lv_solar_array_side.png diff --git a/technic/technic/textures/technicx32/technic_lv_solar_array_top.png b/technic/technic/textures/technicx32/technic_lv_solar_array_top.png Binary files differnew file mode 100644 index 0000000..3d8c7ab --- /dev/null +++ b/technic/technic/textures/technicx32/technic_lv_solar_array_top.png diff --git a/technic/technic/textures/technicx32/technic_lv_transformer.png b/technic/technic/textures/technicx32/technic_lv_transformer.png Binary files differnew file mode 100644 index 0000000..99ac927 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_lv_transformer.png diff --git a/technic/technic/textures/technicx32/technic_machine_bottom.png b/technic/technic/textures/technicx32/technic_machine_bottom.png Binary files differnew file mode 100644 index 0000000..943dae1 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_machine_bottom.png diff --git a/technic/technic/textures/technicx32/technic_mining_drill.png b/technic/technic/textures/technicx32/technic_mining_drill.png Binary files differnew file mode 100644 index 0000000..171888d --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mining_drill.png diff --git a/technic/technic/textures/technicx32/technic_mining_laser_mk1.png b/technic/technic/textures/technicx32/technic_mining_laser_mk1.png Binary files differnew file mode 100644 index 0000000..acde392 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mining_laser_mk1.png diff --git a/technic/technic/textures/technicx32/technic_mithril_dust.png b/technic/technic/textures/technicx32/technic_mithril_dust.png Binary files differnew file mode 100644 index 0000000..988e449 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mithril_dust.png diff --git a/technic/technic/textures/technicx32/technic_motor.png b/technic/technic/textures/technicx32/technic_motor.png Binary files differnew file mode 100644 index 0000000..77d4b91 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_motor.png diff --git a/technic/technic/textures/technicx32/technic_music_player_bottom.png b/technic/technic/textures/technicx32/technic_music_player_bottom.png Binary files differnew file mode 100644 index 0000000..bd8fd55 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_music_player_bottom.png diff --git a/technic/technic/textures/technicx32/technic_music_player_side.png b/technic/technic/textures/technicx32/technic_music_player_side.png Binary files differnew file mode 100644 index 0000000..6c34fea --- /dev/null +++ b/technic/technic/textures/technicx32/technic_music_player_side.png diff --git a/technic/technic/textures/technicx32/technic_music_player_top.png b/technic/technic/textures/technicx32/technic_music_player_top.png Binary files differnew file mode 100644 index 0000000..0d34563 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_music_player_top.png diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.png Binary files differnew file mode 100644 index 0000000..3723bb1 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.png diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front.png Binary files differnew file mode 100644 index 0000000..a5dac82 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front.png diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.png Binary files differnew file mode 100644 index 0000000..f6e69a9 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.png diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side.png Binary files differnew file mode 100644 index 0000000..0430479 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side.png diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.png Binary files differnew file mode 100644 index 0000000..69f89e7 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.png diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_top.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_top.png Binary files differnew file mode 100644 index 0000000..f44e3c0 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_top.png diff --git a/technic/technic/textures/technicx32/technic_mv_battery_box_bottom.png b/technic/technic/textures/technicx32/technic_mv_battery_box_bottom.png Binary files differnew file mode 100644 index 0000000..2a9b292 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_battery_box_bottom.png diff --git a/technic/technic/textures/technicx32/technic_mv_battery_box_side0.png b/technic/technic/textures/technicx32/technic_mv_battery_box_side0.png Binary files differnew file mode 100644 index 0000000..39d8986 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_battery_box_side0.png diff --git a/technic/technic/textures/technicx32/technic_mv_battery_box_top.png b/technic/technic/textures/technicx32/technic_mv_battery_box_top.png Binary files differnew file mode 100644 index 0000000..f7f1ea9 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_battery_box_top.png diff --git a/technic/technic/textures/technicx32/technic_mv_cable_wield.png b/technic/technic/textures/technicx32/technic_mv_cable_wield.png Binary files differnew file mode 100644 index 0000000..aca9fd4 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_cable_wield.png diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_bottom.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_bottom.png Binary files differnew file mode 100644 index 0000000..d16ac47 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_bottom.png diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_front.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_front.png Binary files differnew file mode 100644 index 0000000..4dfac63 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_front.png diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_front_active.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_front_active.png Binary files differnew file mode 100644 index 0000000..e206cd2 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_front_active.png diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_side.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_side.png Binary files differnew file mode 100644 index 0000000..4aa27b7 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_side.png diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.png Binary files differnew file mode 100644 index 0000000..bfeba18 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.png diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_top.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_top.png Binary files differnew file mode 100644 index 0000000..635b6b7 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_top.png diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_bottom.png b/technic/technic/textures/technicx32/technic_mv_grinder_bottom.png Binary files differnew file mode 100644 index 0000000..f46cd72 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_grinder_bottom.png diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_front.png b/technic/technic/textures/technicx32/technic_mv_grinder_front.png Binary files differnew file mode 100644 index 0000000..6445dfe --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_grinder_front.png diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_front_active.png b/technic/technic/textures/technicx32/technic_mv_grinder_front_active.png Binary files differnew file mode 100644 index 0000000..428e1dc --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_grinder_front_active.png diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_side.png b/technic/technic/textures/technicx32/technic_mv_grinder_side.png Binary files differnew file mode 100644 index 0000000..c014f08 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_grinder_side.png diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_side_tube.png b/technic/technic/textures/technicx32/technic_mv_grinder_side_tube.png Binary files differnew file mode 100644 index 0000000..69050e4 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_grinder_side_tube.png diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_top.png b/technic/technic/textures/technicx32/technic_mv_grinder_top.png Binary files differnew file mode 100644 index 0000000..e0320ef --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_grinder_top.png diff --git a/technic/technic/textures/technicx32/technic_mv_solar_array_bottom.png b/technic/technic/textures/technicx32/technic_mv_solar_array_bottom.png Binary files differnew file mode 100644 index 0000000..94c8222 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_solar_array_bottom.png diff --git a/technic/technic/textures/technicx32/technic_mv_solar_array_side.png b/technic/technic/textures/technicx32/technic_mv_solar_array_side.png Binary files differnew file mode 100644 index 0000000..d39d3d8 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_solar_array_side.png diff --git a/technic/technic/textures/technicx32/technic_mv_solar_array_top.png b/technic/technic/textures/technicx32/technic_mv_solar_array_top.png Binary files differnew file mode 100644 index 0000000..e4999d5 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_solar_array_top.png diff --git a/technic/technic/textures/technicx32/technic_mv_transformer.png b/technic/technic/textures/technicx32/technic_mv_transformer.png Binary files differnew file mode 100644 index 0000000..7c4688e --- /dev/null +++ b/technic/technic/textures/technicx32/technic_mv_transformer.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_back.png b/technic/technic/textures/technicx32/technic_nodebreaker_back.png Binary files differnew file mode 100644 index 0000000..43ba821 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_back.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_bottom.png b/technic/technic/textures/technicx32/technic_nodebreaker_bottom.png Binary files differnew file mode 100644 index 0000000..99ff685 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_bottom.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_bottom_off.png b/technic/technic/textures/technicx32/technic_nodebreaker_bottom_off.png Binary files differnew file mode 100644 index 0000000..47cd4e8 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_bottom_off.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_bottom_on.png b/technic/technic/textures/technicx32/technic_nodebreaker_bottom_on.png Binary files differnew file mode 100644 index 0000000..994f787 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_bottom_on.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_front_off.png b/technic/technic/textures/technicx32/technic_nodebreaker_front_off.png Binary files differnew file mode 100644 index 0000000..5ece916 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_front_off.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_front_on.png b/technic/technic/textures/technicx32/technic_nodebreaker_front_on.png Binary files differnew file mode 100644 index 0000000..a53de2a --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_front_on.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side.png b/technic/technic/textures/technicx32/technic_nodebreaker_side.png Binary files differnew file mode 100644 index 0000000..c2b401b --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_side.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side1.png b/technic/technic/textures/technicx32/technic_nodebreaker_side1.png Binary files differnew file mode 100644 index 0000000..07e74aa --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_side1.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side1_off.png b/technic/technic/textures/technicx32/technic_nodebreaker_side1_off.png Binary files differnew file mode 100644 index 0000000..b63f3bb --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_side1_off.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side1_on.png b/technic/technic/textures/technicx32/technic_nodebreaker_side1_on.png Binary files differnew file mode 100644 index 0000000..b455f06 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_side1_on.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side2.png b/technic/technic/textures/technicx32/technic_nodebreaker_side2.png Binary files differnew file mode 100644 index 0000000..7f4a0bf --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_side2.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side2_off.png b/technic/technic/textures/technicx32/technic_nodebreaker_side2_off.png Binary files differnew file mode 100644 index 0000000..7b60902 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_side2_off.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side2_on.png b/technic/technic/textures/technicx32/technic_nodebreaker_side2_on.png Binary files differnew file mode 100644 index 0000000..12985f6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_side2_on.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_top.png b/technic/technic/textures/technicx32/technic_nodebreaker_top.png Binary files differnew file mode 100644 index 0000000..0994c6d --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_top.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_top_off.png b/technic/technic/textures/technicx32/technic_nodebreaker_top_off.png Binary files differnew file mode 100644 index 0000000..f08fc1b --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_top_off.png diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_top_on.png b/technic/technic/textures/technicx32/technic_nodebreaker_top_on.png Binary files differnew file mode 100644 index 0000000..ec28210 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_nodebreaker_top_on.png diff --git a/technic/technic/textures/technicx32/technic_power_meter.png b/technic/technic/textures/technicx32/technic_power_meter.png Binary files differnew file mode 100644 index 0000000..f1e5120 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter.png diff --git a/technic/technic/textures/technicx32/technic_power_meter1.png b/technic/technic/textures/technicx32/technic_power_meter1.png Binary files differnew file mode 100644 index 0000000..0542c7b --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter1.png diff --git a/technic/technic/textures/technicx32/technic_power_meter2.png b/technic/technic/textures/technicx32/technic_power_meter2.png Binary files differnew file mode 100644 index 0000000..bf5703c --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter2.png diff --git a/technic/technic/textures/technicx32/technic_power_meter3.png b/technic/technic/textures/technicx32/technic_power_meter3.png Binary files differnew file mode 100644 index 0000000..4204815 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter3.png diff --git a/technic/technic/textures/technicx32/technic_power_meter4.png b/technic/technic/textures/technicx32/technic_power_meter4.png Binary files differnew file mode 100644 index 0000000..82a0148 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter4.png diff --git a/technic/technic/textures/technicx32/technic_power_meter5.png b/technic/technic/textures/technicx32/technic_power_meter5.png Binary files differnew file mode 100644 index 0000000..af783ca --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter5.png diff --git a/technic/technic/textures/technicx32/technic_power_meter6.png b/technic/technic/textures/technicx32/technic_power_meter6.png Binary files differnew file mode 100644 index 0000000..44feff4 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter6.png diff --git a/technic/technic/textures/technicx32/technic_power_meter7.png b/technic/technic/textures/technicx32/technic_power_meter7.png Binary files differnew file mode 100644 index 0000000..554baa2 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter7.png diff --git a/technic/technic/textures/technicx32/technic_power_meter8.png b/technic/technic/textures/technicx32/technic_power_meter8.png Binary files differnew file mode 100644 index 0000000..8c4f4a8 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter8.png diff --git a/technic/technic/textures/technicx32/technic_power_meter_bg.png b/technic/technic/textures/technicx32/technic_power_meter_bg.png Binary files differnew file mode 100644 index 0000000..9667cda --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter_bg.png diff --git a/technic/technic/textures/technicx32/technic_power_meter_fg.png b/technic/technic/textures/technicx32/technic_power_meter_fg.png Binary files differnew file mode 100644 index 0000000..7f2dde8 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_power_meter_fg.png diff --git a/technic/technic/textures/technicx32/technic_raw_latex.png b/technic/technic/textures/technicx32/technic_raw_latex.png Binary files differnew file mode 100644 index 0000000..7fbbe64 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_raw_latex.png diff --git a/technic/technic/textures/technicx32/technic_rubber.png b/technic/technic/textures/technicx32/technic_rubber.png Binary files differnew file mode 100644 index 0000000..9ed4a9d --- /dev/null +++ b/technic/technic/textures/technicx32/technic_rubber.png diff --git a/technic/technic/textures/technicx32/technic_rubber_sapling.png b/technic/technic/textures/technicx32/technic_rubber_sapling.png Binary files differnew file mode 100644 index 0000000..e5c9f5d --- /dev/null +++ b/technic/technic/textures/technicx32/technic_rubber_sapling.png diff --git a/technic/technic/textures/technicx32/technic_rubber_tree_empty.png b/technic/technic/textures/technicx32/technic_rubber_tree_empty.png Binary files differnew file mode 100644 index 0000000..1792951 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_rubber_tree_empty.png diff --git a/technic/technic/textures/technicx32/technic_rubber_tree_full.png b/technic/technic/textures/technicx32/technic_rubber_tree_full.png Binary files differnew file mode 100644 index 0000000..08067ef --- /dev/null +++ b/technic/technic/textures/technicx32/technic_rubber_tree_full.png diff --git a/technic/technic/textures/technicx32/technic_screwdriver.png b/technic/technic/textures/technicx32/technic_screwdriver.png Binary files differnew file mode 100644 index 0000000..bd2da22 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_screwdriver.png diff --git a/technic/technic/textures/technicx32/technic_silicon_wafer.png b/technic/technic/textures/technicx32/technic_silicon_wafer.png Binary files differnew file mode 100644 index 0000000..78aef20 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_silicon_wafer.png diff --git a/technic/technic/textures/technicx32/technic_silver_dust.png b/technic/technic/textures/technicx32/technic_silver_dust.png Binary files differnew file mode 100644 index 0000000..9092c90 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_silver_dust.png diff --git a/technic/technic/textures/technicx32/technic_solar_panel_bottom.png b/technic/technic/textures/technicx32/technic_solar_panel_bottom.png Binary files differnew file mode 100644 index 0000000..b0ad82f --- /dev/null +++ b/technic/technic/textures/technicx32/technic_solar_panel_bottom.png diff --git a/technic/technic/textures/technicx32/technic_solar_panel_side.png b/technic/technic/textures/technicx32/technic_solar_panel_side.png Binary files differnew file mode 100644 index 0000000..b22447e --- /dev/null +++ b/technic/technic/textures/technicx32/technic_solar_panel_side.png diff --git a/technic/technic/textures/technicx32/technic_solar_panel_top.png b/technic/technic/textures/technicx32/technic_solar_panel_top.png Binary files differnew file mode 100644 index 0000000..492764b --- /dev/null +++ b/technic/technic/textures/technicx32/technic_solar_panel_top.png diff --git a/technic/technic/textures/technicx32/technic_sonic_screwdriver.png b/technic/technic/textures/technicx32/technic_sonic_screwdriver.png Binary files differnew file mode 100644 index 0000000..fb61d96 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_sonic_screwdriver.png diff --git a/technic/technic/textures/technicx32/technic_stainless_steel_dust.png b/technic/technic/textures/technicx32/technic_stainless_steel_dust.png Binary files differnew file mode 100644 index 0000000..450e2bb --- /dev/null +++ b/technic/technic/textures/technicx32/technic_stainless_steel_dust.png diff --git a/technic/technic/textures/technicx32/technic_talinite_dust.png b/technic/technic/textures/technicx32/technic_talinite_dust.png Binary files differnew file mode 100644 index 0000000..39f9330 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_talinite_dust.png diff --git a/technic/technic/textures/technicx32/technic_tin_dust.png b/technic/technic/textures/technicx32/technic_tin_dust.png Binary files differnew file mode 100644 index 0000000..4e94e00 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_tin_dust.png diff --git a/technic/technic/textures/technicx32/technic_tree_tap.png b/technic/technic/textures/technicx32/technic_tree_tap.png Binary files differnew file mode 100644 index 0000000..542f30f --- /dev/null +++ b/technic/technic/textures/technicx32/technic_tree_tap.png diff --git a/technic/technic/textures/technicx32/technic_uranium_dust.png b/technic/technic/textures/technicx32/technic_uranium_dust.png Binary files differnew file mode 100644 index 0000000..d8095c3 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_uranium_dust.png diff --git a/technic/technic/textures/technicx32/technic_water_can.png b/technic/technic/textures/technicx32/technic_water_can.png Binary files differnew file mode 100644 index 0000000..18e0225 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_water_can.png diff --git a/technic/technic/textures/technicx32/technic_water_mill_side.png b/technic/technic/textures/technicx32/technic_water_mill_side.png Binary files differnew file mode 100644 index 0000000..f4bdb16 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_water_mill_side.png diff --git a/technic/technic/textures/technicx32/technic_water_mill_top.png b/technic/technic/textures/technicx32/technic_water_mill_top.png Binary files differnew file mode 100644 index 0000000..601ff15 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_water_mill_top.png diff --git a/technic/technic/textures/technicx32/technic_water_mill_top_active.png b/technic/technic/textures/technicx32/technic_water_mill_top_active.png Binary files differnew file mode 100644 index 0000000..f02bec6 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_water_mill_top_active.png diff --git a/technic/technic/textures/technicx32/technic_workshop_bottom.png b/technic/technic/textures/technicx32/technic_workshop_bottom.png Binary files differnew file mode 100644 index 0000000..bd8fd55 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_workshop_bottom.png diff --git a/technic/technic/textures/technicx32/technic_workshop_side.png b/technic/technic/textures/technicx32/technic_workshop_side.png Binary files differnew file mode 100644 index 0000000..9e3e7a7 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_workshop_side.png diff --git a/technic/technic/textures/technicx32/technic_workshop_top.png b/technic/technic/textures/technicx32/technic_workshop_top.png Binary files differnew file mode 100644 index 0000000..feae141 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_workshop_top.png diff --git a/technic/technic/textures/technicx32/technic_wrought_iron_dust.png b/technic/technic/textures/technicx32/technic_wrought_iron_dust.png Binary files differnew file mode 100644 index 0000000..d890e73 --- /dev/null +++ b/technic/technic/textures/technicx32/technic_wrought_iron_dust.png diff --git a/technic/technic/textures/technicx32/technic_zinc_dust.png b/technic/technic/textures/technicx32/technic_zinc_dust.png Binary files differnew file mode 100644 index 0000000..0d2f75a --- /dev/null +++ b/technic/technic/textures/technicx32/technic_zinc_dust.png diff --git a/technic/technic/tools/cans.lua b/technic/technic/tools/cans.lua new file mode 100644 index 0000000..f12ec93 --- /dev/null +++ b/technic/technic/tools/cans.lua @@ -0,0 +1,114 @@ +local S = technic.getter + +local function set_can_wear(itemstack, level, max_level) + local temp + if level == 0 then + temp = 0 + else + temp = 65536 - math.floor(level / max_level * 65535) + if temp > 65535 then temp = 65535 end + if temp < 1 then temp = 1 end + end + itemstack:set_wear(temp) +end + +local function get_can_level(itemstack) + if itemstack:get_metadata() == "" then + return 0 + else + return tonumber(itemstack:get_metadata()) + end +end + +function technic.register_can(d) + local data = {} + for k, v in pairs(d) do data[k] = v end + minetest.register_tool(data.can_name, { + description = data.can_description, + inventory_image = data.can_inventory_image, + stack_max = 1, + wear_represents = "content_level", + liquids_pointable = true, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then return end + local node = minetest.get_node(pointed_thing.under) + if node.name ~= data.liquid_source_name then return end + local charge = get_can_level(itemstack) + if charge == data.can_capacity then return end + if minetest.is_protected(pointed_thing.under, user:get_player_name()) then + minetest.log("action", user:get_player_name().." tried to take "..node.name.." at protected position "..minetest.pos_to_string(pointed_thing.under).." with a "..data.can_name) + return + end + minetest.remove_node(pointed_thing.under) + charge = charge + 1 + itemstack:set_metadata(tostring(charge)) + set_can_wear(itemstack, charge, data.can_capacity) + return itemstack + end, + on_place = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then return end + local pos = pointed_thing.under + local def = minetest.registered_nodes[minetest.get_node(pos).name] or {} + if def.on_rightclick and user and not user:get_player_control().sneak then + return def.on_rightclick(pos, minetest.get_node(pos), user, itemstack, pointed_thing) + end + if not def.buildable_to then + pos = pointed_thing.above + def = minetest.registered_nodes[minetest.get_node(pos).name] or {} + if not def.buildable_to then return end + end + local charge = get_can_level(itemstack) + if charge == 0 then return end + if minetest.is_protected(pos, user:get_player_name()) then + minetest.log("action", user:get_player_name().." tried to place "..data.liquid_source_name.." at protected position "..minetest.pos_to_string(pos).." with a "..data.can_name) + return + end + minetest.set_node(pos, {name=data.liquid_source_name}) + charge = charge - 1 + itemstack:set_metadata(tostring(charge)) + set_can_wear(itemstack, charge, data.can_capacity) + return itemstack + end, + on_refill = function(stack) + stack:set_metadata(tostring(data.can_capacity)) + set_can_wear(stack, data.can_capacity, data.can_capacity) + return stack + end, + }) +end + +technic.register_can({ + can_name = "technic:water_can", + can_description = S("Water Can"), + can_inventory_image = "technic_water_can.png", + can_capacity = 16, + liquid_source_name = "default:water_source", + liquid_flowing_name = "default:water_flowing", +}) + +minetest.register_craft({ + output = 'technic:water_can 1', + recipe = { + {'technic:zinc_ingot', 'technic:rubber','technic:zinc_ingot'}, + {'technic:carbon_steel_ingot', '', 'technic:carbon_steel_ingot'}, + {'technic:zinc_ingot', 'technic:carbon_steel_ingot', 'technic:zinc_ingot'}, + } +}) + +technic.register_can({ + can_name = "technic:lava_can", + can_description = S("Lava Can"), + can_inventory_image = "technic_lava_can.png", + can_capacity = 8, + liquid_source_name = "default:lava_source", + liquid_flowing_name = "default:lava_flowing", +}) + +minetest.register_craft({ + output = 'technic:lava_can 1', + recipe = { + {'technic:zinc_ingot', 'technic:stainless_steel_ingot','technic:zinc_ingot'}, + {'technic:stainless_steel_ingot', '', 'technic:stainless_steel_ingot'}, + {'technic:zinc_ingot', 'technic:stainless_steel_ingot', 'technic:zinc_ingot'}, + } +}) diff --git a/technic/technic/tools/chainsaw.lua b/technic/technic/tools/chainsaw.lua new file mode 100644 index 0000000..bf4efff --- /dev/null +++ b/technic/technic/tools/chainsaw.lua @@ -0,0 +1,366 @@ +-- Configuration + +local chainsaw_max_charge = 30000 -- Maximum charge of the saw +-- Gives 2500 nodes on a single charge (about 50 complete normal trees) +local chainsaw_charge_per_node = 12 +-- Cut down tree leaves. Leaf decay may cause slowness on large trees +-- if this is disabled. +local chainsaw_leaves = true + +-- The default trees +local timber_nodenames = { + ["default:jungletree"] = true, + ["default:papyrus"] = true, + ["default:cactus"] = true, + ["default:tree"] = true, + ["default:apple"] = true, + ["default:pinetree"] = true, +} + +if chainsaw_leaves then + timber_nodenames["default:leaves"] = true + timber_nodenames["default:jungleleaves"] = true + timber_nodenames["default:pine_needles"] = true +end + +-- technic_worldgen defines rubber trees if moretrees isn't installed +if minetest.get_modpath("technic_worldgen") or + minetest.get_modpath("moretrees") then + timber_nodenames["moretrees:rubber_tree_trunk_empty"] = true + timber_nodenames["moretrees:rubber_tree_trunk"] = true + if chainsaw_leaves then + timber_nodenames["moretrees:rubber_tree_leaves"] = true + end +end + +-- Support moretrees if it is there +if minetest.get_modpath("moretrees") then + timber_nodenames["moretrees:acacia_trunk"] = true + timber_nodenames["moretrees:apple_tree_trunk"] = true + timber_nodenames["moretrees:beech_trunk"] = true + timber_nodenames["moretrees:birch_trunk"] = true + timber_nodenames["moretrees:fir_trunk"] = true + timber_nodenames["moretrees:oak_trunk"] = true + timber_nodenames["moretrees:palm_trunk"] = true + timber_nodenames["moretrees:pine_trunk"] = true + timber_nodenames["moretrees:sequoia_trunk"] = true + timber_nodenames["moretrees:spruce_trunk"] = true + timber_nodenames["moretrees:willow_trunk"] = true + timber_nodenames["moretrees:jungletree_trunk"] = true + + if chainsaw_leaves then + timber_nodenames["moretrees:acacia_leaves"] = true + timber_nodenames["moretrees:apple_tree_leaves"] = true + timber_nodenames["moretrees:oak_leaves"] = true + timber_nodenames["moretrees:fir_leaves"] = true + timber_nodenames["moretrees:fir_leaves_bright"] = true + timber_nodenames["moretrees:sequoia_leaves"] = true + timber_nodenames["moretrees:birch_leaves"] = true + timber_nodenames["moretrees:birch_leaves"] = true + timber_nodenames["moretrees:palm_leaves"] = true + timber_nodenames["moretrees:spruce_leaves"] = true + timber_nodenames["moretrees:spruce_leaves"] = true + timber_nodenames["moretrees:pine_leaves"] = true + timber_nodenames["moretrees:willow_leaves"] = true + timber_nodenames["moretrees:jungletree_leaves_green"] = true + timber_nodenames["moretrees:jungletree_leaves_yellow"] = true + timber_nodenames["moretrees:jungletree_leaves_red"] = true + timber_nodenames["moretrees:acorn"] = true + timber_nodenames["moretrees:coconut"] = true + timber_nodenames["moretrees:spruce_cone"] = true + timber_nodenames["moretrees:pine_cone"] = true + timber_nodenames["moretrees:fir_cone"] = true + timber_nodenames["moretrees:apple_blossoms"] = true + end +end + +-- Support growing_trees +if minetest.get_modpath("growing_trees") then + timber_nodenames["growing_trees:trunk"] = true + timber_nodenames["growing_trees:medium_trunk"] = true + timber_nodenames["growing_trees:big_trunk"] = true + timber_nodenames["growing_trees:trunk_top"] = true + timber_nodenames["growing_trees:trunk_sprout"] = true + timber_nodenames["growing_trees:branch_sprout"] = true + timber_nodenames["growing_trees:branch"] = true + timber_nodenames["growing_trees:branch_xmzm"] = true + timber_nodenames["growing_trees:branch_xpzm"] = true + timber_nodenames["growing_trees:branch_xmzp"] = true + timber_nodenames["growing_trees:branch_xpzp"] = true + timber_nodenames["growing_trees:branch_zz"] = true + timber_nodenames["growing_trees:branch_xx"] = true + + if chainsaw_leaves then + timber_nodenames["growing_trees:leaves"] = true + end +end + +-- Support growing_cactus +if minetest.get_modpath("growing_cactus") then + timber_nodenames["growing_cactus:sprout"] = true + timber_nodenames["growing_cactus:branch_sprout_vertical"] = true + timber_nodenames["growing_cactus:branch_sprout_vertical_fixed"] = true + timber_nodenames["growing_cactus:branch_sprout_xp"] = true + timber_nodenames["growing_cactus:branch_sprout_xm"] = true + timber_nodenames["growing_cactus:branch_sprout_zp"] = true + timber_nodenames["growing_cactus:branch_sprout_zm"] = true + timber_nodenames["growing_cactus:trunk"] = true + timber_nodenames["growing_cactus:branch_trunk"] = true + timber_nodenames["growing_cactus:branch"] = true + timber_nodenames["growing_cactus:branch_xp"] = true + timber_nodenames["growing_cactus:branch_xm"] = true + timber_nodenames["growing_cactus:branch_zp"] = true + timber_nodenames["growing_cactus:branch_zm"] = true + timber_nodenames["growing_cactus:branch_zz"] = true + timber_nodenames["growing_cactus:branch_xx"] = true +end + +-- Support farming_plus +if minetest.get_modpath("farming_plus") then + if chainsaw_leaves then + timber_nodenames["farming_plus:banana_leaves"] = true + timber_nodenames["farming_plus:banana"] = true + timber_nodenames["farming_plus:cocoa_leaves"] = true + timber_nodenames["farming_plus:cocoa"] = true + end +end + +-- Support nature +if minetest.get_modpath("nature") then + if chainsaw_leaves then + timber_nodenames["nature:blossom"] = true + end +end + +-- Support snow +if minetest.get_modpath("snow") then + if chainsaw_leaves then + timber_nodenames["snow:needles"] = true + timber_nodenames["snow:needles_decorated"] = true + timber_nodenames["snow:star"] = true + end +end + +-- Support vines (also generated by moretrees if available) +if minetest.get_modpath("vines") then + if chainsaw_leaves then + timber_nodenames["vines:vines"] = true + end +end + +if minetest.get_modpath("trunks") then + if chainsaw_leaves then + timber_nodenames["trunks:moss"] = true + timber_nodenames["trunks:moss_fungus"] = true + timber_nodenames["trunks:treeroot"] = true + end +end + +local S = technic.getter + +technic.register_power_tool("technic:chainsaw", chainsaw_max_charge) + +-- Table for saving what was sawed down +local produced = {} + +-- Save the items sawed down so that we can drop them in a nice single stack +local function handle_drops(drops) + for _, item in ipairs(drops) do + local stack = ItemStack(item) + local name = stack:get_name() + local p = produced[name] + if not p then + produced[name] = stack + else + p:set_count(p:get_count() + stack:get_count()) + end + end +end + +--- Iterator over positions to try to saw around a sawed node. +-- This returns positions in a 3x1x3 area around the position, plus the +-- position above it. This does not return the bottom position to prevent +-- the chainsaw from cutting down nodes below the cutting position. +-- @param pos Sawing position. +local function iterSawTries(pos) + -- Copy position to prevent mangling it + local pos = vector.new(pos) + local i = 0 + + return function() + i = i + 1 + -- Given a (top view) area like so (where 5 is the starting position): + -- X --> + -- Z 123 + -- | 456 + -- V 789 + -- This will return positions 1, 4, 7, 2, 8 (skip 5), 3, 6, 9, + -- and the position above 5. + if i == 1 then + -- Move to starting position + pos.x = pos.x - 1 + pos.z = pos.z - 1 + elseif i == 4 or i == 7 then + -- Move to next X and back to start of Z when we reach + -- the end of a Z line. + pos.x = pos.x + 1 + pos.z = pos.z - 2 + elseif i == 5 then + -- Skip the middle position (we've already run on it) + -- and double-increment the counter. + pos.z = pos.z + 2 + i = i + 1 + elseif i <= 9 then + -- Go to next Z. + pos.z = pos.z + 1 + elseif i == 10 then + -- Move back to center and up. + -- The Y+ position must be last so that we don't dig + -- straight upward and not come down (since the Y- + -- position isn't checked). + pos.x = pos.x - 1 + pos.z = pos.z - 1 + pos.y = pos.y + 1 + else + return nil + end + return pos + end +end + +-- This function does all the hard work. Recursively we dig the node at hand +-- if it is in the table and then search the surroundings for more stuff to dig. +local function recursive_dig(pos, remaining_charge) + if remaining_charge < chainsaw_charge_per_node then + return remaining_charge + end + local node = minetest.get_node(pos) + + if not timber_nodenames[node.name] then + return remaining_charge + end + + -- Wood found - cut it + handle_drops(minetest.get_node_drops(node.name, "")) + minetest.remove_node(pos) + remaining_charge = remaining_charge - chainsaw_charge_per_node + + -- Check surroundings and run recursively if any charge left + for npos in iterSawTries(pos) do + if remaining_charge < chainsaw_charge_per_node then + break + end + if timber_nodenames[minetest.get_node(npos).name] then + remaining_charge = recursive_dig(npos, remaining_charge) + end + end + return remaining_charge +end + +-- Function to randomize positions for new node drops +local function get_drop_pos(pos) + local drop_pos = {} + + for i = 0, 8 do + -- Randomize position for a new drop + drop_pos.x = pos.x + math.random(-3, 3) + drop_pos.y = pos.y - 1 + drop_pos.z = pos.z + math.random(-3, 3) + + -- Move the randomized position upwards until + -- the node is air or unloaded. + for y = drop_pos.y, drop_pos.y + 5 do + drop_pos.y = y + local node = minetest.get_node_or_nil(drop_pos) + + if not node then + -- If the node is not loaded yet simply drop + -- the item at the original digging position. + return pos + elseif node.name == "air" then + -- Add variation to the entity drop position, + -- but don't let drops get too close to the edge + drop_pos.x = drop_pos.x + (math.random() * 0.8) - 0.5 + drop_pos.z = drop_pos.z + (math.random() * 0.8) - 0.5 + return drop_pos + end + end + end + + -- Return the original position if this takes too long + return pos +end + +-- Chainsaw entry point +local function chainsaw_dig(pos, current_charge) + -- Start sawing things down + local remaining_charge = recursive_dig(pos, current_charge) + minetest.sound_play("chainsaw", {pos = pos, gain = 1.0, + max_hear_distance = 10}) + + -- Now drop items for the player + for name, stack in pairs(produced) do + -- Drop stacks of stack max or less + local count, max = stack:get_count(), stack:get_stack_max() + stack:set_count(max) + while count > max do + minetest.add_item(get_drop_pos(pos), stack) + count = count - max + end + stack:set_count(count) + minetest.add_item(get_drop_pos(pos), stack) + end + + -- Clean up + produced = {} + + return remaining_charge +end + + +minetest.register_tool("technic:chainsaw", { + description = S("Chainsaw"), + inventory_image = "technic_chainsaw.png", + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.charge or + meta.charge < chainsaw_charge_per_node then + return + end + + local name = user:get_player_name() + if minetest.is_protected(pointed_thing.under, name) then + minetest.record_protection_violation(pointed_thing.under, name) + return + end + + -- Send current charge to digging function so that the + -- chainsaw will stop after digging a number of nodes + meta.charge = chainsaw_dig(pointed_thing.under, meta.charge) + if not technic.creative_mode then + technic.set_RE_wear(itemstack, meta.charge, chainsaw_max_charge) + itemstack:set_metadata(minetest.serialize(meta)) + end + return itemstack + end, +}) + +local mesecons_button = minetest.get_modpath("mesecons_button") +local trigger = mesecons_button and "mesecons_button:button_off" or "default:mese_crystal_fragment" + +minetest.register_craft({ + output = "technic:chainsaw", + recipe = { + {"technic:stainless_steel_ingot", trigger, "technic:battery"}, + {"technic:fine_copper_wire", "technic:motor", "technic:battery"}, + {"", "", "technic:stainless_steel_ingot"}, + } +}) + diff --git a/technic/technic/tools/flashlight.lua b/technic/technic/tools/flashlight.lua new file mode 100644 index 0000000..252dc8c --- /dev/null +++ b/technic/technic/tools/flashlight.lua @@ -0,0 +1,123 @@ +-- Original code comes from walkin_light mod by Echo +-- http://minetest.net/forum/viewtopic.php?id=2621 + +local flashlight_max_charge = 30000 + +local S = technic.getter + +technic.register_power_tool("technic:flashlight", flashlight_max_charge) + +minetest.register_alias("technic:light_off", "air") + +minetest.register_tool("technic:flashlight", { + description = S("Flashlight"), + inventory_image = "technic_flashlight.png", + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, +}) + +minetest.register_craft({ + output = "technic:flashlight", + recipe = { + {"technic:rubber", "default:glass", "technic:rubber"}, + {"technic:stainless_steel_ingot", "technic:battery", "technic:stainless_steel_ingot"}, + {"", "technic:battery", ""} + } +}) + + +local player_positions = {} +local was_wielding = {} + +local function check_for_flashlight(player) + if player == nil then + return false + end + local inv = player:get_inventory() + local hotbar = inv:get_list("main") + for i = 1, 8 do + if hotbar[i]:get_name() == "technic:flashlight" then + local meta = minetest.deserialize(hotbar[i]:get_metadata()) + if meta and meta.charge and meta.charge >= 2 then + if not technic.creative_mode then + meta.charge = meta.charge - 2; + technic.set_RE_wear(hotbar[i], meta.charge, flashlight_max_charge) + hotbar[i]:set_metadata(minetest.serialize(meta)) + inv:set_stack("main", i, hotbar[i]) + end + return true + end + end + end + return false +end + +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + local pos = player:getpos() + local rounded_pos = vector.round(pos) + rounded_pos.y = rounded_pos.y + 1 + player_positions[player_name] = rounded_pos + was_wielding[player_name] = true +end) + + +minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + local pos = player_positions[player_name] + local nodename = minetest.get_node(pos).name + if nodename == "technic:light" then + minetest.remove_node(pos) + end + player_positions[player_name] = nil +end) + +minetest.register_globalstep(function(dtime) + for i, player in pairs(minetest.get_connected_players()) do + local player_name = player:get_player_name() + local flashlight_weared = check_for_flashlight(player) + local pos = player:getpos() + local rounded_pos = vector.round(pos) + rounded_pos.y = rounded_pos.y + 1 + local old_pos = player_positions[player_name] + local player_moved = old_pos and not vector.equals(old_pos, rounded_pos) + if not old_pos then + old_pos = rounded_pos + player_moved = true + end + + -- Remove light, flashlight weared out or was removed from hotbar + if was_wielding[player_name] and not flashlight_weared then + was_wielding[player_name] = false + local node = minetest.get_node_or_nil(old_pos) + if node and node.name == "technic:light" then + minetest.remove_node(old_pos) + end + elseif (player_moved or not was_wielding[player_name]) and flashlight_weared then + local node = minetest.get_node_or_nil(rounded_pos) + if node and node.name == "air" then + minetest.set_node(rounded_pos, {name="technic:light"}) + end + local node = minetest.get_node_or_nil(old_pos) + if node and node.name == "technic:light" then + minetest.remove_node(old_pos) + end + player_positions[player_name] = rounded_pos + was_wielding[player_name] = true + end + end +end) + +minetest.register_node("technic:light", { + drawtype = "glasslike", + tiles = {"technic_light.png"}, + paramtype = "light", + groups = {not_in_creative_inventory=1}, + drop = "", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + light_source = LIGHT_MAX, + pointable = false, +}) diff --git a/technic/technic/tools/init.lua b/technic/technic/tools/init.lua new file mode 100644 index 0000000..5e0aa02 --- /dev/null +++ b/technic/technic/tools/init.lua @@ -0,0 +1,23 @@ +local path = technic.modpath.."/tools" + +if technic.config:get_bool("enable_mining_drill") then + dofile(path.."/mining_drill.lua") +end +if technic.config:get_bool("enable_mining_laser") then + dofile(path.."/mining_lasers.lua") +end +if technic.config:get_bool("enable_flashlight") then + dofile(path.."/flashlight.lua") +end +dofile(path.."/cans.lua") +dofile(path.."/chainsaw.lua") +dofile(path.."/tree_tap.lua") +dofile(path.."/sonic_screwdriver.lua") +dofile(path.."/prospector.lua") +dofile(path.."/vacuum.lua") + +if minetest.get_modpath("screwdriver") then + -- compatibility alias + minetest.register_alias("technic:screwdriver", "screwdriver:screwdriver") +end + diff --git a/technic/technic/tools/mining_drill.lua b/technic/technic/tools/mining_drill.lua new file mode 100644 index 0000000..8a25abe --- /dev/null +++ b/technic/technic/tools/mining_drill.lua @@ -0,0 +1,419 @@ +local max_charge = {50000, 200000, 650000} +local power_usage_per_node = {200, 500, 800} + +local S = technic.getter + +minetest.register_craft({ + output = 'technic:mining_drill', + recipe = { + {'moreores:tin_ingot', 'technic:diamond_drill_head', 'moreores:tin_ingot'}, + {'technic:stainless_steel_ingot', 'technic:motor', 'technic:stainless_steel_ingot'}, + {'', 'technic:red_energy_crystal', 'default:copper_ingot'}, + } +}) +minetest.register_craft({ + output = 'technic:mining_drill_mk2', + recipe = { + {'technic:diamond_drill_head', 'technic:diamond_drill_head', 'technic:diamond_drill_head'}, + {'technic:stainless_steel_ingot', 'technic:mining_drill', 'technic:stainless_steel_ingot'}, + {'', 'technic:green_energy_crystal', ''}, + } +}) +minetest.register_craft({ + output = 'technic:mining_drill_mk3', + recipe = { + {'technic:diamond_drill_head', 'technic:diamond_drill_head', 'technic:diamond_drill_head'}, + {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2', 'technic:stainless_steel_ingot'}, + {'', 'technic:blue_energy_crystal', ''}, + } +}) +for i = 1, 4 do + minetest.register_craft({ + output = 'technic:mining_drill_mk3', + recipe = { + {'technic:diamond_drill_head', 'technic:diamond_drill_head', 'technic:diamond_drill_head'}, + {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2_'..i, 'technic:stainless_steel_ingot'}, + {'', 'technic:blue_energy_crystal', ''}, + } + }) +end + +local mining_drill_mode_text = { + {S("Single node.")}, + {S("3 nodes deep.")}, + {S("3 nodes wide.")}, + {S("3 nodes tall.")}, + {S("3x3 nodes.")}, +} + +local function drill_dig_it0 (pos,player) + if minetest.is_protected(pos, player:get_player_name()) then + minetest.record_protection_violation(pos, player:get_player_name()) + return + end + local node=minetest.get_node(pos) + if node.name == "air" or node.name == "ignore" then return end + if node.name == "default:lava_source" then return end + if node.name == "default:lava_flowing" then return end + if node.name == "default:water_source" then minetest.remove_node(pos) return end + if node.name == "default:water_flowing" then minetest.remove_node(pos) return end + minetest.node_dig(pos,node,player) +end + +local function drill_dig_it1 (player) + local dir=player:get_look_dir() + if math.abs(dir.x)>math.abs(dir.z) then + if dir.x>0 then return 0 end + return 1 + end + if dir.z>0 then return 2 end + return 3 +end + +local function drill_dig_it2 (pos,player) + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + pos.y=pos.y+1 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + pos.y=pos.y-2 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) +end + +local function drill_dig_it3 (pos,player) + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.y=pos.y+1 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.y=pos.y-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) +end + +local function drill_dig_it4 (pos,player) + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) +end + +local function cost_to_use(drill_type, mode) + local mult + if mode == 1 then + mult = 1 + elseif mode <= 4 then + mult = 3 + else + mult = 9 + end + return power_usage_per_node[drill_type] * mult +end + +local function drill_dig_it(pos, player, mode) + if mode == 1 then + drill_dig_it0(pos, player) + end + + if mode == 2 then -- 3 deep + dir = drill_dig_it1(player) + if dir == 0 then -- x+ + drill_dig_it0(pos, player) + pos.x = pos.x + 1 + drill_dig_it0(pos, player) + pos.x = pos.x + 1 + drill_dig_it0(pos, player) + end + if dir == 1 then -- x- + drill_dig_it0(pos, player) + pos.x=pos.x-1 + drill_dig_it0 (pos,player) + pos.x=pos.x-1 + drill_dig_it0 (pos,player) + end + if dir==2 then -- z+ + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + end + if dir==3 then -- z- + drill_dig_it0 (pos,player) + pos.z=pos.z-1 + drill_dig_it0 (pos,player) + pos.z=pos.z-1 + drill_dig_it0 (pos,player) + end + end + + if mode==3 then -- 3 wide + dir=drill_dig_it1(player) + if dir==0 or dir==1 then -- x + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + end + if dir==2 or dir==3 then -- z + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + end + end + + if mode==4 then -- 3 tall, selected in the middle + drill_dig_it0 (pos,player) + pos.y=pos.y-1 + drill_dig_it0 (pos,player) + pos.y=pos.y-1 + drill_dig_it0 (pos,player) + end + + if mode==5 then -- 3 x 3 + local dir=player:get_look_dir() + if math.abs(dir.y)<0.5 then + dir=drill_dig_it1(player) + if dir==0 or dir==1 then -- x + drill_dig_it2(pos,player) + end + if dir==2 or dir==3 then -- z + drill_dig_it3(pos,player) + end + else + drill_dig_it4(pos,player) + end + end + + minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,}) +end + +local function pos_is_pointable(pos) + local node = minetest.get_node(pos) + local nodedef = minetest.registered_nodes[node.name] + return nodedef and nodedef.pointable +end + +local function mining_drill_mk2_setmode(user,itemstack) + local player_name=user:get_player_name() + local item=itemstack:to_table() + local meta=minetest.deserialize(item["metadata"]) + if meta==nil then + meta={} + mode=0 + end + if meta["mode"]==nil then + minetest.chat_send_player(player_name, S("Use while sneaking to change Mining Drill Mk%d modes."):format(2)) + meta["mode"]=0 + mode=0 + end + mode=(meta["mode"]) + mode=mode+1 + if mode>=5 then mode=1 end + minetest.chat_send_player(player_name, S("Mining Drill Mk%d Mode %d"):format(2, mode)..": "..mining_drill_mode_text[mode][1]) + item["name"]="technic:mining_drill_mk2_"..mode + meta["mode"]=mode + item["metadata"]=minetest.serialize(meta) + itemstack:replace(item) + return itemstack +end + +local function mining_drill_mk3_setmode(user,itemstack) + local player_name=user:get_player_name() + local item=itemstack:to_table() + local meta=minetest.deserialize(item["metadata"]) + if meta==nil then + meta={} + mode=0 + end + if meta["mode"]==nil then + minetest.chat_send_player(player_name, S("Use while sneaking to change Mining Drill Mk%d modes."):format(3)) + meta["mode"]=0 + mode=0 + end + mode=(meta["mode"]) + mode=mode+1 + if mode>=6 then mode=1 end + minetest.chat_send_player(player_name, S("Mining Drill Mk%d Mode %d"):format(3, mode)..": "..mining_drill_mode_text[mode][1]) + item["name"]="technic:mining_drill_mk3_"..mode + meta["mode"]=mode + item["metadata"]=minetest.serialize(meta) + itemstack:replace(item) + return itemstack +end + + +local function mining_drill_mk2_handler(itemstack, user, pointed_thing) + local keys = user:get_player_control() + local player_name = user:get_player_name() + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.mode or keys.sneak then + return mining_drill_mk2_setmode(user, itemstack) + end + if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then + return + end + local charge_to_take = cost_to_use(2, meta.mode) + if meta.charge >= charge_to_take then + local pos = minetest.get_pointed_thing_position(pointed_thing, above) + drill_dig_it(pos, user, meta.mode) + if not technic.creative_mode then + meta.charge = meta.charge - charge_to_take + itemstack:set_metadata(minetest.serialize(meta)) + technic.set_RE_wear(itemstack, meta.charge, max_charge[2]) + end + end + return itemstack +end + +local function mining_drill_mk3_handler(itemstack, user, pointed_thing) + local keys = user:get_player_control() + local player_name = user:get_player_name() + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.mode or keys.sneak then + return mining_drill_mk3_setmode(user, itemstack) + end + if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then + return + end + local charge_to_take = cost_to_use(3, meta.mode) + if meta.charge >= charge_to_take then + local pos = minetest.get_pointed_thing_position(pointed_thing, above) + drill_dig_it(pos, user, meta.mode) + if not technic.creative_mode then + meta.charge = meta.charge - charge_to_take + itemstack:set_metadata(minetest.serialize(meta)) + technic.set_RE_wear(itemstack, meta.charge, max_charge[3]) + end + end + return itemstack +end + +technic.register_power_tool("technic:mining_drill", max_charge[1]) + +minetest.register_tool("technic:mining_drill", { + description = S("Mining Drill Mk%d"):format(1), + inventory_image = "technic_mining_drill.png", + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then + return itemstack + end + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.charge then + return + end + local charge_to_take = cost_to_use(1, 1) + if meta.charge >= charge_to_take then + local pos = minetest.get_pointed_thing_position(pointed_thing, above) + drill_dig_it(pos, user, 1) + if not technic.creative_mode then + meta.charge = meta.charge - charge_to_take + itemstack:set_metadata(minetest.serialize(meta)) + technic.set_RE_wear(itemstack, meta.charge, max_charge[1]) + end + end + return itemstack + end, +}) + +minetest.register_tool("technic:mining_drill_mk2", { + description = S("Mining Drill Mk%d"):format(2), + inventory_image = "technic_mining_drill_mk2.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk2_handler(itemstack, user, pointed_thing) + return itemstack + end, +}) + +technic.register_power_tool("technic:mining_drill_mk2", max_charge[2]) + +for i = 1, 4 do + technic.register_power_tool("technic:mining_drill_mk2_"..i, max_charge[2]) + minetest.register_tool("technic:mining_drill_mk2_"..i, { + description = S("Mining Drill Mk%d Mode %d"):format(2, i), + inventory_image = "technic_mining_drill_mk2.png^technic_tool_mode"..i..".png", + wield_image = "technic_mining_drill_mk2.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + groups = {not_in_creative_inventory=1}, + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk2_handler(itemstack, user, pointed_thing) + return itemstack + end, + }) +end + +minetest.register_tool("technic:mining_drill_mk3", { + description = S("Mining Drill Mk%d"):format(3), + inventory_image = "technic_mining_drill_mk3.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk3_handler(itemstack,user,pointed_thing) + return itemstack + end, +}) + +technic.register_power_tool("technic:mining_drill_mk3", max_charge[3]) + +for i=1,5,1 do + technic.register_power_tool("technic:mining_drill_mk3_"..i, max_charge[3]) + minetest.register_tool("technic:mining_drill_mk3_"..i, { + description = S("Mining Drill Mk%d Mode %d"):format(3, i), + inventory_image = "technic_mining_drill_mk3.png^technic_tool_mode"..i..".png", + wield_image = "technic_mining_drill_mk3.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + groups = {not_in_creative_inventory=1}, + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk3_handler(itemstack,user,pointed_thing) + return itemstack + end, + }) +end diff --git a/technic/technic/tools/mining_lasers.lua b/technic/technic/tools/mining_lasers.lua new file mode 100644 index 0000000..4c83ae9 --- /dev/null +++ b/technic/technic/tools/mining_lasers.lua @@ -0,0 +1,178 @@ +local mining_lasers_list = { +-- {<num>, <range of the laser shots>, <max_charge>, <charge_per_shot>}, + {"1", 7, 50000, 1000}, + {"2", 14, 200000, 2000}, + {"3", 21, 650000, 3000}, +} + +local S = technic.getter + +minetest.register_craft({ + output = 'technic:laser_mk1', + recipe = { + {'default:diamond', 'technic:brass_ingot', 'default:obsidian_glass'}, + {'', 'technic:brass_ingot', 'technic:red_energy_crystal'}, + {'', '', 'default:copper_ingot'}, + } +}) +minetest.register_craft({ + output = 'technic:laser_mk2', + recipe = { + {'default:diamond', 'technic:carbon_steel_ingot', 'technic:laser_mk1'}, + {'', 'technic:carbon_steel_ingot', 'technic:green_energy_crystal'}, + {'', '', 'default:copper_ingot'}, + } +}) +minetest.register_craft({ + output = 'technic:laser_mk3', + recipe = { + {'default:diamond', 'technic:carbon_steel_ingot', 'technic:laser_mk2'}, + {'', 'technic:carbon_steel_ingot', 'technic:blue_energy_crystal'}, + {'', '', 'default:copper_ingot'}, + } +}) + +-- Based on code by Uberi: https://gist.github.com/Uberi/3125280 +local function rayIter(pos, dir, range) + local p = vector.round(pos) + local x_step, y_step, z_step = 0, 0, 0 + local x_component, y_component, z_component = 0, 0, 0 + local x_intersect, y_intersect, z_intersect = 0, 0, 0 + + if dir.x == 0 then + x_intersect = math.huge + elseif dir.x > 0 then + x_step = 1 + x_component = 1 / dir.x + x_intersect = x_component + else + x_step = -1 + x_component = 1 / -dir.x + end + if dir.y == 0 then + y_intersect = math.huge + elseif dir.y > 0 then + y_step = 1 + y_component = 1 / dir.y + y_intersect = y_component + else + y_step = -1 + y_component = 1 / -dir.y + end + if dir.z == 0 then + z_intersect = math.huge + elseif dir.z > 0 then + z_step = 1 + z_component = 1 / dir.z + z_intersect = z_component + else + z_step = -1 + z_component = 1 / -dir.z + end + + return function() + if x_intersect < y_intersect then + if x_intersect < z_intersect then + p.x = p.x + x_step + x_intersect = x_intersect + x_component + else + p.z = p.z + z_step + z_intersect = z_intersect + z_component + end + elseif y_intersect < z_intersect then + p.y = p.y + y_step + y_intersect = y_intersect + y_component + else + p.z = p.z + z_step + z_intersect = z_intersect + z_component + end + if vector.distance(pos, p) > range then + return nil + end + return p + end +end + +local function laser_node(pos, node, player) + local def = minetest.registered_nodes[node.name] + if def and def.liquidtype ~= "none" then + minetest.remove_node(pos) + minetest.add_particle({ + pos = pos, + vel = {x=0, y=2, z=0}, + acc = {x=0, y=-1, z=0}, + expirationtime = 1.5, + size = 6 + math.random() * 2, + texture = "smoke_puff.png^[transform" .. math.random(0, 7), + }) + return + end + minetest.node_dig(pos, node, player) +end + +local no_destroy = { + ["air"] = true, + ["default:lava_source"] = true, + ["default:lava_flowing"] = true, +} +local function laser_shoot(player, range, particle_texture, sound) + local player_pos = player:getpos() + local player_name = player:get_player_name() + local dir = player:get_look_dir() + + local start_pos = vector.new(player_pos) + -- Adjust to head height + start_pos.y = start_pos.y + 1.9 + minetest.add_particle({ + pos = startpos, + vel = dir, + acc = vector.multiply(dir, 50), + expirationtime = range / 11, + size = 1, + texture = particle_texture .. "^[transform" .. math.random(0, 7), + }) + minetest.sound_play(sound, {pos = player_pos, max_hear_distance = range}) + for pos in rayIter(start_pos, dir, range) do + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + break + end + local node = minetest.get_node_or_nil(pos) + if not node then + break + end + if not no_destroy[node.name] then + laser_node(pos, node, player) + end + end +end + + +for _, m in pairs(mining_lasers_list) do + technic.register_power_tool("technic:laser_mk"..m[1], m[3]) + minetest.register_tool("technic:laser_mk"..m[1], { + description = S("Mining Laser Mk%d"):format(m[1]), + inventory_image = "technic_mining_laser_mk"..m[1]..".png", + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user) + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.charge then + return + end + + -- If there's enough charge left, fire the laser + 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 technic.creative_mode then + meta.charge = meta.charge - m[4] + technic.set_RE_wear(itemstack, meta.charge, m[3]) + itemstack:set_metadata(minetest.serialize(meta)) + end + end + return itemstack + end, + }) +end + diff --git a/technic/technic/tools/prospector.lua b/technic/technic/tools/prospector.lua new file mode 100644 index 0000000..b28f1d8 --- /dev/null +++ b/technic/technic/tools/prospector.lua @@ -0,0 +1,128 @@ +local S = technic.getter + +technic.register_power_tool("technic:prospector", 300000) + +local function get_metadata(toolstack) + local m = minetest.deserialize(toolstack:get_metadata()) + if not m then m = {} end + if not m.charge then m.charge = 0 end + if not m.target then m.target = "" end + if not m.look_depth then m.look_depth = 7 end + if not m.look_radius then m.look_radius = 1 end + return m +end + +minetest.register_tool("technic:prospector", { + description = S("Prospector"), + inventory_image = "technic_prospector.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(toolstack, user, pointed_thing) + if not user or not user:is_player() or user.is_fake_player then return end + if pointed_thing.type ~= "node" then return end + local toolmeta = get_metadata(toolstack) + local look_diameter = toolmeta.look_radius * 2 + 1 + local charge_to_take = toolmeta.look_depth * (toolmeta.look_depth + 1) * look_diameter * look_diameter + if toolmeta.charge < charge_to_take then return end + if toolmeta.target == "" then + minetest.chat_send_player(user:get_player_name(), "Right-click to set target block type") + return + end + if not technic.creative_mode then + toolmeta.charge = toolmeta.charge - charge_to_take + toolstack:set_metadata(minetest.serialize(toolmeta)) + technic.set_RE_wear(toolstack, toolmeta.charge, technic.power_tools[toolstack:get_name()]) + end + local start_pos = pointed_thing.under + local forward = minetest.facedir_to_dir(minetest.dir_to_facedir(user:get_look_dir(), true)) + local right = forward.x ~= 0 and { x=0, y=1, z=0 } or (forward.y ~= 0 and { x=0, y=0, z=1 } or { x=1, y=0, z=0 }) + local up = forward.x ~= 0 and { x=0, y=0, z=1 } or (forward.y ~= 0 and { x=1, y=0, z=0 } or { x=0, y=1, z=0 }) + local base_pos = vector.add(start_pos, vector.multiply(vector.add(right, up), - toolmeta.look_radius)) + local found = false + for f = 0, toolmeta.look_depth-1 do + for r = 0, look_diameter-1 do + for u = 0, look_diameter-1 do + if minetest.get_node(vector.add(vector.add(vector.add(base_pos, vector.multiply(forward, f)), vector.multiply(right, r)), vector.multiply(up, u))).name == toolmeta.target then found = true end + end + end + end + if math.random() < 0.02 then found = not found end + minetest.chat_send_player(user:get_player_name(), minetest.registered_nodes[toolmeta.target].description.." is "..(found and "present" or "absent").." in "..look_diameter.."x"..look_diameter.."x"..toolmeta.look_depth.." region") + minetest.sound_play("technic_prospector_"..(found and "hit" or "miss"), { pos = vector.add(user:getpos(), { x = 0, y = 1, z = 0 }), gain = 1.0, max_hear_distance = 10 }) + return toolstack + end, + on_place = function(toolstack, user, pointed_thing) + if not user or not user:is_player() or user.is_fake_player then return end + local toolmeta = get_metadata(toolstack) + local pointed + if pointed_thing.type == "node" then + local pname = minetest.get_node(pointed_thing.under).name + local pdef = minetest.registered_nodes[pname] + if pdef and (pdef.groups.not_in_creative_inventory or 0) == 0 and pname ~= toolmeta.target then + pointed = pname + end + end + local look_diameter = toolmeta.look_radius * 2 + 1 + minetest.show_formspec(user:get_player_name(), "technic:prospector_control", + "size[7,8.5]".. + "item_image[0,0;1,1;"..toolstack:get_name().."]".. + "label[1,0;"..minetest.formspec_escape(toolstack:get_definition().description).."]".. + (toolmeta.target ~= "" and + "label[0,1.5;Current target:]".. + "label[0,2;"..minetest.formspec_escape(minetest.registered_nodes[toolmeta.target].description).."]".. + "item_image[0,2.5;1,1;"..toolmeta.target.."]" or + "label[0,1.5;No target set]").. + (pointed and + "label[3.5,1.5;May set new target:]".. + "label[3.5,2;"..minetest.formspec_escape(minetest.registered_nodes[pointed].description).."]".. + "item_image[3.5,2.5;1,1;"..pointed.."]".. + "button_exit[3.5,3.65;2,0.5;target_"..pointed..";Set target]" or + "label[3.5,1.5;No new target available]").. + "label[0,4.5;Region cross section:]".. + "label[0,5;"..look_diameter.."x"..look_diameter.."]".. + "label[3.5,4.5;Set region cross section:]".. + "button_exit[3.5,5.15;1,0.5;look_radius_0;1x1]".. + "button_exit[4.5,5.15;1,0.5;look_radius_1;3x3]".. + "button_exit[5.5,5.15;1,0.5;look_radius_3;7x7]".. + "label[0,6;Region depth:]".. + "label[0,6.5;"..toolmeta.look_depth.."]".. + "label[3.5,6;Set region depth:]".. + "button_exit[3.5,6.65;1,0.5;look_depth_7;7]".. + "button_exit[4.5,6.65;1,0.5;look_depth_14;14]".. + "button_exit[5.5,6.65;1,0.5;look_depth_21;21]".. + "label[0,7.5;Accuracy:]".. + "label[0,8;98%]") + return + end, +}) + +minetest.register_on_player_receive_fields(function(user, formname, fields) + if formname ~= "technic:prospector_control" then return false end + if not user or not user:is_player() or user.is_fake_player then return end + local toolstack = user:get_wielded_item() + if toolstack:get_name() ~= "technic:prospector" then return true end + local toolmeta = get_metadata(toolstack) + for field, value in pairs(fields) do + if field:sub(1, 7) == "target_" then + toolmeta.target = field:sub(8) + end + if field:sub(1, 12) == "look_radius_" then + toolmeta.look_radius = field:sub(13) + end + if field:sub(1, 11) == "look_depth_" then + toolmeta.look_depth = field:sub(12) + end + end + toolstack:set_metadata(minetest.serialize(toolmeta)) + user:set_wielded_item(toolstack) + return true +end) + +minetest.register_craft({ + output = "technic:prospector", + recipe = { + {"moreores:pick_silver", "moreores:mithril_block", "pipeworks:teleport_tube_1"}, + {"technic:brass_ingot", "technic:control_logic_unit", "technic:brass_ingot"}, + {"", "technic:blue_energy_crystal", ""}, + } +}) diff --git a/technic/technic/tools/sonic_screwdriver.lua b/technic/technic/tools/sonic_screwdriver.lua new file mode 100644 index 0000000..300d363 --- /dev/null +++ b/technic/technic/tools/sonic_screwdriver.lua @@ -0,0 +1,98 @@ +local sonic_screwdriver_max_charge = 15000 + +local S = technic.getter + +technic.register_power_tool("technic:sonic_screwdriver", sonic_screwdriver_max_charge) + +-- screwdriver handler code reused from minetest/minetest_game screwdriver @a9ac480 +local ROTATE_FACE = 1 +local ROTATE_AXIS = 2 + +local function nextrange(x, max) + x = x + 1 + if x > max then + x = 0 + end + return x +end + +-- Handles rotation +local function screwdriver_handler(itemstack, user, pointed_thing, mode) + if pointed_thing.type ~= "node" then + return + end + + local pos = pointed_thing.under + + if minetest.is_protected(pos, user:get_player_name()) then + minetest.record_protection_violation(pos, user:get_player_name()) + return + end + + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + if not ndef or not ndef.paramtype2 == "facedir" or + (ndef.drawtype == "nodebox" and + not ndef.node_box.type == "fixed") or + node.param2 == nil then + return + end + + -- contrary to the default screwdriver, do not check for can_dig, to allow rotating machines with CLU's in them + -- this is consistent with the previous sonic screwdriver + + local meta1 = minetest.deserialize(itemstack:get_metadata()) + if not meta1 or not meta1.charge or meta1.charge < 100 then + return + end + + minetest.sound_play("technic_sonic_screwdriver", {pos = pos, gain = 0.3, max_hear_distance = 10}) + + -- Set param2 + local rotationPart = node.param2 % 32 -- get first 4 bits + local preservePart = node.param2 - rotationPart + + local axisdir = math.floor(rotationPart / 4) + local rotation = rotationPart - axisdir * 4 + if mode == ROTATE_FACE then + rotationPart = axisdir * 4 + nextrange(rotation, 3) + elseif mode == ROTATE_AXIS then + rotationPart = nextrange(axisdir, 5) * 4 + end + + node.param2 = preservePart + rotationPart + minetest.swap_node(pos, node) + + if not technic.creative_mode then + meta1.charge = meta1.charge - 100 + itemstack:set_metadata(minetest.serialize(meta1)) + technic.set_RE_wear(itemstack, meta1.charge, sonic_screwdriver_max_charge) + end + + return itemstack +end + +minetest.register_tool("technic:sonic_screwdriver", { + description = S("Sonic Screwdriver (left-click rotates face, right-click rotates axis)"), + inventory_image = "technic_sonic_screwdriver.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + screwdriver_handler(itemstack, user, pointed_thing, ROTATE_FACE) + return itemstack + end, + on_place = function(itemstack, user, pointed_thing) + screwdriver_handler(itemstack, user, pointed_thing, ROTATE_AXIS) + return itemstack + end, +}) + +minetest.register_craft({ + output = "technic:sonic_screwdriver", + recipe = { + {"", "default:diamond", ""}, + {"mesecons_materials:fiber", "technic:battery", "mesecons_materials:fiber"}, + {"mesecons_materials:fiber", "moreores:mithril_ingot", "mesecons_materials:fiber"} + } +}) + diff --git a/technic/technic/tools/tree_tap.lua b/technic/technic/tools/tree_tap.lua new file mode 100644 index 0000000..e84fe33 --- /dev/null +++ b/technic/technic/tools/tree_tap.lua @@ -0,0 +1,75 @@ + +local S = technic.getter +local mesecons_materials = minetest.get_modpath("mesecons_materials") + +minetest.register_tool("technic:treetap", { + description = S("Tree Tap"), + inventory_image = "technic_tree_tap.png", + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + local pos = pointed_thing.under + if minetest.is_protected(pos, user:get_player_name()) then + minetest.record_protection_violation(pos, user:get_player_name()) + return + end + local node = minetest.get_node(pos) + local node_name = node.name + if node_name ~= "moretrees:rubber_tree_trunk" then + return + end + node.name = "moretrees:rubber_tree_trunk_empty" + minetest.swap_node(pos, node) + minetest.handle_node_drops(pointed_thing.above, {"technic:raw_latex"}, user) + if not technic.creative_mode then + local item_wear = tonumber(itemstack:get_wear()) + item_wear = item_wear + 819 + if item_wear > 65535 then + itemstack:clear() + return itemstack + end + itemstack:set_wear(item_wear) + end + return itemstack + end, +}) + +minetest.register_craft({ + output = "technic:treetap", + recipe = { + {"pipeworks:tube_1", "group:wood", "default:stick"}, + {"", "default:stick", "default:stick"} + }, +}) + +minetest.register_craftitem("technic:raw_latex", { + description = S("Raw Latex"), + inventory_image = "technic_raw_latex.png", +}) + +if mesecons_materials then + minetest.register_craft({ + type = "cooking", + recipe = "technic:raw_latex", + output = "mesecons_materials:glue", + }) +end + +minetest.register_craftitem("technic:rubber", { + description = S("Rubber Fiber"), + inventory_image = "technic_rubber.png", +}) + +minetest.register_abm({ + nodenames = {"moretrees:rubber_tree_trunk_empty"}, + interval = 60, + chance = 15, + action = function(pos, node) + if minetest.find_node_near(pos, (moretrees and moretrees.leafdecay_radius) or 5, {"moretrees:rubber_tree_leaves"}) then + node.name = "moretrees:rubber_tree_trunk" + minetest.swap_node(pos, node) + end + end +}) + diff --git a/technic/technic/tools/vacuum.lua b/technic/technic/tools/vacuum.lua new file mode 100644 index 0000000..f5fac9a --- /dev/null +++ b/technic/technic/tools/vacuum.lua @@ -0,0 +1,61 @@ +-- Configuration +local vacuum_max_charge = 10000 -- 10000 - Maximum charge of the vacuum cleaner +local vacuum_charge_per_object = 100 -- 100 - Capable of picking up 50 objects +local vacuum_range = 8 -- 8 - Area in which to pick up objects + +local S = technic.getter + +technic.register_power_tool("technic:vacuum", vacuum_max_charge) + +minetest.register_tool("technic:vacuum", { + description = S("Vacuum Cleaner"), + inventory_image = "technic_vacuum.png", + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.charge then + return + end + if meta.charge > vacuum_charge_per_object then + minetest.sound_play("vacuumcleaner", { + to_player = user:get_player_name(), + gain = 0.4, + }) + end + local pos = user:getpos() + local inv = user:get_inventory() + for _, object in ipairs(minetest.env:get_objects_inside_radius(pos, vacuum_range)) do + local luaentity = object:get_luaentity() + if not object:is_player() and luaentity and luaentity.name == "__builtin:item" and luaentity.itemstring ~= "" then + if inv and inv:room_for_item("main", ItemStack(luaentity.itemstring)) then + meta.charge = meta.charge - vacuum_charge_per_object + if meta.charge < vacuum_charge_per_object then + return + end + inv:add_item("main", ItemStack(luaentity.itemstring)) + minetest.sound_play("item_drop_pickup", { + to_player = user:get_player_name(), + gain = 0.4, + }) + luaentity.itemstring = "" + object:remove() + end + end + end + + technic.set_RE_wear(itemstack, meta.charge, vacuum_max_charge) + itemstack:set_metadata(minetest.serialize(meta)) + return itemstack + end, +}) + +minetest.register_craft({ + output = 'technic:vacuum', + recipe = { + {'pipeworks:tube_1', 'pipeworks:filter', 'technic:battery'}, + {'pipeworks:tube_1', 'technic:motor', 'technic:battery'}, + {'technic:stainless_steel_ingot', '', ''}, + } +}) diff --git a/technic/technic_chests/README.md b/technic/technic_chests/README.md new file mode 100644 index 0000000..a570346 --- /dev/null +++ b/technic/technic_chests/README.md @@ -0,0 +1,24 @@ +Technic chests +============== + +License +------- + +Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel) + +Technic chests code is licensed under the GNU LGPLv2+. + +Texture licenses: + +VanessaE: (WTFPL) + * technic\_pencil\_icon.png + * technic\_checkmark\_icon.png + * technic\_chest\_overlay\_*.png + * technic\_*\_chest\_lock\_overlay.png + +sdzen (Elise Staudter) modified by VanessaE (CC BY-SA 3.0): + * copper, iron, silver, gold, mithril chest textures 16x16 + +RealBadAngel: (WTFPL) + * Everything else. + diff --git a/technic/technic_chests/common.lua b/technic/technic_chests/common.lua new file mode 100644 index 0000000..47054f5 --- /dev/null +++ b/technic/technic_chests/common.lua @@ -0,0 +1,71 @@ + +technic.chests.groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + tubedevice=1, tubedevice_receiver=1} +technic.chests.groups_noinv = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + tubedevice=1, tubedevice_receiver=1, not_in_creative_inventory=1} + +technic.chests.tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("main",stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("main",stack) + end, + input_inventory = "main", + connect_sides = {left=1, right=1, front=1, back=1, top=1, bottom=1}, +} + +technic.chests.can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("main") +end + +local function inv_change(pos, count, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked chest belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos)) + return 0 + end + return count +end + +function technic.chests.inv_move(pos, from_list, from_index, to_list, to_index, count, player) + return inv_change(pos, count, player) +end +function technic.chests.inv_put(pos, listname, index, stack, player) + return inv_change(pos, stack:get_count(), player) +end +function technic.chests.inv_take(pos, listname, index, stack, player) + return inv_change(pos, stack:get_count(), player) +end + +function technic.chests.on_inv_move(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in chest at " + ..minetest.pos_to_string(pos)) +end + +function technic.chests.on_inv_put(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " puts stuff in to chest at " + ..minetest.pos_to_string(pos)) +end + +function technic.chests.on_inv_take(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at " + ..minetest.pos_to_string(pos)) +end + +function has_locked_chest_privilege(meta, player) + return player:get_player_name() == meta:get_string("owner") +end + diff --git a/technic/technic_chests/copper_chest.lua b/technic/technic_chests/copper_chest.lua new file mode 100644 index 0000000..d40284b --- /dev/null +++ b/technic/technic_chests/copper_chest.lua @@ -0,0 +1,46 @@ +minetest.register_craft({ + output = 'technic:copper_chest 1', + recipe = { + {'default:copper_ingot','default:copper_ingot','default:copper_ingot'}, + {'default:copper_ingot','technic:iron_chest','default:copper_ingot'}, + {'default:copper_ingot','default:copper_ingot','default:copper_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:copper_locked_chest 1', + recipe = { + {'default:copper_ingot','default:copper_ingot','default:copper_ingot'}, + {'default:copper_ingot','technic:iron_locked_chest','default:copper_ingot'}, + {'default:copper_ingot','default:copper_ingot','default:copper_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:copper_locked_chest 1', + recipe = { + {'default:steel_ingot'}, + {'technic:copper_chest'}, + } +}) + +technic.chests:register("Copper", { + width = 12, + height = 5, + sort = true, + autosort = true, + infotext = false, + color = false, + locked = false, +}) + +technic.chests:register("Copper", { + width = 12, + height = 5, + sort = true, + autosort = true, + infotext = false, + color = false, + locked = true, +}) + diff --git a/technic/technic_chests/depends.txt b/technic/technic_chests/depends.txt new file mode 100644 index 0000000..b9ca665 --- /dev/null +++ b/technic/technic_chests/depends.txt @@ -0,0 +1,4 @@ +default +moreores? +pipeworks? +intllib? diff --git a/technic/technic_chests/gold_chest.lua b/technic/technic_chests/gold_chest.lua new file mode 100644 index 0000000..c66b2f6 --- /dev/null +++ b/technic/technic_chests/gold_chest.lua @@ -0,0 +1,57 @@ + +local material_list +if minetest.get_modpath("moreores") then + material_list = { 'silver' } +else + -- Make the gold chest obtainable for mere mortals (the silver chest is not obtainable) + material_list = { 'copper', 'silver' } +end + +for _, material in ipairs(material_list) do + minetest.register_craft({ + output = 'technic:gold_chest', + recipe = { + {'default:gold_ingot','default:gold_ingot','default:gold_ingot'}, + {'default:gold_ingot',"technic:"..material.."_chest",'default:gold_ingot'}, + {'default:gold_ingot','default:gold_ingot','default:gold_ingot'}, + } + }) + + minetest.register_craft({ + output = 'technic:gold_locked_chest', + recipe = { + {'default:gold_ingot','default:gold_ingot','default:gold_ingot'}, + {'default:gold_ingot',"technic:"..material.."_locked_chest",'default:gold_ingot'}, + {'default:gold_ingot','default:gold_ingot','default:gold_ingot'}, + } + }) +end + +minetest.register_craft({ + output = 'technic:gold_locked_chest', + recipe = { + {'default:steel_ingot'}, + {'technic:gold_chest'}, + } +}) + +technic.chests:register("Gold", { + width = 15, + height = 6, + sort = true, + autosort = true, + infotext = true, + color = true, + locked = false, +}) + +technic.chests:register("Gold", { + width = 15, + height = 6, + sort = true, + autosort = true, + infotext = true, + color = true, + locked = true, +}) + diff --git a/technic/technic_chests/init.lua b/technic/technic_chests/init.lua new file mode 100644 index 0000000..af9e041 --- /dev/null +++ b/technic/technic_chests/init.lua @@ -0,0 +1,18 @@ +-- Minetest 0.4.6 mod: technic_chests +-- namespace: technic +-- (c) 2012-2013 by RealBadAngel <mk@realbadangel.pl> + +local modpath = minetest.get_modpath("technic_chests") + +technic = rawget(_G, "technic") or {} +technic.chests = {} + +dofile(modpath.."/common.lua") +dofile(modpath.."/register.lua") +dofile(modpath.."/wooden_chest.lua") +dofile(modpath.."/iron_chest.lua") +dofile(modpath.."/copper_chest.lua") +dofile(modpath.."/silver_chest.lua") +dofile(modpath.."/gold_chest.lua") +dofile(modpath.."/mithril_chest.lua") + diff --git a/technic/technic_chests/iron_chest.lua b/technic/technic_chests/iron_chest.lua new file mode 100644 index 0000000..90434bb --- /dev/null +++ b/technic/technic_chests/iron_chest.lua @@ -0,0 +1,53 @@ +local cast_iron_ingot +if minetest.get_modpath("technic_worldgen") then + cast_iron_ingot = "technic:cast_iron_ingot" +else + cast_iron_ingot = "default:steel_ingot" +end + +minetest.register_craft({ + output = 'technic:iron_chest 1', + recipe = { + {cast_iron_ingot,cast_iron_ingot,cast_iron_ingot}, + {cast_iron_ingot,'default:chest',cast_iron_ingot}, + {cast_iron_ingot,cast_iron_ingot,cast_iron_ingot}, + } +}) + +minetest.register_craft({ + output = 'technic:iron_locked_chest 1', + recipe = { + {cast_iron_ingot,cast_iron_ingot,cast_iron_ingot}, + {cast_iron_ingot,'default:chest_locked',cast_iron_ingot}, + {cast_iron_ingot,cast_iron_ingot,cast_iron_ingot}, + } +}) + +minetest.register_craft({ + output = 'technic:iron_locked_chest 1', + recipe = { + {'default:steel_ingot'}, + {'technic:iron_chest'}, + } +}) + +technic.chests:register("Iron", { + width = 9, + height = 5, + sort = true, + autosort = false, + infotext = false, + color = false, + locked = false, +}) + +technic.chests:register("Iron", { + width = 9, + height = 5, + sort = true, + autosort = false, + infotext = false, + color = false, + locked = true, +}) + diff --git a/technic/technic_chests/locale/de.txt b/technic/technic_chests/locale/de.txt new file mode 100644 index 0000000..e22d2c2 --- /dev/null +++ b/technic/technic_chests/locale/de.txt @@ -0,0 +1,41 @@ +# German Translation for technic_chests +# Deutsche Übersetzung von technic_chests +# by Xanthin + +%s Chest = %struhe +%s Locked Chest = Verschlossene %struhe +%s Locked Chest (owned by %s) = Verschlossene %struhe (gehoert %s) +Color Filter: %s = Farbfilter: %s +Edit chest description: = Bearbeite die Beschreibung + +# Colors +Black = Schwarz +Blue = Blau +Brown = Braun +Cyan = Tuerkis +Dark Green = Dunkelgruen +Dark Grey = Dunkelgrau +Green = Gruen +Grey = Grau +Magenta = Magenta +Orange = Orange +Pink = Rosa +Red = Rot +Violet = Violett +White = Weiss +Yellow = Gelb +None = Farblos + +# Materials +Copper = Kupfer +Gold = Gold +Iron = Eisen +Mithril = Mithril +Silver = Silber +Wooden = Holz + +# Sorting +Sort = +Auto-sort is %s = +Off = +On = diff --git a/technic/technic_chests/locale/template.txt b/technic/technic_chests/locale/template.txt new file mode 100644 index 0000000..4d422b2 --- /dev/null +++ b/technic/technic_chests/locale/template.txt @@ -0,0 +1,39 @@ +# technic_chests translation template + +%s Chest = +%s Locked Chest = +%s Locked Chest (owned by %s) = +Color Filter: %s = +Edit chest description: = + +# Colors +Black = +Blue = +Brown = +Cyan = +Dark Green = +Dark Grey = +Green = +Grey = +Magenta = +Orange = +Pink = +Red = +Violet = +White = +Yellow = +None = + +# Materials +Copper = +Gold = +Iron = +Mithril = +Silver = +Wooden = + +# Sorting +Sort = +Auto-sort is %s = +Off = +On = diff --git a/technic/technic_chests/locale/tr.txt b/technic/technic_chests/locale/tr.txt new file mode 100644 index 0000000..6bef5be --- /dev/null +++ b/technic/technic_chests/locale/tr.txt @@ -0,0 +1,41 @@ +# Turkish translation +# mahmutelmas06@hotmail.com +# Türkçe çeviri + +%s Chest = %s Sandık +%s Locked Chest = %s Kilitli sandık +%s Locked Chest (owned by %s) = %s Kilitli sandık (Sahibi %s) +Color Filter: %s = Renk süzgeci: %s +Edit chest description: = Sandık bilgilerini düzenle + +# Colors - Renkler +Black = Siyah +Blue = Mavi +Brown = Kahverengi +Cyan = Cam göbeği +Dark Green = Koyu yeşil +Dark Grey = Koyu gri +Green = Yeşil +Grey = Gri +Magenta = Mor +Orange = Turuncu +Pink = Pembe +Red = Kırmızı +Violet = Koyu mor +White = Beyaz +Yellow = Sarı +None = Hiç + +# Materials - Metaryeller +Copper = Bakır +Gold = Altın +Iron = Demir +Mithril = Mithril +Silver = Gümüş +Wooden = Ahşap + +# Sorting - Sıralama +Sort = Sırala +Auto-sort is %s = Otomatik sıralama %s +Off = Kapalı +On = Açık diff --git a/technic/technic_chests/mithril_chest.lua b/technic/technic_chests/mithril_chest.lua new file mode 100644 index 0000000..909ff9e --- /dev/null +++ b/technic/technic_chests/mithril_chest.lua @@ -0,0 +1,48 @@ +if minetest.get_modpath("moreores") then + minetest.register_craft({ + output = 'technic:mithril_chest 1', + recipe = { + {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'}, + {'moreores:mithril_ingot','technic:gold_chest','moreores:mithril_ingot'}, + {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'}, + } + }) + + minetest.register_craft({ + output = 'technic:mithril_locked_chest 1', + recipe = { + {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'}, + {'moreores:mithril_ingot','technic:gold_locked_chest','moreores:mithril_ingot'}, + {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'}, + } + }) +end + +minetest.register_craft({ + output = 'technic:mithril_locked_chest 1', + recipe = { + {'default:steel_ingot'}, + {'technic:mithril_chest'}, + } +}) + +technic.chests:register("Mithril", { + width = 15, + height = 6, + sort = true, + autosort = true, + infotext = false, + color = false, + locked = false, +}) + +technic.chests:register("Mithril", { + width = 15, + height = 6, + sort = true, + autosort = true, + infotext = false, + color = false, + locked = true, +}) + diff --git a/technic/technic_chests/register.lua b/technic/technic_chests/register.lua new file mode 100644 index 0000000..25e4cde --- /dev/null +++ b/technic/technic_chests/register.lua @@ -0,0 +1,303 @@ +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end + +local pipeworks = rawget(_G, "pipeworks") +if not minetest.get_modpath("pipeworks") then + -- Pipeworks is not installed. Simulate using a dummy table... + pipeworks = {} + local pipeworks_meta = {} + setmetatable(pipeworks, pipeworks_meta) + local dummy = function() + end + pipeworks_meta.__index = function(table, key) + print("[technic_chests] WARNING: variable or method '"..key.."' not present in dummy pipeworks table - assuming it is a method...") + pipeworks[key] = dummy + return dummy + end + pipeworks.after_place = dummy + pipeworks.after_dig = dummy +end + +local chest_mark_colors = { + {"black", S("Black")}, + {"blue", S("Blue")}, + {"brown", S("Brown")}, + {"cyan", S("Cyan")}, + {"dark_green", S("Dark Green")}, + {"dark_grey", S("Dark Grey")}, + {"green", S("Green")}, + {"grey", S("Grey")}, + {"magenta", S("Magenta")}, + {"orange", S("Orange")}, + {"pink", S("Pink")}, + {"red", S("Red")}, + {"violet", S("Violet")}, + {"white", S("White")}, + {"yellow", S("Yellow")}, +} + + +local function colorid_to_postfix(id) + return chest_mark_colors[id] and "_"..chest_mark_colors[id][1] or "" +end + + +local function get_color_buttons(coleft, lotop) + local buttons_string = "" + for y = 0, 3 do + for x = 0, 3 do + local file_name = "technic_colorbutton"..(y * 4 + x)..".png" + buttons_string = buttons_string.."image_button[" + ..(coleft + 0.1 + x * 0.7)..","..(lotop + 0.1 + y * 0.7) + ..";0.8,0.8;"..file_name..";color_button" + ..(y * 4 + x + 1)..";]" + end + end + return buttons_string +end + + +local function check_color_buttons(pos, meta, chest_name, fields) + for i = 1, 16 do + if fields["color_button"..i] then + local node = minetest.get_node(pos) + node.name = chest_name..colorid_to_postfix(i) + minetest.swap_node(pos, node) + meta:set_string("color", i) + return + end + end +end + +local function set_formspec(pos, data, page) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + local formspec = data.base_formspec + if data.autosort then + local status = meta:get_int("autosort") + formspec = formspec.."button["..(data.hileft+2)..","..(data.height+1.1)..";3,0.8;autosort_to_"..(1-status)..";"..S("Auto-sort is %s"):format(status == 1 and S("On") or S("Off")).."]" + end + if data.infotext then + local formspec_infotext = minetest.formspec_escape(meta:get_string("infotext")) + if page == "main" then + formspec = formspec.."image_button["..(data.hileft+2.1)..",0.1;0.8,0.8;" + .."technic_pencil_icon.png;edit_infotext;]" + .."label["..(data.hileft+3)..",0;"..formspec_infotext.."]" + elseif page == "edit_infotext" then + formspec = formspec.."image_button["..(data.hileft+2.1)..",0.1;0.8,0.8;" + .."technic_checkmark_icon.png;save_infotext;]" + .."field["..(data.hileft+3.3)..",0.2;4.8,1;" + .."infotext_box;"..S("Edit chest description:")..";" + ..formspec_infotext.."]" + end + end + if data.color then + local colorID = meta:get_int("color") + local colorName + if chest_mark_colors[colorID] then + colorName = chest_mark_colors[colorID][2] + else + colorName = S("None") + end + formspec = formspec.."label["..(data.coleft+0.2)..","..(data.lotop+3)..";"..S("Color Filter: %s"):format(colorName).."]" + end + meta:set_string("formspec", formspec) +end + +local function sort_inventory(inv) + local inlist = inv:get_list("main") + local typecnt = {} + local typekeys = {} + for _, st in ipairs(inlist) do + if not st:is_empty() then + local n = st:get_name() + local w = st:get_wear() + local m = st:get_metadata() + local k = string.format("%s %05d %s", n, w, m) + if not typecnt[k] then + typecnt[k] = { + name = n, + wear = w, + metadata = m, + stack_max = st:get_stack_max(), + count = 0, + } + table.insert(typekeys, k) + end + typecnt[k].count = typecnt[k].count + st:get_count() + end + end + table.sort(typekeys) + local outlist = {} + for _, k in ipairs(typekeys) do + local tc = typecnt[k] + while tc.count > 0 do + local c = math.min(tc.count, tc.stack_max) + table.insert(outlist, ItemStack({ + name = tc.name, + wear = tc.wear, + metadata = tc.metadata, + count = c, + })) + tc.count = tc.count - c + end + end + if #outlist > #inlist then return end + while #outlist < #inlist do + table.insert(outlist, ItemStack(nil)) + end + inv:set_list("main", outlist) +end + +local function get_receive_fields(name, data) + local lname = name:lower() + return function(pos, formname, fields, sender) + local meta = minetest.get_meta(pos) + local page = "main" + if fields.sort or (data.autosort and fields.quit and meta:get_int("autosort") == 1) then + sort_inventory(meta:get_inventory()) + end + if fields.edit_infotext then + page = "edit_infotext" + end + if fields.autosort_to_1 then meta:set_int("autosort", 1) end + if fields.autosort_to_0 then meta:set_int("autosort", 0) end + if fields.infotext_box then + meta:set_string("infotext", fields.infotext_box) + end + if data.color then + -- This sets the node + local nn = "technic:"..lname..(data.locked and "_locked" or "").."_chest" + check_color_buttons(pos, meta, nn, fields) + end + meta:get_inventory():set_size("main", data.width * data.height) + set_formspec(pos, data, page) + end +end + + +function technic.chests:definition(name, data) + local lname = name:lower() + name = S(name) + local d = {} + for k, v in pairs(data) do d[k] = v end + data = d + + data.lowidth = 8 + data.ovwidth = math.max(data.lowidth, data.width) + data.hileft = (data.ovwidth - data.width) / 2 + data.loleft = (data.ovwidth - data.lowidth) / 2 + if data.color then + if data.lowidth + 3 <= data.ovwidth then + data.coleft = data.ovwidth - 3 + if data.loleft + data.lowidth > data.coleft then + data.loleft = data.coleft - data.lowidth + end + else + data.loleft = 0 + data.coleft = data.lowidth + data.ovwidth = data.lowidth + 3 + end + end + data.lotop = data.height + 2 + data.ovheight = data.lotop + 4 + + local locked_after_place = nil + local front = {"technic_"..lname.."_chest_front.png"} + data.base_formspec = "size["..data.ovwidth..","..data.ovheight.."]".. + "label[0,0;"..S("%s Chest"):format(name).."]".. + "list[context;main;"..data.hileft..",1;"..data.width..","..data.height..";]".. + "list[current_player;main;"..data.loleft..","..data.lotop..";8,4;]".. + "background[-0.19,-0.25;"..(data.ovwidth+0.4)..","..(data.ovheight+0.75)..";technic_chest_form_bg.png]".. + "background["..data.hileft..",1;"..data.width..","..data.height..";technic_"..lname.."_chest_inventory.png]".. + "background["..data.loleft..","..data.lotop..";8,4;technic_main_inventory.png]".. + "listring[]" + if data.sort then + data.base_formspec = data.base_formspec.."button["..data.hileft..","..(data.height+1.1)..";1,0.8;sort;"..S("Sort").."]" + end + if data.color then + data.base_formspec = data.base_formspec..get_color_buttons(data.coleft, data.lotop) + end + + if data.locked then + locked_after_place = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", + S("%s Locked Chest (owned by %s)") + :format(name, meta:get_string("owner"))) + pipeworks.after_place(pos) + end + table.insert(front, "technic_"..lname.."_chest_lock_overlay.png") + else + locked_after_place = pipeworks.after_place + end + + local desc + if data.locked then + desc = S("%s Locked Chest"):format(name) + else + desc = S("%s Chest"):format(name) + end + + local def = { + description = desc, + tiles = {"technic_"..lname.."_chest_top.png", "technic_"..lname.."_chest_top.png", + "technic_"..lname.."_chest_side.png", "technic_"..lname.."_chest_side.png", + "technic_"..lname.."_chest_side.png", table.concat(front, "^")}, + paramtype2 = "facedir", + groups = self.groups, + tube = self.tube, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + after_place_node = locked_after_place, + after_dig_node = pipeworks.after_dig, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("%s Chest"):format(name)) + set_formspec(pos, data, "main") + local inv = meta:get_inventory() + inv:set_size("main", data.width * data.height) + end, + can_dig = self.can_dig, + on_receive_fields = get_receive_fields(name, data), + on_metadata_inventory_move = self.on_inv_move, + on_metadata_inventory_put = self.on_inv_put, + on_metadata_inventory_take = self.on_inv_take, + } + if data.locked then + def.allow_metadata_inventory_move = self.inv_move + def.allow_metadata_inventory_put = self.inv_put + def.allow_metadata_inventory_take = self.inv_take + end + return def +end + +function technic.chests:register(name, data) + local def = technic.chests:definition(name, data) + + local nn = "technic:"..name:lower()..(data.locked and "_locked" or "").."_chest" + minetest.register_node(":"..nn, def) + + if data.color then + local mk_front + if string.find(def.tiles[6], "%^") then + mk_front = function (overlay) return def.tiles[6]:gsub("%^", "^"..overlay.."^") end + else + mk_front = function (overlay) return def.tiles[6].."^"..overlay end + end + for i = 1, 15 do + local postfix = colorid_to_postfix(i) + local colordef = {} + for k, v in pairs(def) do + colordef[k] = v + end + colordef.drop = nn + colordef.groups = self.groups_noinv + colordef.tiles = { def.tiles[1], def.tiles[2], def.tiles[3], def.tiles[4], def.tiles[5], mk_front("technic_chest_overlay"..postfix..".png") } + minetest.register_node(":"..nn..postfix, colordef) + end + end + +end + diff --git a/technic/technic_chests/silver_chest.lua b/technic/technic_chests/silver_chest.lua new file mode 100644 index 0000000..c615304 --- /dev/null +++ b/technic/technic_chests/silver_chest.lua @@ -0,0 +1,48 @@ +if minetest.get_modpath("moreores") then + minetest.register_craft({ + output = 'technic:silver_chest', + recipe = { + {'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'}, + {'moreores:silver_ingot','technic:copper_chest','moreores:silver_ingot'}, + {'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'}, + } + }) + + minetest.register_craft({ + output = 'technic:silver_locked_chest', + recipe = { + {'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'}, + {'moreores:silver_ingot','technic:copper_locked_chest','moreores:silver_ingot'}, + {'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'}, + } + }) +end + +minetest.register_craft({ + output = 'technic:silver_locked_chest', + recipe = { + {'default:steel_ingot'}, + {'technic:silver_chest'}, + } +}) + +technic.chests:register("Silver", { + width = 12, + height = 6, + sort = true, + autosort = true, + infotext = true, + color = false, + locked = false, +}) + +technic.chests:register("Silver", { + width = 12, + height = 6, + sort = true, + autosort = true, + infotext = true, + color = false, + locked = true, +}) + diff --git a/technic/technic_chests/textures/technic_checkmark_icon.png b/technic/technic_chests/textures/technic_checkmark_icon.png Binary files differnew file mode 100644 index 0000000..369d294 --- /dev/null +++ b/technic/technic_chests/textures/technic_checkmark_icon.png diff --git a/technic/technic_chests/textures/technic_chest_form_bg.png b/technic/technic_chests/textures/technic_chest_form_bg.png Binary files differnew file mode 100644 index 0000000..37683f0 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_form_bg.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_black.png b/technic/technic_chests/textures/technic_chest_overlay_black.png Binary files differnew file mode 100644 index 0000000..fa25304 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_black.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_blue.png b/technic/technic_chests/textures/technic_chest_overlay_blue.png Binary files differnew file mode 100644 index 0000000..512cd4f --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_blue.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_brown.png b/technic/technic_chests/textures/technic_chest_overlay_brown.png Binary files differnew file mode 100644 index 0000000..64c1d55 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_brown.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_cyan.png b/technic/technic_chests/textures/technic_chest_overlay_cyan.png Binary files differnew file mode 100644 index 0000000..46732f4 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_cyan.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_dark_green.png b/technic/technic_chests/textures/technic_chest_overlay_dark_green.png Binary files differnew file mode 100644 index 0000000..941236b --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_dark_green.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_dark_grey.png b/technic/technic_chests/textures/technic_chest_overlay_dark_grey.png Binary files differnew file mode 100644 index 0000000..e6b8f77 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_dark_grey.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_green.png b/technic/technic_chests/textures/technic_chest_overlay_green.png Binary files differnew file mode 100644 index 0000000..4b9543f --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_green.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_grey.png b/technic/technic_chests/textures/technic_chest_overlay_grey.png Binary files differnew file mode 100644 index 0000000..8a1c9f0 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_grey.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_magenta.png b/technic/technic_chests/textures/technic_chest_overlay_magenta.png Binary files differnew file mode 100644 index 0000000..75b220d --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_magenta.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_orange.png b/technic/technic_chests/textures/technic_chest_overlay_orange.png Binary files differnew file mode 100644 index 0000000..02c095d --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_orange.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_pink.png b/technic/technic_chests/textures/technic_chest_overlay_pink.png Binary files differnew file mode 100644 index 0000000..0b6ccb4 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_pink.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_red.png b/technic/technic_chests/textures/technic_chest_overlay_red.png Binary files differnew file mode 100644 index 0000000..4b44642 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_red.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_violet.png b/technic/technic_chests/textures/technic_chest_overlay_violet.png Binary files differnew file mode 100644 index 0000000..89471f9 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_violet.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_white.png b/technic/technic_chests/textures/technic_chest_overlay_white.png Binary files differnew file mode 100644 index 0000000..b49e253 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_white.png diff --git a/technic/technic_chests/textures/technic_chest_overlay_yellow.png b/technic/technic_chests/textures/technic_chest_overlay_yellow.png Binary files differnew file mode 100644 index 0000000..d563257 --- /dev/null +++ b/technic/technic_chests/textures/technic_chest_overlay_yellow.png diff --git a/technic/technic_chests/textures/technic_colorbutton0.png b/technic/technic_chests/textures/technic_colorbutton0.png Binary files differnew file mode 100644 index 0000000..35b7db2 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton0.png diff --git a/technic/technic_chests/textures/technic_colorbutton1.png b/technic/technic_chests/textures/technic_colorbutton1.png Binary files differnew file mode 100644 index 0000000..cbf095d --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton1.png diff --git a/technic/technic_chests/textures/technic_colorbutton10.png b/technic/technic_chests/textures/technic_colorbutton10.png Binary files differnew file mode 100644 index 0000000..8dfc5f0 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton10.png diff --git a/technic/technic_chests/textures/technic_colorbutton11.png b/technic/technic_chests/textures/technic_colorbutton11.png Binary files differnew file mode 100644 index 0000000..3b279e0 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton11.png diff --git a/technic/technic_chests/textures/technic_colorbutton12.png b/technic/technic_chests/textures/technic_colorbutton12.png Binary files differnew file mode 100644 index 0000000..a387b5f --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton12.png diff --git a/technic/technic_chests/textures/technic_colorbutton13.png b/technic/technic_chests/textures/technic_colorbutton13.png Binary files differnew file mode 100644 index 0000000..b1e7790 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton13.png diff --git a/technic/technic_chests/textures/technic_colorbutton14.png b/technic/technic_chests/textures/technic_colorbutton14.png Binary files differnew file mode 100644 index 0000000..c4ad486 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton14.png diff --git a/technic/technic_chests/textures/technic_colorbutton15.png b/technic/technic_chests/textures/technic_colorbutton15.png Binary files differnew file mode 100644 index 0000000..b7060d6 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton15.png diff --git a/technic/technic_chests/textures/technic_colorbutton2.png b/technic/technic_chests/textures/technic_colorbutton2.png Binary files differnew file mode 100644 index 0000000..caf1fc6 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton2.png diff --git a/technic/technic_chests/textures/technic_colorbutton3.png b/technic/technic_chests/textures/technic_colorbutton3.png Binary files differnew file mode 100644 index 0000000..6ac79a3 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton3.png diff --git a/technic/technic_chests/textures/technic_colorbutton4.png b/technic/technic_chests/textures/technic_colorbutton4.png Binary files differnew file mode 100644 index 0000000..dc43592 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton4.png diff --git a/technic/technic_chests/textures/technic_colorbutton5.png b/technic/technic_chests/textures/technic_colorbutton5.png Binary files differnew file mode 100644 index 0000000..98b8c67 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton5.png diff --git a/technic/technic_chests/textures/technic_colorbutton6.png b/technic/technic_chests/textures/technic_colorbutton6.png Binary files differnew file mode 100644 index 0000000..66478bc --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton6.png diff --git a/technic/technic_chests/textures/technic_colorbutton7.png b/technic/technic_chests/textures/technic_colorbutton7.png Binary files differnew file mode 100644 index 0000000..85f6b93 --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton7.png diff --git a/technic/technic_chests/textures/technic_colorbutton8.png b/technic/technic_chests/textures/technic_colorbutton8.png Binary files differnew file mode 100644 index 0000000..868c35d --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton8.png diff --git a/technic/technic_chests/textures/technic_colorbutton9.png b/technic/technic_chests/textures/technic_colorbutton9.png Binary files differnew file mode 100644 index 0000000..50eac0b --- /dev/null +++ b/technic/technic_chests/textures/technic_colorbutton9.png diff --git a/technic/technic_chests/textures/technic_copper_chest_front.png b/technic/technic_chests/textures/technic_copper_chest_front.png Binary files differnew file mode 100644 index 0000000..add51e8 --- /dev/null +++ b/technic/technic_chests/textures/technic_copper_chest_front.png diff --git a/technic/technic_chests/textures/technic_copper_chest_inventory.png b/technic/technic_chests/textures/technic_copper_chest_inventory.png Binary files differnew file mode 100644 index 0000000..70da510 --- /dev/null +++ b/technic/technic_chests/textures/technic_copper_chest_inventory.png diff --git a/technic/technic_chests/textures/technic_copper_chest_lock_overlay.png b/technic/technic_chests/textures/technic_copper_chest_lock_overlay.png Binary files differnew file mode 100644 index 0000000..49f7f2a --- /dev/null +++ b/technic/technic_chests/textures/technic_copper_chest_lock_overlay.png diff --git a/technic/technic_chests/textures/technic_copper_chest_side.png b/technic/technic_chests/textures/technic_copper_chest_side.png Binary files differnew file mode 100644 index 0000000..2231cce --- /dev/null +++ b/technic/technic_chests/textures/technic_copper_chest_side.png diff --git a/technic/technic_chests/textures/technic_copper_chest_top.png b/technic/technic_chests/textures/technic_copper_chest_top.png Binary files differnew file mode 100644 index 0000000..69f1078 --- /dev/null +++ b/technic/technic_chests/textures/technic_copper_chest_top.png diff --git a/technic/technic_chests/textures/technic_form_bg.png b/technic/technic_chests/textures/technic_form_bg.png Binary files differnew file mode 100644 index 0000000..37683f0 --- /dev/null +++ b/technic/technic_chests/textures/technic_form_bg.png diff --git a/technic/technic_chests/textures/technic_gold_chest_front.png b/technic/technic_chests/textures/technic_gold_chest_front.png Binary files differnew file mode 100644 index 0000000..27036d7 --- /dev/null +++ b/technic/technic_chests/textures/technic_gold_chest_front.png diff --git a/technic/technic_chests/textures/technic_gold_chest_inventory.png b/technic/technic_chests/textures/technic_gold_chest_inventory.png Binary files differnew file mode 100644 index 0000000..d4aa8b3 --- /dev/null +++ b/technic/technic_chests/textures/technic_gold_chest_inventory.png diff --git a/technic/technic_chests/textures/technic_gold_chest_lock_overlay.png b/technic/technic_chests/textures/technic_gold_chest_lock_overlay.png Binary files differnew file mode 100644 index 0000000..51dea71 --- /dev/null +++ b/technic/technic_chests/textures/technic_gold_chest_lock_overlay.png diff --git a/technic/technic_chests/textures/technic_gold_chest_side.png b/technic/technic_chests/textures/technic_gold_chest_side.png Binary files differnew file mode 100644 index 0000000..9a0de39 --- /dev/null +++ b/technic/technic_chests/textures/technic_gold_chest_side.png diff --git a/technic/technic_chests/textures/technic_gold_chest_top.png b/technic/technic_chests/textures/technic_gold_chest_top.png Binary files differnew file mode 100644 index 0000000..abfc081 --- /dev/null +++ b/technic/technic_chests/textures/technic_gold_chest_top.png diff --git a/technic/technic_chests/textures/technic_iron_chest_front.png b/technic/technic_chests/textures/technic_iron_chest_front.png Binary files differnew file mode 100644 index 0000000..8c00473 --- /dev/null +++ b/technic/technic_chests/textures/technic_iron_chest_front.png diff --git a/technic/technic_chests/textures/technic_iron_chest_inventory.png b/technic/technic_chests/textures/technic_iron_chest_inventory.png Binary files differnew file mode 100644 index 0000000..a33967b --- /dev/null +++ b/technic/technic_chests/textures/technic_iron_chest_inventory.png diff --git a/technic/technic_chests/textures/technic_iron_chest_lock_overlay.png b/technic/technic_chests/textures/technic_iron_chest_lock_overlay.png Binary files differnew file mode 100644 index 0000000..1750b82 --- /dev/null +++ b/technic/technic_chests/textures/technic_iron_chest_lock_overlay.png diff --git a/technic/technic_chests/textures/technic_iron_chest_side.png b/technic/technic_chests/textures/technic_iron_chest_side.png Binary files differnew file mode 100644 index 0000000..7233688 --- /dev/null +++ b/technic/technic_chests/textures/technic_iron_chest_side.png diff --git a/technic/technic_chests/textures/technic_iron_chest_top.png b/technic/technic_chests/textures/technic_iron_chest_top.png Binary files differnew file mode 100644 index 0000000..48d2437 --- /dev/null +++ b/technic/technic_chests/textures/technic_iron_chest_top.png diff --git a/technic/technic_chests/textures/technic_main_inventory.png b/technic/technic_chests/textures/technic_main_inventory.png Binary files differnew file mode 100644 index 0000000..b65dabb --- /dev/null +++ b/technic/technic_chests/textures/technic_main_inventory.png diff --git a/technic/technic_chests/textures/technic_mithril_chest_front.png b/technic/technic_chests/textures/technic_mithril_chest_front.png Binary files differnew file mode 100644 index 0000000..f0e0c23 --- /dev/null +++ b/technic/technic_chests/textures/technic_mithril_chest_front.png diff --git a/technic/technic_chests/textures/technic_mithril_chest_inventory.png b/technic/technic_chests/textures/technic_mithril_chest_inventory.png Binary files differnew file mode 100644 index 0000000..d4aa8b3 --- /dev/null +++ b/technic/technic_chests/textures/technic_mithril_chest_inventory.png diff --git a/technic/technic_chests/textures/technic_mithril_chest_lock_overlay.png b/technic/technic_chests/textures/technic_mithril_chest_lock_overlay.png Binary files differnew file mode 100644 index 0000000..d227c51 --- /dev/null +++ b/technic/technic_chests/textures/technic_mithril_chest_lock_overlay.png diff --git a/technic/technic_chests/textures/technic_mithril_chest_side.png b/technic/technic_chests/textures/technic_mithril_chest_side.png Binary files differnew file mode 100644 index 0000000..1c2c3a7 --- /dev/null +++ b/technic/technic_chests/textures/technic_mithril_chest_side.png diff --git a/technic/technic_chests/textures/technic_mithril_chest_top.png b/technic/technic_chests/textures/technic_mithril_chest_top.png Binary files differnew file mode 100644 index 0000000..e196baf --- /dev/null +++ b/technic/technic_chests/textures/technic_mithril_chest_top.png diff --git a/technic/technic_chests/textures/technic_pencil_icon.png b/technic/technic_chests/textures/technic_pencil_icon.png Binary files differnew file mode 100644 index 0000000..8079ede --- /dev/null +++ b/technic/technic_chests/textures/technic_pencil_icon.png diff --git a/technic/technic_chests/textures/technic_silver_chest_front.png b/technic/technic_chests/textures/technic_silver_chest_front.png Binary files differnew file mode 100644 index 0000000..5ae5831 --- /dev/null +++ b/technic/technic_chests/textures/technic_silver_chest_front.png diff --git a/technic/technic_chests/textures/technic_silver_chest_inventory.png b/technic/technic_chests/textures/technic_silver_chest_inventory.png Binary files differnew file mode 100644 index 0000000..b2fe835 --- /dev/null +++ b/technic/technic_chests/textures/technic_silver_chest_inventory.png diff --git a/technic/technic_chests/textures/technic_silver_chest_lock_overlay.png b/technic/technic_chests/textures/technic_silver_chest_lock_overlay.png Binary files differnew file mode 100644 index 0000000..cb1bdb0 --- /dev/null +++ b/technic/technic_chests/textures/technic_silver_chest_lock_overlay.png diff --git a/technic/technic_chests/textures/technic_silver_chest_side.png b/technic/technic_chests/textures/technic_silver_chest_side.png Binary files differnew file mode 100644 index 0000000..4b4ce54 --- /dev/null +++ b/technic/technic_chests/textures/technic_silver_chest_side.png diff --git a/technic/technic_chests/textures/technic_silver_chest_top.png b/technic/technic_chests/textures/technic_silver_chest_top.png Binary files differnew file mode 100644 index 0000000..79196d6 --- /dev/null +++ b/technic/technic_chests/textures/technic_silver_chest_top.png diff --git a/technic/technic_chests/textures/technic_wooden_chest_inventory.png b/technic/technic_chests/textures/technic_wooden_chest_inventory.png Binary files differnew file mode 100644 index 0000000..5ffbc12 --- /dev/null +++ b/technic/technic_chests/textures/technic_wooden_chest_inventory.png diff --git a/technic/technic_chests/textures/x32/technic_copper_chest_front.png b/technic/technic_chests/textures/x32/technic_copper_chest_front.png Binary files differnew file mode 100644 index 0000000..1769435 --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_copper_chest_front.png diff --git a/technic/technic_chests/textures/x32/technic_copper_chest_side.png b/technic/technic_chests/textures/x32/technic_copper_chest_side.png Binary files differnew file mode 100644 index 0000000..2c7943f --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_copper_chest_side.png diff --git a/technic/technic_chests/textures/x32/technic_copper_chest_top.png b/technic/technic_chests/textures/x32/technic_copper_chest_top.png Binary files differnew file mode 100644 index 0000000..2ab8104 --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_copper_chest_top.png diff --git a/technic/technic_chests/textures/x32/technic_gold_chest_front.png b/technic/technic_chests/textures/x32/technic_gold_chest_front.png Binary files differnew file mode 100644 index 0000000..9bc9615 --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_gold_chest_front.png diff --git a/technic/technic_chests/textures/x32/technic_gold_chest_side.png b/technic/technic_chests/textures/x32/technic_gold_chest_side.png Binary files differnew file mode 100644 index 0000000..5d5ad0f --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_gold_chest_side.png diff --git a/technic/technic_chests/textures/x32/technic_gold_chest_top.png b/technic/technic_chests/textures/x32/technic_gold_chest_top.png Binary files differnew file mode 100644 index 0000000..f9c8fec --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_gold_chest_top.png diff --git a/technic/technic_chests/textures/x32/technic_iron_chest_front.png b/technic/technic_chests/textures/x32/technic_iron_chest_front.png Binary files differnew file mode 100644 index 0000000..79d5b49 --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_iron_chest_front.png diff --git a/technic/technic_chests/textures/x32/technic_iron_chest_side.png b/technic/technic_chests/textures/x32/technic_iron_chest_side.png Binary files differnew file mode 100644 index 0000000..e12daa5 --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_iron_chest_side.png diff --git a/technic/technic_chests/textures/x32/technic_iron_chest_top.png b/technic/technic_chests/textures/x32/technic_iron_chest_top.png Binary files differnew file mode 100644 index 0000000..da1ab7b --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_iron_chest_top.png diff --git a/technic/technic_chests/textures/x32/technic_mithril_chest_front.png b/technic/technic_chests/textures/x32/technic_mithril_chest_front.png Binary files differnew file mode 100644 index 0000000..9f7ca7e --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_mithril_chest_front.png diff --git a/technic/technic_chests/textures/x32/technic_mithril_chest_side.png b/technic/technic_chests/textures/x32/technic_mithril_chest_side.png Binary files differnew file mode 100644 index 0000000..0763511 --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_mithril_chest_side.png diff --git a/technic/technic_chests/textures/x32/technic_mithril_chest_top.png b/technic/technic_chests/textures/x32/technic_mithril_chest_top.png Binary files differnew file mode 100644 index 0000000..2429576 --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_mithril_chest_top.png diff --git a/technic/technic_chests/textures/x32/technic_silver_chest_front.png b/technic/technic_chests/textures/x32/technic_silver_chest_front.png Binary files differnew file mode 100644 index 0000000..fe5ce2c --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_silver_chest_front.png diff --git a/technic/technic_chests/textures/x32/technic_silver_chest_side.png b/technic/technic_chests/textures/x32/technic_silver_chest_side.png Binary files differnew file mode 100644 index 0000000..3a2ed4a --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_silver_chest_side.png diff --git a/technic/technic_chests/textures/x32/technic_silver_chest_top.png b/technic/technic_chests/textures/x32/technic_silver_chest_top.png Binary files differnew file mode 100644 index 0000000..353a11c --- /dev/null +++ b/technic/technic_chests/textures/x32/technic_silver_chest_top.png diff --git a/technic/technic_chests/wooden_chest.lua b/technic/technic_chests/wooden_chest.lua new file mode 100644 index 0000000..0fad12c --- /dev/null +++ b/technic/technic_chests/wooden_chest.lua @@ -0,0 +1,51 @@ +local udef = technic.chests:definition("Wooden", { + width = 8, + height = 4, + sort = false, + autosort = false, + infotext = false, + color = false, + locked = false, +}) +local uudef = { + groups = udef.groups, + tube = udef.tube, + on_construct = udef.on_construct, + can_dig = udef.can_dig, + on_receive_fields = udef.on_receive_fields, + on_metadata_inventory_move = udef.on_metadata_inventory_move, + on_metadata_inventory_put = udef.on_metadata_inventory_put, + on_metadata_inventory_take = udef.on_metadata_inventory_take, +} +if minetest.registered_nodes["default:chest"].description == "Chest" then + uudef.description = udef.description +end +minetest.override_item("default:chest", uudef) + +local ldef = technic.chests:definition("Wooden", { + width = 8, + height = 4, + sort = false, + autosort = false, + infotext = false, + color = false, + locked = true, +}) +local lldef = { + groups = ldef.groups, + tube = ldef.tube, + after_place_node = ldef.after_place_node, + on_construct = ldef.on_construct, + can_dig = ldef.can_dig, + on_receive_fields = ldef.on_receive_fields, + allow_metadata_inventory_move = ldef.allow_metadata_inventory_move, + allow_metadata_inventory_put = ldef.allow_metadata_inventory_put, + allow_metadata_inventory_take = ldef.allow_metadata_inventory_take, + on_metadata_inventory_move = ldef.on_metadata_inventory_move, + on_metadata_inventory_put = ldef.on_metadata_inventory_put, + on_metadata_inventory_take = ldef.on_metadata_inventory_take, +} +if minetest.registered_nodes["default:chest_locked"].description == "Locked Chest" then + lldef.description = ldef.description +end +minetest.override_item("default:chest_locked", lldef) diff --git a/technic/technic_worldgen/config.lua b/technic/technic_worldgen/config.lua new file mode 100644 index 0000000..4ac748c --- /dev/null +++ b/technic/technic_worldgen/config.lua @@ -0,0 +1,15 @@ +technic.config = technic.config or Settings(minetest.get_worldpath().."/technic.conf") + +local conf_table = technic.config:to_table() + +local defaults = { + enable_granite_generation = "true", + enable_marble_generation = "true", + enable_rubber_tree_generation = "true", +} + +for k, v in pairs(defaults) do + if conf_table[k] == nil then + technic.config:set(k, v) + end +end diff --git a/technic/technic_worldgen/crafts.lua b/technic/technic_worldgen/crafts.lua new file mode 100644 index 0000000..fba9df9 --- /dev/null +++ b/technic/technic_worldgen/crafts.lua @@ -0,0 +1,198 @@ + +local S = technic.worldgen.gettext + +minetest.register_craftitem(":technic:uranium_lump", { + description = S("Uranium Lump"), + inventory_image = "technic_uranium_lump.png", +}) +minetest.register_alias("technic:uranium", "technic:uranium_lump") + +minetest.register_craftitem(":technic:uranium_ingot", { + description = S("Uranium Ingot"), + inventory_image = "technic_uranium_ingot.png", + groups = {uranium_ingot=1}, +}) + +minetest.register_craftitem(":technic:chromium_lump", { + description = S("Chromium Lump"), + inventory_image = "technic_chromium_lump.png", +}) + +minetest.register_craftitem(":technic:chromium_ingot", { + description = S("Chromium Ingot"), + inventory_image = "technic_chromium_ingot.png", +}) + +minetest.register_craftitem(":technic:zinc_lump", { + description = S("Zinc Lump"), + inventory_image = "technic_zinc_lump.png", +}) + +minetest.register_craftitem(":technic:zinc_ingot", { + description = S("Zinc Ingot"), + inventory_image = "technic_zinc_ingot.png", +}) + +minetest.register_craftitem(":technic:lead_lump", { + description = S("Lead Lump"), + inventory_image = "technic_lead_lump.png", +}) + +minetest.register_craftitem(":technic:lead_ingot", { + description = S("Lead Ingot"), + inventory_image = "technic_lead_ingot.png", +}) + +minetest.register_craftitem(":technic:sulfur_lump", { + description = S("Sulfur Lump"), + inventory_image = "technic_sulfur_lump.png", +}) + +minetest.register_craftitem(":technic:brass_ingot", { + description = S("Brass Ingot"), + inventory_image = "technic_brass_ingot.png", +}) + +minetest.register_alias("technic:wrought_iron_ingot", "default:steel_ingot") + +minetest.override_item("default:steel_ingot", { + description = S("Wrought Iron Ingot"), + inventory_image = "technic_wrought_iron_ingot.png", +}) + +minetest.register_craftitem(":technic:cast_iron_ingot", { + description = S("Cast Iron Ingot"), + inventory_image = "technic_cast_iron_ingot.png", +}) + +minetest.register_craftitem(":technic:carbon_steel_ingot", { + description = S("Carbon Steel Ingot"), + inventory_image = "technic_carbon_steel_ingot.png", +}) + +minetest.register_craftitem(":technic:stainless_steel_ingot", { + description = S("Stainless Steel Ingot"), + inventory_image = "technic_stainless_steel_ingot.png", +}) + +local function register_block(block, ingot) + minetest.register_craft({ + output = block, + recipe = { + {ingot, ingot, ingot}, + {ingot, ingot, ingot}, + {ingot, ingot, ingot}, + } + }) + + minetest.register_craft({ + output = ingot.." 9", + recipe = { + {block} + } + }) +end + +register_block("technic:uranium_block", "technic:uranium_ingot") +register_block("technic:chromium_block", "technic:chromium_ingot") +register_block("technic:zinc_block", "technic:zinc_ingot") +register_block("technic:lead_block", "technic:lead_ingot") +register_block("technic:brass_block", "technic:brass_ingot") +register_block("technic:cast_iron_block", "technic:cast_iron_ingot") +register_block("technic:carbon_steel_block", "technic:carbon_steel_ingot") +register_block("technic:stainless_steel_block", "technic:stainless_steel_ingot") + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:zinc_lump", + output = "technic:zinc_ingot", +}) + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:chromium_lump", + output = "technic:chromium_ingot", +}) + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:uranium_lump", + output = "technic:uranium_ingot", +}) + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:lead_lump", + output = "technic:lead_ingot", +}) + + +minetest.register_craft({ + type = 'cooking', + recipe = minetest.registered_aliases["technic:wrought_iron_ingot"], + output = "technic:cast_iron_ingot", +}) + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:cast_iron_ingot", + cooktime = 2, + output = "technic:wrought_iron_ingot", +}) + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:carbon_steel_ingot", + cooktime = 2, + output = "technic:wrought_iron_ingot", +}) + +local function for_each_registered_item(action) + local already_reg = {} + for k, _ in pairs(minetest.registered_items) do + table.insert(already_reg, k) + end + local really_register_craftitem = minetest.register_craftitem + minetest.register_craftitem = function(name, def) + really_register_craftitem(name, def) + action(string.gsub(name, "^:", "")) + end + local really_register_tool = minetest.register_tool + minetest.register_tool = function(name, def) + really_register_tool(name, def) + action(string.gsub(name, "^:", "")) + end + local really_register_node = minetest.register_node + minetest.register_node = function(name, def) + really_register_node(name, def) + action(string.gsub(name, "^:", "")) + end + for _, name in ipairs(already_reg) do + action(name) + end +end + +local steel_to_iron = {} +for _, i in ipairs({ + "default:axe_steel", + "default:pick_steel", + "default:shovel_steel", + "default:sword_steel", + "doors:door_steel", + "farming:hoe_steel", + "glooptest:hammer_steel", + "glooptest:handsaw_steel", + "glooptest:reinforced_crystal_glass", + "mesecons_doors:op_door_steel", + "mesecons_doors:sig_door_steel", + "vessels:steel_bottle", +}) do + steel_to_iron[i] = true +end + +for_each_registered_item(function(item_name) + local item_def = minetest.registered_items[item_name] + if steel_to_iron[item_name] and string.find(item_def.description, "Steel") then + minetest.override_item(item_name, { description = string.gsub(item_def.description, "Steel", S("Iron")) }) + end +end) diff --git a/technic/technic_worldgen/depends.txt b/technic/technic_worldgen/depends.txt new file mode 100644 index 0000000..ac858d0 --- /dev/null +++ b/technic/technic_worldgen/depends.txt @@ -0,0 +1,3 @@ +default +intllib? +mg? diff --git a/technic/technic_worldgen/init.lua b/technic/technic_worldgen/init.lua new file mode 100644 index 0000000..2f36920 --- /dev/null +++ b/technic/technic_worldgen/init.lua @@ -0,0 +1,26 @@ +local modpath = minetest.get_modpath("technic_worldgen") + +technic = rawget(_G, "technic") or {} +technic.worldgen = { + gettext = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end, +} + +dofile(modpath.."/config.lua") +dofile(modpath.."/nodes.lua") +dofile(modpath.."/oregen.lua") +dofile(modpath.."/crafts.lua") + +-- Rubber trees, moretrees also supplies these +if not minetest.get_modpath("moretrees") then + dofile(modpath.."/rubber.lua") +else + -- older versions of technic provided rubber trees regardless + minetest.register_alias("technic:rubber_sapling", "moretrees:rubber_tree_sapling") + minetest.register_alias("technic:rubber_tree_empty", "moretrees:rubber_tree_trunk_empty") +end + +-- mg suppport +if minetest.get_modpath("mg") then + dofile(modpath.."/mg.lua") +end + diff --git a/technic/technic_worldgen/locale/de.txt b/technic/technic_worldgen/locale/de.txt new file mode 100644 index 0000000..401c94c --- /dev/null +++ b/technic/technic_worldgen/locale/de.txt @@ -0,0 +1,39 @@ +# German Translation for technic_worldgen +# Deutsche Übersetzung von technic_worldgen +# by Xanthin + +## crafts.lua +Uranium Lump = Uranklumpen +Uranium Ingot = Uranbarren +Chromium Lump = Chromklumpen +Chromium Ingot = Chrombarren +Zinc Lump = Zinkklumpen +Zinc Ingot = Zinkbarren +Brass Ingot = Messingbarren +Wrought Iron Ingot = Schmiedeeisenbarren +Cast Iron Ingot = Gusseisenbarren +Carbon Steel Ingot = Kohlenstoffstahlbarren +Stainless Steel Ingot = Edelstahlbarren +Iron = Eisen + +## nodes.lua +Uranium Ore = Uranerz +Chromium Ore = Chromerz +Zinc Ore = Zinkerz +Granite = Granit +Marble = Marmor +Marble Bricks = Marmorziegel +Uranium Block = Uranblock +Chromium Block = Chromblock +Zinc Block = Zinkblock +Wrought Iron Block = Schmiedeeisenblock +Cast Iron Block = Gusseisenblock +Carbon Steel Block = Kohlenstoffstahlblock +Stainless Steel Block = Edelstahlblock +Brass Block = Messingblock +Wrought Iron = Schmiedeeisen + +## rubber.lua +Rubber Tree Sapling = Gummibaumsetzling +Rubber Tree = Gummibaum + diff --git a/technic/technic_worldgen/locale/template.txt b/technic/technic_worldgen/locale/template.txt new file mode 100644 index 0000000..594e0ce --- /dev/null +++ b/technic/technic_worldgen/locale/template.txt @@ -0,0 +1,37 @@ +# template.txt +# technic_worldgen translation template + +###crafts.lua +Uranium Lump = +Uranium Ingot = +Chromium Lump = +Chromium Ingot = +Zinc Lump = +Zinc Ingot = +Brass Ingot = +Wrought Iron Ingot = +Cast Iron Ingot = +Carbon Steel Ingot = +Stainless Steel Ingot = +Iron = + +###nodes.lua +Uranium Ore = +Chromium Ore = +Zinc Ore = +Granite = +Marble = +Marble Bricks = +Uranium Block = +Chromium Block = +Zinc Block = +Wrought Iron Block = +Cast Iron Block = +Carbon Steel Block = +Stainless Steel Block = +Brass Block = +Wrought Iron = + +###rubber.lua +Rubber Tree Sapling = +Rubber Tree = diff --git a/technic/technic_worldgen/locale/tr.txt b/technic/technic_worldgen/locale/tr.txt new file mode 100644 index 0000000..a04597f --- /dev/null +++ b/technic/technic_worldgen/locale/tr.txt @@ -0,0 +1,38 @@ +# Turkish translation +# mahmutelmas06@hotmail.com +# Türkçe çeviri + +###crafts.lua +Uranium Lump = Uranyum yığını +Uranium Ingot = Uranyum külçesi +Chromium Lump = Krom yığını +Chromium Ingot = Krom külçesi +Zinc Lump = Çinko yığını +Zinc Ingot = Çünko külçesi +Brass Ingot = Pirinç yığını +Wrought Iron Ingot = İşlenmiş demir yığını +Cast Iron Ingot = Döküm demir yığını +Carbon Steel Ingot = Karbon çelik külçe +Stainless Steel Ingot =Paslanmaz çelik külçe +Iron = Demir + +###nodes.lua +Uranium Ore = Uranyum madeni +Chromium Ore = Krom madeni +Zinc Ore = Çinko madeni +Granite = Granit +Marble = Mermer +Marble Bricks = Mermer tuğla +Uranium Block = Uranyum blok +Chromium Block = Karbon blok +Zinc Block = Çinko blok +Wrought Iron Block = İşlenmiş demir blok +Cast Iron Block = Döküm demir blok +Carbon Steel Block = Karbon çelik blok +Stainless Steel Block = Paslanmaz çelik blok +Brass Block = Pirinç blok +Wrought Iron = İşlenmiş demir + +###rubber.lua +Rubber Tree Sapling = Kauçuk ağacı fidanı +Rubber Tree = Kauçuk ağacı diff --git a/technic/technic_worldgen/mg.lua b/technic/technic_worldgen/mg.lua new file mode 100644 index 0000000..4025384 --- /dev/null +++ b/technic/technic_worldgen/mg.lua @@ -0,0 +1,90 @@ +mg.register_ore({ + name = "technic:mineral_uranium", + wherein = "default:stone", + seeddiff = 11, + maxvdistance = 10.5, + maxheight = -80, + minheight = -300, + sizen = 20, + sizedev = 10, + seglenghtn = 3, + seglenghtdev = 1, + segincln = 0.4, + segincldev = 0.6, + turnangle = 57, + numperblock = 1, + fork_chance = 0 +}) + +mg.register_ore({ + name = "technic:mineral_chromium", + wherein = "default:stone", + seeddiff = 12, + maxvdistance = 10.5, + maxheight = -100, + sizen = 50, + sizedev = 20, + seglenghtn = 8, + seglenghtdev = 3, + segincln = 0, + segincldev = 0.6, + turnangle = 57, + forkturnangle = 57, + numperblock = 2 +}) + +mg.register_ore({ + name = "technic:mineral_zinc", + wherein = "default:stone", + seeddiff = 13, + maxvdistance = 10.5, + maxheight = 2, + seglenghtn = 15, + seglenghtdev = 6, + segincln = 0, + segincldev = 0.6, + turnangle = 57, + forkturnangle = 57, + numperblock = 2 +}) + +mg.register_ore({ + name = "technic:mineral_lead", + wherein = "default:stone", + seeddiff = 13, + maxvdistance = 10.5, + maxheight = 16, + seglenghtn = 15, + seglenghtdev = 6, + segincln = 0, + segincldev = 0.6, + turnangle = 57, + forkturnangle = 57, + numperblock = 3 +}) + +if technic.config:get_bool("enable_granite_generation") then + mg.register_ore_sheet({ + name = "technic:granite", + wherein = "default:stone", + height_min = -31000, + height_max = -150, + tmin = 3, + tmax = 6, + threshhold = 0.4, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} + }) +end + +if technic.config:get_bool("enable_marble_generation") then + mg.register_ore_sheet({ + name = "technic:marble", + wherein = "default:stone", + height_min = -31000, + height_max = -50, + tmin = 3, + tmax = 6, + threshhold = 0.4, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=23, octaves=3, persist=0.70} + }) +end diff --git a/technic/technic_worldgen/nodes.lua b/technic/technic_worldgen/nodes.lua new file mode 100644 index 0000000..a4fe2dd --- /dev/null +++ b/technic/technic_worldgen/nodes.lua @@ -0,0 +1,196 @@ + +local S = technic.worldgen.gettext + +minetest.register_node( ":technic:mineral_uranium", { + description = S("Uranium Ore"), + tiles = { "default_stone.png^technic_mineral_uranium.png" }, + is_ground_content = true, + groups = {cracky=3, radioactive=1000}, + sounds = default.node_sound_stone_defaults(), + drop = "technic:uranium_lump", +}) + +minetest.register_node( ":technic:mineral_chromium", { + description = S("Chromium Ore"), + tiles = { "default_stone.png^technic_mineral_chromium.png" }, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + drop = "technic:chromium_lump", +}) + +minetest.register_node( ":technic:mineral_zinc", { + description = S("Zinc Ore"), + tiles = { "default_stone.png^technic_mineral_zinc.png" }, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + drop = "technic:zinc_lump", +}) + +minetest.register_node( ":technic:mineral_lead", { + description = S("Lead Ore"), + tiles = { "default_stone.png^technic_mineral_lead.png" }, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + drop = "technic:lead_lump", +}) + +minetest.register_node( ":technic:mineral_sulfur", { + description = S("Sulfur Ore"), + tiles = { "default_stone.png^technic_mineral_sulfur.png" }, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + drop = "technic:sulfur_lump", +}) + +minetest.register_node( ":technic:granite", { + description = S("Granite"), + tiles = { "technic_granite.png" }, + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node( ":technic:marble", { + description = S("Marble"), + tiles = { "technic_marble.png" }, + is_ground_content = true, + groups = {cracky=3, marble=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node( ":technic:marble_bricks", { + description = S("Marble Bricks"), + tiles = { "technic_marble_bricks.png" }, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node(":technic:uranium_block", { + description = S("Uranium Block"), + tiles = { "technic_uranium_block.png" }, + is_ground_content = true, + groups = {uranium_block=1, cracky=1, level=2, radioactive=3000}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:chromium_block", { + description = S("Chromium Block"), + tiles = { "technic_chromium_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:zinc_block", { + description = S("Zinc Block"), + tiles = { "technic_zinc_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:lead_block", { + description = S("Lead Block"), + tiles = { "technic_lead_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_alias("technic:wrought_iron_block", "default:steelblock") + +minetest.override_item("default:steelblock", { + description = S("Wrought Iron Block"), + tiles = { "technic_wrought_iron_block.png" }, +}) + +minetest.register_node(":technic:cast_iron_block", { + description = S("Cast Iron Block"), + tiles = { "technic_cast_iron_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:carbon_steel_block", { + description = S("Carbon Steel Block"), + tiles = { "technic_carbon_steel_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:stainless_steel_block", { + description = S("Stainless Steel Block"), + tiles = { "technic_stainless_steel_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:brass_block", { + description = S("Brass Block"), + tiles = { "technic_brass_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_craft({ + output = 'technic:marble_bricks 4', + recipe = { + {'technic:marble','technic:marble'}, + {'technic:marble','technic:marble'} + } +}) + +minetest.register_alias("technic:diamond_block", "default:diamondblock") +minetest.register_alias("technic:diamond", "default:diamond") +minetest.register_alias("technic:mineral_diamond", "default:stone_with_diamond") + +local function for_each_registered_node(action) + local really_register_node = minetest.register_node + minetest.register_node = function(name, def) + really_register_node(name, def) + action(name:gsub("^:", ""), def) + end + for name, def in pairs(minetest.registered_nodes) do + action(name, def) + end +end + +for_each_registered_node(function(node_name, node_def) + if node_name ~= "default:steelblock" and + node_name:find("steelblock", 1, true) and + node_def.description:find("Steel", 1, true) then + minetest.override_item(node_name, { + description = node_def.description:gsub("Steel", S("Wrought Iron")), + }) + end + local tiles = node_def.tiles or node_def.tile_images + if tiles then + local new_tiles = {} + local do_override = false + if type(tiles) == "string" then + tiles = {tiles} + end + for i, t in ipairs(tiles) do + if type(t) == "string" and t == "default_steel_block.png" then + do_override = true + t = "technic_wrought_iron_block.png" + end + table.insert(new_tiles, t) + end + if do_override then + minetest.override_item(node_name, { + tiles = new_tiles + }) + end + end +end) + diff --git a/technic/technic_worldgen/oregen.lua b/technic/technic_worldgen/oregen.lua new file mode 100644 index 0000000..795f0ec --- /dev/null +++ b/technic/technic_worldgen/oregen.lua @@ -0,0 +1,191 @@ +local uranium_params = {offset = 0, scale = 1, spread = {x = 100, y = 100, z = 100}, seed = 420, octaves = 3, persist = 0.7} +local uranium_threshhold = 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_threshhold = 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_threshhold = 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_threshhold = 0.3 + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_uranium", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 4, + clust_size = 3, + y_min = -300, + y_max = -80, + noise_params = uranium_params, + noise_threshhold = uranium_threshhold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_chromium", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 2, + clust_size = 3, + y_min = -200, + y_max = -100, + noise_params = chromium_params, + noise_threshhold = chromium_threshhold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_chromium", + wherein = "default:stone", + clust_scarcity = 6*6*6, + clust_num_ores = 2, + clust_size = 3, + y_min = -31000, + y_max = -200, + flags = "absheight", + noise_params = chromium_params, + noise_threshhold = chromium_threshhold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_zinc", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 4, + clust_size = 3, + y_min = -32, + y_max = 2, + noise_params = zinc_params, + noise_threshhold = zinc_threshhold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_zinc", + wherein = "default:stone", + clust_scarcity = 6*6*6, + clust_num_ores = 4, + clust_size = 3, + y_min = -31000, + y_max = -32, + flags = "absheight", + noise_params = zinc_params, + noise_threshhold = zinc_threshhold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_lead", + wherein = "default:stone", + clust_scarcity = 9*9*9, + clust_num_ores = 5, + clust_size = 3, + y_min = -16, + y_max = 16, + noise_params = lead_params, + noise_threshhold = lead_threshhold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_lead", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 5, + clust_size = 3, + y_min = -128, + y_max = -16, + noise_params = lead_params, + noise_threshhold = lead_threshhold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_lead", + wherein = "default:stone", + clust_scarcity = 6*6*6, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -128, + flags = "absheight", + noise_params = lead_params, + noise_threshhold = lead_threshhold, +}) + +-- Sulfur +minetest.register_on_generated(function(minp, maxp, seed) + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local a = VoxelArea:new{ + 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() + local pr = PseudoRandom(17 * minp.x + 42 * minp.y + 101 * minp.z) + local noise = minetest.get_perlin(9876, 3, 0.5, 100) + + local c_lava = minetest.get_content_id("default:lava_source") + local c_lava_flowing = minetest.get_content_id("default:lava_flowing") + local c_stone = minetest.get_content_id("default:stone") + local c_sulfur = minetest.get_content_id("technic:mineral_sulfur") + + local grid_size = 5 + for x = minp.x + math.floor(grid_size / 2), maxp.x, 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 + local c = data[a:index(x, y, z)] + if (c == c_lava or c == c_lava_flowing) and noise:get3d({x = x, y = z, z = z}) >= 0.4 then + for xx = math.max(minp.x, x - grid_size), math.min(maxp.x, x + grid_size) do + for yy = math.max(minp.y, y - grid_size), math.min(maxp.y, y + grid_size) do + for zz = math.max(minp.z, z - grid_size), math.min(maxp.z, z + grid_size) do + local i = a:index(xx, yy, zz) + if data[i] == c_stone and pr:next(1, 10) <= 7 then + data[i] = c_sulfur + end + end + end + end + end + end + end + end + + vm:set_data(data) + vm:write_to_map(data) +end) + + +if technic.config:get_bool("enable_marble_generation") then +minetest.register_ore({ + ore_type = "sheet", + ore = "technic:marble", + wherein = "default:stone", + clust_scarcity = 1, + clust_num_ores = 1, + clust_size = 3, + y_min = -31000, + y_max = -50, + noise_threshhold = 0.4, + noise_params = {offset=0, scale=15, spread={x=150, y=150, z=150}, seed=23, octaves=3, persist=0.70} +}) +end + +if technic.config:get_bool("enable_granite_generation") then +minetest.register_ore({ + ore_type = "sheet", + ore = "technic:granite", + wherein = "default:stone", + clust_scarcity = 1, + clust_num_ores = 1, + clust_size = 4, + y_min = -31000, + y_max = -150, + noise_threshhold = 0.4, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} +}) +end + diff --git a/technic/technic_worldgen/rubber.lua b/technic/technic_worldgen/rubber.lua new file mode 100644 index 0000000..3094fa0 --- /dev/null +++ b/technic/technic_worldgen/rubber.lua @@ -0,0 +1,100 @@ +-- Code of rubber tree by PilzAdam + +local S = technic.worldgen.gettext + +minetest.register_node(":moretrees:rubber_tree_sapling", { + description = S("Rubber Tree Sapling"), + drawtype = "plantlike", + tiles = {"technic_rubber_sapling.png"}, + inventory_image = "technic_rubber_sapling.png", + wield_image = "technic_rubber_sapling.png", + paramtype = "light", + walkable = false, + groups = {dig_immediate=3, flammable=2}, + sounds = default.node_sound_defaults(), +}) + +minetest.register_craft({ + type = "fuel", + recipe = "moretrees:rubber_tree_sapling", + burntime = 10 +}) + +minetest.register_node(":moretrees:rubber_tree_trunk", { + description = S("Rubber Tree"), + tiles = {"default_tree_top.png", "default_tree_top.png", + "technic_rubber_tree_full.png"}, + groups = {tree=1, snappy=1, choppy=2, oddly_breakable_by_hand=1, + flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node(":moretrees:rubber_tree_trunk_empty", { + description = S("Rubber Tree"), + tiles = {"default_tree_top.png", "default_tree_top.png", + "technic_rubber_tree_empty.png"}, + groups = {tree=1, snappy=1, choppy=2, oddly_breakable_by_hand=1, + flammable=2, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node(":moretrees:rubber_tree_leaves", { + drawtype = "allfaces_optional", + description = S("Rubber Tree Leaves"), + tiles = {"technic_rubber_leaves.png"}, + paramtype = "light", + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = {{ + items = {"moretrees:rubber_tree_sapling"}, + rarity = 20, + }, + { + items = {"moretrees:rubber_tree_leaves"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), +}) + +technic.rubber_tree_model={ + axiom = "FFFFA", + rules_a = "[&FFBFA]////[&BFFFA]////[&FBFFA]", + rules_b = "[&FFA]////[&FFA]////[&FFA]", + trunk = "moretrees:rubber_tree_trunk", + leaves = "moretrees:rubber_tree_leaves", + angle = 35, + iterations = 3, + random_level = 1, + trunk_type = "double", + thin_branches = true +} + +minetest.register_abm({ + nodenames = {"moretrees:rubber_tree_sapling"}, + interval = 60, + chance = 20, + action = function(pos, node) + minetest.remove_node(pos) + minetest.spawn_tree(pos, technic.rubber_tree_model) + end +}) + +if technic.config:get_bool("enable_rubber_tree_generation") then + minetest.register_on_generated(function(minp, maxp, blockseed) + if math.random(1, 100) > 5 then + return + end + local tmp = { + x = (maxp.x - minp.x) / 2 + minp.x, + y = (maxp.y - minp.y) / 2 + minp.y, + z = (maxp.z - minp.z) / 2 + minp.z} + local pos = minetest.find_node_near(tmp, maxp.x - minp.x, + {"default:dirt_with_grass"}) + if pos ~= nil then + minetest.spawn_tree({x=pos.x, y=pos.y+1, z=pos.z}, technic.rubber_tree_model) + end + end) +end + diff --git a/technic/technic_worldgen/textures/technic_brass_block.png b/technic/technic_worldgen/textures/technic_brass_block.png Binary files differnew file mode 100644 index 0000000..bc6fe78 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_brass_block.png diff --git a/technic/technic_worldgen/textures/technic_brass_dust.png b/technic/technic_worldgen/textures/technic_brass_dust.png Binary files differnew file mode 100644 index 0000000..63d9ba4 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_brass_dust.png diff --git a/technic/technic_worldgen/textures/technic_brass_ingot.png b/technic/technic_worldgen/textures/technic_brass_ingot.png Binary files differnew file mode 100644 index 0000000..06056e7 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_brass_ingot.png diff --git a/technic/technic_worldgen/textures/technic_carbon_steel_block.png b/technic/technic_worldgen/textures/technic_carbon_steel_block.png Binary files differnew file mode 100644 index 0000000..f3cfdc1 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_carbon_steel_block.png diff --git a/technic/technic_worldgen/textures/technic_carbon_steel_ingot.png b/technic/technic_worldgen/textures/technic_carbon_steel_ingot.png Binary files differnew file mode 100644 index 0000000..c30ec80 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_carbon_steel_ingot.png diff --git a/technic/technic_worldgen/textures/technic_cast_iron_block.png b/technic/technic_worldgen/textures/technic_cast_iron_block.png Binary files differnew file mode 100644 index 0000000..2df61e5 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_cast_iron_block.png diff --git a/technic/technic_worldgen/textures/technic_cast_iron_ingot.png b/technic/technic_worldgen/textures/technic_cast_iron_ingot.png Binary files differnew file mode 100644 index 0000000..5c182ce --- /dev/null +++ b/technic/technic_worldgen/textures/technic_cast_iron_ingot.png diff --git a/technic/technic_worldgen/textures/technic_chromium_block.png b/technic/technic_worldgen/textures/technic_chromium_block.png Binary files differnew file mode 100644 index 0000000..ad173ca --- /dev/null +++ b/technic/technic_worldgen/textures/technic_chromium_block.png diff --git a/technic/technic_worldgen/textures/technic_chromium_ingot.png b/technic/technic_worldgen/textures/technic_chromium_ingot.png Binary files differnew file mode 100644 index 0000000..248b0c3 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_chromium_ingot.png diff --git a/technic/technic_worldgen/textures/technic_chromium_lump.png b/technic/technic_worldgen/textures/technic_chromium_lump.png Binary files differnew file mode 100644 index 0000000..0fe03a1 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_chromium_lump.png diff --git a/technic/technic_worldgen/textures/technic_granite.png b/technic/technic_worldgen/textures/technic_granite.png Binary files differnew file mode 100644 index 0000000..abb1385 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_granite.png diff --git a/technic/technic_worldgen/textures/technic_lead_block.png b/technic/technic_worldgen/textures/technic_lead_block.png Binary files differnew file mode 100644 index 0000000..11da56a --- /dev/null +++ b/technic/technic_worldgen/textures/technic_lead_block.png diff --git a/technic/technic_worldgen/textures/technic_lead_dust.png b/technic/technic_worldgen/textures/technic_lead_dust.png Binary files differnew file mode 100644 index 0000000..af6ee29 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_lead_dust.png diff --git a/technic/technic_worldgen/textures/technic_lead_ingot.png b/technic/technic_worldgen/textures/technic_lead_ingot.png Binary files differnew file mode 100644 index 0000000..fae0cbf --- /dev/null +++ b/technic/technic_worldgen/textures/technic_lead_ingot.png diff --git a/technic/technic_worldgen/textures/technic_lead_lump.png b/technic/technic_worldgen/textures/technic_lead_lump.png Binary files differnew file mode 100644 index 0000000..64584cb --- /dev/null +++ b/technic/technic_worldgen/textures/technic_lead_lump.png diff --git a/technic/technic_worldgen/textures/technic_marble.png b/technic/technic_worldgen/textures/technic_marble.png Binary files differnew file mode 100644 index 0000000..846a170 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_marble.png diff --git a/technic/technic_worldgen/textures/technic_marble_bricks.png b/technic/technic_worldgen/textures/technic_marble_bricks.png Binary files differnew file mode 100644 index 0000000..2ea1e42 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_marble_bricks.png diff --git a/technic/technic_worldgen/textures/technic_mineral_chromium.png b/technic/technic_worldgen/textures/technic_mineral_chromium.png Binary files differnew file mode 100644 index 0000000..c66f1c5 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_mineral_chromium.png diff --git a/technic/technic_worldgen/textures/technic_mineral_lead.png b/technic/technic_worldgen/textures/technic_mineral_lead.png Binary files differnew file mode 100644 index 0000000..0309cd3 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_mineral_lead.png diff --git a/technic/technic_worldgen/textures/technic_mineral_sulfur.png b/technic/technic_worldgen/textures/technic_mineral_sulfur.png Binary files differnew file mode 100644 index 0000000..26cb19d --- /dev/null +++ b/technic/technic_worldgen/textures/technic_mineral_sulfur.png diff --git a/technic/technic_worldgen/textures/technic_mineral_uranium.png b/technic/technic_worldgen/textures/technic_mineral_uranium.png Binary files differnew file mode 100644 index 0000000..aad9c07 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_mineral_uranium.png diff --git a/technic/technic_worldgen/textures/technic_mineral_zinc.png b/technic/technic_worldgen/textures/technic_mineral_zinc.png Binary files differnew file mode 100644 index 0000000..598efeb --- /dev/null +++ b/technic/technic_worldgen/textures/technic_mineral_zinc.png diff --git a/technic/technic_worldgen/textures/technic_rubber.png b/technic/technic_worldgen/textures/technic_rubber.png Binary files differnew file mode 100644 index 0000000..9ed4a9d --- /dev/null +++ b/technic/technic_worldgen/textures/technic_rubber.png diff --git a/technic/technic_worldgen/textures/technic_rubber_leaves.png b/technic/technic_worldgen/textures/technic_rubber_leaves.png Binary files differnew file mode 100644 index 0000000..ae013e0 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_rubber_leaves.png diff --git a/technic/technic_worldgen/textures/technic_rubber_sapling.png b/technic/technic_worldgen/textures/technic_rubber_sapling.png Binary files differnew file mode 100644 index 0000000..e5c9f5d --- /dev/null +++ b/technic/technic_worldgen/textures/technic_rubber_sapling.png diff --git a/technic/technic_worldgen/textures/technic_rubber_tree_empty.png b/technic/technic_worldgen/textures/technic_rubber_tree_empty.png Binary files differnew file mode 100644 index 0000000..1792951 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_rubber_tree_empty.png diff --git a/technic/technic_worldgen/textures/technic_rubber_tree_full.png b/technic/technic_worldgen/textures/technic_rubber_tree_full.png Binary files differnew file mode 100644 index 0000000..08067ef --- /dev/null +++ b/technic/technic_worldgen/textures/technic_rubber_tree_full.png diff --git a/technic/technic_worldgen/textures/technic_rubber_tree_grindings.png b/technic/technic_worldgen/textures/technic_rubber_tree_grindings.png Binary files differnew file mode 100644 index 0000000..9f2f5d6 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_rubber_tree_grindings.png diff --git a/technic/technic_worldgen/textures/technic_stainless_steel_block.png b/technic/technic_worldgen/textures/technic_stainless_steel_block.png Binary files differnew file mode 100644 index 0000000..e451768 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_stainless_steel_block.png diff --git a/technic/technic_worldgen/textures/technic_sulfur_dust.png b/technic/technic_worldgen/textures/technic_sulfur_dust.png Binary files differnew file mode 100644 index 0000000..04ffee0 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_sulfur_dust.png diff --git a/technic/technic_worldgen/textures/technic_sulfur_lump.png b/technic/technic_worldgen/textures/technic_sulfur_lump.png Binary files differnew file mode 100644 index 0000000..017c8e1 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_sulfur_lump.png diff --git a/technic/technic_worldgen/textures/technic_uranium_block.png b/technic/technic_worldgen/textures/technic_uranium_block.png Binary files differnew file mode 100644 index 0000000..99dd51c --- /dev/null +++ b/technic/technic_worldgen/textures/technic_uranium_block.png diff --git a/technic/technic_worldgen/textures/technic_uranium_ingot.png b/technic/technic_worldgen/textures/technic_uranium_ingot.png Binary files differnew file mode 100644 index 0000000..38978f8 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_uranium_ingot.png diff --git a/technic/technic_worldgen/textures/technic_uranium_lump.png b/technic/technic_worldgen/textures/technic_uranium_lump.png Binary files differnew file mode 100644 index 0000000..2f5a66c --- /dev/null +++ b/technic/technic_worldgen/textures/technic_uranium_lump.png diff --git a/technic/technic_worldgen/textures/technic_wrought_iron_block.png b/technic/technic_worldgen/textures/technic_wrought_iron_block.png Binary files differnew file mode 100644 index 0000000..cf6c961 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_wrought_iron_block.png diff --git a/technic/technic_worldgen/textures/technic_wrought_iron_ingot.png b/technic/technic_worldgen/textures/technic_wrought_iron_ingot.png Binary files differnew file mode 100644 index 0000000..af00ea0 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_wrought_iron_ingot.png diff --git a/technic/technic_worldgen/textures/technic_zinc_block.png b/technic/technic_worldgen/textures/technic_zinc_block.png Binary files differnew file mode 100644 index 0000000..5ae7947 --- /dev/null +++ b/technic/technic_worldgen/textures/technic_zinc_block.png diff --git a/technic/technic_worldgen/textures/technic_zinc_ingot.png b/technic/technic_worldgen/textures/technic_zinc_ingot.png Binary files differnew file mode 100644 index 0000000..a36a11c --- /dev/null +++ b/technic/technic_worldgen/textures/technic_zinc_ingot.png diff --git a/technic/technic_worldgen/textures/technic_zinc_lump.png b/technic/technic_worldgen/textures/technic_zinc_lump.png Binary files differnew file mode 100644 index 0000000..1a620ab --- /dev/null +++ b/technic/technic_worldgen/textures/technic_zinc_lump.png diff --git a/technic/technic_worldgen/textures/x32/technic_brass_ingot.png b/technic/technic_worldgen/textures/x32/technic_brass_ingot.png Binary files differnew file mode 100644 index 0000000..2d8b153 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_brass_ingot.png diff --git a/technic/technic_worldgen/textures/x32/technic_chromium_ingot.png b/technic/technic_worldgen/textures/x32/technic_chromium_ingot.png Binary files differnew file mode 100644 index 0000000..91d5b20 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_chromium_ingot.png diff --git a/technic/technic_worldgen/textures/x32/technic_chromium_lump.png b/technic/technic_worldgen/textures/x32/technic_chromium_lump.png Binary files differnew file mode 100644 index 0000000..1588f92 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_chromium_lump.png diff --git a/technic/technic_worldgen/textures/x32/technic_concrete_block.png b/technic/technic_worldgen/textures/x32/technic_concrete_block.png Binary files differnew file mode 100644 index 0000000..91364f3 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_concrete_block.png diff --git a/technic/technic_worldgen/textures/x32/technic_granite.png b/technic/technic_worldgen/textures/x32/technic_granite.png Binary files differnew file mode 100644 index 0000000..abb1385 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_granite.png diff --git a/technic/technic_worldgen/textures/x32/technic_marble.png b/technic/technic_worldgen/textures/x32/technic_marble.png Binary files differnew file mode 100644 index 0000000..846a170 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_marble.png diff --git a/technic/technic_worldgen/textures/x32/technic_marble_bricks.png b/technic/technic_worldgen/textures/x32/technic_marble_bricks.png Binary files differnew file mode 100644 index 0000000..2ea1e42 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_marble_bricks.png diff --git a/technic/technic_worldgen/textures/x32/technic_mineral_chromium.png b/technic/technic_worldgen/textures/x32/technic_mineral_chromium.png Binary files differnew file mode 100644 index 0000000..c66f1c5 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_mineral_chromium.png diff --git a/technic/technic_worldgen/textures/x32/technic_mineral_uranium.png b/technic/technic_worldgen/textures/x32/technic_mineral_uranium.png Binary files differnew file mode 100644 index 0000000..aad9c07 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_mineral_uranium.png diff --git a/technic/technic_worldgen/textures/x32/technic_mineral_zinc.png b/technic/technic_worldgen/textures/x32/technic_mineral_zinc.png Binary files differnew file mode 100644 index 0000000..598efeb --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_mineral_zinc.png diff --git a/technic/technic_worldgen/textures/x32/technic_rebar.png b/technic/technic_worldgen/textures/x32/technic_rebar.png Binary files differnew file mode 100644 index 0000000..16d1fc5 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_rebar.png diff --git a/technic/technic_worldgen/textures/x32/technic_stainless_steel_ingot.png b/technic/technic_worldgen/textures/x32/technic_stainless_steel_ingot.png Binary files differnew file mode 100644 index 0000000..46fa296 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_stainless_steel_ingot.png diff --git a/technic/technic_worldgen/textures/x32/technic_uranium.png b/technic/technic_worldgen/textures/x32/technic_uranium.png Binary files differnew file mode 100644 index 0000000..54225f8 --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_uranium.png diff --git a/technic/technic_worldgen/textures/x32/technic_zinc_ingot.png b/technic/technic_worldgen/textures/x32/technic_zinc_ingot.png Binary files differnew file mode 100644 index 0000000..096ff9c --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_zinc_ingot.png diff --git a/technic/technic_worldgen/textures/x32/technic_zinc_lump.png b/technic/technic_worldgen/textures/x32/technic_zinc_lump.png Binary files differnew file mode 100644 index 0000000..d28a6dc --- /dev/null +++ b/technic/technic_worldgen/textures/x32/technic_zinc_lump.png diff --git a/technic/wrench/depends.txt b/technic/wrench/depends.txt new file mode 100644 index 0000000..a681af3 --- /dev/null +++ b/technic/wrench/depends.txt @@ -0,0 +1,6 @@ +default +technic? +technic_chests? +technic_worldgen? +intllib? + diff --git a/technic/wrench/init.lua b/technic/wrench/init.lua new file mode 100644 index 0000000..76605c4 --- /dev/null +++ b/technic/wrench/init.lua @@ -0,0 +1,162 @@ +--[[ +Wrench mod + +Adds a wrench that allows the player to pickup nodes that contain an inventory +with items or metadata that needs perserving. +The wrench has the same tool capability as the normal hand. +To pickup a node simply right click on it. If the node contains a formspec, +you will need to shift+right click instead. +Because it enables arbitrary nesting of chests, and so allows the player +to carry an unlimited amount of material at once, this wrench is not +available to survival-mode players. +--]] + +local LATEST_SERIALIZATION_VERSION = 1 + +wrench = {} + +local modpath = minetest.get_modpath(minetest.get_current_modname()) +dofile(modpath.."/support.lua") +dofile(modpath.."/technic.lua") + +-- 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 function get_meta_type(name, metaname) + local def = wrench.registered_nodes[name] + if not def or not def.metas or not def.metas[metaname] then + return nil + end + return def.metas[metaname] +end + +local function get_pickup_name(name) + return "wrench:picked_up_"..(name:gsub(":", "_")) +end + +local function restore(pos, placer, itemstack) + local name = itemstack:get_name() + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local data = minetest.deserialize(itemstack:get_metadata()) + minetest.set_node(pos, {name = data.name, param2 = node.param2}) + local lists = data.lists + for name, value in pairs(data.metas) do + local meta_type = get_meta_type(data.name, name) + if meta_type == wrench.META_TYPE_INT then + meta:set_int(name, value) + elseif meta_type == wrench.META_TYPE_FLOAT then + meta:set_float(name, value) + elseif meta_type == wrench.META_TYPE_STRING then + meta:set_string(name, value) + end + end + for listname, list in pairs(lists) do + inv:set_list(listname, list) + end + itemstack:take_item() + return itemstack +end + +for name, info in pairs(wrench.registered_nodes) do + local olddef = minetest.registered_nodes[name] + if olddef then + local newdef = {} + for key, value in pairs(olddef) do + newdef[key] = value + end + newdef.stack_max = 1 + newdef.description = S("%s with items"):format(newdef.description) + newdef.groups = {} + newdef.groups.not_in_creative_inventory = 1 + newdef.on_construct = nil + newdef.on_destruct = nil + newdef.after_place_node = restore + minetest.register_node(":"..get_pickup_name(name), newdef) + end +end + +minetest.register_tool("wrench:wrench", { + description = S("Wrench"), + inventory_image = "technic_wrench.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1}, + snappy = {times={[3]=0.40}, uses=0, maxlevel=1}, + oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=1.40}, + uses=0, maxlevel=3} + }, + damage_groups = {fleshy=1}, + }, + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.under + if not placer or not pos then + return + end + if minetest.is_protected(pos, placer:get_player_name()) then + minetest.record_protection_violation(pos, placer:get_player_name()) + return + end + local name = minetest.get_node(pos).name + local def = wrench.registered_nodes[name] + if not def then + return + end + + local stack = ItemStack(get_pickup_name(name)) + local player_inv = placer:get_inventory() + if not player_inv:room_for_item("main", stack) then + return + end + local meta = minetest.get_meta(pos) + if def.owned then + local owner = meta:get_string("owner") + if owner and owner ~= placer:get_player_name() then + minetest.log("action", placer:get_player_name().. + " tried to pick up a owned node belonging to ".. + owner.." at ".. + minetest.pos_to_string(pos)) + return + end + end + + local metadata = {} + metadata.name = name + metadata.version = LATEST_SERIALIZATION_VERSION + + local inv = meta:get_inventory() + local lists = {} + for _, listname in pairs(def.lists or {}) do + if not inv:is_empty(listname) then + empty = false + end + local list = inv:get_list(listname) + for i, stack in pairs(list) do + list[i] = stack:to_string() + end + lists[listname] = list + end + metadata.lists = lists + + local metas = {} + for name, meta_type in pairs(def.metas or {}) do + if meta_type == wrench.META_TYPE_INT then + metas[name] = meta:get_int(name) + elseif meta_type == wrench.META_TYPE_FLOAT then + metas[name] = meta:get_float(name) + elseif meta_type == wrench.META_TYPE_STRING then + metas[name] = meta:get_string(name) + end + end + metadata.metas = metas + + stack:set_metadata(minetest.serialize(metadata)) + minetest.remove_node(pos) + itemstack:add_wear(65535 / 20) + player_inv:add_item("main", stack) + return itemstack + end, +}) diff --git a/technic/wrench/locale/de.txt b/technic/wrench/locale/de.txt new file mode 100644 index 0000000..b285cd3 --- /dev/null +++ b/technic/wrench/locale/de.txt @@ -0,0 +1,7 @@ +# German Translation for technic_wrench +# Deutsche Übersetzung von technic_wrench +# by Xanthin + +Wrench = Schraubenschluessel +%s with items = %s mit Gegenstaenden + diff --git a/technic/wrench/locale/template.txt b/technic/wrench/locale/template.txt new file mode 100644 index 0000000..eff2da2 --- /dev/null +++ b/technic/wrench/locale/template.txt @@ -0,0 +1,5 @@ +# technic_wrench translation template + +Wrench = +%s with items = + diff --git a/technic/wrench/locale/tr.txt b/technic/wrench/locale/tr.txt new file mode 100644 index 0000000..2050bce --- /dev/null +++ b/technic/wrench/locale/tr.txt @@ -0,0 +1,5 @@ +# Turkish translation by mahmutelmas06 +# mahmutelmas06@hotmail.com + +Wrench = İngiliz anahtarı +%s with items = Araçlarla birlikte %s diff --git a/technic/wrench/support.lua b/technic/wrench/support.lua new file mode 100644 index 0000000..1d21811 --- /dev/null +++ b/technic/wrench/support.lua @@ -0,0 +1,73 @@ +--[[ +supported_nodes +This table stores all nodes that are compatible with the wrench mod. +Syntax: + [<node name>] = { + lists = {"<inventory list name>"}, + metas = {["<meta name>"] = STRING, + ["<meta name>"] = INT, + ["<meta name>"] = FLOAT}, + owned = true, + store_meta_always = true, + } + owned - nodes that are protected by owner requirements (Ex. locked chests) + store_meta_always - when nodes are broken this ensures metadata and + inventory is always stored (Ex. active state for machines) +--]] + +wrench.META_TYPE_INT = 0 +wrench.META_TYPE_FLOAT = 1 +wrench.META_TYPE_STRING = 2 + +local INT, STRING, FLOAT = + wrench.META_TYPE_INT, + wrench.META_TYPE_STRING, + wrench.META_TYPE_FLOAT + +wrench.registered_nodes = { + ["default:chest"] = { + lists = {"main"}, + }, + ["default:chest_locked"] = { + lists = {"main"}, + metas = {owner = STRING, + infotext = STRING}, + owned = true, + }, + ["default:furnace"] = { + lists = {"fuel", "src", "dst"}, + metas = {infotext = STRING, + fuel_totaltime = FLOAT, + fuel_time = FLOAT, + src_totaltime = FLOAT, + src_time = FLOAT}, + }, + ["default:furnace_active"] = { + lists = {"fuel", "src", "dst"}, + metas = {infotext = STRING, + fuel_totaltime = FLOAT, + fuel_time = FLOAT, + src_totaltime = FLOAT, + src_time = FLOAT}, + store_meta_always = true, + }, + ["default:sign_wall"] = { + metas = {infotext = STRING, + text = STRING}, + }, +} + +function wrench:original_name(name) + for key, value in pairs(self.registered_nodes) do + if name == value.name then + return key + end + end +end + +function wrench:register_node(name, def) + if minetest.registered_nodes[name] then + self.registered_nodes[name] = def + end +end + diff --git a/technic/wrench/technic.lua b/technic/wrench/technic.lua new file mode 100644 index 0000000..c404180 --- /dev/null +++ b/technic/wrench/technic.lua @@ -0,0 +1,343 @@ + +local INT, STRING, FLOAT = + wrench.META_TYPE_INT, + wrench.META_TYPE_STRING, + wrench.META_TYPE_FLOAT + +wrench:register_node("technic:iron_chest", { + lists = {"main"}, +}) +wrench:register_node("technic:iron_locked_chest", { + lists = {"main"}, + metas = {infotext = STRING, + owner = STRING}, + owned = true, +}) +wrench:register_node("technic:copper_chest", { + lists = {"main"}, +}) +wrench:register_node("technic:copper_locked_chest", { + lists = {"main"}, + metas = {infotext = STRING, + owner = STRING}, + owned = true, +}) +wrench:register_node("technic:silver_chest", { + lists = {"main"}, + metas = {infotext = STRING, + formspec = STRING}, +}) +wrench:register_node("technic:silver_locked_chest", { + lists = {"main"}, + metas = {infotext = STRING, + owner = STRING, + formspec = STRING}, + owned = true, +}) +wrench:register_node("technic:gold_chest", { + lists = {"main"}, + metas = {infotext = STRING, + formspec = STRING}, +}) +wrench:register_node("technic:gold_locked_chest", { + lists = {"main"}, + metas = {infotext = STRING, + owner = STRING, + formspec = STRING}, + owned = true, +}) +wrench:register_node("technic:mithril_chest", { + lists = {"main"}, + metas = {infotext = STRING, + formspec = STRING}, +}) +wrench:register_node("technic:mithril_locked_chest", { + lists = {"main"}, + metas = {infotext = STRING, + owner = STRING, + formspec = STRING}, + owned = true, +}) +wrench:register_node("technic:lv_electric_furnace", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:lv_electric_furnace_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_electric_furnace", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_electric_furnace_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:coal_alloy_furnace", { + lists = {"fuel", "src", "dst"}, + metas = {infotext = STRING, + fuel_totaltime = FLOAT, + fuel_time = FLOAT, + src_totaltime = FLOAT, + src_time = FLOAT}, +}) +wrench:register_node("technic:coal_alloy_furnace_active", { + lists = {"fuel", "src", "dst"}, + metas = {infotext = STRING, + fuel_totaltime = FLOAT, + fuel_time = FLOAT, + src_totaltime = FLOAT, + src_time = FLOAT}, +}) +wrench:register_node("technic:alloy_furnace", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:alloy_furnace_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_alloy_furnace", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_alloy_furnace_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:tool_workshop", { + lists = {"src", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT}, +}) +wrench:register_node("technic:grinder", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:grinder_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_grinder", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_grinder_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:extractor", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:extractor_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_extractor", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_extractor_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:compressor", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:compressor_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_compressor", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_compressor_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:cnc", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT, + cnc_product = STRING}, +}) +wrench:register_node("technic:cnc_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT, + cnc_product = STRING}, +}) +wrench:register_node("technic:mv_centrifuge", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_centrifuge_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) + + +local chest_mark_colors = { + '_black', + '_blue', + '_brown', + '_cyan', + '_dark_green', + '_dark_grey', + '_green', + '_grey', + '_magenta', + '_orange', + '_pink', + '_red', + '_violet', + '_white', + '_yellow', + '', +} + +for i = 1, 15 do + wrench:register_node("technic:gold_chest"..chest_mark_colors[i], { + lists = {"main"}, + metas = {infotext = STRING,formspec = STRING}, + }) + wrench:register_node("technic:gold_locked_chest"..chest_mark_colors[i], { + lists = {"main"}, + metas = {infotext = STRING,owner = STRING,formspec = STRING}, + owned = true, + }) +end + +if minetest.get_modpath("technic") then + for tier, _ in pairs(technic.machines) do + local ltier = tier:lower() + for i = 0, 8 do + wrench:register_node("technic:"..ltier.."_battery_box"..i, { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + [tier.."_EU_demand"] = INT, + [tier.."_EU_supply"] = INT, + [tier.."_EU_input"] = INT, + internal_EU_charge = INT, + last_side_shown = INT}, + }) + end + end +end + diff --git a/technic/wrench/textures/technic_wrench.png b/technic/wrench/textures/technic_wrench.png Binary files differnew file mode 100644 index 0000000..471b47e --- /dev/null +++ b/technic/wrench/textures/technic_wrench.png |