CCCPaste

63ad42e7d67a8


-- 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()