forked from minetest-mods/technic
don't run the damage ABM if damage is disabled on the server.
This commit is contained in:
parent
cf75916ea7
commit
b00e942824
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user