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