Станция дрона-садовника
alaindustrial:garden_drone_station
Сводка
Станция дрона-садовника — блок-док 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 учитывается: зачарованная мотыга живёт в станции столько же, сколько в руках. Уже сломанную мотыгу слот не принимает — иначе она заняла бы его навсегда.
Приоритет действий (проверяется в этом порядке, выполняется первое подошедшее):
- Собрать — клетка с созревшей культурой в радиусе (нужна мотыга и незаблокированный выход).
- Посадить — пустая клетка над грунтом из
#minecraft:supports_crops+ есть подходящие семена в слоте. - Удобрить — клетка с недозревшей культурой + есть костная мука в слоте.
- Выполоть — трава или куст из тега сорняков (нужна мотыга и незаблокированный выход).
- Вспахать — клетка с ванильной землёй или травой, над которой пусто (нужна мотыга; переводит её в грядку).
Такой порядок гарантирует, что «ферма сама себя обслуживает» без разрывов: без вспашки как последнего действия обещание ломалось бы при первом расширении грядки игроком, а выпалывание стоит прямо перед ней, потому что именно сорняк занимает клетку над землёй, которую надо вспахать.
Выпалывание. Дрон выдёргивает дикую растительность, под которой земля иначе так и осталась бы невспаханной: поле на болоте или в саванне без этого навсегда остаётся заросшим. Сорняк — это блок из тега #: низкая и высокая трава, папоротник и раскидистый папоротник, мёртвый куст, куст, куст со светлячками, низкая и высокая сухая трава, сухие листья и (где он есть в игре) красный куст. Список — тег, а не класс блока: в игре все растения, включая культуры, кок-сагыз и жердочку мода, — одного класса, и проверка по классу выпалывала бы саму ферму. Не трогаются никогда: цветы, саженцы, листва, грибы и лианы (их посадил или оставил игрок), а также всё, что дрон собирает как урожай — культуры, кок-сагыз и его корень, жердочка. Тег можно расширить датапаком.
- Цена — та же, что у любого действия: 1 единица прочности мотыги и EU/FE. Это сознательное отклонение от ванили: в руке игрока мотыга о траву не изнашивается, а здесь каждое выпалывание — работа инструментом, как вспашка и сбор.
- Двухблочные растения (высокая трава, раскидистый папоротник) убираются целиком за одно действие: целью всегда служит нижняя половина — лут платит только она, — а верхняя уходит вместе с ней.
- Выпад — тот, что дало бы растение, сломанное рукой без ножниц (семена пшеницы из травы с шансом 1 из 8, палки из мёртвого куста, сам куст со светлячками, сухие листья), — ложится в выходные слоты станции;
ItemEntityв мире не появляется. У растения слышен ванильный звук слома и видны его частицы. - Часть сорняков не роняет ничего — и всё равно выпалывается. Куст, низкая и высокая сухая трава без ножниц не дают ничего (в таблице выпадения 26.3 у них условие ножниц или шёлкового касания), трава и папоротники пусты в 7 случаях из 8. Выпалывают их не ради добычи, а ради чистой клетки под вспашку; прочность мотыги тратится один раз на клетку.
- Забитый выход останавливает выпалывание так же, как сбор — см. «Забитый выход» ниже. Сорняки, которые всегда что-то роняют (куст со светлячками, сухие листья), способны забить выход — станцию в таком поле нужно разгружать.
Забитый выход. Если выпад спелой культуры или сорняка не помещается в выходные слоты, культура или сорняк остаются на месте, мотыга и 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) | только автоматическая вставка станцией (урожай и выпад сорняков); ручная/автоматизированная вставка извне заблокирована | до стека каждый |
Четыре выходных слота, а не один — созревшая культура может дать больше одного типа предмета за одно действие (например, пшеница даёт саму пшеницу и семена пшеницы отдельно); один слот со смешанным содержимым в базовой модели машин мода не поддерживается. Вставка дропа в выходные слоты двухпроходная («симулировать вместимость всех стаков → мутировать только при полном успехе»), без частичной потери урожая при заполненном выходе.
Интерфейс
- Тип: container (GUI станции).
- Показывает: буфер энергии (полоса), слоты семян/удобрения/выхода и строку состояния станции на экране (нет ресурса / работает / всё сделано за цикл / нет энергии / нет дрона / выход заполнен). Огонёк состояния на модели дрона, по которому это читалось бы издалека, запланирован ( этап 3) и пока не сделан.
Свойства блока
Станция-док — не полный куб: тонкая плита 1×1 блок с подсвеченным контуром посадки, двумя контактами зарядки и жёлтыми лампами по углам. Дрон рисуется поверх неё ом и физически не имеет коллизии/хитбокса отдельно от станции.
| Поле | Значение |
|---|---|
| Форма | плита пониженной высоты (не полный куб; окклюдер по нижней части блока) |
| Прочность | 3.0 |
| Взрывоустойчивость | 6.0 |
| Инструмент | кирка |
| Дроп с NBT энергии | нет (буфер/инвентарь/состояние дрона сохраняются через ValueInput/ValueOutput, не через NBT-дроп предмета) |
Рецепты
- Крафт: (железный/стальной корпус, электронная схема, воронка как «собирает в себя», медь как винты).
- Рецептов переработки нет — станция не перерабатывает предметы.
Прогрессия
- Тир: LV.
- Питание: от любого LV-источника, например Генератор.
- Заменяет (в бэклоге, без кода): «Автоуход за культурами» и «Сборщик урожая» один блок вместо двух стационарных с тем же результатом.
- Требует: электронную схему для крафта (как большинство LV-машин мода).
Связанное
- Опрыскиватель — соседний по грядке блок, роли не пересекаются. Дрон — точечный работник: одно действие на одну клетку, платит костной мукой и EU/FE, он пашет, сажает, полет и собирает. Опрыскиватель — пассивная зона: не трогает ни грядку, ни урожай, только ускоряет рост всего живого вокруг и платит питательным раствором. Их ставят вместе.
- Коса — источник переиспользуемого предиката зрелости культуры.
- Жердочка — существующий в моде прецедент
BonemealableBlock. - Инкубатор — образец многослотового инвентаря с тег-валидацией по индексу и
ContainerDataшире базового. - Насос — образец зонального сканирования с лимитами и единственный прецедент, где машина меняет блок мира из своего тика без игрока.
- Электрический обогреватель — образец «EU/FE только за полезный такт» (demand-driven).
Крафт
Крафт на верстаке
▶
Станция дрона-садовника