Lgmrszd 390 Опубликовано: 7 июня, 2015 Автокрафт в МЭ посредством OpenComputers. Пока Алекс переворачивает сервер с ног на голову, мне вдруг в голову стукнула мысль, что неплохо будет сделать автокрафт в AE, но без лагодрома (@artem211, привет). Короче, свой автокрафт с компами и роботами. Пока что программа не готова для всеобщего обозрения, но скоро она будет доведена до нормального уровня. Да-да, я видел систему автокрафта Алекса, но всё-таки матрица из over9000 сундуков -- неудобно. Как это работает: Комп с помощью таблицы рецептов и апгрейда-базы данных настраивает МЭ-интерфейс Робот берёт из интерфейса предметы и крафтит то, что нужно ... И... всё, собственно Что моя прога (мои проги -- на комп и робота) умеет: Комп -- настраивать МЭ-интерфейс по рецепту, сохранённому локально при идеальных условиях (всего хватает). Робот -- крафтить по рецепту, который сохранён на роботе локально, и опять же, при идеальных условиях. Что она не умеет: Защита от дурака двойной крафт (например, нужен факел, а палок не хватает) Пересылка рецепта с компа на робота. О третьем отдельно. Мне, собственно, нужна помощь тех, кто хорошо разбирается в сетях. Мне нужно переслать таблицу. Внутри таблицы. Внутри ещё одной таблицы! Да, я говнокодер. О развитии проги буду сообщать в эту тему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 7 июня, 2015 Ну, сериализацию юзай для таблиц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Lgmrszd Автор темы 390 Опубликовано: 7 июня, 2015 Ну, сериализацию юзай для таблиц. А я же тебя хотел спросить в xmpp, да ты убежал. У меня же в таблице таблица! А в ней ещё одна! С этим сериализация не справится! Или справится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 7 июня, 2015 (изменено) Или справится? Попробовал бы сначала, или хотя бы доки почитал http://ocdoc.cil.li/api:serialization?s[]=serialize Изменено 7 июня, 2015 пользователем Krutoy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asummonster 592 Опубликовано: 7 июня, 2015 А просто по модема пересылать идшники?=)(Я дурак и вообще не юзаю таблицы, по крайней мере в других таблицах, которые находятся в таблицах.)Ты не можешь просто modem.broadcast(port, "Факел", 0, 0, 0, 0, уголь, 0, 0, палка, 0)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 7 июня, 2015 Если юзается АЕ, то это уже дороговатая система. И АЕ может и не быть в сборке какой-то где-то, а если он там есть, то как правило, есть и автокрафт. Это только безумный Алекс автокрафты отключает , чтобы мы начинали все вместе включать мозги и придумали, как автокрафтить роботом. Уходи от АЕ. Сундук и робот есть всегда! Лучше придумать, как роботом брать из АЕ нужный предмет и возить куда-то, например стержни в реактор или семена на огород. Не через шину с сундуком, а именно через запрос к базе сервера (ПК, который может получить доступ к хранилищу АЕ и дать АЕ команду что-то выплюнуть роботу, айтем или целый набор) Естественно, так же само ты можешь и автокрафт делать, сразу по базе и проверяй свой факел. Если палок нет в АЕ, то и уголь АЕ тебе не плюнет для робота. Сервер сразу проверяет, можно ли такой предмет скрафтить или нет и то количество, которое нужно юзеру. ПК по идее, имеет всю инфу того, что есть в АЕ, с ней и работай. Можно даже роботу, по идее, сказать, мол, эй, дружок, езжай-ка наруби-ка дров сначала, да печку растопи, потом я тебе и рецепт для пирожников дам. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 7 июня, 2015 Если юзается АЕ, то это уже дороговатая система. И АЕ может и не быть в сборке какой-то где-то. Уходи от АЕ. Сундук и робот есть всегда! Это специально для АЕ автокрафт, так как он будет отключен на ИТ, а на Мир Сундуков попросту может не хватить места. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 7 июня, 2015 Это специально для АЕ автокрафт, так как он будет отключен на ИТ, а на Мир Сундуков попросту может не хватить места. Это то да, согласен. Сундуков может и не хватить, если все рецепты майна забить. Но нам же не это важно, а сама идея. Как себе из 50-100 видов айтемов что-то автоматически крафтить самое часто нужное. Что такое сундук, по идее, для сервера - табла с индексами, да и еще с одинаковыми айтемами в нашем случае. Что оно лежит на диске, что в сундучаре, разницы там не много, наверно. Это все лишь какие-то таблицы, в которых записаны теги айтема и его количество. ГУИ только работает по иному, вот и вся разница, как по мне. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Lgmrszd Автор темы 390 Опубликовано: 7 июня, 2015 А просто по модема пересылать идшники?=)(Я дурак и вообще не юзаю таблицы, по крайней мере в других таблицах, которые находятся в таблицах.)Ты не можешь просто modem.broadcast(port, "Факел", 0, 0, 0, 0, уголь, 0, 0, палка, 0)?Ага, конечно.Во-первых, разные предметы иногда имеют одинаковые id-шники, но разные теги (которые почему-то определяются как damage) Например, "IC2:itemCable" - это и медный провод, и золотой в изоляции. Хотя да, что-то я затупил, роботу не нужно знать рецепт, если в интерфейсе всё разложено. Если юзается АЕ, то это уже дороговатая система. И АЕ может и не быть в сборке какой-то где-то, а если он там есть, то как правило, есть и автокрафт. Это только безумный Алекс автокрафты отключает , чтобы мы начинали все вместе включать мозги и придумали, как автокрафтить роботом. Уходи от АЕ. Сундук и робот есть всегда! Лучше придумать, как роботом брать из АЕ нужный предмет и возить куда-то, например стержни в реактор или семена на огород. Не через шину с сундуком, а именно через запрос к базе сервера (ПК, который может получить доступ к хранилищу АЕ и дать АЕ команду что-то выплюнуть роботу, айтем или целый набор) Естественно, так же само ты можешь и автокрафт делать, сразу по базе и проверяй свой факел. Если палок нет в АЕ, то и уголь АЕ тебе не плюнет для робота. Сервер сразу проверяет, можно ли такой предмет скрафтить или нет и то количество, которое нужно юзеру. ПК по идее, имеет всю инфу того, что есть в АЕ, с ней и работай. Можно даже роботу, по идее, сказать, мол, эй, дружок, езжай-ка наруби-ка дров сначала, да печку растопи, потом я тебе и рецепт для пирожников дам. Как сказал Фингер, эта прога специально для сервера.К тому же автокрафт роботом и компом гораздо дешевле, чем "родные" шаблоны, процессоры создания и сопроцессоры всякие, которые к тому же каналы лишние занимают. Пара строк или пара кристаллов - решать не мне. Насчёт пирожков... Да, возможно, я "научу" робота не только крафтить, но и, к примеру, ездить к дробилке. Опять же, эти шины всякие занимают каналы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 7 июня, 2015 (изменено) --PC local serialization = require("serialization") local m = require("component").modem m.open(229) -- pc port local table = { a = {1,2,3,4, { 1, 1, 1}}, b = {1,2,3,"a",1} } local ser = serialization.serialize(table) local pc = component.modem.address m.broadcast(228,"secretPassWord111") local robot local _, _, from, _, _, message = event.pull("modem_message") if message == "secretPassWord111" then robot = from else robot = "access denied" end m.send(robot,228,ser) print("Отправлено!") -- ROBOT local serialization = require("serialization") local m = require("component").modem m.open(228) -- robot port m.broadcast(229,"secretPassWord111") local pc local _, _, from, _, _, message = event.pull("modem_message") if message == "secretPassWord111" then pc = from else pc = "access denied" end local _, _, from, _, _, message = event.pull("modem_message") local table = serialization.unserialize(message) print("Таблица получена!") Do not mention it P.S Потом могу помочь с интерфейсиком. (переводится как не стоит благодарности) Изменено 7 июня, 2015 пользователем LeshaInc 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Lgmrszd Автор темы 390 Опубликовано: 8 июня, 2015 --PC local serialization = require("serialization") local m = require("component").modem m.open(229) -- pc port local table = { a = {1,2,3,4, { 1, 1, 1}}, b = {1,2,3,"a",1} } local ser = serialization.serialize(table) local pc = component.modem.address m.broadcast(228,"secretPassWord111") local robot local _, _, from, _, _, message = event.pull("modem_message") if message == "secretPassWord111" then robot = from else robot = "access denied" end m.send(robot,228,ser) print("Отправлено!") -- ROBOT local serialization = require("serialization") local m = require("component").modem m.open(228) -- robot port m.broadcast(229,"secretPassWord111") local pc local _, _, from, _, _, message = event.pull("modem_message") if message == "secretPassWord111" then pc = from else pc = "access denied" end local _, _, from, _, _, message = event.pull("modem_message") local table = serialization.unserialize(message) print("Таблица получена!") Do not mention it P.S Потом могу помочь с интерфейсиком. (переводится как не стоит благодарности) Спасибо, но я уже придумал другой способ ¯\_(ツ)_/¯ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 8 июня, 2015 Эхх. Ладно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 8 июня, 2015 (изменено) Это то да, согласен. Сундуков может и не хватить, если все рецепты майна забить. Но нам же не это важно, а сама идея. Как себе из 50-100 видов айтемов что-то автоматически крафтить самое часто нужное. Что такое сундук, по идее, для сервера - табла с индексами, да и еще с одинаковыми айтемами в нашем случае. Что оно лежит на диске, что в сундучаре, разницы там не много, наверно. Это все лишь какие-то таблицы, в которых записаны теги айтема и его количество. ГУИ только работает по иному, вот и вся разница, как по мне. Там лежат не теги, а объекты Item от которого наследуються другие ItemStone, это для примера, так что теоретически сундук с вещами может с ними делать все что угодно. Изменено 8 июня, 2015 пользователем NEO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 8 июня, 2015 Там лежат не теги, а объекты Item от которого наследуються другие ItemStone, это для примера, так что теоретически сундук с вещами может с ними делать все что угодно. не понял тебя. Сундук с вещами может делать с ними (с КЕМ?) все что угодно? Что можете делать сундук? Переведи. П.С. У всех лончер отпал? У меня его нет в процессах даже. Он просто закрывается после авторизации? Это так у всех сейчас? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asummonster 592 Опубликовано: 8 июня, 2015 не понял тебя. Сундук с вещами может делать с ними (с КЕМ?) все что угодно? Почти.У сундука очень интересный апи.он может уничтожать предметы, перекладывать их и т.п. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 8 июня, 2015 Почти.У сундука очень интересный апи.он может уничтожать предметы, перекладывать их и т.п. Чего чего? У сундука АПИ? Это где? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 8 июня, 2015 Чего чего? У сундука АПИ? Это где? Ерунду он наговорил Если я правильно понял, имелся в виду драйвер от OpenPeripherals для сундука. Но причём здесь это — один визер ведает. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Lgmrszd Автор темы 390 Опубликовано: 8 июня, 2015 Сделал конвертацию таблицы рецепта в строку, отдачу команды компом роботу. Завтра буду искать баги, после чего выложу в эту тему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Lgmrszd Автор темы 390 Опубликовано: 9 июня, 2015 (изменено) Итак, первая версия программы готова! Для её работы нужен стандартный компьютер с беспроводным модемом, а также робот с модемом и апгрейдами: верстак и контроллер инвентаря. Затем ставим МЭ-интерфейс, адаптер, зарядник и робота как на картинке: После этого берём апгрейд-базу данных и настраиваем её на те предметы, которые используются в крафте (пока что у меня только один рецепт): Базу кладём в адаптер. Затем на компьютер закидываем два файла: ME.lua и recipes.lua ME.lua local component=require('component') local event=require('event') local interface=component.me_interface local base=component.database local modem=component.modem local recipes=require('recipes') local robAddr="d9c29b1f-d308-4fb7-bf69-d7291346cef6" local baseSize=81 modem.open(1337) function readyInterface(name) needItems=recipes[name] for i=1,#needItems do needItem=needItems[i] print('Recipe item number '..tostring(i)..' is '..tostring(needItem['name'])..' : '..tostring(needItem['tag'])) n=0 found=false while not(found) and n<baseSize do n=n+1 local baseItem=base.get(n) if baseItem then print('Base item number '..tostring(n)..' is '..tostring(baseItem['name'])..' : '..tostring(baseItem['damage'])) if needItem['name']==baseItem['name'] and needItem['tag']==baseItem['damage'] then print('Was found!') found=true interface.setInterfaceConfiguration(i,base.address,n) end end end end end function convertRecipe(recipe) line='' for n=1,#recipe do for i=1,#recipe[n]['slots'] do line=line..tostring(recipe[n]['slots'][i]) end if n~=#recipe then line=line..':' end end return line end readyInterface('IC2:itemPartCircuit') r=convertRecipe(recipes['IC2:itemPartCircuit']) cont=true repeats=0 while cont do repeats=repeats+1 modem.send(robAddr,1337,r) _, _, sender, _, _, text=event.pull(3,'modem_message') if sender==robAddr and text=='ok' then print('Робот принял заказ') os.sleep(0.5) _, _, sender, _, _, text=event.pull(30,'modem_message') print(text) if sender==robAddr and text=='crafted' then print('Предмет создан') elseif sender==robAddr and text=='error' then print('Ошибка во время создания') end cont=false end if repeats==5 then cont=false print('Ошибка: робот не работает') end end modem.close() recipes.lua recipes={} recipes['IC2:itemPartCircuit']={ {name='IC2:itemCable', tag=0, slots={1,2,3,7,8,9} }, {name='minecraft:redstone', tag=0, slots={4,6} }, {name='IC2:itemPlates', tag=4, slots={5} } } return recipes На робота скидываем файл crafter.lua : local component=require('component') local event=require('event') local inv_c=component.inventory_controller local modem=component.modem local robot=require('robot') local crafting=component.crafting local owner="5e07230a-17bb-4c20-b518-a2986093f86f" modem.open(1337) function craft(recipe) n=1 for i=1,#recipe do s=string.sub(recipe,i,i) if ':'==s then n=n+1 else s=tonumber(s) if s>3 and s<7 then s=s+1 elseif s>6 then s=s+2 end robot.select(s) inv_c.suckFromSlot(0,n) end end robot.select(4) toReturn=crafting.craft() robot.dropDown() return toReturn end a='123789:46:5' while true do _, _, sender, _, _, text=event.pull(2,'modem_message') if sender==owner then print('receive, ',text) os.sleep(0.5) modem.send(owner,1337,'ok') print('send ok') os.sleep(0.5) if craft(text) then modem.send(owner,1337,'crafted') else modem.send(owner,1337,'error') end end end craft(a) В файле ME.lua измените переменные: robAddr -- адрес модема робота, baseSize -- размер базы. В файле crafter.lua измените переменную owner -- адрес модема компа. Приступим к запуску. На роботе запустим файл crafter.lua, после чего наш раб робот будет ждать сообщения. После этого на компе запустим файл ME.lua. Сейчас программа настроена так, чтобы сделать одну базовую электросхему IC2. Данная версия не проверяет МЭ сеть на наличие предметов, поэтому положите их заранее. Если вы всё сделали правильно и я не допустил косяков при написании этого сообщения, в вашей МЭ сети появится одна электросхема. Тестируйте на здоровье! Изменено 9 июня, 2015 пользователем MineUbuntu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asummonster 592 Опубликовано: 9 июня, 2015 Итак, первая версия программы готова!Для её работы нужен стандартный компьютер с беспроводным модемом, а также робот с модемом и апгрейдами: верстак и контроллер инвентаря. Затем ставим МЭ-интерфейс, адаптер, зарядник и робота как на картинке: После этого берём апгрейд-базу данных и настраиваем её на те предметы, которые используются в крафте (пока что у меня только один рецепт): Базу кладём в адаптер. Затем на компьютер закидываем два файла: ME.lua и recipes.lua ME.lua local component=require('component') local event=require('event') local interface=component.me_interface local base=component.database local modem=component.modem local recipes=require('recipes') local robAddr="d9c29b1f-d308-4fb7-bf69-d7291346cef6" local baseSize=81 modem.open(1337) function readyInterface(name) needItems=recipes[name] for i=1,#needItems do needItem=needItems[i] print('Recipe item number '..tostring(i)..' is '..tostring(needItem['name'])..' : '..tostring(needItem['tag'])) n=0 found=false while not(found) and n<baseSize do n=n+1 local baseItem=base.get(n) if baseItem then print('Base item number '..tostring(n)..' is '..tostring(baseItem['name'])..' : '..tostring(baseItem['damage'])) if needItem['name']==baseItem['name'] and needItem['tag']==baseItem['damage'] then print('Was found!') found=true interface.setInterfaceConfiguration(i,base.address,n) end end end end end function convertRecipe(recipe) line='' for n=1,#recipe do for i=1,#recipe[n]['slots'] do line=line..tostring(recipe[n]['slots'][i]) end if n~=#recipe then line=line..':' end end return line end readyInterface('IC2:itemPartCircuit') r=convertRecipe(recipes['IC2:itemPartCircuit']) cont=true repeats=0 while cont do repeats=repeats+1 modem.send(robAddr,1337,r) _, _, sender, _, _, text=event.pull(3,'modem_message') if sender==robAddr and text=='ok' then print('Робот принял заказ') os.sleep(0.5) _, _, sender, _, _, text=event.pull(30,'modem_message') print(text) if sender==robAddr and text=='crafted' then print('Предмет создан') elseif sender==robAddr and text=='error' then print('Ошибка во время создания') end cont=false end if repeats==5 then cont=false print('Ошибка: робот не работает') end end modem.close() recipes.lua recipes={} recipes['IC2:itemPartCircuit']={ {name='IC2:itemCable', tag=0, slots={1,2,3,7,8,9} }, {name='minecraft:redstone', tag=0, slots={4,6} }, {name='IC2:itemPlates', tag=4, slots={5} } } return recipes На робота скидываем файл crafter.lua : local component=require('component') local event=require('event') local inv_c=component.inventory_controller local modem=component.modem local robot=require('robot') local crafting=component.crafting local owner="5e07230a-17bb-4c20-b518-a2986093f86f" modem.open(1337) function craft(recipe) n=1 for i=1,#recipe do s=string.sub(recipe,i,i) if ':'==s then n=n+1 else s=tonumber(s) if s>3 and s<7 then s=s+1 elseif s>6 then s=s+2 end robot.select(s) inv_c.suckFromSlot(0,n) end end robot.select(4) toReturn=crafting.craft() robot.dropDown() return toReturn end a='123789:46:5' while true do _, _, sender, _, _, text=event.pull(2,'modem_message') if sender==owner then print('receive, ',text) os.sleep(0.5) modem.send(owner,1337,'ok') print('send ok') os.sleep(0.5) if craft(text) then modem.send(owner,1337,'crafted') else modem.send(owner,1337,'error') end end end craft(a) В файле ME.lua измените переменные: robAddr -- адрес модема робота, baseSize -- размер базы. В файле crafter.lua измените переменную owner -- адрес модема компа. Приступим к запуску. На роботе запустим файл crafter.lua, после чего наш раб робот будет ждать сообщения. После этого на компе запустим файл ME.lua. Сейчас программа настроена так, чтобы сделать одну базовую электросхему IC2. Данная версия не проверяет МЭ сеть на наличие предметов, поэтому положите их заранее. Если вы всё сделали правильно и я не допустил косяков при написании этого сообщения, в вашей МЭ сети появится одна электросхема. Тестируйте на здоровье! Класс! Только меня смутила переменная robAddr...Почему бы не просто computer.address? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах