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

OC+AE2, или автокрафт по-компьютерному

Рекомендуемые сообщения

Автокрафт в МЭ посредством OpenComputers.

Пока Алекс переворачивает сервер с ног на голову, мне вдруг в голову стукнула мысль, что неплохо будет сделать автокрафт в AE, но без лагодрома (@artem211, привет). Короче, свой автокрафт с компами и роботами. Пока что программа не готова для всеобщего обозрения, но скоро она будет доведена до нормального уровня.

Да-да, я видел систему автокрафта Алекса, но всё-таки матрица из over9000 сундуков -- неудобно.

Как это работает:

  • Комп с помощью таблицы рецептов и апгрейда-базы данных настраивает МЭ-интерфейс
  • Робот берёт из интерфейса предметы и крафтит то, что нужно
  • ...
  • И... всё, собственно

Что моя прога (мои проги -- на комп и робота) умеет:

  • Комп -- настраивать МЭ-интерфейс по рецепту, сохранённому локально при идеальных условиях (всего хватает).
  • Робот -- крафтить по рецепту, который сохранён на роботе локально, и опять же, при идеальных условиях.

Что она не умеет:

  • Защита от дурака
  • двойной крафт (например, нужен факел, а палок не хватает)
  • Пересылка рецепта с компа на робота.

О третьем отдельно. Мне, собственно, нужна помощь тех, кто хорошо разбирается в сетях. Мне нужно переслать таблицу. Внутри таблицы. Внутри ещё одной таблицы! Да, я говнокодер.

О развитии проги буду сообщать в эту тему.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, сериализацию юзай для таблиц.

А я же тебя хотел спросить в xmpp, да ты убежал. У меня же в таблице таблица! А в ней ещё одна! С этим сериализация не справится! Или справится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Или справится?

Попробовал бы сначала, или хотя бы доки почитал

http://ocdoc.cil.li/api:serialization?s[]=serialize

Изменено пользователем Krutoy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А просто по модема пересылать идшники?=)(Я дурак и вообще не юзаю таблицы, по крайней мере в других таблицах, которые находятся в таблицах.)Ты не можешь просто modem.broadcast(port, "Факел", 0, 0, 0, 0, уголь, 0, 0, палка, 0)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если юзается АЕ, то это уже дороговатая система.

И АЕ может и не быть в сборке какой-то где-то, а если он там есть, то как правило, есть и автокрафт. Это только безумный Алекс автокрафты отключает :D , чтобы мы начинали все вместе включать мозги и придумали, как автокрафтить роботом. Уходи от АЕ. Сундук и робот есть всегда!

 

Лучше придумать, как роботом брать из АЕ нужный предмет и возить куда-то, например стержни в реактор или семена на огород. Не через шину с сундуком, а именно через запрос к базе сервера (ПК, который может получить доступ к хранилищу АЕ и дать АЕ команду что-то выплюнуть роботу, айтем или целый набор) Естественно, так же само ты можешь и автокрафт делать, сразу по базе и проверяй свой факел. Если палок нет в АЕ, то и уголь АЕ тебе не плюнет для робота. Сервер сразу проверяет, можно ли такой предмет скрафтить или нет и то количество, которое нужно юзеру. ПК по идее, имеет всю инфу того, что есть в АЕ, с ней и работай.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если юзается АЕ, то это уже дороговатая система.

И АЕ может и не быть в сборке какой-то где-то. Уходи от АЕ. Сундук и робот есть всегда!

Это специально для АЕ автокрафт, так как он будет отключен на ИТ, а на Мир Сундуков попросту может не хватить места.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это специально для АЕ автокрафт, так как он будет отключен на ИТ, а на Мир Сундуков попросту может не хватить места.

Это то да, согласен. Сундуков может и не хватить, если все рецепты майна забить. Но нам же не это важно, а сама идея. Как себе из 50-100 видов айтемов что-то автоматически крафтить самое часто нужное.  

 

Что такое сундук, по идее, для сервера - табла  с индексами, да и еще с одинаковыми айтемами в нашем случае. Что оно лежит на диске, что в сундучаре, разницы там не много, наверно. Это все лишь какие-то таблицы, в которых записаны теги айтема и его количество. ГУИ только работает по иному, вот и вся разница, как по мне.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А просто по модема пересылать идшники?=)(Я дурак и вообще не юзаю таблицы, по крайней мере в других таблицах, которые находятся в таблицах.)Ты не можешь просто modem.broadcast(port, "Факел", 0, 0, 0, 0, уголь, 0, 0, палка, 0)?

Ага, конечно.

Во-первых, разные предметы иногда имеют одинаковые id-шники, но разные теги (которые почему-то определяются как damage)

Например, "IC2:itemCable" - это и медный провод, и золотой в изоляции. Хотя да, что-то я затупил, роботу не нужно знать рецепт, если в интерфейсе всё разложено.

