-- mission_control_server.lua
local component = require("component")
local event = require("event")
local sides = require("sides")
local serialization = require("serialization")
-- Config
local PORT = 1000
local UPDATE_INTERVAL = 1
-- Components
local modem = component.modem
-- State Management
local state = {
fuelProduction = 0,
fuelStored = 0,
maxFuelCapacity = 0,
rocketDocked = false,
rocketFuel = 0,
refueling = false,
lastUpdate = 0
}
-- Component Discovery
local adapters = {}
local fuelTanks = {}
local function discoverComponents()
print("=== Discovering Components ===")
for address in component.list("adapter") do
table.insert(adapters, component.proxy(address))
print("Found Adapter: " .. address:sub(1, 8))
end
print("Total Adapters: " .. #adapters)
print("")
for i, adapter in ipairs(adapters) do
print("Analyzing Adapter " .. i .. ":")
for side = 0, 5 do
local sideName = sides[side]
local success, methods = pcall(function()
return adapter.methods(side)
end)
if success and methods then
print(" Side " .. sideName .. ": " .. table.concat(methods, ", "))
local hasGetFluid = false
local hasGetFuel = false
for _, method in ipairs(methods) do
if method:lower():find("fluid") or method:lower():find("tank") then
hasGetFluid = true
end
if method:lower():find("fuel") then
hasGetFuel = true
end
end
if hasGetFluid or hasGetFuel then
table.insert(fuelTanks, {adapter = adapter, side = side, methods = methods})
print(" -> Registered as Fuel Tank/Loader")
end
end
end
print("")
end
print("Registered Fuel Components: " .. #fuelTanks)
print("===========================")
print("")
end
local function updateFuelData()
state.fuelStored = 0
state.maxFuelCapacity = 0
state.fuelProduction = 0
for i, component_info in ipairs(fuelTanks) do
local adapter = component_info.adapter
local side = component_info.side
local methods = component_info.methods
local tryMethods = {
"getFluidAmount",
"getFluidInTank",
"getTankInfo",
"getStored",
"getFuelAmount",
"getFuel"
}
for _, methodName in ipairs(tryMethods) do
local hasMethod = false
for _, m in ipairs(methods) do
if m == methodName then
hasMethod = true
break
end
end
if hasMethod then
local success, result = pcall(function()
return adapter.invoke(methodName, side)
end)
if success and result then
if type(result) == "table" then
if result.amount then
state.fuelStored = state.fuelStored + result.amount
end
if result.capacity then
state.maxFuelCapacity = state.maxFuelCapacity + result.capacity
end
elseif type(result) == "number" then
state.fuelStored = state.fuelStored + result
end
end
end
end
end
state.lastUpdate = os.time()
end
local function updateRocketStatus()
state.rocketDocked = false
state.rocketFuel = 0
for i, component_info in ipairs(fuelTanks) do
local adapter = component_info.adapter
local side = component_info.side
local methods = component_info.methods
for _, method in ipairs(methods) do
if method:lower():find("rocket") then
state.rocketDocked = true
local success, result = pcall(function()
return adapter.invoke(method, side)
end)
if success and type(result) == "number" then
state.rocketFuel = result
end
break
end
end
end
end
local function startRefueling()
print("[ACTION] Starting refueling sequence...")
state.refueling = true
for i, component_info in ipairs(fuelTanks) do
local adapter = component_info.adapter
local side = component_info.side
local methods = component_info.methods
for _, method in ipairs(methods) do
if method:lower():find("start") or method:lower():find("enable") or method == "setEnabled" then
pcall(function()
adapter.invoke(method, side, true)
end)
end
end
end
print("[ACTION] Refueling started")
end
local function stopRefueling()
print("[ACTION] Stopping refueling sequence...")
state.refueling = false
for i, component_info in ipairs(fuelTanks) do
local adapter = component_info.adapter
local side = component_info.side
local methods = component_info.methods
for _, method in ipairs(methods) do
if method:lower():find("stop") or method:lower():find("disable") or method == "setEnabled" then
pcall(function()
adapter.invoke(method, side, false)
end)
end
end
end
print("[ACTION] Refueling stopped")
end
local function handleMessage(sender, port, distance, command, data)
print("[REQUEST] " .. command .. " from " .. sender:sub(1, 8))
if command == "GET_STATUS" then
local serialized = serialization.serialize(state)
modem.send(sender, PORT, "STATUS", serialized)
elseif command == "START_REFUEL" then
startRefueling()
modem.send(sender, PORT, "ACK")
elseif command == "STOP_REFUEL" then
stopRefueling()
modem.send(sender, PORT, "ACK")
elseif command == "PING" then
modem.send(sender, PORT, "PONG")
else
modem.send(sender, PORT, "ERROR")
end
end
local function displayStatus()
print("╔═══════════════════════════════════════╗")
print("║ MISSION CONTROL SERVER STATUS ║")
print("╚═══════════════════════════════════════╝")
print("")
print("Server Address: " .. modem.address)
print("Port: " .. PORT)
print("Components: " .. #fuelTanks .. " fuel systems")
print("")
print("Fuel Stored: " .. state.fuelStored .. " / " .. state.maxFuelCapacity .. " mB")
print("Production: " .. state.fuelProduction .. " mB/t")
print("Rocket: " .. (state.rocketDocked and "DOCKED" or "NOT DETECTED"))
if state.rocketDocked then
print("Rocket Fuel: " .. state.rocketFuel .. "%")
end
print("Refueling: " .. (state.refueling and "ACTIVE" or "IDLE"))
print("")
print("Press Ctrl+C to stop server")
print("───────────────────────────────────────")
end
local function main()
print("=== MISSION CONTROL SERVER STARTING ===")
print("")
modem.open(PORT)
print("✓ Modem listening on port " .. PORT)
print("✓ Server Address: " .. modem.address)
print("")
discoverComponents()
if #fuelTanks == 0 then
print("⚠ WARNING: No GalacticCraft components found!")
print("Make sure adapters are placed next to:")
print(" - Fuel Loaders")
print(" - Fuel Tanks")
print(" - Refineries")
print("")
end
print("Server is running...")
print("")
local lastStatusDisplay = 0
local lastDataUpdate = 0
while true do
local currentTime = os.time()
if currentTime - lastDataUpdate >= UPDATE_INTERVAL then
updateFuelData()
updateRocketStatus()
lastDataUpdate = currentTime
end
if currentTime - lastStatusDisplay >= 5 then
displayStatus()
lastStatusDisplay = currentTime
end
local _, _, sender, port, distance, command, data = event.pull(0.5, "modem_message")
if command then
handleMessage(sender, port, distance, command, data)
end
end
end
local function cleanup()
print("")
print("=== SERVER SHUTTING DOWN ===")
modem.close(PORT)
print("✓ Port closed")
print("Server stopped.")
end
local success, err = xpcall(main, debug.traceback)
if not success then
print("")
print("ERROR: " .. tostring(err))
end
cleanup()