From 10307f23a78b33af50dc4a5f3d1baafb4ee4b0d9 Mon Sep 17 00:00:00 2001
From: Maciej 'agaran' Pijanka <agaran@pld-linux.org>
Date: Thu, 16 Mar 2017 00:00:22 +0100
Subject: [PATCH] Do not run converters twice.

---
 technic/radiation.lua |   65 ++++++++++++++++++++------------
 1 files changed, 41 insertions(+), 24 deletions(-)

diff --git a/technic/radiation.lua b/technic/radiation.lua
index 6ce8ecd..13936f9 100644
--- a/technic/radiation.lua
+++ b/technic/radiation.lua
@@ -242,6 +242,10 @@
 local rad_dmg_cutoff = 0.2
 local radiated_players = {}
 
+local armor_enabled = technic.config:get_bool("enable_radiation_protection")
+local entity_damage = technic.config:get_bool("enable_entity_radiation_damage")
+local longterm_damage = technic.config:get_bool("enable_longterm_radiation_damage")
+
 local function apply_fractional_damage(o, dmg)
 	local dmg_int = math.floor(dmg)
 	-- The closer you are to getting one more damage point,
@@ -279,6 +283,9 @@
 	if not ag then
 		return 0
 	end
+	if ag.immortal then
+		return 0
+	end
 	if ag.radiation then
 		return 0.01 * ag.radiation
 	end
@@ -297,17 +304,23 @@
 
 local function dmg_object(pos, object, strength)
 	local obj_pos = vector.add(object:getpos(), calculate_object_center(object))
+	local mul
+	if armor_enabled or entity_damage then
+		-- we need to check may the object be damaged even if armor is disabled
+		mul = calculate_damage_multiplier(object)
+		if mul == 0 then
+			return
+		end
+	end
 	local dmg = calculate_base_damage(pos, obj_pos, strength)
 	if not dmg then
 		return
 	end
-	local mul = calculate_damage_multiplier(object)
-	if mul == 0 then
-		return
+	if armor_enabled then
+		dmg = dmg * mul
 	end
-	dmg = dmg * mul
 	apply_fractional_damage(object, dmg)
-	if object:is_player() then
+	if longterm_damage and object:is_player() then
 		local pn = object:get_player_name()
 		radiated_players[pn] = (radiated_players[pn] or 0) + dmg
 	end
@@ -319,7 +332,9 @@
 	local max_dist = strength * rad_dmg_mult_sqrt
 	for _, o in pairs(minetest.get_objects_inside_radius(pos,
 			max_dist + abdomen_offset)) do
-		dmg_object(pos, o, strength)
+		if entity_damage or o:is_player() then
+			dmg_object(pos, o, strength)
+		end
 	end
 end
 
@@ -331,26 +346,28 @@
 		action = dmg_abm,
 	})
 
-	minetest.register_globalstep(function(dtime)
-		for pn, dmg in pairs(radiated_players) do
-			dmg = dmg - (dtime / 8)
-			local player = minetest.get_player_by_name(pn)
-			local killed
-			if player and dmg > rad_dmg_cutoff then
-				killed = apply_fractional_damage(player, (dmg * dtime) / 8)
-			else
-				dmg = nil
+	if longterm_damage then
+		minetest.register_globalstep(function(dtime)
+			for pn, dmg in pairs(radiated_players) do
+				dmg = dmg - (dtime / 8)
+				local player = minetest.get_player_by_name(pn)
+				local killed
+				if player and dmg > rad_dmg_cutoff then
+					killed = apply_fractional_damage(player, (dmg * dtime) / 8)
+				else
+					dmg = nil
+				end
+				-- on_dieplayer will have already set this if the player died
+				if not killed then
+					radiated_players[pn] = dmg
+				end
 			end
-			-- on_dieplayer will have already set this if the player died
-			if not killed then
-				radiated_players[pn] = dmg
-			end
-		end
-	end)
+		end)
 
-	minetest.register_on_dieplayer(function(player)
-		radiated_players[player:get_player_name()] = nil
-	end)
+		minetest.register_on_dieplayer(function(player)
+			radiated_players[player:get_player_name()] = nil
+		end)
+	end
 end
 
 -- Radioactive materials that can result from destroying a reactor

--
Gitblit v1.8.0