diff --git a/technic/machines/hv/nuclear_reactor.lua b/technic/machines/hv/nuclear_reactor.lua index a5204c7..da5edf0 100644 --- a/technic/machines/hv/nuclear_reactor.lua +++ b/technic/machines/hv/nuclear_reactor.lua @@ -5,119 +5,120 @@ -- -- 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 @@ -135,14 +136,16 @@ local check_reactor_structure = function(pos) -- 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 @@ -150,7 +153,8 @@ local check_reactor_structure = function(pos) 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 @@ -158,7 +162,8 @@ local check_reactor_structure = function(pos) 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") @@ -172,68 +177,67 @@ local explode_reactor = function(pos) 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") diff --git a/technic/register_machine_and_tool.lua b/technic/register_machine_and_tool.lua index 2178224..b7d039a 100644 --- a/technic/register_machine_and_tool.lua +++ b/technic/register_machine_and_tool.lua @@ -1,5 +1,5 @@ -- This file includes the functions and data structures for registering machines and tools for LV, MV, HV types. --- We use the technioc namespace for these functions and data to avoid eventual conflict. +-- We use the technic namespace for these functions and data to avoid eventual conflict. -- register LV machines here technic.LV_machines = {} diff --git a/technic/tools/flashlight_old.lua b/technic/tools/flashlight_old.lua deleted file mode 100644 index 8a2c338..0000000 --- a/technic/tools/flashlight_old.lua +++ /dev/null @@ -1,176 +0,0 @@ --- 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