Перейти к содержимому

xMikhailx

Пользователи
  • Публикации

    16
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем xMikhailx


  1. Предлагаю устроить соревнование по скорости грифа сбора ресурсов между Байтом и Очкороботом. 

    Не называй, пожалуйста, его Очкоробот, ладно?  :) (Мы потом придумаем что-нибудь..)

    А то, звучит плохо) Да и мы не играем на дримсе, лайта ждём.


  2. Всем здравствуйте!
     
    OC - Управление роботом ver. 2.0
    Авторы: xMikhailx, WildOne.
     
    h_1441044563_4931960_02ac697efa.png
     
      Вышло обновление нашей программы!!!  :)
      Как и ранее, суть программы заключается в управлении роботом из ОС через очки (Terminal Glasses), на данный момент для реализации работы программы нужно достаточно много ресурсов, т.к. нужен сервер (компьютер) + робот (Tier 3) + Terminal Glasses Bridge + Terminal Glasses. Всё работает через связанную плату (Linked Card).
     
      CHANGELOG:

    ver.2.0
    *Полностью переработан графический интерфейс.
    +Добавлена функция: подсчёт количества слотов инвентаря
    *Доработана функция: drop(up|dn) [номер слота] [кол-во предметов]
    +Добавлена функция: rs (подача редстоуна)
    +Добавлена функция: mon (полноценная функция мониторинга робота [часть функционала взято у AlexCC и доработано])
    +Добавлена функция: inv (вывод инвентаря в виде псевдотаблицы)
    +Добавлена функция: удаление слушателей при перезапуске программы (Спасибо Zer0Galaxy за помощь)
    +Остальные мелкие доработки и оптимизация

     
      Команды для управления роботом (вводятся с очками в чат, начиная с $$):

    $$clear - очищает интерфейс очков.
    $$gf [количество блоков] - движение вперёд на указанное [количество блоков], если не указано, движение на один блок. 
    $$gfd [количество блоков] - аналогично предыдущему, но вскапывает блоки, встречающиеся на пути. (блок перед роботом и над роботом, чтобы человек мог пройти)  
    $$gb [количество блоков] - движение назад на указанное [количество блоков], если не указано, движение на один блок. 
    $$tr - поворот направо на 90 градусов.
    $$tl - поворот налево на 90 градусов. 
    $$ta - поворот на 180 градусов. 
    $$up [количество блоков] - подъем на указанное [количество блоков], если не указано, движение на один блок. 
    $$upd [количество блоков] - аналогично предыдущему, но вскапывает блоки, встречающиеся на пути. 
    $$dn [количество блоков] - спуск на указанное [количество блоков], если не указано, движение на один блок. 
    $$dnd [количество блоков] - аналогично предыдущему, но вскапывает блоки, встречающиеся на пути. 
    $$use - использовать предмет перед роботом (правая кнопка мыши). 
    $$useup - использовать предмет над роботом (правая кнопка мыши). 
    $$usedn - использовать предмет под роботом (правая кнопка мыши). 
    *$$drop [номер слота] [кол-во предметов] - выложить вещи из слота инвентаря перед роботом(если не указано одно число,то выкладывет весь слот ,а если не указаны оба числа, то выкладывает весь инвентарь) (если перед роботом сундук, то в сундук). 
    *$$dropup [номер слота] [кол-во предметов] -  выложить вещи из слота инвентаря над роботом (если не указано одно число,то выкладывет весь слот ,а если не указаны оба числа, то выкладывает весь инвентарь) (если над роботом сундук, то в сундук). 
    *$$dropdn - [номер слота] [кол-во предметов] - выложить вещи из слота инвентаря под роботом (если не указано одно число,то выкладывет весь слот ,а если не указаны оба числа, то выкладывает весь инвентарь) (если под роботом сундук, то в сундук). 
    $$suck - забрать все вещи перед роботом (если перед роботом сундук, то из сундук). 
    $$suckup - забрать все вещи над роботом (если над роботом сундук, то из сундук). 
    $$suckdn - забрать все вещи под роботом (если под роботом сундук, то из сундук).
    +$$mon - выводит на экран состояние робота.
    +$$inv - выводит на экран инвентарь робота.
    +$$rs - первое использование подаёт сигнал редстоуна/второе - отключает сигнал редстоуна.

     
      Схема такова:
    1). Компьютер (Tier 3) - это и есть сервер. Применение: компьютер соединить с Terminal Glasses Bridge'м. Функция: принимает команды от очков -> передаёт на робота команды -> принимает ответы от робота -> выводит ответы на очки.
    Компоненты:

    Связанная плата - обязательно, вся работа основана на ней!
    Графическая карта (желательно Tier 2 или выше)
    Интернет карта (по желанию, нужна для скачивания программы)
    Процессор (можно любой)
    Оперативная память (много не нужно, тестировалось всё на 2-ух картах Tier 2)
    Винчестер (любой)
     
    Вот наш пример сборки компьютера:
    h_1441044213_3021297_0cf991e097.png

     
    2). Робот (Tier 3) - рабочая сила   :) Функция: принимает команды от сервера -> выполняет команды -> отправляет ответ на сервер.
    Компоненты:

    Связанная плата - обязательно, вся работа основана на ней!
    Контроллер инвентаря - обязательно.
    Редстоун карта - обязательно, не ниже Tier 1.
    Далее компоненты по желанию. 
     
    Вот наш пример сборки робота:
    h_1441044436_1340566_c4e2d83f1c.png

     
    Скриншоты:

    Сообщение робота:

    h_1441045492_7080126_e80ed47f7c.png

    Мониторинг:

    h_1441045521_6867631_62d0ae2698.png

    Инвентарь:

    h_1441045801_9664610_755137a8e9.png

     
      Сами программы:
    1. Для сервера: http://pastebin.com/2kH0eNeF (для установки введите pastebin get 2kH0eNeF server.lua)
      Код:

      ----------------------------------------------------
      --              Универсальная программа           --  
      --    для ручного управления роботом c помощью    --
      --              OpenPeripheral Glasses!           --
      --          проект http://computercraft.ru        --  
      --            2015, © xMikhail, WildOne           --
      --                    ver. 2.0                    -- 
      ----------------------------------------------------
      -----------------------SERVER-----------------------
      
      
      local event = require("event")
      local tunnel = require("component").tunnel
      local g = require("component").openperipheral_bridge
      local s = require("serialization")
      
      color1 = 0x00FFFF
      color2 = 0xFFFFFF
      color3 = 0x818181
      height = 30
      
      --FUNCTIONS
      
      function clear()
        g.clear()
        g.sync()
      end
      
      if Message then
        if event.ignore("modem_message",Message) then
          print("Слушатель modem_message удалён")
        else
          print("Слушатель modem_message не удалён")
        end
      end
      
      if glasscommand then
        if event.ignore("glasses_chat_command",glasscommand) then
          print("Слушатель glasses_chat_command удалён")
        else
          print("Слушатель glasses_chat_command не удалён")
        end
      end
      
      function MassStringLength(StrMass,amount)
        local StrLengthMass = {}
        for n = 1, amount do
          StrLengthMass[n] = string.len(StrMass[n])
        end
        return StrLengthMass
      end
          
          
      
      function FindMax(mass,amount)
        if amount < 1 then 
          return nil
        else
          local max = mass[1]
          for n = 1, amount do
            if mass[n] > max then
              max = mass[n]
            end
          end
        return max
        end
      end
      
      function AddInfBox(infbox)
          amount = string.len(infbox)
      length = amount * 3.4
        g.clear()
          g.addBox(1,1,length + 18,3,color1,1)
          g.addBox(5,4,length + 10,height,color1,0.5)
          g.addBox(1,height+4,length + 18,3,color1,1)
          g.addText(length / 2 - 5,8,"Робот:",color2)
          g.addText(21,20,infbox,color2)
        g.sync()
      end
      
      function MonBox(monbox)
        val = {}
        val = s.unserialize(monbox)
        g.clear()
      g.addBox(1,1,240,5,color1,1)
          g.addBox(6,6,230,70,color3,0.7)
      g.addBox(1,71,240,5,color1)
        g.addText(90,8,"Статус робота :",color2)
          g.addText(9,18,"Имя робота / Опыт робота",color2)
              g.addText(150,18,val.name.." / "..val.level,color2)
          g.addText(9,28,"Всего / Свободно слотов",color2)
              g.addText(150,28,val.inv_size.." / "..val.freeslots,color2)
          g.addText(9,38,"Всего / Оставшийся заряд",color2)
              g.addText(150,38,val.MAX_EU.." / "..val.EU,color2)
          g.addText(9,48,"Всего / Свободно памяти",color2)
              g.addText(150,48,val.TOTAL_MEM.." Кб / "..val.freeMEM.." Кб",color2)
          g.addText(9,58,"Время работы / Редстоун",color2)
              g.addText(150,58,val.uptime.." мин / "..val.rsstatus,color2)
        g.sync()
      end
      
      function InvBox(invbox)
        inv = {}
        inv = s.unserialize(invbox)
        g.clear()
        g.sync()
          local maxname = FindMax(MassStringLength(inv.name,inv.busyslots),inv.busyslots)
          if maxname == nil then
            g.clear()
            g.addBox(1,1,100,10,color1,0.7)
            g.addText(20,3,"Инвентарь робота :",color2).setScale(0.8)
            g.addBox(1,11,100,8,color3,0.5)
          g.addText(25,13,"Нет предметов!",color2).setScale(0.8)
          g.sync()
        end
        local amount1 = maxname
        local length1 = amount1 * 5.3
        local x1 = 6
        local y1 = 11
        local amountStolb = math.ceil(inv.busyslots / 24)
          if amount1 < 15 then 
          length1 = 100
        end
        g1 = length1 * amountStolb + 10
        g.addBox(1,1,g1,10,color1,0.7)
        g2 = (length1 * amountStolb) / 2 - 30
        g.addText(g2,2,"Инвентарь робота :",color2).setScale(0.8)
        g.sync()
        for i=1,inv.busyslots do
          local i2 = i % 2
          local h1 = color3
          local h2 = color1
          for k = 1,amountStolb do
            local k1 = 24 * k
            if i > k1 then
              x1 = 6 + length1 * k
              y1 = 11 - 168 * k
            end
          end
          if i2 == 0 then
            local i3 = (i - 1) * 7 + y1
            local i4 = (i - 1) * 7 + (y1 + 1)
            g.addBox(x1,i3,length1,7,h2,0.5)
            g.addText(x1,i4,"| "..inv.slot[i].."  "..inv.name[i],color2).setScale(0.8)
            g.addText(x1 + length1 - 9 ,i4,tostring(inv.amount[i]),color2).setScale(0.8)
            g.sync()
          else
            local i3 = (i - 1) * 7 + y1
            local i4 = (i - 1) * 7 + (y1 + 1)
            g.addBox(x1,i3,length1,7,h1,0.5)
            g.addText(x1,i4,"| "..inv.slot[i].."  "..inv.name[i],color2).setScale(0.8)
            g.addText(x1 + length1 - 9 ,i4,tostring(inv.amount[i]),color2).setScale(0.8)
            g.sync()
          end
        end
      end
      function _G.Message(_,_,_,_,_,msgbox)
        msg = {}
        msg[1] = tonumber(string.sub(msgbox,1,1))
        msg[2] = string.sub(msgbox,3)
        if msg[1] == 1 then
          AddInfBox(msg[2])
        elseif msg[1] == 2 then
          MonBox(msg[2])
        elseif msg[1] == 3 then
          InvBox(msg[2])
      end
      end
      
      function _G.glasscommand(_,_,nick,_,gcom)
        print("Игрок: "..nick.." использовал команду: "..gcom)
        if gcom == "clear" then clear()
        else
          tunnel.send(gcom)
        end
      end
      
      event.listen("glasses_chat_command",glasscommand)
      event.listen("modem_message",Message)

    2. Для робота: http://pastebin.com/PYZqsPXw (для установки введите pastebin get PYZqsPXw robot.lua)
      Код:

      ----------------------------------------------------
      --              Универсальная программа           --  
      --    для ручного управления роботом c помощью    --
      --              OpenPeripheral Glasses!           --
      --          проект http://computercraft.ru        --  
      --            2015, © xMikhail, WildOne           --
      --                    ver. 2.0                    -- 
      ----------------------------------------------------
      ------------------------ROBOT-----------------------
      
      local event = require("event")
      local computer = require('computer')
      local r = require("robot")
      local tunnel = require("component").tunnel
      local rs = require("component").redstone
      local s = require("serialization")
      local sides = require('sides')
      local icontroller = require('component').inventory_controller
       
      local t = {}
       
      --===================================--
      --            Monitoring             --
      --===================================--
       
      local val = {}
      val.inv_size = r.inventorySize()
       
      function getEU()
              return math.floor(computer.energy())
      end
       
      function freeMEM()
              return math.floor(computer.freeMemory()/1024)
      end
      
      function freeslots()
              local freeslots=0
              for i=1,val.inv_size do
                      if r.count(i)==0 then
                              freeslots = freeslots + 1
                      end
              end
              return freeslots
      end
      
      rsstatus = "выкл"
       
      function getEU()
              return math.floor(computer.energy())
      end
      
      function freeMEM()
              return math.floor(computer.freeMemory()/1024)
      end
       
      function t.mon()
              val.name = r.name()
              val.level = r.level()
              val.freeslots = freeslots()
              val.MAX_EU  = computer.maxEnergy()
              val.TOTAL_MEM = computer.totalMemory()/1024
              val.EU = getEU()
              val.freeMEM = freeMEM()
              val.uptime = math.floor(computer.uptime()/60)
              val.rsstatus = rsstatus
              tunnel.send("2 "..s.serialize(val))
      end
      
      --===================================--
      --           INVENTORY DATA          --
      --===================================--
      
      inv = {}
      inv.slot = {}
      inv.name = {}
      inv.amount = {}
      
      function t.inv()
              local frsl = freeslots()
              inv.busyslots = val.inv_size - frsl
              local c = 1
              for i = 1, val.inv_size do
                      local amount = r.count(i)
                      if amount > 0 then
                              r.select(i)
                              stack = icontroller.getStackInInternalSlot(i)
                              inv.slot[c] = i
                              inv.name[c] = stack.label
                              inv.amount[c] = amount
                              c = c + 1               
                      end
              end
              c = 1
              i = 1
              tunnel.send("3 "..s.serialize(inv))
      end
      
      --===================================--
      --         MOVEMENT FUNCTIONS        --
      --===================================--
       
       
      function t.gf()
              local c = 1
              if act[2]==nil then act[2]=1 end
              for c = 1,act[2] do
                      r.forward()
              end
              tunnel.send("1 Я сдвинулся на "..act[2].." блок(ов) вперёд")
              print("Я сдвинулся на "..act[2].." блок(ов) вперёд")
              c = 1
      end
       
      function t.gfd()
              local dblocks = 0
              if act[2]==nil then act[2]=1 end
              for c = 1,act[2] do
                      repeat
                              if r.swing() then dblocks = dblocks+1 end
                              if r.swingUp() then dblocks = dblocks+1 end
                      until r.detect()==false or r.detectUp()==false
                      r.forward()
                      if r.swingUp() then dblocks = dblocks+1 end
              end
              tunnel.send("1 Я сдвинулся на "..act[2].." блок(ов) вперёд и вскопал "..dblocks.." блок(ов)")
              print("Я сдвинулся на "..act[2].." блок(ов) вперёд и вскопал "..dblocks.." блок(ов)")
              c = 1
      end
       
      function t.gb()
              local c = 1
              if act[2]==nil then act[2]=1 end
              for c = 1,act[2] do
                      r.back()
              end
              tunnel.send("1 Я сдвинулся на "..act[2].." блок(ов) назад")
              print("Я сдвинулся на "..act[2].." блок(ов) назад")
              c = 1
      end
       
      function t.up()
              local c = 1
              if act[2]==nil then act[2]=1 end
              for c = 1,act[2] do
                      r.up()
              end
              tunnel.send("1 Я поднялся на "..act[2].." блок(ов)")
              print("Я поднялся на "..act[2].." блок(ов)")
              c = 1
      end
       
      function t.upd()
              local dblocks = 0
              local c = 1
              if act[2]==nil then act[2]=1 end
              for c = 1,act[2] do
                      repeat
                              if r.swingUp() then dblocks = dblocks+1 end
                      until r.detectUp()==false
                      r.up()
                      if r.swingUp() then dblocks = dblocks+1 end
              end
              tunnel.send("1 Я поднялся на "..act[2].." блок(ов) и вскопал "..dblocks.." блок(ов)")
              print("Я поднялся на "..act[2].." блок(ов) и вскопал "..dblocks.." блок(ов)")
              c = 1
      end
       
      function t.dn()
              local c = 1
              if act[2]==nil then act[2]=1 end
              for c = 1,act[2] do
                      r.down()
              end
              tunnel.send("1 Я спустился на "..act[2].." блок(ов)")
              print("Я спустился на "..act[2].." блок(ов)")
              c = 1
      end
       
      function t.dnd()
              local dblocks = 0
              local c = 1
              if act[2]==nil then act[2]=1 end
              for c = 1,act[2] do
                      repeat
                              if r.swingDown() then dblocks = dblocks+1 end
                      until r.detectDown()==false
                      r.down()
              end
              tunnel.send("1 Я спустился на "..act[2].." блок(ов) и вскопал "..dblocks.." блок(ов)")
              print("Я спустился на "..act[2].." блок(ов) и вскопал "..dblocks.." блок(ов)")
              c = 1
      end
      
      function t.tr()
              r.turnRight()
              tunnel.send("1 Я повернулся направо")
              print("Я повернулся направо")
      end
       
      function t.tl()
              r.turnLeft()
              tunnel.send("1 Я повернулся налево")
              print("Я повернулся налево")
      end
       
      function t.ta()
              r.turnAround()
              tunnel.send("1 Я повернулся на 180 градусов")
              print("Я повернулся на 180 градусов")
      end
       
      --===================================--
      --            USE FUNCTIONS          --
      --===================================--
       
      function t.rs()
              if rsstatus=="выкл" then
                      rsstatus="вкл"
                      rs.setOutput(sides.front, 15)
                      rs.setOutput(sides.bottom, 15)
                      rs.setOutput(sides.top, 15)
                      tunnel.send("1 Редстоун включен")
                      print("Редстоун включен")
              else 
                      rsstatus="выкл"
                      rs.setOutput(sides.front, 0)
                      rs.setOutput(sides.bottom, 0)
                      rs.setOutput(sides.top, 0)     
                      tunnel.send("1 Редстоун выключен")
                      print("Редстоун выключен")
              end
      end
       
      function t.use()
              r.use()
              tunnel.send("1 Я щёлкнул правой мыши перед собой")
              print("Я щёлкнул правой мыши перед собой")
      end
       
      function t.useup()
              r.useUp()
              tunnel.send("1 Я щёлкнул правой мыши над собой")
              print("Я щёлкнул правой мыши над собой")
      end
       
      function t.usedn()
              r.useDown()
              tunnel.send("1 Я щёлкнул правой мыши под собой")
              print("Я щёлкнул правой мыши под собой")
      end
       
      --===================================--
      --        INVENTORY FUNCTIONS        --
      --===================================--
       
      function t.drop()
              local amountItems = 0
              act[2] = tonumber(act[2])
      	act[3] = tonumber(act[3])
              if act[3] == nil then
                      if act[2] == nil then
                              for d=1,val.inv_size do
                                      r.select(d)
                                      r.drop(r.count())
                              end
                      tunnel.send("1 Я выбросил все вещи перед собой(или в сундук)")
                      print("Я выбросил все вещи перед собой(или в сундук)")
                      else
                              r.select(act[2])
                              r.drop(r.count())
                      tunnel.send("1 Я выбросил все вещи из слота "..act[2].." перед собой(или в сундук)")
                      print("Я выбросил все вещи из слота "..act[2].." перед собой(или в сундук)")
                      end
              else
                      r.select(act[2])
                      amountItems = r.count()
                      r.drop(act[3])
                      if act[3] > amountItems then
                              tunnel.send("1 Я выбросил "..amountItems.." вещь(-ей) из слота "..act[2].." перед собой(или в сундук)")
                              print("Я выбросил "..amountItems.." вещь(-ей) из слота "..act[2].." перед собой(или в сундук)")
                      else
                              tunnel.send("1 Я выбросил "..act[3].." вещь(-ей) из слота "..act[2].." перед собой(или в сундук)")
                              print("Я выбросил "..act[3].." вещь(-ей) из слота "..act[2].." перед собой(или в сундук)") 
                      end
              end
              amountItems = 0
              r.select(1)
      end
       
      function t.dropup()
             local amountItems = 0
              act[2] = tonumber(act[2])
      	act[3] = tonumber(act[3])
              if act[3] == nil then
                      if act[2] == nil then
                              for d=1,val.inv_size do
                                      r.select(d)
                                      r.dropUp(r.count())
                              end
                      tunnel.send("1 Я выбросил все вещи вверх(или в сундук)")
                      print("Я выбросил все вещи вверх(или в сундук)")
                      else
                              r.select(act[2])
                              r.dropUp(r.count())
                      tunnel.send("1 Я выбросил все вещи из слота "..act[2].." вверх(или в сундук)")
                      print("Я выбросил все вещи из слота "..act[2].." вверх(или в сундук)")
                      end
              else
                      r.select(act[2])
                      amountItems = r.count()
                      r.dropUp(act[3])
                      if act[3] > amountItems then
                              tunnel.send("1 Я выбросил "..amountItems.." вещь(-ей) из слота "..act[2].." вверх(или в сундук)")
                              print("Я выбросил "..amountItems.." вещь(-ей) из слота "..act[2].." вверх(или в сундук)")
                      else
                              tunnel.send("1 Я выбросил "..act[3].." вещь(-ей) из слота "..act[2].." вверх(или в сундук)")
                              print("Я выбросил "..act[3].." вещь(-ей) из слота "..act[2].." вверх(или в сундук)") 
                      end
              end
              amountItems = 0
              r.select(1)
      end
       
      function t.dropdn()
             local amountItems = 0
              act[2] = tonumber(act[2])
      	act[3] = tonumber(act[3])
              if act[3] == nil then
                      if act[2] == nil then
                              for d=1,val.inv_size do
                                      r.select(d)
                                      r.dropDown(r.count())
                              end
                      tunnel.send("1 Я выбросил все вещи вниз(или в сундук)")
                      print("Я выбросил все вещи вниз(или в сундук)")
                      else
                              r.select(act[2])
                              r.dropDown(r.count())
                      tunnel.send("1 Я выбросил все вещи из слота "..act[2].." вниз(или в сундук)")
                      print("Я выбросил все вещи из слота "..act[2].." вниз(или в сундук)")
                      end
              else
                      r.select(act[2])
                      amountItems = r.count()
                      r.dropDown(act[3])
                      if act[3] > amountItems then
                              tunnel.send("1 Я выбросил "..amountItems.." вещь(-ей) из слота "..act[2].." вниз(или в сундук)")
                              print("Я выбросил "..amountItems.." вещь(-ей) из слота "..act[2].." вниз(или в сундук)")
                      else
                              tunnel.send("1 Я выбросил "..act[3].." вещь(-ей) из слота "..act[2].." вниз(или в сундук)")
                              print("Я выбросил "..act[3].." вещь(-ей) из слота "..act[2].." вниз(или в сундук)") 
                      end
              end
              amountItems = 0
              r.select(1)
      end
       
      function t.suck()
              r.select(1)
              while r.suck()==true do
                      r.suck()
              end
              tunnel.send("1 Я забрал вещи перед собой(или из сундука)")
              print("Я забрал вещи перед собой(или из сундука)")
      end
       
      function t.suckup()
              r.select(1)
              while r.suckUp()==true do
                      r.suckUp()
              end
              tunnel.send("1 Я забрал вещи над собой(или из сундука)")
              print("Я забрал вещи над собой(или из сундука)")
      end
       
      function t.suckdn()
              r.select(1)
              while r.suckDown()==true do
                      r.suckDown()
              end
              tunnel.send("1 Я забрал вещи под собой(или из сундука)")
              print("Я забрал вещи под собой(или из сундука)")
      end
       
      function error()
              tunnel.send("1 Ошибка. Неправильная команда")
              print("Ошибка. Неправильная команда")
      end
       
      if obr then
              if event.ignore("modem_message",obr) then
                      print("Слушатель удалён")
              else
                      print("Слушатель не удалён")
              end
      end
       
      function _G.obr(_,_,_,_,_,com,_)
              local i = 1
              act = {}
              for word in string.gmatch(com, "%w+") do
                      --print(word)
                      act[i] = word
                      i = i + 1
              end
              print(act[1])
              print(act[2])
              if t[act[1]] then t[act[1]]()
              else error()
      end
      end
       
      event.listen("modem_message",obr)

     
    Старые версии программы:

    ver. 1.0

    Для сервера: http://pastebin.com/DB4va57x (для установки введите pastebin get DB4va57x server.lua)
    Для робота: http://pastebin.com/ZYNCQZx5 (для установки введите pastebin get ZYNCQZx5 robot.lua)

     
      Как видите программа требует больших материальных затрат, но она очень удобна в использовании (особенно в грифе игроков :)) и легка в освоении. Это далеко не последняя версия программы. Есть ещё планы разработки некоторых функций и их автоматизации (но о них в следующих версиях).
      Ждем замечаний, все баги будут устраняться. Если есть пожелания, обязательно пишите ;)
     
    • Нравится 4

  3. Саня! Ну ты с ног на голову не ставь все :D  СС крашил и лагал адски и ты это знаешь прекрасно. Крутой этому поспособствовал (сносу КК). Я сам не раз ловил строителей недоброжелателей нашего проекта, которые строили лагомашины на КК на глубине 5 блоков и быстро выскакивали из игры, чисто по логам и нагрузке на сервак, в Рейдкале было тогда куча народу и им примеры приводил, ники, проги и скрины.

     

    Зачем ты это пишешь, если сам прекрасно знаешь несостоятельность КК перед ОС. Вот зачем? Блеснуть на форуме и опять очернить Алекса? Четко же написано, почему был снесен КК в теме "Ураган", или как ее там. Нахрена ворочать прошлое.

     

    И открою тебе тайну. В последние дни жизни старого ИТ, когда строили уже большое здание ДЦ Крутой, я и Зеро, Крутой признался, что его апдейтилкой и вообще ОпенНетом и чатами Зерика на тот момент воспользовался только я (Крутой свой репозитарий логировал как-то). То есть только один человек скачал там какой-то инсталлер и установил на планшет себе базовый набор прог и прочего для опеннета на тот момент. На новом ИТ уже там повеселее было. Монстрик и Леха околачивались в лаборатории и еще там пару человек.

     

    И где я сказал, что ОпенНет не нужен. Я сказал, что не нужны проги, которые в цикле там крашатся и лагают адски в МиниМи ДЦ (лаба или как вы ее там называете).  ОпенНет  - это пара серверов и роутеры по миру, но никак не миллиард компов Асумонстрика и Лехи, которые никто не обслуживает.  Вот зачем все перевирать с ног на голову, объясни. Мол Алекс запретил Опенет и прочее. Что за вздор??? :smile14:  :facepalm:

    А что по поводу темы поста?  :)  Самой программы)


  4. Что мешает юзать вай-файки? Добавить роботу в переменные имя и пароль. Кто то (А) броадкастит "ЭТО ТЫ supername228?", робот (Б) отвечает send'ом "ДА ЭТО Я, ГОНИ ПАРОЛЬ", комп (А) отвечает send'ом "ВОТ: superpass100500" (Б) сендит поттверждение, после этого они обмениваются информацией сендами. (До этого записав адреса которые они получили от Эвента)

    А на сколько вай-файки протягивают сигнал? А в другие миры протягивают? А связанная плата да. Получается, если использовать вай-фай, то далеко от компа-сервера не уйдёт робот.


  5. Смотри: https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/scala/li/cil/oc/server/component/InternetCard.scala

    Если не учитывать время на обработку запроса самим модом, то всё упирается в скорость инет-соединения между запрашиваемым ресурсом и, собственно, самим хостом. В условиях отсутствия интернета (кратковременного или продолжительного) польза от инет-карты магическим образом пропадает, если только не включить запросы на локалхост в конфигах и затем уже посылать туда требования. Как мне кажется, программы не должны выходить за границы выполняемой среды, в данном случае — игры, делая исключения, когда это действительно необходимо, но не в этом случае. Особенно пугает возможная зависимость от какого-то левого хоста. Где гарантия, что софт там не будет совершать нежелательные действия, типа хранения передаваемых данных?

     

    В общем, от идеи инет-карты нужно отказываться, пока это можно обойти. Максимум — реализовать опциональной настройкой для программы, но, как мне кажется, гораздо проще поставить сервер в нужном измерении и уже к нему подключать очки, благо, что они работают между измерениями.

     

    В конце концов слабо́ систему сделать полностью внутриигровой, без использования сторонних и сомнительных средств? ;) B-)

    В общем я согласен с тобой, тоже пугает немного во-первых хранение передаваемой информции, во-вторых доступность ресурса обмена информацией. В интернет всегда всё упирается. Также в одиночке без интернета тестировать программу будет невозможно. Вариант со связанной платой наверное наиболее простой и надёжный, хоть и более затратный по энергии.


  6.  

    Последовательности из большого количества elseif можно заменять на таблицу функций. Сравни эти две реализации:

    if     a==1 then foo1()
    elseif a==2 then foo2()
    elseif a==3 then foo3()
    elseif a==4 then foo4()
    elseif a==5 then foo5()
    -- и т.д.
    else error()
    end
    

    и

    t={foo1,foo2,foo3,foo4,foo5 }
    if t[a] then t[a]()
    else error()
    end
    

    Приму к сведению, исправлю, спасибо)


  7. Звучит неплохо, можно попробовать, но я боюсь что скорость упадет, у меня же пакеты не большие отправляются, но часто.


  8. Не парьтесь с циклом, используйте robot.inventorySize() ;)

    Только что тоже нашёл эту функцию, раньше смотрел на Gamepedi'и, а сейчас посмотрел в документации самого OpenComputers! Спасибо!

     

    А что ты думаешь по поводу программы?  :)


  9. Для долгой и удобной работы связанная карта не подходит, она жрет много энергии.

    Размер инвентаря можно замерить циклом или вводить через очки.

     

    А так, для начала, очень даже неплохо.

    Вообще в дальнейшем у меня немного другой план, и там просто необходима связанная плата, т.к. нужна будет работа на большой дистанции. Без связанной платы робот не отойдёт далеко от сервера. Поэтому пока не знаю другого варианта, к сожалению.

     

    Да, про цикл думал, нужно сделать, согласен.

     

    Спасибо  :)


  10. Всем здравствуйте!

     

    Авторы: xMikhailx, WildOne.

    Вот решили попробовать свои силы, только начинаем, учимся, и не знаем, будет ли эта программа полезной для кого-нибудь, но надемся, что да, ведь пользователи - самая главная поддержка и помощь! Программа ещё далеко не готовая, и будет развиваться. Суть программы заключается в управлении роботом из ОС через очки (Terminal Glasses), на данный момент для реализации работы программы нужно достаточно много ресурсов, т.к. нужен сервер (компьютер) + робот (Tier 3) + Terminal Glasses Bridge + Terminal Glasses. Всё работает через связанную плату (Linked Card).

     

    Команды для управления роботом (вводятся с очками в чат, начиная с $$):

     

     

    Важно! Перед началом работы, в программе на роботе ввести число слотов инвентаря!
    Сюда -> local inv = 48 (вместо 48)

     

    $$clear - очищает интерфейс очков.

    $$gf [количество блоков] - движение вперёд на указанное [количество блоков], если не указано, движение на один блок.
    $$gfd [количество блоков] - аналогично предыдущему, но вскапывает блоки, встречающиеся на пути. (блок перед роботом и над роботом, чтобы человек мог пройти) 
    $$gb [количество блоков] - движение назад на указанное [количество блоков], если не указано, движение на один блок.
    $$tr - поворот направо на 90 градусов.
    $$tl - поворот налево на 90 градусов.
    $$ta - поворот на 180 градусов.
    $$up [количество блоков] - подъем на указанное [количество блоков], если не указано, движение на один блок.
    $$upd [количество блоков] - аналогично предыдущему, но вскапывает блоки, встречающиеся на пути.
    $$dn [количество блоков] - спуск на указанное [количество блоков], если не указано, движение на один блок.
    $$dnd [количество блоков] - аналогично предыдущему, но вскапывает блоки, встречающиеся на пути.
    $$use - использовать предмет перед роботом (правая кнопка мыши).
    $$useup - использовать предмет над роботом (правая кнопка мыши).
    $$usedn - использовать предмет под роботом (правая кнопка мыши).
    $$drop - выложить все вещи из инвентаря перед роботом (если перед роботом сундук, то в сундук).
    $$dropup - выложить все вещи из инвентаря над роботом (если над роботом сундук, то в сундук).
    $$dropdn - выложить все вещи из инвентаря под роботом (если под роботом сундук, то в сундук).
    $$suck - забрать все вещи перед роботом (если перед роботом сундук, то из сундук).
    $$suckup - забрать все вещи над роботом (если над роботом сундук, то из сундук).
    $$suckdn - забрать все вещи под роботом (если под роботом сундук, то из сундук).

     

     

     

    Схема такова:

    1). Компьютер (Tier 3) - это и есть сервер. Применение: компьютер соединить с Terminal Glasses Bridge'мФункция: принимает команды от очков -> передаёт на робота команды -> принимает ответы от робота -> выводит ответы на очки.

    Компоненты:

     

    Связанная плата - обязательно, вся работа основана на ней!
    Графическая карта (Tier 2)
    Интернет карта (по желанию, нужна для скачивания программы)

    Процессор (можно любой)
    Оперативная память (много не нужно, тестировалось всё на 2-ух картах Tier 2)
    Винчестер (любой)

     

     

    2). Робот (Tier 3) - рабочая сила  :) Функция: принимает команды от сервера -> выполняет команды -> отправляет ответ на сервер.

    Компоненты:

     

    Связанная плата - обязательно, вся работа основана на ней!

    Далее компоненты по желанию. 

     

     

     

    Сами программы:

    1. Для сервера: http://pastebin.com/DB4va57x (для установки введите pastebin get DB4va57x server.lua)
      Код:

      local event = require("event")
      local t = require("component").tunnel
      local g = require("component").openperipheral_bridge
      
      --FUNCTIONS
      
      function AddMsgBox(_,_,_,_,_,msgbox)
      	g.clear()
      	g.addBox(1,1,200,10,0xFFFFFF,0.3)
      	g.addText(5,2,"Робот: "..msgbox,0xFF0000)
      	g.sync()
      end
      
      function clear()
      	g.clear()
      	g.sync()
      end
      
      function glasscommand(_,_,nick,_,gcom)
      	if gcom == "clear" then clear()
      	else
      		print(gcom)
      		t.send(gcom)
      	end
      end
      
      event.listen("glasses_chat_command",glasscommand)
      event.listen("modem_message",AddMsgBox)
      

    2. Для робота: http://pastebin.com/ZYNCQZx5 (для установки введите pastebin get ZYNCQZx5 control.lua)
      Код:


      local event = require("event")
      local r = require("robot")
      local t = require("component").tunnel
      local inv = 48                        --размер инвентаря робота
      
      --===================================--
      --         MOVEMENT FUNCTIONS        --
      --===================================--
      
      function gf()
      	local c = 1
      	if act[2]==nil then act[2]=1 end
      	for c = 1,act[2] do
      		r.forward()
      	end
      	t.send("Я сдвинулся на "..act[2].." блок(ов) вперёд")
      	print("Я сдвинулся на "..act[2].." блок(ов) вперёд")
      	c = 1
      end
      
      function gfd()
      	local dblocks = 0
      	if act[2]==nil then act[2]=1 end
      	for c = 1,act[2] do
      		repeat
      			if r.swing() then dblocks = dblocks+1 end
      			if r.swingUp() then dblocks = dblocks+1 end
      		until r.detect()==false or r.detectUp()==false
      		r.forward()
      		if r.swingUp() then dblocks = dblocks+1 end
      	end
      	t.send("Я сдвинулся на "..act[2].." блок(ов) вперёд и вскопал "..dblocks.." блок(ов)")
      	print("Я сдвинулся на "..act[2].." блок(ов) вперёд и вскопал "..dblocks.." блок(ов)")
      	c = 1
      end
      
      function gb()
      	local c = 1
      	if act[2]==nil then act[2]=1 end
      	for c = 1,act[2] do
      		r.back()
      	end
      	t.send("Я сдвинулся на "..act[2].." блок(ов) назад")
      	print("Я сдвинулся на "..act[2].." блок(ов) назад")
      	c = 1
      end
      
      function up()
      	local c = 1
      	if act[2]==nil then act[2]=1 end
      	for c = 1,act[2] do
      		r.up()
      	end
      	t.send("Я поднялся на "..act[2].." блок(ов)")
      	print("Я поднялся на "..act[2].." блок(ов)")
      	c = 1
      end
      
      function upd()
      	local dblocks = 0
      	local c = 1
      	if act[2]==nil then act[2]=1 end
      	for c = 1,act[2] do
      		repeat
      			if r.swingUp() then dblocks = dblocks+1 end
      		until r.detectUp()==false
      		r.up()
      		if r.swingUp() then dblocks = dblocks+1 end
      	end
      	t.send("Я поднялся на "..act[2].." блок(ов) и вскопал "..dblocks.." блок(ов)")
      	print("Я поднялся на "..act[2].." блок(ов) и вскопал "..dblocks.." блок(ов)")
      	c = 1
      end
      
      function dn()
      	local c = 1
      	if act[2]==nil then act[2]=1 end
      	for c = 1,act[2] do
      		r.down()
      	end
      	t.send("Я спустился на "..act[2].." блок(ов)")
      	print("Я спустился на "..act[2].." блок(ов)")
      	c = 1
      end
      
      function dnd()
      	local dblocks = 0
      	local c = 1
      	if act[2]==nil then act[2]=1 end
      	for c = 1,act[2] do
      		repeat
      			if r.swingDown() then dblocks = dblocks+1 end
      		until r.detectDown()==false
      		r.down()
      	end
      	t.send("Я спустился на "..act[2].." блок(ов) и вскопал "..dblocks.." блок(ов)")
      	print("Я спустился на "..act[2].." блок(ов) и вскопал "..dblocks.." блок(ов)")
      	c = 1
      end
      
      function tr()
      	r.turnRight()
      	t.send("Я повернулся направо")
      	print("Я повернулся направо")
      end
      
      function tl()
      	r.turnLeft()
      	t.send("Я повернулся налево")
      	print("Я повернулся налево")
      end
      
      function ta()
      	r.turnAround()
      	t.send("Я повернулся на 180 градусов")
      	print("Я повернулся на 180 градусов")
      end
      
      --===================================--
      --            USE FUNCTIONS          --
      --===================================--
      
      function use()
      	r.use()
      	t.send("Я щёлкнул правой мыши перед собой")
      	print("Я щёлкнул правой мыши перед собой")
      end
      
      function useup()
      	r.useUp()
      	t.send("Я щёлкнул правой мыши над собой")
      	print("Я щёлкнул правой мыши над собой")
      end
      
      function usedn()
      	r.useDown()
      	t.send("Я щёлкнул правой мыши под собой")
      	print("Я щёлкнул правой мыши под собой")
      end
      
      --===================================--
      --        INVENTORY FUNCTIONS        --
      --===================================--
      
      function drop()
      	for d=1,inv do
      		r.select(d)
      		r.drop(r.count())
      	end
      	r.select(1)
      	t.send("Я выбросил все вещи перед собой(или в сундук)")
      	print("Я выбросил все вещи перед собой(или в сундук)")
      end
      
      function dropup()
      	for d=1,inv do
      		r.select(d)
      		r.dropUp(r.count())
      	end
      	r.select(1)
      	t.send("Я выбросил все вещи над собой(или в сундук)")
      	print("Я выбросил все вещи над собой(или в сундук)")
      end
      
      function dropdn()
      	for d=1,inv do
      		r.select(d)
      		r.dropDown(r.count())
      	end
      	r.select(1)
      	t.send("Я выбросил все вещи под собой(или в сундук)")
      	print("Я выбросил все вещи под собой(или в сундук)")
      end
      
      function suck()
      	r.select(1)
      	while r.suck()==true do
      		r.suck()
      	end
      	t.send("Я забрал вещи перед собой(или из сундука)")
      	print("Я забрал вещи перед собой(или из сундука)")
      end
      
      function suckup()
      	r.select(1)
      	while r.suckUp()==true do
      		r.suckUp()
      	end
      	t.send("Я забрал вещи над собой(или из сундука)")
      	print("Я забрал вещи над собой(или из сундука)")
      end
      
      function suckdn()
      	r.select(1)
      	while r.suckDown()==true do
      		r.suckDown()
      	end
      	t.send("Я забрал вещи под собой(или из сундука)")
      	print("Я забрал вещи под собой(или из сундука)")
      end
      
      function error()
      	t.send("Ошибка. Неправильная команда")
      	print("Ошибка. Неправильная команда")
      end
      function obr(_,_,_,_,_,com,_)
      	local i = 1
      	act = {}
      	for word in string.gmatch(com, "%w+") do
      		--print(word)
      		act[i] = word
      		i = i + 1
      	end
      	print(act[1])
      	print(act[2])
      	if act[1] == "gf" then gf()
      	elseif act[1] == "gfd" then gfd()
      	elseif act[1] == "tr" then tr()
      	elseif act[1] == "tl" then tl()
      	elseif act[1] == "ta" then ta()
      	elseif act[1] == "up" then up()
      	elseif act[1] == "dn" then dn()
      	elseif act[1] == "upd" then upd()
      	elseif act[1] == "dnd" then dnd()
      	elseif act[1] == "gb" then gb()
      	elseif act[1] == "use" then use()
      	elseif act[1] == "useup" then useup()
      	elseif act[1] == "usedn" then usedn()
      	elseif act[1] == "drop" then drop()
      	elseif act[1] == "dropup" then dropup()
      	elseif act[1] == "dropdn" then dropdn()
      	elseif act[1] == "suck" then suck()
      	elseif act[1] == "suckup" then suckup()
      	elseif act[1] == "suckdn" then suckdn()
      	else error()
      end
      end
      
      event.listen("modem_message",obr)

    На самом деле главное - то, что мы старались делая программу и получили опыт, мы этому очень рады!

    Критика, поддержка, пожелания, предложения, VIP-статус - всё принимается!  :D

    • Нравится 6
×
×
  • Создать...