From 187015e0733e5e0bfa5efba215319c7d9d86f072 Mon Sep 17 00:00:00 2001
From: ShadowNinja <noreply@gmail.com>
Date: Sat, 13 Jul 2013 01:23:29 +0200
Subject: [PATCH] Fix coding style of nuclear reactor

---
 technic/machines/hv/forcefield.lua |  259 ++++++++++++++++++++++++++-------------------------
 1 files changed, 131 insertions(+), 128 deletions(-)

diff --git a/technic/machines/hv/forcefield.lua b/technic/machines/hv/forcefield.lua
index 8ad5410..e693d80 100644
--- a/technic/machines/hv/forcefield.lua
+++ b/technic/machines/hv/forcefield.lua
@@ -5,8 +5,8 @@
 -- Forcefield Generator is a HV machine.
 
 -- How expensive is the generator? Leaves room for upgrades lowering the power drain?
-local forcefield_power_drain     = 10 -- default 10
-local forcefield_update_interval = 1
+local forcefield_power_drain     = 10
+local forcefield_step_interval = 1
 
 minetest.register_craft({
 	output = 'technic:forcefield_emitter_off',
@@ -17,143 +17,138 @@
 	}
 })
 
+
 -- Idea: Let forcefields have different colors by upgrade slot.
 -- Idea: Let forcefields add up by detecting if one hits another.
 --    ___   __
 --   /   \/   \
 --  |          |
 --   \___/\___/
---
-local function add_forcefield(pos, range)
-	for x=-range,range do
-	for y=-range,range do
-	for z=-range,range do
-		if ((x*x+y*y+z*z) <= (range * range + range)) then
-			if ((range-1) * (range-1) + (range-1) <= x*x+y*y+z*z) then
-				local np={x=pos.x+x,y=pos.y+y,z=pos.z+z}
-				local n = minetest.env:get_node(np).name
-				if (n == "air") then
-					minetest.env:add_node(np, {name = "technic:forcefield"})
-				end
-			end
-		end
-	end
-	end
-	end
-	return true
-end
 
-local function remove_forcefield(p, range)
-	for x=-range,range do
-	for y=-range,range do
-	for z=-range,range do
-		if ((x*x+y*y+z*z) <= (range * range + range)) then
-			if ((range-1) * (range-1) + (range-1) <= x*x+y*y+z*z) then
-				local np={x=p.x+x,y=p.y+y,z=p.z+z}
-				local n = minetest.env:get_node(np).name
-				if (n == "technic:forcefield") then
-					minetest.env:remove_node(np)
-				end
+local function update_forcefield(pos, range, active)
+	local vm = VoxelManip()
+	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_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
+		if x*x+y*y+z*z <= range     *  range    +  range    and
+		   x*x+y*y+z*z >= (range-1) * (range-1) + (range-1) and
+		   ((active and data[vi] == c_air) or ((not active) and data[vi] == c_field)) then
+		   	if active then
+				data[vi] = c_field
+			else
+				data[vi] = c_air
 			end
 		end
+		vi = vi + 1
 	end
 	end
 	end
+
+	vm:set_data(data)
+	vm:update_liquids()
+	vm:write_to_map()
+	vm:update_map()
 end
 
 local get_forcefield_formspec = function(range)
-   --	return "invsize[8,9;]"..  (if upgrades added later - colors for instance)
 	return "invsize[3,4;]"..
-	"label[0,0;Forcefield emitter]"..
-	"label[1,1;Range]"..
-	"label[1,2;"..range.."]"..
-	"button[0,2;1,1;subtract;-]"..
-	"button[2,2;1,1;add;+]"..
-	"button[0,3;3,1;toggle;Enable/Disable]" -- ..
---	"list[current_player;main;0,5;8,4;]"
+		"label[0,0;Forcefield emitter]"..
+		"label[1,1;Range]"..
+		"label[1,2;"..range.."]"..
+		"button[0,2;1,1;subtract;-]"..
+		"button[2,2;1,1;add;+]"..
+		"button[0,3;3,1;toggle;Enable/Disable]"
 end
 
 local forcefield_receive_fields = function(pos, formname, fields, sender)