Если юзается АЕ, то это уже дороговатая система.

И АЕ может и не быть в сборке какой-то где-то, а если он там есть, то как правило, есть и автокрафт. Это только безумный Алекс автокрафты отключает :D , чтобы мы начинали все вместе включать мозги и придумали, как автокрафтить роботом. Уходи от АЕ. Сундук и робот есть всегда!

 

Лучше придумать, как роботом брать из АЕ нужный предмет и возить куда-то, например стержни в реактор или семена на огород. Не через шину с сундуком, а именно через запрос к базе сервера (ПК, который может получить доступ к хранилищу АЕ и дать АЕ команду что-то выплюнуть роботу, айтем или целый набор) Естественно, так же само ты можешь и автокрафт делать, сразу по базе и проверяй свой факел. Если палок нет в АЕ, то и уголь АЕ тебе не плюнет для робота. Сервер сразу проверяет, можно ли такой предмет скрафтить или нет и то количество, которое нужно юзеру. ПК по идее, имеет всю инфу того, что есть в АЕ, с ней и работай.

 

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

Как сказал Фингер, эта прога специально для сервера.

К тому же автокрафт роботом и компом гораздо дешевле, чем "родные" шаблоны, процессоры создания и сопроцессоры всякие, которые к тому же каналы лишние занимают.

Пара строк или пара кристаллов - решать не мне.

Насчёт пирожков... Да, возможно, я "научу" робота не только крафтить, но и, к примеру, ездить к дробилке. Опять же, эти шины всякие занимают каналы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

--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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

--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 Потом могу помочь с интерфейсиком. ;)

(переводится как не стоит благодарности)

Спасибо, но я уже придумал другой способ ¯\_(ツ)_/¯

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это то да, согласен. Сундуков может и не хватить, если все рецепты майна забить. Но нам же не это важно, а сама идея. Как себе из 50-100 видов айтемов что-то автоматически крафтить самое часто нужное.

 

Что такое сундук, по идее, для сервера - табла с индексами, да и еще с одинаковыми айтемами в нашем случае. Что оно лежит на диске, что в сундучаре, разницы там не много, наверно. Это все лишь какие-то таблицы, в которых записаны теги айтема и его количество. ГУИ только работает по иному, вот и вся разница, как по мне.

Там лежат не теги, а объекты Item от которого наследуються другие ItemStone, это для примера, так что теоретически сундук с вещами может с ними делать все что угодно.

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Там лежат не теги, а объекты Item от которого наследуються другие ItemStone, это для примера, так что теоретически сундук с вещами может с ними делать все что угодно.

не понял тебя. Сундук с вещами может делать с ними (с КЕМ?) все что угодно?  Что можете делать сундук? Переведи.

 

 

П.С. У всех лончер отпал?  У меня его нет в процессах даже. Он просто закрывается  после авторизации? Это так у всех сейчас?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
не понял тебя. Сундук с вещами может делать с ними (с КЕМ?) все что угодно?

Почти.У сундука очень интересный апи.он может уничтожать предметы, перекладывать их и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Почти.У сундука очень интересный апи.он может уничтожать предметы, перекладывать их и т.п.

Чего чего? У сундука АПИ? Это где?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Чего чего? У сундука АПИ? Это где?

Ерунду он наговорил :)

Если я правильно понял, имелся в виду драйвер от OpenPeripherals для сундука. Но причём здесь это — один визер ведает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сделал конвертацию таблицы рецепта в строку, отдачу команды компом роботу. Завтра буду искать баги, после чего выложу в эту тему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Итак, первая версия программы готова!

Для её работы нужен стандартный компьютер с беспроводным модемом, а также робот с модемом и апгрейдами: верстак и контроллер инвентаря.

Затем ставим МЭ-интерфейс, адаптер, зарядник и робота как на картинке:

BcwcOPd.png

После этого берём апгрейд-базу данных и настраиваем её на те предметы, которые используются в крафте (пока что у меня только один рецепт):5oBSv9j.png

Базу кладём в адаптер.

Затем на компьютер закидываем два файла: 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. Данная версия не проверяет МЭ сеть на наличие предметов, поэтому положите их заранее.

Если вы всё сделали правильно и я не допустил косяков при написании этого сообщения, в вашей МЭ сети появится одна электросхема. Тестируйте на здоровье!

Изменено пользователем MineUbuntu

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Итак, первая версия программы готова!

Для её работы нужен стандартный компьютер с беспроводным модемом, а также робот с модемом и апгрейдами: верстак и контроллер инвентаря.

Затем ставим МЭ-интерфейс, адаптер, зарядник и робота как на картинке:

BcwcOPd.png

После этого берём апгрейд-базу данных и настраиваем её на те предметы, которые используются в крафте (пока что у меня только один рецепт):5oBSv9j.png

Базу кладём в адаптер.

Затем на компьютер закидываем два файла: 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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...