Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --------------------------------------------------
- -- Сервер для оравы шахтерских лазеров из кросоварпа.
- -- Ставится в кабине шахтерской платформы
- -- и подключается сетевыми кабелями к компьютерам,
- -- стоящим у лазеров. На те компьютеры
- -- нужно поставить клиентскую программу.
- -- И то, и то нужно поставить в autostart.
- --
- -- (c) Efrim
- -- skype: gods_pee
- -- 05.10.2013
- --------------------------------------------------
- NETWORK_SIDE = "bottom" -- Сторона, к которой подключен модем
- DATA_FILE = "miners.dat" -- Файл для сохранения данных
- TEMP_FILE = "miners.temp" -- Временное хранилище
- TIMEOUTS_MAX = 3 -- Максимальное количество таймаутов в сетевом общении
- TIMEOUT = 1 -- Время таймаута
- REFRESH_PERIOD = 1 -- Период обновления экрана
- --------------------------------------------------
- nTotal = -1
- nOnline = -1
- nLowEnergy = -1
- nMining = -1
- nQuarry = -1
- nStopped = -1
- maxLayer = -1
- minLayer = -1
- --------------------------------------------------
- -- Массив данных о майнерах:
- -- 1 - ID
- -- 2 - 'state'
- -- 3 - 'energy'
- -- 4 - 'currentLayer'
- -- 5 - 'mined'
- -- 6 - 'total'
- -- 7 - online
- miners = {}
- for i = 1, 81 do
- miners[i] = {}
- for j = 1, 7 do
- miners[i][j] = 0 -- Fill the values here
- end
- end
- --------------------------------------------------
- -- Графическая часть
- --------------------------------------------------
- function DisplayStats()
- term.clear()
- term.setCursorPos(1, 1)
- print("__ Lasers __")
- print("Online / Total: " .. nOnline .. " / " .. nTotal)
- print("Stopped / Mining / Quarry: " .. nStopped .. " / " .. nMining .. " / " .. nQuarry)
- print("Max / Min layer: " .. maxLayer .. " / " .. minLayer)
- print("With low energy: " .. nLowEnergy)
- print("")
- print("Press C to type a command")
- return 0
- end
- function SubmitCommand()
- print("")
- print("Enter command")
- sleep(1/10)
- print("> ")
- local input = read()
- return input
- end
- function ExecuteCommand(command)
- if command == "help" then
- PrintHelp()
- SubmitCommand()
- elseif command == "reinit" then
- rednet.broadcast(command)
- sleep(1/3)
- rednet.broadcast(command)
- sleep(1/3)
- rednet.broadcast(command)
- sleep(1/3)
- InitializeNetwork()
- DisplayStats()
- else
- rednet.broadcast(command)
- DisplayStats()
- end
- return 0
- end
- function PrintHelp()
- print("help")
- print("start")
- print("quarry")
- print("stop")
- print("restart")
- print("reinit")
- print("offset --layers")
- print("update --pastebin")
- print("")
- return 0
- end
- --------------------------------------------------
- -- Инициализация
- --------------------------------------------------
- function InitializeNetwork()
- if not rednet.isOpen(NETWORK_SIDE) then
- rednet.open(NETWORK_SIDE)
- end
- nTotal = 0
- local nTimeouts = 0
- term.clear()
- term.setCursorPos(1,1)
- print("Initializing...")
- while nTimeouts <= TIMEOUTS_MAX do
- sleep(1/4)
- rednet.broadcast("Server is here")
- local receivedID, receivedMessage, _ = rednet.receive(TIMEOUT)
- print(receivedID)
- if receivedID == nil then
- nTimeouts = nTimeouts + 1
- print("Timeout.")
- else
- print("Received message.")
- local _, _, minerIDstr = string.find(receivedMessage, "Miner (%d+) is here")
- minerID = tonumber(minerIDstr)
- if receivedID == minerID then
- AddMiner(minerID)
- nTimeouts = 0
- rednet.send(minerID, "Gotcha")
- print("Miner " .. nTotal .. " initialized.")
- end
- end
- end
- print("Initialized total " .. nTotal .. " miners.")
- SaveMinersTableToFile()
- return 0
- end
- function AddMiner(minerID)
- nTotal = nTotal + 1
- miners[nTotal][1] = minerID
- miners[nTotal][7] = 1
- end
- --------------------------------------------------
- -- Общение с имеющимися майнерами
- --------------------------------------------------
- function UpdateMiner(minerN) -- Обновление статуса майнера
- local timeouts = 0
- local minerID = miners[minerN][1]
- while timeouts <= TIMEOUTS_MAX do
- CommandMiner(minerN, "statusrequest")
- local receivedID, receivedMessage, _ = rednet.receive(TIMEOUT)
- if receivedID == minerID then
- local state = textutils.unserialize(receivedMessage)
- miners[minerN][2] = state[1]
- miners[minerN][3] = state[2]
- miners[minerN][4] = state[3]
- miners[minerN][5] = state[4]
- miners[minerN][6] = state[5]
- miners[minerN][7] = 1
- return 0
- end
- timeouts = timeouts + 1 -- Если дошли до этого места, то таймаут
- end
- miners[minerN][7] = 0 -- Если дошли до этого места, то майнер в оффлайне
- return 1
- end
- function UpdateAllMiners() -- Обновление статусов всех майнеров
- for i = 1, nTotal do
- UpdateMiner(i)
- end
- return 0
- end
- function CommandMiner(minerN, action)
- local minerID = miners[minerN][1]
- rednet.send(minerID, action)
- return 0
- end
- function CommandAllMiners(action)
- rednet.broadcast(action)
- return 0
- end
- --------------------------------------------------
- -- Пересчет статистики
- --------------------------------------------------
- function RecalculateStatistics ()
- nOnline = 0
- nLowEnergy = 0
- nMining = 0
- nQuarry = 0
- nStopped = 0
- maxLayer = 0
- minLayer = 256
- for i = 1, nTotal do
- -- nOnline
- nOnline = nOnline + miners[i][7]
- -- nLowEnergyTemp
- if miners[i][3] <= 50000 then
- nLowEnergy = nLowEnergy + 1
- end
- -- nMiningTemp, nQuarryTemp, nStoppedTemp
- if miners[i][2] == "not mining" then
- nStopped = nStopped + 1
- elseif miners[i][2] == "mining" then
- nMining = nMining + 1
- elseif miners[i][2] == "mining %(quarry mode%)" then
- nQuarry = nQuarry + 1
- end
- -- maxLayerTemp
- maxLayer = math.max(maxLayer, miners[i][4])
- minLayer = math.min(minLayer, miners[i][4])
- end
- return 0
- end
- --------------------------------------------------
- -- Сохранение и загрузка
- --------------------------------------------------
- function SaveMinersTableToFile()
- local file = fs.open(TEMP_FILE, "w")
- file.writeLine(textutils.serialize(miners))
- file.writeLine(nTotal)
- file.close()
- fs.delete(DATA_FILE)
- fs.move(TEMP_FILE, DATA_FILE)
- return 0
- end
- function LoadMinersTableFromFile()
- local file = fs.open(DATA_FILE, "r")
- miners = textutils.unserialize(file.readLine())
- nTotal = tonumber(file.readLine())
- file.close()
- return 0
- end
- --------------------------------------------------
- -- Главный луп
- --------------------------------------------------
- function main()
- if not rednet.isOpen(NETWORK_SIDE) then
- print("Opening networking...")
- rednet.open(NETWORK_SIDE)
- end
- if fs.exists(DATA_FILE) then
- print("Loading previous data...")
- LoadMinersTableFromFile()
- else
- print("Initializing...")
- InitializeNetwork()
- end
- while true do
- UpdateAllMiners()
- RecalculateStatistics()
- DisplayStats()
- SaveMinersTableToFile()
- local timeout = os.startTimer(REFRESH_PERIOD)
- while true do
- event = {os.pullEvent()}
- if event[1] == "key" and event[2] == 46 then
- local command = SubmitCommand()
- ExecuteCommand(command)
- timeout = os.startTimer(REFRESH_PERIOD)
- elseif event[1] == "timer" and event[2] == timeout then
- break
- end
- end
- end
- end
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement