Станция дрона-садовника

Станция дрона-садовника

alaindustrial:garden_drone_station
Сельское хозяйствоLVРеализованоtier-lvagriculturedroneautomationber

Сводка

Станция дрона-садовника — блок-док 1×1 (как база робота-пылесоса), с которого поднимается дрон и облетает территорию вокруг станции радиусом 4 блока. Дрон не Entity, а объект, который отрисовывает самой станции — визуально он выглядит и двигается как летающий аппарат, но физически всегда «принадлежит» блоку станции и не может покинуть её зону.

Игрок кладёт в станцию семена и костную муку, подключает EU/FE — и дрон дальше сам поддерживает грядки: вспахивает свободную землю, сажает семена в пустые клетки над подходящим грунтом, ускоряет рост недозревших культур костной мукой, выпалывает траву и кусты, под которыми земля не вспахивается, и свозит спелый урожай прямо в свои выходные слоты (без ItemEntity в мире). Замещает запланированные, но нереализованные «Автоуход за культурами» и «Сборщик урожая» — один блок вместо двух, без дублирования механики.

Энергия

ПолеЗначение
Рольпотребитель с буфером
Буфер (EU/FE)4000
Макс. вход (EU/FE/такт)32 (LV)
Макс. выход (EU/FE/такт)н/п (не отдаёт)
EU/FE за действие8

Станция подключается к энергосети как обычный потребитель на всех рабочих гранях. EU/FE списывается только за фактически выполненное действие — вспашка, посадка, удобрение, сбор или выпалывание одной клетки — по паттерну Электрического обогревателя: простой (нечего делать в радиусе — семена/удобрение кончились, либо все клетки уже обслужены) стоит 0 EU/FE, и станция уходит в спящий режим, не тратя энергию впустую и не превращаясь в паразитный сток для сети.

Процессинг

Станция не использует систему рецептов переработки — вместо неё за каждый вылет дрона (когда цель найдена) выполняется одно из пяти действий над одной клеткой зоны.

ПолеЗначение
Тип рецептанет (не рецептная машина)
Действий за вылет1 (одно действие — одна клетка)
Авто-выгрузкада (урожай сразу в выходные слоты станции)

Мотыга — инструмент трёх действий. Вспашка, сбор урожая и выпалывание расходуют по 1 единице прочности мотыги из её слота и без мотыги не выполняются: инструмент, который тратится на действие, но не требуется для него, игроку непонятен. Посадка и удобрение мотыги не требуют.

Мотыга срабатывается до конца — и слот освобождается. Станция тратит последнюю единицу прочности, после чего мотыга ломается и исчезает из слота ровно так же, как в руках у игрока: со звуком поломки и частицами. Это не косметика, а условие автоматизации — пустой слот принимает новую мотыгу из хоппера, и ферма работает без присмотра. Износ идёт ванильным путём, поэтому Unbreaking учитывается: зачарованная мотыга живёт в станции столько же, сколько в руках. Уже сломанную мотыгу слот не принимает — иначе она заняла бы его навсегда.

Приоритет действий (проверяется в этом порядке, выполняется первое подошедшее):

  1. Собрать — клетка с созревшей культурой в радиусе (нужна мотыга и незаблокированный выход).
  2. Посадить — пустая клетка над грунтом из #minecraft:supports_crops + есть подходящие семена в слоте.
  3. Удобрить — клетка с недозревшей культурой + есть костная мука в слоте.
  4. Выполоть — трава или куст из тега сорняков (нужна мотыга и незаблокированный выход).
  5. Вспахать — клетка с ванильной землёй или травой, над которой пусто (нужна мотыга; переводит её в грядку).

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

Выпалывание. Дрон выдёргивает дикую растительность, под которой земля иначе так и осталась бы невспаханной: поле на болоте или в саванне без этого навсегда остаётся заросшим. Сорняк — это блок из тега #: низкая и высокая трава, папоротник и раскидистый папоротник, мёртвый куст, куст, куст со светлячками, низкая и высокая сухая трава, сухие листья и (где он есть в игре) красный куст. Список — тег, а не класс блока: в игре все растения, включая культуры, кок-сагыз и жердочку мода, — одного класса, и проверка по классу выпалывала бы саму ферму. Не трогаются никогда: цветы, саженцы, листва, грибы и лианы (их посадил или оставил игрок), а также всё, что дрон собирает как урожай — культуры, кок-сагыз и его корень, жердочка. Тег можно расширить датапаком.

