143 lines
3.9 KiB
Lua
143 lines
3.9 KiB
Lua
|
|
local myname = "elepower_nuclear:fission_controller"
|
|
|
|
local function check(pos)
|
|
local reactpos = vector.add(pos, {x = 0, y = -1, z = 0})
|
|
local reactnode = minetest.get_node_or_nil(reactpos)
|
|
|
|
local coolpos = vector.add(pos, {x = 0, y = -2, z = 0})
|
|
local coolnode = minetest.get_node_or_nil(coolpos)
|
|
|
|
if not reactnode or reactnode.name ~= "elepower_nuclear:fission_core" then
|
|
return nil
|
|
end
|
|
|
|
if not coolnode or coolnode.name ~= "elepower_nuclear:reactor_fluid_port" then
|
|
return nil
|
|
end
|
|
|
|
return {
|
|
control_meta = minetest.get_meta(pos),
|
|
core = reactpos,
|
|
core_meta = minetest.get_meta(reactpos),
|
|
coolant = coolpos,
|
|
coolant_meta = minetest.get_meta(coolpos)
|
|
}
|
|
end
|
|
|
|
local function get_controller_formspec(meta)
|
|
local ctrls = {}
|
|
local rods = 4
|
|
local selected = meta:get_int("selected")
|
|
|
|
for i = 1, rods do
|
|
local setting = meta:get_int("c" .. i)
|
|
local xoffset = ((i / rods) * 4) + 3.75
|
|
local sel = ""
|
|
|
|
if i == selected then
|
|
sel = " <- "
|
|
end
|
|
|
|
local fspc = ("label[%f,0;%s]"):format(xoffset - 1.25, setting .. " %" .. sel)
|
|
|
|
fspc = fspc .. ele.formspec.create_bar(xoffset - 1, 0.5, 100 - setting, "#252625", true)
|
|
|
|
table.insert(ctrls, fspc)
|
|
end
|
|
|
|
return table.concat( ctrls, "" )..
|
|
"button[1,3.2;1.5,0.5;next;Next]"..
|
|
"button[2.5,3.2;1.5,0.5;prev;Previous]"..
|
|
"button[4.25,3.2;1.5,0.5;stop;SCRAM]"..
|
|
"button[6,3.2;1.5,0.5;up;Raise]"..
|
|
"button[7.5,3.2;1.5,0.5;down;Lower]"..
|
|
"tooltip[next;Select the next control rod]"..
|
|
"tooltip[prev;Select the previous control rod]"..
|
|
"tooltip[stop;Drops all the rods into the reactor core, instantly stopping it]"..
|
|
"tooltip[up;Raise selected control rod]"..
|
|
"tooltip[down;Lower selected control rod]"
|
|
end
|
|
|
|
local function get_formspec(pos, power, station, station_meta)
|
|
local width = 8
|
|
local fspec = "list[context;card;1,0;1,1;]"
|
|
local metas = check(pos)
|
|
|
|
--local comps = station_meta:get_string("components")
|
|
--local seeitems = comps:match("elepower_wireless:upgrade_item_transfer") ~= nil
|
|
|
|
if metas then
|
|
fspec = "list[context;card;2,0;1,1;]"
|
|
width = 10
|
|
|
|
-- Reactor Core
|
|
|
|
local power = metas.core_meta:get_int("setting")
|
|
local heat = metas.core_meta:get_int("heat")
|
|
|
|
local status = "Activate by extracting the control rods"
|
|
|
|
if heat > 80 then
|
|
status = "!!! TEMPERATURE CRITICAL !!!"
|
|
elseif heat > 90 then
|
|
status = "!!! REACTOR CRITICAL !!!"
|
|
elseif heat > 95 then
|
|
status = "!!! REACTOR MELTDOWN IMMINENT !!!"
|
|
elseif power > 0 then
|
|
status = "Active reaction chain"
|
|
end
|
|
|
|
fspec = fspec..
|
|
ele.formspec.create_bar(1, 0, power, "#ff0000", true)..
|
|
ele.formspec.create_bar(1.5, 0, heat, "#ffdd11", true)..
|
|
"tooltip[1,0;0.25,2.5;Power: "..power.."%]"..
|
|
"tooltip[1.5,0;0.25,2.5;Heat: "..heat.."%]"..
|
|
"label[1,3.75;".. status .."]"
|
|
|
|
-- Rods
|
|
fspec = fspec .. get_controller_formspec(metas.control_meta)
|
|
|
|
-- Coolant port
|
|
|
|
local cool = fluid_lib.get_buffer_data(metas.coolant, "cool")
|
|
local hot = fluid_lib.get_buffer_data(metas.coolant, "hot")
|
|
|
|
fspec = fspec ..
|
|
ele.formspec.fluid_bar(8, 0, cool)..
|
|
ele.formspec.fluid_bar(9, 0, hot)
|
|
|
|
--if seeitems then
|
|
-- fspec = fspec ..
|
|
-- "button[2,1;1,1;inv;Items]"
|
|
--end
|
|
end
|
|
|
|
local centered = (width - 8) / 2
|
|
return "size["..width..",8.5]"..
|
|
default.gui_bg..
|
|
default.gui_bg_img..
|
|
default.gui_slots..
|
|
ele.formspec.power_meter(power)..
|
|
"list[current_player;main;"..centered..",4.25;8,1;]"..
|
|
"list[current_player;main;"..centered..",5.5;8,3;8]"..
|
|
fspec..
|
|
"listring[current_player;main]"..
|
|
"listring[context;card]"..
|
|
"listring[current_player;main]"..
|
|
default.get_hotbar_bg(centered, 4.25)
|
|
end
|
|
|
|
local function on_receive_fields(pos, fields, sender, station, station_meta)
|
|
--if fields["inv"] then
|
|
-- return
|
|
--end
|
|
|
|
return minetest.registered_nodes[myname].on_receive_fields(pos, myname, fields, sender)
|
|
end
|
|
|
|
elewi.register_handler(myname, {
|
|
get_formspec = get_formspec,
|
|
on_receive_fields = on_receive_fields
|
|
})
|