-				     local meta = minetest.env:get_meta(pos)
-				     local range = meta:get_int("range")
-				     if fields.add then range = range + 1 end
-				     if fields.subtract then range = range - 1 end
-				     if fields.toggle then
-					if meta:get_int("enabled") == 1 then
-					   meta:set_int("enabled", 0)
-					else
-					   meta:set_int("enabled", 1)
-					end
-				     end
-				     -- Smallest field is 5. Anything less is asking for trouble.
-				     -- Largest is 20. It is a matter of pratical node handling.
-				     if range < 5  then range = 5 end
-				     if range > 20 then range = 20 end
+	local meta = minetest.env:get_meta(pos)
+	local range = meta:get_int("range")
 
-				     if range <= 20 and range >= 5 and meta:get_int("range") ~= range then
-					remove_forcefield(pos, meta:get_int("range"))
-					meta:set_int("range", range)
-					meta:set_string("formspec", get_forcefield_formspec(range))
-				     end
-				  end
-
-local forcefield_check = function(pos)
-			    local meta = minetest.env:get_meta(pos)
-			    local node = minetest.env:get_node(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")
-			    
-			    -- Power off automatically if no longer connected to a switching station
-			    technic.switching_station_timeout_count(pos, "HV")
-
-			    local power_requirement
-			    if enabled == 1 then
-			       power_requirement = math.floor(4*math.pi*math.pow(meta:get_int("range"), 2)) * forcefield_power_drain
-			    else
-			       power_requirement = eu_demand
-			    end
-
-			    if eu_input == 0 then
-			       meta:set_string("infotext", "Forcefield Generator Unpowered")
-			       meta:set_int("HV_EU_demand", 100)
-			       meta:set_int("enabled", 0)
-			       if node.name == "technic:forcefield_emitter_on" then
-				  remove_forcefield(pos, meta:get_int("range"))
-				  hacky_swap_node(pos, "technic:forcefield_emitter_off")
-			       end
-			    elseif eu_input == power_requirement then
-			       if meta:get_int("enabled") == 1 then
-				  if node.name == "technic:forcefield_emitter_off" then
-				     hacky_swap_node(pos, "technic:forcefield_emitter_on")
-				     meta:set_string("infotext", "Forcefield Generator Active")
-				     add_forcefield(pos, meta:get_int("range"))
-				  else
-				     -- Range updated. Move the forcefield.
-				     add_forcefield(pos, meta:get_int("range"))
-				  end
-			       else
-				  if node.name == "technic:forcefield_emitter_on" then
-				     remove_forcefield(pos, meta:get_int("range"))
-				     hacky_swap_node(pos, "technic:forcefield_emitter_off")
-				     meta:set_int("HV_EU_demand", 100)
-				     meta:set_string("infotext", "Forcefield Generator Idle")
-				  end
-			       end
-			    else
-			       meta:set_int("HV_EU_demand", power_requirement)
-			    end
-			    return true
-			 end
-
-local mesecons = {effector = {
-	action_on = function(pos, node)
-		minetest.env:get_meta(pos):set_int("enabled", 0)
-	end,
-	action_off = function(pos, node)
-		minetest.env:get_meta(pos):set_int("enabled", 1)
+	if fields.add then range = range + 1 end
+	if fields.subtract then range = range - 1 end
+	if fields.toggle then
+		if meta:get_int("enabled") == 1 then
+		   meta:set_int("enabled", 0)
+		else
+		   meta:set_int("enabled", 1)
+		end
 	end
-}}
+
+	-- Smallest field is 5. Anything less is asking for trouble.
+	-- Largest is 20. It is a matter of pratical node handling.
+	if range < 5  then range = 5 end
+	if range > 20 then range = 20 end
+
+	if range <= 20 and range >= 5 and 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
+end
+
+local function forcefield_step(pos)
+	local meta = minetest.env:get_meta(pos)
+	local node = minetest.env:get_node(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")
+
+	-- Power off automatically if no longer connected to a switching station
+	technic.switching_station_timeout_count(pos, "HV")
+
+	local power_requirement = 0
+	if enabled == 1 then
+		power_requirement = math.floor(
+				4 * math.pi * math.pow(meta:get_int("range"), 2)
+			) * forcefield_power_drain
+	else
+		power_requirement = eu_demand
+	end
+
+	if meta:get_int("enabled") == 0 then
+		if node.name == "technic:forcefield_emitter_on" then
+			update_forcefield(pos, meta:get_int("range"), false)
+			hacky_swap_node(pos, "technic:forcefield_emitter_off")
+			meta:set_int("HV_EU_demand", 100)
+			meta:set_string("infotext", "Forcefield Generator Disabled")
+		end
+	elseif eu_input < power_requirement then
+		meta:set_string("infotext", "Forcefield Generator Unpowered")
+		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", "Forcefield Generator Active")
+		end
+		update_forcefield(pos, meta:get_int("range"), true)
+	end
+	meta:set_int("HV_EU_demand", power_requirement)
+	return true
+end
+
+local mesecons = {
+	effector = {
+		action_on = function(pos, node)
+			minetest.env:get_meta(pos):set_int("enabled", 0)
+		end,
+		action_off = function(pos, node)
+			minetest.env:get_meta(pos):set_int("enabled", 1)
+		end
+	}
+}
 
 minetest.register_node("technic:forcefield_emitter_off", {
 	description = "Forcefield emitter",
@@ -161,10 +156,10 @@
 	tiles = {"technic_forcefield_emitter_off.png"},
 	is_ground_content = true,
 	groups = {cracky = 1},
-	on_timer = forcefield_check,
+	on_timer = forcefield_step,
 	on_receive_fields = forcefield_receive_fields,
 	on_construct = function(pos)
-		minetest.env:get_node_timer(pos):start(forcefield_update_interval)
+		minetest.env:get_node_timer(pos):start(forcefield_step_interval)
 		local meta = minetest.env:get_meta(pos)
 		meta:set_float("technic_hv_power_machine", 1)
 		meta:set_int("HV_EU_input", 0)
@@ -183,10 +178,10 @@
 	is_ground_content = true,
 	groups = {cracky = 1, not_in_creative_inventory=1},
 	drop='"technic:forcefield_emitter_off" 1',
-	on_timer = forcefield_check,
+	on_timer = forcefield_step,
 	on_receive_fields = forcefield_receive_fields,
 	on_construct = function(pos) 
-		minetest.env:get_node_timer(pos):start(forcefield_update_interval)
+		minetest.env:get_node_timer(pos):start(forcefield_step_interval)
 		local meta = minetest.env:get_meta(pos)
 --		meta:set_float("technic_hv_power_machine", 1)
 --		meta:set_float("HV_EU_input", 0)
@@ -196,8 +191,8 @@
 		meta:set_string("formspec", get_forcefield_formspec(meta:get_int("range")))
 --		meta:set_string("infotext", "Forcefield emitter");
 	end,
-	on_dig = function(pos, node, digger)	
-		remove_forcefield(pos, minetest.env:get_meta(pos):get_int("range"))
+	on_dig = function(pos, node, digger)
+		update_forcefield(pos, minetest.env:get_meta(pos):get_int("range"), false)
 		return minetest.node_dig(pos, node, digger)
 	end,
 	mesecons = mesecons
@@ -208,9 +203,17 @@
 	sunlight_propagates = true,
 	drop = '',
         light_source = 8,
-	tiles = {{name="technic_forcefield_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}},
+	tiles = {{
+		name = "technic_forcefield_animated.png",
+		animation = {
+			type = "vertical_frames",
+			aspect_w=16,
+			aspect_h=16,
+			length=2.0,
+		},
+	}},
 	is_ground_content = true,
-	groups = {not_in_creative_inventory=1, unbreakable=1},
+	groups = { not_in_creative_inventory=1, unbreakable=1 },
 	paramtype = "light",
 	drawtype = "nodebox",
 	node_box = {  --hacky way to get the field blue and not see through the ground
@@ -221,5 +224,5 @@
 	},
 })
 
-technic.register_HV_machine("technic:forcefield_emitter_on","RE")
-technic.register_HV_machine("technic:forcefield_emitter_off","RE")
+technic.register_HV_machine("technic:forcefield_emitter_on", "RE")
+technic.register_HV_machine("technic:forcefield_emitter_off", "RE")

--
Gitblit v1.8.0