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