xMikhailx
-
Публикации
16 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем xMikhailx
-
-
"Очкоробот"

Нормальное рабочее название))))
Очень плохо звучит)
-
Предлагаю устроить соревнование по скорости
грифасбора ресурсов между Байтом и Очкороботом.Не называй, пожалуйста, его Очкоробот, ладно?
(Мы потом придумаем что-нибудь..)А то, звучит плохо) Да и мы не играем на дримсе, лайта ждём.
-
Всем здравствуйте!OC - Управление роботом ver. 2.0Авторы: xMikhailx, WildOne.
Вышло обновление нашей программы!!!
Как и ранее, суть программы заключается в управлении роботом из ОС через очки (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)Винчестер (любой)Вот наш пример сборки компьютера:
2). Робот (Tier 3) - рабочая сила
Функция: принимает команды от сервера -> выполняет команды -> отправляет ответ на сервер.
Компоненты:Связанная плата - обязательно, вся работа основана на ней!Контроллер инвентаря - обязательно.Редстоун карта - обязательно, не ниже Tier 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) -
Для робота: 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
-
Для сервера: http://pastebin.com/2kH0eNeF (для установки введите pastebin get 2kH0eNeF server.lua)
-
Саня! Ну ты с ног на голову не ставь все
СС крашил и лагал адски и ты это знаешь прекрасно. Крутой этому поспособствовал (сносу КК). Я сам не раз ловил строителей недоброжелателей нашего проекта, которые строили лагомашины на КК на глубине 5 блоков и быстро выскакивали из игры, чисто по логам и нагрузке на сервак, в Рейдкале было тогда куча народу и им примеры приводил, ники, проги и скрины.Зачем ты это пишешь, если сам прекрасно знаешь несостоятельность КК перед ОС. Вот зачем? Блеснуть на форуме и опять очернить Алекса? Четко же написано, почему был снесен КК в теме "Ураган", или как ее там. Нахрена ворочать прошлое.
И открою тебе тайну. В последние дни жизни старого ИТ, когда строили уже большое здание ДЦ Крутой, я и Зеро, Крутой признался, что его апдейтилкой и вообще ОпенНетом и чатами Зерика на тот момент воспользовался только я (Крутой свой репозитарий логировал как-то). То есть только один человек скачал там какой-то инсталлер и установил на планшет себе базовый набор прог и прочего для опеннета на тот момент. На новом ИТ уже там повеселее было. Монстрик и Леха околачивались в лаборатории и еще там пару человек.
И где я сказал, что ОпенНет не нужен. Я сказал, что не нужны проги, которые в цикле там крашатся и лагают адски в МиниМи ДЦ (лаба или как вы ее там называете). ОпенНет - это пара серверов и роутеры по миру, но никак не миллиард компов Асумонстрика и Лехи, которые никто не обслуживает. Вот зачем все перевирать с ног на голову, объясни. Мол Алекс запретил Опенет и прочее. Что за вздор???

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

В общем я согласен с тобой, тоже пугает немного во-первых хранение передаваемой информции, во-вторых доступность ресурса обмена информацией. В интернет всегда всё упирается. Также в одиночке без интернета тестировать программу будет невозможно. Вариант со связанной платой наверное наиболее простой и надёжный, хоть и более затратный по энергии.
-
Последовательности из большого количества 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Приму к сведению, исправлю, спасибо)
-
Звучит неплохо, можно попробовать, но я боюсь что скорость упадет, у меня же пакеты не большие отправляются, но часто.
-
Юзай мост от Леши и Монстра) Он круче связанной платы: можно между серверами передавать сообщения))
Что-то не смог найти этот мост, кинь ссылку)
-
Не парьтесь с циклом, используйте robot.inventorySize()

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

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

-
Да, конечно инвентаря, случайно описался) А что ты думаешь по поводу программы?
-
Всем здравствуйте!
Авторы: 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) - рабочая сила
Функция: принимает команды от сервера -> выполняет команды -> отправляет ответ на сервер.Компоненты:
Связанная плата - обязательно, вся работа основана на ней!
Далее компоненты по желанию.
Сами программы:
- Для сервера: 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) - Для робота: 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-статус - всё принимается!

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

Управление роботом через Terminal Glasses
в Роботы
Опубликовано: