Jump to content

Recommended Posts

Привет всем! На днях мой приятель спросил, знаю ли я способ автоматизации добычи пластинок? Точного ответа я тогда дать не мог, но помнится, в далёком 2013 я фармил пластинки всех видов чисто для ванильного майнкрафта, чтоб просто слушать музычку и наслаждаться жизнью.. Эх, были времена. Но спустя некоторое время я нашел способ это автоматизировать)

0. Не самое короткое предисловие
 

Спойлер

Суть в том, что когда скелет убивает крипера, с него 100% падает случайная пластинка. За эти годы механика никуда не делась, осталось только это использовать в своих целях, так сказать.
Изначально я построил полуавтоматическую ферму пластинок, в которой стоит скелет, с другой стороны место для игрока и между ними место для криперов. Скелет агрится на игрока и фармит нам пластинки. Добровольца, который там будет стоять вместо меня я нашел относительно быстро: им оказался снеговик.

Так система получила полную автономность и казалось, была завершена. Но возникла следующая проблема: после отчистки все криперы пропадали, а скелет и снеговик мочили друг друга (почему они не пропадали, расскажу позже). По моим подсчётам, спустя несколько отчисток они должны были добить друг друга. Автономность исчезла. Решил я это написанием программы, которая каждые 15 минут (именно так происходит отчистка) активировала поршни, которые изолировали скелета и снеговика друг от друга. Было принято решение писать программу, а не таймеры, потому что таймеры могут делать небольшие погрешности, которые в нашем случае недопустимы и они не так удобны, ой да кого я обманываю, я просто хотел сделать универсальную прогу, чтоб все могли подстроить ее под свои нужды)

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

Следующая подстава была в том, что отчистка идет не всегда строго каждые 15 минут, могут быть погрешности до 10 секунд, что было критично для системы, по-этому было принято решение, заменить "таймер" на проверку наличия мобов в фармилке. На этом варианте я и остановился. На данный момент осталась всего одна проблема: рестарты так же происходят с некоторыми погрешностями, но как это фиксить, я пока не знаю, позже и это исправлю)
(Ох и долгое предисловие вышло, кто дочитал, тот красавчик))

1. Что нужно для создания фермы:

Спойлер

Систему можно полностью повторить при условии, что у вас есть данные 3 мода:

  • Mine factory reloaded
  • Open computers
  • Ender IO (или любой мод, где есть автоспавнер)

Что нужно для крафта:

  1. Строительные блоки
  2. Липкий поршень - 3 штуки
  3. Повторитель - 3 штуки
  4. Провода или красная пыль 
  5. Комплект компа с красным контроллером и кабелями
  6. Подсчитыватель мобов (дальше буду его называть ПМ)
  7. Коллектор края или любой предмет, который умеет собирать лут с земли 
  8. Источник криперов (любой спавнер)
  9. Скелет
  10. Снеговик
  11. Именная бирка - 2 штуки

Собираем что-то похожее, как на скриншоте.

Screenshot_86.thumb.png.c5820cd794b47db540e530f056719f01.png

Screenshot_85.thumb.png.142599583785cafdd5268207240c6aba.png

Сверх высокая точность тут не важна, главное - позаботьтесь о следующих моментах: Поставьте поршни и блоки на них перед скелетом и снеговиком так, чтоб при активации они не могли достать друг до друга(кстати, можно поставить всего один поршень любому из них, результат будет тот же)

Советую сделать место, куда будут сбрасываться криперы в 1 блок (как в моем случае), так ПМ точно не даст сбоя.

Прямо сзади ПМ располагается красный контроллер, к которому уже идут провода красного камня. Как по мне - это самый компактный вариант схемы.

Оба поршня, которые блокируют скелета и снеговика нужно выводить на одну сторону красного контроллера.

Сверху системы стоит третий поршень, который блокирует доступ криперам в фармилку на время рестарта.

Если вы достаточно близко приблизитесь к ПМ, он вас учтёт и откроет поршни, даже если криперов нет в фармилке, будьте осторожны! (на скриншоте ограждена область работы этого механизма забором)

2. Программа

Спойлер
--powered by ShinyBird368
local fs = require("filesystem")
local comp = require("component") 
local gpu = comp.gpu
local reds = comp.redstone

--down = 0
--up = 1 
--north = 2 
--south = 3
--west = 4
--east = 5

local side_dump = 3
local side_clear = 5
local side_count = 2

local time_restart_start = 59
local time_restart_stop = 10


function getHostTime(timezone)
    timezone = timezone or 2
    local file = io.open("/HostTime.tmp", "w")
    
    file:write("")
    file:close()

    local timeCorrection = timezone * 3600
    local lastModified = tonumber(string.sub(fs.lastModified("/HostTime.tmp"), 1, -4)) + timeCorrection
    fs.remove("/HostTime.tmp")

    local year = os.date("%Y", lastModified)
    local month = os.date("%m", lastModified)
    local day = os.date("%d", lastModified)
    local hour = os.date("%H", lastModified)
    local minute = os.date("%M", lastModified)
    local second = os.date("%S", lastModified)

    return tonumber(day), tonumber(month), tonumber(year), tonumber(hour), tonumber(minute), tonumber(second)
end

function real_time() 
    local text = string.format("%02d:%02d:%02d", host_time[4], host_time[5], host_time[6]) 
    return text
end

function clear_monitor(color_bg, color_fg)
    local w,h = gpu.getResolution()
    local oldbg = gpu.getBackground()
    local oldfg = gpu.getForeground()

    gpu.setBackground(color_bg)
    gpu.setForeground(color_fg)
    gpu.fill(1, 1, w, h, " ")
    gpu.setBackground(oldbg)
    gpu.setForeground(oldfg)
end

function check_clear()
    local mobs = reds.getInput(side_count)
    if mobs == 0 then
        gpu.set(1, 1, "[" .. real_time() .. "] Отчистка!")
        reds.setOutput(side_clear, 15)
    else
        gpu.set(1, 1, "[" .. real_time() .. "]")
        reds.setOutput(side_clear, 0)
    end
end

function restart()
    if (host_time[4] == 15 and host_time[5] == 59 and host_time[6] > time_restart_start) or 
    (host_time[4] == 16 and host_time[5] == 00 and host_time[6] < time_restart_stop) or 
    (host_time [4] == 00 and host_time[5] == 00 and host_time[6] > time_restart_start)  or 
    (host_time[4] == 00 and host_time[5] == 00 and host_time[6] < time_restart_stop) then 
        gpu.set(2, 1, "[Рестарт, смываем криперов]")
        reds.setOutput(side_dump, 15)
    else
        reds.setOutput(side_dump, 0)
  end
end

function main()
    while true do 
        host_time = {getHostTime(3)} 
        clear_monitor(1, 1) 
        check_clear()
        restart()
        os.sleep(1)
    
    end
end

main()

Как настроить компьютер, я уже писал в прошлых гайдах, вот ссылка)

Чтоб добавить программу в комп, пишите в консоль "edit название_программы", потом вставляйте код в программу, после чего пишем "название_программы" (все без кавычек)
Как обычно, вывожу переменные, которые нужно менять в самый верх

local side_dump = 3
local side_clear = 5
local side_count = 2
Это 3 стороны нашего контроллера. Я уже писал, как их настраивать в гайде выше.

local time_restart_start = 59
local time_restart_stop = 10
Эти значения можете не трогать, тут по умолчанию стоит 11 секунд блокировки фермы, но если хотите, можете поэкспериментировать)

Комплектующие компа я всегда беру с запасом, тк ещё не до конца разобрался, на сколько программы требовательны.

Это моя стандартная сборка для всех программ:

Screenshot_79.png.5245a9a6dbdf9f62371397b9acac4f9a.png

3. "Настройка" скелета и снеговика:

Спойлер

Чтоб наши участники дуэли не пропадали при отчистке, на них нужно навесить бирку, так они получат имя. Бирку надо переименовать в наковальне на любое название, на 2 бирки у вас уйдет 10 уровней, будьте готовы к тратам)

Screenshot_87.png.c4d99c968c9016026e8833ae77ccabbb.png

После просто кликайте биркой на каждого бойца и больше он не пропадет! (только, если вы его не убьете)

Screenshot_88.png.0582f49d4ebba62fdc56c2249ae94976.png

На этом все)

Знаю, программа не безупречна, можно было добавить более гибкий контроль (например, вручную остановить фармилку на какое то время или что-то подобное), но это уже в другой раз)

Так же на данный момент известно об одной ошибке: рестарт сервера происходит с погрешностью, изза чего снеговик может пропустить пару лишних стрел в тыкву, но как это исправить я пока не знаю, в будущем дополню гайд!

Пишите в комментариях любые вопросы, предложения или ошибки, всем отвечу! Спасибо всем, кто дочитал и удачи в постройке!

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...