Забитый выход. Если выпад спелой культуры или сорняка не помещается в выходные слоты, культура или сорняк остаются на месте, мотыга и EU/FE не тратятся, а станция запоминает, что выход заблокирован: пока это так, она не собирает и не выпалывает и дрон к таким клеткам не летает — до этой правки он бесконечно летал к одной и той же спелой культуре со статусом «Работает». Выход блокируется и без попытки, когда все четыре слота заняты полными стопками: тогда не поместится ничего. Посадка, удобрение и вспашка продолжаются; если и для них работы нет, а в радиусе стоит спелая культура или сорняк, которых некуда деть, экран показывает «Выход заполнен» (над ухоженной фермой блокировка ничего не держит, и статус остаётся «Грядки обслужены» или «Расходники кончились») (янтарным, как «Расходники кончились», — это чинит игрок; при пустом слоте семян «Выход заполнен» важнее, потому что держит сбор, первое по приоритету действие). Блокировка снимается, как только из выходного слота что-то забрали — рукой, shift-кликом, воронкой или трубой: станция сравнивает число предметов в выходе со снимком на момент блокировки, поэтому любой путь изъятия работает одинаково на обоих загрузчиках; спящая станция замечает это на следующем полном такте, не позже чем через 40 тиков. Цена решения: после одной неудачи станция ждёт разгрузки, даже если выпад другой клетки ещё поместился бы, — угадывать случайный выпад заранее значило бы лишний раз бросать таблицу лута. Состояние сохраняется вместе со станцией; мир, сохранённый до правки, грузится с незаблокированным выходом, и первая же неудача блокирует его снова. Если выпад одной клетки не помещается даже в пустой выход (больше четырёх стопок), забирать нечего — такую блокировку станция снимает сама из простоя, то есть повторяет попытку раз в 40 тиков.

Грунт для посадки — ванильный тег, а не блок. Посадка (и отбор клеток в кэш зоны) считает грунтом любой блок из #minecraft:supports_crops — того же тега, по которому сама культура решает, может ли она стоять на блоке. Дрон и растение поэтому не расходятся в том, что считать землёй: rich soil farmland из Farmer's Delight (и грунт любого мода, добавленный в этот тег) дрон обрабатывает как родную грядку — без единой строчки, знающей про чужие id. Вспашка тегу не следует: во ванильную грядку переводятся только ванильные земля и трава, чужой грунт дрон не перекапывает никогда — rich soil игрок получил костной мукой, и станция не должна его уничтожать.

Полёт. Действие наступает не в момент выбора цели, а по прилёту дрона: дрон летит к клетке со скоростью = 11 тиков на блок пути, и только там выполняет работу. Плечо не короче MIN_FLIGHT_TICKS = 26 тиков — соседнюю клетку дрон иначе преодолевал бы быстрее, чем глаз успевает заметить. Обратный путь к доку занимает столько же, сколько путь к цели, плюс LANDING_PAUSE_TICKS = 6 тиков дрон стоит на обработанной клетке (см. ниже), так что один цикл «действие» стоит минимум 58 тиков (≈2.9 секунды), а не такт: станция ухаживает за грядкой темпом машины, а не мгновенно. Без этого она обслуживала бы всю ферму за пару тиков — визуально это читалось бы как телепортация, а не как машина, которая делает работу. По прилёту задание перепроверяется: мир мог измениться за время полёта (игрок сорвал урожай руками, поршень сдвинул блок), поэтому цель валидируется заново, а не принимается на веру.

Звук полёта. Пока дрон в воздухе, слышен тихий зацикленный звук винтов, и он исходит от самого дрона — источник движется вместе с ним, а не висит на станции. Так и должно быть: дрон уходит на несколько блоков и проходит прямо над головой, а жужжание, доносящееся с площадки, читалось бы как ошибка. Радиус слышимости 8 блоков и громкость 0.22 — самые низкие в моде: это единственный звук, который сам приезжает к игроку, и единственный, который звучит почти весь рабочий цикл. На доке и в те тики, что дрон стоит на обработанной клетке, — тишина.

