Maciej 'agaran' Pijanka
2017-03-15 10307f23a78b33af50dc4a5f3d1baafb4ee4b0d9
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