измерение дозы радиации

This commit is contained in:
Vitaliy Olkhin 2024-07-30 20:10:59 +05:00
parent 2ba4c9ade7
commit fb681818af
3 changed files with 113 additions and 20 deletions

View File

@ -123,7 +123,6 @@ surface_effect.technic_forcefield_radiation_protection = function(pos, player)
math.round(pos1.y) < range and math.round(pos1.y) > 0 - range and math.round(pos1.y) < range and math.round(pos1.y) > 0 - range and
math.round(pos1.z) < range and math.round(pos1.z) > 0 - range math.round(pos1.z) < range and math.round(pos1.z) > 0 - range
then then
--minetest.chat_send_all(dump((0 - range)))
surface_effect.radiaton_off(player) surface_effect.radiaton_off(player)
return true return true
end end
@ -193,10 +192,12 @@ su.rediationDomage = function (player, pos)
return return
end end
minetest.sound_play("surface_effect_radiaciya",{ if surface_effect.detectNuclides(player) == true then
gain = 1.0, minetest.sound_play("surface_effect_radiaciya",{
to_player = name, gain = 1.0,
}) to_player = name,
})
end
persistent_api.add_persistent_effect({ persistent_api.add_persistent_effect({
name = "damage_player", -- identifier name = "damage_player", -- identifier
@ -242,16 +243,88 @@ end
surface_effect.detectNuclides = function (player) surface_effect.detectNuclides = function (player)
local inv = player:get_inventory() local inv = player:get_inventory()
if inv:contains_item("main", "surface_effect:dosimeter") then if not inv:contains_item("main", "surface_effect:dosimeter") then
return true return false
end end
return false
--[[for i=1, inv:get_size("main") do for i=1, inv:get_size("main") do
local stack = inv:get_stack("main", i) local stack = inv:get_stack("main", i)
if stack:get_name() == "surface_effect:dosimeter" then if stack:get_name() == "surface_effect:dosimeter" then
use_battery(stack) local meta = stack:get_meta()
local charge = meta:get_int("technic:charge")
minetest.log("action", "Detect nuclides, power: " .. charge)
if charge > 0 then
return true
end
end
end
return false
end
local function battery_dosimeter(stack)
local meta = stack:get_meta()
local charge = meta:get_int("technic:charge")
minetest.log("action", "Dosimeter power: " .. charge)
if charge == -1 then return end
charge = charge - 1
if charge < 0 then
technic.set_RE_wear(stack, 0, 65535)
meta:set_int("technic:charge", -1)
return
end
if charge > 0 then
technic.set_RE_wear(stack, charge, 65535)
meta:set_int("technic:charge", charge)
return
end
return true
end
surface_effect.update_inventory = function (player)
local inv = player:get_inventory()
if not inv:contains_item("main", "surface_effect:dosimeter") then
return -- Skip checking every stack
end
for i=1, inv:get_size("main") do
local stack = inv:get_stack("main", i)
if stack:get_name() == "surface_effect:dosimeter" then
battery_dosimeter(stack)
inv:set_stack("main", i, stack) inv:set_stack("main", i, stack)
end end
end]] end
end end
surface_effect.technicDetectUranium = function(player)
local pos = player:get_pos()
local radius = 20
local protectors = minetest.find_nodes_in_area(
{x = pos.x - radius , y = pos.y - radius , z = pos.z - radius},
{x = pos.x + radius , y = pos.y + radius , z = pos.z + radius},
{"technic:uranium35_block"})
if #protectors > 0 then
local npos = protectors[1]
local meta = minetest.get_meta(npos)
local pos1 = vector.subtract(pos, npos)
if surface_effect.detectNuclides(player) then
minetest.log("action", "Radiation detect technic " .. surface_effect.dump(protectors[1]))
minetest.sound_play({name = "radiant_damage_geiger",
--gain = math.min(1, damage/10)
gain = 1.0
}, {
to_player=player:get_player_name()
})
end
end
end

View File

@ -13,16 +13,18 @@ minetest.register_globalstep(function(dtime)
if timer > os.time() then if timer > os.time() then
return return
end end
timer = os.time() + 10 timer = os.time() + 5
for k, player in ipairs(minetest.get_connected_players()) do for k, player in ipairs(minetest.get_connected_players()) do
surface_effect.mask(player)
local name = player:get_player_name() local name = player:get_player_name()
local object = minetest.env:get_player_by_name(name) local object = minetest.env:get_player_by_name(name)
surface_effect.setHud(player)
if object then if object then
surface_effect.setHud(player)
surface_effect.mask(player)
surface_effect.update_inventory(player)
surface_effect.technicDetectUranium(player)
local pos = object:get_pos() local pos = object:get_pos()
su.rediationDomage(player, pos) su.rediationDomage(player, pos)
--minetest.chat_send_all(dump(areas:getAreasAtPos(pos))) --minetest.chat_send_all(dump(areas:getAreasAtPos(pos)))
@ -33,7 +35,6 @@ end)
--Новый игрок --Новый игрок
minetest.register_on_newplayer(function(player) minetest.register_on_newplayer(function(player)
surface_effect.setHud(player) surface_effect.setHud(player)
surface_effect.showLogo(player) surface_effect.showLogo(player)
if minetest.get_modpath("hazmat_suit") then if minetest.get_modpath("hazmat_suit") then
@ -128,7 +129,7 @@ end
radiant_damage.register_radiant_damage("radioactive_earth", { radiant_damage.register_radiant_damage("radioactive_earth", {
interval = 1, interval = 1,
range = 3, range = 4,
--inverse_square_falloff = true, --inverse_square_falloff = true,
emitted_by = {["surface_effect:radioactive_earth"] = 0.5}, emitted_by = {["surface_effect:radioactive_earth"] = 0.5},
attenuated_by = {['air'] = 0.4, ['default:grass_1'] = 0.5}, attenuated_by = {['air'] = 0.4, ['default:grass_1'] = 0.5},
@ -136,6 +137,10 @@ radiant_damage.register_radiant_damage("radioactive_earth", {
on_damage = on_radiation_damage, on_damage = on_radiation_damage,
}) })
minetest.register_on_player_receive_fields(function(player, formname, fields) --[[minetest.register_on_player_receive_fields(function(player, formname, fields)
surface_effect.mask(player)
end)]]
minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info)
surface_effect.mask(player) surface_effect.mask(player)
end) end)

View File

@ -18,5 +18,20 @@ minetest.register_node("surface_effect:radioactive_earth", {
minetest.register_tool("surface_effect:dosimeter", { minetest.register_tool("surface_effect:dosimeter", {
description = S("Dosimeter"), description = S("Dosimeter"),
inventory_image = "surface_effect_dosimeter.png" inventory_image = "surface_effect_dosimeter.png",
wear_represents = "technic_RE_charge",
groups = {not_in_creative_inventory = 0},
})
if minetest.get_modpath("technic") then
technic.register_power_tool("surface_effect:dosimeter", 65535)
end
minetest.register_craft({
output = 'surface_effect:dosimeter',
recipe = {
{'basic_materials:plastic_sheet', 'technic:chromium_ingot', ''},
{'technic:control_logic_unit', 'basic_materials:ic', ''},
{'technic:battery', 'technic:battery', ''},
}
}) })