Звук вспашки. Вспахивая клетку, дрон издаёт тот же ванильный звук мотыги (minecraft:item.hoe.till), что и игрок, работающий мотыгой вручную — с той же громкостью и тем же питчем. Свой звук мотыги есть только у вспашки: у неё есть однозначный ванильный эталон, а у посадки, удобрения и сбора его нет. Выпалывание звучит так, как звучит само растение при сломе.

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

Зона сканирования. Радиус 4 блока вокруг станции — это ровно стандартная грядка 9×9 (2 × 4 + 1) целиком: док стоит в её центре и достаёт до любого угла. Дрон первого тира обслуживает одну такую грядку — следующим тирам есть куда расти: несколько грядок разом или зона шире одной. Список целей в зоне кэшируется и инвалидируется по блок-апдейту внутри радиуса; полная пересборка кэша происходит не чаще раза в = 20 тиков. Перед касанием любой позиции зоны обязательна проверка level.isLoaded — станция не форсирует синхронную загрузку невыгруженных чанков.

Зрелость культуры определяется общим предикатом, переиспользуемым из Косы (тот же класс, что решает, готов ли урожай к сбору — стебли тыквы/дыни, основание кактуса/тростника, ягодный куст и ванильные CropBlock обрабатываются одинаково в обоих местах, без риска разъехавшихся edge-кейсов).

Удобрение применяется через стандартный ванильный интерфейс BonemealableBlock (та же тройка методов, что уже использует Жердочка для хлопка) — эффект идентичен ручной костной муке, но без игрока и без частиц-имитации клика.

Сбор без игрока. Станция не ломает блок через ServerPlayer-путь (игрока нет) — вместо этого она server-side вычисляет дроп созревшей культуры, вставляет его в свои выходные слоты и только при полном успехе сносит блок урожая напрямую. Ни ItemEntity, ни события слома блока при этом не создаются — тот же осознанный компромисс, что уже принят у Насоса при осушении источника.

Инвентарь

СлотПринимаетКол-во
Семена (0)предметы с тегом семян соответствующей культурыдо стека
Удобрение (1)minecraft:bone_mealдо стека
Дрон (6)— без него станция не работает1
Мотыга (7)любая мотыга (#minecraft:hoes); тратится на вспашке, сборе и выпалывании1
Выход 1–4 (2–5)только автоматическая вставка станцией (урожай и выпад сорняков); ручная/автоматизированная вставка извне заблокированадо стека каждый

Четыре выходных слота, а не один — созревшая культура может дать больше одного типа предмета за одно действие (например, пшеница даёт саму пшеницу и семена пшеницы отдельно); один слот со смешанным содержимым в базовой модели машин мода не поддерживается. Вставка дропа в выходные слоты двухпроходная («симулировать вместимость всех стаков → мутировать только при полном успехе»), без частичной потери урожая при заполненном выходе.

Интерфейс

Свойства блока

Станция-док — не полный куб: тонкая плита 1×1 блок с подсвеченным контуром посадки, двумя контактами зарядки и жёлтыми лампами по углам. Дрон рисуется поверх неё ом и физически не имеет коллизии/хитбокса отдельно от станции.

ПолеЗначение
Формаплита пониженной высоты (не полный куб; окклюдер по нижней части блока)
Прочность3.0
Взрывоустойчивость6.0
Инструменткирка
Дроп с NBT энергиинет (буфер/инвентарь/состояние дрона сохраняются через ValueInput/ValueOutput, не через NBT-дроп предмета)

Рецепты

Прогрессия

Связанное

Крафт

Крафт на верстаке
Любой медный слиток
Любой железный слиток
Любой медный слиток
Любой железный слиток
Электронная схема
Любой железный слиток
Любой железный слиток
Любой железный слиток
Любой железный слиток
Верстак
▶
Станция дрона-садовника
Станция дрона-садовника