--
-- The nuclear reactor core needs water and a protective shield to work.
-- This is checked now and then and if the machine is tampered with... BOOM!
-local burn_ticks = 1 -- [minutes]. How many minutes does the power plant burn per serving?
+local burn_ticks = 24*60 -- [minutes]. How many minutes does the power plant burn per serving?
local power_supply = 10000 -- [HV] EUs
local fuel_type = "technic:enriched_uranium" -- This reactor burns this stuff
-- FIXME: recipe must make more sense like a rod recepticle, steam chamber, HV generator?
-minetest.register_craft({
- output = 'technic:hv_nuclear_reactor_core',
- recipe = {
- {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
- {'technic:stainless_steel_ingot', '', 'technic:stainless_steel_ingot'},
- {'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'},
- }
-})
+minetest.register_craft(
+ {output = 'technic:hv_nuclear_reactor_core',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
+ {'technic:stainless_steel_ingot', '', 'technic:stainless_steel_ingot'},
+ {'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'},
+ }
+ })
-minetest.register_craftitem("technic:hv_nuclear_reactor_core", {
- description = "Uranium Rod Driven HV Reactor",
- stack_max = 1,
-})
+minetest.register_craftitem(
+ "technic:hv_nuclear_reactor_core",
+ {description = "Uranium Rod Driven HV Reactor",
+ stack_max = 1,
+ })
local generator_formspec =
- "invsize[8,9;]"..
--- "image[0,0;5,5;technic_generator_menu.png]"..
- "label[0,0;Nuclear Reactor Rod Compartment]"..
- "list[current_name;src;2,1;3,2;]"..
- "list[current_player;main;0,5;8,4;]"
+ "invsize[8,9;]"..
+ -- "image[0,0;5,5;technic_generator_menu.png]"..
+ "label[0,0;Nuclear Reactor Rod Compartment]"..
+ "list[current_name;src;2,1;3,2;]"..
+ "list[current_player;main;0,5;8,4;]"
-- "Boxy sphere"
-local nodebox = {{ -0.353, -0.353, -0.353, 0.353, 0.353, 0.353 }, -- Box
- { -0.495, -0.064, -0.064, 0.495, 0.064, 0.064 }, -- Circle +-x
- { -0.483, -0.128, -0.128, 0.483, 0.128, 0.128 },
- { -0.462, -0.191, -0.191, 0.462, 0.191, 0.191 },
- { -0.433, -0.249, -0.249, 0.433, 0.249, 0.249 },
- { -0.397, -0.303, -0.303, 0.397, 0.303, 0.303 },
- { -0.305, -0.396, -0.305, 0.305, 0.396, 0.305 }, -- Circle +-y
- { -0.250, -0.432, -0.250, 0.250, 0.432, 0.250 },
- { -0.191, -0.461, -0.191, 0.191, 0.461, 0.191 },
- { -0.130, -0.482, -0.130, 0.130, 0.482, 0.130 },
- { -0.066, -0.495, -0.066, 0.066, 0.495, 0.066 },
- { -0.064, -0.064, -0.495, 0.064, 0.064, 0.495 }, -- Circle +-z
- { -0.128, -0.128, -0.483, 0.128, 0.128, 0.483 },
- { -0.191, -0.191, -0.462, 0.191, 0.191, 0.462 },
- { -0.249, -0.249, -0.433, 0.249, 0.249, 0.433 },
- { -0.303, -0.303, -0.397, 0.303, 0.303, 0.397 },
- }
+local nodebox = {
+ { -0.353, -0.353, -0.353, 0.353, 0.353, 0.353 }, -- Box
+ { -0.495, -0.064, -0.064, 0.495, 0.064, 0.064 }, -- Circle +-x
+ { -0.483, -0.128, -0.128, 0.483, 0.128, 0.128 },
+ { -0.462, -0.191, -0.191, 0.462, 0.191, 0.191 },
+ { -0.433, -0.249, -0.249, 0.433, 0.249, 0.249 },
+ { -0.397, -0.303, -0.303, 0.397, 0.303, 0.303 },
+ { -0.305, -0.396, -0.305, 0.305, 0.396, 0.305 }, -- Circle +-y
+ { -0.250, -0.432, -0.250, 0.250, 0.432, 0.250 },
+ { -0.191, -0.461, -0.191, 0.191, 0.461, 0.191 },
+ { -0.130, -0.482, -0.130, 0.130, 0.482, 0.130 },
+ { -0.066, -0.495, -0.066, 0.066, 0.495, 0.066 },
+ { -0.064, -0.064, -0.495, 0.064, 0.064, 0.495 }, -- Circle +-z
+ { -0.128, -0.128, -0.483, 0.128, 0.128, 0.483 },
+ { -0.191, -0.191, -0.462, 0.191, 0.191, 0.462 },
+ { -0.249, -0.249, -0.433, 0.249, 0.249, 0.433 },
+ { -0.303, -0.303, -0.397, 0.303, 0.303, 0.397 },
+}
minetest.register_node(
"technic:hv_nuclear_reactor_core",
- {
- description = "Nuclear Reactor",
- tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
- "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
--- paramtype2 = "facedir",
- groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
- legacy_facedir_simple = true,
- sounds = default.node_sound_wood_defaults(),
- drawtype="nodebox",
- paramtype = "light",
- node_box = {
- type = "fixed",
- fixed = nodebox
- },
- on_construct = function(pos)
- local meta = minetest.env:get_meta(pos)
- meta:set_string("infotext", "Nuclear Reactor Core")
- meta:set_float("technic_hv_power_machine", 1)
- meta:set_int("HV_EU_supply", 0)
- meta:set_int("HV_EU_from_fuel", 1) -- Signal to the switching station that this device burns some sort of fuel and needs special handling
- meta:set_int("burn_time", 0)
- meta:set_string("formspec", generator_formspec)
- local inv = meta:get_inventory()
- inv:set_size("src", 6)
- end,
- can_dig = function(pos,player)
- local meta = minetest.env:get_meta(pos);
- local inv = meta:get_inventory()
- if not inv:is_empty("src") then
- minetest.chat_send_player(player:get_player_name(), "Machine cannot be removed because it is not empty");
- return false
- else
- return true
- end
- end,
- })
+ {description = "Nuclear Reactor",
+ tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
+ "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
+ "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
+ -- paramtype2 = "facedir",
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ drawtype="nodebox",
+ paramtype = "light",
+ node_box = {
+ type = "fixed",
+ fixed = nodebox
+ },
+ on_construct = function(pos)
+ local meta = minetest.env:get_meta(pos)
+ meta:set_string("infotext", "Nuclear Reactor Core")
+ meta:set_float("technic_hv_power_machine", 1)
+ meta:set_int("HV_EU_supply", 0)
+ meta:set_int("HV_EU_from_fuel", 1) -- Signal to the switching station that this device burns some sort of fuel and needs special handling
+ meta:set_int("burn_time", 0)
+ meta:set_string("formspec", generator_formspec)
+ local inv = meta:get_inventory()
+ inv:set_size("src", 6)
+ end,
+ can_dig = function(pos,player)
+ local meta = minetest.env:get_meta(pos);
+ local inv = meta:get_inventory()
+ if not inv:is_empty("src") then
+ minetest.chat_send_player(player:get_player_name(), "Machine cannot be removed because it is not empty");
+ return false
+ else
+ return true
+ end
+ end,
+ })
minetest.register_node(
"technic:hv_nuclear_reactor_core_active",
- {
- description = "Coal Driven Generator",
- tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
- "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
--- paramtype2 = "facedir",
- groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
- legacy_facedir_simple = true,
- sounds = default.node_sound_wood_defaults(),
- drop="technic:generator",
- drawtype="nodebox",
- light_source = 15,
- paramtype = "light",
- node_box = {
- type = "fixed",
- fixed = nodebox
- },
- can_dig = function(pos,player)
- local meta = minetest.env:get_meta(pos);
- local inv = meta:get_inventory()
- if not inv:is_empty("src") then
- minetest.chat_send_player(player:get_player_name(), "Machine cannot be removed because it is not empty");
- return false
- else
- return true
- end
- end,
- })
+ {description = "Uranium Rod Driven HV Reactor",
+ tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
+ "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
+ -- paramtype2 = "facedir",
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ drop="technic:hv_nuclear_reactor_core",
+ drawtype="nodebox",
+ light_source = 15,
+ paramtype = "light",
+ node_box = {
+ type = "fixed",
+ fixed = nodebox
+ },
+ can_dig = function(pos,player)
+ local meta = minetest.env:get_meta(pos);
+ local inv = meta:get_inventory()
+ if not inv:is_empty("src") then
+ minetest.chat_send_player(player:get_player_name(), "Machine cannot be removed because it is not empty");
+ return false
+ else
+ return true
+ end
+ end,
+ })
local check_reactor_structure = function(pos)
-- The reactor consists of an 11x11x11 cube structure
-- C = Concrete, S = Stainless Steel, W = water node (not floating), #=reactor core, |=HV cable
-- The man-hole and the HV cable is only in the middle.
local water_nodes = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1},
- {x=pos.x+1, y=pos.y+1, z=pos.z+1}, "default:water_source")
+ {x=pos.x+1, y=pos.y+1, z=pos.z+1},
+ "default:water_source")
--print("Water ( 25):"..#water_nodes)
if #water_nodes ~= 25 then
--print("Water supply defect")
return 0
end
local inner_shield_nodes = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y-2, z=pos.z-2},
- {x=pos.x+2, y=pos.y+2, z=pos.z+2}, "technic:concrete")
+ {x=pos.x+2, y=pos.y+2, z=pos.z+2},
+ "technic:concrete")
--print("Concrete 1 ( 96):"..#inner_shield_nodes)
if #inner_shield_nodes ~= 96 then
return 0
end
local steel_shield_nodes = minetest.find_nodes_in_area({x=pos.x-3, y=pos.y-3, z=pos.z-3},
- {x=pos.x+3, y=pos.y+3, z=pos.z+3}, "default:steelblock")
+ {x=pos.x+3, y=pos.y+3, z=pos.z+3},
+ "default:steelblock")
--print("Steel ( 216):"..#steel_shield_nodes)
if #steel_shield_nodes ~= 216 then
return 0
end
local outer_shield_nodes = minetest.find_nodes_in_area({x=pos.x-5, y=pos.y-5, z=pos.z-5},
- {x=pos.x+5, y=pos.y+5, z=pos.z+5}, "technic:concrete")
+ {x=pos.x+5, y=pos.y+5, z=pos.z+5},
+ "technic:concrete")
--print("Concrete 2 (1080):"..#outer_shield_nodes)
if #outer_shield_nodes ~= (984+#inner_shield_nodes) then
--print("Outer shield defect")
end
minetest.register_abm(
- {
- nodenames = {"technic:hv_nuclear_reactor_core","technic:hv_nuclear_reactor_core_active"},
- interval = 1,
- chance = 1,
- action = function(pos, node, active_object_count, active_object_count_wider)
- local meta = minetest.env:get_meta(pos)
- local burn_time= meta:get_int("burn_time")
+ {nodenames = {"technic:hv_nuclear_reactor_core","technic:hv_nuclear_reactor_core_active"},
+ interval = 1,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ local meta = minetest.env:get_meta(pos)
+ local burn_time= meta:get_int("burn_time")
- -- If more to burn and the energy produced was used: produce some more
- if burn_time>0 then
- if meta:get_int("HV_EU_supply") == 0 then
- -- We did not use the power
- meta:set_int("HV_EU_supply", power_sypply)
- else
- burn_time = burn_time - 1
- meta:set_int("burn_time",burn_time)
- meta:set_string("infotext", "Nuclear Reactor Core ("..math.floor(burn_time/(burn_ticks*60)*100).."%)")
- end
- end
+ -- If more to burn and the energy produced was used: produce some more
+ if burn_time>0 then
+ if meta:get_int("HV_EU_supply") == 0 then
+ -- We did not use the power
+ meta:set_int("HV_EU_supply", power_sypply)
+ else
+ burn_time = burn_time - 1
+ meta:set_int("burn_time",burn_time)
+ meta:set_string("infotext", "Nuclear Reactor Core ("..math.floor(burn_time/(burn_ticks*60)*100).."%)")
+ end
+ end
- -- Burn another piece of coal
- if burn_time==0 then
- local inv = meta:get_inventory()
- local correct_fuel_count = 0
- if inv:is_empty("src") == false then
- local srclist= inv:get_list("src")
- for _, srcstack in pairs(srclist) do
- if srcstack then
- local src_item=srcstack:to_table()
- if src_item and src_item["name"] == fuel_type then
- correct_fuel_count = correct_fuel_count + 1
- end
- end
- end
- -- Check that the reactor is complete as well as the correct number of correct fuel
- if correct_fuel_count == 6 then
- if check_reactor_structure(pos) == 1 then
- burn_time=burn_ticks*60
- meta:set_int("burn_time",burn_time)
- hacky_swap_node (pos,"technic:hv_nuclear_reactor_core_active")
- meta:set_int("HV_EU_supply", power_supply)
- for idx, srcstack in pairs(srclist) do
- srcstack:take_item()
- inv:set_stack("src", idx, srcstack)
- end
- else
- -- BOOM!!! (the reactor was compromised and it should explode after some time) TNT mod inspired??
- explode_reactor(pos)
- end
- else
- meta:set_int("HV_EU_supply", 0)
- end
- end
- end
+ -- Burn another piece of coal
+ if burn_time==0 then
+ local inv = meta:get_inventory()
+ local correct_fuel_count = 0
+ if inv:is_empty("src") == false then
+ local srclist= inv:get_list("src")
+ for _, srcstack in pairs(srclist) do
+ if srcstack then
+ local src_item=srcstack:to_table()
+ if src_item and src_item["name"] == fuel_type then
+ correct_fuel_count = correct_fuel_count + 1
+ end
+ end
+ end
+ -- Check that the reactor is complete as well as the correct number of correct fuel
+ if correct_fuel_count == 6 then
+ if check_reactor_structure(pos) == 1 then
+ burn_time=burn_ticks*60
+ meta:set_int("burn_time",burn_time)
+ hacky_swap_node (pos,"technic:hv_nuclear_reactor_core_active")
+ meta:set_int("HV_EU_supply", power_supply)
+ for idx, srcstack in pairs(srclist) do
+ srcstack:take_item()
+ inv:set_stack("src", idx, srcstack)
+ end
+ else
+ -- BOOM!!! (the reactor was compromised and it should explode after some time) TNT mod inspired??
+ explode_reactor(pos)
+ end
+ else
+ meta:set_int("HV_EU_supply", 0)
+ end
+ end
+ end
- -- Nothing left to burn
- if burn_time==0 then
- meta:set_string("infotext", "Nuclear Reactor Core (idle)")
- hacky_swap_node (pos,"technic:hv_nuclear_reactor_core")
- end
- end
- })
+ -- Nothing left to burn
+ if burn_time==0 then
+ meta:set_string("infotext", "Nuclear Reactor Core (idle)")
+ hacky_swap_node (pos,"technic:hv_nuclear_reactor_core")
+ end
+ end
+ })
technic.register_HV_machine ("technic:hv_nuclear_reactor_core","PR")
technic.register_HV_machine ("technic:hv_nuclear_reactor_core_active","PR")
+++ /dev/null
--- original code comes from walkin_light mod by Echo http://minetest.net/forum/viewtopic.php?id=2621
-
-flashlight_max_charge=30000
-
- minetest.register_tool("technic:flashlight", {
- description = "Flashlight",
- inventory_image = "technic_flashlight.png",
- stack_max = 1,
- on_use = function(itemstack, user, pointed_thing)
- end,
- })
-
- minetest.register_craft({
- output = "technic:flashlight",
- recipe = {
- {"glass","glass","glass"},
- {"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"},
- {"","technic:battery",""}
- }
- })
-local players = {}
-local player_positions = {}
-local last_wielded = {}
-
-function round(num)
- return math.floor(num + 0.5)
-end
-
-minetest.register_on_joinplayer(function(player)
- local player_name = player:get_player_name()
- table.insert(players, player_name)
- last_wielded[player_name] = flashlight_weared(player)
- local pos = player:getpos()
- local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
- local wielded_item = player:get_wielded_item():get_name()
- if flashlight_weared(player)==true then
- -- Neuberechnung des Lichts erzwingen
- minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
- minetest.env:add_node(rounded_pos,{type="node",name="air"})
- end
- player_positions[player_name] = {}
- player_positions[player_name]["x"] = rounded_pos.x;
- player_positions[player_name]["y"] = rounded_pos.y;
- player_positions[player_name]["z"] = rounded_pos.z;
-end)
-
-minetest.register_on_leaveplayer(function(player)
- local player_name = player:get_player_name()
- for i,v in ipairs(players) do
- if v == player_name then
- table.remove(players, i)
- last_wielded[player_name] = nil
- -- Neuberechnung des Lichts erzwingen
- local pos = player:getpos()
- local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
- minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
- minetest.env:add_node(rounded_pos,{type="node",name="air"})
- player_positions[player_name]["x"] = nil
- player_positions[player_name]["y"] = nil
- player_positions[player_name]["z"] = nil
- player_positions[player_name]["m"] = nil
- player_positions[player_name] = nil
- end
- end
-end)
-
-minetest.register_globalstep(function(dtime)
- for i,player_name in ipairs(players) do
- local player = minetest.env:get_player_by_name(player_name)
- if flashlight_weared(player)==true then
- -- Fackel ist in der Hand
- local pos = player:getpos()
- local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
- if (last_wielded[player_name] ~= true) or (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then
- -- Fackel gerade in die Hand genommen oder zu neuem Node bewegt
- local is_air = minetest.env:get_node_or_nil(rounded_pos)
- if is_air == nil or (is_air ~= nil and (is_air.name == "air" or is_air.name == "technic:light")) then
- -- wenn an aktueller Position "air" ist, Fackellicht setzen
- minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
- end
- if (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then
- -- wenn Position geänder, dann altes Licht löschen
- local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
- -- Neuberechnung des Lichts erzwingen
- local is_light = minetest.env:get_node_or_nil(old_pos)
- if is_light ~= nil and is_light.name == "technic:light" then
- minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
- minetest.env:add_node(old_pos,{type="node",name="air"})
- end
- end
- -- gemerkte Position ist nun die gerundete neue Position
- player_positions[player_name]["x"] = rounded_pos.x
- player_positions[player_name]["y"] = rounded_pos.y
- player_positions[player_name]["z"] = rounded_pos.z
- end
-
- last_wielded[player_name] = true;
- elseif last_wielded[player_name] == true then
- -- Fackel nicht in der Hand, aber beim letzten Durchgang war die Fackel noch in der Hand
- local pos = player:getpos()
- local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
- repeat
- local is_light = minetest.env:get_node_or_nil(rounded_pos)
- if is_light ~= nil and is_light.name == "technic:light" then
- -- minetest.env:remove_node(rounded_pos)
- -- Erzwinge Neuberechnung des Lichts
- minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
- minetest.env:add_node(rounded_pos,{type="node",name="air"})
- end
- until minetest.env:get_node_or_nil(rounded_pos) ~= "technic:light"
- local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
- repeat
- is_light = minetest.env:get_node_or_nil(old_pos)
- if is_light ~= nil and is_light.name == "technic:light" then
- -- minetest.env:remove_node(old_pos)
- -- Erzwinge Neuberechnung des Lichts
- minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
- minetest.env:add_node(old_pos,{type="node",name="air"})
- end
- until minetest.env:get_node_or_nil(old_pos) ~= "technic:light"
- last_wielded[player_name] = true
- end
- end
-end)
-
-minetest.register_node("technic:light", {
- drawtype = "glasslike",
- tile_images = {"technic_light.png"},
- paramtype = "light",
- walkable = false,
- is_ground_content = true,
- light_propagates = true,
- sunlight_propagates = true,
- light_source = 15,
- selection_box = {
- type = "fixed",
- fixed = {0, 0, 0, 0, 0, 0},
- },
-})
-minetest.register_node("technic:light_off", {
- drawtype = "glasslike",
- tile_images = {"technic_light.png"},
- paramtype = "light",
- walkable = false,
- is_ground_content = true,
- light_propagates = true,
- sunlight_propagates = true,
- selection_box = {
- type = "fixed",
- fixed = {0, 0, 0, 0, 0, 0},
- },
-})
-
-function flashlight_weared (player)
-flashlight_on=false
-local inv = player:get_inventory()
-local hotbar=inv:get_list("main")
- for i=1,8,1 do
-
- if hotbar[i]:get_name() == "technic:flashlight" then
- item=hotbar[i]:to_table()
- if item["metadata"]=="" or item["metadata"]=="0" then return flashlight_on end --flashlight not charghed
- charge=tonumber(item["metadata"])
- if charge-2>0 then
- flashlight_on=true
- charge =charge-2;
- set_RE_wear(item,charge,flashlight_max_charge)
- item["metadata"]=tostring(charge)
- hotbar[i]:replace(item)
- inv:set_stack("main",i,hotbar[i])
- return true
- end
- end
- end
-return flashlight_on
-end
\ No newline at end of file