Compare commits
	
		
			6 Commits
		
	
	
		
			master
			...
			frames-exp
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | cac6914270 | ||
|  | 902cd07218 | ||
|  | 83ecc59e5b | ||
|  | a93a61a329 | ||
|  | b05e764e77 | ||
|  | 5aa229d454 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -48,6 +48,7 @@ local.properties | ||||
| *_p.c | ||||
| *.ilk | ||||
| *.meta | ||||
| *.obj | ||||
| *.pch | ||||
| *.pdb | ||||
| *.pgc | ||||
|   | ||||
							
								
								
									
										4
									
								
								.mailmap
									
									
									
									
									
								
							
							
						
						| @@ -1,4 +0,0 @@ | ||||
| RealBadAngel <maciej.kasatkin@o2.pl> <mk@realbadangel.pl> | ||||
| Vanessa Ezekowitz <vanessaezekowitz@gmail.com> | ||||
| Vanessa Ezekowitz <vanessaezekowitz@gmail.com> <vanessa@rainbird.(none)> | ||||
| kaeza <kaeza@users.sf.net> Diego Martínez <kaeza@users.sf.net> | ||||
							
								
								
									
										31
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| @@ -1,23 +1,14 @@ | ||||
| Technic | ||||
| ======= | ||||
| technic 0.4.7 | ||||
|  | ||||
| Credits for contributing to the project (in alphabetical order): | ||||
|   * kpoppel | ||||
|   * Nekogloop | ||||
|   * Nore/Ekdohibs | ||||
|   * ShadowNinja | ||||
|   * VanessaE | ||||
|   * And many others... | ||||
| Technic mod for Minetest 0.4.7 | ||||
|  | ||||
| FAQ | ||||
| --- | ||||
| Credits for contributing to the project: | ||||
| Nekogloop | ||||
| ShadowNinja | ||||
| VanessaE | ||||
| Nore/Novatux | ||||
| kpoppel | ||||
| And many others for ideas/inspiring  | ||||
|  | ||||
| 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. | ||||
| License: | ||||
| LGPLv2+ | ||||
|   | ||||
| @@ -1,4 +1 @@ | ||||
| default | ||||
| basic_materials | ||||
| intllib? | ||||
| moreblocks? | ||||
|   | ||||
| @@ -1,44 +1,49 @@ | ||||
| --Minetest 0.4.7 mod: concrete | ||||
| --Minetest 0.4.7 mod: concrete  | ||||
| --(c) 2013 by RealBadAngel <mk@realbadangel.pl> | ||||
|  | ||||
| local technic = rawget(_G, "technic") or {} | ||||
| local technic = 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 | ||||
|  | ||||
| for i = 0, 31 do | ||||
| 	minetest.register_alias("technic:concrete_post"..i, | ||||
| 			"technic:concrete_post") | ||||
| end | ||||
| for i = 32, 63 do | ||||
| 	minetest.register_alias("technic:concrete_post"..i, | ||||
| 			"technic:concrete_post_with_platform") | ||||
| end | ||||
|  | ||||
| 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_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") | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:concrete_post_platform 6', | ||||
| 	output = 'technic:rebar 6', | ||||
| 	recipe = { | ||||
| 		{'technic:concrete','technic:concrete_post','technic:concrete'}, | ||||
| 		{'','', 'default:steel_ingot'}, | ||||
| 		{'','default:steel_ingot',''}, | ||||
| 		{'default:steel_ingot', '', ''}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:concrete_post 12', | ||||
| 	output = 'technic:concrete 5', | ||||
| 	recipe = { | ||||
| 		{'default:stone','basic_materials:steel_bar','default:stone'}, | ||||
| 		{'default:stone','basic_materials:steel_bar','default:stone'}, | ||||
| 		{'default:stone','basic_materials:steel_bar','default:stone'}, | ||||
| 		{'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 = { | ||||
| @@ -48,93 +53,195 @@ minetest.register_craft({ | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| 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}, | ||||
| 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 = "Rebar", | ||||
| 	inventory_image = "technic_rebar.png", | ||||
| }) | ||||
|  | ||||
| minetest.register_node(":technic:concrete", { | ||||
| 	description = "Concrete Block", | ||||
| 	tile_images = {"technic_concrete_block.png",}, | ||||
| 	groups = {cracky=1, level=2, concrete=1}, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| 	on_blast = function(pos, intensity) | ||||
| 		if intensity > 9 then | ||||
| 			minetest.remove_node(pos) | ||||
| 			return {"technic:blast_resistant_concrete"} | ||||
| 		end | ||||
| 	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, | ||||
| }) | ||||
|  | ||||
| if minetest.get_modpath("moreblocks") then | ||||
| 	stairsplus:register_all("technic","blast_resistant_concrete","technic:blast_resistant_concrete",{ | ||||
| 		description = "Blast-resistant Concrete", | ||||
| 		tiles = {"technic_blast_resistant_concrete_block.png",}, | ||||
| 		groups = {cracky=1, level=3, concrete=1}, | ||||
| 		sounds = default.node_sound_stone_defaults(), | ||||
| 		on_blast = function(pos, intensity) | ||||
| 			if intensity > 1 then | ||||
| 				minetest.remove_node(pos) | ||||
| 				minetest.add_item(pos, "technic:blast_resistant_concrete") | ||||
| 			end | ||||
| 		end, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| local box_platform = {-0.5,  0.3,  -0.5,  0.5,  0.5, 0.5} | ||||
| local box_post     = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15} | ||||
| local box_front    = {-0.1,  -0.3, -0.5,  0.1,  0.3, 0} | ||||
| local box_back     = {-0.1,  -0.3, 0,     0.1,  0.3, 0.5} | ||||
| local box_left     = {-0.5,  -0.3, -0.1,  0,    0.3, 0.1} | ||||
| local box_right    = {0,     -0.3, -0.1,  0.5,  0.3, 0.1} | ||||
| minetest.register_node(":technic:blast_resistant_concrete", { | ||||
| 	description = "Blast-resistant Concrete Block", | ||||
| 	tile_images = {"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 = {"basic_materials_concrete_block.png",}, | ||||
| 	description = "Concrete Post Platform", | ||||
| 	tile_images = {"technic_concrete_block.png",}, | ||||
| 	groups={cracky=1, level=2}, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| 	paramtype = "light", | ||||
| 	drawtype = "nodebox", | ||||
| 	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 node.name ~= "technic:concrete_post" then | ||||
| 			return minetest.item_place_node(itemstack, placer, pointed_thing) | ||||
| 		if not technic.concrete_posts[node.name] then  | ||||
| 			return minetest.item_place_node(itemstack, placer, pointed_thing)  | ||||
| 		end | ||||
| 		minetest.set_node(pointed_thing.under, {name="technic:concrete_post_with_platform"}) | ||||
| 		local links = technic.concrete_posts[node.name] | ||||
| 		if links[5] ~= 0 then -- The post already has a platform | ||||
| 			return minetest.item_place_node(itemstack, placer, pointed_thing)  | ||||
| 		end | ||||
| 		local id = technic.get_post_id({links[1], links[2], links[3], links[4], 1}) | ||||
| 		minetest.set_node(pointed_thing.under, {name="technic:concrete_post"..id}) | ||||
| 		itemstack:take_item() | ||||
| 		placer:set_wielded_item(itemstack) | ||||
| 		return itemstack | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| local function gen_post_nodebox(x1, x2, z1, z2, platform) | ||||
| 	local box = {box_center} | ||||
| 	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[4] * 1) + (links[3] * 2) | ||||
| 		+ (links[2] * 4) + (links[1] * 8) | ||||
| 		+ (links[5] * 16) | ||||
| end | ||||
|  | ||||
| function technic.update_posts(pos, set, secondrun) | ||||
| 	local node = minetest.get_node(pos) | ||||
| 	local link_positions = { | ||||
| 		{x=pos.x+1, y=pos.y,   z=pos.z}, | ||||
| 		{x=pos.x-1, y=pos.y,   z=pos.z}, | ||||
| 		{x=pos.x,   y=pos.y,   z=pos.z+1}, | ||||
| 		{x=pos.x,   y=pos.y,   z=pos.z-1}, | ||||
| 	} | ||||
|  | ||||
| 	local links = {0, 0, 0, 0, 0} | ||||
|  | ||||
| 	for i, link_pos in pairs(link_positions) do | ||||
| 		local connecttype = technic.posts_should_connect(link_pos) | ||||
| 		if connecttype then | ||||
| 			links[i] = 1 | ||||
| 			-- Have posts next to us update theirselves, | ||||
| 			-- but only once. (We don't want to start an | ||||
| 			-- infinite loop of updates) | ||||
| 			if not secondrun and connecttype == "post" then | ||||
| 				technic.update_posts(link_pos, true, true) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	-- We don't want to set ourselves if we have been removed or we are | ||||
| 	-- updating a concrete node | ||||
| 	if set then | ||||
| 		-- Preserve platform | ||||
| 		local oldlinks = technic.concrete_posts[node.name] | ||||
| 		if oldlinks then | ||||
| 			links[5] = oldlinks[5] | ||||
| 		end | ||||
| 		minetest.set_node(pos, {name="technic:concrete_post" | ||||
| 				..technic.get_post_id(links)}) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| for x1 = 0, 1 do | ||||
| for x2 = 0, 1 do | ||||
| for z1 = 0, 1 do | ||||
| for z2 = 0, 1 do | ||||
| for platform = 0, 1 do | ||||
| 	local after_dig_node = nil | ||||
| 	if platform == 1 then | ||||
| 		after_dig_node = function(pos, old_node) | ||||
| 			old_node.name = "technic:concrete_post" | ||||
| 			minetest.set_node(pos, old_node) | ||||
| 	local links = {x1, x2, z1, z2, platform} | ||||
| 	local id = technic.get_post_id(links) | ||||
| 	technic.concrete_posts["technic:concrete_post"..id] = links | ||||
|  | ||||
| 	local groups = {cracky=1, level=2, concrete_post=1} | ||||
| 	if id ~= 0 then | ||||
| 		groups.not_in_creative_inventory = 1 | ||||
| 	end | ||||
| 	 | ||||
| 	local drop = "technic:concrete_post0" | ||||
| 	local after_dig_node = function(pos, oldnode, oldmetadata, digger) | ||||
| 		technic.update_posts(pos, false) | ||||
| 	end | ||||
| 	if platform ~= 0 then | ||||
| 		drop = "technic:concrete_post_platform" | ||||
| 		after_dig_node = function(pos, oldnode, oldmetadata, digger) | ||||
| 			dig_post_with_platform(pos, oldnode, oldmetadata) | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	minetest.register_node(":technic:concrete_post"..(platform == 1 and "_with_platform" or ""), { | ||||
| 		description = S("Concrete Post"), | ||||
| 		tiles = {"basic_materials_concrete_block.png"}, | ||||
| 		groups = {cracky=1, level=2, concrete_post=1, not_in_creative_inventory=platform}, | ||||
| 	minetest.register_node(":technic:concrete_post"..id, { | ||||
| 		description = "Concrete Post", | ||||
| 		tiles = {"technic_concrete_block.png"}, | ||||
| 		groups = groups, | ||||
| 		sounds = default.node_sound_stone_defaults(), | ||||
| 		drop = (platform == 1 and "technic:concrete_post_platform" or | ||||
| 				"technic:concrete_post"), | ||||
| 		drop = drop, | ||||
| 		paramtype = "light", | ||||
| 		sunlight_propagates = true, | ||||
| 		drawtype = "nodebox", | ||||
| 		connects_to = {"group:concrete", "group:concrete_post"}, | ||||
| 		drawtype = "nodebox",  | ||||
| 		node_box = { | ||||
| 			type = "connected", | ||||
| 			fixed = {box_post, (platform == 1 and box_platform or nil)}, | ||||
| 			connect_front = box_front, | ||||
| 			connect_back  = box_back, | ||||
| 			connect_left  = box_left, | ||||
| 			connect_right = box_right, | ||||
| 			type = "fixed", | ||||
| 			fixed = gen_post_nodebox(x1, x2, z1, z2, 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 | ||||
|  | ||||
|   | ||||
| @@ -1,10 +0,0 @@ | ||||
| # 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 | ||||
|  | ||||
| @@ -1,8 +0,0 @@ | ||||
| # technic_concrete traducido por Carlos Barraza | ||||
|  | ||||
| Rebar = Barra de refuerzo | ||||
| Concrete Block = Bloque de concreto | ||||
| Blast-resistant Concrete Block = Bloque de concreto resistente a explosiones | ||||
| Concrete Post Platform = Plataforma de concreto | ||||
| Concrete Post = Postes de concreto | ||||
|  | ||||
| @@ -1,7 +0,0 @@ | ||||
| # technic_concrete translation template | ||||
|  | ||||
| Rebar                           = Armature | ||||
| Concrete Block                  = Bloc de béton | ||||
| Blast-resistant Concrete Block  = Bloc de béton anti explosions | ||||
| Concrete Post Platform          = Plateforme en béton | ||||
| Concrete Post                   = Pilier en béton | ||||
| @@ -1,10 +0,0 @@ | ||||
| # Polish Translation for technic_concrete | ||||
| # Polskie tłumaczenie technic_concrete | ||||
| # by mat9117 | ||||
|  | ||||
| Rebar = Pręt zbrojeniowy | ||||
| Concrete Block = Blok betonu | ||||
| Blast-resistant Concrete Block = Przeciwwybuchowy blok betonu | ||||
| Concrete Post Platform = Betonowa platforma | ||||
| Concrete Post = Betonowy słup | ||||
|  | ||||
| @@ -1,10 +0,0 @@ | ||||
| # Braziliam portuguese translation for technic_concrete | ||||
| # Tradução portuguesa brasileira para technic_concrete | ||||
| # By Sires | ||||
|  | ||||
| Rebar = Vergalhão | ||||
| Concrete Block = Bloco de Concreto | ||||
| Blast-resistant Concrete Block = Bloco de Concreto resistente-a-explosões | ||||
| Concrete Post Platform = Plataforma para Poste de Concreto | ||||
| Concrete Post = Poste de Concreto | ||||
|  | ||||
| @@ -1,8 +0,0 @@ | ||||
| # technic_concrete translation template | ||||
|  | ||||
| Rebar = | ||||
| Concrete Block = | ||||
| Blast-resistant Concrete Block = | ||||
| Concrete Post Platform = | ||||
| Concrete Post = | ||||
|  | ||||
| @@ -1,7 +0,0 @@ | ||||
| # turkish translation by mahmutelmas06 | ||||
|  | ||||
| Rebar = Beton demiri | ||||
| Concrete Block = Beton blok | ||||
| Blast-resistant Concrete Block = Patlamaya dayanıklı beton blok | ||||
| Concrete Post Platform = Beton direk platformu | ||||
| Concrete Post = Beton direk | ||||
| @@ -1,3 +0,0 @@ | ||||
| name = concrete | ||||
| depends = default | ||||
| optional_depends = basic_materials, intllib, moreblocks | ||||
| Before Width: | Height: | Size: 214 B After Width: | Height: | Size: 311 B | 
							
								
								
									
										
											BIN
										
									
								
								concrete/textures/technic_concrete_block.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 500 B | 
							
								
								
									
										
											BIN
										
									
								
								concrete/textures/technic_rebar.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 813 B | 
| Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.3 KiB | 
| Before Width: | Height: | Size: 583 B After Width: | Height: | Size: 813 B | 
| @@ -1,9 +1,4 @@ | ||||
| default | ||||
| moreblocks | ||||
| technic_worldgen | ||||
| basic_materials | ||||
| concrete | ||||
| unifieddyes? | ||||
| intllib? | ||||
| moreblocks? | ||||
| steel? | ||||
| streetsmod? | ||||
|   | ||||
| @@ -1,309 +1,80 @@ | ||||
| -- 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 stairslike nodes  | ||||
| register_stair_slab_panel_micro("technic", "marble", "technic:marble", | ||||
| 	{cracky=2, not_in_creative_inventory=1}, | ||||
| 	{"technic_marble.png"}, | ||||
| 	"Marble", | ||||
| 	"marble", | ||||
| 	"facedir", | ||||
| 	0) | ||||
|  | ||||
| 	-- 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 | ||||
| register_stair_slab_panel_micro("technic", "marble_bricks", "technic:marble_bricks", | ||||
| 	{cracky=2, not_in_creative_inventory=1}, | ||||
| 	{"technic_marble_bricks.png"}, | ||||
| 	"Marble Bricks", | ||||
| 	"marble_bricks", | ||||
| 	"facedir", | ||||
| 	0) | ||||
|  | ||||
| 	stairsplus:register_all("technic", "marble", "technic:marble", { | ||||
| 		description=S("Marble"), | ||||
| 		groups={cracky=3, not_in_creative_inventory=1}, | ||||
| 		tiles={"technic_marble.png"}, | ||||
| 	}) | ||||
| register_stair_slab_panel_micro("technic", "granite", "technic:granite", | ||||
| 	{cracky=3, not_in_creative_inventory=1}, | ||||
| 	{"technic_granite.png"}, | ||||
| 	"Granite", | ||||
| 	"granite", | ||||
| 	"facedir", | ||||
| 	0) | ||||
|  | ||||
| 	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"}, | ||||
| 	}) | ||||
| register_stair_slab_panel_micro("technic", "concrete", "technic:concrete", | ||||
| 	{cracky=3, not_in_creative_inventory=1}, | ||||
| 	{"technic_concrete_block.png"}, | ||||
| 	"Concrete", | ||||
| 	"concrete", | ||||
| 	"facedir", | ||||
| 	0) | ||||
|  | ||||
| 	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={"basic_materials_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"}, | ||||
| 	}) | ||||
|  | ||||
| 	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 | ||||
|  | ||||
| local iclip_def = { | ||||
| 	description = S("Insulator/cable clip"), | ||||
| 	drawtype = "mesh", | ||||
| 	mesh = "technic_insulator_clip.obj", | ||||
| 	tiles = {"technic_insulator_clip.png"}, | ||||
| 	is_ground_content = false, | ||||
| 	groups = {choppy=1, snappy=1, oddly_breakable_by_hand=1 }, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| } | ||||
|  | ||||
| local iclipfence_def = { | ||||
| 	description = S("Insulator/cable clip"), | ||||
| 	tiles = {"technic_insulator_clip.png"}, | ||||
| 	is_ground_content = false, | ||||
| 	paramtype = "light", | ||||
| 	drawtype = "nodebox", | ||||
| 	node_box = { | ||||
| 		type = "connected", | ||||
| 		fixed = { | ||||
| 			{ -0.25,   0.75,   -0.25,   0.25,   1.25,   0.25   }, -- the clip on top | ||||
| 			{ -0.125, 0.6875, -0.125, 0.125, 0.75,   0.125 }, | ||||
| 			{ -0.1875,  0.625,  -0.1875,  0.1875,  0.6875, 0.1875  }, | ||||
| 			{ -0.125, 0.5625, -0.125, 0.125, 0.625,  0.125 }, | ||||
| 			{ -0.1875,  0.5,    -0.1875,  0.1875,  0.5625, 0.1875  }, | ||||
| 			{ -0.125, 0.4375, -0.125, 0.125, 0.5,    0.125 }, | ||||
| 			{ -0.1875,  0.375,  -0.1875,  0.1875,  0.4375, 0.1875  }, | ||||
| 			{ -0.125, -0.5,    -0.125,  0.125,  0.375,  0.125  }, -- the post, slightly short | ||||
| 		}, | ||||
| 		-- connect_top = | ||||
| 		-- connect_bottom = | ||||
| 		connect_front = {{-1/16,3/16,-1/2,1/16,5/16,-1/8}, | ||||
| 			{-1/16,-5/16,-1/2,1/16,-3/16,-1/8}}, | ||||
| 		connect_left = {{-1/2,3/16,-1/16,-1/8,5/16,1/16}, | ||||
| 			{-1/2,-5/16,-1/16,-1/8,-3/16,1/16}}, | ||||
| 		connect_back = {{-1/16,3/16,1/8,1/16,5/16,1/2}, | ||||
| 			{-1/16,-5/16,1/8,1/16,-3/16,1/2}}, | ||||
| 		connect_right = {{1/8,3/16,-1/16,1/2,5/16,1/16}, | ||||
| 			{1/8,-5/16,-1/16,1/2,-3/16,1/16}}, | ||||
| 	}, | ||||
| 	connects_to = {"group:fence", "group:wood", "group:tree"}, | ||||
| 	groups = {fence=1, choppy=1, snappy=1, oddly_breakable_by_hand=1 }, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| } | ||||
|  | ||||
| local sclip_tex = { | ||||
| 	"technic_insulator_clip.png", | ||||
| 	{ name = "strut.png^technic_steel_strut_overlay.png", color = "white" }, | ||||
| 	{ name = "strut.png", color = "white" } | ||||
| } | ||||
|  | ||||
| local streetsmod = minetest.get_modpath("streets") or minetest.get_modpath ("steelsupport") | ||||
| -- cheapie's fork breaks it into several individual mods, with differernt names for the same content. | ||||
|  | ||||
| if streetsmod then | ||||
| 	sclip_tex = { | ||||
| 		"technic_insulator_clip.png", | ||||
| 		{ name = "streets_support.png^technic_steel_strut_overlay.png", color = "white" }, | ||||
| 		{ name = "streets_support.png", color = "white" } | ||||
| 	} | ||||
| end | ||||
|  | ||||
| local sclip_def = { | ||||
| 	description = S("Steel strut with insulator/cable clip"), | ||||
| 	drawtype = "mesh", | ||||
| 	mesh = "technic_steel_strut_with_insulator_clip.obj", | ||||
| 	tiles = sclip_tex, | ||||
| 	paramtype = "light", | ||||
| 	paramtype2 = "wallmounted", | ||||
| 	is_ground_content = false, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| 	groups = { choppy=1, cracky=1 }, | ||||
| 	backface_culling = false | ||||
| } | ||||
|  | ||||
| if minetest.get_modpath("unifieddyes") then | ||||
| 	iclip_def.paramtype2 = "colorwallmounted" | ||||
| 	iclip_def.palette = "unifieddyes_palette_colorwallmounted.png" | ||||
| 	iclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing) | ||||
| 		unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) | ||||
| 	end | ||||
| 	iclip_def.groups = {choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1} | ||||
| 	iclip_def.on_dig = unifieddyes.on_dig | ||||
|  | ||||
| 	iclipfence_def.paramtype2 = "color" | ||||
| 	iclipfence_def.palette = "unifieddyes_palette_extended.png" | ||||
| 	iclipfence_def.on_construct = unifieddyes.on_construct | ||||
| 	iclipfence_def.groups = {fence=1, choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1} | ||||
| 	iclipfence_def.on_dig = unifieddyes.on_dig | ||||
|  | ||||
| 	sclip_def.paramtype2 = "colorwallmounted" | ||||
| 	sclip_def.palette = "unifieddyes_palette_colorwallmounted.png" | ||||
| 	sclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing) | ||||
| 		unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) | ||||
| 	end | ||||
| 	sclip_def.on_dig = unifieddyes.on_dig | ||||
| 	sclip_def.groups = {choppy=1, cracky=1, ud_param2_colorable = 1} | ||||
| end | ||||
|  | ||||
| minetest.register_node(":technic:insulator_clip", iclip_def) | ||||
| minetest.register_node(":technic:insulator_clip_fencepost", iclipfence_def) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = "technic:insulator_clip", | ||||
| 	recipe = { | ||||
| 		{ "", "dye:white", ""}, | ||||
| 		{ "", "technic:raw_latex", ""}, | ||||
| 		{ "technic:raw_latex", "default:stone", "technic:raw_latex"}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = "technic:insulator_clip_fencepost 2", | ||||
| 	recipe = { | ||||
| 		{ "", "dye:white", ""}, | ||||
| 		{ "", "technic:raw_latex", ""}, | ||||
| 		{ "technic:raw_latex", "default:fence_wood", "technic:raw_latex"}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| local steelmod = minetest.get_modpath("steel") | ||||
|  | ||||
| if streetsmod or steelmod then | ||||
| 	minetest.register_node(":technic:steel_strut_with_insulator_clip", sclip_def) | ||||
|  | ||||
| 	if steelmod then | ||||
| 		minetest.register_craft({ | ||||
| 			output = "technic:steel_strut_with_insulator_clip", | ||||
| 			recipe = { | ||||
| 				{"technic:insulator_clip_fencepost"}, | ||||
| 				{"steel:strut_mount"} | ||||
| 			} | ||||
| 		}) | ||||
|  | ||||
| 		minetest.register_craft({ | ||||
| 			output = "technic:steel_strut_with_insulator_clip", | ||||
| 			recipe = { | ||||
| 				{"technic:insulator_clip_fencepost", ""                    }, | ||||
| 				{"steel:strut",                      "default:steel_ingot" }, | ||||
| 			} | ||||
| 		}) | ||||
|  | ||||
| 	elseif streetsmod then | ||||
| 		minetest.register_craft({ | ||||
| 			output = "technic:steel_strut_with_insulator_clip", | ||||
| 			recipe = { | ||||
| 				{"technic:insulator_clip_fencepost", ""                   }, | ||||
| 				{"streets:steel_support",           "default:steel_ingot" }, | ||||
| 			} | ||||
| 		}) | ||||
| --register nodes in circular saw if aviable | ||||
| if circular_saw then  | ||||
| 	for i,v in ipairs({"concrete",  "marble",  "marble_bricks",  "granite",  "default:obsidian"}) do | ||||
| 		table.insert(circular_saw.known_stairs, "technic:" ..v); | ||||
| 	end | ||||
| end | ||||
|  | ||||
| if minetest.get_modpath("unifieddyes") then | ||||
|   | ||||
| 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  | ||||
|  | ||||
| 	unifieddyes.register_color_craft({ | ||||
| 		output = "technic:insulator_clip_fencepost", | ||||
| 		palette = "extended", | ||||
| 		type = "shapeless", | ||||
| 		neutral_node = "technic:insulator_clip_fencepost", | ||||
| 		recipe = { | ||||
| 			"NEUTRAL_NODE", | ||||
| 			"MAIN_DYE" | ||||
| 		} | ||||
| 	}) | ||||
|  | ||||
| 	unifieddyes.register_color_craft({ | ||||
| 		output = "technic:insulator_clip", | ||||
| 		palette = "wallmounted", | ||||
| 		type = "shapeless", | ||||
| 		neutral_node = "technic:insulator_clip", | ||||
| 		recipe = { | ||||
| 			"NEUTRAL_NODE", | ||||
| 			"MAIN_DYE" | ||||
| 		} | ||||
| 	}) | ||||
|  | ||||
| 	unifieddyes.register_color_craft({ | ||||
| 		output = "technic:steel_strut_with_insulator_clip", | ||||
| 		palette = "wallmounted", | ||||
| 		type = "shapeless", | ||||
| 		neutral_node = "", | ||||
| 		recipe = { | ||||
| 			"technic:steel_strut_with_insulator_clip", | ||||
| 			"MAIN_DYE" | ||||
| 		} | ||||
| 	}) | ||||
|  | ||||
| 	if steelmod then | ||||
| 		unifieddyes.register_color_craft({ | ||||
| 			output = "technic:steel_strut_with_insulator_clip", | ||||
| 			palette = "wallmounted", | ||||
| 			neutral_node = "", | ||||
| 			recipe = { | ||||
| 				{ "technic:insulator_clip_fencepost", "MAIN_DYE" }, | ||||
| 				{ "steel:strut_mount",                ""         }, | ||||
| 			} | ||||
| 		}) | ||||
| 	end | ||||
|  | ||||
| 	if streetsmod then | ||||
| 		unifieddyes.register_color_craft({ | ||||
| 			output = "technic:steel_strut_with_insulator_clip", | ||||
| 			palette = "wallmounted", | ||||
| 			neutral_node = "technic:steel_strut_with_insulator_clip", | ||||
| 			recipe = { | ||||
| 				{ "technic:insulator_clip_fencepost", "MAIN_DYE"            }, | ||||
| 				{ "streets:steel_support",            "default:steel_ingot" }, | ||||
| 			} | ||||
| 		}) | ||||
| 	end | ||||
| end | ||||
| 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") | ||||
|   | ||||
| @@ -1,9 +0,0 @@ | ||||
| # German Translation for technic_extranodes | ||||
| # Deutsche Übersetzung von technic_extranodes | ||||
| # by Xanthin | ||||
|  | ||||
| Marble = Marmor | ||||
| Marble Bricks = Marmorziegel | ||||
| Granite = Granit | ||||
| Concrete = Beton | ||||
|  | ||||
| @@ -1,7 +0,0 @@ | ||||
| # technic_extranodes traducido por Carlos Barraza | ||||
|  | ||||
| Marble = Mármol | ||||
| Marble Bricks = Ladrillos de mármol | ||||
| Granite = Granito | ||||
| Concrete = Concreto | ||||
|  | ||||
| @@ -1,7 +0,0 @@ | ||||
| # technic_extranodes translation template | ||||
|  | ||||
| Marble          = Marbre | ||||
| Marble Bricks   = Briques en marbre | ||||
| Granite         = Granite | ||||
| Concrete        = Béton | ||||
|  | ||||
| @@ -1,9 +0,0 @@ | ||||
| # Polish Translation for technic_extranodes | ||||
| # Polskie tłumaczenie technic_extranodes | ||||
| # by mat9117 | ||||
|  | ||||
| Marble = Marmur | ||||
| Marble Bricks = Marmurowe cegły | ||||
| Granite = Granit | ||||
| Concrete = Beton | ||||
|  | ||||
| @@ -1,9 +0,0 @@ | ||||
| # Braziliam portuguese translation for technic_extranodes | ||||
| # Tradução portuguesa brasileira para technic_extranodes | ||||
| # By Sires | ||||
|  | ||||
| Marble = Mármore | ||||
| Marble Bricks = Tijolos de Mármore | ||||
| Granite = Granito | ||||
| Concrete = Concreto | ||||
|  | ||||
| @@ -1,7 +0,0 @@ | ||||
| # technic_extranodes translation template | ||||
|  | ||||
| Marble = | ||||
| Marble Bricks = | ||||
| Granite = | ||||
| Concrete = | ||||
|  | ||||
| @@ -1,6 +0,0 @@ | ||||
| # turkish translation by mahmutelmas06 | ||||
|  | ||||
| Marble = Mermer | ||||
| Marble Bricks = Mermer tuğla | ||||
| Granite = Granit | ||||
| Concrete = Beton | ||||
| @@ -1,3 +0,0 @@ | ||||
| name = extranodes | ||||
| depends = default, technic_worldgen, basic_materials, concrete | ||||
| optional_depends = unifieddyes, intllib, moreblocks, steel, streetsmod | ||||
| @@ -1,173 +0,0 @@ | ||||
| # Blender v2.72 (sub 0) OBJ File: '' | ||||
| # www.blender.org | ||||
| o Cube | ||||
| v -0.500000 -0.500000 0.500000 | ||||
| v -0.500000 -0.500000 -0.500000 | ||||
| v 0.500000 -0.500000 -0.500000 | ||||
| v 0.500000 -0.500000 0.500000 | ||||
| v -0.249997 0.500000 0.249997 | ||||
| v -0.249997 0.500000 -0.249997 | ||||
| v 0.249997 0.500000 -0.249997 | ||||
| v 0.249997 0.500000 0.249997 | ||||
| v -0.187500 0.500000 0.187500 | ||||
| v -0.187500 0.500000 -0.187500 | ||||
| v 0.187500 0.500000 -0.187500 | ||||
| v 0.187500 0.500000 0.187500 | ||||
| v -0.187500 0.750000 0.187500 | ||||
| v -0.187500 0.750000 -0.187500 | ||||
| v 0.187500 0.750000 -0.187500 | ||||
| v 0.187500 0.750000 0.187500 | ||||
| v -0.250000 0.750000 0.250000 | ||||
| v -0.250000 0.750000 -0.250000 | ||||
| v 0.250000 0.750000 -0.250000 | ||||
| v 0.250000 0.750000 0.250000 | ||||
| v -0.250000 1.250000 0.250000 | ||||
| v -0.250000 1.250000 -0.250000 | ||||
| v 0.250000 1.250000 -0.250000 | ||||
| v 0.250000 1.250000 0.250000 | ||||
| v -0.500000 0.312500 0.500000 | ||||
| v -0.500000 0.312500 -0.500000 | ||||
| v 0.500000 0.312500 -0.500000 | ||||
| v 0.500000 0.312500 0.500000 | ||||
| v 0.187500 0.625000 0.187500 | ||||
| v 0.187500 0.625000 -0.187500 | ||||
| v -0.187500 0.625000 -0.187500 | ||||
| v -0.187500 0.625000 0.187500 | ||||
| v 0.187500 0.562500 0.187500 | ||||
| v 0.187500 0.687500 -0.187500 | ||||
| v -0.187500 0.687500 -0.187500 | ||||
| v -0.187500 0.562500 0.187500 | ||||
| v 0.187500 0.687500 0.187500 | ||||
| v 0.187500 0.562500 -0.187500 | ||||
| v -0.187500 0.562500 -0.187500 | ||||
| v -0.187500 0.687500 0.187500 | ||||
| v 0.168668 0.531250 0.168668 | ||||
| v 0.168668 0.718750 -0.168668 | ||||
| v -0.168668 0.718750 -0.168668 | ||||
| v -0.168668 0.531250 0.168668 | ||||
| v 0.168668 0.656250 0.168668 | ||||
| v 0.168668 0.593750 -0.168668 | ||||
| v -0.168668 0.593750 -0.168668 | ||||
| v -0.168668 0.656250 0.168668 | ||||
| v 0.168668 0.593750 0.168668 | ||||
| v 0.168668 0.656250 -0.168668 | ||||
| v -0.168668 0.656250 -0.168668 | ||||
| v -0.168668 0.593750 0.168668 | ||||
| v 0.168668 0.718750 0.168668 | ||||
| v 0.168668 0.531250 -0.168668 | ||||
| v -0.168668 0.531250 -0.168668 | ||||
| v -0.168668 0.718750 0.168668 | ||||
| vt 1.000000 0.000000 | ||||
| vt 1.000000 1.000000 | ||||
| vt 0.000000 1.000000 | ||||
| vt 0.000000 0.000000 | ||||
| vt 0.749997 0.749997 | ||||
| vt 0.749997 0.250003 | ||||
| vt 0.250003 0.250003 | ||||
| vt 0.250003 0.749997 | ||||
| vt 0.000000 0.812500 | ||||
| vt 1.000000 0.812500 | ||||
| vt 0.312500 0.312500 | ||||
| vt 0.312500 0.687500 | ||||
| vt 0.687500 0.312500 | ||||
| vt 0.687500 0.687500 | ||||
| vt 0.331332 1.218750 | ||||
| vt 0.668668 1.218750 | ||||
| vt 0.687500 1.250000 | ||||
| vt 0.312500 1.250000 | ||||
| vt 0.750000 1.250000 | ||||
| vt 0.750000 1.750000 | ||||
| vt 0.250000 1.750000 | ||||
| vt 0.250000 1.250000 | ||||
| vt 0.331332 1.093750 | ||||
| vt 0.668668 1.093750 | ||||
| vt 0.687500 1.125000 | ||||
| vt 0.312500 1.125000 | ||||
| vt 0.331332 1.093750 | ||||
| vt 0.668668 1.093750 | ||||
| vt 0.331332 1.156250 | ||||
| vt 0.668668 1.156250 | ||||
| vt 0.687500 1.187500 | ||||
| vt 0.312500 1.187500 | ||||
| vt 0.331332 1.156250 | ||||
| vt 0.668668 1.156250 | ||||
| vt 0.331332 1.031250 | ||||
| vt 0.668668 1.031250 | ||||
| vt 0.687500 1.062500 | ||||
| vt 0.312500 1.062500 | ||||
| vt 0.312500 1.000000 | ||||
| vt 0.687500 1.000000 | ||||
| vn 0.000000 -1.000000 -0.000000 | ||||
| vn -0.600000 0.800000 -0.000000 | ||||
| vn 0.000000 0.800000 -0.600000 | ||||
| vn 0.600000 0.800000 0.000000 | ||||
| vn -0.000000 0.000000 1.000000 | ||||
| vn 0.000000 1.000000 0.000000 | ||||
| vn 0.856500 -0.516200 0.000000 | ||||
| vn 0.000000 -0.516200 -0.856500 | ||||
| vn -0.000000 -0.516200 0.856500 | ||||
| vn -0.856500 -0.516200 -0.000000 | ||||
| vn -1.000000 0.000000 -0.000000 | ||||
| vn 0.000000 -0.000000 -1.000000 | ||||
| vn 1.000000 -0.000000 0.000000 | ||||
| vn -0.000000 0.800000 0.600000 | ||||
| vn 0.856500 0.516200 0.000000 | ||||
| vn 0.000000 0.516200 -0.856500 | ||||
| vn -0.000000 0.516200 0.856500 | ||||
| vn -0.856500 0.516200 -0.000000 | ||||
| g Cube_Cube_Material | ||||
| s off | ||||
| f 1/1/1 2/2/1 3/3/1 4/4/1 | ||||
| f 25/2/2 5/5/2 6/6/2 26/1/2 | ||||
| f 26/1/3 6/6/3 7/7/3 27/4/3 | ||||
| f 27/4/4 7/7/4 8/8/4 28/3/4 | ||||
| f 25/9/5 1/4/5 4/1/5 28/10/5 | ||||
| f 8/8/6 7/7/6 11/11/6 12/12/6 | ||||
| f 7/7/6 6/6/6 10/13/6 11/11/6 | ||||
| f 5/5/6 8/8/6 12/12/6 9/14/6 | ||||
| f 6/6/6 5/5/6 9/14/6 10/13/6 | ||||
| f 53/15/7 42/16/7 15/17/7 16/18/7 | ||||
| f 42/15/8 43/16/8 14/17/8 15/18/8 | ||||
| f 56/15/9 53/16/9 16/17/9 13/18/9 | ||||
| f 43/15/10 56/16/10 13/17/10 14/18/10 | ||||
| f 14/4/1 18/4/1 19/4/1 15/4/1 | ||||
| f 17/19/11 21/20/11 22/21/11 18/22/11 | ||||
| f 18/19/12 22/20/12 23/21/12 19/22/12 | ||||
| f 19/19/13 23/20/13 24/21/13 20/22/13 | ||||
| f 21/21/5 17/22/5 20/19/5 24/20/5 | ||||
| f 21/5/6 24/8/6 23/7/6 22/6/6 | ||||
| f 15/4/1 19/4/1 20/4/1 16/4/1 | ||||
| f 16/4/1 20/4/1 17/4/1 13/4/1 | ||||
| f 13/4/1 17/4/1 18/4/1 14/4/1 | ||||
| f 1/1/11 25/10/11 26/9/11 2/4/11 | ||||
| f 2/1/12 26/10/12 27/9/12 3/4/12 | ||||
| f 3/1/13 27/10/13 28/9/13 4/4/13 | ||||
| f 5/5/14 25/2/14 28/3/14 8/8/14 | ||||
| f 49/23/7 46/24/7 30/25/7 29/26/7 | ||||
| f 46/27/8 47/28/8 31/25/8 30/26/8 | ||||
| f 52/23/9 49/24/9 29/25/9 32/26/9 | ||||
| f 47/23/10 52/24/10 32/25/10 31/26/10 | ||||
| f 45/29/7 50/30/7 34/31/7 37/32/7 | ||||
| f 50/33/8 51/34/8 35/31/8 34/32/8 | ||||
| f 48/33/9 45/34/9 37/31/9 40/32/9 | ||||
| f 51/29/10 48/30/10 40/31/10 35/32/10 | ||||
| f 41/35/7 54/36/7 38/37/7 33/38/7 | ||||
| f 54/35/8 55/36/8 39/37/8 38/38/8 | ||||
| f 44/35/9 41/36/9 33/37/9 36/38/9 | ||||
| f 55/35/10 44/36/10 36/37/10 39/38/10 | ||||
| f 37/32/15 34/31/15 42/16/15 53/15/15 | ||||
| f 34/32/16 35/31/16 43/16/16 42/15/16 | ||||
| f 40/32/17 37/31/17 53/16/17 56/15/17 | ||||
| f 35/32/18 40/31/18 56/16/18 43/15/18 | ||||
| f 33/38/15 38/37/15 46/24/15 49/23/15 | ||||
| f 38/38/16 39/37/16 47/28/16 46/27/16 | ||||
| f 36/38/17 33/37/17 49/24/17 52/23/17 | ||||
| f 39/38/18 36/37/18 52/24/18 47/23/18 | ||||
| f 29/26/15 30/25/15 50/30/15 45/29/15 | ||||
| f 30/26/16 31/25/16 51/34/16 50/33/16 | ||||
| f 32/26/17 29/25/17 45/34/17 48/33/17 | ||||
| f 31/26/18 32/25/18 48/30/18 51/29/18 | ||||
| f 12/39/15 11/40/15 54/36/15 41/35/15 | ||||
| f 11/39/16 10/40/16 55/36/16 54/35/16 | ||||
| f 9/39/17 12/40/17 41/36/17 44/35/17 | ||||
| f 10/39/18 9/40/18 44/36/18 55/35/18 | ||||
| @@ -1,246 +0,0 @@ | ||||
| # Blender v2.79 (sub 0) OBJ File: 'technic steel strut with insulator clip.blend' | ||||
| # www.blender.org | ||||
| o Cube_Cube_Material.001 | ||||
| v -0.375000 0.500532 -0.250000 | ||||
| v -0.249997 0.562500 -0.249997 | ||||
| v 0.249997 0.562500 -0.249997 | ||||
| v 0.375000 0.500532 -0.250000 | ||||
| v 0.249997 0.562500 0.249997 | ||||
| v 0.375000 0.500532 0.250000 | ||||
| v -0.249997 0.562500 0.249997 | ||||
| v -0.375000 0.500532 0.250000 | ||||
| v 0.187500 0.562500 -0.187500 | ||||
| v -0.168668 0.718750 0.168668 | ||||
| v 0.168668 0.718750 0.168668 | ||||
| v 0.187500 0.750000 0.187500 | ||||
| v -0.187500 0.750000 0.187500 | ||||
| v 0.168668 0.718750 -0.168668 | ||||
| v 0.187500 0.750000 -0.187500 | ||||
| v -0.168668 0.718750 -0.168668 | ||||
| v -0.187500 0.750000 -0.187500 | ||||
| v 0.250000 0.750000 -0.250000 | ||||
| v 0.250000 0.750000 0.250000 | ||||
| v -0.250000 0.750000 -0.250000 | ||||
| v -0.250000 1.250000 -0.250000 | ||||
| v 0.250000 1.250000 -0.250000 | ||||
| v 0.250000 1.250000 0.250000 | ||||
| v -0.250000 1.250000 0.250000 | ||||
| v -0.250000 0.750000 0.250000 | ||||
| v -0.168668 0.593750 0.168668 | ||||
| v 0.168668 0.593750 0.168668 | ||||
| v 0.187500 0.625000 0.187500 | ||||
| v -0.187500 0.625000 0.187500 | ||||
| v 0.168668 0.593750 -0.168668 | ||||
| v 0.187500 0.625000 -0.187500 | ||||
| v -0.168668 0.593750 -0.168668 | ||||
| v -0.187500 0.625000 -0.187500 | ||||
| v -0.168668 0.656250 0.168668 | ||||
| v 0.168668 0.656250 0.168668 | ||||
| v 0.187500 0.687500 0.187500 | ||||
| v -0.187500 0.687500 0.187500 | ||||
| v 0.168668 0.656250 -0.168668 | ||||
| v 0.187500 0.687500 -0.187500 | ||||
| v -0.168668 0.656250 -0.168668 | ||||
| v -0.187500 0.687500 -0.187500 | ||||
| v 0.187500 0.562500 0.187500 | ||||
| v -0.187500 0.562500 0.187500 | ||||
| v -0.187500 0.562500 -0.187500 | ||||
| v -0.499468 -0.499468 -0.499468 | ||||
| v -0.499468 0.500000 -0.499468 | ||||
| v 0.499468 -0.499468 -0.499468 | ||||
| v -0.499468 -0.499468 0.499468 | ||||
| v -0.499468 0.500000 0.499468 | ||||
| v 0.499468 -0.499468 0.499468 | ||||
| v 0.499468 0.500000 -0.499468 | ||||
| v 0.499468 0.500000 0.499468 | ||||
| vt 1.000000 0.875000 | ||||
| vt 0.937500 0.750000 | ||||
| vt 0.937500 0.250000 | ||||
| vt 1.000000 0.125000 | ||||
| vt 0.250000 0.875000 | ||||
| vt 0.250000 0.750000 | ||||
| vt 0.750000 0.750000 | ||||
| vt 0.750000 0.875000 | ||||
| vt 0.000000 0.125000 | ||||
| vt 0.062500 0.250000 | ||||
| vt 0.062500 0.750000 | ||||
| vt 0.000000 0.875000 | ||||
| vt 0.750000 0.250000 | ||||
| vt 0.687500 0.687500 | ||||
| vt 0.687500 0.312500 | ||||
| vt 0.312500 0.687500 | ||||
| vt 0.250000 0.250000 | ||||
| vt 0.312500 0.312500 | ||||
| vt 0.331332 1.218750 | ||||
| vt 0.668668 1.218750 | ||||
| vt 0.687500 1.250000 | ||||
| vt 0.312500 1.250000 | ||||
| vt 0.531250 0.666667 | ||||
| vt 0.531250 0.333333 | ||||
| vt 0.500000 0.312500 | ||||
| vt 0.500000 0.687500 | ||||
| vt 0.531250 0.333333 | ||||
| vt 0.531250 0.666667 | ||||
| vt 0.500000 0.687500 | ||||
| vt 0.500000 0.312500 | ||||
| vt 0.331332 1.218750 | ||||
| vt 0.668668 1.218750 | ||||
| vt 0.687500 1.250000 | ||||
| vt 0.312500 1.250000 | ||||
| vt 0.687500 0.312500 | ||||
| vt 0.750000 0.250000 | ||||
| vt 0.750000 0.750000 | ||||
| vt 0.687500 0.687500 | ||||
| vt 0.500000 0.250000 | ||||
| vt 0.500000 0.750000 | ||||
| vt 0.000000 0.750000 | ||||
| vt 0.000000 0.250000 | ||||
| vt 0.500000 0.250000 | ||||
| vt 0.000000 0.250000 | ||||
| vt 0.000000 0.750000 | ||||
| vt 0.500000 0.750000 | ||||
| vt 0.500000 0.250000 | ||||
| vt 0.500000 0.750000 | ||||
| vt 0.000000 0.750000 | ||||
| vt 0.000000 0.250000 | ||||
| vt 0.000000 0.250000 | ||||
| vt 0.500000 0.750000 | ||||
| vt 0.250000 0.250000 | ||||
| vt 0.750000 0.250000 | ||||
| vt 0.750000 0.750000 | ||||
| vt 0.250000 0.750000 | ||||
| vt 0.250000 0.750000 | ||||
| vt 0.312500 0.687500 | ||||
| vt 0.250000 0.250000 | ||||
| vt 0.312500 0.312500 | ||||
| vt 0.250000 0.125000 | ||||
| vt 0.750000 0.125000 | ||||
| vt 0.331332 1.093750 | ||||
| vt 0.668668 1.093750 | ||||
| vt 0.687500 1.125000 | ||||
| vt 0.312500 1.125000 | ||||
| vt 0.656250 0.666667 | ||||
| vt 0.656250 0.333333 | ||||
| vt 0.625000 0.312500 | ||||
| vt 0.625000 0.687500 | ||||
| vt 0.656250 0.333333 | ||||
| vt 0.656250 0.666667 | ||||
| vt 0.625000 0.687500 | ||||
| vt 0.625000 0.312500 | ||||
| vt 0.331332 1.093750 | ||||
| vt 0.668668 1.093750 | ||||
| vt 0.687500 1.125000 | ||||
| vt 0.312500 1.125000 | ||||
| vt 0.331332 1.156250 | ||||
| vt 0.668668 1.156250 | ||||
| vt 0.687500 1.187500 | ||||
| vt 0.312500 1.187500 | ||||
| vt 0.593750 0.666667 | ||||
| vt 0.593750 0.333333 | ||||
| vt 0.562500 0.312500 | ||||
| vt 0.562500 0.687500 | ||||
| vt 0.593750 0.333333 | ||||
| vt 0.593750 0.666667 | ||||
| vt 0.562500 0.687500 | ||||
| vt 0.562500 0.312500 | ||||
| vt 0.331332 1.156250 | ||||
| vt 0.668668 1.156250 | ||||
| vt 0.687500 1.187500 | ||||
| vt 0.312500 1.187500 | ||||
| vt 0.312500 1.062500 | ||||
| vt 0.687500 1.062500 | ||||
| vt 0.687500 0.312500 | ||||
| vt 0.687500 0.312500 | ||||
| vt 0.687500 0.687500 | ||||
| vt 0.312500 1.062500 | ||||
| vt 0.687500 1.062500 | ||||
| vt 0.000000 0.750000 | ||||
| vt 0.000000 0.250000 | ||||
| vt 1.000000 0.250000 | ||||
| vt 1.000000 0.750000 | ||||
| vt 1.000000 1.000000 | ||||
| vt -0.000000 1.000000 | ||||
| vt 0.000000 -0.000000 | ||||
| vt 1.000000 -0.000000 | ||||
| vt 1.000000 1.000000 | ||||
| vt -0.000000 1.000000 | ||||
| vt 0.000000 -0.000000 | ||||
| vt 1.000000 -0.000000 | ||||
| vt 0.000000 1.000000 | ||||
| vt 0.000000 0.000000 | ||||
| vt 1.000000 0.000000 | ||||
| vt 1.000000 1.000000 | ||||
| vt 1.000000 -0.000000 | ||||
| vt 1.000000 1.000000 | ||||
| vt 1.000000 1.000000 | ||||
| vt 0.000000 0.000000 | ||||
| vt -0.000000 0.000000 | ||||
| vn 0.0000 0.0000 -1.0000 | ||||
| vn 0.4442 0.8960 -0.0000 | ||||
| vn 0.0000 0.0000 1.0000 | ||||
| vn 0.0000 1.0000 -0.0000 | ||||
| vn 0.0000 -0.5161 0.8565 | ||||
| vn 0.8565 -0.5161 0.0000 | ||||
| vn -0.8565 -0.5161 0.0000 | ||||
| vn 0.0000 -0.5161 -0.8565 | ||||
| vn -0.0000 -1.0000 -0.0000 | ||||
| vn 1.0000 -0.0000 0.0000 | ||||
| vn -1.0000 0.0000 -0.0000 | ||||
| vn -0.4442 0.8960 -0.0000 | ||||
| vn -0.0000 0.5161 0.8565 | ||||
| vn 0.8565 0.5161 -0.0000 | ||||
| vn -0.8565 0.5161 -0.0000 | ||||
| vn 0.0000 0.5161 -0.8565 | ||||
| g Cube_Cube_Material.001_Cube_Cube_Material.001_clip | ||||
| s 1 | ||||
| f 1/1/1 2/2/1 3/3/1 4/4/1 | ||||
| f 4/5/2 3/6/2 5/7/2 6/8/2 | ||||
| f 6/9/3 5/10/3 7/11/3 8/12/3 | ||||
| f 7/13/4 5/7/4 42/14/4 43/15/4 | ||||
| f 5/7/4 3/6/4 9/16/4 42/14/4 | ||||
| f 2/17/4 7/13/4 43/15/4 44/18/4 | ||||
| f 3/6/4 2/17/4 44/18/4 9/16/4 | ||||
| f 10/19/5 11/20/5 12/21/5 13/22/5 | ||||
| f 11/23/6 14/24/6 15/25/6 12/26/6 | ||||
| f 16/27/7 10/28/7 13/29/7 17/30/7 | ||||
| f 14/31/8 16/32/8 17/33/8 15/34/8 | ||||
| f 15/35/9 18/36/9 19/37/9 12/38/9 | ||||
| f 20/39/1 21/40/1 22/41/1 18/42/1 | ||||
| f 18/43/10 22/44/10 23/45/10 19/46/10 | ||||
| f 19/47/3 23/48/3 24/49/3 25/50/3 | ||||
| f 21/51/11 20/39/11 25/52/11 24/49/11 | ||||
| f 21/53/4 24/54/4 23/55/4 22/56/4 | ||||
| f 12/38/9 19/37/9 25/57/9 13/58/9 | ||||
| f 13/58/9 25/57/9 20/59/9 17/60/9 | ||||
| f 17/60/9 20/59/9 18/36/9 15/35/9 | ||||
| f 2/17/12 1/61/12 8/62/12 7/13/12 | ||||
| f 26/63/5 27/64/5 28/65/5 29/66/5 | ||||
| f 27/67/6 30/68/6 31/69/6 28/70/6 | ||||
| f 32/71/7 26/72/7 29/73/7 33/74/7 | ||||
| f 30/75/8 32/76/8 33/77/8 31/78/8 | ||||
| f 34/79/5 35/80/5 36/81/5 37/82/5 | ||||
| f 35/83/6 38/84/6 39/85/6 36/86/6 | ||||
| f 40/87/7 34/88/7 37/89/7 41/90/7 | ||||
| f 38/91/8 40/92/8 41/93/8 39/94/8 | ||||
| f 37/82/13 36/81/13 11/20/13 10/19/13 | ||||
| f 36/86/14 39/85/14 14/24/14 11/23/14 | ||||
| f 41/90/15 37/89/15 10/28/15 16/27/15 | ||||
| f 39/94/16 41/93/16 16/32/16 14/31/16 | ||||
| f 43/95/13 42/96/13 27/64/13 26/63/13 | ||||
| f 42/14/14 9/97/14 30/68/14 27/67/14 | ||||
| f 44/98/15 43/99/15 26/72/15 32/71/15 | ||||
| f 9/100/16 44/101/16 32/76/16 30/75/16 | ||||
| f 29/66/13 28/65/13 35/80/13 34/79/13 | ||||
| f 28/70/14 31/69/14 38/84/14 35/83/14 | ||||
| f 33/74/15 29/73/15 34/88/15 40/87/15 | ||||
| f 31/78/16 33/77/16 40/92/16 38/91/16 | ||||
| f 8/102/9 1/103/9 4/104/9 6/105/9 | ||||
| g Cube_Cube_Material.001_Cube_Cube_Material.001_sides_with_band | ||||
| s off | ||||
| f 47/106/10 51/107/10 52/108/10 50/109/10 | ||||
| f 48/110/11 49/111/11 46/112/11 45/113/11 | ||||
| f 47/114/9 50/115/9 48/116/9 45/117/9 | ||||
| f 51/118/4 46/112/4 49/111/4 52/119/4 | ||||
| g Cube_Cube_Material.001_Cube_Cube_Material.001_sides_without_band | ||||
| f 45/113/1 46/120/1 51/107/1 47/121/1 | ||||
| f 50/109/3 52/119/3 49/111/3 48/122/3 | ||||
| Before Width: | Height: | Size: 202 B | 
| Before Width: | Height: | Size: 103 B | 
| @@ -1 +0,0 @@ | ||||
| name = technic | ||||
							
								
								
									
										1
									
								
								modpack.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
|  | ||||
| @@ -1,38 +0,0 @@ | ||||
| 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 | ||||
|  | ||||
| leftshift (CC BY-SA 3.0): | ||||
|   * technic_river_water_can.png | ||||
|  | ||||
| RealBadAngel: (WTFPL) | ||||
|   * Everything else. | ||||
|  | ||||
| CC BY-SA 3.0: <http://creativecommons.org/licenses/by-sa/3.0/> | ||||
|  | ||||
| Sound licenses: | ||||
|  | ||||
| veikk0 (Veikko Mäkelä) (CC BY-SA 4.0): | ||||
|   * technic_hv_nuclear_reactor_siren_danger_loop.ogg | ||||
|     * Derived from "Nuclear alarm.wav" by Freesound.org user rene___ from <https://freesound.org/people/rene___/sounds/56778/>. Originally licensed under CC0 1.0 <https://creativecommons.org/publicdomain/zero/1.0/> | ||||
|  | ||||
| CC BY-SA 4.0: <https://creativecommons.org/licenses/by-sa/4.0/> | ||||
| @@ -1,4 +1,7 @@ | ||||
| technic.config = technic.config or Settings(minetest.get_worldpath().."/technic.conf") | ||||
|  | ||||
| local worldpath = minetest.get_worldpath() | ||||
|  | ||||
| technic.config = Settings(worldpath.."/technic.conf") | ||||
|  | ||||
| local conf_table = technic.config:to_table() | ||||
|  | ||||
| @@ -6,13 +9,10 @@ local defaults = { | ||||
| 	enable_mining_drill = "true", | ||||
| 	enable_mining_laser = "true", | ||||
| 	enable_flashlight = "false", | ||||
| 	enable_rubber_tree_generation = "true", | ||||
| 	enable_marble_generation = "true", | ||||
| 	enable_granite_generation = "true", | ||||
| 	enable_wind_mill = "false", | ||||
| 	enable_frames = "false", | ||||
| 	enable_corium_griefing = "true", | ||||
| 	enable_radiation_protection = "true", | ||||
| 	enable_entity_radiation_damage = "true", | ||||
| 	enable_longterm_radiation_damage = "true", | ||||
| 	enable_nuclear_reactor_digiline_selfdestruct = "false", | ||||
| } | ||||
|  | ||||
| for k, v in pairs(defaults) do | ||||
| @@ -20,3 +20,7 @@ for k, v in pairs(defaults) do | ||||
| 		technic.config:set(k, v) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- Create the config file if it doesn't exist | ||||
| technic.config:write() | ||||
|  | ||||
|   | ||||
| @@ -1,57 +1,57 @@ | ||||
| -- check if we have the necessary dependencies to allow actually using these materials in the crafts | ||||
| local mesecons_materials = minetest.get_modpath("mesecons_materials") | ||||
|  | ||||
| -- Remove some recipes | ||||
| -- Bronze | ||||
| minetest.clear_craft({ | ||||
| 	type = "shapeless", | ||||
| 	output = "default:bronze_ingot" | ||||
| }) | ||||
|  | ||||
| -- Accelerator tube | ||||
| if pipeworks.enable_accelerator_tube then | ||||
| 	minetest.clear_craft({ | ||||
| 		output = "pipeworks:accelerator_tube_1", | ||||
| 	}) | ||||
|  | ||||
| 	minetest.register_craft({ | ||||
| 		output = 'pipeworks:accelerator_tube_1', | ||||
| 		recipe = { | ||||
| 			{'technic:copper_coil', 'pipeworks:tube_1', 'technic:copper_coil'}, | ||||
| 			} | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| -- Teleport tube | ||||
| if pipeworks.enable_teleport_tube then | ||||
| 	minetest.clear_craft({ | ||||
| 		output = "pipeworks:teleport_tube_1", | ||||
| 	}) | ||||
|  | ||||
| 	minetest.register_craft({ | ||||
| 		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'}, | ||||
| 			} | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| -- basic materials' brass ingot | ||||
|  | ||||
| minetest.clear_craft({ | ||||
| 	output = "basic_materials:brass_ingot", | ||||
| }) | ||||
|  | ||||
| minetest.register_craft( { | ||||
| 	type = "shapeless", | ||||
| 	output = "basic_materials:brass_ingot 9", | ||||
| 	recipe = { "basic_materials:brass_block" }, | ||||
| }) | ||||
|  | ||||
| -- tubes crafting recipes | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'pipeworks:tube_000000 9', | ||||
| 	recipe = { | ||||
| 		{'technic:stainless_steel_ingot', 'default:glass', 'technic:stainless_steel_ingot'}, | ||||
| 		{'technic:stainless_steel_ingot', 'default:glass', 'technic:stainless_steel_ingot'}, | ||||
| 		{'technic:stainless_steel_ingot', 'default:glass', 'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
| minetest.register_craft({ | ||||
| 	output = 'pipeworks:mese_tube_000000', | ||||
| 	recipe = { | ||||
| 		{'default:mese_crystal_fragment', 'pipeworks:tube_000000', 'default:mese_crystal_fragment'}, | ||||
| 		} | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
|     output = 'pipeworks:accelerator_tube_000000', | ||||
|     recipe = { | ||||
|         {'technic:copper_coil', 'pipeworks:tube_000000', 'technic:copper_coil'}, | ||||
|         } | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
|     output = 'pipeworks:detector_tube_off_000000', | ||||
|     recipe = { | ||||
|         {'mesecons:mesecon', 'pipeworks:tube_000000', 'mesecons:mesecon'}, | ||||
|         } | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
|     output = 'pipeworks:sand_tube_000000', | ||||
|     recipe = { | ||||
|         {'default:sand', 'pipeworks:tube_000000', 'default:sand'}, | ||||
|         } | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
|     output = 'pipeworks:mese_sand_tube_000000', | ||||
|     recipe = { | ||||
|         {'default:mese_crystal_fragment', 'pipeworks:sand_tube_000000', 'default:mese_crystal_fragment'}, | ||||
|         } | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
|     output = 'pipeworks:teleport_tube_000000', | ||||
|     recipe = { | ||||
|         {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'}, | ||||
|         {'pipeworks:tube_000000', 'technic:control_logic_unit', 'pipeworks:tube_000000'}, | ||||
|         {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'}, | ||||
|         } | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:diamond_drill_head', | ||||
| 	recipe = { | ||||
| @@ -73,60 +73,70 @@ minetest.register_craft({ | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:blue_energy_crystal', | ||||
| 	recipe = { | ||||
| 		{'moreores:mithril_ingot', 'technic:battery', 'dye:blue'}, | ||||
| 		{'default:gold_ingot', 'technic:battery', 'dye:blue'}, | ||||
| 		{'technic:battery', 'technic:green_energy_crystal', 'technic:battery'}, | ||||
| 		{'dye:blue', 'technic:battery', 'moreores:mithril_ingot'}, | ||||
| 		{'dye:blue', 'technic:battery', 'default:gold_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:red_energy_crystal', | ||||
| 	recipe = { | ||||
| 		{'moreores:silver_ingot', 'technic:battery', 'dye:red'}, | ||||
| 		{'technic:battery', 'basic_materials:energy_crystal_simple', 'technic:battery'}, | ||||
| 		{'dye:red', 'technic:battery', 'moreores:silver_ingot'}, | ||||
| 		{'default:gold_ingot', 'technic:battery', 'dye:red'}, | ||||
| 		{'technic:battery', 'default:diamondblock', 'technic:battery'}, | ||||
| 		{'dye:red', 'technic:battery', 'default:gold_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:copper_coil 1', | ||||
| 	recipe = { | ||||
| 		{'basic_materials:copper_wire', 'technic:wrought_iron_ingot', 'basic_materials:copper_wire'}, | ||||
| 		{'technic:wrought_iron_ingot', '', 'technic:wrought_iron_ingot'}, | ||||
| 		{'basic_materials:copper_wire', 'technic:wrought_iron_ingot', 'basic_materials:copper_wire'}, | ||||
| 	}, | ||||
| 	replacements = { | ||||
| 		{"basic_materials:copper_wire", "basic_materials:empty_spool"}, | ||||
| 		{"basic_materials:copper_wire", "basic_materials:empty_spool"}, | ||||
| 		{"basic_materials:copper_wire", "basic_materials:empty_spool"}, | ||||
| 		{"basic_materials:copper_wire", "basic_materials:empty_spool"} | ||||
| 	}, | ||||
| 		{'technic:fine_copper_wire', 'default:steel_ingot', 'technic:fine_copper_wire'}, | ||||
| 		{'default:steel_ingot', '', 'default:steel_ingot'}, | ||||
| 		{'technic:fine_copper_wire', 'default:steel_ingot', 'technic:fine_copper_wire'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| local isolation = mesecons_materials and "mesecons_materials:fiber" or "technic:rubber" | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:motor', | ||||
| 	recipe = { | ||||
| 		{'default:steel_ingot', 'technic:copper_coil', 'default:steel_ingot'}, | ||||
| 		{'default:steel_ingot', 'technic:copper_coil', 'default:steel_ingot'}, | ||||
| 		{'default:steel_ingot', 'default:copper_ingot', 'default:steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| 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'}, | ||||
| 		{'default:iron_lump',   'default:iron_lump', 'default:iron_lump'}, | ||||
| 		{'technic:copper_coil', 'default:iron_lump', 'technic:copper_coil'}, | ||||
| 		{'default:iron_lump',   'default:iron_lump', 'default:iron_lump'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| 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'}, | ||||
| 		{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, | ||||
| 		{'technic:copper_coil', 'default:steel_ingot', 'technic:copper_coil'}, | ||||
| 		{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:hv_transformer', | ||||
| 	recipe = { | ||||
| 		{isolation,                       'technic:stainless_steel_ingot', isolation}, | ||||
| 		{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, | ||||
| 		{'technic:copper_coil',           'technic:stainless_steel_ingot', 'technic:copper_coil'}, | ||||
| 		{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| @@ -135,11 +145,10 @@ minetest.register_craft({ | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:control_logic_unit', | ||||
| 	recipe = { | ||||
| 		{'', 'basic_materials:gold_wire', ''}, | ||||
| 		{'', 'default:gold_ingot', ''}, | ||||
| 		{'default:copper_ingot', 'technic:silicon_wafer', 'default:copper_ingot'}, | ||||
| 		{'', 'technic:chromium_ingot', ''}, | ||||
| 	}, | ||||
| 	replacements = { {"basic_materials:gold_wire", "basic_materials:empty_spool"}, }, | ||||
| 		{'', 'default:copper_ingot', ''}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| @@ -147,7 +156,7 @@ minetest.register_craft({ | ||||
| 	recipe = { | ||||
| 		{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, | ||||
| 		{'default:bronze_ingot',          'default:bronze_ingot',          'default:bronze_ingot'}, | ||||
| 		{'default:tin_ingot',             'default:tin_ingot',             'default:tin_ingot'}, | ||||
| 		{'moreores:tin_ingot',            'moreores:tin_ingot',            'moreores:tin_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| @@ -158,24 +167,22 @@ minetest.register_craft({ | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = "technic:machine_casing", | ||||
| 	recipe = { | ||||
| 		{ "technic:cast_iron_ingot", "technic:cast_iron_ingot", "technic:cast_iron_ingot" }, | ||||
| 		{ "technic:cast_iron_ingot", "basic_materials:brass_ingot", "technic:cast_iron_ingot" }, | ||||
| 		{ "technic:cast_iron_ingot", "technic:cast_iron_ingot", "technic:cast_iron_ingot" }, | ||||
| 	}, | ||||
| minetest.register_craftitem("technic:nothing", { | ||||
| 	description = "", | ||||
| 	inventory_image = "blank.png", | ||||
| }) | ||||
|  | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = "default:dirt 2", | ||||
| 	type = "shapeless", | ||||
| 	replacements = {{"bucket:bucket_water","bucket:bucket_empty"}}, | ||||
| 	recipe = { | ||||
| 		"technic:stone_dust", | ||||
| 		"group:leaves", | ||||
| 		"bucket:bucket_water", | ||||
| 		"group:sand", | ||||
| 	}, | ||||
| 	output = "technic:nothing", | ||||
| 	recipe = {"default:copper_ingot", "default:steel_ingot"} | ||||
| }) | ||||
|  | ||||
| if minetest.register_craft_predict then | ||||
| 	minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv) | ||||
| 		if itemstack:get_name() == "technic:nothing" then | ||||
| 			return ItemStack("") | ||||
| 		end | ||||
| 	end) | ||||
| end | ||||
|  | ||||
|   | ||||
| @@ -1,14 +1,6 @@ | ||||
| default | ||||
| moreores | ||||
| pipeworks | ||||
| technic_worldgen | ||||
| basic_materials | ||||
| bucket? | ||||
| screwdriver? | ||||
| mesecons? | ||||
| mesecons | ||||
| mesecons_mvps? | ||||
| digilines? | ||||
| digiline_remote? | ||||
| intllib? | ||||
| unified_inventory? | ||||
| vector_extras? | ||||
| dye? | ||||
|   | ||||
| @@ -1,137 +0,0 @@ | ||||
| This file is fairly incomplete. Help is welcome. | ||||
|  | ||||
| Tiers | ||||
| ----- | ||||
| The tier is a string, currently `"LV"`, `"MV"` and `"HV"` are supported. | ||||
|  | ||||
| Network | ||||
| ------- | ||||
| The network is the cable with the connected machine nodes. Currently the | ||||
| switching station handles the network activity. | ||||
|  | ||||
| Helper functions | ||||
| ---------------- | ||||
| * `technic.EU_string(num)` | ||||
| 	* Converts num to a human-readable string (see pretty_num) | ||||
| 	  and adds the `EU` unit | ||||
| 	* Use this function when showing players energy values | ||||
| * `technic.pretty_num(num)` | ||||
| 	* Converts the number `num` to a human-readable string with SI prefixes | ||||
| * `technic.swap_node(pos, nodename)` | ||||
| 	* Same as `mintest.swap_node` but it only changes the nodename. | ||||
| 	* It uses `minetest.get_node` before swapping to ensure the new nodename | ||||
| 	  is not the same as the current one. | ||||
| * `technic.get_or_load_node(pos)` | ||||
| 	* If the mapblock is loaded, it returns the node at pos, | ||||
| 	  else it loads the chunk and returns `nil`. | ||||
| * `technic.set_RE_wear(itemstack, item_load, max_charge)` | ||||
| 	* If the `wear_represents` field in the item's nodedef is | ||||
| 	  `"technic_RE_charge"`, this function does nothing. | ||||
| * `technic.refill_RE_charge(itemstack)` | ||||
| 	* This function fully recharges an RE chargeable item. | ||||
| 	* If `technic.power_tools[itemstack:get_name()]` is `nil` (or `false`), this | ||||
| 	  function does nothing, else that value is the maximum charge. | ||||
| 	* The itemstack metadata is changed to contain the charge. | ||||
| * `technic.is_tier_cable(nodename, tier)` | ||||
| 	* Tells whether the node `nodename` is the cable of the tier `tier`. | ||||
| * `technic.get_cable_tier(nodename)` | ||||
| 	* Returns the tier of the cable `nodename` or `nil`. | ||||
| * `technic.trace_node_ray(pos, dir, range)` | ||||
| 	* Returns an iteration function (usable in the for loop) to iterate over the | ||||
| 	  node positions along the specified ray. | ||||
| 	* The returned positions will not include the starting position `pos`. | ||||
| * `technic.trace_node_ray_fat(pos, dir, range)` | ||||
| 	* Like `technic.trace_node_ray` but includes extra positions near the ray. | ||||
| 	* The node ray functions are used for mining lasers. | ||||
| * `technic.config:get(name)` | ||||
| 	* Some configuration function | ||||
| * `technic.tube_inject_item(pos, start_pos, velocity, item)` | ||||
| 	* Same as `pipeworks.tube_inject_item` | ||||
|  | ||||
| Registration functions | ||||
| ---------------------- | ||||
| * `technic.register_power_tool(itemname, max_charge)` | ||||
| 	* Same as `technic.power_tools[itemname] = max_charge` | ||||
| 	* This function makes the craftitem `itemname` chargeable. | ||||
| * `technic.register_machine(tier, nodename, machine_type)` | ||||
| 	* Same as `technic.machines[tier][nodename] = machine_type` | ||||
| 	* Currently this is requisite to make technic recognize your node. | ||||
| 	* See also `Machine types` | ||||
| * `technic.register_tier(tier)` | ||||
| 	* Same as `technic.machines[tier] = {}` | ||||
| 	* See also `tiers` | ||||
|  | ||||
| ### Specific machines | ||||
| * `technic.register_solar_array(data)` | ||||
| 	* data is a table | ||||
| * `technic.can_insert_unique_stack(pos, node, stack, direction)` | ||||
| * `technic.insert_object_unique_stack(pos, node, stack, direction)` | ||||
| 	* Functions for the parameters `can_insert` and `insert_object` to avoid | ||||
| 	  filling multiple inventory slots with same type of item. | ||||
|  | ||||
| Used itemdef fields | ||||
| ------------------- | ||||
| * groups: | ||||
| 	* `technic_<ltier> = 1` ltier is a tier in small letters; this group makes | ||||
| 	  the node connect to the cable(s) of the right tier. | ||||
| 	* `technic_machine = 1` Currently used for | ||||
| * `connect_sides` | ||||
| 	* In addition to the default use (see lua_api.txt), this tells where the | ||||
| 	  machine can be connected. | ||||
| # | ||||
| # | ||||
| * `technic_run(pos, node)` | ||||
| 	* This function is currently used to update the node. | ||||
| 	  Modders have to manually change the information about supply etc. in the | ||||
| 	  node metadata. | ||||
|  | ||||
| Machine types | ||||
| ------------- | ||||
| There are currently following types: | ||||
| * `technic.receiver = "RE"` e.g. grinder | ||||
| * `technic.producer = "PR"` e.g. solar panel | ||||
| * `technic.producer_receiver = "PR_RE"` supply converter | ||||
| * `technic.battery  = "BA"` e.g. LV batbox | ||||
|  | ||||
| Switching Station | ||||
| ----------------- | ||||
| The switching station is the center of all power distribution on an electric | ||||
| network. | ||||
|  | ||||
| The station collects power from sources (PR), distributes it to sinks (RE), | ||||
| and uses the excess/shortfall to charge and discharge batteries (BA). | ||||
|  | ||||
| For now, all supply and demand values are expressed in kW. | ||||
|  | ||||
| It works like this: | ||||
|  All PR,BA,RE nodes are indexed and tagged with the switching station. | ||||
| The tagging is a workaround to allow more stations to be built without allowing | ||||
| a cheat with duplicating power. | ||||
|  All the RE nodes are queried for their current EU demand. Those which are off | ||||
| would require no or a small standby EU demand, while those which are on would | ||||
| require more. | ||||
| If the total demand is less than the available power they are all updated with | ||||
| the demand number. | ||||
| If any surplus exists from the PR nodes the batteries will be charged evenly | ||||
| with this. | ||||
| If the total demand requires draw on the batteries they will be discharged | ||||
| evenly. | ||||
|  | ||||
| If the total demand is more than the available power all RE nodes will be shut | ||||
| down. We have a brown-out situation. | ||||
|  | ||||
| Hence for now all the power distribution logic resides in this single node. | ||||
|  | ||||
| ### Node meta usage | ||||
| Nodes connected to the network will have one or more of these parameters as meta | ||||
| data: | ||||
| 	* `<LV|MV|HV>_EU_supply` : Exists for PR and BA node types. | ||||
| 	This is the EU value supplied by the node. Output | ||||
| 	* `<LV|MV|HV>_EU_demand` : Exists for RE and BA node types. | ||||
| 	This is the EU value the node requires to run. Output | ||||
| 	* `<LV|MV|HV>_EU_input`  : Exists for RE and BA node types. | ||||
| 	This is the actual EU value the network can give the node. Input | ||||
|  | ||||
| The reason the LV|MV|HV type is prepended to meta data is because some machine | ||||
| could require several supplies to work. | ||||
| This way the supplies are separated per network. | ||||
| @@ -1,223 +1,10 @@ | ||||
| local constant_digit_count = technic.config:get("constant_digit_count") | ||||
|  | ||||
| -- converts a number to a readable string with SI prefix, e.g. 10000 → "10 k", | ||||
| -- 15 → "15 ", 0.1501 → "150.1 m" | ||||
| -- a non-breaking space (U+a0) instead of a usual one is put after number | ||||
| -- The precision is 4 digits | ||||
| local prefixes = {[-8] = "y", [-7] = "z", [-6] = "a", [-5] = "f", [-4] = "p", | ||||
| 	[-3] = "n", [-2] = "µ", [-1] = "m", [0] = "",  [1] = "k", [2] = "M", | ||||
| 	[3] = "G", [4] = "T", [5] = "P", [6] = "E", [7] = "Z", [8] = "Y"} | ||||
| function technic.pretty_num(num) | ||||
| 	-- the small number added is due to floating point inaccuracy | ||||
| 	local b = math.floor(math.log10(math.abs(num)) +0.000001) | ||||
| 	local pref_i | ||||
| 	if b ~= 0 then | ||||
| 		-- b is decremented by 1 to avoid a single digit with many decimals, | ||||
| 		-- e.g. instead of 1.021 MEU, 1021 kEU is shown | ||||
| 		pref_i = math.floor((b - 1) / 3) | ||||
| 	else | ||||
| 		-- as special case, avoid showing e.g. 1100 mEU instead of 1.1 EU | ||||
| 		pref_i = 0 | ||||
| 	end | ||||
| 	if not prefixes[pref_i] then | ||||
| 		-- This happens for 0, nan, inf, very big values, etc. | ||||
| 		if num == 0 then | ||||
| 			-- handle 0 explicilty to avoid showing "-0" | ||||
| 			if not constant_digit_count then | ||||
| 				return "0 " | ||||
| 			end | ||||
| 			-- gives 0.000 | ||||
| 			return string.format("%.3f ", 0) | ||||
| 		end | ||||
| 		return string.format("%.4g ", num) | ||||
| 	end | ||||
|  | ||||
| 	num = num * 10 ^ (-3 * pref_i) | ||||
| 	if constant_digit_count then | ||||
| 		local comma_digits_cnt = 3 - (b - 3 * pref_i) | ||||
| 		return string.format("%." .. comma_digits_cnt .. "f %s", | ||||
| 			num, prefixes[pref_i]) | ||||
| 	end | ||||
| 	return string.format("%.4g %s", num, prefixes[pref_i]) | ||||
| end | ||||
|  | ||||
| -- some unittests | ||||
| assert(technic.pretty_num(-0) == "0 ") | ||||
| assert(technic.pretty_num(0) == "0 ") | ||||
| assert(technic.pretty_num(1234) == "1234 ") | ||||
| assert(technic.pretty_num(123456789) == "123.5 M") | ||||
|  | ||||
|  | ||||
| -- used to display power values | ||||
| function technic.EU_string(num) | ||||
| 	return technic.pretty_num(num) .. "EU" | ||||
| end | ||||
|  | ||||
|  | ||||
| --- Same as minetest.swap_node, but only changes name | ||||
| -- and doesn't re-set if already set. | ||||
| 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) | ||||
| function get_item_meta (string) | ||||
| 	if string.find(string, "return {") then | ||||
| 		return minetest.deserialize(string) | ||||
| 	else return nil | ||||
| 	end | ||||
| 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 | ||||
|  | ||||
|  | ||||
| -- 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 = minetest.get_node_or_nil(pos) | ||||
| 	if node then return node end | ||||
| 	local vm = VoxelManip() | ||||
| 	local MinEdge, MaxEdge = vm:read_from_map(pos, pos) | ||||
| 	return nil | ||||
| end | ||||
|  | ||||
|  | ||||
| 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:set_velocity(velocity) | ||||
| 	tubed:set_acceleration(vector.new(0, 0, 0)) | ||||
| end | ||||
|  | ||||
|  | ||||
| --- Iterates over the node positions along the specified ray. | ||||
| -- The returned positions will not include the starting position. | ||||
| function technic.trace_node_ray(pos, dir, range) | ||||
| 	local x_step = dir.x > 0 and 1 or -1 | ||||
| 	local y_step = dir.y > 0 and 1 or -1 | ||||
| 	local z_step = dir.z > 0 and 1 or -1 | ||||
|  | ||||
| 	local i = 1 | ||||
| 	return function(p) | ||||
| 		-- Approximation of where we should be if we weren't rounding | ||||
| 		-- to nodes.  This moves forward a bit faster then we do. | ||||
| 		-- A correction is done below. | ||||
| 		local real_x = pos.x + (dir.x * i) | ||||
| 		local real_y = pos.y + (dir.y * i) | ||||
| 		local real_z = pos.z + (dir.z * i) | ||||
|  | ||||
| 		-- How far off we've gotten from where we should be. | ||||
| 		local dx = math.abs(real_x - p.x) | ||||
| 		local dy = math.abs(real_y - p.y) | ||||
| 		local dz = math.abs(real_z - p.z) | ||||
|  | ||||
| 		-- If the real position moves ahead too fast, stop it so we | ||||
| 		-- can catch up.  If it gets too far ahead it will smooth | ||||
| 		-- out our movement too much and we won't turn fast enough. | ||||
| 		if dx + dy + dz < 2 then | ||||
| 			i = i + 1 | ||||
| 		end | ||||
|  | ||||
| 		-- Step in whichever direction we're most off course in. | ||||
| 		if dx > dy then | ||||
| 			if dx > dz then | ||||
| 				p.x = p.x + x_step | ||||
| 			else | ||||
| 				p.z = p.z + z_step | ||||
| 			end | ||||
| 		elseif dy > dz then | ||||
| 			p.y = p.y + y_step | ||||
| 		else | ||||
| 			p.z = p.z + z_step | ||||
| 		end | ||||
| 		if vector.distance(pos, p) > range then | ||||
| 			return nil | ||||
| 		end | ||||
| 		return p | ||||
| 	end, vector.round(pos) | ||||
| end | ||||
|  | ||||
|  | ||||
| --- Like trace_node_ray, but includes extra positions close to the ray. | ||||
| function technic.trace_node_ray_fat(pos, dir, range) | ||||
| 	local x_step = dir.x > 0 and 1 or -1 | ||||
| 	local y_step = dir.y > 0 and 1 or -1 | ||||
| 	local z_step = dir.z > 0 and 1 or -1 | ||||
|  | ||||
| 	local next_poses = {} | ||||
|  | ||||
| 	local i = 1 | ||||
| 	return function(p) | ||||
| 		local ni, np = next(next_poses) | ||||
| 		if np then | ||||
| 			next_poses[ni] = nil | ||||
| 			return np | ||||
| 		end | ||||
|  | ||||
| 		-- Approximation of where we should be if we weren't rounding | ||||
| 		-- to nodes.  This moves forward a bit faster then we do. | ||||
| 		-- A correction is done below. | ||||
| 		local real_x = pos.x + (dir.x * i) | ||||
| 		local real_y = pos.y + (dir.y * i) | ||||
| 		local real_z = pos.z + (dir.z * i) | ||||
|  | ||||
| 		-- How far off we've gotten from where we should be. | ||||
| 		local dx = math.abs(real_x - p.x) | ||||
| 		local dy = math.abs(real_y - p.y) | ||||
| 		local dz = math.abs(real_z - p.z) | ||||
|  | ||||
| 		-- If the real position moves ahead too fast, stop it so we | ||||
| 		-- can catch up.  If it gets too far ahead it will smooth | ||||
| 		-- out our movement too much and we won't turn fast enough. | ||||
| 		if dx + dy + dz < 2 then | ||||
| 			i = i + 1 | ||||
| 		end | ||||
|  | ||||
| 		-- Step in whichever direction we're most off course in. | ||||
| 		local sx, sy, sz  -- Whether we've already stepped along each axis | ||||
| 		if dx > dy then | ||||
| 			if dx > dz then | ||||
| 				sx = true | ||||
| 				p.x = p.x + x_step | ||||
| 			else | ||||
| 				sz = true | ||||
| 				p.z = p.z + z_step | ||||
| 			end | ||||
| 		elseif dy > dz then | ||||
| 			sy = true | ||||
| 			p.y = p.y + y_step | ||||
| 		else | ||||
| 			sz = true | ||||
| 			p.z = p.z + z_step | ||||
| 		end | ||||
|  | ||||
| 		if vector.distance(pos, p) > range then | ||||
| 			return nil | ||||
| 		end | ||||
|  | ||||
| 		-- Add other positions that we're significantly off on. | ||||
| 		-- We can just use fixed integer keys here because the | ||||
| 		-- table will be completely cleared before we reach this | ||||
| 		-- code block again. | ||||
| 		local dlen = math.sqrt(dx*dx + dy*dy + dz*dz) | ||||
| 		-- Normalized axis deltas | ||||
| 		local dxn, dyn, dzn = dx / dlen, dy / dlen, dz / dlen | ||||
| 		if not sx and dxn > 0.5 then | ||||
| 			next_poses[1] = vector.new(p.x + x_step, p.y, p.z) | ||||
| 		end | ||||
| 		if not sy and dyn > 0.5 then | ||||
| 			next_poses[2] = vector.new(p.x, p.y + y_step, p.z) | ||||
| 		end | ||||
| 		if not sz and dzn > 0.5 then | ||||
| 			next_poses[3] = vector.new(p.x, p.y, p.z + z_step) | ||||
| 		end | ||||
|  | ||||
| 		return p | ||||
| 	end, vector.round(pos) | ||||
| function set_item_meta (table) | ||||
| 	return minetest.serialize(table) | ||||
| end | ||||
|   | ||||
| @@ -2,21 +2,17 @@ | ||||
| -- namespace: technic | ||||
| -- (c) 2012-2013 by RealBadAngel <mk@realbadangel.pl> | ||||
|  | ||||
| technic = {} | ||||
|  | ||||
| local load_start = os.clock() | ||||
|  | ||||
| technic = rawget(_G, "technic") or {} | ||||
| technic.creative_mode = minetest.settings:get_bool("creative_mode") | ||||
|  | ||||
|  | ||||
| local modpath = minetest.get_modpath("technic") | ||||
| technic.modpath = modpath | ||||
|  | ||||
|  | ||||
| -- Boilerplate to support intllib | ||||
| if rawget(_G, "intllib") then | ||||
| if 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 | ||||
| 	technic.getter = function(s) return s end | ||||
| end | ||||
| local S = technic.getter | ||||
|  | ||||
| @@ -26,18 +22,15 @@ dofile(modpath.."/config.lua") | ||||
| -- Helper functions | ||||
| dofile(modpath.."/helpers.lua") | ||||
|  | ||||
| -- Items | ||||
| -- Items  | ||||
| dofile(modpath.."/items.lua") | ||||
|  | ||||
| -- Craft recipes for items | ||||
| -- Craft recipes for items  | ||||
| dofile(modpath.."/crafts.lua") | ||||
|  | ||||
| -- Register functions | ||||
| dofile(modpath.."/register.lua") | ||||
|  | ||||
| -- Radiation | ||||
| dofile(modpath.."/radiation.lua") | ||||
|  | ||||
| -- Machines | ||||
| dofile(modpath.."/machines/init.lua") | ||||
|  | ||||
| @@ -47,7 +40,28 @@ dofile(modpath.."/tools/init.lua") | ||||
| -- Aliases for legacy node/item names | ||||
| dofile(modpath.."/legacy.lua") | ||||
|  | ||||
| if minetest.settings:get_bool("log_mods") then | ||||
| function has_locked_chest_privilege(meta, player) | ||||
| 	if player:get_player_name() ~= meta:get_string("owner") then | ||||
| 		return false | ||||
| 	end | ||||
| 	return true | ||||
| end | ||||
|  | ||||
| -- Swap nodes out. Return the node name. | ||||
| function hacky_swap_node(pos, name) | ||||
| 	local node = minetest.get_node(pos) | ||||
| 	if node.name ~= name then | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		local meta_table = meta:to_table() | ||||
| 		node.name = name | ||||
| 		minetest.set_node(pos, node) | ||||
| 		meta = minetest.get_meta(pos) | ||||
| 		meta:from_table(meta_table) | ||||
| 	end | ||||
| 	return node.name | ||||
| end | ||||
|  | ||||
| if minetest.setting_get("log_mod") then | ||||
| 	print(S("[Technic] Loaded in %f seconds"):format(os.clock() - load_start)) | ||||
| end | ||||
|  | ||||
|   | ||||
| @@ -11,6 +11,11 @@ minetest.register_craftitem( "technic:doped_silicon_wafer", { | ||||
| 	inventory_image = "technic_doped_silicon_wafer.png", | ||||
| }) | ||||
|  | ||||
| minetest.register_craftitem("technic:enriched_uranium", { | ||||
| 	description = S("Enriched Uranium"), | ||||
| 	inventory_image = "technic_enriched_uranium.png", | ||||
| }) | ||||
|  | ||||
| minetest.register_craftitem("technic:uranium_fuel", { | ||||
| 	description = S("Uranium Fuel"), | ||||
| 	inventory_image = "technic_uranium_fuel.png", | ||||
| @@ -27,15 +32,13 @@ minetest.register_tool("technic:blue_energy_crystal", { | ||||
| 		"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"), | ||||
| @@ -43,15 +46,13 @@ minetest.register_tool("technic:green_energy_crystal", { | ||||
| 		"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"), | ||||
| @@ -59,14 +60,18 @@ minetest.register_tool("technic:red_energy_crystal", { | ||||
| 		"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:copper_coil", { | ||||
| @@ -74,11 +79,20 @@ minetest.register_craftitem("technic: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: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", | ||||
| @@ -124,80 +138,3 @@ minetest.register_craftitem("technic: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=1.  This yields radioactive=1.0 | ||||
| 	-- for a fully-depleted uranium block and radioactive=2.6 for | ||||
| 	-- a 3.5%-fissile uranium block. | ||||
| 	local radioactivity = math.floor(math.sqrt((1+5.55*p/35) * 18 / (1+5.55*7/35)) + 0.5); | ||||
| 	(ov or minetest.register_node)(block, { | ||||
| 		description = string.format(S("%.1f%%-Fissile Uranium Block"), p/10), | ||||
| 		tiles = {"technic_uranium_block.png"}, | ||||
| 		is_ground_content = true, | ||||
| 		groups = {uranium_block=1, not_in_creative_inventory=nici, | ||||
| 			cracky=1, level=2, radioactive=radioactivity}, | ||||
| 		sounds = default.node_sound_stone_defaults(), | ||||
| 	}); | ||||
| 	if not ov then | ||||
| 		minetest.register_craft({ | ||||
| 			output = block, | ||||
| 			recipe = { | ||||
| 				{ingot, ingot, ingot}, | ||||
| 				{ingot, ingot, ingot}, | ||||
| 				{ingot, ingot, ingot}, | ||||
| 			}, | ||||
| 		}) | ||||
| 		minetest.register_craft({ | ||||
| 			output = ingot.." 9", | ||||
| 			recipe = {{block}}, | ||||
| 		}) | ||||
| 	end | ||||
| end | ||||
|  | ||||
|   | ||||
| @@ -17,25 +17,16 @@ technic.legacy_nodenames = { | ||||
| 	["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 | ||||
|  | ||||
| for i = 0, 64 do | ||||
| 	minetest.register_alias("technic:hv_cable"..i, "technic:hv_cable") | ||||
| 	minetest.register_alias("technic:mv_cable"..i, "technic:mv_cable") | ||||
| 	minetest.register_alias("technic:lv_cable"..i, "technic:lv_cable") | ||||
| end | ||||
|  | ||||
|   | ||||
| @@ -1,168 +0,0 @@ | ||||
| # 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 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 = | ||||
|  | ||||
| ## 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 = | ||||
| @@ -1,3 +1,4 @@ | ||||
| # es.txt | ||||
| # Spanish Translation for Technic Mod | ||||
| # Traduccion al Español del Mod Technic | ||||
| # Autor: Diego Martínez <kaeza> | ||||
| @@ -29,16 +30,11 @@ 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 | ||||
| @@ -49,70 +45,82 @@ Inventory move disallowed due to protection = | ||||
| %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 Compressor = Compresor %s | ||||
| %s Extractor = Extractor %s | ||||
| %s Forcefield Emitter = Emisor de Campo de Fuerza %s | ||||
| %s Furnace = Horno %s | ||||
| %s Electric Furnace = Horno Electrico %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 = | ||||
| %s Generator = Generador %s | ||||
| %s Solar Array = Panel Solar %s | ||||
| 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 | ||||
| Quarry = Cantera | ||||
| CNC Machine = Maquina CNC | ||||
| Music Player = Reproductor de Musica | ||||
| Extractor = Extractor | ||||
| Coal Alloy Furnace = Horno de Aleacion a Carbon | ||||
| Tool WorkShop = Taller de Herramientas | ||||
| Forcefield = Campo de Fuerza | ||||
| Forcefield Emitter = Emisor de Campo de Fuerza | ||||
| Compressor = Compresor | ||||
| Geothermal Generator = Generador Geotermico | ||||
| Water Mill = Molino de Agua | ||||
| Nuclear Reactor Rod Compartment = Compartimiento para Vara de Reactor Nuclear | ||||
| Nuclear Reactor Core = Nucleo de Reactor Nuclear | ||||
| Wind Mill = Molino de Viento | ||||
| Wind Mill Frame = Armazon de Molino de Viento | ||||
| Administrative World Anchor = | ||||
| Solar Panel = Panel Solar | ||||
|  | ||||
| ## 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: Tier $2: current_charge $3: max_charge  | ||||
| %s Battery Box: %d/%d = Caja de Bateria %s: %d/%d | ||||
| # $1: Machine name $2: Supply $3: Demand | ||||
| @1. Supply: @2 Demand: @3 = @1. Alimentacion: @2 Demanda: @3 | ||||
| %s. Supply: %d Demand: %d = %s. Alimentacion: %d Demanda: %d | ||||
| # $1: Production percent | ||||
| 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 | ||||
| Steel = Acero | ||||
| Cobble = Adoquines | ||||
| Stone = Piedra | ||||
| Brick = Ladrillo | ||||
| Dirt = Tierra | ||||
| Sandstone = Arenisca | ||||
| Wooden = Madera | ||||
| Leaves = Hojas | ||||
|  | ||||
| ## Grinder Recipes | ||||
| # $1: Name | ||||
| @@ -122,23 +130,19 @@ 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 | ||||
| Iron = Hierro | ||||
| 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 | ||||
| @@ -147,7 +151,7 @@ Flashlight = Linterna | ||||
| 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. | ||||
| Hold shift and use 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 | ||||
| @@ -155,8 +159,3 @@ Single node. = Nodo simple. | ||||
| Sonic Screwdriver = Destonillador Sonico | ||||
| Tree Tap = Grifo de Arbol | ||||
|  | ||||
| ## Craft descriptions | ||||
| Alloy cooking = | ||||
| Grinding = | ||||
| Compressing = | ||||
| Extracting = | ||||
|   | ||||
| @@ -1,215 +0,0 @@ | ||||
| # template.txt | ||||
| # Template for translations of Technic | ||||
|  | ||||
| ## Misc | ||||
| [Technic] Loaded in %f seconds                          = [Technic] Chargement en %f secondes | ||||
|                                                          | ||||
| ## Items                                                 | ||||
| Silicon Wafer                                           = Tranche de silicium | ||||
| Doped Silicon Wafer                                     = Tranche de silicium doppée | ||||
| Enriched Uranium                                        = Uranium enrichi | ||||
| Uranium Fuel                                            = Uranium 235 | ||||
| Diamond Drill Head                                      = Tête de forage en diamant | ||||
| Blue Energy Crystal                                     = Cristal d'énergie bleu | ||||
| Green Energy Crystal                                    = Cristal d'énergie vert | ||||
| Red Energy Crystal                                      = Cristal d'énergie rouge | ||||
| Fine Copper Wire                                        = Fil en cuivre fin | ||||
| Fine Gold Wire                                          = Fil en or fin | ||||
| Fine Silver Wire                                        = Fil en argent fin | ||||
| Copper Coil                                             = Bobine de cuivre | ||||
| Electric Motor                                          = Moteur électrique | ||||
| Low Voltage Transformer                                 = Transformateur basse tension | ||||
| Medium Voltage Transformer                              = Transformateur moyenne tension | ||||
| High Voltage Transformer                                = Transformateur haute tension | ||||
| Control Logic Unit                                      = Unité de contrôle logique | ||||
| Mixed Metal Ingot                                       = Lingot de métal allié | ||||
| Composite Plate                                         = Plaque composite | ||||
| Copper Plate                                            = Plaque de cuivre | ||||
| Carbon Plate                                            = Plaque de carbone | ||||
| Graphite                                                = Graphite | ||||
| Carbon Cloth                                            = Fibre de carbone | ||||
| Raw Latex                                               = Latex brut | ||||
| Rubber Fiber                                            = Fibre de caoutchouc | ||||
| %.1f%%-Fissile Uranium Ingot                            = Lingot d'uranium fissile (%.1f%%) | ||||
| %.1f%%-Fissile Uranium Block                            = Bloc d'uranium fissile (%.1f%%) | ||||
|  | ||||
| ## Machine misc | ||||
| Machine cannot be removed because it is not empty       = La machine ne peut pas être retirée car elle n'est pas vide | ||||
| Inventory move disallowed due to protection             = Le mouvement d'inventaire n'est pas autorisé en raison de la protection | ||||
|  | ||||
| # $1: Machine name (Includes tier) | ||||
| @1 Active (@2 EU)                                       = @1 Active (@2 EU) | ||||
| %s Active                                               = %s actif | ||||
| %s Disabled                                             = %s désactivé | ||||
| %s Enabled                                              = %s activé | ||||
| %s Idle                                                 = %s au repos | ||||
| %s Improperly Placed                                    = %s est mal placé | ||||
| %s is empty                                             = %s est vide | ||||
| %s Unpowered                                            = %s non alimenté en énergie | ||||
| %s Out Of Fuel                                          = %s plus de carburant | ||||
| %s Has Bad Cabling                                      = %s est mal cablé | ||||
| %s (Slave)                                              = %s (esclave) | ||||
| %s Has No Network                                       = %s n'a pas de réseau | ||||
| %s Finished                                             = %s a fini | ||||
| Enable/Disable                                          = Activer/Désactiver | ||||
| Range                                                   = Plage | ||||
| Upgrade Slots                                           = Emplacement d'amélioration | ||||
| In:                                                     = Entrée : | ||||
| Out:                                                    = Sortie : | ||||
| Slot %d                                                 = Emplacement %d | ||||
| Itemwise                                                = Item par Item | ||||
| Stackwise                                               = Stack par Stack | ||||
| Ignoring Mesecon Signal                                 = Ignorer le signal Mesecon | ||||
| Controlled by Mesecon Signal                            = Contrôlé par signal Mesecon | ||||
| Owner:                                                  = Propriétaire : | ||||
| Unlocked                                                = Déverrouillé | ||||
| Locked                                                  = Verrouillé | ||||
| Radius:                                                 = Rayon : | ||||
| Enabled                                                 = Activé | ||||
| Disabled                                                = Désactivé | ||||
|  | ||||
| ## Machine names | ||||
| # $1: Tier | ||||
| %s Alloy Furnace                                        = Four à alliage %s | ||||
| %s Battery Box                                          = Batterie %s | ||||
| %s Cable                                                = Câble %s | ||||
| %s CNC Machine                                          = Machine-outils %s | ||||
| %s Centrifuge                                           = Centrifugeuse %s | ||||
| %s Compressor                                           = Compresseur %s | ||||
| %s Extractor                                            = Extracteur %s | ||||
| %s Forcefield Emitter                                   = Emetteur de champ de force %s | ||||
| %s Furnace                                              = Four %s | ||||
| %s Grinder                                              = Broyeur %s | ||||
| %s Music Player                                         = Grammophone %s | ||||
| %s Quarry                                               = Carrière %s | ||||
| %s Tool Workshop                                        = Atelier d'outillage %s | ||||
| Arrayed Solar %s Generator                              = Générateur solaire %s | ||||
| Fuel-Fired %s Generator                                 = Générateur thermique %s | ||||
| Geothermal %s Generator                                 = Géénarteur géothermique %s | ||||
| Hydro %s Generator                                      = Générateur hydroélectrique %s | ||||
| Nuclear %s Generator Core                               = Générateur nucléaire % | ||||
| Small Solar %s Generator                                = Petit générateur solaire %s | ||||
| Wind %s Generator                                       = Générateur éolien %s | ||||
| Self-Contained Injector                                 = Injecteur autonome | ||||
| Constructor Mk%d                                        = Constructeur Mk%d | ||||
| Frame                                                   = Cadre | ||||
| Frame Motor                                             = Cadre de moteur | ||||
| Template                                                = Modèle | ||||
| Template (replacing)                                    = | ||||
| Template Motor                                          = | ||||
| Template Tool                                           = | ||||
| Battery Box                                             = Compartiment à batterie | ||||
| Supply Converter                                        = Convertisseur de tension | ||||
| Switching Station                                       = Station de commutation | ||||
| Fuel-Fired Alloy Furnace                                = Four à alliage à carburant | ||||
| Fuel-Fired Furnace                                      = Four à carburant | ||||
| Wind Mill Frame                                         = Cadre d'éolienne | ||||
| Forcefield                                              = Champ de force | ||||
| Nuclear Reactor Rod Compartment                         = Compartiment à barres du réacteur nucléaire | ||||
| Administrative World Anchor                             = | ||||
|                                                          | ||||
| ## Machine-specific                                      | ||||
| # $1: Pruduced EU                                        | ||||
| Charge                                                  = Charger | ||||
| Discharge                                               = Décharger | ||||
| Power level                                             = Niveau d'énergie | ||||
|  | ||||
| # $1: Tier $2: current_charge $3: max_charge  | ||||
| @1 Battery Box: @2/@3                                   = @1 batterie : @2/@3 | ||||
|                                                          | ||||
| # $1: Machine name $2: Supply $3: Demand                 | ||||
| @1. Supply: @2 Demand: @3                               = @1. fournit : @2 demande : @3 | ||||
| Production at %d%%                                      = Production à %d%% | ||||
| Choose Milling Program:                                 = Choisissez le programme de fraisage : | ||||
| Slim Elements half / normal height:                     = | ||||
| Current track %s                                        = Morceau actuel %s | ||||
| Stopped                                                 = Arrêté | ||||
| Keeping %d/%d map blocks loaded                         = | ||||
| Digging not started                                     = Creusement non démarré | ||||
| Digging finished                                        = Creusement terminé | ||||
| Digging %d m above machine                              = Creusement à %dm au dessus de la machine | ||||
| Digging %d m below machine                              = Creusement à %dm en dessous de la machine | ||||
| @1 (@2 @3 -> @4 @5)                                     = @1 (@2 @3 -> @4 @5) | ||||
|                                                          | ||||
| ## CNC                                                   | ||||
| Cylinder                                                = | ||||
| Element Cross                                           = Elément croisé | ||||
| Element Cross Double                                    = Elément croisé (double) | ||||
| Element Edge                                            = Elément de bordure | ||||
| Element Edge Double                                     = Elément de bordure (double) | ||||
| Element End                                             = Elément de fin | ||||
| Element End Double                                      = Elément de fin (double) | ||||
| Element Straight                                        = Elément droit | ||||
| Element Straight Double                                 = Elément droit (double) | ||||
| Element T                                               = Elément en T | ||||
| Element T Double                                        = Elément en T (double) | ||||
| Horizontal Cylinder                                     = Cylindre horizontal | ||||
| One Curved Edge Block                                   = Bloc à un bord incurvé | ||||
| Pyramid                                                 = Pyramide | ||||
| Slope                                                   = Pente | ||||
| Slope Edge                                              = | ||||
| Slope Inner Edge                                        = | ||||
| Slope Lying                                             = | ||||
| Slope Upside Down                                       = | ||||
| Slope Upside Down Edge                                  = | ||||
| Slope Upside Down Inner Edge                            = | ||||
| Sphere                                                  = Sphère | ||||
| Spike                                                   = Pointe | ||||
| Stick                                                   = Bâton | ||||
| Two Curved Edge Block                                   = Bloc à deux bords incurvés | ||||
| Brick                                                   = Brique | ||||
| Cobble                                                  = Pierre taillée | ||||
| Dirt                                                    = Terre | ||||
| Leaves                                                  = Feuilles | ||||
| Sandstone                                               = Grès | ||||
| Stone                                                   = Pierre | ||||
| Tree                                                    = Arbre | ||||
| Wooden                                                  = Bois | ||||
|  | ||||
| ## Grinder Recipes | ||||
| # $1: Name | ||||
| %s Dust                                                 = Poudre de %s | ||||
| Akalin                                                  = | ||||
| Alatro                                                  = | ||||
| Arol                                                    = | ||||
| Brass                                                   = Laiton | ||||
| Bronze                                                  = Bronze | ||||
| Carbon Steel                                            = Acier au carbone | ||||
| Cast Iron                                               = Fonte | ||||
| Chromium                                                = Chrome | ||||
| Coal                                                    = Charbon | ||||
| Copper                                                  = Cuivre | ||||
| Gold                                                    = Or | ||||
| Mithril                                                 = Mithril | ||||
| Silver                                                  = Argent | ||||
| Stainless Steel                                         = Acier inoxydable | ||||
| Talinite                                                = Talanite | ||||
| Tin                                                     = Etain | ||||
| Wrought Iron                                            = Fer | ||||
| Zinc                                                    = Zinc | ||||
| %.1f%%-Fissile Uranium                                  = Uranium fissile (%.1f%%) | ||||
|  | ||||
| ## Tools | ||||
| RE Battery                                              = Batterie RE | ||||
| Water Can                                               = Jerrycan d'eau | ||||
| Lava Can                                                = Jerrycan de lave | ||||
| Chainsaw                                                = Tronçonneuse | ||||
| Flashlight                                              = Lampe-torche | ||||
| 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                               = Foreuse Mk%d Mode %d | ||||
| Mining Drill Mk%d                                       = Foreuse Mk%d | ||||
| Mining Laser Mk%d                                       = Foreuse laser Mk%d | ||||
| Single node.                                            = Mode simple. | ||||
| Sonic Screwdriver                                       = Tournevis supersonique | ||||
| Tree Tap                                                = Robinet à sève | ||||
|  | ||||
| ## Craft descriptions | ||||
| Alloy cooking                                           = Fonderie d'alliage | ||||
| Grinding                                                = Broyage | ||||
| Compressing                                             = Compression | ||||
| Extracting                                              = Extraction | ||||
| Separating                                              = Séparation | ||||
| @@ -26,17 +26,12 @@ Graphite = Lastra in graffite | ||||
| Carbon Cloth = Fibra di carbonio | ||||
| Raw Latex = Latex grezzo | ||||
| Rubber Fiber = Fibra di gomma | ||||
| %.1f%%-Fissile Uranium Ingot = %.1f%%-Lingotto di uranio fissile | ||||
| %.1f%%-Fissile Uranium Block = %.1f%%-Blocco di uranio fissile | ||||
|  | ||||
| ## Machine misc | ||||
| Machine 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 Abilitato | ||||
| %s Idle = %s Inattivo | ||||
| %s Improperly Placed = %s Piazzato impropiamente | ||||
| %s Unpowered = %s Non alimentato | ||||
| @@ -46,56 +41,36 @@ Inventory move disallowed due to protection = Impossibile muovere l'inventario a | ||||
| %s Finished = %s Finito | ||||
| Enable/Disable = Abilita/Disabilita | ||||
| Range = Raggio | ||||
| Upgrade Slots = Alloggi di aggiornamento | ||||
| In: = Ingresso: | ||||
| Out: = Uscita: | ||||
| Slot %d = Alloggio %d | ||||
| Itemwise = Singolo elemento | ||||
| Stackwise = pila completa | ||||
| Owner: = Proprietario: | ||||
| Unlocked = Non chiuso a chiave | ||||
| Locked = Chiuso a chiave | ||||
| Radius: = Raggio: | ||||
| Enabled = Abilitato | ||||
| Disabled = Disabilitato | ||||
|  | ||||
|  | ||||
| ## Machine names | ||||
| # $1: Tier | ||||
| %s Alloy Furnace = %s Fornace per leghe | ||||
| %s Battery Box =  %s Box batterie | ||||
| %s Cable = Cavo %s | ||||
| %s Compressor = Compressore %s | ||||
| %s Extractor = Estrattore %s | ||||
| %s Forcefield Emitter = Emettitore di campo di forza %s | ||||
| %s Furnace = %s Fornace | ||||
| %s Electric Furnace = %s Fornace elettrica | ||||
| %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 = Sagoma | ||||
| Template (replacing) = Sagoma (di rimpiazzo) | ||||
| Template Motor = Motore per sagome | ||||
| Template Tool = Strumento per sagome | ||||
| %s Generator = %s Generatore | ||||
| %s Solar Array = %s Pannello Solare | ||||
| 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 | ||||
| CNC Machine = Tornio CNC | ||||
| Coal Alloy Furnace = Fornace per leghe a carbone | ||||
| Extractor = Estrattore | ||||
| Compressor = Compressore | ||||
| Solar Panel = Pannello solare | ||||
| Geothermal Generator = Generatore Geotermico | ||||
| Music Player = Music Player | ||||
| Water Mill = Turbina Elettrica | ||||
| Tool WorkShop = Officina per attrezzi | ||||
| Wind Mill = Generatore eolico | ||||
| Wind Mill Frame = Pala eolica | ||||
| Forcefield Emitter = Emettitore di campo di forza | ||||
| Forcefield = Campo di forza | ||||
| Nuclear Reactor Core = Reattore nucleare | ||||
| Nuclear Reactor Rod Compartment = Compartimento combustibile nucleare | ||||
| Administrative World Anchor = Ancora-mondo amministrativa | ||||
| Quarry = Cava | ||||
|  | ||||
| ## Machine-specific | ||||
| # $1: Pruduced EU | ||||
| @@ -103,19 +78,46 @@ 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 | ||||
| %s Battery Box: %d/%d = %s Box Batterie: %d/%d | ||||
| # $1: Machine name $2: Supply $3: Demand | ||||
| @1. Supply: @2 Demand: @3 = @1. Prodotto: @2 Consumato: @3 | ||||
| %s. Supply: %d Demand: %d = %s. Prodotto: %d Consumato: %d | ||||
| Production at %d%% = Produzione a %d%% | ||||
| 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 = Fermato | ||||
| Keeping %d/%d map blocks loaded = Mantenimento di %d/%d blocchi mappa caricati | ||||
| Digging not started = Scavo non iniziato | ||||
| Digging finished = Scavo finito | ||||
| Digging %d m above machine = Scavo di %d m sopra la macchina | ||||
| Digging %d m below machine = Scavo di %d m sotto la macchina | ||||
|  | ||||
| ## CNC | ||||
| Cylinder = Cilindro | ||||
| Element Cross = Elemento a croce | ||||
| Element Cross Double = Elemento a croce doppio | ||||
| Element Edge = | ||||
| Element Edge Double = | ||||
| Element End = Elemento finale | ||||
| Element End Double = Elemento finale doppio | ||||
| Element Straight = | ||||
| Element Straight Double = | ||||
| Element T = Elemento a T | ||||
| Element T Double = Elemento a T doppio | ||||
| Horizontal Cylinder = Cilindro orizzontale | ||||
| One Curved Edge Block = | ||||
| Pyramid = Piramide | ||||
| Slope = | ||||
| Slope Edge = | ||||
| Slope Inner Edge = | ||||
| Slope Lying = | ||||
| Slope Upside Down = | ||||
| Slope Upside Down Edge = | ||||
| Slope Upside Down Inner Edge = | ||||
| Sphere = Sfera | ||||
| Spike = | ||||
| Stick = Bastone | ||||
| Two Curved Edge Block = | ||||
| Brick = Mattone | ||||
| Cobble = Ciottolato | ||||
| Dirt = Terra | ||||
| Leaves = Foglie | ||||
| Sandstone = Arenaria | ||||
| Steel = Acciaio | ||||
| Stone = Pietra | ||||
| Tree = Albero | ||||
| Wooden = Legno | ||||
|  | ||||
| ## Grinder Recipes | ||||
| # $1: Name | ||||
| @@ -125,23 +127,19 @@ Alatro = Alatro | ||||
| Arol = Arol | ||||
| Brass = Ottone | ||||
| Bronze = Bronzo | ||||
| Carbon Steel = Acciaio al Carbonio | ||||
| Cast Iron = Ghisa | ||||
| Chromium = Cromo | ||||
| Coal = Carbone | ||||
| Copper = Rame | ||||
| Gold = Oro | ||||
| Iron = Ferro | ||||
| Mithril = Mithril | ||||
| Silver = Argento | ||||
| Stainless Steel = Acciaio Inossidabile | ||||
| Talinite = Talinite | ||||
| Tin = Stagno | ||||
| Wrought Iron = Ferro Battuto | ||||
| Zinc = Zinco | ||||
| %.1f%%-Fissile Uranium = %.1f%%-Uranio fissile | ||||
|  | ||||
| ## Tools | ||||
| RE Battery = Batteria RE | ||||
| Water Can = Serbatoio d'acqua | ||||
| Lava Can = Serbatoio di lava | ||||
| Chainsaw = Motosega | ||||
| @@ -150,16 +148,10 @@ Flashlight = Torcia | ||||
| 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. | ||||
| Hold shift and use 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 | ||||
|   | ||||
| @@ -1,175 +0,0 @@ | ||||
| # Polish Translation for Technic mod | ||||
| # Polskie tłumaczenie Technic mod | ||||
| # by mat9117 | ||||
|  | ||||
| ## Misc | ||||
| [Technic] Loaded in %f seconds = [Technic] Wczytany w %f sekund | ||||
|  | ||||
| ## Items | ||||
| Silicon Wafer = Płytka krzemowa | ||||
| Doped Silicon Wafer = Domieszkowana płytka krzemowa | ||||
| Enriched Uranium = Wzbogacony uran | ||||
| Uranium Fuel = Paliwo uranowe | ||||
| Diamond Drill Head = Diamentowa głowica wiertła | ||||
| Blue Energy Crystal = Niebieski kryształ energii | ||||
| Green Energy Crystal = Zielony kryształ energii | ||||
| Red Energy Crystal = Czerwony kryształ energii | ||||
| Fine Copper Wire = Cienki miedziany drut | ||||
| Copper Coil = Miedziana cewka | ||||
| Electric Motor = Silnik elektryczny | ||||
| Low Voltage Transformer = Transformator niskiego napięcia | ||||
| Medium Voltage Transformer = Transformator średniego napięcia | ||||
| High Voltage Transformer = Transformator wysokiego napięcia | ||||
| Control Logic Unit = Jednostka sterująca | ||||
| Mixed Metal Ingot = Sztabka zmieszanych metali | ||||
| Composite Plate = Płytka kompozytowa | ||||
| Copper Plate = Płytka miedziana | ||||
| Carbon Plate = Płytka węglowa | ||||
| Graphite = Grafit | ||||
| Carbon Cloth = Włókno węglowe | ||||
| Raw Latex = Lateks naturalny | ||||
| Rubber Fiber = Włókno gumowe | ||||
| %.1f%%-Fissile Uranium Ingot = %.1f%% Sztabka uranu | ||||
| %.1f%%-Fissile Uranium Block = %.1f%% Blok uranu | ||||
|  | ||||
| ## Machine misc | ||||
| Machine cannot be removed because it is not empty = Nie można usunąć maszyny, ponieważ nie jest pusta | ||||
| Inventory move disallowed due to protection = Przenoszenie rzeczy z ekwipunku niemożliwe z powodu ochrony | ||||
| # $1: Machine name (Includes tier) | ||||
| @1 Active (@2 EU) = @1 Aktywny (@2 EU) | ||||
| %s Active = %s Aktywny/a | ||||
| %s Disabled = %s Wyłączony/a | ||||
| %s Enabled = %s Włączony/a | ||||
| %s Idle = %s Bezczynny/a | ||||
| %s Improperly Placed = %s Ustawiony/a nieprawidłowo | ||||
| %s is empty = %s jest pusty/a | ||||
| %s Unpowered = %s brak zasilania | ||||
| %s Out Of Fuel = %s brak paliwa | ||||
| %s Has Bad Cabling = %s Źle podłączono kable | ||||
| %s (Slave) = | ||||
| %s Has No Network = %s Nie podłączony/a do sieci | ||||
| %s Finished = %s Ukończony | ||||
| Enable/Disable = Włącz/Wyłącz | ||||
| Range = Zasięg | ||||
| Upgrade Slots = Miejsca na ulepszenia | ||||
| In: = Wejście | ||||
| Out: = Wyjście | ||||
| Slot %d = Otwór %d | ||||
| Itemwise = Jeden przedmiot | ||||
| Stackwise = Cały stack | ||||
| Ignoring Mesecon Signal = Ignoruj sygnał Mesecon | ||||
| Controlled by Mesecon Signal = Sterowany sygnałem Mesecon | ||||
| Owner: = Właściciel: | ||||
| Unlocked = Odblokowany/a | ||||
| Locked = Zablokowany/a | ||||
| Radius: = Promień: | ||||
| Enabled = Włączony/a | ||||
| Disabled = Wyłączony/a | ||||
|  | ||||
| ## Machine names | ||||
| # $1: Tier | ||||
| %s Alloy Furnace = %s Piec stopowy | ||||
| %s Battery Box = %s Skrzynka baterii | ||||
| %s Cable = %s Przewód | ||||
| %s Centrifuge = %s Centryfuga | ||||
| %s Compressor = %s Kompresor | ||||
| %s Extractor = %s Ekstraktor | ||||
| %s Forcefield Emitter = %s Emiter pola siłowego | ||||
| %s Furnace = %s Piec | ||||
| %s Grinder = %s Młynek | ||||
| %s Music Player = %s Odtwarzacz muzyki | ||||
| %s Quarry = %s Kamieniołom | ||||
| %s Tool Workshop = %s Warsztat narzędzi | ||||
| Arrayed Solar %s Generator = %s Szeregowy generator słoneczny | ||||
| Fuel-Fired %s Generator = %s Generator zasilany paliwem | ||||
| Geothermal %s Generator = %s Generator geotermalny | ||||
| Hydro %s Generator = %s Hydrogenerator | ||||
| Nuclear %s Generator Core = %s Reaktor atomowy | ||||
| Small Solar %s Generator = %s Mały generator słoneczny | ||||
| Wind %s Generator = %s Generator wiatrowy | ||||
| Self-Contained Injector = Samowystarczalny wtryskiwacz | ||||
| Constructor Mk%d = Konstruktor Mk%d | ||||
| Frame = Klatka | ||||
| Frame Motor = Silnik klatkowy | ||||
| Template = Szablon | ||||
| Template (replacing) = Szablon (zastępczy) | ||||
| Template Motor =Szablon silnika | ||||
| Template Tool = Szablon narzędzia | ||||
| Battery Box = Skrzynka baterii | ||||
| Supply Converter = Konwerter zasilania | ||||
| Switching Station = Rozdzielnia | ||||
| Fuel-Fired Alloy Furnace = Piec stopowy zasilany paliwem | ||||
| Fuel-Fired Furnace = Piec zasilany paliwem | ||||
| Wind Mill Frame = Klatka wiatraka | ||||
| Forcefield = Pole siłowe | ||||
| Nuclear Reactor Rod Compartment = Komora rdzenia reaktora atomowego | ||||
| Administrative World Anchor = Administracyjna kotwica świata | ||||
|  | ||||
| ## Machine-specific | ||||
| # $1: Pruduced EU | ||||
| Charge = Ładuj | ||||
| Discharge = Rozładuj | ||||
| Power level = Poziom zasilania | ||||
| # $1: Tier $2: current_charge $3: max_charge | ||||
| @1 Battery Box: @2/@3 = @1 Skrzynka baterii: @2/@3 | ||||
| # $1: Machine name $2: Supply $3: Demand | ||||
| @1. Supply: @2 Demand: @3 = @1. Zapas: @2 Pobór: @3  | ||||
| Production at %d%% = Produkowanie w %d%% | ||||
| Choose Milling Program: = Wybierz program mielenia: | ||||
| Slim Elements half / normal height: = Małe elementy połowa / normalna wysokość: | ||||
| Current track %s = | ||||
| Stopped = Zatrzymany/a | ||||
| Keeping %d/%d map blocks loaded = Ciągle ładuję %d/%d bloki mapy  | ||||
| Digging not started = Nie rozpoczęto kopania | ||||
| Digging finished = Kopanie skończone | ||||
| Digging %d m above machine = Kopię %d m nad maszyną | ||||
| Digging %d m below machine = Kopię %d m pod maszyną | ||||
| @1 (@2 @3 -> @4 @5) = @1 (@2 @3 -> @4 @5) | ||||
|  | ||||
| ## Grinder Recipes | ||||
| # $1: Name | ||||
| %s Dust = %s Pył | ||||
| Akalin = Akalinowy | ||||
| Alatro = Alatrowy | ||||
| Arol = Arolowy | ||||
| Brass = Mosiądzu | ||||
| Bronze = Brązu | ||||
| Carbon Steel = Stali węglowej | ||||
| Cast Iron = Żeliwa | ||||
| Chromium = Chromu | ||||
| Coal = Węglowy | ||||
| Copper = Miedzi | ||||
| Gold = Złoty | ||||
| Mithril = Mithrilu | ||||
| Silver = Srebrny | ||||
| Stainless Steel = Stali nierdzewnej | ||||
| Talinite = Talinitu | ||||
| Tin = Cyny | ||||
| Wrought Iron = Kutego żelaza | ||||
| Zinc = Cynku | ||||
| %.1f%%-Fissile Uranium = %.1f%% Uranu | ||||
|  | ||||
| ## Tools | ||||
| RE Battery = Bateria ładowalna | ||||
| Water Can = Kanister wody | ||||
| Lava Can = Kanister lawy | ||||
| Chainsaw = Piła łańcuchowa | ||||
| Flashlight = Latarka | ||||
| 3 nodes deep. = Głęboki na 3 bloki. | ||||
| 3 nodes tall. = Wysoki na 3 bloki. | ||||
| 3 nodes wide. = Szeroki na 3 bloki. | ||||
| 3x3 nodes. = 3x3 bloki. | ||||
| Use while sneaking to change Mining Drill Mk%d modes. = Użyj podczas skradania, aby zmienić tryby wiertła górniczego Mk%d | ||||
| Mining Drill Mk%d Mode %d = Tryb wiertła górniczego Mk%d | ||||
| Mining Drill Mk%d = Wiertło górnicze Mk%d | ||||
| Mining Laser Mk%d = Laser górniczy Mk%d | ||||
| Single node. = Pojedynczy blok. | ||||
| Sonic Screwdriver = Dźwiękowy śrubokręt  | ||||
| Tree Tap = Nacinak drzewny | ||||
|  | ||||
| ## Craft descriptions | ||||
| Alloy cooking = Stapianie | ||||
| Grinding = Mielenie | ||||
| Compressing = Kompresowanie | ||||
| Extracting = Ekstrakcja | ||||
| Separating = Oddzielanie | ||||
| @@ -1,211 +0,0 @@ | ||||
| # Braziliam portuguese translation for technic | ||||
| # Tradução portuguesa brasileira para technic | ||||
| # By Sires | ||||
|  | ||||
| ## Misc | ||||
| [Technic] Loaded in %f seconds = [Technic] Carregado em %f segundos | ||||
|  | ||||
| ## Items | ||||
| Silicon Wafer = Pastilha de Silício | ||||
| Doped Silicon Wafer = Pastilha de Silício Dopada | ||||
| Enriched Uranium = Urânio Enriquecido | ||||
| Uranium Fuel = Combustivel de Urânio | ||||
| Diamond Drill Head = Cabeça de Broca de Diamante | ||||
| Blue Energy Crystal = Cristal de Energia Azul | ||||
| Green Energy Crystal = Cristal de Energia Verde | ||||
| Red Energy Crystal = Cristal de Energia Vermelho | ||||
| Fine Copper Wire = Fio Fino de Cobre | ||||
| Copper Coil = Bobina de Cobre | ||||
| Electric Motor = Motor Elétrico | ||||
| Low Voltage Transformer = Transformador de Baixa Voltagem | ||||
| Medium Voltage Transformer = Transformador de Média Voltagem | ||||
| High Voltage Transformer = Transformador de Alta Voltagem | ||||
| Control Logic Unit = Unidade de Controle Lógico | ||||
| Mixed Metal Ingot = Lingote de Metal Misturado | ||||
| Composite Plate = Placa Composta | ||||
| Copper Plate = Placa de Cobre | ||||
| Carbon Plate = Placa de Carbono | ||||
| Graphite = Grafite | ||||
| Carbon Cloth = Recido de Carbono | ||||
| Raw Latex = Latex bruto | ||||
| Rubber Fiber = Fibra de Borracha | ||||
| %.1f%%-Fissile Uranium Ingot = Lingote de Urânio %.1f%%-Físsil | ||||
| %.1f%%-Fissile Uranium Block = Bloco de Urânio %.1f%%-Físsil | ||||
|  | ||||
| ## Machine Misc | ||||
| Machine cannot be removed because it is not empty = A máquina não pode ser removida porque ela não está vazia | ||||
| Inventory move disallowed due to protection = Movimento de inventário não permitido pela proteção | ||||
| # $1: Machine name (includes tier) | ||||
| @1 Active (@2 EU) = @1 Ativo (@2 EU) | ||||
| %s Active = %s Ativo | ||||
| %s Disabled = %s Ativado | ||||
| %s Enabled = %s Desativado | ||||
| %s Idle = Ócio | ||||
| %s Improperly Placed = %s Colocado Inapropriadamente | ||||
| %s is empty = %s está vazio | ||||
| %s Unpowered = %s Sem energia | ||||
| %s Out Of Fuel = %s Sem Combustível | ||||
| %s Has Bad Cabling = %s Tem Cabeamento Ruim | ||||
| %s (Slave) = %s (Servo) | ||||
| %s Has No Network = %s Não Tem Rede | ||||
| %s Finished = %s Acabou | ||||
| Enable/Disable = Ativar/Desativar | ||||
| Range = Alcance | ||||
| Upgrade Slots = Lugares para Melhoria | ||||
| In: = Entrada: | ||||
| Out: = Saída: | ||||
| Slot %d = Lugar %d | ||||
| Itemwise = Por item | ||||
| Stackwise = Por pilha | ||||
| Ignoring Mesecon Signal = Ignorar Sinaal de Mesecon | ||||
| Controlled by Mesecon Signal = Controlado por Sinal de Mesecon | ||||
| Owner: = Dono: | ||||
| Unlocked = Destravado | ||||
| Locked = Travado | ||||
| Radius: = Raio: | ||||
| Enabled = Ativado | ||||
| Disabled = Desativado | ||||
|  | ||||
| ## Machine names | ||||
| # $1: Tier | ||||
| %s Alloy Furnace = Fornalha de Liga %s | ||||
| %s Battery Box = Caixa de Bateria %s | ||||
| %s Cable = Cabo %s | ||||
| %s CNC Machine = Máquina CNC %s | ||||
| %s Centrifuge = Centrifuga %s | ||||
| %s Compressor = Compresso %s | ||||
| %s Extractor = Extrator %s | ||||
| %s Forcefield Emitter = Emissor de Campo de Força %s | ||||
| %s Furnace = Fornalha %s | ||||
| %s Grinder = Triturador %s | ||||
| %s Music Player = Tocador de Música %s | ||||
| %s Quarry = Pedreira %s | ||||
| %s Tool Workshop = Oficina de Ferramentas %s | ||||
| Arrayed Solar %s Generator = Gerador Solar Equipado %s | ||||
| Fuel-Fired %s Generator = Gerador Alimentado-por-Combustível %s | ||||
| Geothermal %s Generator = Gerador Geotermal %s | ||||
| Hydro %s Generator = Gerador Hidráulico %s | ||||
| Nuclear %s Generator Core = Núcleo de Gerador Nuclear %s | ||||
| Small Solar %s Generator = Gerador Solar Pequeno %s | ||||
| Wind %s Generator = Gerador de Energia Eólica %s | ||||
| Self-Contained Injector = Injetor Auto-Contido | ||||
| Constructor Mk%d = Construtor Nv%d | ||||
| Frame = Armação | ||||
| Frame Motor = Motor de Armação | ||||
| Template = Modelo | ||||
| Template (replacing) = Modelo (recolocando) | ||||
| Template Motor = Modelo de Motor | ||||
| Template Tool = Modelo de Ferramenta | ||||
| Battery Box = Caixa de Bateria | ||||
| Supply Converter = Conversor de Energia | ||||
| Switching Station = Estação de Comutação | ||||
| Fuel-Fired Alloy Furnace = Fornalha de Liga Alimentada-por-Combustível | ||||
| Fuel-Fired Furnace = Fornalha Alimentada-por-Combustível | ||||
| Wind Mill Frame = Armação de Moinho de Vento | ||||
| Forcefield = Campo de Força | ||||
| Nuclear Reactor Rod Compartment = Compartimento de Barra do Reator Nuclear | ||||
| Administrative World Anchor = Âncora de Mundo Administrativa | ||||
|  | ||||
| ## Machine-specific | ||||
| # $1: Pruduced EU | ||||
| Charge = Carregar | ||||
| Discharge = Descarregar | ||||
| Power level = Nível de Energia | ||||
| # $1: Tier $2: current_charge $3: max_charge  | ||||
| @1 Battery Box: @2/@3 = Caixa de Baterias @1: @2/@3 | ||||
| # $1: Machine name $2: Supply $3: Demand | ||||
| @1. Supply: @2 Demand: @3 = @1. Suprimento: @2 Demanda: @3 | ||||
| Production at %d%% = Produção em %d%% | ||||
| Choose Milling Program: = Escolha o Programa de Serragem: | ||||
| Slim Elements half / normal height: = Metade de Elementos Finos / altura normal: | ||||
| Current track %s = Música Atual %s | ||||
| Stopped = Parado | ||||
| Keeping %d/%d map blocks loaded = Mantendo %d/%d blocos de mapa carregados | ||||
| Digging not started = Escavação não começada | ||||
| Digging finished = Escavação terminada | ||||
| Digging %d m above machine = Escavando %d m acima da máquina | ||||
| Digging %d m below machine = Escavando %d m abaixo da máquina | ||||
| @1 (@2 @3 -> @4 @5) = @1 (@2 @3 -> @4 @5) | ||||
|  | ||||
| ## CNC | ||||
| Cylinder = Cilindro | ||||
| Element Cross = Cruz do Elemento | ||||
| Element Cross Double = Cruz Dupla do Elemento | ||||
| Element Edge = Borda do Elemento | ||||
| Element Edge Double = Borda Dupla do Elemento | ||||
| Element End = Final do Elemento | ||||
| Element End Double = Final Duplo do Elemento | ||||
| Element Straight = Elemento Contínuo | ||||
| Element Straight Double = Elemento Contínuo duplo | ||||
| Element T = Elemento em T | ||||
| Element T Double = Elemento em T Duplo | ||||
| Horizontal Cylinder = Cilindro Horizontal | ||||
| One Curved Edge Block = Uma Borda de Bloco Curvada | ||||
| Pyramid = Pirâmide | ||||
| Slope = Ladeira | ||||
| Slope Edge = Canto de Ladeira | ||||
| Slope Inner Edge = Canto de Dentro de Ladeira | ||||
| Slope Lying = Ladeira Deitada | ||||
| Slope Upside Down = Ladeira de Cabeça para Baixo | ||||
| Slope Upside Down Edge = Cande de Ladeira de Cabeça para Baixo | ||||
| Slope Upside Down Inner Edge = Canto de Dentro de Ladeira de Cabeça para Baixo | ||||
| Sphere = Esfera | ||||
| Spike = Espinho | ||||
| Stick = Graveto | ||||
| Two Curved Edge Block = Bloco de Duas Bordas Curvadas | ||||
| Brick = Tijolo | ||||
| Cobble = Pedregulho | ||||
| Dirt = Terra | ||||
| Leaves = Folhas | ||||
| Sandstone = Arenito | ||||
| Stone = Pedra | ||||
| Tree = Árvore | ||||
| Wooden = de Madeira | ||||
|  | ||||
| ## Grinder Recipes | ||||
| # $1: Name | ||||
| %s Dust = Pó de %s | ||||
| Akalin = Akalin | ||||
| Alatro = Alatro | ||||
| Arol = Arol | ||||
| Brass = Latão | ||||
| Bronze = Bronze | ||||
| Carbon Steel = Aço Carbono | ||||
| Cast Iron = Ferro Fundido | ||||
| Chromium = Crômio | ||||
| Coal = Carvão | ||||
| Copper = Cobre | ||||
| Gold = Ouro | ||||
| Mithril = Mithril | ||||
| Silver = Prata | ||||
| Stainless Steel = Aço Inoxidável | ||||
| Talinite = Talinite | ||||
| Tin = Estanho | ||||
| Wrought Iron = Ferro Forjado | ||||
| Zinc = Zinco | ||||
| %.1f%%-Fissile Uranium = Urânio %.1f%%-Físsil | ||||
|  | ||||
| ## Tools | ||||
| RE Battery = Bateria RE | ||||
| Water Can = Lata de Água | ||||
| Lava Can = Lata de Lava | ||||
| Chainsaw = Motosserra | ||||
| Flashlight = Lanterna | ||||
| 3 nodes deep. = 3 nodes de profundidade. | ||||
| 3 nodes tall. = 3 nodes de altura. | ||||
| 3 nodes wide. = 3 nodes de largura. | ||||
| 3x3 nodes. = 3x3 nodes. | ||||
| Use while sneaking to change Mining Drill Mk%d modes. = Use enquanto esgueirando para mudar os modos da Broca de Mineração Nv%d. | ||||
| Mining Drill Mk%d Mode %d = Broca de Mineração Nv%d Modo %d | ||||
| Mining Drill Mk%d = Broca de Mineração Nv%d | ||||
| Mining Laser Mk%d = Laser de Mineração Nv%d | ||||
| Single node. = Unico node. | ||||
| Sonic Screwdriver = Chave de Fenda Sônica. | ||||
| Tree Tap = Torneira de Árvore | ||||
|  | ||||
| ## Craft descriptions | ||||
| Alloy cooking = Cozinhando em liga | ||||
| Grinding = Triturando | ||||
| Compressing = Comprimindo | ||||
| Extracting = Extraindo | ||||
| Separating = Separando | ||||
| @@ -15,8 +15,6 @@ Blue Energy Crystal = | ||||
| Green Energy Crystal = | ||||
| Red Energy Crystal = | ||||
| Fine Copper Wire = | ||||
| Fine Gold Wire = | ||||
| Fine Silver Wire = | ||||
| Copper Coil = | ||||
| Electric Motor = | ||||
| Low Voltage Transformer = | ||||
| @@ -31,103 +29,98 @@ 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 Battery Box =  | ||||
| %s Cable = | ||||
| %s Centrifuge = | ||||
| %s Compressor = | ||||
| %s Extractor = | ||||
| %s Forcefield Emitter = | ||||
| %s Furnace = | ||||
| %s Electric 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 = | ||||
| %s Generator = | ||||
| %s Solar Array = | ||||
| Battery Box = | ||||
| Supply Converter = | ||||
| Switching Station = | ||||
| Fuel-Fired Alloy Furnace = | ||||
| Fuel-Fired Furnace = | ||||
| CNC Machine = | ||||
| Coal Alloy Furnace = | ||||
| Extractor = | ||||
| Compressor = | ||||
| Solar Panel = | ||||
| Geothermal Generator = | ||||
| Music Player = | ||||
| Water Mill = | ||||
| Tool WorkShop = | ||||
| Wind Mill = | ||||
| Wind Mill Frame = | ||||
| Forcefield Emitter = | ||||
| Forcefield = | ||||
| Nuclear Reactor Core = | ||||
| Nuclear Reactor Rod Compartment = | ||||
| Administrative World Anchor = | ||||
| Quarry = | ||||
|  | ||||
| ## Machine-specific | ||||
| # $1: Pruduced EU | ||||
| Charge = | ||||
| Discharge = | ||||
| Power level = | ||||
| # $1: Tier $2: current_charge $3: max_charge | ||||
| @1 Battery Box: @2/@3 = | ||||
| # $1: Tier $2: current_charge $3: max_charge  | ||||
| %s Battery Box: %d/%d = | ||||
| # $1: Machine name $2: Supply $3: Demand | ||||
| @1. Supply: @2 Demand: @3 = | ||||
| %s. Supply: %d Demand: %d = | ||||
| 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 = | ||||
| Steel = | ||||
| Stone = | ||||
| Tree = | ||||
| Wooden = | ||||
|  | ||||
| ## Grinder Recipes | ||||
| # $1: Name | ||||
| @@ -137,23 +130,19 @@ Alatro = | ||||
| Arol = | ||||
| Brass = | ||||
| Bronze = | ||||
| Carbon Steel = | ||||
| Cast Iron = | ||||
| Chromium = | ||||
| Coal = | ||||
| Copper = | ||||
| Gold = | ||||
| Iron = | ||||
| Mithril = | ||||
| Silver = | ||||
| Stainless Steel = | ||||
| Talinite = | ||||
| Tin = | ||||
| Wrought Iron = | ||||
| Zinc = | ||||
| %.1f%%-Fissile Uranium = | ||||
|  | ||||
| ## Tools | ||||
| RE Battery = | ||||
| Water Can = | ||||
| Lava Can = | ||||
| Chainsaw = | ||||
| @@ -162,7 +151,7 @@ Flashlight = | ||||
| 3 nodes tall. = | ||||
| 3 nodes wide. = | ||||
| 3x3 nodes. = | ||||
| Use while sneaking to change Mining Drill Mk%d modes. = | ||||
| Hold shift and use to change Mining Drill Mk%d modes. = | ||||
| Mining Drill Mk%d Mode %d = | ||||
| Mining Drill Mk%d = | ||||
| Mining Laser Mk%d = | ||||
| @@ -170,9 +159,4 @@ Single node. = | ||||
| Sonic Screwdriver = | ||||
| Tree Tap = | ||||
|  | ||||
| ## Craft descriptions | ||||
| Alloy cooking = | ||||
| Grinding = | ||||
| Compressing = | ||||
| Extracting = | ||||
| Separating = | ||||
|  | ||||
|   | ||||
| @@ -1,22 +1,19 @@ | ||||
| -- 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_cable',        ''}, | ||||
| 		{'',                        'technic:hv_cable0',       ''}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_battery_box({ | ||||
| 	tier           = "HV", | ||||
| 	max_charge     = 1000000, | ||||
| 	max_charge     = 1500000, | ||||
| 	charge_rate    = 100000, | ||||
| 	discharge_rate = 400000, | ||||
| 	charge_step    = 10000, | ||||
| 	discharge_step = 40000, | ||||
| 	upgrade        = 1, | ||||
| 	tube           = 1, | ||||
| }) | ||||
|  | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:hv_cable 3', | ||||
| 	output = 'technic:hv_cable0 3', | ||||
| 	recipe = { | ||||
| 		{'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'}, | ||||
| 		{'technic:mv_cable',           'technic:mv_cable',           'technic:mv_cable'}, | ||||
| 		{'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'}, | ||||
| 		{'technic:rubber',    'technic:rubber',    'technic:rubber'}, | ||||
| 		{'technic:mv_cable0', 'technic:mv_cable0', 'technic:mv_cable0'}, | ||||
| 		{'technic:rubber',    'technic:rubber',    'technic:rubber'}, | ||||
| 	} | ||||
| }) | ||||
| })  | ||||
|  | ||||
| technic.register_cable("HV", 3/16) | ||||
|  | ||||
|   | ||||
| @@ -1,40 +1,26 @@ | ||||
| --- Forcefield generator. | ||||
| -- @author ShadowNinja | ||||
| -- Forcefield mod by ShadowNinja | ||||
| -- Modified by kpoppel | ||||
| -- | ||||
| -- Forcefields are powerful barriers but they consume huge amounts of power. | ||||
| -- The forcefield Generator is an HV machine. | ||||
| -- Forcefield Generator is a HV machine. | ||||
|  | ||||
| -- How expensive is the generator? | ||||
| -- Leaves room for upgrades lowering the power drain? | ||||
| local digilines_path = minetest.get_modpath("digilines") | ||||
|  | ||||
| local forcefield_power_drain   = 10 | ||||
| local forcefield_step_interval = 1 | ||||
|  | ||||
| local S = technic.getter | ||||
|  | ||||
| local cable_entry = "^technic_cable_connection_overlay.png" | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = "technic:forcefield_emitter_off", | ||||
| 	output = 'technic:forcefield_emitter_off', | ||||
| 	recipe = { | ||||
| 		{"default:mese",         "basic_materials:motor",          "default:mese"        }, | ||||
| 		{"technic:deployer_off", "technic:machine_casing", "technic:deployer_off"}, | ||||
| 		{"default:mese",         "technic:hv_cable",       "default:mese"        }, | ||||
| 			{'default:mese',         'technic:deployer_off', 'default:mese'        }, | ||||
| 			{'technic:deployer_off', 'technic:motor',        'technic:deployer_off'}, | ||||
| 			{'default:mese',         'technic:deployer_off', '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. | ||||
| --    ___   __ | ||||
| @@ -42,39 +28,26 @@ end) | ||||
| --  |          | | ||||
| --   \___/\___/ | ||||
|  | ||||
| local function update_forcefield(pos, meta, active) | ||||
| 	local shape = meta:get_int("shape") | ||||
| 	local range = meta:get_int("range") | ||||
| local function update_forcefield(pos, range, active) | ||||
| 	local vm = VoxelManip() | ||||
| 	local MinEdge, MaxEdge = vm:read_from_map(vector.subtract(pos, range), | ||||
| 			vector.add(pos, range)) | ||||
| 	local p1 = {x = pos.x-range, y = pos.y-range, z = pos.z-range} | ||||
| 	local p2 = {x = pos.x+range, y = pos.y+range, z = pos.z+range} | ||||
| 	local MinEdge, MaxEdge = vm:read_from_map(p1, p2) | ||||
| 	local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) | ||||
| 	local data = vm:get_data() | ||||
|  | ||||
| 	local c_air = minetest.get_content_id("air") | ||||
| 	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 | ||||
| 	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 | ||||
| 		if x*x+y*y+z*z <= range     *  range    +  range    and | ||||
| 		   x*x+y*y+z*z >= (range-1) * (range-1) + (range-1) then | ||||
| 			if active and data[vi] == c_air then | ||||
| 				data[vi] = c_field | ||||
| 			elseif not active and cid == c_field then | ||||
| 			elseif not active and data[vi] == c_field then | ||||
| 				data[vi] = c_air | ||||
| 			end | ||||
| 		end | ||||
| @@ -86,213 +59,55 @@ local function update_forcefield(pos, meta, active) | ||||
| 	vm:set_data(data) | ||||
| 	vm:update_liquids() | ||||
| 	vm:write_to_map() | ||||
| 	vm:update_map() | ||||
| end | ||||
|  | ||||
| local function set_forcefield_formspec(meta) | ||||
| 	local formspec | ||||
| 	if digilines_path then | ||||
| 		formspec = "size[5,3.25]".. | ||||
| 			"field[0.3,3;5,1;channel;Digiline Channel;"..meta:get_string("channel").."]" | ||||
| 	else | ||||
| 		formspec = "size[5,2.25]" | ||||
| 	end | ||||
| 	formspec = formspec.. | ||||
| 		"field[0.3,0.5;2,1;range;"..S("Range")..";"..meta:get_int("range").."]" | ||||
| 	-- The names for these toggle buttons are explicit about which | ||||
| 	-- state they'll switch to, so that multiple presses (arising | ||||
| 	-- from the ambiguity between lag and a missed press) only make | ||||
| 	-- the single change that the user expects. | ||||
| 	if meta:get_int("shape") == 0 then | ||||
| 		formspec = formspec.."button[3,0.2;2,1;shape1;"..S("Sphere").."]" | ||||
| 	else | ||||
| 		formspec = formspec.."button[3,0.2;2,1;shape0;"..S("Cube").."]" | ||||
| 	end | ||||
| 	if meta:get_int("mesecon_mode") == 0 then | ||||
| 		formspec = formspec.."button[0,1;5,1;mesecon_mode_1;"..S("Ignoring Mesecon Signal").."]" | ||||
| 	else | ||||
| 		formspec = formspec.."button[0,1;5,1;mesecon_mode_0;"..S("Controlled by Mesecon Signal").."]" | ||||
| 	end | ||||
| 	if meta:get_int("enabled") == 0 then | ||||
| 		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) | ||||
| local get_forcefield_formspec = function(range) | ||||
| 	return "size[3,1.5]".. | ||||
| 		"field[1,0.5;2,1;range;"..S("Range")..";"..range.."]".. | ||||
| 		"button[0,1;3,1;toggle;"..S("Enable/Disable").."]" | ||||
| end | ||||
|  | ||||
| local forcefield_receive_fields = function(pos, formname, fields, sender) | ||||
| 	local player_name = sender:get_player_name() | ||||
| 	if minetest.is_protected(pos, player_name) then | ||||
| 		minetest.chat_send_player(player_name, "You are not allowed to edit this!") | ||||
| 		minetest.record_protection_violation(pos, player_name) | ||||
| 		return | ||||
| 	end | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	local 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 | ||||
| 	local range = tonumber(fields.range) or 0 | ||||
|  | ||||
| 	if fields.toggle then | ||||
| 		if meta:get_int("enabled") == 1 then | ||||
| 		   meta:set_int("enabled", 0) | ||||
| 		else | ||||
| 		   meta:set_int("enabled", 1) | ||||
| 		end | ||||
| 	end | ||||
| 	if fields.shape0 or fields.shape1 or range then | ||||
| 		update_forcefield(pos, meta, false) | ||||
|  | ||||
| 	-- 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 meta:get_int("range") ~= range then | ||||
| 		update_forcefield(pos, meta:get_int("range"), false) | ||||
| 		meta:set_int("range", range) | ||||
| 		meta:set_string("formspec", get_forcefield_formspec(range)) | ||||
| 	end | ||||
| 	if range then meta:set_int("range", range) end | ||||
| 	if fields.channel then meta:set_string("channel", fields.channel) end | ||||
| 	if fields.shape0  then meta:set_int("shape", 0) end | ||||
| 	if fields.shape1  then meta:set_int("shape", 1) end | ||||
| 	if fields.enable  then meta:set_int("enabled", 1) end | ||||
| 	if fields.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) | ||||
| 			minetest.get_meta(pos):set_int("enabled", 0) | ||||
| 		end, | ||||
| 		action_off = function(pos, node) | ||||
| 			minetest.get_meta(pos):set_int("mesecon_effect", 0) | ||||
| 			minetest.get_meta(pos):set_int("enabled", 1) | ||||
| 		end | ||||
| 	} | ||||
| } | ||||
|  | ||||
| local digiline_def = { | ||||
| 	receptor = {action = function() end}, | ||||
| 	effector = { | ||||
| 		action = function(pos, node, channel, msg) | ||||
| 			local meta = minetest.get_meta(pos) | ||||
| 			if channel ~= meta:get_string("channel") then | ||||
| 				return | ||||
| 			end | ||||
| 			local msgt = type(msg) | ||||
| 			if msgt == "string" then | ||||
| 				local smsg = msg:lower() | ||||
| 				msg = {} | ||||
| 				if smsg == "get" then | ||||
| 					msg.command = "get" | ||||
| 				elseif smsg == "off" then | ||||
| 					msg.command = "off" | ||||
| 				elseif smsg == "on" then | ||||
| 					msg.command = "on" | ||||
| 				elseif smsg == "toggle" then | ||||
| 					msg.command = "toggle" | ||||
| 				elseif smsg:sub(1, 5) == "range" then | ||||
| 					msg.command = "range" | ||||
| 					msg.value = tonumber(smsg:sub(7)) | ||||
| 				elseif smsg:sub(1, 5) == "shape" then | ||||
| 					msg.command = "shape" | ||||
| 					msg.value = smsg:sub(7):lower() | ||||
| 					msg.value = tonumber(msg.value) or msg.value | ||||
| 				end | ||||
| 			elseif msgt ~= "table" then | ||||
| 				return | ||||
| 			end | ||||
| 			if msg.command == "get" then | ||||
| 				digilines.receptor_send(pos, digilines.rules.default, channel, { | ||||
| 					enabled = meta:get_int("enabled"), | ||||
| 					range   = meta:get_int("range"), | ||||
| 					shape   = meta:get_int("shape") | ||||
| 				}) | ||||
| 				return | ||||
| 			elseif msg.command == "off" then | ||||
| 				meta:set_int("enabled", 0) | ||||
| 			elseif msg.command == "on" then | ||||
| 				meta:set_int("enabled", 1) | ||||
| 			elseif msg.command == "toggle" then | ||||
| 				local onn = meta:get_int("enabled") | ||||
| 				onn = 1-onn -- Mirror onn with pivot 0.5, so switch between 1 and 0. | ||||
| 				meta:set_int("enabled", onn) | ||||
| 			elseif msg.command == "range" then | ||||
| 				if type(msg.value) ~= "number" then | ||||
| 					return | ||||
| 				end | ||||
| 				msg.value = math.max(msg.value, 5) | ||||
| 				msg.value = math.min(msg.value, 20) | ||||
| 				update_forcefield(pos, meta, false) | ||||
| 				meta:set_int("range", msg.value) | ||||
| 			elseif msg.command == "shape" then | ||||
| 				local valuet = type(msg.value) | ||||
| 				if valuet == "string" then | ||||
| 					if msg.value == "sphere" then | ||||
| 						msg.value = 0 | ||||
| 					elseif msg.value == "cube" then | ||||
| 						msg.value = 1 | ||||
| 					end | ||||
| 				elseif valuet ~= "number" then | ||||
| 					return | ||||
| 				end | ||||
| 				if not msg.value then | ||||
| 					return | ||||
| 				end | ||||
| 				update_forcefield(pos, meta, false) | ||||
| 				meta:set_int("shape", msg.value) | ||||
| 			else | ||||
| 				return | ||||
| 			end | ||||
| 			set_forcefield_formspec(meta) | ||||
| 		end | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| local function run(pos, node) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	local eu_input   = meta:get_int("HV_EU_input") | ||||
| 	local enabled = meta:get_int("enabled") ~= 0 and | ||||
| 		(meta:get_int("mesecon_mode") == 0 or meta:get_int("mesecon_effect") ~= 0) | ||||
| 	local machine_name = S("%s Forcefield Emitter"):format("HV") | ||||
|  | ||||
| 	local range = meta:get_int("range") | ||||
| 	local power_requirement | ||||
| 	if meta:get_int("shape") == 0 then | ||||
| 		power_requirement = math.floor(4 * math.pi * range * range) | ||||
| 	else | ||||
| 		power_requirement = 24 * range * range | ||||
| 	end | ||||
| 	power_requirement = power_requirement * forcefield_power_drain | ||||
|  | ||||
| 	if not enabled then | ||||
| 		if node.name == "technic:forcefield_emitter_on" then | ||||
| 			update_forcefield(pos, meta, false) | ||||
| 			technic.swap_node(pos, "technic:forcefield_emitter_off") | ||||
| 			meta:set_string("infotext", S("%s Disabled"):format(machine_name)) | ||||
| 		end | ||||
| 		meta:set_int("HV_EU_demand", 0) | ||||
| 		return | ||||
| 	end | ||||
| 	meta:set_int("HV_EU_demand", power_requirement) | ||||
| 	if eu_input < power_requirement then | ||||
| 		meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) | ||||
| 		if node.name == "technic:forcefield_emitter_on" then | ||||
| 			update_forcefield(pos, meta, false) | ||||
| 			technic.swap_node(pos, "technic:forcefield_emitter_off") | ||||
| 		end | ||||
| 	elseif eu_input >= power_requirement then | ||||
| 		if node.name == "technic:forcefield_emitter_off" then | ||||
| 			technic.swap_node(pos, "technic:forcefield_emitter_on") | ||||
| 			meta:set_string("infotext", S("%s Active"):format(machine_name)) | ||||
| 		end | ||||
| 		update_forcefield(pos, meta, true) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| minetest.register_node("technic:forcefield_emitter_off", { | ||||
| 	description = S("%s Forcefield Emitter"):format("HV"), | ||||
| 	tiles = { | ||||
| 		"technic_forcefield_emitter_off.png", | ||||
| 		"technic_machine_bottom.png"..cable_entry, | ||||
| 		"technic_forcefield_emitter_off.png", | ||||
| 		"technic_forcefield_emitter_off.png", | ||||
| 		"technic_forcefield_emitter_off.png", | ||||
| 		"technic_forcefield_emitter_off.png" | ||||
| 	}, | ||||
| 	groups = {cracky = 1, technic_machine = 1, technic_hv = 1}, | ||||
| 	description = S("Forcefield Emitter"), | ||||
| 	tiles = {"technic_forcefield_emitter_off.png"}, | ||||
| 	groups = {cracky = 1}, | ||||
| 	on_receive_fields = forcefield_receive_fields, | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| @@ -300,59 +115,37 @@ minetest.register_node("technic:forcefield_emitter_off", { | ||||
| 		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) | ||||
| 		if digilines_path then | ||||
| 			meta:set_string("channel", "forcefield"..minetest.pos_to_string(pos)) | ||||
| 		end | ||||
| 		meta:set_string("infotext", S("%s Forcefield Emitter"):format("HV")) | ||||
| 		set_forcefield_formspec(meta) | ||||
| 		meta:set_string("formspec", get_forcefield_formspec(10)) | ||||
| 		meta:set_string("infotext", S("Forcefield Emitter")) | ||||
| 	end, | ||||
| 	mesecons = mesecons, | ||||
| 	digiline = digiline_def, | ||||
| 	technic_run = run, | ||||
| 	mesecons = mesecons | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:forcefield_emitter_on", { | ||||
| 	description = S("%s Forcefield Emitter"):format("HV"), | ||||
| 	tiles = { | ||||
| 		"technic_forcefield_emitter_on.png", | ||||
| 		"technic_machine_bottom.png"..cable_entry, | ||||
| 		"technic_forcefield_emitter_on.png", | ||||
| 		"technic_forcefield_emitter_on.png", | ||||
| 		"technic_forcefield_emitter_on.png", | ||||
| 		"technic_forcefield_emitter_on.png" | ||||
| 	}, | ||||
| 	groups = {cracky = 1, technic_machine = 1, technic_hv = 1, | ||||
| 			not_in_creative_inventory=1}, | ||||
| 	description = S("Forcefield Emitter"), | ||||
| 	tiles = {"technic_forcefield_emitter_on.png"}, | ||||
| 	groups = {cracky = 1, not_in_creative_inventory=1}, | ||||
| 	drop = "technic:forcefield_emitter_off", | ||||
| 	on_receive_fields = forcefield_receive_fields, | ||||
| 	on_construct = function(pos)  | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		local range = meta:get_int("range") | ||||
| 		meta:set_string("formspec", get_forcefield_formspec(range)) | ||||
| 	end, | ||||
| 	on_destruct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		update_forcefield(pos, meta, false) | ||||
| 	end, | ||||
| 	mesecons = mesecons, | ||||
| 	digiline = digiline_def, | ||||
| 	technic_run = run, | ||||
| 	technic_on_disable = function (pos, node) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		update_forcefield(pos, meta, false) | ||||
| 		technic.swap_node(pos, "technic:forcefield_emitter_off") | ||||
| 	end, | ||||
| 	on_blast = function(pos, intensity) | ||||
| 		minetest.dig_node(pos) | ||||
| 		return {"technic:forcefield_emitter_off"} | ||||
| 		update_forcefield(pos, meta:get_int("range"), false) | ||||
| 	end, | ||||
| 	mesecons = mesecons | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:forcefield", { | ||||
| 	description = S("%s Forcefield"):format("HV"), | ||||
| 	description = S("Forcefield"), | ||||
| 	sunlight_propagates = true, | ||||
| 	drawtype = "glasslike", | ||||
| 	groups = {not_in_creative_inventory=1}, | ||||
| 	groups = {not_in_creative_inventory=1, unbreakable=1}, | ||||
| 	paramtype = "light", | ||||
| 	light_source = default.LIGHT_MAX, | ||||
| 	diggable = false, | ||||
|         light_source = 15, | ||||
| 	drop = '', | ||||
| 	tiles = {{ | ||||
| 		name = "technic_forcefield_animated.png", | ||||
| @@ -363,14 +156,53 @@ minetest.register_node("technic:forcefield", { | ||||
| 			length = 1.0, | ||||
| 		}, | ||||
| 	}}, | ||||
| 	on_blast = function(pos, intensity) | ||||
| 	end, | ||||
| }) | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:forcefield_emitter_on", "technic:forcefield_emitter_off"}, | ||||
| 	interval = 1, | ||||
| 	chance = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		local eu_input   = meta:get_int("HV_EU_input") | ||||
| 		local eu_demand  = meta:get_int("HV_EU_demand") | ||||
| 		local enabled    = meta:get_int("enabled") | ||||
| 		local machine_name = S("Forcefield Emitter") | ||||
| 		-- Power off automatically if no longer connected to a switching station | ||||
| 		technic.switching_station_timeout_count(pos, "HV") | ||||
|  | ||||
| 		local power_requirement = math.floor( | ||||
| 				4 * math.pi * math.pow(meta:get_int("range"), 2) | ||||
| 			) * forcefield_power_drain | ||||
|  | ||||
| 		if meta:get_int("enabled") == 0 then | ||||
| 			if node.name == "technic:forcefield_emitter_on" then | ||||
| 				meta:set_int("HV_EU_demand", 0) | ||||
| 				update_forcefield(pos, meta:get_int("range"), false) | ||||
| 				hacky_swap_node(pos, "technic:forcefield_emitter_off") | ||||
| 				meta:set_string("infotext", S("%s Disabled"):format(machine_name)) | ||||
| 				return | ||||
| 			end | ||||
| 		elseif eu_input < power_requirement then | ||||
| 			meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) | ||||
| 			if node.name == "technic:forcefield_emitter_on" then | ||||
| 				update_forcefield(pos, meta:get_int("range"), false) | ||||
| 				hacky_swap_node(pos, "technic:forcefield_emitter_off") | ||||
| 			end | ||||
| 		elseif eu_input >= power_requirement then | ||||
| 			if node.name == "technic:forcefield_emitter_off" then | ||||
| 				hacky_swap_node(pos, "technic:forcefield_emitter_on") | ||||
| 				meta:set_string("infotext", S("%s Active"):format(machine_name)) | ||||
| 			end | ||||
| 			update_forcefield(pos, meta:get_int("range"), true) | ||||
| 		end | ||||
| 		meta:set_int("HV_EU_demand", power_requirement) | ||||
| 	end | ||||
| }) | ||||
|  | ||||
|  | ||||
| if minetest.get_modpath("mesecons_mvps") then | ||||
| 	mesecon.register_mvps_stopper("technic:forcefield") | ||||
| 	mesecon:register_mvps_stopper("technic:forcefield") | ||||
| end | ||||
| -- TODO: Register a stopper for frames | ||||
|  | ||||
| technic.register_machine("HV", "technic:forcefield_emitter_on",  technic.receiver) | ||||
| technic.register_machine("HV", "technic:forcefield_emitter_off", technic.receiver) | ||||
|   | ||||
| @@ -1,13 +1,14 @@ | ||||
|  | ||||
| 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:mv_generator',   'technic:stainless_steel_ingot'}, | ||||
| 		{'pipeworks:tube_000000',         'technic:hv_transformer', 'pipeworks:tube_000000'}, | ||||
| 		{'technic:stainless_steel_ingot', 'technic:hv_cable',       'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_generator({tier="HV", tube=1, supply=1200}) | ||||
| technic.register_generator({tier="HV", supply=1200}) | ||||
|  | ||||
|   | ||||
| @@ -3,16 +3,11 @@ technic.register_tier("HV", "High Voltage") | ||||
|  | ||||
| local path = technic.modpath.."/machines/HV" | ||||
|  | ||||
| -- Wiring stuff | ||||
| dofile(path.."/cables.lua") | ||||
| dofile(path.."/quarry.lua") | ||||
| dofile(path.."/forcefield.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") | ||||
|  | ||||
|   | ||||
| @@ -1,482 +1,258 @@ | ||||
| --[[ | ||||
|  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. | ||||
| Provides 10000 HV EUs for one week (only counted when loaded). | ||||
| -- 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 (24h)) | ||||
| -- 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! | ||||
|  | ||||
| The nuclear reactor core requires a casing of water and a protective | ||||
| shield to work.  This is checked now and then and if the casing is not | ||||
| intact the reactor will melt down! | ||||
| --]] | ||||
|  | ||||
| local burn_ticks = 7 * 24 * 60 * 60  -- Seconds | ||||
| local power_supply = 100000  -- EUs | ||||
| local fuel_type = "technic:uranium_fuel"  -- The reactor burns this | ||||
| local digiline_meltdown = technic.config:get_bool("enable_nuclear_reactor_digiline_selfdestruct") | ||||
| local digiline_remote_path = minetest.get_modpath("digiline_remote") | ||||
| 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 | ||||
|  | ||||
| local reactor_desc = S("@1 Nuclear Reactor Core", S("HV")) | ||||
| local cable_entry = "^technic_cable_connection_overlay.png" | ||||
|  | ||||
| -- FIXME: Recipe should make more sense like a rod recepticle, steam chamber, HV generator? | ||||
| -- 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_cable',       'technic:stainless_steel_ingot'}, | ||||
| 		{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, | ||||
| 		{'technic:stainless_steel_ingot',                              '', 'technic:stainless_steel_ingot'}, | ||||
| 		{'technic:stainless_steel_ingot',              'technic:hv_cable', 'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| local function make_reactor_formspec(meta) | ||||
| 	local f = "size[8,9]".. | ||||
| 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[]".. | ||||
| 	"button[5.5,1.5;2,1;start;Start]".. | ||||
| 	"checkbox[5.5,2.5;autostart;automatic Start;"..meta:get_string("autostart").."]" | ||||
| 	if not digiline_remote_path then | ||||
| 		return f | ||||
| 	end | ||||
| 	local digiline_enabled = meta:get_string("enable_digiline") | ||||
| 	f = f.."checkbox[0.5,2.8;enable_digiline;Enable Digiline;"..digiline_enabled.."]" | ||||
| 	if digiline_enabled ~= "true" then | ||||
| 		return f | ||||
| 	end | ||||
| 	return f.. | ||||
| 		"button_exit[4.6,3.69;2,1;save;Save]".. | ||||
| 		"field[1,4;4,1;remote_channel;Digiline Remote Channel;${remote_channel}]" | ||||
| end | ||||
| 	"list[current_player;main;0,5;8,4;]" | ||||
|  | ||||
| local SS_OFF = 0 | ||||
| local SS_DANGER = 1 | ||||
| local SS_CLEAR = 2 | ||||
| -- "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, state) | ||||
| 	local hpos = minetest.hash_node_position(pos) | ||||
| 	local siren = reactor_siren[hpos] | ||||
| 	if not siren then | ||||
| 		if state == SS_OFF then return end | ||||
| 		siren = {state=SS_OFF} | ||||
| 		reactor_siren[hpos] = siren | ||||
| 	end | ||||
| 	if state == SS_DANGER and siren.state ~= SS_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 = SS_DANGER | ||||
| 	elseif state == SS_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 = SS_CLEAR | ||||
| 		minetest.after(10, function() | ||||
| 			if siren.handle ~= clear_handle then return end | ||||
| 			minetest.sound_stop(clear_handle) | ||||
| 			if reactor_siren[hpos] == siren then | ||||
| 				reactor_siren[hpos] = nil | ||||
| 			end | ||||
| 		end) | ||||
| 	elseif state == SS_OFF and siren.state ~= SS_OFF then | ||||
| 		if siren.handle then minetest.sound_stop(siren.handle) end | ||||
| 		reactor_siren[hpos] = nil | ||||
| 	end | ||||
| end | ||||
| minetest.register_node("technic:hv_nuclear_reactor_core", { | ||||
| 	description = S("Nuclear Reactor Core"), | ||||
| 	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 = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, | ||||
| 	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 Reactor Core")) | ||||
| 		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 = function(pos, player) | ||||
| 		local meta = minetest.get_meta(pos); | ||||
| 		local inv = meta:get_inventory() | ||||
| 		if not inv:is_empty("src") then | ||||
| 			minetest.chat_send_player(player:get_player_name(), | ||||
| 				S("Machine cannot be removed because it is not empty")) | ||||
| 			return false | ||||
| 		else | ||||
| 			return true | ||||
| 		end | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| local function siren_danger(pos, meta) | ||||
| 	meta:set_int("siren", 1) | ||||
| 	siren_set_state(pos, SS_DANGER) | ||||
| end | ||||
| 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 = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	drop="technic:hv_nuclear_reactor_core", | ||||
| 	drawtype="nodebox", | ||||
| 	light_source = 15, | ||||
| 	paramtype = "light", | ||||
| 	node_box = { | ||||
| 		type = "fixed", | ||||
| 		fixed = nodebox | ||||
| 	}, | ||||
| 	can_dig = function(pos, player) | ||||
| 		local meta = minetest.get_meta(pos); | ||||
| 		local inv = meta:get_inventory() | ||||
| 		if not inv:is_empty("src") then | ||||
| 			minetest.chat_send_player(player:get_player_name(), | ||||
| 				S("Machine cannot be removed because it is not empty")) | ||||
| 			return false | ||||
| 		else | ||||
| 			return true | ||||
| 		end | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| local function siren_clear(pos, meta) | ||||
| 	if meta:get_int("siren") ~= 0 then | ||||
| 		siren_set_state(pos, SS_CLEAR) | ||||
| 		meta:set_int("siren", 0) | ||||
| 	end | ||||
| end | ||||
| local check_reactor_structure = function(pos) | ||||
| 	-- The reactor consists of a 9x9x9 cube structure | ||||
| 	-- 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 is only in the middle | ||||
| 	--  The man-hole is optional | ||||
|  | ||||
| --[[ | ||||
| The standard reactor structure consists of a 9x9x9 cube.  A cross | ||||
| section through the middle: | ||||
|  | ||||
| 	CCCC CCCC | ||||
| 	CBBB BBBC | ||||
| 	CBLL LLBC | ||||
| 	CBLWWWLBC | ||||
| 	CBLW#WLBC | ||||
| 	CBLW|WLBC | ||||
| 	CBLL|LLBC | ||||
| 	CBBB|BBBC | ||||
| 	CCCC|CCCC | ||||
| 	C = Concrete, B = Blast-resistant concrete, L = Lead, | ||||
| 	W = water node, # = reactor core, | = HV cable | ||||
|  | ||||
| The man-hole is optional (but necessary for refueling). | ||||
|  | ||||
| For the reactor to operate and not melt down, it insists on the inner | ||||
| 7x7x7 portion (from the core out to the blast-resistant concrete) | ||||
| being intact.  Intactness only depends on the number of nodes of the | ||||
| right type in each layer.  The water layer must have water in all but | ||||
| at most one node; the steel and blast-resistant concrete layers must | ||||
| have the right material in all but at most two nodes.  The permitted | ||||
| gaps are meant for the cable and man-hole, but can actually be anywhere | ||||
| and contain anything.  For the reactor to be useful, a cable must | ||||
| connect to the core, but it can go in any direction. | ||||
|  | ||||
| The outer concrete layer of the standard structure is not required | ||||
| for the reactor to operate.  It is noted here because it used to | ||||
| be mandatory, and for historical reasons (that it predates the | ||||
| implementation of radiation) it needs to continue being adequate | ||||
| shielding of legacy reactors.  If it ever ceases to be adequate | ||||
| shielding for new reactors, legacy ones should be grandfathered. | ||||
|  | ||||
| For legacy reasons, if the reactor has a stainless steel layer instead | ||||
| of a lead layer it will be converted to a lead layer. | ||||
| --]] | ||||
| local function reactor_structure_badness(pos) | ||||
| 	local vm = VoxelManip() | ||||
| 	local pos1 = vector.subtract(pos, 3) | ||||
| 	local pos2 = vector.add(pos, 3) | ||||
| 	local pos1 = vector.subtract(pos, 4) | ||||
| 	local pos2 = vector.add(pos, 4) | ||||
| 	local MinEdge, MaxEdge = vm:read_from_map(pos1, pos2) | ||||
| 	local data = vm:get_data() | ||||
| 	local area = VoxelArea:new({MinEdge=MinEdge, MaxEdge=MaxEdge}) | ||||
|  | ||||
| 	local c_concrete = minetest.get_content_id("technic:concrete") | ||||
| 	local c_blast_concrete = minetest.get_content_id("technic:blast_resistant_concrete") | ||||
| 	local c_lead = minetest.get_content_id("technic:lead_block") | ||||
| 	local c_steel = minetest.get_content_id("technic:stainless_steel_block") | ||||
| 	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 blast_layer, steel_layer, lead_layer, water_layer = 0, 0, 0, 0 | ||||
| 	local concretelayer, blastlayer, steellayer, waterlayer = 0, 0, 0, 0 | ||||
|  | ||||
| 	for z = pos1.z, pos2.z do | ||||
| 	for y = pos1.y, pos2.y do | ||||
| 	for x = pos1.x, pos2.x do | ||||
| 		local cid = data[area:index(x, y, z)] | ||||
| 		-- If the position is in the outer layer | ||||
| 		if x == pos1.x or x == pos2.x or | ||||
| 		   y == pos1.y or y == pos2.y or | ||||
| 		   z == pos1.z or z == pos2.z then | ||||
| 			if cid == c_blast_concrete then | ||||
| 				blast_layer = blast_layer + 1 | ||||
| 			if data[area:index(x, y, z)] == c_concrete then | ||||
| 				concretelayer = concretelayer + 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_lead then | ||||
| 				lead_layer = lead_layer + 1 | ||||
| 			elseif cid == c_steel then | ||||
| 				steel_layer = steel_layer + 1 | ||||
| 		   y == pos1.y+1 or y == pos2.y-1 or | ||||
| 		   z == pos1.z+1 or z == pos2.z-1 then | ||||
| 			if data[area:index(x, y, z)] == c_blast_concrete then | ||||
| 				blastlayer = blastlayer + 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 | ||||
| 		   y == pos1.y+2 or y == pos2.y-2 or | ||||
| 		   z == pos1.z+2 or z == pos2.z-2 then | ||||
| 			if data[area:index(x, y, z)] == c_stainless_steel then | ||||
| 				steellayer = steellayer + 1 | ||||
| 			end | ||||
| 		elseif x == pos1.x+3 or x == pos2.x-3 or | ||||
| 		   y == pos1.y+3 or y == pos2.y-3 or | ||||
| 		   z == pos1.z+3 or z == pos2.z-3 then | ||||
| 		   	local cid = data[area:index(x, y, z)] | ||||
| 			if cid == c_water_source or cid == c_water_flowing then | ||||
| 				water_layer = water_layer + 1 | ||||
| 				waterlayer = waterlayer + 1 | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	end | ||||
| 	end | ||||
|  | ||||
| 	if steel_layer >= 96 then | ||||
| 		for z = pos1.z+1, pos2.z-1 do | ||||
| 		for y = pos1.y+1, pos2.y-1 do | ||||
| 		for x = pos1.x+1, pos2.x-1 do | ||||
| 			local vi = area:index(x, y, z) | ||||
| 			if 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 data[vi] == c_steel then | ||||
| 					data[vi] = c_lead | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 		end | ||||
| 		end | ||||
| 		vm:set_data(data) | ||||
| 		vm:write_to_map() | ||||
| 		lead_layer = steel_layer | ||||
| 	if waterlayer >= 25 and | ||||
| 	   steellayer >= 96 and | ||||
| 	   blastlayer >= 216 and | ||||
| 	   concretelayer >= 384 then | ||||
| 		return true | ||||
| 	end | ||||
|  | ||||
| 	if water_layer > 25 then water_layer = 25 end | ||||
| 	if lead_layer > 96 then lead_layer = 96 end | ||||
| 	if blast_layer > 216 then blast_layer = 216 end | ||||
| 	return (25 - water_layer) + (96 - lead_layer) + (216 - blast_layer) | ||||
| end | ||||
|  | ||||
|  | ||||
| local function melt_down_reactor(pos) | ||||
| 	minetest.log("action", "A reactor melted down at "..minetest.pos_to_string(pos)) | ||||
| 	minetest.set_node(pos, {name = "technic:corium_source"}) | ||||
| local explode_reactor = function(pos) | ||||
| 	print("A reactor exploded at "..minetest.pos_to_string(pos)) | ||||
| end | ||||
|  | ||||
|  | ||||
| local function start_reactor(pos, meta) | ||||
| 	if minetest.get_node(pos).name ~= "technic:hv_nuclear_reactor_core" then | ||||
| 		return false | ||||
| 	end | ||||
| 	local inv = meta:get_inventory() | ||||
| 	if inv:is_empty("src") then | ||||
| 		return false | ||||
| 	end | ||||
| 	local src_list = inv:get_list("src") | ||||
| 	local correct_fuel_count = 0 | ||||
| 	for _, src_stack in pairs(src_list) do | ||||
| 		if src_stack and src_stack:get_name() == fuel_type then | ||||
| 			correct_fuel_count = correct_fuel_count + 1 | ||||
| local function damage_nearby_players(pos) | ||||
| 	local objs = minetest.get_objects_inside_radius(pos, 4) | ||||
| 	for _, o in pairs(objs) do | ||||
| 		if o:is_player() then | ||||
| 			o:set_hp(math.max(o:get_hp() - 2, 0)) | ||||
| 		end | ||||
| 	end | ||||
| 	-- Check that the reactor is complete and has the correct fuel | ||||
| 	if correct_fuel_count ~= 6 or reactor_structure_badness(pos) ~= 0 then | ||||
| 		return false | ||||
| 	end | ||||
| 	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, src_stack in pairs(src_list) do | ||||
| 		src_stack:take_item() | ||||
| 		inv:set_stack("src", idx, src_stack) | ||||
| 	end | ||||
| 	return true | ||||
| end | ||||
|  | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	label = "Machines: reactor melt-down check", | ||||
| 	nodenames = {"technic:hv_nuclear_reactor_core_active"}, | ||||
| 	interval = 4, | ||||
| 	chance = 1, | ||||
| 	action = function (pos, node) | ||||
| 	nodenames = {"technic:hv_nuclear_reactor_core", "technic:hv_nuclear_reactor_core_active"}, | ||||
| 	interval = 1, | ||||
| 	chance   = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		local badness = reactor_structure_badness(pos) | ||||
| 		local accum_badness = meta:get_int("structure_accumulated_badness") | ||||
| 		if badness == 0 then | ||||
| 			if accum_badness ~= 0 then | ||||
| 				meta:set_int("structure_accumulated_badness", math.max(accum_badness - 4, 0)) | ||||
| 				siren_clear(pos, meta) | ||||
| 			end | ||||
| 		else | ||||
| 			siren_danger(pos, meta) | ||||
| 			accum_badness = accum_badness + badness | ||||
| 			if accum_badness >= 25 then | ||||
| 				melt_down_reactor(pos) | ||||
| 			else | ||||
| 				meta:set_int("structure_accumulated_badness", accum_badness) | ||||
| 			end | ||||
| 		end | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| local function run(pos, node) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	local burn_time = meta:get_int("burn_time") or 0 | ||||
| 	if burn_time >= burn_ticks or burn_time == 0 then | ||||
| 		if digiline_remote_path and meta:get_int("HV_EU_supply") == power_supply then | ||||
| 			digiline_remote.send_to_node(pos, meta:get_string("remote_channel"), | ||||
| 					"fuel used", 6, true) | ||||
| 		end | ||||
| 		if meta:get_string("autostart") == "true" then | ||||
| 			if start_reactor(pos, meta) then | ||||
| 				return | ||||
| 			end | ||||
| 		end | ||||
| 		meta:set_int("HV_EU_supply", 0) | ||||
| 		meta:set_int("burn_time", 0) | ||||
| 		meta:set_string("infotext", S("%s Idle"):format(reactor_desc)) | ||||
| 		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", reactor_desc.." ("..percent.."%)") | ||||
| 		meta:set_int("HV_EU_supply", power_supply) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local nuclear_reactor_receive_fields = function(pos, formname, fields, sender) | ||||
| 	local player_name = sender:get_player_name() | ||||
| 	if minetest.is_protected(pos, player_name) then | ||||
| 		minetest.chat_send_player(player_name, "You are not allowed to edit this!") | ||||
| 		minetest.record_protection_violation(pos, player_name) | ||||
| 		return | ||||
| 	end | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	local update_formspec = false | ||||
| 	if fields.remote_channel then | ||||
| 		meta:set_string("remote_channel", fields.remote_channel) | ||||
| 	end | ||||
| 	if fields.start then | ||||
| 		local b = start_reactor(pos, meta) | ||||
| 		if b then | ||||
| 			minetest.chat_send_player(player_name, "Start successful") | ||||
| 		else | ||||
| 			minetest.chat_send_player(player_name, "Error") | ||||
| 		end | ||||
| 	end | ||||
| 	if fields.autostart then | ||||
| 		meta:set_string("autostart", fields.autostart) | ||||
| 		update_formspec = true | ||||
| 	end | ||||
| 	if fields.enable_digiline then | ||||
| 		meta:set_string("enable_digiline", fields.enable_digiline) | ||||
| 		update_formspec = true | ||||
| 	end | ||||
| 	if update_formspec then | ||||
| 		meta:set_string("formspec", make_reactor_formspec(meta)) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local digiline_remote_def = function(pos, channel, msg) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	if meta:get_string("enable_digiline") ~= "true" or | ||||
| 			channel ~= meta:get_string("remote_channel") then | ||||
| 		return | ||||
| 	end | ||||
| 	-- Convert string messages to tables: | ||||
| 	local msgt = type(msg) | ||||
| 	if msgt == "string" then | ||||
| 		local smsg = msg:lower() | ||||
| 		msg = {} | ||||
| 		if smsg == "get" then | ||||
| 			msg.command = "get" | ||||
| 		elseif smsg:sub(1, 13) == "self_destruct" then | ||||
| 			msg.command = "self_destruct" | ||||
| 			msg.timer = tonumber(smsg:sub(15)) or 0 | ||||
| 		elseif smsg == "start" then | ||||
| 			msg.command = "start" | ||||
| 		end | ||||
| 	elseif msgt ~= "table" then | ||||
| 		return | ||||
| 	end | ||||
|  | ||||
| 	if msg.command == "get" then | ||||
| 		local inv = meta:get_inventory() | ||||
| 		local invtable = {} | ||||
| 		for i = 1, 6 do | ||||
| 			local stack = inv:get_stack("src", i) | ||||
| 			if stack:is_empty() then | ||||
| 				invtable[i] = 0 | ||||
| 			elseif stack:get_name() == fuel_type then | ||||
| 				invtable[i] = stack:get_count() | ||||
| 			else | ||||
| 				invtable[i] = -stack:get_count() | ||||
| 			end | ||||
| 		end | ||||
| 		digiline_remote.send_to_node(pos, channel, { | ||||
| 			burn_time = meta:get_int("burn_time"), | ||||
| 			enabled   = meta:get_int("HV_EU_supply") == power_supply, | ||||
| 			siren     = meta:get_int("siren") == 1, | ||||
| 			structure_accumulated_badness = meta:get_int("structure_accumulated_badness"), | ||||
| 			rods = invtable | ||||
| 		}, 6, true) | ||||
| 	elseif digiline_meltdown and msg.command == "self_destruct" and | ||||
| 			minetest.get_node(pos).name == "technic:hv_nuclear_reactor_core_active" then | ||||
| 		if msg.timer ~= 0 and type(msg.timer) == "number" then | ||||
| 			siren_danger(pos, meta) | ||||
| 			minetest.after(msg.timer, melt_down_reactor, pos) | ||||
| 		else | ||||
| 			melt_down_reactor(pos) | ||||
| 		end | ||||
| 	elseif msg.command == "start" then | ||||
| 		local b = start_reactor(pos, meta) | ||||
| 		if b then | ||||
| 			digiline_remote.send_to_node(pos, channel, "Start successful", 6, true) | ||||
| 		else | ||||
| 			digiline_remote.send_to_node(pos, channel, "Error", 6, true) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| minetest.register_node("technic:hv_nuclear_reactor_core", { | ||||
| 	description = reactor_desc, | ||||
| 	tiles = { | ||||
| 		"technic_hv_nuclear_reactor_core.png", | ||||
| 		"technic_hv_nuclear_reactor_core.png"..cable_entry | ||||
| 	}, | ||||
| 	drawtype = "mesh", | ||||
| 	mesh = "technic_reactor.obj", | ||||
| 	groups = {cracky = 1, technic_machine = 1, technic_hv = 1, digiline_remote_receive = 1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	paramtype = "light", | ||||
| 	paramtype2 = "facedir", | ||||
| 	stack_max = 1, | ||||
| 	on_receive_fields = nuclear_reactor_receive_fields, | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", reactor_desc) | ||||
| 		meta:set_string("formspec", make_reactor_formspec(meta)) | ||||
| 		if digiline_remote_path then | ||||
| 			meta:set_string("remote_channel", | ||||
| 					"nucelear_reactor"..minetest.pos_to_string(pos)) | ||||
| 		end | ||||
| 		local inv = meta:get_inventory() | ||||
| 		inv:set_size("src", 6) | ||||
| 	end, | ||||
| 	_on_digiline_remote_receive = digiline_remote_def, | ||||
| 	can_dig = technic.machine_can_dig, | ||||
| 	on_destruct = function(pos) siren_set_state(pos, SS_OFF) end, | ||||
| 	allow_metadata_inventory_put = technic.machine_inventory_put, | ||||
| 	allow_metadata_inventory_take = technic.machine_inventory_take, | ||||
| 	allow_metadata_inventory_move = technic.machine_inventory_move, | ||||
| 	technic_run = run, | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:hv_nuclear_reactor_core_active", { | ||||
| 	tiles = { | ||||
| 		"technic_hv_nuclear_reactor_core.png", | ||||
| 		"technic_hv_nuclear_reactor_core.png"..cable_entry | ||||
| 	}, | ||||
| 	drawtype = "mesh", | ||||
| 	mesh = "technic_reactor.obj", | ||||
| 	groups = {cracky = 1, technic_machine = 1, technic_hv = 1, radioactive = 4, | ||||
| 		not_in_creative_inventory = 1, digiline_remote_receive = 1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	drop = "technic:hv_nuclear_reactor_core", | ||||
| 	light_source = 14, | ||||
| 	paramtype = "light", | ||||
| 	paramtype2 = "facedir", | ||||
| 	on_receive_fields = nuclear_reactor_receive_fields, | ||||
| 	_on_digiline_remote_receive = digiline_remote_def, | ||||
| 	can_dig = technic.machine_can_dig, | ||||
| 	after_dig_node = melt_down_reactor, | ||||
| 	on_destruct = function(pos) siren_set_state(pos, SS_OFF) end, | ||||
| 	allow_metadata_inventory_put = technic.machine_inventory_put, | ||||
| 	allow_metadata_inventory_take = technic.machine_inventory_take, | ||||
| 	allow_metadata_inventory_move = technic.machine_inventory_move, | ||||
| 	technic_run = run, | ||||
| 	technic_on_disable = function(pos, node) | ||||
| 		local timer = minetest.get_node_timer(pos) | ||||
|         	timer:start(1) | ||||
|         end, | ||||
| 	on_timer = function(pos, node) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
|  | ||||
| 		-- Connected back? | ||||
| 		if meta:get_int("HV_EU_timeout") > 0 then return false end | ||||
|  | ||||
| 		local machine_name = S("Nuclear Reactor Core") | ||||
| 		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 | ||||
| 				   check_reactor_structure(pos) then | ||||
| 					meta:set_int("burn_time", 1) | ||||
| 					hacky_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) | ||||
| 			technic.swap_node(pos, "technic:hv_nuclear_reactor_core") | ||||
| 			meta:set_int("structure_accumulated_badness", 0) | ||||
| 			siren_clear(pos, meta) | ||||
| 			return false | ||||
| 			meta:set_string("infotext", S("%s Idle"):format(machine_name)) | ||||
| 			hacky_swap_node(pos, "technic:hv_nuclear_reactor_core") | ||||
| 		elseif burn_time > 0 then | ||||
| 			damage_nearby_players(pos) | ||||
| 			if not check_reactor_structure(pos) then | ||||
| 				explode_reactor(pos) | ||||
| 			end | ||||
| 			burn_time = burn_time + 1 | ||||
| 			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 | ||||
|  | ||||
| 		meta:set_int("burn_time", burn_time + 1) | ||||
| 		return true | ||||
| 	end, | ||||
| 	end | ||||
| }) | ||||
|  | ||||
| technic.register_machine("HV", "technic:hv_nuclear_reactor_core",        technic.producer) | ||||
|   | ||||
| @@ -1,274 +1,203 @@ | ||||
|  | ||||
| local S = technic.getter | ||||
|  | ||||
| local tube_entry = "^pipeworks_tube_connection_metallic.png" | ||||
| local cable_entry = "^technic_cable_connection_overlay.png" | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	recipe = { | ||||
| 		{"technic:carbon_plate",       "pipeworks:filter",       "technic:composite_plate"}, | ||||
| 		{"basic_materials:motor",              "technic:machine_casing", "technic:diamond_drill_head"}, | ||||
| 		{"technic:carbon_steel_block", "technic:hv_cable",       "technic:carbon_steel_block"}}, | ||||
| 		{"default:steelblock", "pipeworks:filter",           "default:steelblock"}, | ||||
| 		{"default:steelblock", "technic:motor",              "default:steelblock"}, | ||||
| 		{"default:steelblock", "technic:diamond_drill_head", "default:steelblock"}}, | ||||
| 	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 quarry_eject_dir = vector.new(0, 1, 0) | ||||
|  | ||||
| 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 | ||||
| local function get_quarry_formspec(size) | ||||
| 	return "size[3,1.5]".. | ||||
| 		"field[1,0.5;2,1;size;Radius;"..size.."]".. | ||||
| 		"button[0,1;3,1;toggle;"..S("Enable/Disable").."]" | ||||
| end | ||||
|  | ||||
| local function quarry_receive_fields(pos, formname, fields, sender) | ||||
| 	local player_name = sender:get_player_name() | ||||
| 	if minetest.is_protected(pos, player_name) then | ||||
| 		minetest.chat_send_player(player_name, "You are not allowed to edit this!") | ||||
| 		minetest.record_protection_violation(pos, player_name) | ||||
| 		return | ||||
| 	end | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	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 size = tonumber(fields.size) | ||||
|  | ||||
| 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, quarry_eject_dir, item) | ||||
| 				stack:clear() | ||||
| 				inv:set_stack("cache", i, stack) | ||||
| 				break | ||||
| 			end | ||||
| 	if fields.toggle then | ||||
| 		if meta:get_int("enabled") == 0 then | ||||
| 			meta:set_int("enabled", 1) | ||||
| 		else | ||||
| 			meta:set_int("enabled", 0) | ||||
| 		end | ||||
| 	end | ||||
| 	if inv:is_empty("cache") then | ||||
| 		meta:set_int("purge_on", 0) | ||||
|  | ||||
| 	-- Smallest size is 2. Anything less is asking for trouble. | ||||
| 	-- Largest is 8. It is a matter of pratical node handling. | ||||
| 	size = math.max(size, 2) | ||||
| 	size = math.min(size, 8) | ||||
|  | ||||
| 	if meta:get_int("size") ~= size then | ||||
| 		meta:set_int("size", size) | ||||
| 		meta:set_string("formspec", get_quarry_formspec(size)) | ||||
| 	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 | ||||
| local function get_quarry_center(pos, size) | ||||
| 	local node     = minetest.get_node(pos) | ||||
| 	local back_dir = minetest.facedir_to_dir(node.param2) | ||||
| 	local relative_center = vector.multiply(back_dir, size + 1) | ||||
| 	local center = vector.add(pos, relative_center) | ||||
| 	return center | ||||
| end | ||||
|  | ||||
| 	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) | ||||
| 		if pdir.y ~= 0 then | ||||
| 			-- faces up or down, not valid, otherwise depth-check would run endless and hang up the server | ||||
| local function gen_next_digpos(center, digpos, size) | ||||
| 	digpos.x = digpos.x + 1 | ||||
| 	if digpos.x > center.x + size then | ||||
| 		digpos.x = center.x - size | ||||
| 		digpos.z = digpos.z + 1 | ||||
| 	end | ||||
| 	if digpos.z > center.z + size then | ||||
| 		digpos.x = center.x - size | ||||
| 		digpos.z = center.z - size | ||||
| 		digpos.y = digpos.y - 1 | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local function find_next_digpos(data, area, center, dig_y, size) | ||||
| 	local c_air = minetest.get_content_id("air") | ||||
|  | ||||
| 	for y = center.y + quarry_dig_above_nodes, dig_y - 1, -1 do | ||||
| 	for z = center.z - size, center.z + size do | ||||
| 	for x = center.x - size, center.x + size do | ||||
| 		if data[area:index(x, y, z)] ~= c_air then | ||||
| 			return vector.new(x, y, z) | ||||
| 		end | ||||
| 	end | ||||
| 	end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local function quarry_dig(pos, center, size) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	local drops = {} | ||||
| 	local dig_y = meta:get_int("dig_y") | ||||
| 	local owner = meta:get_int("owner") | ||||
|  | ||||
| 	local vm = VoxelManip() | ||||
| 	local p1 = vector.new( | ||||
| 			center.x - size, | ||||
| 			center.y + quarry_dig_above_nodes, | ||||
| 			center.z - size) | ||||
| 	local p2 = vector.new( | ||||
| 			center.x + size, | ||||
| 			dig_y - 1, -- One node lower in case we have finished the current layer | ||||
| 			center.z + size) | ||||
| 	local e1, e2 = vm:read_from_map(p1, p2) | ||||
| 	local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2}) | ||||
| 	local data = vm:get_data() | ||||
|  | ||||
| 	local digpos = find_next_digpos(data, area, center, dig_y, size) | ||||
|  | ||||
| 	if digpos then | ||||
| 		if digpos.y < pos.y - quarry_max_depth then | ||||
| 			meta:set_int("dig_y", digpos.y) | ||||
| 			return drops | ||||
| 		end | ||||
| 		if minetest.is_protected and minetest.is_protected(digpos, owner) then | ||||
| 			meta:set_int("enabled", 0) | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		local qdir = pdir.x == 1 and vector.new(0,0,-1) or | ||||
| 			(pdir.z == -1 and vector.new(-1,0,0) or | ||||
| 			(pdir.x == -1 and vector.new(0,0,1) or | ||||
| 			vector.new(1,0,0))) | ||||
| 		local radius = meta:get_int("size") | ||||
| 		local diameter = radius*2 + 1 | ||||
| 		local startpos = vector.add(vector.add(vector.add(pos, | ||||
| 			vector.new(0, quarry_dig_above_nodes, 0)), | ||||
| 			pdir), | ||||
| 			vector.multiply(qdir, -radius)) | ||||
| 		local owner = meta:get_string("owner") | ||||
| 		local nd = meta:get_int("dug") | ||||
| 		while nd < diameter*diameter * (quarry_dig_above_nodes+1+quarry_max_depth) do | ||||
| 			local ry = math.floor(nd / (diameter*diameter)) | ||||
| 			local ndl = nd % (diameter*diameter) | ||||
| 			if ry % 2 == 1 then | ||||
| 				ndl = diameter*diameter - 1 - ndl | ||||
| 			end | ||||
| 			local rq = math.floor(ndl / diameter) | ||||
| 			local rp = ndl % diameter | ||||
| 			if rq % 2 == 1 then rp = diameter - 1 - rp end | ||||
| 			local digpos = vector.add(vector.add(vector.add(startpos, | ||||
| 				vector.new(0, -ry, 0)), | ||||
| 				vector.multiply(pdir, rp)), | ||||
| 				vector.multiply(qdir, rq)) | ||||
| 			local can_dig = true | ||||
| 			if can_dig and minetest.is_protected and minetest.is_protected(digpos, owner) then | ||||
| 				can_dig = false | ||||
| 			end | ||||
| 			local dignode | ||||
| 			if can_dig then | ||||
| 				dignode = technic.get_or_load_node(digpos) or minetest.get_node(digpos) | ||||
| 				local dignodedef = minetest.registered_nodes[dignode.name] or {diggable=false} | ||||
| 				-- doors mod among other thing does NOT like a nil digger... | ||||
| 				local fakedigger = pipeworks.create_fake_player({ | ||||
| 					name = owner | ||||
| 				}) | ||||
| 				if not dignodedef.diggable or (dignodedef.can_dig and not dignodedef.can_dig(digpos, fakedigger)) then | ||||
| 					can_dig = false | ||||
| 				end | ||||
| 			end | ||||
|  | ||||
| 			if can_dig then | ||||
| 				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 | ||||
| 		dig_y = digpos.y | ||||
| 		local node = minetest.get_node(digpos) | ||||
| 		drops = minetest.get_node_drops(node.name, "") | ||||
| 		minetest.dig_node(digpos) | ||||
| 		if minetest.get_node(digpos).name == node.name then | ||||
| 			-- We tried to dig something undigable like a | ||||
| 			-- filled chest. Notice that we check for a node | ||||
| 			-- change, not for air. This is so that we get drops | ||||
| 			-- from things like concrete posts with platforms, | ||||
| 			-- which turn into regular concrete posts when dug. | ||||
| 			drops = {} | ||||
| 		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) | ||||
| 	elseif not (dig_y < pos.y - quarry_max_depth) then | ||||
| 		dig_y = dig_y - 16 | ||||
| 	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) | ||||
|  | ||||
| 	meta:set_int("dig_y", dig_y) | ||||
| 	return drops | ||||
| 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 | ||||
| local function send_items(items, pos, node) | ||||
| 	for _, item in pairs(items) do | ||||
| 		local tube_item = tube_item(vector.new(pos), item) | ||||
| 		tube_item:get_luaentity().start_pos = vector.new(pos) | ||||
| 		tube_item:setvelocity(vector.new(0, 1, 0)) | ||||
| 		tube_item:setacceleration({x=0, y=0, z=0}) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| minetest.register_node("technic:quarry", { | ||||
| 	description = S("%s Quarry"):format("HV"), | ||||
| 	tiles = { | ||||
| 		"technic_carbon_steel_block.png"..tube_entry, | ||||
| 		"technic_carbon_steel_block.png"..cable_entry, | ||||
| 		"technic_carbon_steel_block.png"..cable_entry, | ||||
| 		"technic_carbon_steel_block.png"..cable_entry, | ||||
| 		"technic_carbon_steel_block.png^default_tool_mesepick.png", | ||||
| 		"technic_carbon_steel_block.png"..cable_entry | ||||
| 	}, | ||||
| 	description = S("Quarry"), | ||||
| 	tiles = {"default_steel_block.png", "default_steel_block.png", | ||||
| 	         "default_steel_block.png", "default_steel_block.png", | ||||
| 	         "default_steel_block.png^default_tool_mesepick.png", "default_steel_block.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {cracky=2, tubedevice=1, technic_machine=1, technic_hv=1}, | ||||
| 	connect_sides = {"bottom", "front", "left", "right"}, | ||||
| 	groups = {cracky=2, tubedevice=1}, | ||||
| 	tube = { | ||||
| 		connect_sides = {top = 1}, | ||||
| 		-- lower priority than other tubes, so that quarries will prefer any | ||||
| 		-- other tube to another quarry, which could lead to server freezes | ||||
| 		-- in certain quarry placements (2x2 for example would never eject) | ||||
| 		priority = 10, | ||||
| 		can_go = function(pos, node, velocity, stack) | ||||
| 			-- always eject the same, even if items came in another way | ||||
| 			-- this further mitigates loops and generally avoids random sideway movement | ||||
| 			-- that can be expected in certain quarry placements | ||||
| 			return { quarry_eject_dir } | ||||
| 		end | ||||
| 	}, | ||||
| 	on_construct = function(pos) | ||||
| 		local size = 4 | ||||
| 		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) | ||||
| 		meta:set_string("infotext", S("Quarry")) | ||||
| 		meta:set_string("formspec", get_quarry_formspec(4)) | ||||
| 		meta:set_int("size", size) | ||||
| 		meta:set_int("dig_y", pos.y) | ||||
| 	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) | ||||
| 		tube_scanforobjects(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, | ||||
| 	after_dig_node = tube_scanforobjects, | ||||
| 	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) | ||||
| }) | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:quarry"}, | ||||
| 	interval = 1, | ||||
| 	chance = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		local size = meta:get_int("size") | ||||
| 		local eu_input = meta:get_int("HV_EU_input") | ||||
| 		local demand = 10000 | ||||
| 		local center = get_quarry_center(pos, size) | ||||
| 		local dig_y = meta:get_int("dig_y") | ||||
| 		local machine_name = S("Quarry") | ||||
|  | ||||
| 		technic.switching_station_timeout_count(pos, "HV") | ||||
|  | ||||
| 		if meta:get_int("enabled") == 0 then | ||||
| 			meta:set_string("infotext", S("%s Disabled"):format(machine_name)) | ||||
| 			meta:set_int("HV_EU_demand", 0) | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		if eu_input < demand then | ||||
| 			meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) | ||||
| 		elseif eu_input >= demand then | ||||
| 			meta:set_string("infotext", S("%s Active"):format(machine_name)) | ||||
|  | ||||
| 			local items = quarry_dig(pos, center, size) | ||||
| 			send_items(items, pos, node) | ||||
|  | ||||
| 			if dig_y < pos.y - quarry_max_depth then | ||||
| 				meta:set_string("infotext", S("%s Finished"):format(machine_name)) | ||||
| 			end | ||||
| 		end | ||||
| 		meta:set_int("HV_EU_demand", demand) | ||||
| 	end | ||||
| }) | ||||
|  | ||||
| technic.register_machine("HV", "technic:quarry", technic.receiver) | ||||
|  | ||||
|   | ||||
| @@ -4,9 +4,9 @@ | ||||
| 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_cable',       ''}, | ||||
| 		{'technic:solar_array_mv', 'technic:solar_array_mv',  'technic:solar_array_mv'}, | ||||
| 		{'default:steel_ingot',    'technic:hv_transformer',  'default:steel_ingot'}, | ||||
| 		{'',                       'technic:hv_cable0',       ''}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
|   | ||||
| @@ -4,11 +4,11 @@ | ||||
| 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_cable',       'default:brick'}, | ||||
| 		{'default:brick',       'default:brick',        'default:brick'}, | ||||
| 		{'default:brick',       '',                     'default:brick'}, | ||||
| 		{'default:steel_ingot', 'default:copper_ingot', 'default:steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_alloy_furnace({tier = "LV", speed = 1, demand = {300}}) | ||||
| technic.register_alloy_furnace({tier="LV", cook_time=6, demand={300}}) | ||||
|  | ||||
|   | ||||
| @@ -1,17 +1,43 @@ | ||||
| -- LV Battery box | ||||
| -- LV Battery box and some other nodes... | ||||
|  | ||||
| technic.register_power_tool("technic:battery", 10000) | ||||
| technic.register_power_tool("technic:red_energy_crystal", 100000) | ||||
| technic.register_power_tool("technic:green_energy_crystal", 250000) | ||||
| technic.register_power_tool("technic:blue_energy_crystal", 500000) | ||||
|  | ||||
| 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 = "RE Battery", | ||||
| 	inventory_image = "technic_battery.png", | ||||
| 	tool_capabilities = { | ||||
| 		charge = 0, | ||||
| 		max_drop_level = 0, | ||||
| 		groupcaps = { | ||||
| 			fleshy = {times={}, uses=10000, maxlevel=0} | ||||
| 		} | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| 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_cable',       'technic:battery'}, | ||||
| 		{'technic:battery',     'group:wood',           'technic:battery'}, | ||||
| 		{'technic:battery',     'default:copper_ingot', 'technic:battery'}, | ||||
| 		{'default:steel_ingot', 'default:steel_ingot',  'default:steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_battery_box({ | ||||
| 	tier           = "LV", | ||||
| 	max_charge     = 40000, | ||||
| 	max_charge     = 50000, | ||||
| 	charge_rate    = 1000, | ||||
| 	discharge_rate = 4000, | ||||
| 	charge_step    = 500, | ||||
|   | ||||
| @@ -1,14 +1,12 @@ | ||||
|  | ||||
| minetest.register_alias("lv_cable", "technic:lv_cable") | ||||
| minetest.register_alias("lv_cable", "technic:lv_cable0") | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:lv_cable 6', | ||||
| 	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) | ||||
|  | ||||
|   | ||||
							
								
								
									
										255
									
								
								technic/machines/LV/cnc.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,255 @@ | ||||
| -- 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, | ||||
| 	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;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_sphere.png;sphere; ]".. | ||||
| 	"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[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;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;In:]".. | ||||
| 	"list[current_name;src;0.5,5.5;1,1;]".. | ||||
| 	"label[4, 5.5;Out:]".. | ||||
| 	"list[current_name;dst;5,5.5;4,1;]".. | ||||
|  | ||||
| 	"list[current_player;main;0,7;8,4;]" | ||||
|  | ||||
| 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 | ||||
|  | ||||
| -- The actual block inactive state | ||||
| minetest.register_node("technic:cnc", { | ||||
| 	description = S("CNC Machine"), | ||||
| 	tiles       = {"technic_cnc_top.png", "technic_cnc_bottom.png", "technic_cnc_side.png", | ||||
| 	               "technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front.png"}, | ||||
| 	drawtype    = "nodebox", | ||||
| 	paramtype   = "light", | ||||
| 	paramtype2  = "facedir", | ||||
| 	node_box    = { | ||||
| 		type  = "fixed", | ||||
| 		fixed = { | ||||
| 			{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	groups = {cracky=2}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", S("CNC Machine")) | ||||
| 		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 = function(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 | ||||
| 			minetest.chat_send_player(player:get_player_name(), | ||||
| 				S("Machine cannot be removed because it is not empty")) | ||||
| 			return false | ||||
| 		else | ||||
| 			return true | ||||
| 		end | ||||
| 	end, | ||||
| 	on_receive_fields = form_handler, | ||||
| }) | ||||
|  | ||||
| -- Active state block | ||||
| minetest.register_node("technic:cnc_active", { | ||||
| 	description = S("CNC Machine"), | ||||
| 	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", | ||||
| 	groups = {cracky=2, not_in_creative_inventory=1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	can_dig = function(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 | ||||
| 			minetest.chat_send_player(player:get_player_name(), | ||||
| 				S("Machine cannot be removed because it is not empty")) | ||||
| 			return false | ||||
| 		end | ||||
| 		return true | ||||
| 	end, | ||||
| 	on_receive_fields = form_handler, | ||||
| }) | ||||
|  | ||||
| -- Action code performing the transformation | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:cnc","technic:cnc_active"}, | ||||
| 	interval = 1, | ||||
| 	chance   = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		local meta         = minetest.get_meta(pos) | ||||
| 		local inv          = meta:get_inventory() | ||||
| 		local eu_input     = meta:get_int("LV_EU_input") | ||||
| 		local machine_name = S("CNC Machine") | ||||
| 		local machine_node = "technic:cnc" | ||||
| 		local demand       = 450 | ||||
|  | ||||
| 		-- Setup meta data if it does not exist. state is used as an indicator of this | ||||
| 		if not eu_input then | ||||
| 			meta:set_int("LV_EU_demand", demand) | ||||
| 			meta:set_int("LV_EU_input", 0) | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		-- Power off automatically if no longer connected to a switching station | ||||
| 		technic.switching_station_timeout_count(pos, "LV") | ||||
|  | ||||
| 		 | ||||
| 		local result = meta:get_string("cnc_product") | ||||
| 		if inv:is_empty("src") or  | ||||
| 		   (not minetest.registered_nodes[result]) or | ||||
| 		   (not inv:room_for_item("dst", result)) then | ||||
| 			hacky_swap_node(pos, machine_node) | ||||
| 			meta:set_string("infotext", S("%s Idle"):format(machine_name)) | ||||
| 			meta:set_string("cnc_product", "") | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		if eu_input < demand then | ||||
| 			hacky_swap_node(pos, machine_node) | ||||
| 			meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) | ||||
| 		elseif eu_input >= demand then | ||||
| 			hacky_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 | ||||
| })  | ||||
|  | ||||
| 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:motor',              'default:steel_ingot'}, | ||||
| 		{'default:steel_ingot',        'default:copper_ingot',       'default:steel_ingot'},          | ||||
| 	}, | ||||
| }) | ||||
|  | ||||
							
								
								
									
										356
									
								
								technic/machines/LV/cnc_api.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,356 @@ | ||||
| -- 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 = {} | ||||
|  | ||||
| technic.cnc.detail_level = 16 | ||||
|  | ||||
| -- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES: | ||||
| ------------------------------------------------------ | ||||
| local function cnc_sphere() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	local sehne | ||||
| 	for i = 1, detail - 1 do | ||||
| 		sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2)) | ||||
| 		nodebox[i]={-sehne, (i/detail) - 0.5, -sehne, sehne, (i/detail)+(1/detail)-0.5, sehne} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_cylinder_horizontal() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	local sehne | ||||
| 	for i = 1, detail - 1 do | ||||
| 		sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2)) | ||||
| 		nodebox[i]={-0.5, (i/detail)-0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, sehne} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_cylinder() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	local sehne | ||||
| 	for i = 1, detail - 1 do | ||||
| 		sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2)) | ||||
| 		nodebox[i]={(i/detail) - 0.5, -0.5, -sehne, (i/detail)+(1/detail)-0.5, 0.5, sehne} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_twocurvededge() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level * 2 | ||||
| 	local sehne | ||||
| 	for i = (detail / 2) - 1, detail - 1 do | ||||
| 		sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2)) | ||||
| 		nodebox[i]={-sehne, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_onecurvededge() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level * 2 | ||||
| 	local sehne | ||||
| 	for i = (detail / 2) - 1, detail - 1 do | ||||
| 		sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2)) | ||||
| 		nodebox[i]={-0.5, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5} | ||||
| 	end  | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_spike() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	for i = 0, detail - 1 do | ||||
| 		nodebox[i+1] = {(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, | ||||
| 				0.5-(i/detail/2), (i/detail)-0.5+(1/detail), 0.5-(i/detail/2)} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_pyramid() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level / 2 | ||||
| 	for i = 0, detail - 1 do | ||||
| 		nodebox[i+1] = {(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail/2)-0.5+(1/detail), 0.5-(i/detail/2)} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_slope_inner_edge_upsdown() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	for i = 0, detail-1 do | ||||
| 		nodebox[i+1] = {0.5-(i/detail)-(1/detail), (i/detail)-0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} | ||||
| 		nodebox[i+detail+1] = {-0.5, (i/detail)-0.5, 0.5-(i/detail)-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_slope_edge_upsdown() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	for i = 0, detail-1 do | ||||
| 		nodebox[i+1] = {(-1*(i/detail))+0.5-(1/detail), (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_slope_inner_edge() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	for i = 0, detail-1 do | ||||
| 		nodebox[i+1] = {(i/detail)-0.5, -0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} | ||||
| 		nodebox[i+detail+1] = {-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_slope_edge() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	for i = 0, detail-1 do | ||||
| 		nodebox[i+1] = {(i/detail)-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_slope_upsdown() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	for i = 0, detail-1 do | ||||
| 		nodebox[i+1] = {-0.5, (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_slope_lying() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	for i = 0, detail-1 do | ||||
| 		nodebox[i+1] = {(i/detail)-0.5, -0.5, (i/detail)-0.5, (i/detail)-0.5+(1/detail), 0.5 , 0.5} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| local function cnc_slope() | ||||
| 	local nodebox = {} | ||||
| 	local detail = technic.cnc.detail_level | ||||
| 	for i = 0, detail-1 do | ||||
| 		nodebox[i+1] = {-0.5, (i/detail)-0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} | ||||
| 	end | ||||
| 	return nodebox | ||||
| end | ||||
|  | ||||
| -- Define slope boxes for the various nodes | ||||
| ------------------------------------------- | ||||
| technic.cnc.programs = { | ||||
| 	{suffix  = "technic_cnc_stick", | ||||
| 	nodebox = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}, | ||||
| 	desc    = S("Stick")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_element_end_double", | ||||
| 	nodebox = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5}, | ||||
| 	desc    = S("Element End Double")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_element_cross_double", | ||||
| 	nodebox = { | ||||
| 		{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", | ||||
| 	nodebox = { | ||||
| 		{-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", | ||||
| 	nodebox = { | ||||
| 		{-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", | ||||
| 	nodebox = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, | ||||
| 	desc    = S("Element Straight Double")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_element_end", | ||||
| 	nodebox = {-0.3, -0.5, -0.3, 0.3, 0, 0.5}, | ||||
| 	desc    = S("Element End")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_element_cross", | ||||
| 	nodebox = { | ||||
| 		{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", | ||||
| 	nodebox = { | ||||
| 		{-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", | ||||
| 	nodebox = { | ||||
| 		{-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", | ||||
| 	nodebox = {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, | ||||
| 	desc    = S("Element Straight")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_sphere", | ||||
| 	nodebox = cnc_sphere(), | ||||
| 	desc    = S("Sphere")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_cylinder_horizontal", | ||||
| 	nodebox = cnc_cylinder_horizontal(), | ||||
| 	desc    = S("Horizontal Cylinder")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_cylinder", | ||||
| 	nodebox = cnc_cylinder(), | ||||
| 	desc    = S("Cylinder")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_twocurvededge", | ||||
| 	nodebox = cnc_twocurvededge(), | ||||
| 	desc    = S("Two Curved Edge Block")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_onecurvededge", | ||||
| 	nodebox = cnc_onecurvededge(), | ||||
| 	desc    = S("One Curved Edge Block")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_spike", | ||||
| 	nodebox = cnc_spike(), | ||||
| 	desc    = S("Spike")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_pyramid", | ||||
| 	nodebox = cnc_pyramid(), | ||||
| 	desc    = S("Pyramid")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_slope_inner_edge_upsdown", | ||||
| 	nodebox = cnc_slope_inner_edge_upsdown(), | ||||
| 	desc    = S("Slope Upside Down Inner Edge")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_slope_edge_upsdown", | ||||
| 	nodebox = cnc_slope_edge_upsdown(), | ||||
| 	desc    = S("Slope Upside Down Edge")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_slope_inner_edge", | ||||
| 	nodebox = cnc_slope_inner_edge(), | ||||
| 	desc    = S("Slope Inner Edge")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_slope_edge", | ||||
| 	nodebox = cnc_slope_edge(), | ||||
| 	desc    = S("Slope Edge")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_slope_upsdown", | ||||
| 	nodebox = cnc_slope_upsdown(), | ||||
| 	desc    = S("Slope Upside Down")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_slope_lying", | ||||
| 	nodebox = cnc_slope_lying(), | ||||
| 	desc    = S("Slope Lying")}, | ||||
|  | ||||
| 	{suffix  = "technic_cnc_slope", | ||||
| 	nodebox = cnc_slope(), | ||||
| 	desc    = S("Slope")}, | ||||
| } | ||||
|  | ||||
| -- 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_sphere", "technic_cnc_slope_upsdown", "technic_cnc_edge", | ||||
| 	                    "technic_cnc_inner_edge", "technic_cnc_slope_edge_upsdown", | ||||
| 	                    "technic_cnc_slope_inner_edge_upsdown", "technic_cnc_stick", | ||||
| 	                    "technic_cnc_cylinder_horizontal"} | ||||
| } | ||||
|  | ||||
| -- Generic function for registering all the different node types | ||||
| function technic.cnc.register_program(recipeitem, suffix, nodebox, groups, images, description) | ||||
| 	minetest.register_node(":"..recipeitem.."_"..suffix, { | ||||
| 		description   = description, | ||||
| 		drawtype      = "nodebox", | ||||
| 		tiles         = images, | ||||
| 		paramtype     = "light", | ||||
| 		paramtype2    = "facedir", | ||||
| 		walkable      = true, | ||||
| 		node_box = { | ||||
| 			type  = "fixed", | ||||
| 			fixed = nodebox | ||||
| 		}, | ||||
| 		groups        = groups, | ||||
| 	}) | ||||
| 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.nodebox, groups, images, description.." "..data.desc) | ||||
| 		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_sphere, desc_element_straight, desc_element_edge, desc_element_t, desc_element_cross, desc_element_end) | ||||
|  | ||||
|          technic.cnc.register_slope(recipeitem, groups, images, desc_slope) | ||||
|          technic.cnc.register_slope_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_sphere(recipeitem, groups, images, desc_sphere) | ||||
|          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 | ||||
|  | ||||
							
								
								
									
										74
									
								
								technic/machines/LV/cnc_nodes.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,74 @@ | ||||
| -- 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")) | ||||
| technic.cnc.programs_disable["default:dirt"] = {"technic_cnc_sphere", "technic_cnc_slope_upsdown", | ||||
| 		"technic_cnc_edge",   "technic_cnc_inner_edge", | ||||
| 		"technic_cnc_slope_edge_upsdown", "technic_cnc_slope_inner_edge_upsdown", | ||||
| 		"technic_cnc_stick", "technic_cnc_cylinder_horizontal"} | ||||
|  | ||||
| -- TREE | ||||
| ------- | ||||
| technic.cnc.register_all("default:tree", | ||||
|                 {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, | ||||
|                 {"default_tree.png"}, | ||||
|                 S("Wooden")) | ||||
|  | ||||
| -- 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=2, 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")) | ||||
| -- STEEL | ||||
| -------- | ||||
| technic.cnc.register_all("default:steel", | ||||
|                 {snappy=1, bendy=2, cracky=1, melty=2, level=2, not_in_creative_inventory=1}, | ||||
|                 {"default_steel_block.png"}, | ||||
|                 S("Steel")) | ||||
|  | ||||
							
								
								
									
										183
									
								
								technic/machines/LV/coal_alloy_furnace.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,183 @@ | ||||
|  | ||||
| -- Coal 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'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:coal_alloy_furnace", { | ||||
| 	description = S("Coal Alloy Furnace"), | ||||
| 	tiles = {"technic_coal_alloy_furnace_top.png", "technic_coal_alloy_furnace_bottom.png", "technic_coal_alloy_furnace_side.png", | ||||
| 		"technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_front.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {cracky=2}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.env:get_meta(pos) | ||||
| 		meta:set_string("formspec", coal_alloy_furnace_formspec) | ||||
| 		meta:set_string("infotext", S("Coal Alloy Furnace")) | ||||
| 		local inv = meta:get_inventory() | ||||
| 		inv:set_size("fuel", 1) | ||||
| 		inv:set_size("src", 1) | ||||
| 		inv:set_size("src2", 1) | ||||
| 		inv:set_size("dst", 4) | ||||
| 	end, | ||||
| 	can_dig = function(pos,player) | ||||
| 		local meta = minetest.env:get_meta(pos); | ||||
| 		local inv = meta:get_inventory() | ||||
| 		if not (inv:is_empty("fuel") or inv:is_empty("dst") or inv:is_empty("src") or inv:is_empty("src2") )then | ||||
| 			return false | ||||
| 			end | ||||
| 		return true | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:coal_alloy_furnace_active", { | ||||
| 	description = "Alloy Furnace", | ||||
| 	tiles = {"technic_coal_alloy_furnace_top.png", "technic_coal_alloy_furnace_bottom.png", "technic_coal_alloy_furnace_side.png", | ||||
| 	         "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_front_active.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	light_source = 8, | ||||
| 	drop = "technic:coal_alloy_furnace", | ||||
| 	groups = {cracky=2, not_in_creative_inventory=1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| 	can_dig = function(pos,player) | ||||
| 		local meta = minetest.env:get_meta(pos); | ||||
| 		local inv = meta:get_inventory() | ||||
| 		if not (inv:is_empty("fuel") or inv:is_empty("dst") or | ||||
| 			inv:is_empty("src") or inv:is_empty("src2")) then | ||||
| 			return false | ||||
| 		end | ||||
| 		return true | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:coal_alloy_furnace", "technic:coal_alloy_furnace_active"}, | ||||
| 	interval = 1, | ||||
| 	chance = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		local inv    = meta:get_inventory() | ||||
| 		local recipe = nil | ||||
| 		local machine_name = S("Coal 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;1,1;]".. | ||||
| 			"list[current_name;src2;3,1;1,1;]".. | ||||
| 			"list[current_name;dst;5,1;2,2;]".. | ||||
| 			"list[current_player;main;0,5;8,4;]" | ||||
|  | ||||
| 		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 srcstack = inv:get_stack("src", 1) | ||||
| 		local src2stack = inv:get_stack("src2", 1) | ||||
| 		local recipe = technic.get_alloy_recipe(srcstack, src2stack) | ||||
| 		if srcstack:get_name() > src2stack:get_name() then | ||||
| 			local temp = srcstack | ||||
| 			srcstack = src2stack | ||||
| 			src2stack = temp | ||||
| 		end | ||||
|  | ||||
| 		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 recipe then | ||||
| 				meta:set_int("src_time", meta:get_int("src_time") + 1) | ||||
| 				if meta:get_int("src_time") == 6 then | ||||
| 					-- check if there's room for output in "dst" list | ||||
| 					local dst_stack = ItemStack(recipe.output) | ||||
| 					if inv:room_for_item("dst", dst_stack) then | ||||
| 						srcstack:take_item(recipe.input[1].count) | ||||
| 						inv:set_stack("src", 1, srcstack) | ||||
| 						src2stack:take_item(recipe.input[2].count) | ||||
| 						inv:set_stack("src2", 1, src2stack) | ||||
| 						inv:add_item("dst", dst_stack) | ||||
| 					end | ||||
| 					meta:set_int("src_time", 0) | ||||
| 				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.."%)") | ||||
| 			hacky_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;1,1;]".. | ||||
| 					"list[current_name;src2;3,1;1,1;]".. | ||||
| 					"list[current_name;dst;5,1;2,2;]".. | ||||
| 					"list[current_player;main;0,5;8,4;]") | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		-- FIXME: Make this look more like the electrical version. | ||||
| 		-- This code refetches the recipe to see if it can be done again after the iteration | ||||
| 		srcstack = inv:get_stack("src", 1) | ||||
| 		srcstack = inv:get_stack("src2", 1) | ||||
| 		local recipe = technic.get_alloy_recipe(srcstack, src2stack) | ||||
|  | ||||
| 		if recipe then | ||||
| 			if was_active then | ||||
| 				meta:set_string("infotext", "Furnace is empty") | ||||
| 				hacky_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 fuellist = inv:get_list("fuel") | ||||
|  | ||||
| 		if fuellist then | ||||
| 			fuel = 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)) | ||||
| 			hacky_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) | ||||
|  | ||||
| 		local stack = inv:get_stack("fuel", 1) | ||||
| 		stack:take_item() | ||||
| 		inv:set_stack("fuel", 1, stack) | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| @@ -1,17 +1,170 @@ | ||||
|  | ||||
| minetest.register_alias("compressor", "technic:lv_compressor") | ||||
| technic.compressor_recipes = {} | ||||
|  | ||||
| local S = technic.getter | ||||
|  | ||||
| technic.register_compressor_recipe = function(src, src_count, dst, dst_count) | ||||
| 	technic.compressor_recipes[src] = {src_count = src_count, dst_name = dst, dst_count = dst_count} | ||||
| 	if unified_inventory then | ||||
| 		unified_inventory.register_craft({ | ||||
| 			type = "compressing", | ||||
| 			output = dst.." "..dst_count, | ||||
| 			items = {src.." "..src_count}, | ||||
| 			width = 0, | ||||
| 		}) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| technic.get_compressor_recipe = function(item) | ||||
| 	if technic.compressor_recipes[item.name] and  | ||||
| 	   item.count >= technic.compressor_recipes[item.name].src_count then | ||||
| 		return technic.compressor_recipes[item.name] | ||||
| 	else | ||||
| 		return nil | ||||
| 	end | ||||
| end | ||||
|  | ||||
| technic.register_compressor_recipe("default:snowblock",         1, "default:ice",             1) | ||||
| technic.register_compressor_recipe("default:sand",              1, "default:sandstone",       1) | ||||
| technic.register_compressor_recipe("default:desert_sand",       1, "default:desert_stone",    1) | ||||
| technic.register_compressor_recipe("technic:mixed_metal_ingot", 1, "technic:composite_plate", 1) | ||||
| technic.register_compressor_recipe("default:copper_ingot",      5, "technic:copper_plate",    1) | ||||
| technic.register_compressor_recipe("technic:coal_dust",         4, "technic:graphite",        1) | ||||
| technic.register_compressor_recipe("technic:carbon_cloth",      1, "technic:carbon_plate",    1) | ||||
| technic.register_compressor_recipe("technic:enriched_uranium",  4, "technic:uranium_fuel",    1) | ||||
|  | ||||
|  | ||||
| minetest.register_alias("compressor", "technic:compressor") | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:lv_compressor', | ||||
| 	output = 'technic:compressor', | ||||
| 	recipe = { | ||||
| 		{'default:stone',            'basic_materials:motor',          'default:stone'}, | ||||
| 		{'mesecons:piston',          'technic:machine_casing', 'mesecons:piston'}, | ||||
| 		{'basic_materials:silver_wire', 'technic:lv_cable',       'basic_materials:silver_wire'}, | ||||
| 	}, | ||||
| 	replacements = { | ||||
| 		{"basic_materials:silver_wire", "basic_materials:empty_spool"}, | ||||
| 		{"basic_materials:silver_wire", "basic_materials:empty_spool"} | ||||
| 	}, | ||||
| 		{'default:stone',	'default:stone',	'default:stone'}, | ||||
| 		{'mesecons:piston',	'technic:motor',	'mesecons:piston'}, | ||||
| 		{'default:stone',	'technic:lv_cable0',	'default:stone'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_compressor({tier = "LV", demand = {300}, speed = 1}) | ||||
| local compressor_formspec = | ||||
| 	"invsize[8,9;]".. | ||||
| 	"label[0,0;"..S("Compressor").."]".. | ||||
| 	"list[current_name;src;3,1;1,1;]".. | ||||
| 	"list[current_name;dst;5,1;2,2;]".. | ||||
| 	"list[current_player;main;0,5;8,4;]" | ||||
|  | ||||
| minetest.register_node("technic:compressor", { | ||||
| 	description = S("Compressor"), | ||||
| 	tiles = {"technic_compressor_top.png",  "technic_compressor_bottom.png", | ||||
| 	         "technic_compressor_side.png", "technic_compressor_side.png", | ||||
| 	         "technic_compressor_back.png", "technic_compressor_front.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {cracky=2}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", S("Compressor")) | ||||
| 		meta:set_string("formspec", compressor_formspec) | ||||
| 		local inv = meta:get_inventory() | ||||
| 		inv:set_size("src", 1) | ||||
| 		inv:set_size("dst", 4) | ||||
| 	end, | ||||
| 	can_dig = function(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 | ||||
| 			minetest.chat_send_player(player:get_player_name(), | ||||
| 					S("Machine cannot be removed because it is not empty")) | ||||
| 			return false | ||||
| 		else | ||||
| 			return true | ||||
| 		end | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:compressor_active", { | ||||
| 	description = S("Compressor"), | ||||
| 	tiles = {"technic_compressor_top.png",  "technic_compressor_bottom.png", | ||||
| 	         "technic_compressor_side.png", "technic_compressor_side.png", | ||||
| 	         "technic_compressor_back.png", "technic_compressor_front_active.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {cracky=2, not_in_creative_inventory=1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	can_dig = function(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 | ||||
| 			minetest.chat_send_player(player:get_player_name(), | ||||
| 					S("Machine cannot be removed because it is not empty")) | ||||
| 			return false | ||||
| 		else | ||||
| 			return true | ||||
| 		end | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:compressor","technic:compressor_active"}, | ||||
| 	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("LV_EU_input") | ||||
| 		local machine_name = S("Compressor") | ||||
| 		local machine_node = "technic:compressor" | ||||
| 		local demand       = 300 | ||||
|   | ||||
| 		 -- 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 | ||||
|   | ||||
| 		-- Power off automatically if no longer connected to a switching station | ||||
| 		technic.switching_station_timeout_count(pos, "LV") | ||||
| 		local inv    = meta:get_inventory() | ||||
| 		local empty  = inv:is_empty("src") | ||||
| 		local srcstack  = inv:get_stack("src", 1) | ||||
| 		local src_item, recipe, result = nil, nil, nil | ||||
|  | ||||
| 		if srcstack then | ||||
| 			src_item = srcstack:to_table() | ||||
| 		end | ||||
| 		if src_item then | ||||
| 			recipe = technic.get_compressor_recipe(src_item) | ||||
| 		end | ||||
| 		if recipe then | ||||
| 			result = {name=recipe.dst_name, count=recipe.dst_count} | ||||
| 		end  | ||||
| 		if empty or (not result) or | ||||
| 		   (not inv:room_for_item("dst", result)) then | ||||
| 			hacky_swap_node(pos, machine_node) | ||||
| 			meta:set_string("infotext", S("%s Idle"):format(machine_name)) | ||||
| 			meta:set_int("LV_EU_demand", 0) | ||||
| 			meta:set_int("src_time", 0) | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		if eu_input < demand then | ||||
| 			hacky_swap_node(pos, machine_node) | ||||
| 			meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) | ||||
| 		elseif eu_input >= demand then | ||||
| 			hacky_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") >= 4 then  | ||||
| 				meta:set_int("src_time", 0) | ||||
| 				srcstack:take_item(recipe.src_count) | ||||
| 				inv:set_stack("src", 1, srcstack) | ||||
| 				inv:add_item("dst", result) | ||||
| 			end | ||||
| 		end | ||||
| 		meta:set_int("LV_EU_demand", demand) | ||||
| 	end | ||||
| }) | ||||
|  | ||||
| technic.register_machine("LV", "technic:compressor",        technic.receiver) | ||||
| technic.register_machine("LV", "technic:compressor_active", technic.receiver) | ||||
|  | ||||
|   | ||||
| @@ -5,9 +5,9 @@ | ||||
| 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_cable',       'default:cobble'}, | ||||
| 		{'default:cobble',      'default:cobble',        'default:cobble'}, | ||||
| 		{'default:cobble',      '',                      'default:cobble'}, | ||||
| 		{'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
|   | ||||
| @@ -1,13 +1,178 @@ | ||||
|  | ||||
| minetest.register_alias("extractor", "technic:lv_extractor") | ||||
| technic.extractor_recipes ={} | ||||
|  | ||||
| local S = technic.getter | ||||
|  | ||||
| technic.register_extractor_recipe = function(src, src_count, dst, dst_count) | ||||
| 	technic.extractor_recipes[src] = {src_count = src_count, dst_name = dst, dst_count = dst_count} | ||||
| 	if unified_inventory then | ||||
| 		unified_inventory.register_craft({ | ||||
| 			type = "extracting", | ||||
| 			output = dst.." "..dst_count, | ||||
| 			items = {src.." "..src_count}, | ||||
| 			width = 0, | ||||
| 		}) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- Receive an ItemStack of result by an ItemStack input | ||||
| technic.get_extractor_recipe = function(item) | ||||
| 	if technic.extractor_recipes[item.name] and | ||||
| 	   item.count >= technic.extractor_recipes[item.name].src_count then | ||||
| 		return technic.extractor_recipes[item.name] | ||||
| 	else | ||||
| 		return nil | ||||
| 	end | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
| technic.register_extractor_recipe("technic:coal_dust",        1,          "dye:black",      2) | ||||
| technic.register_extractor_recipe("default:cactus",           1,          "dye:green",      2) | ||||
| technic.register_extractor_recipe("default:dry_shrub",        1,          "dye:brown",      2) | ||||
| technic.register_extractor_recipe("flowers:geranium",         1,          "dye:blue",       2) | ||||
| technic.register_extractor_recipe("flowers:dandelion_white",  1,          "dye:white",      2) | ||||
| technic.register_extractor_recipe("flowers:dandelion_yellow", 1,          "dye:yellow",     2) | ||||
| technic.register_extractor_recipe("flowers:tulip",            1,          "dye:orange",     2) | ||||
| technic.register_extractor_recipe("flowers:rose",             1,          "dye:red",        2) | ||||
| technic.register_extractor_recipe("flowers:viola",            1,          "dye:violet",     2) | ||||
| technic.register_extractor_recipe("technic:raw_latex",        1,          "technic:rubber", 3) | ||||
| technic.register_extractor_recipe("moretrees:rubber_tree_trunk_empty", 1, "technic:rubber", 1) | ||||
| technic.register_extractor_recipe("moretrees:rubber_tree_trunk",       1, "technic:rubber", 1) | ||||
| technic.register_extractor_recipe("technic:uranium",          5,          "technic:enriched_uranium", 1) | ||||
|  | ||||
| minetest.register_alias("extractor", "technic:extractor") | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:lv_extractor', | ||||
| 	output = 'technic:extractor', | ||||
| 	recipe = { | ||||
| 		{'technic:treetap', 'basic_materials:motor',          'technic:treetap'}, | ||||
| 		{'technic:treetap', 'technic:machine_casing', 'technic:treetap'}, | ||||
| 		{'',                'technic:lv_cable',       ''}, | ||||
| 		{'technic:treetap', 'technic:motor',     'technic:treetap'}, | ||||
| 		{'technic:treetap', 'technic:lv_cable0', 'technic:treetap'}, | ||||
| 		{'',                '',                  ''}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_extractor({tier = "LV", demand = {300}, speed = 1}) | ||||
| local extractor_formspec = | ||||
|    "invsize[8,9;]".. | ||||
|    "label[0,0;"..S("Extractor").."]".. | ||||
|    "list[current_name;src;3,1;1,1;]".. | ||||
|    "list[current_name;dst;5,1;2,2;]".. | ||||
|    "list[current_player;main;0,5;8,4;]" | ||||
|  | ||||
| minetest.register_node("technic:extractor", { | ||||
| 	description = S("Extractor"), | ||||
| 	tiles = {"technic_lv_grinder_top.png",  "technic_lv_grinder_bottom.png", "technic_lv_grinder_side.png", | ||||
| 	         "technic_lv_grinder_side.png", "technic_lv_grinder_side.png",   "technic_lv_grinder_front.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {cracky=2}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", S("Extractor")) | ||||
| 		meta:set_string("formspec", extractor_formspec) | ||||
| 		local inv = meta:get_inventory() | ||||
| 		inv:set_size("src", 1) | ||||
| 		inv:set_size("dst", 4) | ||||
| 	end, | ||||
| 	can_dig = function(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 | ||||
| 			minetest.chat_send_player(player:get_player_name(), | ||||
| 				S("Machine cannot be removed because it is not empty")) | ||||
| 			return false | ||||
| 		else | ||||
| 			return true | ||||
| 		end | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:extractor_active", { | ||||
| 	description = S("Extractor"), | ||||
| 	tiles = {"technic_lv_grinder_top.png",  "technic_lv_grinder_bottom.png", | ||||
| 	         "technic_lv_grinder_side.png", "technic_lv_grinder_side.png", | ||||
| 	         "technic_lv_grinder_side.png", "technic_lv_grinder_front_active.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {cracky=2, not_in_creative_inventory=1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	can_dig = function(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 | ||||
| 			minetest.chat_send_player(player:get_player_name(), | ||||
| 				S("Machine cannot be removed because it is not empty")) | ||||
| 			return false | ||||
| 		else | ||||
| 			return true | ||||
| 		end | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:extractor", "technic:extractor_active"}, | ||||
| 	interval = 1, | ||||
| 	chance   = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		-- The machine will automatically shut down if disconnected from power in some fashion. | ||||
| 		local meta     = minetest.get_meta(pos) | ||||
| 		local inv      = meta:get_inventory() | ||||
| 		local srcstack = inv:get_stack("src", 1) | ||||
| 		local eu_input = meta:get_int("LV_EU_input") | ||||
|  | ||||
| 		-- Machine information | ||||
| 		local machine_name = S("Extractor") | ||||
| 		local machine_node = "technic:extractor" | ||||
| 		local demand       = 300 | ||||
|  | ||||
| 		-- 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 | ||||
|  | ||||
| 		-- Power off automatically if no longer connected to a switching station | ||||
| 		technic.switching_station_timeout_count(pos, "LV") | ||||
|  | ||||
| 		if srcstack then | ||||
| 			src_item = srcstack:to_table() | ||||
| 		end | ||||
| 		if src_item then | ||||
| 			recipe = technic.get_extractor_recipe(src_item) | ||||
| 		end | ||||
| 		if recipe then | ||||
| 			result = {name=recipe.dst_name, count=recipe.dst_count} | ||||
| 		end  | ||||
| 		if inv:is_empty("src") or (not recipe) or (not result) or | ||||
| 		   (not inv:room_for_item("dst", result)) then | ||||
| 			hacky_swap_node(pos, machine_node) | ||||
| 			meta:set_string("infotext", S("%s Idle"):format(machine_name)) | ||||
| 			meta:set_int("LV_EU_demand", 0) | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		if eu_input < demand then | ||||
| 			-- unpowered - go idle | ||||
| 			hacky_swap_node(pos, machine_node) | ||||
| 			meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) | ||||
| 		elseif eu_input >= demand then | ||||
| 			-- Powered | ||||
| 			hacky_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") >= 4 then -- 4 ticks per output | ||||
| 				meta:set_int("src_time", 0) | ||||
| 				srcstack:take_item(recipe.src_count) | ||||
| 				inv:set_stack("src", 1, srcstack) | ||||
| 				inv:add_item("dst", result) | ||||
| 			end | ||||
| 		end | ||||
| 		meta:set_int("LV_EU_demand", demand) | ||||
| 	end | ||||
| }) | ||||
|  | ||||
| technic.register_machine("LV", "technic:extractor",        technic.receiver) | ||||
| technic.register_machine("LV", "technic:extractor_active", technic.receiver) | ||||
|  | ||||
|   | ||||
| @@ -8,9 +8,9 @@ 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_cable',       'default:stone'}, | ||||
| 		{'default:stone', 'default:stone',        'default:stone'}, | ||||
| 		{'default:stone', '',                     'default:stone'}, | ||||
| 		{'default:stone', 'default:copper_ingot', 'default:stone'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
|   | ||||
| @@ -10,18 +10,47 @@ local S = technic.getter | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:geothermal', | ||||
| 	recipe = { | ||||
| 		{'technic:granite',          'default:diamond',        'technic:granite'}, | ||||
| 		{'basic_materials:copper_wire', 'technic:machine_casing', 'basic_materials:copper_wire'}, | ||||
| 		{'technic:granite',          'technic:lv_cable',       'technic:granite'}, | ||||
| 	}, | ||||
| 	replacements = { | ||||
| 		{"basic_materials:copper_wire", "basic_materials:empty_spool"}, | ||||
| 		{"basic_materials:copper_wire", "basic_materials:empty_spool"} | ||||
| 	}, | ||||
| 		{'default:stone', 'default:stone', 'default:stone'}, | ||||
| 		{'default:copper_ingot', 'default:diamond', 'default:copper_ingot'}, | ||||
| 		{'default:stone', 'default:copper_ingot', 'default:stone'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_craftitem("technic:geothermal", { | ||||
| 	description = S("Geothermal %s Generator"):format("LV"), | ||||
| 	description = S("Geothermal Generator"), | ||||
| })  | ||||
|  | ||||
| local geothermal_formspec = | ||||
| 	"invsize[8,4;]".. | ||||
| 	"label[0,0;"..S("Geothermal Generator").."]".. | ||||
| 	"list[current_player;main;0,5;8,4;]" | ||||
| 	 | ||||
|  | ||||
| minetest.register_node("technic:geothermal", { | ||||
| 	description = S("Geothermal Generator"), | ||||
| 	tiles = {"technic_geothermal_top.png", "technic_machine_bottom.png", "technic_geothermal_side.png", | ||||
| 	         "technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", S("Geothermal Generator")) | ||||
| 		meta:set_int("LV_EU_supply", 0) | ||||
| 		meta:set_string("formspec", geothermal_formspec)	 | ||||
| 	end,	 | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:geothermal_active", { | ||||
| 	description = S("Geothermal Generator"), | ||||
| 	tiles = {"technic_geothermal_top_active.png", "technic_machine_bottom.png", "technic_geothermal_side.png", | ||||
| 	         "technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	drop = "technic:geothermal", | ||||
| }) | ||||
|  | ||||
| local check_node_around = function(pos) | ||||
| @@ -31,86 +60,63 @@ local check_node_around = function(pos) | ||||
| 	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 | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:geothermal","technic:geothermal_active"}, | ||||
| 	interval = 1, | ||||
| 	chance   = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		local meta             = minetest.get_meta(pos) | ||||
| 		local 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 | ||||
| 		-- 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 | ||||
| 		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("formspec", | ||||
| 			"invsize[8,4;]".. | ||||
| 			"label[0,0;"..S("Geothermal Generator").."]".. | ||||
| 			"label[4,0;"..S("Production at %d%%"):format(production_level).."]") | ||||
|  | ||||
| 		if production_level > 0 and minetest.get_node(pos).name == "technic:geothermal" then | ||||
| 			hacky_swap_node (pos, "technic:geothermal_active") | ||||
| 			return | ||||
| 		end | ||||
| 		if production_level == 0 then | ||||
| 			hacky_swap_node(pos, "technic:geothermal") | ||||
| 			meta:set_int("LV_EU_supply", 0) | ||||
| 		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"}, | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, | ||||
| 		technic_machine=1, technic_lv=1}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", S("Geothermal %s Generator"):format("LV")) | ||||
| 		meta:set_int("LV_EU_supply", 0) | ||||
| 	end, | ||||
| 	technic_run = run, | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:geothermal_active", { | ||||
| 	description = S("Geothermal %s Generator"):format("LV"), | ||||
| 	tiles = {"technic_geothermal_top_active.png", "technic_machine_bottom.png", "technic_geothermal_side.png", | ||||
| 	         "technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, | ||||
| 		technic_machine=1, technic_lv=1, not_in_creative_inventory=1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	drop = "technic:geothermal", | ||||
| 	technic_run = run, | ||||
| }) | ||||
| })  | ||||
|  | ||||
| technic.register_machine("LV", "technic:geothermal",        technic.producer) | ||||
| technic.register_machine("LV", "technic:geothermal_active", technic.producer) | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
|  | ||||
| minetest.register_alias("grinder", "technic:lv_grinder") | ||||
| minetest.register_alias("grinder", "technic:grinder") | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:lv_grinder', | ||||
| 	output = 'technic:grinder', | ||||
| 	recipe = { | ||||
| 		{'default:desert_stone', 'default:diamond',        'default:desert_stone'}, | ||||
| 		{'default:desert_stone', 'technic:machine_casing', 'default:desert_stone'}, | ||||
| 		{'technic:granite',      'technic:lv_cable',       'technic:granite'}, | ||||
| 		{'default:desert_stone', 'default:desert_stone',  'default:desert_stone'}, | ||||
| 		{'default:desert_stone', 'default:diamond',       'default:desert_stone'}, | ||||
| 		{'default:stone',        'moreores:copper_ingot', 'default:stone'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
|   | ||||
| @@ -3,22 +3,20 @@ 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.."/alloy_furnace.lua") | ||||
| dofile(path.."/coal_alloy_furnace.lua") | ||||
| 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.."/music_player.lua") | ||||
| dofile(path.."/grinder.lua") | ||||
| dofile(path.."/cnc.lua") | ||||
| dofile(path.."/cnc_api.lua") | ||||
| dofile(path.."/cnc_nodes.lua") | ||||
| dofile(path.."/extractor.lua") | ||||
| dofile(path.."/compressor.lua") | ||||
|  | ||||
| dofile(path.."/music_player.lua") | ||||
|   | ||||
| @@ -7,125 +7,133 @@ 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_cable',       'default:mossycobble'}, | ||||
| 		{'group:wood',      'group:wood',           'group:wood'}, | ||||
| 		{'default:diamond', 'default:diamond',      'default:diamond'}, | ||||
| 		{'default:stone',   'default:copper_ingot', 'default:stone'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| 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 | ||||
| local music_player_formspec = | ||||
| 	"invsize[8,9;]".. | ||||
| 	"label[0,0;"..S("Music Player").."]".. | ||||
| 	"button[4,1;1,1;track1;1]".. | ||||
| 	"button[5,1;1,1;track2;2]".. | ||||
| 	"button[6,1;1,1;track3;3]".. | ||||
| 	"button[4,2;1,1;track4;4]".. | ||||
| 	"button[5,2;1,1;track5;5]".. | ||||
| 	"button[6,2;1,1;track6;6]".. | ||||
| 	"button[4,3;1,1;track7;7]".. | ||||
| 	"button[5,3;1,1;track8;8]".. | ||||
| 	"button[6,3;1,1;track9;9]".. | ||||
| 	"button[4,4;1,2;play;Play]".. | ||||
| 	"button[6,4;1,2;stop;Stop]".. | ||||
| 	"label[4,0;Current track --]" | ||||
|  | ||||
| minetest.register_node("technic:music_player", { | ||||
| 	description = S("%s Music Player"):format("LV"), | ||||
| 	description = S("Music Player"), | ||||
| 	tiles = {"technic_music_player_top.png", "technic_machine_bottom.png", "technic_music_player_side.png", | ||||
| 	         "technic_music_player_side.png", "technic_music_player_side.png", "technic_music_player_side.png"}, | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, | ||||
| 		technic_machine=1, technic_lv=1}, | ||||
| 	connect_sides = {"bottom"}, | ||||
| 	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", S("%s Music Player"):format("LV")) | ||||
| 		set_display(meta) | ||||
| 		meta:set_string("infotext", S("Music Player")) | ||||
| 		meta:set_int("active", 0) | ||||
| 		meta:set_int("current_track", 1) | ||||
| 		meta:set_string("formspec", music_player_formspec) | ||||
| 	end, | ||||
| 	on_receive_fields = function(pos, formanme, fields, sender) | ||||
| 		local 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) | ||||
| 		local meta          = minetest.get_meta(pos) | ||||
| 		local music_handle  = meta:get_int("music_handle") | ||||
| 		local current_track = meta:get_int("current_track") | ||||
| 		if fields.track1 then current_track = 1 end | ||||
| 		if fields.track2 then current_track = 2 end | ||||
| 		if fields.track3 then current_track = 3 end | ||||
| 		if fields.track4 then current_track = 4 end | ||||
| 		if fields.track5 then current_track = 5 end | ||||
| 		if fields.track6 then current_track = 6 end | ||||
| 		if fields.track7 then current_track = 7 end | ||||
| 		if fields.track8 then current_track = 8 end | ||||
| 		if fields.track9 then current_track = 9 end | ||||
| 		meta:set_int("current_track", current_track) | ||||
| 		meta:set_string("formspec", | ||||
| 				"invsize[8,9;]".. | ||||
| 				"label[0,0;"..S("Music Player").."]".. | ||||
| 				"button[4,1;1,1;track1;1]".. | ||||
| 				"button[5,1;1,1;track2;2]".. | ||||
| 				"button[6,1;1,1;track3;3]".. | ||||
| 				"button[4,2;1,1;track4;4]".. | ||||
| 				"button[5,2;1,1;track5;5]".. | ||||
| 				"button[6,2;1,1;track6;6]".. | ||||
| 				"button[4,3;1,1;track7;7]".. | ||||
| 				"button[5,3;1,1;track8;8]".. | ||||
| 				"button[6,3;1,1;track9;9]".. | ||||
| 				"button[4,4;1,2;play;Play]".. | ||||
| 				"button[6,4;1,2;stop;Stop]".. | ||||
| 				"label[4,0;Current track " | ||||
| 				..current_track.."]") | ||||
| 		if fields.play then | ||||
| 			if music_handle then | ||||
| 				minetest.sound_stop(music_handle) | ||||
| 			end | ||||
| 			meta:set_int("active", 1) | ||||
| 		end | ||||
| 		if fields.stop then | ||||
| 			meta:set_int("active", 0) | ||||
| 			if music_handle then | ||||
| 				minetest.sound_stop(music_handle) | ||||
| 			end | ||||
| 		end | ||||
| 		meta:set_int("music_handle", music_handle) | ||||
| 	end, | ||||
| 	on_destruct = stop_player, | ||||
| 	technic_run = run, | ||||
| 	technic_on_disable = stop_player, | ||||
| }) | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:music_player"}, | ||||
| 	interval = 1, | ||||
| 	chance   = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		local meta         = minetest.get_meta(pos) | ||||
| 		local eu_input     = meta:get_int("LV_EU_input") | ||||
| 		local machine_name = S("Music Player") | ||||
| 		local machine_node = "technic:music_player" | ||||
| 		local demand       = 150 | ||||
|  | ||||
| 		local music_handle = meta:get_int("music_handle") | ||||
| 		local current_track = meta:get_int("current_track") | ||||
|  | ||||
| 		-- 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 | ||||
|  | ||||
| 		-- Power off automatically if no longer connected to a switching station | ||||
| 		technic.switching_station_timeout_count(pos, "LV") | ||||
|  | ||||
| 		if meta:get_int("active") == 0 then | ||||
| 			meta:set_string("infotext", S("%s Idle"):format(machine_name)) | ||||
| 			meta:set_int("LV_EU_demand", 0) | ||||
| 			if music_handle then | ||||
| 				minetest.sound_stop(music_handle) | ||||
| 			end | ||||
| 			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) | ||||
| 			end | ||||
| 		elseif eu_input >= demand then | ||||
| 			meta:set_string("infotext", S("%s Active"):format(machine_name)) | ||||
| 			music_handle = minetest.sound_play("technic_track"..current_track, | ||||
| 					{pos = pos, gain = 1.0, loop = true, max_hear_distance = 72,}) | ||||
| 			meta:set_int("music_handle", music_handle) | ||||
| 		end | ||||
| 		meta:set_int("LV_EU_demand", demand) | ||||
| 	end | ||||
| }) | ||||
|  | ||||
| technic.register_machine("LV", "technic:music_player", technic.receiver) | ||||
|   | ||||
| @@ -8,9 +8,9 @@ | ||||
| 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_cable',       ''}, | ||||
| 		{'technic:solar_panel', 'technic:solar_panel',    'technic:solar_panel'}, | ||||
| 		{'default:steel_ingot', 'technic:lv_transformer', 'default:steel_ingot'}, | ||||
| 		{'',                    'technic:lv_cable0',      ''}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
|   | ||||
| @@ -4,58 +4,16 @@ | ||||
|  | ||||
| local S = technic.getter | ||||
|  | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:solar_panel', | ||||
| 	recipe = { | ||||
| 		{'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer'}, | ||||
| 		{'basic_materials:silver_wire',    'technic:lv_cable',            'mesecons_materials:glue'}, | ||||
| 	}, | ||||
| 	replacements = { {"basic_materials:silver_wire", "basic_materials:empty_spool"}, }, | ||||
| }) | ||||
|  | ||||
|  | ||||
| local run = function(pos, node) | ||||
| 	-- The action here is to make the solar panel prodice power | ||||
| 	-- Power is dependent on the light level and the height above ground | ||||
| 	-- There are many ways to cheat by using other light sources like lamps. | ||||
| 	-- As there is no way to determine if light is sunlight that is just a shame. | ||||
| 	-- To take care of some of it solar panels do not work outside daylight hours or if | ||||
| 	-- built below 0m | ||||
| 	local pos1 = {x=pos.x, y=pos.y+1, z=pos.z} | ||||
| 	local machine_name = S("Small Solar %s Generator"):format("LV") | ||||
|  | ||||
| 	local light = minetest.get_node_light(pos1, nil) | ||||
| 	local time_of_day = minetest.get_timeofday() | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	if light == nil then light = 0 end | ||||
| 	-- turn on panel only during day time and if sufficient light | ||||
|         -- I know this is counter intuitive when cheating by using other light sources underground. | ||||
| 	if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > -10 then | ||||
| 		local charge_to_give = math.floor((light + pos1.y) * 3) | ||||
| 		charge_to_give = math.max(charge_to_give, 0) | ||||
| 		charge_to_give = math.min(charge_to_give, 200) | ||||
| 		meta:set_string("infotext", S("@1 Active (@2)", machine_name, | ||||
| 			technic.EU_string(charge_to_give))) | ||||
| 		meta:set_int("LV_EU_supply", charge_to_give) | ||||
| 	else | ||||
| 		meta:set_string("infotext", S("%s Idle"):format(machine_name)) | ||||
| 		meta:set_int("LV_EU_supply", 0) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| minetest.register_node("technic:solar_panel", { | ||||
| 	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, technic_lv=1}, | ||||
| 	connect_sides = {"bottom"}, | ||||
| 	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
|     	description = S("Small Solar %s Generator"):format("LV"), | ||||
|     	description = S("Solar Panel"), | ||||
| 	active = false, | ||||
| 	drawtype = "nodebox", | ||||
| 	paramtype = "light", | ||||
| 	is_ground_content = true, | ||||
| 	is_ground_content = true,	 | ||||
| 	node_box = { | ||||
| 		type = "fixed", | ||||
| 		fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, | ||||
| @@ -63,10 +21,53 @@ minetest.register_node("technic:solar_panel", { | ||||
| 	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")) | ||||
| 		meta:set_string("infotext", S("Solar Panel")) | ||||
| 	end, | ||||
| 	technic_run = run, | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:solar_panel', | ||||
| 	recipe = { | ||||
| 		{'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer'}, | ||||
| 		{'default:steel_ingot',         'technic:lv_cable0',           'default:steel_ingot'}, | ||||
|  | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:solar_panel"}, | ||||
| 	interval   = 1, | ||||
| 	chance     = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		-- The action here is to make the solar panel prodice power | ||||
| 		-- Power is dependent on the light level and the height above ground | ||||
| 		-- 130m and above is optimal as it would be above cloud level. | ||||
| 		-- Height gives 1/4 of the effect, light 3/4. Max. effect is 26EU. | ||||
| 		-- There are many ways to cheat by using other light sources like lamps. | ||||
| 		-- As there is no way to determine if light is sunlight that is just a shame. | ||||
| 		-- To take care of some of it solar panels do not work outside daylight hours or if | ||||
| 		-- built below -10m | ||||
| 		local pos1 = {x=pos.x, y=pos.y+1, z=pos.z} | ||||
| 		local machine_name = S("Solar Panel") | ||||
|  | ||||
| 		local light = minetest.get_node_light(pos1, nil) | ||||
| 		local time_of_day = minetest.get_timeofday() | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		if light == nil then light = 0 end | ||||
| 		-- turn on panel only during day time and if sufficient light | ||||
|                 -- I know this is counter intuitive when cheating by using other light sources underground. | ||||
| 		if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > -10 then | ||||
| 			local charge_to_give = math.floor((light + pos1.y) * 3) | ||||
| 			charge_to_give = math.max(charge_to_give, 0) | ||||
| 			charge_to_give = math.min(charge_to_give, 200) | ||||
| 			meta:set_string("infotext", S("%s Active"):format(machine_name).." ("..charge_to_give.."EU)") | ||||
| 			meta:set_int("LV_EU_supply", charge_to_give) | ||||
| 		else | ||||
| 			meta:set_string("infotext", S("%s Idle"):format(machine_name)) | ||||
| 			meta:set_int("LV_EU_supply", 0) | ||||
| 		end | ||||
| 	end, | ||||
| })  | ||||
|  | ||||
| technic.register_machine("LV", "technic:solar_panel", technic.producer) | ||||
|  | ||||
|   | ||||
| @@ -1,109 +1,104 @@ | ||||
| -- A water mill produces LV EUs by exploiting flowing water across it | ||||
| -- It is a LV EU supplier and fairly low yield (max 180EUs) | ||||
| -- It is a little over half as good as the thermal generator. | ||||
| -- 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 | ||||
|  | ||||
| local cable_entry = "^technic_cable_connection_overlay.png" | ||||
|  | ||||
| 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_cable',       'technic:marble'}, | ||||
| 		{'default:stone', 'default:stone',        'default:stone'}, | ||||
| 		{'group:wood',    'default:diamond',      'group:wood'}, | ||||
| 		{'default:stone', 'default:copper_ingot', 'default:stone'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| local function check_node_around_mill(pos) | ||||
| 	local node = minetest.get_node(pos) | ||||
| 	if node.name == "default:water_flowing" | ||||
| 	  or node.name == "default:river_water_flowing" then | ||||
| 		return node.param2 -- returns approx. water flow, if any | ||||
| 	end | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| local run = function(pos, node) | ||||
| 	local meta             = minetest.get_meta(pos) | ||||
| 	local water_flow       = 0 | ||||
| 	local production_level = 0 | ||||
| 	local eu_supply        = 0 | ||||
| 	local max_output       = 4 * 45 -- keeping it around 180, little more than previous 150 :) | ||||
|  | ||||
| 	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_flow = water_flow + check | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	eu_supply = math.min(4 * water_flow, max_output) | ||||
| 	production_level = math.floor(100 * eu_supply / max_output) | ||||
|  | ||||
| 	meta:set_int("LV_EU_supply", eu_supply) | ||||
|  | ||||
| 	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"..cable_entry, | ||||
| 		"technic_water_mill_side.png", | ||||
| 		"technic_water_mill_side.png", | ||||
| 		"technic_water_mill_side.png", | ||||
| 		"technic_water_mill_side.png" | ||||
| 	}, | ||||
| 	description = S("Water Mill"), | ||||
| 	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, technic_lv=1}, | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", S("Hydro %s Generator"):format("LV")) | ||||
| 		meta:set_string("infotext", S("Water Mill")) | ||||
| 		meta:set_int("LV_EU_supply", 0) | ||||
| 	end, | ||||
| 	technic_run = run, | ||||
| 	end,	 | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:water_mill_active", { | ||||
| 	description = S("Hydro %s Generator"):format("LV"), | ||||
| 	description = S("Water Mill"), | ||||
| 	tiles = {"technic_water_mill_top_active.png", "technic_machine_bottom.png", | ||||
| 	         "technic_water_mill_side.png",       "technic_water_mill_side.png", | ||||
| 	         "technic_water_mill_side.png",       "technic_water_mill_side.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, | ||||
| 		technic_machine=1, technic_lv=1, not_in_creative_inventory=1}, | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	drop = "technic:water_mill", | ||||
| 	technic_run = run, | ||||
| 	technic_disabled_machine_name = "technic:water_mill", | ||||
| }) | ||||
|  | ||||
| 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 | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:water_mill", "technic:water_mill_active"}, | ||||
| 	interval = 1, | ||||
| 	chance   = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		local meta             = minetest.get_meta(pos) | ||||
| 		local 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("Water Mill").." ("..production_level.."%)") | ||||
|  | ||||
| 		if production_level > 0 and | ||||
| 		   minetest.get_node(pos).name == "technic:water_mill" then | ||||
| 			hacky_swap_node (pos, "technic:water_mill_active") | ||||
| 			meta:set_int("LV_EU_supply", 0) | ||||
| 			return | ||||
| 		end | ||||
| 		if production_level == 0 then | ||||
| 			hacky_swap_node(pos, "technic:water_mill") | ||||
| 		end | ||||
| 	end | ||||
| })  | ||||
|  | ||||
| technic.register_machine("LV", "technic:water_mill",        technic.producer) | ||||
| technic.register_machine("LV", "technic:water_mill_active", technic.producer) | ||||
|  | ||||
|   | ||||
| @@ -4,11 +4,11 @@ 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_cable',         'technic:stainless_steel_ingot'}, | ||||
| 		{'pipeworks:tube_000000',         'technic:mv_transformer',   'pipeworks:tube_000000'}, | ||||
| 		{'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}}) | ||||
| technic.register_alloy_furnace({tier="MV", cook_time=4, upgrade=1, tube=1, demand={3000, 2000, 1000}}) | ||||
|  | ||||
|   | ||||
| @@ -5,18 +5,16 @@ minetest.register_craft({ | ||||
| 	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_cable',        ''}, | ||||
| 		{'',                        'technic:mv_cable0',       ''}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_battery_box({ | ||||
| 	tier           = "MV", | ||||
| 	max_charge     = 200000, | ||||
| 	max_charge     = 300000, | ||||
| 	charge_rate    = 20000, | ||||
| 	discharge_rate = 80000, | ||||
| 	charge_step    = 2000, | ||||
| 	discharge_step = 8000, | ||||
| 	upgrade        = 1, | ||||
| 	tube           = 1, | ||||
| }) | ||||
|  | ||||
|   | ||||
| @@ -1,14 +1,14 @@ | ||||
|  | ||||
| minetest.register_alias("mv_cable", "technic:mv_cable") | ||||
| minetest.register_alias("mv_cable", "technic:mv_cable0") | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:mv_cable 3', | ||||
| 	output = 'technic:mv_cable0 3', | ||||
| 	recipe ={ | ||||
| 		{'technic:rubber',   'technic:rubber',   'technic:rubber'}, | ||||
| 		{'technic:lv_cable', 'technic:lv_cable', 'technic:lv_cable'}, | ||||
| 		{'technic:rubber',   'technic:rubber',   'technic:rubber'}, | ||||
| 		{'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) | ||||
|  | ||||
|   | ||||
| @@ -1,16 +0,0 @@ | ||||
| minetest.register_craft({ | ||||
| 	output = "technic:mv_centrifuge", | ||||
| 	recipe = { | ||||
| 		{"basic_materials:motor",          "technic:copper_plate",   "technic:diamond_drill_head"}, | ||||
| 		{"technic:copper_plate",   "technic:machine_casing", "technic:copper_plate"      }, | ||||
| 		{"pipeworks:one_way_tube", "technic:mv_cable",       "pipeworks:mese_filter"     }, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_centrifuge({ | ||||
| 	tier = "MV", | ||||
| 	demand = { 8000, 7000, 6000 }, | ||||
| 	speed = 2, | ||||
| 	upgrade = 1, | ||||
| 	tube = 1, | ||||
| }) | ||||
| @@ -1,12 +0,0 @@ | ||||
| -- 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_cable',       'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_compressor({tier = "MV", demand = {800, 600, 400}, speed = 2, upgrade = 1, tube = 1}) | ||||
| @@ -9,8 +9,8 @@ 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_cable',            'technic:stainless_steel_ingot'}, | ||||
| 		{'pipeworks:tube_000000',         'technic:mv_transformer',      'pipeworks:tube_000000'}, | ||||
| 		{'technic:stainless_steel_ingot', 'technic:mv_cable0',           'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
|   | ||||
| @@ -1,12 +0,0 @@ | ||||
| -- 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_cable',       'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_extractor({tier = "MV", demand = {800, 600, 400}, speed = 2, upgrade = 1, tube = 1}) | ||||
| @@ -1,12 +0,0 @@ | ||||
| -- MV freezer | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:mv_freezer', | ||||
| 	recipe = { | ||||
| 		{'technic:stainless_steel_ingot', 'technic:motor',          'technic:stainless_steel_ingot'}, | ||||
| 		{'pipeworks:pipe_1_empty',        'technic:mv_transformer', 'pipeworks:pipe_1_empty'}, | ||||
| 		{'technic:stainless_steel_ingot', 'technic:mv_cable',       'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_freezer({tier = "MV", demand = {800, 600, 400}, speed = 0.5, upgrade = 1, tube = 1}) | ||||
| @@ -1,13 +1,14 @@ | ||||
|  | ||||
| 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'}, | ||||
| 		{'pipeworks:tube_000000',         'technic:mv_transformer', 'pipeworks:tube_000000'}, | ||||
| 		{'technic:stainless_steel_ingot', 'technic:mv_cable',       'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| technic.register_generator({tier="MV", tube=1, supply=600}) | ||||
| technic.register_generator({tier="MV", supply=600}) | ||||
|  | ||||
|   | ||||
| @@ -4,8 +4,8 @@ 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_cable',       'technic:stainless_steel_ingot'}, | ||||
| 		{'pipeworks:tube_000000',         'technic:mv_transformer', 'pipeworks:tube_000000'}, | ||||
| 		{'technic:stainless_steel_ingot', 'technic:mv_cable0',      'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
|   | ||||
| @@ -1,105 +0,0 @@ | ||||
| -- A Hydro Turbine produces MV EUs by exploiting flowing water across it | ||||
| -- It is a MV EU supplier and fairly high yield (max 1800EUs) | ||||
|  | ||||
| local S = technic.getter | ||||
|  | ||||
| local cable_entry = "^technic_cable_connection_overlay.png" | ||||
|  | ||||
| minetest.register_alias("hydro_turbine", "technic:hydro_turbine") | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:hydro_turbine', | ||||
| 	recipe = { | ||||
| 		{'technic:stainless_steel_ingot', 'technic:water_mill', 'technic:stainless_steel_ingot'}, | ||||
| 		{'technic:water_mill', 'technic:mv_transformer', 'technic:water_mill'}, | ||||
| 		{'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| local function get_water_flow(pos) | ||||
| 	local node = minetest.get_node(pos) | ||||
| 	if minetest.get_item_group(node.name, "water") == 3 and string.find(node.name, "flowing") then | ||||
| 		return node.param2 -- returns approx. water flow, if any | ||||
| 	end | ||||
| 	return 0 | ||||
| end | ||||
|  | ||||
| --- | ||||
| -- 10 times better than LV hydro because of 2 extra water mills and 4 stainless steel, a transformer and whatnot ;P. | ||||
| -- Man hydro turbines are tough and long lasting. So, give it some value :) | ||||
| local run = function(pos, node) | ||||
| 	local meta             = minetest.get_meta(pos) | ||||
| 	local water_flow       = 0 | ||||
| 	local production_level = 0 | ||||
| 	local eu_supply        = 0 | ||||
| 	local max_output       = 40 * 45 -- Generates 1800EU/s | ||||
|  | ||||
| 	local positions = { | ||||
| 		{x=pos.x+1, y=pos.y, z=pos.z}, | ||||
| 		{x=pos.x-1, y=pos.y, z=pos.z}, | ||||
| 		{x=pos.x,   y=pos.y, z=pos.z+1}, | ||||
| 		{x=pos.x,   y=pos.y, z=pos.z-1}, | ||||
| 	} | ||||
|  | ||||
| 	for _, p in pairs(positions) do | ||||
| 		water_flow = water_flow + get_water_flow(p) | ||||
| 	end | ||||
|  | ||||
| 	eu_supply = math.min(40 * water_flow, max_output) | ||||
| 	production_level = math.floor(100 * eu_supply / max_output) | ||||
|  | ||||
| 	meta:set_int("MV_EU_supply", eu_supply) | ||||
|  | ||||
| 	meta:set_string("infotext", | ||||
| 	S("Hydro %s Generator"):format("MV").." ("..production_level.."%)") | ||||
| 	if production_level > 0 and | ||||
| 		minetest.get_node(pos).name == "technic:hydro_turbine" then | ||||
| 		technic.swap_node(pos, "technic:hydro_turbine_active") | ||||
| 		meta:set_int("MV_EU_supply", 0) | ||||
| 		return | ||||
| 	end | ||||
| 	if production_level == 0 then | ||||
| 		technic.swap_node(pos, "technic:hydro_turbine") | ||||
| 	end | ||||
| end | ||||
|  | ||||
| minetest.register_node("technic:hydro_turbine", { | ||||
| 	description = S("Hydro %s Generator"):format("MV"), | ||||
| 	tiles = { | ||||
| 		"technic_hydro_turbine_top.png", | ||||
| 		"technic_machine_bottom.png"..cable_entry, | ||||
| 		"technic_hydro_turbine_side.png", | ||||
| 		"technic_hydro_turbine_side.png", | ||||
| 		"technic_hydro_turbine_side.png", | ||||
| 		"technic_hydro_turbine_side.png" | ||||
| 	}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, | ||||
| 	technic_machine=1, technic_mv=1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", S("Hydro %s Generator"):format("MV")) | ||||
| 		meta:set_int("MV_EU_supply", 0) | ||||
| 	end, | ||||
| 	technic_run = run, | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:hydro_turbine_active", { | ||||
| 	description = S("Hydro %s Generator"):format("MV"), | ||||
| 	tiles = {"technic_hydro_turbine_top_active.png", "technic_machine_bottom.png", | ||||
| 			"technic_hydro_turbine_side.png", "technic_hydro_turbine_side.png", | ||||
| 			"technic_hydro_turbine_side.png", "technic_hydro_turbine_side.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, | ||||
| 			technic_machine=1, technic_mv=1, not_in_creative_inventory=1}, | ||||
| 	legacy_facedir_simple = true, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	drop = "technic:hydro_turbine", | ||||
| 	technic_run = run, | ||||
| 	technic_disabled_machine_name = "technic:hydro_turbine", | ||||
| }) | ||||
|  | ||||
| technic.register_machine("MV", "technic:hydro_turbine",        technic.producer) | ||||
| technic.register_machine("MV", "technic:hydro_turbine_active", technic.producer) | ||||
| @@ -3,33 +3,20 @@ technic.register_tier("MV", "Medium Voltage") | ||||
|  | ||||
| local path = technic.modpath.."/machines/MV" | ||||
|  | ||||
| -- Wiring stuff | ||||
| dofile(path.."/cables.lua") | ||||
| dofile(path.."/alloy_furnace.lua") | ||||
| dofile(path.."/battery_box.lua") | ||||
|  | ||||
| -- Generators | ||||
| dofile(path.."/cables.lua") | ||||
| dofile(path.."/electric_furnace.lua") | ||||
| dofile(path.."/grinder.lua") | ||||
| dofile(path.."/solar_array.lua") | ||||
| dofile(path.."/tool_workshop.lua") | ||||
| if technic.config:get_bool("enable_wind_mill") then | ||||
| 	dofile(path.."/wind_mill.lua") | ||||
| end | ||||
| dofile(path.."/generator.lua") | ||||
| dofile(path.."/solar_array.lua") | ||||
| dofile(path.."/hydro_turbine.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") | ||||
|  | ||||
| dofile(path.."/freezer.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") | ||||
| dofile(path.."/power_radiator.lua") | ||||
| dofile(path.."/lighting.lua") | ||||
|  | ||||
|   | ||||
| @@ -49,7 +49,7 @@ 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) | ||||
| 	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 | ||||
| @@ -76,7 +76,7 @@ local technic_homedecor_rotate_and_place = function(itemstack, placer, pointed_t | ||||
|  | ||||
| 				if not minetest.registered_nodes[minetest.get_node(pos1).name]["buildable_to"] then return end | ||||
|  | ||||
| 				if iswall then | ||||
| 				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 | ||||
|   | ||||
| @@ -12,16 +12,6 @@ | ||||
|  | ||||
| local power_radius = 12 | ||||
|  | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:power_radiator 1', | ||||
| 	recipe = { | ||||
| 		{'technic:stainless_steel_ingot', 'technic:mv_transformer', 'technic:stainless_steel_ingot'}, | ||||
| 		{'technic:copper_coil',           'technic:machine_casing', 'technic:copper_coil'}, | ||||
| 		{'technic:rubber',                'technic:mv_cable',       'technic:rubber'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| ------------------------------------------------------------------ | ||||
| -- API for inductive powered nodes: | ||||
| -- Use the functions below to set the corresponding callbacks | ||||
| @@ -53,7 +43,7 @@ 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) | ||||
| 		hacky_swap_node(pos, swapnode) | ||||
| 		meta:set_int("active", 1) | ||||
| 		meta:set_int("EU_charge",eu_charge) | ||||
| 		--print("-----------") | ||||
| @@ -66,7 +56,7 @@ end | ||||
|  | ||||
| technic.inductive_on_punch_on = function(pos, eu_charge, swapnode) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	technic.swap_node(pos, swapnode) | ||||
| 	hacky_swap_node(pos, swapnode) | ||||
| 	meta:set_int("active", 0) | ||||
| 	meta:set_int("EU_charge",eu_charge) | ||||
| 	--print("-----------") | ||||
| @@ -92,7 +82,7 @@ local shutdown_inductive_appliances = function(pos) | ||||
| 			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)) | ||||
| 				hacky_swap_node(pos1, string.sub(nodename, 1, -8)) | ||||
| 				meta1:set_int("active", 0) | ||||
| 				meta1:set_int("EU_charge", 0) | ||||
| 			end | ||||
| @@ -118,7 +108,7 @@ local toggle_on_off_inductive_appliances = function(pos, node, puncher) | ||||
| end | ||||
|  | ||||
| minetest.register_node("technic:power_radiator", { | ||||
| 	description = "MV Power Radiator", | ||||
| 	description = "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}, | ||||
| @@ -134,7 +124,7 @@ minetest.register_node("technic:power_radiator", { | ||||
| 		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") | ||||
| 		meta:set_string("infotext", "Power Radiator") | ||||
| 	end, | ||||
| 	on_dig = function(pos, node, digger) | ||||
| 		shutdown_inductive_appliances(pos) | ||||
| @@ -145,13 +135,21 @@ minetest.register_node("technic:power_radiator", { | ||||
| 	end | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:power_radiator 1', | ||||
| 	recipe = { | ||||
| 		{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, | ||||
| 		{'technic:copper_coil',           'technic:mv_transformer',        'technic:copper_coil'}, | ||||
| 		{'technic:rubber',                'technic:mv_cable0',       'technic:rubber'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	label = "Machines: run power radiator", | ||||
| 	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 meta             = minetest.env:get_meta(pos) | ||||
| 		local eu_input  = meta:get_int("MV_EU_input") | ||||
| 		local eu_demand = meta:get_int("MV_EU_demand") | ||||
|  | ||||
| @@ -160,7 +158,7 @@ minetest.register_abm({ | ||||
|  | ||||
| 		if eu_input == 0 then | ||||
| 			-- No power | ||||
| 			meta:set_string("infotext", "MV Power Radiator is unpowered"); | ||||
| 			meta:set_string("infotext", "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) | ||||
| @@ -203,7 +201,7 @@ minetest.register_abm({ | ||||
| 					-- 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 (" | ||||
| 				meta:set_string("infotext", "Power Radiator is powered (" | ||||
| 					..math.floor(used_charge / max_charge * 100) | ||||
| 					.."% of maximum power)"); | ||||
| 				if used_charge == 0 then | ||||
|   | ||||
| @@ -2,13 +2,11 @@ | ||||
| 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_cable',       ''}, | ||||
| 		{'technic:solar_array_lv', 'technic:solar_array_lv', 'technic:solar_array_lv'}, | ||||
| 		{'default:steel_ingot',    'technic:mv_transformer', 'default: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") | ||||
|   | ||||
| @@ -5,123 +5,88 @@ minetest.register_alias("tool_workshop", "technic:tool_workshop") | ||||
|  | ||||
| local S = technic.getter | ||||
|  | ||||
| local tube_entry = "^pipeworks_tube_connection_wooden.png" | ||||
|  | ||||
| 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_cable',       'default:obsidian'}, | ||||
| 		{'group:wood',    'group:wood',           'group:wood'}, | ||||
| 		{'group:wood',    'default:diamond',      'group:wood'}, | ||||
| 		{'default:stone', 'default:copper_ingot', 'default:stone'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| local workshop_demand = {5000, 3500, 2000} | ||||
|  | ||||
| local workshop_formspec = | ||||
| 	"size[8,9;]".. | ||||
| 	"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 | ||||
| 	"label[0,0;"..S("Tool Workshop").."]".. | ||||
| 	"list[current_player;main;0,5;8,4;]" | ||||
|  | ||||
| minetest.register_node("technic:tool_workshop", { | ||||
| 	description = S("%s Tool Workshop"):format("MV"), | ||||
| 	paramtype2 = "facedir", | ||||
| 	tiles = { | ||||
| 		"technic_workshop_top.png"..tube_entry, | ||||
| 		"technic_machine_bottom.png"..tube_entry, | ||||
| 		"technic_workshop_side.png"..tube_entry, | ||||
| 		"technic_workshop_side.png"..tube_entry, | ||||
| 		"technic_workshop_side.png"..tube_entry, | ||||
| 		"technic_workshop_side.png" | ||||
| 	}, | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, | ||||
| 		technic_machine=1, technic_mv=1, tubedevice=1, tubedevice_receiver=1}, | ||||
| 	connect_sides = {"bottom", "back", "left", "right"}, | ||||
| 	description = S("Tool Workshop"), | ||||
| 	tiles = {"technic_workshop_top.png", "technic_machine_bottom.png", "technic_workshop_side.png", | ||||
| 	         "technic_workshop_side.png", "technic_workshop_side.png", "technic_workshop_side.png"}, | ||||
| 	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", S("%s Tool Workshop"):format("MV")) | ||||
| 		meta:set_string("infotext", S("Tool Workshop")) | ||||
| 		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 | ||||
| 	can_dig = function(pos,player) | ||||
| 		local meta = minetest.get_meta(pos); | ||||
| 		local inv = meta:get_inventory() | ||||
| 		if not inv:is_empty("src") then | ||||
| 			minetest.chat_send_player(player:get_player_name(), | ||||
| 				S("Machine cannot be removed because it is not empty")) | ||||
| 			return false | ||||
| 		end | ||||
| 		return true | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:tool_workshop"}, | ||||
| 	interval = 1, | ||||
| 	chance   = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		local meta         = minetest.get_meta(pos) | ||||
| 		local inv          = meta:get_inventory() | ||||
| 		local eu_input     = meta:get_int("MV_EU_input") | ||||
| 		local machine_name = S("Tool Workshop") | ||||
| 		local machine_node = "technic:tool_workshop" | ||||
| 		local demand       = 5000 | ||||
|  | ||||
| 		-- Setup meta data if it does not exist. | ||||
| 		if not eu_input then | ||||
| 			meta:set_int("MV_EU_demand", demand) | ||||
| 			meta:set_int("MV_EU_input", 0) | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		-- Power off automatically if no longer connected to a switching station | ||||
| 		technic.switching_station_timeout_count(pos, "MV") | ||||
|  | ||||
| 		srcstack = inv:get_stack("src", 1) | ||||
| 		if inv:is_empty("src") or | ||||
| 		   srcstack:get_wear() == 0 or | ||||
| 		   srcstack:get_name() == "technic:water_can" or | ||||
| 		   srcstack:get_name() == "technic:lava_can" then | ||||
| 			meta:set_string("infotext", S("%s Idle"):format(machine_name)) | ||||
| 			meta:set_int("MV_EU_demand", 0) | ||||
| 			return | ||||
| 		end | ||||
| 		 | ||||
| 		if eu_input < demand then | ||||
| 			meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) | ||||
| 		elseif eu_input >= demand then | ||||
| 			meta:set_string("infotext", S("%s Active"):format(machine_name)) | ||||
| 			srcstack:add_wear(-1000) | ||||
| 			inv:set_stack("src", 1, srcstack) | ||||
| 		end | ||||
| 		meta:set_int("MV_EU_demand", demand) | ||||
| 	end | ||||
| })  | ||||
|  | ||||
| technic.register_machine("MV", "technic:tool_workshop", technic.receiver) | ||||
|  | ||||
|   | ||||
| @@ -4,74 +4,36 @@ 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'}, | ||||
| 		{'default:steel_ingot', '',                    'default:steel_ingot'}, | ||||
| 		{'',                    'default:steel_ingot', ''}, | ||||
| 		{'default:steel_ingot', '',                    'default:steel_ingot'}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = 'technic:wind_mill', | ||||
| 	recipe = { | ||||
| 		{'',                           'basic_materials:motor',              ''}, | ||||
| 		{'technic:carbon_steel_ingot', 'technic:carbon_steel_block', 'technic:carbon_steel_ingot'}, | ||||
| 		{'',                           'technic:mv_cable',           ''}, | ||||
| 		{'',                    'default:steel_ingot', ''}, | ||||
| 		{'default:steel_ingot', 'technic:motor',       'default:steel_ingot'}, | ||||
| 		{'',                    'default:steelblock',  ''}, | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:wind_mill_frame", { | ||||
| 	description = S("Wind Mill Frame"), | ||||
| 	drawtype = "glasslike_framed", | ||||
| 	tiles = {"technic_carbon_steel_block.png", "default_glass.png"}, | ||||
| 	tiles = {"default_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 | ||||
| 	pos = {x=pos.x, y=pos.y, z=pos.z} | ||||
| 	for i = 1, 20 do | ||||
| 		pos.y = pos.y - 1 | ||||
| 		local node = minetest.get_node_or_nil(pos) | ||||
| 		if not node then | ||||
| 			-- we reached CONTENT_IGNORE, we can assume, that nothing changed | ||||
| 			-- as the user will have to load the block to change it | ||||
| 			return | ||||
| 		end | ||||
| 		if node.name ~= "technic:wind_mill_frame" then | ||||
| 			return false | ||||
| 		end | ||||
| 	end | ||||
| 	return true | ||||
| end | ||||
|  | ||||
| local run = function(pos, node) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	local machine_name = S("Wind %s Generator"):format("MV") | ||||
|  | ||||
| 	local check = check_wind_mill(pos) | ||||
| 	if check == false then | ||||
| 		meta:set_int("MV_EU_supply", 0) | ||||
| 		meta:set_string("infotext", S("%s Improperly Placed"):format(machine_name)) | ||||
| 	elseif check == true then | ||||
| 		local power = math.min(pos.y * 100, 5000) | ||||
| 		meta:set_int("MV_EU_supply", power) | ||||
| 		meta:set_string("infotext", S("@1 (@2)", machine_name, | ||||
| 			technic.EU_string(power))) | ||||
| 	end | ||||
| 	-- check == nil: assume nothing has changed | ||||
| end | ||||
|  | ||||
| minetest.register_node("technic:wind_mill", { | ||||
| 	description = S("Wind %s Generator"):format("MV"), | ||||
| 	tiles = {"technic_carbon_steel_block.png"}, | ||||
| 	description = S("Wind Mill"), | ||||
| 	tiles = {"default_steel_block.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {cracky=1, technic_machine=1, technic_mv=1}, | ||||
| 	connect_sides = {"top", "bottom", "back", "left", "right"}, | ||||
| 	groups = {cracky=1}, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| 	drawtype = "nodebox", | ||||
| 	paramtype = "light", | ||||
| @@ -86,10 +48,43 @@ minetest.register_node("technic:wind_mill", { | ||||
| 	}, | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("infotext", S("Wind %s Generator"):format("MV")) | ||||
| 		meta:set_string("infotext", S("Wind Mill")) | ||||
| 		meta:set_int("MV_EU_supply", 0) | ||||
| 	end, | ||||
| 	technic_run = run, | ||||
| 	end,	 | ||||
| }) | ||||
|  | ||||
| local function check_wind_mill(pos) | ||||
| 	if pos.y < 30 then | ||||
| 		return false | ||||
| 	end | ||||
| 	for i = 1, 20 do | ||||
| 		local node = minetest.get_node({x=pos.x, y=pos.y-i, z=pos.z}) | ||||
| 		if node.name ~= "technic:wind_mill_frame" then | ||||
| 			return false | ||||
| 		end | ||||
| 	end | ||||
| 	return true | ||||
| end | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"technic:wind_mill"}, | ||||
| 	interval = 1, | ||||
| 	chance   = 1, | ||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		local machine_name = S("Wind Mill") | ||||
| 		local power = math.min(pos.y * 100, 5000) | ||||
|  | ||||
| 		if not check_wind_mill(pos) then | ||||
| 			meta:set_int("MV_EU_supply", 0) | ||||
| 			meta:set_string("infotext", S("%s Improperly Placed"):format(machine_name)) | ||||
| 			return | ||||
| 		else | ||||
| 			meta:set_int("MV_EU_supply", power) | ||||
| 		end | ||||
|  | ||||
| 		meta:set_string("infotext", machine_name.." ("..power.."EU)") | ||||
| 	end | ||||
| }) | ||||
|  | ||||
| technic.register_machine("MV", "technic:wind_mill", technic.producer) | ||||
|   | ||||
| @@ -8,7 +8,6 @@ dofile(path.."/MV/init.lua") | ||||
| dofile(path.."/HV/init.lua") | ||||
|  | ||||
| dofile(path.."/switching_station.lua") | ||||
| dofile(path.."/power_monitor.lua") | ||||
| dofile(path.."/supply_converter.lua") | ||||
|  | ||||
| dofile(path.."/other/init.lua") | ||||
|   | ||||
| @@ -1,109 +0,0 @@ | ||||
| local S = technic.getter | ||||
|  | ||||
| local desc = S("Administrative World Anchor") | ||||
|  | ||||
| local function compute_forceload_positions(pos, meta) | ||||
| 	local radius = meta:get_int("radius") | ||||
| 	local minpos = vector.subtract(pos, vector.new(radius, radius, radius)) | ||||
| 	local maxpos = vector.add(pos, vector.new(radius, radius, radius)) | ||||
| 	local minbpos = {} | ||||
| 	local maxbpos = {} | ||||
| 	for _, coord in ipairs({"x","y","z"}) do | ||||
| 		minbpos[coord] = math.floor(minpos[coord] / 16) * 16 | ||||
| 		maxbpos[coord] = math.floor(maxpos[coord] / 16) * 16 | ||||
| 	end | ||||
| 	local flposes = {} | ||||
| 	for x = minbpos.x, maxbpos.x, 16 do | ||||
| 		for y = minbpos.y, maxbpos.y, 16 do | ||||
| 			for z = minbpos.z, maxbpos.z, 16 do | ||||
| 				table.insert(flposes, vector.new(x, y, z)) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	return flposes | ||||
| end | ||||
|  | ||||
| local function currently_forceloaded_positions(meta) | ||||
| 	local ser = meta:get_string("forceloaded") | ||||
| 	return ser == "" and {} or minetest.deserialize(ser) | ||||
| end | ||||
|  | ||||
| local function forceload_off(meta) | ||||
| 	local flposes = currently_forceloaded_positions(meta) | ||||
| 	meta:set_string("forceloaded", "") | ||||
| 	for _, p in ipairs(flposes) do | ||||
| 		minetest.forceload_free_block(p) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local function forceload_on(pos, meta) | ||||
| 	local want_flposes = compute_forceload_positions(pos, meta) | ||||
| 	local have_flposes = {} | ||||
| 	for _, p in ipairs(want_flposes) do | ||||
| 		if minetest.forceload_block(p) then | ||||
| 			table.insert(have_flposes, p) | ||||
| 		end | ||||
| 	end | ||||
| 	meta:set_string("forceloaded", #have_flposes == 0 and "" or minetest.serialize(have_flposes)) | ||||
| end | ||||
|  | ||||
| local function set_display(pos, meta) | ||||
| 	meta:set_string("infotext", S(meta:get_int("enabled") ~= 0 and "%s Enabled" or "%s Disabled"):format(desc)) | ||||
| 	meta:set_string("formspec", | ||||
| 		"size[5,3.5]".. | ||||
| 		"item_image[0,0;1,1;technic:admin_anchor]".. | ||||
| 		"label[1,0;"..minetest.formspec_escape(desc).."]".. | ||||
| 		"label[0,1;"..minetest.formspec_escape(S("Owner:").." "..meta:get_string("owner")).."]".. | ||||
| 		(meta:get_int("locked") == 0 and | ||||
| 			"button[3,1;2,1;lock;"..minetest.formspec_escape(S("Unlocked")).."]" or | ||||
| 			"button[3,1;2,1;unlock;"..minetest.formspec_escape(S("Locked")).."]").. | ||||
| 		"field[0.25,2.3;1,1;radius;"..minetest.formspec_escape(S("Radius:"))..";"..meta:get_int("radius").."]".. | ||||
| 		(meta:get_int("enabled") == 0 and | ||||
| 			"button[3,2;2,1;enable;"..minetest.formspec_escape(S("Disabled")).."]" or | ||||
| 			"button[3,2;2,1;disable;"..minetest.formspec_escape(S("Enabled")).."]").. | ||||
| 		"label[0,3;"..minetest.formspec_escape(S("Keeping %d/%d map blocks loaded"):format(#currently_forceloaded_positions(meta), #compute_forceload_positions(pos, meta))).."]") | ||||
| end | ||||
|  | ||||
| minetest.register_node("technic:admin_anchor", { | ||||
| 	description = desc, | ||||
| 	drawtype = "normal", | ||||
| 	tiles = {"technic_admin_anchor.png"}, | ||||
| 	is_ground_content = true, | ||||
| 	groups = {cracky=3, not_in_creative_inventory=1}, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| 	after_place_node = function (pos, placer) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		if placer and placer:is_player() then | ||||
| 			meta:set_string("owner", placer:get_player_name()) | ||||
| 		end | ||||
| 		set_display(pos, meta) | ||||
| 	end, | ||||
| 	can_dig = function (pos, player) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		return meta:get_int("locked") == 0 or (player and player:is_player() and player:get_player_name() == meta:get_string("owner")) | ||||
| 	end, | ||||
| 	on_destruct = function (pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		forceload_off(meta) | ||||
| 	end, | ||||
| 	on_receive_fields = function (pos, formname, fields, sender) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		if (meta:get_int("locked") ~= 0 or fields.lock) and | ||||
| 				not (sender and sender:is_player() and | ||||
| 					sender:get_player_name() == meta:get_string("owner")) then | ||||
| 			return | ||||
| 		end | ||||
| 		if fields.unlock then meta:set_int("locked", 0) end | ||||
| 		if fields.lock then meta:set_int("locked", 1) end | ||||
| 		if fields.disable or fields.enable or fields.radius then | ||||
| 			forceload_off(meta) | ||||
| 			if fields.disable then meta:set_int("enabled", 0) end | ||||
| 			if fields.enable then meta:set_int("enabled", 1) end | ||||
| 			if fields.radius and string.find(fields.radius, "^[0-9]+$") and tonumber(fields.radius) < 256 then meta:set_int("radius", fields.radius) end | ||||
| 			if meta:get_int("enabled") ~= 0 then | ||||
| 				forceload_on(pos, meta) | ||||
| 			end | ||||
| 		end | ||||
| 		set_display(pos, meta) | ||||
| 	end, | ||||
| }) | ||||
| @@ -1,178 +0,0 @@ | ||||
|  | ||||
| -- 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({ | ||||
| 	label = "Machines: run coal alloy furnace", | ||||
| 	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, | ||||
| }) | ||||
|  | ||||
| @@ -1,5 +0,0 @@ | ||||
| local S = technic.getter | ||||
|  | ||||
| if minetest.registered_nodes["default:furnace"].description == "Furnace" then | ||||
| 	minetest.override_item("default:furnace", { description = S("Fuel-Fired Furnace") }) | ||||
| end | ||||
| @@ -1,70 +1,4 @@ | ||||
|  | ||||
| local S = technic.getter | ||||
|  | ||||
| local function deploy_node(inv, slot_name, pos, node, machine_node) | ||||
| 	if node.param2 > 3 then return end | ||||
| 	if node.name ~= "air" then | ||||
| 		if node.name == "ignore" or | ||||
| 		   node.name == "default:lava_source" or | ||||
| 		   node.name == "default:lava_flowing" or | ||||
| 		   node.name == "default:water_source" or | ||||
| 		   node.name == "default:water_flowing" then | ||||
| 			return | ||||
| 		end | ||||
| 		local drops = minetest.get_node_drops(node.name, "") | ||||
| 		local remove_to = false | ||||
| 		for i, item in ipairs(drops) do | ||||
| 			if not inv:room_for_item(slot_name, item) then | ||||
| 				remove_to = i - 1 | ||||
| 				break | ||||
| 			end | ||||
| 			inv:add_item(slot_name, item) | ||||
| 		end | ||||
| 		if remove_to then | ||||
| 			for i = 1, remove_to do | ||||
| 				inv:remove_item(slot_name, drops[i]) | ||||
| 			end | ||||
| 		else | ||||
| 			minetest.remove_node(pos) | ||||
| 		end | ||||
| 		return | ||||
| 	end | ||||
| 	if not inv:is_empty(slot_name) then | ||||
| 		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', | ||||
| @@ -85,115 +19,326 @@ minetest.register_craft({ | ||||
|  | ||||
| }) | ||||
|  | ||||
| local function make_on(mark, length) | ||||
| 	return function(pos, node) | ||||
| mk1_on = function(pos, node) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	local inv = meta:get_inventory() | ||||
| 	local pos1={} | ||||
| 	pos1.x=pos.x | ||||
| 	pos1.y=pos.y | ||||
| 	pos1.z=pos.z | ||||
| 	if node.param2==3 then pos1.x=pos1.x+1 end | ||||
| 	if node.param2==2 then pos1.z=pos1.z+1 end | ||||
| 	if node.param2==1 then pos1.x=pos1.x-1 end | ||||
| 	if node.param2==0 then pos1.z=pos1.z-1 end | ||||
|  | ||||
| 	if node.name == "technic:constructor_mk1_off" then | ||||
| 		hacky_swap_node(pos,"technic:constructor_mk1_on") | ||||
| 		nodeupdate(pos) | ||||
| 		local node1=minetest.get_node(pos1) | ||||
| 		deploy_node (inv,"slot1",pos1,node1,node) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| mk1_off = function(pos, node) | ||||
| 	if node.name == "technic:constructor_mk1_on" then | ||||
| 		hacky_swap_node(pos,"technic:constructor_mk1_off") | ||||
| 		nodeupdate(pos) | ||||
| 	end | ||||
| end | ||||
|  | ||||
|  | ||||
| minetest.register_node("technic:constructor_mk1_off", { | ||||
| 	description = "Constructor MK1", | ||||
| 	tile_images = {"technic_constructor_mk1_top_off.png","technic_constructor_mk1_bottom_off.png","technic_constructor_mk1_side2_off.png","technic_constructor_mk1_side1_off.png", | ||||
| 			"technic_constructor_back.png","technic_constructor_front_off.png"}, | ||||
| 	is_ground_content = true, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2}, | ||||
| 	mesecons= {effector={action_on=mk1_on}}, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	meta:set_string("formspec", | ||||
| 				"invsize[8,9;]".. | ||||
| 				"label[0,0;Constructor MK1]".. | ||||
| 				"label[5,0;Slot 1]".. | ||||
| 				"list[current_name;slot1;6,0;1,1;]".. | ||||
| 				"list[current_player;main;0,5;8,4;]") | ||||
| 		meta:set_string("infotext", "Constructor MK1") | ||||
| 		local inv = meta:get_inventory() | ||||
| 		inv:set_size("slot1", 1) | ||||
| 	end, | ||||
|  | ||||
| 	can_dig = function(pos,player) | ||||
| 		local meta = minetest.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 | ||||
| 		return inv:is_empty("slot1") | ||||
| 	end,	 | ||||
| }) | ||||
|  | ||||
| 		local place_pos = vector.new(pos) | ||||
| minetest.register_node("technic:constructor_mk1_on", { | ||||
| 	description = "Constructor MK1", | ||||
| 	tile_images = {"technic_constructor_mk1_top_on.png","technic_constructor_mk1_bottom_on.png","technic_constructor_mk1_side2_on.png","technic_constructor_mk1_side1_on.png", | ||||
| 			"technic_constructor_back.png","technic_constructor_front_on.png"}, | ||||
| 	is_ground_content = true, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon = 2,not_in_creative_inventory=1}, | ||||
| 	mesecons= {effector={action_off=mk1_off}}, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| }) | ||||
|  | ||||
| 		if node.name == "technic:constructor_mk"..mark.."_off" then | ||||
| 			technic.swap_node(pos, "technic:constructor_mk"..mark.."_on") | ||||
| 			minetest.check_for_falling(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 | ||||
|  | ||||
| --Constructor MK2 | ||||
|  | ||||
| mk2_on = function(pos, node) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	local inv = meta:get_inventory() | ||||
| 	local pos1={} | ||||
| 	local pos2={} | ||||
| 	pos1.x=pos.x | ||||
| 	pos1.y=pos.y | ||||
| 	pos1.z=pos.z | ||||
| 	pos2.x=pos.x | ||||
| 	pos2.y=pos.y | ||||
| 	pos2.z=pos.z | ||||
| 	if node.param2==3 then pos1.x=pos1.x+1 pos2.x=pos2.x+2 end | ||||
| 	if node.param2==2 then pos1.z=pos1.z+1 pos2.z=pos2.z+2 end | ||||
| 	if node.param2==1 then pos1.x=pos1.x-1 pos2.x=pos2.x-2 end | ||||
| 	if node.param2==0 then pos1.z=pos1.z-1 pos2.z=pos2.z-2 end | ||||
|  | ||||
| 	if node.name == "technic:constructor_mk2_off" then | ||||
| 		hacky_swap_node(pos,"technic:constructor_mk2_on") | ||||
| 		nodeupdate(pos) | ||||
| 		local node1=minetest.get_node(pos1) | ||||
| 		deploy_node (inv,"slot1",pos1,node1,node) | ||||
| 		local node1=minetest.get_node(pos2)	 | ||||
| 		deploy_node (inv,"slot2",pos2,node1,node) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| 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") | ||||
| 			minetest.check_for_falling(pos) | ||||
| 		end | ||||
| mk2_off = function(pos, node) | ||||
| 	if node.name == "technic:constructor_mk2_on" then | ||||
| 		hacky_swap_node(pos,"technic:constructor_mk2_off") | ||||
| 		nodeupdate(pos) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local function allow_inventory_put(pos, listname, index, stack, player) | ||||
| 	if stack and minetest.get_item_group(stack:get_name(), "technic_constructor") == 1 then | ||||
| 		return 0 | ||||
| minetest.register_node("technic:constructor_mk2_off", { | ||||
| 	description = "Constructor MK2", | ||||
| 	tile_images = {"technic_constructor_mk2_top_off.png","technic_constructor_mk2_bottom_off.png","technic_constructor_mk2_side2_off.png","technic_constructor_mk2_side1_off.png", | ||||
| 			"technic_constructor_back.png","technic_constructor_front_off.png"}, | ||||
| 	is_ground_content = true, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2}, | ||||
| 	mesecons= {effector={action_on=mk2_on}}, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	meta:set_string("formspec", | ||||
| 				"invsize[8,9;]".. | ||||
| 				"label[0,0;Constructor MK2]".. | ||||
| 				"label[5,0;Slot 1]".. | ||||
| 				"list[current_name;slot1;6,0;1,1;]".. | ||||
| 				"label[5,1;Slot 2]".. | ||||
| 				"list[current_name;slot2;6,1;1,1;]".. | ||||
| 				"list[current_player;main;0,5;8,4;]") | ||||
| 		meta:set_string("infotext", "Constructor MK2") | ||||
| 		local inv = meta:get_inventory() | ||||
| 		inv:set_size("slot1", 1) | ||||
| 		inv:set_size("slot2", 1) | ||||
| 	end, | ||||
|  | ||||
| 	can_dig = function(pos,player) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		local inv = meta:get_inventory() | ||||
| 		if inv:is_empty("slot1")==false or inv:is_empty("slot2")==false then return false end | ||||
| 		return true | ||||
| 	end,	 | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:constructor_mk2_on", { | ||||
| 	description = "Constructor MK2", | ||||
| 	tile_images = {"technic_constructor_mk2_top_on.png","technic_constructor_mk2_bottom_on.png","technic_constructor_mk2_side2_on.png","technic_constructor_mk2_side1_on.png", | ||||
| 			"technic_constructor_back.png","technic_constructor_front_on.png"}, | ||||
| 	is_ground_content = true, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2, not_in_creative_inventory=1}, | ||||
| 	mesecons= {effector={action_off=mk2_off}}, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| }) | ||||
|  | ||||
|  | ||||
| -- Constructor MK3 | ||||
| mk3_on = function(pos, node) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	local inv = meta:get_inventory() | ||||
| 	 | ||||
| 	local pos1={} | ||||
| 	local pos2={} | ||||
| 	local pos3={} | ||||
| 	local pos4={} | ||||
| 	 | ||||
| 	pos1.x=pos.x | ||||
| 	pos1.y=pos.y | ||||
| 	pos1.z=pos.z | ||||
| 	 | ||||
| 	pos2.x=pos.x | ||||
| 	pos2.y=pos.y | ||||
| 	pos2.z=pos.z | ||||
| 	 | ||||
| 	pos3.x=pos.x | ||||
| 	pos3.y=pos.y | ||||
| 	pos3.z=pos.z | ||||
|  | ||||
| 	pos4.x=pos.x | ||||
| 	pos4.y=pos.y | ||||
| 	pos4.z=pos.z | ||||
|  | ||||
| 	if node.param2==3 then pos1.x=pos1.x+1 pos2.x=pos2.x+2 pos3.x=pos3.x+3 pos4.x=pos4.x+4 end | ||||
| 	if node.param2==2 then pos1.z=pos1.z+1 pos2.z=pos2.z+2 pos3.z=pos3.z+3 pos4.z=pos4.z+4 end | ||||
| 	if node.param2==1 then pos1.x=pos1.x-1 pos2.x=pos2.x-2 pos3.x=pos3.x-3 pos4.x=pos4.x-4 end | ||||
| 	if node.param2==0 then pos1.z=pos1.z-1 pos2.z=pos2.z-2 pos3.z=pos3.z-3 pos4.z=pos4.z-4 end | ||||
|  | ||||
| 	if node.name == "technic:constructor_mk3_off" then | ||||
| 		hacky_swap_node(pos,"technic:constructor_mk3_on") | ||||
| 		nodeupdate(pos) | ||||
| 		local node1=minetest.get_node(pos1) | ||||
| 		deploy_node (inv,"slot1",pos1,node1,node) | ||||
| 		local node1=minetest.get_node(pos2)	 | ||||
| 		deploy_node (inv,"slot2",pos2,node1,node) | ||||
| 		local node1=minetest.get_node(pos3)	 | ||||
| 		deploy_node (inv,"slot3",pos3,node1,node) | ||||
| 		local node1=minetest.get_node(pos4)	 | ||||
| 		deploy_node (inv,"slot4",pos4,node1,node) | ||||
| 	end | ||||
| 	return technic.machine_inventory_put(pos, listname, index, stack, player) | ||||
| 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, technic_constructor = 1}, | ||||
| 		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 | ||||
| mk3_off = function(pos, node) | ||||
| 	if node.name == "technic:constructor_mk3_on" then | ||||
| 		hacky_swap_node(pos,"technic:constructor_mk3_off") | ||||
| 		nodeupdate(pos) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| minetest.register_node("technic:constructor_mk3_off", { | ||||
| 	description = "Constructor MK3", | ||||
| 	tile_images = {"technic_constructor_mk3_top_off.png","technic_constructor_mk3_bottom_off.png","technic_constructor_mk3_side2_off.png","technic_constructor_mk3_side1_off.png", | ||||
| 			"technic_constructor_back.png","technic_constructor_front_off.png"}, | ||||
| 	is_ground_content = true, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2}, | ||||
| 	mesecons= {effector={action_on=mk3_on}}, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	meta:set_string("formspec", | ||||
| 				"invsize[8,9;]".. | ||||
| 				"label[0,0;Constructor MK2]".. | ||||
| 				"label[5,0;Slot 1]".. | ||||
| 				"list[current_name;slot1;6,0;1,1;]".. | ||||
| 				"label[5,1;Slot 2]".. | ||||
| 				"list[current_name;slot2;6,1;1,1;]".. | ||||
| 				"label[5,2;Slot 3]".. | ||||
| 				"list[current_name;slot3;6,2;1,1;]".. | ||||
| 				"label[5,3;Slot 4]".. | ||||
| 				"list[current_name;slot4;6,3;1,1;]".. | ||||
| 				"list[current_player;main;0,5;8,4;]") | ||||
| 		meta:set_string("infotext", "Constructor MK3") | ||||
| 		local inv = meta:get_inventory() | ||||
| 		inv:set_size("slot1", 1) | ||||
| 		inv:set_size("slot2", 1) | ||||
| 		inv:set_size("slot3", 1) | ||||
| 		inv:set_size("slot4", 1) | ||||
|  | ||||
| 	end, | ||||
|  | ||||
| 	can_dig = function(pos,player) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		local inv = meta:get_inventory() | ||||
| 		if inv:is_empty("slot1")==false or inv:is_empty("slot2")==false or inv:is_empty("slot3")==false or inv:is_empty("slot4")==false then return false end | ||||
| 		return true | ||||
| 	end,	 | ||||
| }) | ||||
|  | ||||
| minetest.register_node("technic:constructor_mk3_on", { | ||||
| 	description = "Constructor MK3", | ||||
| 	tile_images = {"technic_constructor_mk3_top_on.png","technic_constructor_mk3_bottom_on.png","technic_constructor_mk3_side2_on.png","technic_constructor_mk3_side1_on.png", | ||||
| 			"technic_constructor_back.png","technic_constructor_front_on.png"}, | ||||
| 	is_ground_content = true, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,not_in_creative_inventory=1}, | ||||
| 	mesecons= {effector={action_off=mk3_off}}, | ||||
| 	sounds = default.node_sound_stone_defaults(), | ||||
| }) | ||||
|  | ||||
|  | ||||
| deploy_node =function (inv, slot_name, pos1, node1, node) | ||||
| 	if node1.name == "air" then  | ||||
| 		if not inv:is_empty(slot_name) then | ||||
| 			stack1=inv:get_list(slot_name) | ||||
| 			local def = stack1[1]:get_definition() | ||||
| 			if def.type == "node" then | ||||
| 				node_to_be_placed={name=stack1[1]:get_name(), param1=0, param2=node.param2} | ||||
| 				minetest.set_node(pos1,node_to_be_placed) | ||||
| 				stack1[1]:take_item() | ||||
| 				inv:set_stack(slot_name, 1, stack1[1]) | ||||
| 			elseif def.type == "craft" then | ||||
| 				if def.on_place then | ||||
| 					-- print("deploy_node: item has on_place. trying...") | ||||
| 					local ok, stk = pcall(def.on_place, stack1[1], nil, { | ||||
| 						-- Fake pointed_thing | ||||
| 						type = "node", | ||||
| 						above = pos1, | ||||
| 						under = { x=pos1.x, y=pos1.y-1, z=pos1.z }, | ||||
| 					}) | ||||
| 					if ok then | ||||
| 						-- print("deploy_node: on_place succeeded!") | ||||
| 						inv:set_stack(slot_name, 1, stk or stack1[1]) | ||||
| 						return | ||||
| 					-- else | ||||
| 						-- print("deploy_node: WARNING: error while running on_place: "..tostring(stk)) | ||||
| 					end | ||||
| 				end | ||||
| 				minetest.item_place_object(stack1[1], nil, { | ||||
| 					-- Fake pointed_thing | ||||
| 					type = "node", | ||||
| 					above = pos1, | ||||
| 					under = pos1, | ||||
| 				}) | ||||
| 				inv:set_stack(slot_name, 1, nil) | ||||
| 			end | ||||
| 			return true | ||||
| 		end, | ||||
| 		allow_metadata_inventory_put = allow_inventory_put, | ||||
| 		allow_metadata_inventory_take = technic.machine_inventory_take, | ||||
| 		allow_metadata_inventory_move = technic.machine_inventory_move, | ||||
| 		on_rotate = screwdriver.rotate_simple | ||||
| 	}) | ||||
| 		end | ||||
| 		return  | ||||
| 	end | ||||
| 	if node1.name == "ignore" or | ||||
| 	   node1.name == "default:lava_source" or | ||||
| 	   node1.name == "default:lava_flowing" or | ||||
| 	   node1.name == "default:water_source" or | ||||
| 	   node1.name == "default:water_flowing"  | ||||
| 	   then return end | ||||
| 	if inv:room_for_item(slot_name,node1) then | ||||
| 		local def = minetest.registered_nodes[node1.name] | ||||
| 		if not def then return end | ||||
| 		local drop = def.drop or node1.name | ||||
| 		if type(drop) == "table" then | ||||
| 			local pr = PseudoRandom(math.random()) | ||||
| 			local c = 0 | ||||
| 			local loop = 0 -- Prevent infinite loop | ||||
| 			while (c < (drop.max_items or 1)) and (loop < 1000) do | ||||
| 				local i = math.floor(pr:next(1, #drop.items)) | ||||
| 				if pr:next(1, drop.items[i].rarity or 1) == 1 then | ||||
| 					for _,item in ipairs(drop.items[i].items) do | ||||
| 						inv:add_item(slot_name,item) | ||||
| 					end | ||||
| 					c = c + 1 | ||||
| 				end | ||||
| 				loop = loop + 1 | ||||
| 			end | ||||
| 			minetest.remove_node(pos1) | ||||
| 		elseif type(drop) == "string" then | ||||
| 			inv:add_item(slot_name,drop) | ||||
| 			minetest.remove_node(pos1) | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	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, technic_constructor=1}, | ||||
| 		mesecons= {effector = {action_off = make_off(mark)}}, | ||||
| 		sounds = default.node_sound_stone_defaults(), | ||||
| 		allow_metadata_inventory_put = allow_inventory_put, | ||||
| 		allow_metadata_inventory_take = technic.machine_inventory_take, | ||||
| 		allow_metadata_inventory_move = technic.machine_inventory_move, | ||||
| 		on_rotate = false | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| make_constructor(1, 1) | ||||
| make_constructor(2, 2) | ||||
| make_constructor(3, 4) | ||||
|  | ||||
|   | ||||