Advertisement
MrRobar35

ship.lua

Mar 12th, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 19.75 KB | None | 0 0
  1. local comp = require('component')
  2. local buffer = require("doubleBuffering")
  3. local GUI = require("GUI")
  4. local computer = require("computer")
  5. local event = require("event")
  6. local ship = comp.warpdriveShipController
  7. --Переменные, массивы, прочая хрень
  8.  
  9. buffer.setResolution(80,25)
  10.  
  11. local colors = {
  12.     background = 0xFFFFFF,
  13.     panel = 0x000000,
  14.     window = 0xb3b3b3,
  15.     textColor = 0x000000,
  16.     textColor2 = 0xFFFFFF,
  17.     button = 0x000082,
  18.     buttonPressed = 0x00004d,
  19.     buttonYes = 0x990000,
  20.     buttonNo = 0x990000,
  21.     buttonNoPressed = 0x4d0000,
  22. }
  23.  
  24.  
  25. -----
  26. local mainContainer = GUI.fullScreenContainer()
  27. mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, colors.background))
  28. local navContainer = mainContainer:addChild(GUI.container(18,3,62,21))
  29. local infoContainer = mainContainer:addChild(GUI.container(1,2,16,23))
  30. -----
  31. local function CoreScreenFix()
  32.     comp.gpu.bind(comp.screen.address,true)
  33.     buffer.setResolution(80,25)
  34. end
  35.  
  36. local function drawNav()
  37.     infoContainer:deleteChildren()
  38.     infoContainer:addChild(GUI.panel(1,1,infoContainer.width,infoContainer.height,colors.button,0.1))
  39.     local sx,sy,sz,planet = ship.position()
  40.     local pos
  41.     infoContainer:addChild(GUI.label(1,2,15,1,colors.textColor2,'Координаты:')):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  42.     infoContainer:addChild(GUI.label(1,3,15,1,colors.textColor2,'X: '..sx)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  43.     infoContainer:addChild(GUI.label(1,4,15,1,colors.textColor2,'Y: '..sy)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  44.     infoContainer:addChild(GUI.label(1,5,15,1,colors.textColor2,'Z: '..sz)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  45.     infoContainer:addChild(GUI.label(1,7,15,1,colors.textColor2,'Пространство:')):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  46.     if ship.isInSpace() == true or planet == 'Asteroids' then
  47.         pos = 'Космос'
  48.     elseif ship.isInHyperspace() == true then
  49.         pos = 'Гипер'
  50.     else
  51.         pos = 'Планета '..planet..''
  52.     end
  53.     infoContainer:addChild(GUI.label(1,8,15,2,colors.textColor2,pos)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  54. end
  55.  
  56. local function drawIRCSettrings()
  57.     navContainer:deleteChildren()
  58.     navContainer:addChild(GUI.panel(1, 1, navContainer.width, navContainer.height, colors.window))
  59.     navContainer:addChild(GUI.label(1, 1, 61, 1, colors.button, "Настройки IRC")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  60.     navContainer:addChild(GUI.label(2, 4, 8, 1, colors.textColor, 'Никнейм'))
  61.     navContainer:addChild(GUI.input(2, 5, 30, 1, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "", "nickname"))
  62.     navContainer:addChild(GUI.label(2, 7, 12, 1, colors.textColor, 'Адрес сервера'))
  63.     navContainer:addChild(GUI.input(2, 8, 30, 1, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "", "irc.name.domain:port"))
  64.     navContainer:addChild(GUI.label(2, 10, 5, 1, colors.textColor, 'Канал'))
  65.     navContainer:addChild(GUI.input(2, 11, 30, 1, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "", "#channel"))
  66.     navContainer:addChild(GUI.switchAndLabel(2, 13, 25, 8, colors.button, 0x1D1D1D, 0xEEEEEE, 0x000000, "Отправлять в ЛС", false)).switch.onStateChanged = function(state)
  67.        if state == true then
  68.             navContainer:addChild(GUI.label(2, 14, 15, 1, colors.textColor, 'Кому отправлять'))
  69.             navContainer:addChild(GUI.input(2, 15, 30, 1, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "", "nickname"))
  70.        else
  71.             navContainer:addChild(GUI.panel(2, 14, 59, 7, colors.window))
  72.        end
  73.     end
  74. end
  75.  
  76. local function drawAbout()
  77.     navContainer:deleteChildren()
  78.     navContainer:addChild(GUI.panel(1, 1, navContainer.width, navContainer.height, colors.window))
  79. end
  80.  
  81. local function antiFreeze()
  82.     local antiFreezeTimer = require("event").timer(1,CoreScreenFix,math.huge)
  83.     local fade = mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x000000,0.1))
  84.     mainContainer:addChild(GUI.framedButton(1, 1, mainContainer.width-1, mainContainer.height-1, 0x1a1a1a, 0xFFFFFF, 0x1a1a1a, 0xFFFFFF, "Выполняется прыжок...\nНажмите на экран по завершению")).onTouch = function(mainContainer,button)
  85.         require("event").cancel(antiFreezeTimer)
  86.         button:delete()
  87.         fade:delete()
  88.         drawNav()
  89.     end
  90. end
  91.  
  92.  
  93. local function drawJump()
  94.     navContainer:deleteChildren()
  95.     ship.command("MANUAL")
  96.     local _,max = ship.getMaxJumpDistance()
  97.     local rotmax = 360
  98.     local jumpX = 0
  99.     local jumpY = 0
  100.     local jumpZ = 0
  101.     local rot = 0
  102.     local type
  103.     navContainer:deleteChildren()
  104.     navContainer:addChild(GUI.panel(1, 1, navContainer.width, navContainer.height, colors.window))
  105.     navContainer:addChild(GUI.label(1, 1, 61, 1, colors.button, "Прыжок")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  106.     navContainer:addChild(GUI.label(2, 3, 9, 1, 0x555555, 'Максимум: '..max))
  107.     navContainer:addChild(GUI.label(2, 4, 8, 1, 0x555555, "Все значения выше максимума будут выравнены автоматически."))
  108.     navContainer:addChild(GUI.label(2, 6, 16, 1, colors.textColor, 'Ось перед-зад'))
  109.     navContainer:addChild(GUI.input(2, 7, 30, 1, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "0", "X")).onInputFinished = function(navContainer, input, eventData, text)
  110.         jumpX = tonumber(text)
  111.         if not jumpX then input.text = "" input.placeholderText = "Введите число!" jumpX = 0 return end
  112.         if jumpX >= max then jumpX = max input.text = jumpX return end
  113.         if jumpX <= -max then jumpX = -max input.text = jumpX return end
  114.     end    
  115.     navContainer:addChild(GUI.label(2, 9, 12, 1, colors.textColor, 'Ось верх-низ'))
  116.     navContainer:addChild(GUI.input(2, 10, 30, 1, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "0", "Y")).onInputFinished = function(navContainer, input, eventData, text)
  117.         jumpY = tonumber(text)
  118.         if not jumpY then input.text = "" input.placeholderText = "Введите число!" jumpY = 0 return end
  119.         if jumpY >= max then jumpY = max input.text = jumpY return end
  120.         if jumpY <= -max then jumpY = -max input.text = jumpY return end
  121.     end    
  122.     navContainer:addChild(GUI.label(2, 12, 14, 1, colors.textColor, 'Ось лево-право'))
  123.     navContainer:addChild(GUI.input(2, 13, 30, 1, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "0", "Z")).onInputFinished = function(navContainer, input, eventData, text)
  124.         jumpZ = tonumber(text)
  125.         if not jumpZ then input.text = "" input.placeholderText = "Введите число!" jumpZ = 0 return end
  126.         if jumpZ >= max then jumpZ = max input.text = jumpZ return end
  127.         if jumpZ <= -max then jumpZ = -max input.text = jumpZ return end
  128.         GUI.error(jumpZ)
  129.     end    
  130.     navContainer:addChild(GUI.label(2, 15, 14, 1, colors.textColor, 'Разворот'))
  131.     navContainer:addChild(GUI.input(2, 16, 30, 1, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "0", "R")).onInputFinished = function(navContainer, input, eventData, text)
  132.         rot = tonumber(text)
  133.         if not rot then input.text = "" input.placeholderText = "Введите число!" rot = 0 return end
  134.         if rot >= rotmax then rot = rotmax input.text = rot return end
  135.         if rot <= -rotmax then rot = -rotmax input.text = rot return end
  136.     end
  137.     navContainer:addChild(GUI.button(2, 18, 29, 3, colors.button, colors.textColor2, colors.buttonPressed, colors.textColor2, "Совершить прыжок")).onTouch = function()
  138.         if jumpX == 0 and jumpY == 0 and jumpZ == 0 and rot == 0 then GUI.error("Не введены координаты!") return end
  139.         ship.command("MANUAL")
  140.         ship.movement(jumpX,jumpY,jumpZ)
  141.         ship.enable(true)
  142.         --ship.command("IDLE")
  143.         antiFreeze()
  144.     end
  145.     navContainer:addChild(GUI.button(33, 18, 29, 3, colors.button, colors.textColor2, colors.buttonPressed, colors.textColor2, "Совершить гипер-переход")).onTouch = function()
  146.         ship.command("HYPERDRIVE")
  147.         ship.enable(true)
  148.         --ship.command("IDLE")
  149.         antiFreeze()
  150.     end
  151. end
  152.  
  153. local function drawInfo()
  154.     navContainer:deleteChildren()
  155.     local size = ship.getShipSize()
  156.     local assembly = ship.isAssemblyValid()
  157.     local energy = ship.energy()
  158.     local name = ship.shipName()
  159.     local back,left,down = ship.dim_negative()
  160.     local front,right,up = ship.dim_positive()
  161.     local ass
  162.     if assembly then ass = "правильная" else ass = "неправильная" end
  163.     navContainer:addChild(GUI.panel(1, 1, navContainer.width, navContainer.height, colors.window))
  164.     navContainer:addChild(GUI.label(1, 1, 61, 1, colors.button, "Информация о корабле")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  165.     navContainer:addChild(GUI.label(2, 3, 61, 1, colors.textColor, "Имя корабля: "..name))
  166.     navContainer:addChild(GUI.label(2, 5, 61, 1, colors.textColor, "Масса корабля: "..size.." блоков"))
  167.     navContainer:addChild(GUI.label(2, 7, 61, 1, colors.textColor, "Сборка корабля: "..ass))
  168.     navContainer:addChild(GUI.label(2, 9, 61, 1, colors.textColor, "Накоплено энергии: "..energy.." EU"))
  169.     navContainer:addChild(GUI.label(53, 3, 61, 1, colors.textColor, "Габариты: "))
  170.     navContainer:addChild(GUI.label(53, 5, 61, 1, colors.textColor, "Зад: "..back))
  171.     navContainer:addChild(GUI.label(53, 7, 61, 1, colors.textColor, "Лево: "..left))
  172.     navContainer:addChild(GUI.label(53, 9, 61, 1, colors.textColor, "Низ: "..down))
  173.     navContainer:addChild(GUI.label(53, 11, 61, 1, colors.textColor, "Перед: "..front))
  174.     navContainer:addChild(GUI.label(53, 13, 61, 1, colors.textColor, "Право: "..right))
  175.     navContainer:addChild(GUI.label(53, 15, 61, 1, colors.textColor, "Верх: "..up))
  176. end
  177.  
  178. local function drawRadar()
  179.     if not comp.isAvailable("warpdriveRadar") then GUI.error("Для работы этой функции необходим подключенный варп-радар!") return end
  180.     navContainer:deleteChildren()
  181.     local max = 9999
  182.     local radius = 1
  183.     navContainer:addChild(GUI.panel(1, 1, navContainer.width, navContainer.height, colors.window))
  184.     navContainer:addChild(GUI.label(1, 1, 61, 1, colors.button, "Варп-радар")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  185.     local textBox = navContainer:addChild(GUI.textBox(2, 9, 60, 12, 0xEEEEEE, 0x2D2D2D, {}, 1, 1, 0))
  186.     navContainer:addChild(GUI.label(2, 3, 9, 1, 0x555555, 'Максимум радиуса: '..max))
  187.     navContainer:addChild(GUI.label(2, 4, 8, 1, 0x555555, "Все значения выше максимума будут выравнены автоматически."))
  188.     navContainer:addChild(GUI.label(2, 6, 16, 1, colors.textColor, 'Радиус поиска '))
  189.     navContainer:addChild(GUI.input(2, 7, 30, 1, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "1", "Радиус")).onInputFinished = function(navContainer, input, eventData, text)
  190.         radius = tonumber(text)
  191.         if not radius then input.text = "" input.placeholderText = "Введите число!" radius = 0 return end
  192.         if radius >= max then radius = max input.text = radius return end
  193.         if radius < 1 then radius = 1 input.text = radius end
  194.     end
  195.     navContainer:addChild(GUI.button(33, 7, 29, 1, colors.button, colors.background, colors.buttonPressed, 0xFFFFFF, "Сканировать")).onTouch = function(navContainer, button, eventData, text)
  196.         if comp.warpdriveRadar.getEnergyRequired(radius) > comp.warpdriveRadar.energy() then GUI.error("Ошибка: недостаточно энергии.\nНакоплено "..comp.warpdriveRadar.energy().." EU\nНеобходимо еще "..comp.warpdriveRadar.getEnergyRequired(radius) - comp.warpdriveRadar.energy().." EU") return end
  197.         comp.warpdriveRadar.radius(radius)
  198.         comp.warpdriveRadar.start()
  199.         os.sleep(0.5)
  200.         button.text = "Сканирование ("..comp.warpdriveRadar.getScanDuration(radius).."s)"
  201.         os.sleep(comp.warpdriveRadar.getScanDuration(radius))
  202.         button.text = "Сканировать"
  203.         textBox.lines = {}
  204.         local delay = 0
  205.         local count
  206.         repeat
  207.             count = comp.warpdriveRadar.getResultsCount()
  208.             os.sleep(0.1)
  209.             delay = delay + 1
  210.         until (count ~= nil and count ~= -1) or delay > 10
  211.         if count ~= nil and count > 0 then
  212.             for i=0,count-1 do
  213.                 success, type, name, x, y, z = comp.warpdriveRadar.getResult(i)
  214.                 if success then
  215.                     table.insert(textBox.lines,type.." "..name.." ".." @ ("..x.." "..y.." "..z..")")
  216.                 end
  217.             end
  218.         else
  219.             table.insert(textBox.lines, {text = "Ничего не найдено.", color = colors.buttonNo})
  220.         end
  221.     end
  222. end
  223. local function drawCrew()
  224.     navContainer:deleteChildren()
  225.     local pl = ""
  226.     local str, players = ship.getAttachedPlayers()
  227.     navContainer:addChild(GUI.panel(1, 1, navContainer.width, navContainer.height, colors.window))
  228.     navContainer:addChild(GUI.label(1, 1, 61, 1, colors.button, "Экипаж")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  229.     navContainer:addChild(GUI.label(2, 3, 61, 1, colors.textColor, "Список подключенных игроков:"))
  230.     navContainer:addChild(GUI.label(2, 16, 61, 1, colors.textColor, "Телепорт игроков:"))
  231.     navContainer:addChild(GUI.input(2, 18, 29, 1, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "", "Ник игрока")).onInputFinished = function(navContainer, input, eventData, text) pl = text end
  232.     navContainer:addChild(GUI.button(2, 20, 29, 1, colors.button, colors.textColor2, colors.buttonPressed, colors.textColor2, "Телепортировать по нику")).onTouch = function()
  233.         for i = 1,#players do
  234.             if pl ~= players[i] then GUI.error("Этот игрок не подключен к контроллеру!") return end
  235.         end
  236.         GUI.error("Summoning!")
  237.         ship.targetName(pl)
  238.         ship.command("SUMMON")
  239.         ship.enable(true)
  240.     end
  241.     navContainer:addChild(GUI.button(33, 20, 29, 1, colors.buttonNo, colors.textColor2, colors.buttonNoPressed, colors.textColor2, "Телепортировать всех")).onTouch = function()
  242.         ship.targetName("")
  243.         ship.command("SUMMON")
  244.         ship.enable(true)
  245.     end  
  246.     local textBox = navContainer:addChild(GUI.textBox(2, 4, 60, 12, 0xEEEEEE, 0x2D2D2D, {}, 1, 1, 0))
  247.     table.insert(textBox.lines, {text = "Нет подключенных игроков.", color = colors.buttonNo})
  248.     if str == "" then return end
  249.     textBox.lines = {}
  250.     for i = 1,#players do
  251.         table.insert(textBox.lines,players[i])
  252.     end
  253. end
  254. local function drawCloak()
  255.     if not comp.isAvailable("warpdriveCloakingCore") then GUI.error("Для работы этой функции необходимо подключенный маскировщик!") return end
  256.     navContainer:deleteChildren()
  257.     cloak = comp.warpdriveCloakingCore
  258.     navContainer:addChild(GUI.panel(1, 1, navContainer.width, navContainer.height, colors.window))
  259.     navContainer:addChild(GUI.label(1, 1, 61, 1, colors.button, "Маскировка")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  260.     navContainer:addChild(GUI.label(2, 6, 16, 1, colors.textColor, 'Уровень маскировки'))
  261.     --2, 7, 30, 1
  262.     local comboBox = navContainer:addChild(GUI.comboBox(2, 7, 30, 1, 0xEEEEEE, 0x2D2D2D, colors.button, 0x888888))
  263.     comboBox:addItem("Отключить").onTouch = function()
  264.         cloak.enable(false)
  265.     end
  266.     comboBox:addItem("Уровень 1").onTouch = function()
  267.         local valid, msg = cloak.isAssemblyValid()
  268.         if not valid then GUI.error("Ошибка! Неверная сборка маскировщика:\n"..msg) return end
  269.         cloak.enable(false)
  270.         os.sleep(1)
  271.         cloak.tier(1)
  272.         cloak.enable(true)
  273.     end
  274.     comboBox:addItem("Уровень 2").onTouch = function()
  275.         local valid, msg = cloak.isAssemblyValid()
  276.         if not valid then GUI.error("Ошибка! Неверная сборка маскировщика:\n"..msg) return end
  277.         cloak.enable(false)
  278.         os.sleep(1)
  279.         cloak.tier(2)
  280.         cloak.enable(true)
  281.     end
  282. end
  283. local function drawMap()navContainer:deleteChildren()
  284.     navContainer:deleteChildren()
  285.     navContainer:addChild(GUI.label(2, 2, navContainer.width, navContainer.height, colors.textColor, "Тут типа карта должна быть, ага.")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)
  286. end
  287. -----------------------------------------------------------------------------
  288.  
  289. --верхняя панель
  290.  
  291. local menu = mainContainer:addChild(GUI.menu(1, 1, mainContainer.width, colors.panel, 0x666666, 0x3366CC, 0xFFFFFF, 0.7))
  292. menu:addItem("Interstellar", 0x0)
  293. local mSettings = menu:addItem("Настройки")
  294. local mAbout = menu:addItem("О программе")
  295. local mExit = menu:addItem("Выход")
  296. mSettings.onTouch = function(eventData)
  297.     local contextMenu = GUI.contextMenu(mSettings.x, mSettings.y + 1)
  298.     contextMenu:addItem("Общие")
  299.     contextMenu:addItem("Корабль")
  300.     contextMenu:addItem("IRC").onTouch = function()
  301.         drawIRCSettrings()
  302.     end
  303.     contextMenu:show()
  304. end
  305. mAbout.onTouch = function(eventData)
  306.     drawAbout()
  307. end
  308. mExit.onTouch = function(eventData)
  309.     mainContainer:stopEventHandling()
  310.     os.execute('/bin/sh.lua')
  311. end
  312.  
  313. --панель с точками
  314.  
  315.  
  316.  
  317. --кнопочки
  318.  
  319. mainContainer:addChild(GUI.button(18,25,8,1,colors.button,colors.background,colors.buttonPressed,colors.background,'Экипаж')).onTouch = function()
  320.     drawCrew()
  321. end
  322. mainContainer:addChild(GUI.button(27,25,8,1,colors.button,colors.background,colors.buttonPressed,colors.background,'Прыжок')).onTouch = function()
  323.     drawJump()
  324. end
  325. mainContainer:addChild(GUI.button(36,25,6,1,colors.button,colors.background,colors.buttonPressed,colors.background,'Инфо')).onTouch = function()
  326.     drawInfo()
  327. end
  328. mainContainer:addChild(GUI.button(43,25,7,1,colors.button,colors.background,colors.buttonPressed,colors.background,'Радар')).onTouch = function()
  329.     drawRadar()
  330. end
  331. mainContainer:addChild(GUI.button(51,25,12,1,colors.button,colors.background,colors.buttonPressed,colors.background,'Маскировка')).onTouch = function()
  332.     drawCloak()
  333. end
  334. mainContainer:addChild(GUI.button(71,25,7,1,colors.button,colors.background,colors.buttonPressed,colors.background,'Карта')).onTouch = function()
  335.     drawMap()
  336. end
  337. mainContainer:addChild(GUI.button(79,25,2,1,colors.button,colors.background,colors.button,colors.background,''))
  338. mainContainer:addChild(GUI.button(64,25,6,1,colors.button,colors.background,colors.button,colors.background,''))
  339. mainContainer:addChild(GUI.button(1,25,16,1,colors.button,colors.background,colors.button,colors.background,''))
  340. drawMap()
  341. drawNav()
  342. -----------------------------------------------------------------------------
  343. buffer.clear()
  344. mainContainer:draw()
  345. buffer.draw(true)
  346. mainContainer:startEventHandling()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement