Перейти к публикации

В ближайшее время постараюсь разобраться с картой сервера/ЛК/бб кодами

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

Таблица лидеров


Популярные публикации

Отображаются публикации с наибольшей репутацией начиная с 13.02.2019 во всех областях

  1. 4 балла
    Робот может двигаться, пора добавить функцию сканирования породы и калибровки компаса. (Пока тестировал, обнаружил баг работы с зачарованными инструментами, пришлось немного переделать функцию step() - теперь после неудачного свинга, робот дополнительно проверяет наличие блока. Можно будет оставить, даже когда разрабы это исправят) Чтобы отфильтровать блоки по плотности, надо получить плотность нужных блоков с учетом шумов. На расстоянии x8 z8 y1 от геосканера, максимальная плотность бедрока равна -0.317, внесем в фильтр -0.31. Для руды 3.683, но это ванильная руда, в модах бывает и больше. Минимальная плотность обсидиана 49.312, значит, eсли он не нужен, установим для полезных блоков максимальную плотность 40. C минимальной плотностью не все так гладко. Свинцовая руда из индастриала имеет плотность 2.5 это как у деревянных предметов, разброс с учетом шума от 1.3 до 2.7, это пересекается с камнем, у которого 0.8 - 2.2. Вот таблица некоторых блоков с минимальной и максимальной плотностью: Руда 2.312 - 3.683 Стекло -0.388 - 0.983 Камень 0.812 - 2.183 Грязь -0.188 - 1.183 Сундук 1.312 - 2.683 Обсидиан 49.312 - 50.683 Видно, что плотность стекла пересекается с плотностью коренной породы, но у бедрока приоритет выше, поэтому лучше лишний раз обойти. Исходя из этих данных, полезные блоки будут отмечаться с минимальной плотностью 2.3 и максимальной 40 Теперь опишем функцию сканирования. Заглянем в подсказку. Чтобы получить сырые данные, зададим координаты и размеры квадрата, относительно сканера. geolyzer.scan(позиция_х, позиция_z, позиция_y, ширина, длина, высота) Так как один раз можно отканировать только 64 блока, будем делать 4 подхода, получая координаты квадрата по горизонтали из вызывающей функции. Преобразовываем данные в координаты, попутно анализируя плотность условным оператором и устанавливаем метки. При обнаружении бедрока устанавливаем соответсвующий флаг во внешней для всех функций переменной. Получаем функцию scan(), выглядеть она будет примерно так: local function scan(xx, zz) -- сканирование квадрата x8 относительно робота local raw, index = geolyzer.scan(xx, zz, -1, 8, 8, 1), 1 -- получить сырые данные, установить индекс в начало таблицы for z = zz, zz+7 do -- развертка данных по z for x = xx, xx+7 do -- развертка данных по х if raw[index] >= 2.3 and raw[index] <= 40 then -- если обнаружен блок с плотностью от 2.3 до 40 table.insert(WORLD.x, X+x) --| записать метку в список table.insert(WORLD.y, Y-1) --| с коррекцией локальных table.insert(WORLD.z, Z+z) --| координат геосканера elseif raw[index] < -0.31 then -- если обнаружен блок с отрицательной плотностью border = true -- сделать отметку end index = index + 1 -- переход к следующему индексу сырых даннх end end end Раз уже взялись за геосканер, напишем и компас. Чтобы определить стороны света, надо сломать блок перед носом, просканировать его, затем установить обратно и, если есть разница - выдать результат. Для большей надежности добавим вращение вокруг своей оси, т. к. блока перед носом может и не быть или быть, но не тот. Координаты блоков задаем в таблице, сбрасываем текущее направление, определяем заново, вот и вся функция. Назовем ее compass() local function compass() -- определение сторон света local sides = {{-1,0}, {0,-1}, {1,0}, [0]={0,1}} -- привязка значений сторон света к смежным блокам D = nil -- обнуление текущего направления while not D do -- пока направление не найдено for n = 0, 3 do -- перебор сторон света robot.swing(3) -- разрушение блока if geolyzer.scan(sides[n][1], sides[n][2], 0, 1, 1, 1)[1] == 0 and robot.place(3) then -- тестовое сканирование и установка блока if geolyzer.scan(sides[n][1], sides[n][2], 0, 1, 1, 1)[1] > 0 then -- если обнаружена разница в сканах D = n -- установить новое направление break -- выйти из цикла end end end turn() -- задействовать простой поворот end end Самые важные функции готовы, можно приступить к тестированию.
  2. 4 балла
    Ядро копателя готово, теперь можно и пощупать. Напишем пробную функцию сканирования и добычи одного слоя. Сначала откалибруем компас и зададим таблицу с координатами сканируемых квадратов. Затем, отсканируем квадрат 16 на 16 блоков, выведем количество обнаруженных блоков. И в цикле обойдем все метки. Вроде бы все просто. Ах, да... будем искать ближайший блок к текущей позиции, чтобы быстрее закончить работу. Есть много подходов к определению расстояний. Например квадрат гипотенузы равен сумме квадратов катетов, формула для нашего случая будет math.sqrt((X-x)^2+(Z-z)^2), где X,Z - координаты робота, x,z - координаты метки, можно выкинуть квадратный корень, в нашем случае бесполезный и даже вредный. Но тут есть одно "но", мы получили гипотенузу, а это наименьшее расстояние между точками, а роботы по диагонали не ходят. Я буду вычислять дельту между точками, суммируя реальное расстояние, которое пройдет робот по формуле math.abs(X-x)+math.abs(Z-z) Эта операция в сферическом вакууме потребляет на 5% больше процессорного времени, чем предыдущая, но с лихвой окупается сэкономленными шагами. В цикле будем обходить таблицу с метками, до каждой вычисляя расстояние, самый лучший результат с индексом будем хранить в отдельных переменных. По окончании работы цикла, будем посылать робота в ближайшую точку. Код всей тестовой программы под спойлером. А вот и видео с демонстрацией. Можно добавить штрафы на повороты, тогда он будет меньше крутиться и собирать кучи линейкой, а не змейкой.
  3. 3 балла
    Чтобы программа могла контролировать движения робота, добавим систему координат и функционал связанный с ней. Так как робот будет шахтером, то все движения должны сопровождаться разрушением блоков, он будет ползать сквозь породу, попутно захватывая руду. Описание основной двигательной деятельности занимает всего четыре функции (можно и три, но в прошлой версии, в процессе борьбы за место, пришлось одну разделить) Приведу базовый код, затем опишу, что он делает. local component = require('component') -- подгрузить обертку из OpenOS local X, Y, Z, D = 0, 0, 0, 0 local WORLD = {x = {}, y = {}, z = {}} local function add_component(name) -- получение прокси компонента name = component.list(name)() -- получить адрес по имени if name then -- если есть адрес return component.proxy(name) -- вернуть прокси end end local robot = add_component('robot') -- загрузка компонента local function step(side) -- функция движения на 1 блок local state, type = robot.swing(side) -- тестовый свинг if not state and type == 'block' then -- если блок нельзя разрушить print('bedrock') os.exit() -- временная заглушка else while robot.swing(side) do end -- копать пока возможно end if robot.move(side) then -- если робот сдвинулся, обновить координаты if side == 0 then Y = Y-1 elseif side == 1 then Y = Y+1 elseif side == 3 then if D == 0 then Z = Z+1 elseif D == 1 then X = X-1 elseif D == 2 then Z = Z-1 else X = X+1 end end end if #WORLD.x ~= 0 then -- если таблица меток не пуста for i = 1, #WORLD.x do -- пройти по всем позициям if X == WORLD.x[i] and (Y-1 <= WORLD.y[i] and Y+1 >= WORLD.y[i]) and Z == WORLD.z[i] then if WORLD.y[i] == Y+1 then -- добыть блок сверху, если есть robot.swing(1) elseif WORLD.y[i] == Y-1 then -- добыть блок снизу robot.swing(0) end table.remove(WORLD.x, i) -- удалить метку из таблицы table.remove(WORLD.y, i) table.remove(WORLD.z, i) end end end end local function turn(side) -- поворот в сторону side = side or false if robot.turn(side) then -- если робот повернулся, обновить переменную направления if side then D = (D+1)%4 else D = (D-1)%4 end end end local function smart_turn(side) -- поворот в определенную сторону света while D ~= side do turn((side-D)%4==1) end end local function go(x, y, z) -- переход по указанным координатам while Y ~= y do if Y < y then step(1) elseif Y > y then step(0) end end if X < x then smart_turn(3) elseif X > x then smart_turn(1) end while X ~= x do step(3) end if Z < z then smart_turn(0) elseif Z > z then smart_turn(2) end while Z ~= z do step(3) end end Сначала создаются переменные для локальных координат робота. X, Y, Z - собственно, позиция робота, относительно стартовой точки. D - направление, куда смотрит мордочка робота. при старте программы она относительная. Поэтому, чтобы привязать ее к сторонам света, надо будет произвести некоторое шаманство при помощи геосканера. Таблица WORLD - это метки, которые будут устанавливаться в процессе сканирования. Таблица разделена на три, это смежные хранилища переменных для каждой координаты, например, сканер обнаружил блок с подходящей плотностью по координатам x15, y-10, z3, в таблицу они будут добавлены по одному индексу. Допустим, таблица была пустая, после добавления будет иметь вид WORLD.x[1] = 15, WORLD.y[1] = -10, WORLD.z[1] = 3 или WORLD = {x = {15}, y = {-10}, z = {3}} Далее следует функция, упрощающая добавление компонентов. На вход получает имя нужного компонента и, если он есть, выдает прокси к нему. Функция step() - основное движение робота. Учитывая, что программа используется исключительно для копания, копание будет в каждом шаге. Робот не тыкается носом в породу и не спрашивает какой блок перед ним. Махнул инструментом и смотрит результат. Если есть блок, но добыть его не получилось - следовательно, дальше делать нечего, там бедрок или еще чего похуже, потом добавим правильную обработку и эвакуацию по хлебным крошкам, а пока пусть будет заглушка. Если махнул удачно - пробуем еще раз и еще, до посинения. Это своеобразная защита от лагающего гравия/песка и назойливых сущностей (в виде гномиков). Далее, если функция движения была совершена удачно, то обновляем локальные координаты, учитывая направление движения. Ну и в конце функции сканируем таблицу меток, ищем метки с текущей позицией и удаляем, т. к. по нашим данным робот находится в блоке руды, следовательно, он его добыл. Еще есть дополнительная проверка по вертикали - если есть руда сверху или снизу, то захватываем, это позволит сократить общую сумму переходов между метками и ускорить добычу. Функция turn() - основной поворотник (аналог robot.turn(), но с обновлением переменной направления) Робот поворачивается, записывая результат в переменную, добавляя/отнимая единицу по модулю 4 при каждом повороте. Функция smart_turn() - поворот на желаемую сторону света, с минимумом действий. Вычисляет разницу между текущим и целевым направлением, запуская результат по модулю 4 через turn() Функции поворота можно будет объединить, но пока оставлю так. Функция go() - великий ход конем до нужных координат. Принимает координаты целевого блока, двигается по вертикали, поворачивает на цель X, двигается до цели, поворачивает на цель Z, двигается до цели. Для поворота использует smart_turn(), т. к. оси x и z глобальные, это стороны света.
  4. 3 балла
    И так, наконец-то возвращаюсь к роботу-копателю. Да будут новые баги и новые фичи! Краткий план внедряемых фич: Улучшенное сканирование руд. Робот сканирует под собой квадрат 16x16 блоков, опускаясь блок за блоком. При обнаружении бедрока запускается функция добычи. При добыче робот поднимается и в цикле ищет ближайшие по горизонтали блоки руды, захватывая три слоя - Y+1, Y, Y-1 Определение энергопотребления сборки при запуске. На старте, робот запоминает количество потребленной энергии на один шаг + прочность инструмента. Это будет служить константой при проверке статуса, чтобы была возможность гарантированно вернуться на точку старта. Умная упаковка добычи. Перед обработкой рассыпухи, теперь будет точнее анализироваться свободное место, упаковка не будет происходить механическим перебором, из-за которого бывали внезапные сбои. При наличии генератора, робот всегда будет с собой таскать уголь, при разгрузке на точке старта будет забирать стак угля или угольных блоков. Текущие константа энергопотребления и координаты будут записываться в EEPROM. Следовательно, при наличии сетевой/связанной карты, робота можно будет будить и не бояться выгрузки чанков, лагов, космических лучей. Скорее всего, добавлю функцию аварийного крафта кирок из булыги, в случае работы с ванильными инструментами. Планируется утилита, собирающая программу по параметрам, заданным пользователем. ...Или не планируется, скорее всего все возможности копалки не получится впихнуть на EEPROM, поэтому на EEPROM будет загрузчик с main функцией, а дополнительные модули придется записывать на жесткий диск. Планируется поддержка модов, например, возможность возить с собой и разворачивать заправочную станцию в виде генератора и зарядника. Или скидывать предметы в межпространственные сундуки. Тут надо будет смотреть, как будут развиваться моды. В блоге буду описывать каждую функцию, чтобы отследить создание программы шаг за шагом, надеюсь, кому-то это поможет.
  5. 2 балла
    Каждый, кто занимался разработкой человеко-машинного интерфейса под OpenOS, наверное знает какое это муторное занятие. Даже если Вы используете библиотеку GUI. То и дело приходится выходить из редактора кода, запускать свою программу, смотреть на результат своих стараний и снова заходить в редактор, чтобы исправить всего одну цифру. Предлагаемая система позволяет создавать интерфейсы программ не в текстовом редакторе, а в графическом при помощи мыши, но самое главное - результат своей работы Вы можете видеть сразу, не выходя из редактора. Построена система на основе уже известной Вам gui-библиотеки forms. При входе в FormsMaker мы видим пустую форму Щелкните правой кнопкой мыши в любом месте формы после чего откроется окно управления компонентом Выбрав пункт "Свойства Form1" можно (будет) редактировать свойства формы, такие как цвет рамка и т.д. Пункты "Add ..." добавляют на форму соответствующий компонент. Пункт "Проект" позволит управлять проектом: сохранять, компилировать и т.д. Для возврата к редактируемой форме выберите "Отмена" К примеру мы выбрали пункт "Add frame". Это добавит на нашу форму рамку. Таким же образом на рамку можно добавить кнопку. Щелкаем ПКМ на рамку и выбираем "Add button" Изменить размер рамки можно при помощи ЛКМ, потянув за правый-нижний ее угол А перемещать рамку по форме можно перетаскивая за любое свободное её место pastebin get wA5KMKav fmaker.lua Приму с благодарностью любую посильную помощь в развитии проекта, как в программировании, тестировании так и просто советом.
  6. 1 балл
    Все-таки добывать руду слоями дольше, чем свободным обходом всех доступных блоков. На тестовом стенде свободный - 2 минуты 50 секунд, послойный - 3 минуты 9 секунд. Тут очень сильно напрашивается дополнительная эвристика на сокращение поворотов и прямых одноблочных ходов. И упаковку запускать только при нужде.
  7. 1 балл
    Наиболее интересной мне показалась эта идея: Хорошая эвристика. В идеале хорошо было бы найти такие штрафы на перемещения во вертикали (а также на повороты), чтобы при плотном расположении руд робот перемещался по кластеру как в классической копалке "слой через два". Мои идеи в этом направлении пока что сводятся к увеличению глубины поиска ближайших целей.
  8. 1 балл
    Выбор алгоритма копки сильно зависит от модпака, его настроек и руд, предпочитаемых игроком. Если добываемые руды встречаются редко, то выгоднее перемещаться до ближайшего блока руды, игнорируя порядок слоёв. А если полезных руд много, то имеет смысл переходить на послойную, а в пределе даже на сплошную копку. Следовательно, при сравнении алгоритмов кроме самого времени работы имеет смысл уточнить модпак и конфиги. Также интересно узнать, каким образом сгенерированы руды на видео, чтобы оценить реалистичность данной конфигурации.
  9. 1 балл
    При запуске программы надо оценить возможности робота, чтобы в дальнейшем, можно было точно знать количество энергии для перехода на точку старта. Робот должен измерить уровень энергии, сделать шаг, измерить еще раз и вычислить разницу. Эту разницу будет учитывать при измерении расстояния и принимать решение - идти домой или не идти. Функция robot.durability() не показывает правильный износ для зачарованных инструментов. Придется несколько раз ставить и разрушать блок, пока не обнаружится износ. Вынесем пока это все в отдельную функцию calibration() local function calibration() -- калибровка при запуске local energy = computer.energy() -- получить уровень энергии step(0) -- сделать шаг E_C = math.ceil(energy-computer.energy()) -- записать уровень потребления energy = robot.durability() -- получить уровень износа/разряда инструмента while energy == robot.durability() do -- пока не обнаружена разница robot.place(1) -- установить блок robot.swing(1) -- разрушить блок end W_R = energy-robot.durability() -- записать результат step(1) -- вернуться на место end Переменные E_C и W_R выносим в обую область видимости. Во время работы, например, после четырех сканов, робот будет оценивать количество доступных шагов по этой формуле: math.min(robot.durability()/W_R, computer.energy()/E_C) и сравнивать с расстоянием до точки старта. Из-за магической механики, зачарованные инструменты (Unbreaking) изнашиваются неравномерно, но роботу это нисколько не мешает.
  10. 1 балл
    Геосканер потребляет много энергии, а функция compass() делает по 4 скана, пока не установит направление. Надо это исправить. Пусть робот сначала проверит наличие блока перед носом, сделает скан всех блоков вокруг себя, затем сломает блок и проверит разницу в полученных данных. Таким образом, будет производиться всего два сканирования, в прошлой версии их могло быть бесконечно много - если рядом нет блоков, робот бы крутился и молотил инструментом по воздуху, попутно делая по 4 сканирования. Улучшенная функция будет выглядеть так: local function compass() local sides = {2, 1, 3, 0} -- линки сторон света, для сырых данных D = nil -- обнуление направления while not D do -- пока не найдено направление if robot.detect(3) then -- проверить наличие блока перед носом local A = geolyzer.scan(-1, -1, 0, 3, 3, 1) -- сделать первый скан robot.swing(3) -- сломать блок local B = geolyzer.scan(-1, -1, 0, 3, 3, 1) -- сделать второй скан for n = 2, 8, 2 do -- обойти смежные блоки в таблице if math.ceil(B[n])-math.ceil(A[n])<0 then -- если блок исчез D = sides[n/2] -- установить новое направление break -- выйти из цикла end end else turn() -- задействовать простой поворот end end end
  11. 1 балл
    Сейчас сканирования, конечно, экономятся, но при отсутствии блоков робот всё равно уходит в бесконечный цикл вращения.
  12. 1 балл
    Никак, стандартный уровень шума не изменился. Первая версия сканировала 8x8 блоков, я жестко задал плотности, которые получил при сканировании дальних блоков (самая мягкая руда и бедрок) В этой версии изменять ничего не придется, т. к. так же сканируются 4 квадрата x8, только теперь робот не будет смещаться по горизонтали, пока не дойдет до бедрока. С таким подходом уровень шумов по краям будет постоянным, ускорится добыча руды и общий профит.
  13. 1 балл
    В этой статье я попытаюсь рассказать основные принципы работы большинства известных ядерных реакторов и показать как из собирать. Статью разобью на 3 раздела: ядерный реактор, моксовый ядерный реактор, жидкостный ядерный реактор. В дальнейшем, вполне возможно, буду что то добавлять/менять. Так же просьба писать только по теме: к примеру моменты что были мной забыты или например полезные схемы реакторов которые выдают большой кпд, просто большой выход или предполагают автоматизацию. По поводу же отсутствующих крафтов рекомендую пользоваться русской вики или игровым НЕИ. Так же перед работой с реакторами хочу обратить ваше внимание на то, что устанавливать реактор необходимо целиком в 1 чанке (16х16, сетку вывести можно нажав F9). Иначе корректная работа не гарантируется, ведь иногда в разных чанках время течет по разному! Особенно актуально это относится к жидкостному реактору имеющему в своем устройстве множество механизмов. И еще один момент: установка более 3х реакторов в 1 чанке может привести к плачевным последствиям, а именно лагам на сервере. И чем больше реакторов - тем больше лагов. Распределяйте их равномерно по площади! Обращение игрокам играющем на нашем проекте: при нахождении администрацией более 3х реакторов на 1 чанке (а они найдут) все лишние уйдут под снос, ибо думайте не только о себе но и об остальных игроках на сервере. Лаги никому не по нраву. 1. Ядерный реактор. По сути своей все реакторы являются генераторами энергии, но в то же время это довольно непростые для игрока многоблочные структуры. Работать реактор начинает только после подачи на него редстоун сигнала. Топливо. Ядерный реактор самого простого типа работает на уране. Внимание: прежде чем работать с ураном позаботьтесь о безопасности. Уран радиоактивен, и отравляет игрока не снимаемым отравлением что будет висеть до окончания действия или летального исхода. Необходимо создать комплект хим защиты (да да) из резины, он защитит вас от неприятного воздействия. Урановую руду, что вы находите необходимо продробить, промыть (по желанию), и закинуть в термальную центрифугу. В итоге мы получаем 2 типа урана: 235 и 238. Соединив их на верстаке в пропорции 3 к 6 мы получим урановое топливо которое необходимо закатать в топливные стержни в консерваторе. Полученные стержни вы уже вольны использовать в реакторах как вам заблагорассудится: в изначальном виде, в виде двойных или счетверенных стержней. Любые урановые стержни работают в течении ~330 минут, это около пяти с половиной часов. После своей выработки стержни превращаются в обедненные стержни которые необходимо зарядить в центрифугу (больше с ними ничего не сделать). На выходе вы получите почти весь 238 уран (4 из 6 на стержень). 235 же уран превратится в плутоний. И если первое вы можете пустить на второй круг просто добавив 235, то второе не выкидывайте, плутоний вам пригодится в дальнейшем. Рабочая зона и схемы. Сам реактор это блок (ядерный реактор) имеющий внутреннюю ёмкость и ее желательно увеличивать для создания более эффективных схем. При максимальном увеличении реактор будет окружен с 6-ти сторон (со всех) реакторными камерами. При наличии ресурсов рекомендую использовать его именно в таком виде. Готовый реактор: Реактор будет выдавать энергию сразу в eu/t, что означает, что к нему можно просто подцепить провод и запитывать с него уже то что вам нужно. Реакторные стержни хоть и выдают электроэнергию, но вдобавок они выделяют тепло, которое, если не рассеивать может привести к взрыву самой машины и всех ее компонентов. Соответственно помимо топлива вам необходимо позаботиться об охлаждении рабочей зоны. Внимание: на сервере ядерный реактор не имеет пассивного охлаждения, как самих отсеков (как написано на викии) так и от воды/льда, с другой стороны от лавы он тоже не нагревается. То есть нагрев/охлаждение ядра реактора происходит исключительно при взаимодействии внутренних компонентов схемы. Схема это - набор элементов состоящих из охлаждающих реактор механизмов а так же самого топлива. От нее зависит сколько будет выдавать реактор энергии и будет ли он перегреваться. Смеха может состоять из стержней, теплоотводов, теплообменников, реакторных пластин (основное и наиболее часто используемое), так же охлаждающие стержни, конденсаторы, отражатели (редко используемые компоненты). Их крафты и назначение я расписывать не буду, все смотрите на викии, у нас это работает так же. Разве что конденсаторы сгорают буквально за 5 минут. В схеме помимо получения энергии необходимо полностью погасить выходящее тепло от стержней. Если тепла больше чем охлаждения то реактор взорвется (после определенного нагрева). Если больше охлаждения, то он будет работать до полной выработки стержней, в перспективе вечно. Схемы для ядерного реактора я разделил бы на 2 типа: Наиболее выгодные по кпд на 1 урановый стержень. Баланс затрат урана и выхода энергии. Пример: 12 стержней. Эффективность 4.67 Выход 280 еу/т. Соответственно получаем 23.3 еу/т или 9 220 000 энергии за цикл (примерно) с 1 уранового стержня. (23.3*20(тактов в секунду)*60(секунд в минуте)*330(длительность работы стержней в минутах)) Наиболее выгодные по выходу энергии на 1 реактор. Тратим максимум урана и получаем максимум энергии. Пример: 28 стержней. Эффективность 3 Выход 420 еу/т. Тут уже имеем 15 еу/т или 5 940 000 энергии за цикл на 1 стержень. Какой вам вариант ближе смотрите сами, однако не забывайте, что второй вариант даст больший выход плутония ввиду большего количества стержней на реактор. Плюсы простого ядерного реактора: + Довольно неплохой выход энергии на начальном этапе при использовании экономичных схем даже без доп реакторных камер. Пример: + Относительная простота в создании/использования в сравнении с другими типами реакторов. + Позволяет использовать уран уже практически в самом начале. Нужна разве что центрифуга. + В перспективе один из мощнейших источников энергии в индастриал моде и на нашем сервере в частности. Минусы: - Все же требует некоторую оснащенность в плане индастриал машин а так же знаний по их использованию. - Выдает относительно небольшое количество энергии (малые схемы) или просто не слишком рациональное использование урана (цельный реактор). 2. Ядерный реактор на MOX топливе. Отличия. По большому счету сильно похож на реактор работающий на уране, однако с некоторыми отличиями: Использует как понятно из названия моксовые стержни, которые собираются из 3х больших кусочков плутония (останется после обеднения) и 6ти 238го урана (238 уран перегорит в кусочки плутония). 1 большой кусок плутония это 9 маленьких, соответственно чтобы сделать 1 моксовый стержень необходимо сперва пережечь в реакторе 27 урановых стержней. Исходя из этого можно сделать вывод, что создание мокса это трудоёмкая и длительная затея. Однако могу вас уверить, выход энергии с такого реактора будет в разы выше чем с уранового. Вот вам пример: Во второй точно такой же схеме вместо урана стоит мокс и реактор разогрет почти до упора. В итоге выход почти пятикратный (240 и 1150-1190). Однако имеется и отрицательный момент: мокс работает не 330, а 165 минут (2 часа 45 минут). Небольшое сравнение: 12 урановых стержней. Эффективность 4. Выход 240 eu/t. 20 за такт или 7 920 000 еу за цикл на 1 стержень. 12 моксовых стержней. Эффективность 4. Выход 1180 eu/t. 98.3 за такт или 19 463 000 еу за цикл на 1 стержень. (длительность меньше) Основной принцип работы охлаждения уранового реактора - переохлаждение, моксового - максимальная стабилизация нагрева охлаждением. Соответственно при нагреве 560 у вас охлаждение должно быть 560, ну или чуть чуть меньше (небольшой нагрев допускается, но об этом чуть ниже). Чем больше процент нагрева ядра реактора, тем больше выдает энергии моксовые стержни не повышая при этом выработку тепла. Плюсы: + Использует практически незадействованное в урановом реакторе топливо, а именно 238 уран. + При правильном использовании (схема+нагрев) один из самых лучших источников энергии в игре (относительно продвинутых солнечных панелей из мода Advanced Solar Panels). Выдавать часами заряд в тысячу еу/тик способен только он. Минусы: - Сложен в обслуживании (нагрев). - Использует не самые экономичные (из-за необходимости автоматизации во избежании потери тепла) схемы. 2.5 Внешнее автоматическое охлаждение. Немного отступлю от самих реакторов и расскажу про доступное для них охлаждение что есть у нас на сервере. А конкретно про Nuclear Control. Для корректного использования нуклеар контроля так же необходим Red Logic. Касается только контактного датчика, для дистанционного это необязательно. Из данного мода как можно было догадаться нам необходимы датчики температуры контактный и дистанционный. Для обычного уранового и мокс реакторов достаточно контактного. Для жидкостного (в силу конструкции) уже необходим дистанционный. Контактный устанавливаем как на изображении. Расположение проводов (freestanding red alloy wire и red alloy wire) роли не играет. Температура (зеленое табло) настраивается индивидуально. Не забываем перевести кнопку в положение Пп (изначально она пП). Контактный датчик работает так: Зеленое табло - он получает данные о температуре а так же это означает что она в пределах нормы, он дает сигнал редстоуна. Красный - ядро реактора перешло указанную в датчике температуру и он перестал подавать сигнал редстоуна. Дистанционный практически так же. Основное отличие как понятно из его названия он может выдавать данные о реакторе издалека. Получает он их с помощью набора с дистанционным датчиком (ид 4495). Еще он по умолчанию кушает энергию (у нас отключено). Так же занимает блок целиком. 3. Жидкостный ядерный реактор. Вот и подходим к последнему типу реакторов, а именно жидкостному. Называется он так потому, что уже относительно нехило приближен к реальным реакторам (в рамках игры конечно). Суть такова: стержни выделяют тепло, охлаждающие компоненты это тепло переводят на хладагент, хладагент отдает это тепло через жидкостные теплообменники в генераторы стирлингов, те же преобразуют тепловую энергию в электрическую. (Вариант использования такого реактора не единственный, но пока, субъективно самый простой и эффективный.) В отличии от двух предыдущих типов реакторов перед игроком стоит задача не максимально увеличить выход энергии с урана, а балансировать нагрев и возможность схемы отводить тепло. Эффективность выхода энергии жидкостного реактора основывается на исходящем тепле, но ограничена максимальным охлаждением реактора. Соответственно если вы поставите в схеме 4 4х стержня квадратом, вы просто не сможете их охладить, вдобавок схема будет не шибко оптимальна, и эффективный отвод тепла будет на уровне 700-800 ет/t (единиц тепла) во время работы. Надо ли говорить, что реактор с таким количеством стержней установленных вплотную будет работать 50 или максимум 60% времени? Для сравнения оптимальная найденная схема для реактора из трех 4х стержней выдает уже 1120 ед тепла на протяжении 5 с половиной часов. Пока что более менее простая (бывает значительно сложнее и затратнее) технология использования такого реактора дает 50% выход от тепла (стирлинги). Что примечательно, сам выход тепла умножается на 2. Перейдем к самой постройки реактора. Даже среди многоблочных структур майнкрафта является субъективно очень большой и сильно кастомизируемой, но тем не менее. Сам реактор занимает площадь 5х5, плюс возможно установленные блоки теплообменников+стирлинги. Соответственно итоговый размер 5х7. Не забываем про установку всего реактора в одном чанке. После чего готовим площадку и выкладываем реакторные корпуса 5х5. Далее закладываем с 4 из 6 сторон реакторные корпуса, и оставляем пустыми 14 центральных блоков с 2х любых сторон. Затем устанавливаем внутрь в самый центр полости обычный реактор с 6 реакторными камерами. Не забываем использовать набор для дистанционного датчика на реакторе, в дальнейшем мы не сможем до него добраться. В остальные пустые слоты оболочки вставляем 12 реакторных насосов + 1 реакторный проводник красного сигнала + 1 реакторный люк. Получится должно к примеру так: После чего необходимо заглянуть в реакторный люк, это наш контакт с внутренностями реактора. Если все сделали правильно то интерфейс изменит вид на такой: Самой схемой мы займемся позже, а пока продолжим установку внешних компонентов. Во первых необходимо в каждый насос вставить по жидкостному выталкивателю. Ни в данный момент, ни в дальнейшем они не требуют настройки и будут работать корректно в варианте "по умолчанию". Проверяем лучше по 2 раза, не разбирать же это все потом. Далее устанавливаем на 1 насос по 1 жидкостному теплообменнику так, чтобы рыжий квадрат смотрел от реактора. После чего забиваем теплообменники по 10 теплопроводов и 1 жидкостному выталкивателю. Проверяем все еще раз. Дальше ставим генераторы стирлинга на теплообменники так, чтобы они смотрели своим контактом на теплообменники. Развернуть их в противоположную сторону от стороны которой касается ключ можно зажав шифт и кликнув по необходимой стороне. Получится в итоге должно так: Затем в интерфейсе реактора в левый верхний слот помещаем с десяток капсул хладогента. После чего соединяем все стирлинги кабелем, это наш по сути механизм что выводит энергию со схемы реактора. На проводник красного сигнала ставим дистанционный датчик, и устанавливаем его в положение Пп. Температура роли не играет, можно оставить и 500, ведь по факту он не должен греться вообще. Подводить кабель к датчику необязательно (у нас на сервере), он будет работать и так. Далее устанавливаем такую схему: Она будет выдавать 560х2=1120 ет/т за счет 12 стирлингов мы их выводим в виде 560 еу/т. Что довольно неплохо с 3х счетверенных стержней. Схема так же удобна для автоматизации, но об этом несколько позже. Плюсы: + Выдает около 210% энергии относительно стандартного уранового реактора при такой же схеме. + Не требует постоянного контроля (как к примеру мокс с необходимостью поддерживать нагрев). + Дополняет мокс используя 235 уран. Позволяя вкупе выдавать максимум энергии из уранового топлива. Минусы: - Весьма дорог в постройке. - Занимает порядочно места. - Требует определенных технических знаний. Общие рекомендации и наблюдения по жидкостному реактору: - Не используйте в реакторных схемах теплообменники. В следствии механики жидкостного реактора они будут аккумулировать выходящее тепло если вдруг будет происходить перегрев, после чего сгорят. По этой же причине охлаждающие капсулы и конденсаторы в ней просто бесполезны, ведь они забирают все тепло. - Каждый стирлинг позволяет вывести 100ед тепла, соответственно имея в схеме 11.2 сотни тепла нам было необходимо установить 12 стирлингов. Если ваша система будет выдавать к примеру 850 ед, то их будет достаточно всего 9 штук. Учитывайте что недостаток стирлингов будет приводить к нагреву системы, ведь избыточному теплу будет некуда деваться! - Довольно устаревшую, но все же юзабельную программу для расчета схем для уранового и жидкостного реактора, а так же отчасти мокса можно взять здесь - Имейте ввиду, если энергия с реактора не будет уходить, то буфер стирлингов переполнится и начнется перегрев (теплу будет некуда идти) P.S. Выражаю благодарность игроку MorfSD который помогал в сборе сведений для создания статьи и просто участвовал в мозговом штурме и отчасти реактора. Разработка статьи продолжается...
  14. 1 балл
    Трехмерная печать в Minecraft (инструкции для самых маленьких) Начиная с версии 1.5.4, в OpenComputers появляется интересный девайс - трехмерный принтер. Он дает возможность печатать декоративные блоки любой формы и цвета. Причем не только статичные блоки, но и двери/люки, кнопки и рычаги! Давайте рассмотрим, для чего он может пригодиться, и как именно с ним работать. 1. Цель Как и в предыдущих гайдах, первым делом поставим себе цель. Мы будем создавать стенную плитку со сквозным орнаментом, в виде морды крипера. Я не буду приводить в этом гайде рецепты предметов, так как их легко найти в NEI, или в статьях на gamepedia. 2. Обзор принтера 3D-принтер - это периферическое устройство, которое должно быть подключено к работающему компьютеру. Оно представляет собой блок, с двумя внутренними слотами: Верхний слот предназначен для специальной печатной массы (изготовляется из редстоуна, гравия, древесного угля и воды). Принтер вмещает два стека печатной массы (256 000 ед). Нижний слот занимает картридж с красителями. Объем внутреннего хранилища - два картриджа краски (100 000 ед). По команде от компьютера, принтер берет немного печатной массы и краски и "распечатывает" в крайний правый слот запрограммированную модель. На модель из этого гайда, состоящую из 21 фигуры, принтер потратил 424 единицы массы и 314 единиц краски. 3. Отпечатанный блок Модель для печати задается в виде списка "фигур" - параллелепипедов. Каждая фигура отмечена координатами противоположных углов. Она имеет свою текстуру, цвет оттенка (если необходимо) а также состояние (true/false). Максимальное количество фигур в модели - 24, по умолчанию. Координаты блока тремя числами (X, Y, Z) в пределах от 0 до 16. Блок может переключать свое состояние, когда игрок кликает по нему правой кнопкой мыши, или на блок подается сигнал редстоуна. По умолчанию блок имеет форму, заданную блоками с состоянием false, и сменяет ее на форму из блоков с состоянием true, при активации. Кроме того блок имеет несколько дополнительных общих флагов, которые определяют его название, описание и некоторые другие параметры. 4. Программирование принтера Есть два способа распечатать свою модель. Через компонент принтера и прямое управление, либо при помощи стардартной программки print3d от Сангара. 4.1 Компонент принтера Подключение принтера ничем не отличается от подключения любого другого устройства: local com = require('component')local printer = com.printer3d Компонент предоставляет набор функций для управления: reset() - сброс настроек и остановка печати setLabel(value:string) - задаем название будущего блока getLabel():string - получаем текущее название setTooltip(value:string) - задаем описание блока getTooltip():string - получаем описание setRedstoneEmitter(value:boolean) - определяет, излучает ли блок сигнал редстоуна в активированном состоянии isRedstoneEmitter():boolean - возвращает true, если блок излучает сигнал в активном состоянии setButtonMode(value:boolean) - определяем поведение блока при активации. Если true, то блок автоматически возвращается в неактивное состояние через несколько секунд после активации (как кнопка) isButtonMode():boolean - возвращает true, если блок находится в режиме "кнопки" addShape(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number, texture:string[, state:boolean=false][,tint:number]) - добавляет новую "фигуру" к форме блока. Фигура задана координатами. texture - название текстуры, state - для какого состояния фигура предназначена, tint - цвет оттенка фигуры getShapeCount():number - возвращает количество фигур в модели getMaxShapeCount():number - возвращает максимально возможное количество фигур commit([count:number]) - посылает принтеру текущую конфигурацию и начинает печать (count - количество копий, если не задано - равно 1) status(): string, number or boolean - возвращает состояние принтера - "buzy" и процент готовности, или "idle" и готовность предмета (true/false). 4.2 Программа print3d Код программы не включен в мод по умолчанию, поэтому его надо скачать из интернета. Последнюю версию можно найти на ГитХабе автора: https://github.com/OpenPrograms/Sangar-Programs/blob/master/print3d.lua Либо скачать с Pastebin: http://pastebin.com/b5rD8KcY (поставьте интернет-плату, и наберите в консоли компьютера команду pastebin get b5rD8KcY print3d) Эта программа по сути, читает параметры модели из текстового файла и передает принтеру. Формат вызова программы: print3d FILE [count] Где FILE - название файла с моделью, а необязательный параметр count - количество копий модели. Модели имеют простой формат - все параметры записываются в таблицу, по аналогии с Луа. Вот образец файла с моделью. { -- Это - название модели. Т.е. название будущего блока, которое будет видно -- в инвентаре и подсказке Waila. Название по умолчанию - "3D Print" label = "Example Model", -- Это описание предмета, такое, как будет видно в инвентаре. Если не задано, -- предмет не будет иметь описания tooltip = "Это демонстрационная модель, показывающая все возможности", emitRedstone = false, --[[ Если этот параметр равен false, блок работает как дверь, сменяя свое состояние при сигнале редстоуна. Если параметр равен true, блок работает как кнопка или рычаг - излучая сигнал при смене состояния. При этом блок не реагирует на сторонний сигнал. По умолчанию параметр равен false. ]] buttonMode = false, --[[ Если этот параметр равен false, модель работает как дверь или рычаг - то есть остается в том состоянии, в которое установлен игроком. Если параметр равен true, модель автоматически возвращается в неактивное состояние через несколько секунд после активации. По умолчанию параметр равен false. ]] -- Это список фигур модели, которые определяют, как она выглядит. -- Модель должна содержать как минимум одну фигуру (параллелепипед) -- в неактивном состоянии. -- Фигуры не могут быть "плоскими" т.е. не иметь объема. -- Каждая фигура задана шестью числами: minX, minY, minZ, maxX, maxY, maxZ. -- (Координаты двух противоположных углов.) -- Если смотреть спереди, ось X направлена вправо, ось Y - вверх и ось Z - вглубь. -- Дополнительно, каждая фигура длолжна обладать текстурой. Для того чтобы -- определить название текстуры, вы можете воспользоваться Определителем Текстуры -- (Texture Picker), кликнув им по нужному блоку. -- -- Модель имеет два состояния - неактивное (false, состояние по-умолчанию) -- и активное (true, состояние после активации блока). shapes = { -- Фигура идет от точки <0, 0, 0> (левый нижний угол) до <8, 8, 8> (середина), -- и имеет текстуру блока лазурита. { 0, 0, 0, 8, 8, 8, texture = "lapis_block" }, -- Фигура идет из точки <8, 8, 8> (середина) в <16, 16, 16> (правый верхний угол), -- и закрашена текстурой дубовой листвы. Фигура принадлежит активному состоянию -- модели и имеет светло-зеленый оттенок. { 8, 8, 8, 16, 16, 16, texture = "leaves_oak", state = true, tint = 0x48B518 } }} Т.е. описание модели просто содержит перечень всех тех параметров, которые задаются при помощи компонента, и список фигур из которых модель состоит. Набор тестовых моделей для изучения, можно найти здесь: https://github.com/OpenPrograms/Sangar-Programs/tree/master/models 5. Проектирование модели Разобьем мысленно рисунок запланированной модели на параллелепипеды. Она будет представлять собой тонкую плитку посередине блока, наподобие стекла или решетки. Руководствуясь сеткой координат и образцом выше, составим описание модели для текстового файла: { label = "Плитка 'Морда крипера'", emitRedstone = true, buttonMode = false, tooltip = "Секретный рычаг в виде головы крипера" shapes={ {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200}, {0,2,7, 2,14,9, texture="quartz_block_side", tint=0x8eb200}, {6,10,7, 10,14,9, texture="quartz_block_side", tint=0x8eb200}, {14,2,7, 16,14,9, texture="quartz_block_side", tint=0x8eb200}, {2,2,7, 4,10,9, texture="quartz_block_side", tint=0x8eb200}, {4,8,7, 6,10,9, texture="quartz_block_side", tint=0x8eb200}, {10,8,7, 12,10,9, texture="quartz_block_side", tint=0x8eb200}, {12,2,7, 14,10,9, texture="quartz_block_side", tint=0x8eb200}, {6,2,7, 10,4,9, texture="quartz_block_side", tint=0x8eb200}, {0,0,7, 16,2,9, texture="quartz_block_side", tint=0x8eb200}, {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {0,2,7, 2,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {6,10,7, 10,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {14,2,7, 16,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {2,2,7, 4,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {4,8,7, 6,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {10,8,7, 12,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {12,2,7, 14,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {6,2,7, 10,4,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {0,0,7, 16,2,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {2,2,8, 14,14,9, texture="quartz_block_side", tint=0xe0301e, state=true}}} Итак, наша плитка имеет двойной набор фигур - для двух состояний, окрашенных в текстуру кварца с зеленым оттенком. Кнопка будет работать как рычаг, испуская сигнал в активном состоянии. Откройте файл командой open creeper. Скопируйте код плитки выше и вставьте в файл кнопкой [insert]. Затем сохраните ([Ctrl]+) и покиньте редактор ([Ctrl]+[W]). 6. Печать Все готово, принтер заправлен, модель спроектирована. Отправляем ее на печать! print3d creeper 7. Итоги Enjoy!
  15. 1 балл
    Кто же его знает. Как дело пойдет. В принципе, то что есть уже можно использовать. Тестировать, находить баги, предлагать свои варианты реализации программы.
  16. 1 балл
    Верно. Любой объект на луа есть ничто иное как таблица. Изменение свойств объекта это редактирование таблицы. А если учесть, что переменные и функции являются полями таблицы _G, то можно говорить, что программирование тоже редактирование таблицы.
  17. 1 балл
    Пока никаких. Но в будущем, возможно, любые.
  18. 1 балл
    Желающие могут опробовать генерацию кода. Для этого надо на уже упоминавшемся компьютере создать элементы интерфейса, после чего нажать ПКМ и в выпадающем списке выбрать пункт "Генерировать код". Этот пункт в список не помещается, поэтому список нужно прокрутить колесиком. Результирующий код смотрим в файле Project1.lua. Его можно даже запустить.
  19. 1 балл
    После создания окошек, кнопок и прочих элементов интерфейса, пользователь получит файл проекта - особый файл, который можно будет повторно открыть в редакторе и продолжить редактирование. Файл проекта можно будет преобразовать в исполняемый луа-код. Процесс преобразования я назвал генерацией, дабы не травмировать чувств интерпретационистов. А луа-код - уже редактировать и запускать как всякую другую программу. Поначалу предполагалось, что генерироваться будут только строки для создания элементов интерфейса, а логика добавляется вручную в редакторе edit. Затем возникла мысль добавить генерацию обработчиков событий. Но это требует встраивания в FormsMaker текстового редактора. Посмотрим как пойдет.
  20. 1 балл
    Судя по всему, это будет что-то грандиозное. Хочется немного ясности. Что пользователь получит в конце после создания дизайна кнопок, окошка или списка + кнопки и прочим. Что это будет после сохранения? Луа код? А его потом уже можно и нужно дорабатывать функционально? Повесить функции кнопкам и прочее? Так? Это система быстрого визуального создания менюшек?
  21. 1 балл
    Всё таки, конечным результатом работы системы будет луа-код, получаемый в результате компиляции проекта (да простит меня NEO).
  22. 1 балл
    Меня смущает название темы. "Система визуального программирования" это немного другая штука. "Редактор форм" - больше подходит
  23. 1 балл
    И форма и все ее компоненты создаются динамически. Параметры компонентов предполагается задавать в коде программы. Если хранить их в отдельном файле, то для запуска программы потребуется и этот файл. А я не хотел бы лишних файлов, необходимых для исполнения.
  24. 1 балл
    На данный момент сохранение проекта в файл пока не реализовано. Планируется разработать структуру такого файла для сохранения и последующей загрузки проекта. И конечно же, самое интересное - это трансляция проекта в исполняемый lua-код. Библиотека сама по себе ни с какими файлами не работает. Подгружать файл будет среда разработки.
  25. 1 балл
    Обрадовался что на сервере разрешили печатать 3д модели и побежал в одиночку делать всякие прикольные штуковины. Но когда зашел на сервер и узнал сколько стоит напечатать, очумел. Так что не видать мне на сервере принтов. Но вот что получилось в одиночке: Сегодняшняя первая проба - футуристичная дверь из 4х частей: А за ней следовали стержни в корпусе: Код стержней:
Таблица лидеров находится в часовом поясе Москва/GMT+03:00
  • Рассылка

    Хотите узнавать о наших последних новостях и информации?

    Подписаться
×