don't run the damage ABM if damage is disabled on the server.

This commit is contained in:
Vanessa Ezekowitz 2015-03-15 18:15:43 -04:00
parent cf75916ea7
commit b00e942824
1 changed files with 41 additions and 36 deletions

View File

@ -569,47 +569,52 @@ end
local assumed_abdomen_offset = vector.new(0, 1, 0) local assumed_abdomen_offset = vector.new(0, 1, 0)
local assumed_abdomen_offset_length = vector.length(assumed_abdomen_offset) local assumed_abdomen_offset_length = vector.length(assumed_abdomen_offset)
local cache_scaled_shielding = {} local cache_scaled_shielding = {}
minetest.register_abm({
nodenames = {"group:radioactive"}, local damage_enabled = minetest.setting_getbool("enable_damage")
interval = 1,
chance = 1, if damage_enabled then
action = function (pos, node) minetest.register_abm({
local strength = minetest.registered_nodes[node.name].groups.radioactive nodenames = {"group:radioactive"},
for _, o in ipairs(minetest.get_objects_inside_radius(pos, strength*0.001 + assumed_abdomen_offset_length)) do interval = 1,
if o:is_player() then chance = 1,
local rel = vector.subtract(vector.add(o:getpos(), assumed_abdomen_offset), pos) action = function (pos, node)
local dist_sq = vector.length_square(rel) local strength = minetest.registered_nodes[node.name].groups.radioactive
local dist = math.sqrt(dist_sq) for _, o in ipairs(minetest.get_objects_inside_radius(pos, strength*0.001 + assumed_abdomen_offset_length)) do
local dirstep = dist == 0 and vector.new(0,0,0) or vector.divide(rel, dist*4) if o:is_player() then
local intpos = pos local rel = vector.subtract(vector.add(o:getpos(), assumed_abdomen_offset), pos)
local shielding = 0 local dist_sq = vector.length_square(rel)
for intdist = 0.25, dist, 0.25 do local dist = math.sqrt(dist_sq)
intpos = vector.add(intpos, dirstep) local dirstep = dist == 0 and vector.new(0,0,0) or vector.divide(rel, dist*4)
local intnodepos = vector.round(intpos) local intpos = pos
if not vector.equals(intnodepos, pos) then local shielding = 0
local sname = minetest.get_node(intnodepos).name for intdist = 0.25, dist, 0.25 do
local sval = cache_scaled_shielding[sname] intpos = vector.add(intpos, dirstep)
if not sval then local intnodepos = vector.round(intpos)
sval = math.sqrt(node_radiation_resistance(sname)) * -0.025 if not vector.equals(intnodepos, pos) then
cache_scaled_shielding[sname] = sval local sname = minetest.get_node(intnodepos).name
local sval = cache_scaled_shielding[sname]
if not sval then
sval = math.sqrt(node_radiation_resistance(sname)) * -0.025
cache_scaled_shielding[sname] = sval
end
shielding = shielding + sval
end end
shielding = shielding + sval
end end
end local dmg_rate = 0.25e-6 * strength*strength * math.exp(shielding) / math.max(0.75, dist_sq)
local dmg_rate = 0.25e-6 * strength*strength * math.exp(shielding) / math.max(0.75, dist_sq) if dmg_rate >= 0.25 then
if dmg_rate >= 0.25 then local dmg_int = math.floor(dmg_rate)
local dmg_int = math.floor(dmg_rate) if math.random() < dmg_rate-dmg_int then
if math.random() < dmg_rate-dmg_int then dmg_int = dmg_int + 1
dmg_int = dmg_int + 1 end
end if dmg_int > 0 then
if dmg_int > 0 then o:set_hp(math.max(o:get_hp() - dmg_int, 0))
o:set_hp(math.max(o:get_hp() - dmg_int, 0)) end
end end
end end
end end
end end,
end, })
}) end
-- radioactive materials that can result from destroying a reactor -- radioactive materials that can result from destroying a reactor