🌿 Реестр растений и универсальное автообнаружение культур
Agrarian Reform включает в себя движок универсального автообнаружения культур (AgrarianCropRules.java) с быстрым кэшем $O(1)$. Любая культура автоматически регистрируется для офлайн-симуляции Континуума и получает собственное игровое правило без настройки датапаков.
🔍 Движок динамического обнаружения и классификации
BLOCK INSPECTION
│
┌────────────────┴────────────────┐
▼ ▼
Known Cached Crop (O(1)) Uncached Block Type
│ │
▼ ▼
Return Multiplier 3-Tier Discovery Pipeline
1. Class Hierarchy: CropBlock, SaplingBlock, BonemealableBlock
2. Tag Membership: #c:crops, #minecraft:crops, #farmersdelight:wild_crops
3. Property Inspection: BlockState with "age" IntegerProperty
│
▼ (If Match Found)
DYNAMIC REGISTRATION
- Cache in DYNAMIC_CROPS Set
- Register GameRule: agrarian_reform:crop_growth_multiplier_<id>
- Mark AgrarianConfig dirty = true📊 Индекс поддерживаемых растений и стадии роста
| Категория | Целевой класс Java / Тег | Примеры в игре | Тактов на стадию | Офлайн-рост | Костная мука |
|---|---|---|---|---|---|
| Обычные культуры | CropBlock, #c:crops | Пшеница, морковь, картофель, свекла | $\sim 6,241\text{ тактов}$ | ✅ Да (Ограниченная очередь) | Ванилла |
| Высокие стебли | SugarCaneBlock, CactusBlock | Сахарный тростник, кактус | $1,365\text{ тактов}$ | ✅ Да (Высота до 3) | ✅ Расширенная |
| Флора Незера | NetherWartBlock | Адский нарост | $13,650\text{ тактов}$ | ✅ Да (Стадии 0 $\to$ 3) | ✅ Расширенная |
| Стручки и ягоды | CocoaBlock, SweetBerryBushBlock | Какао-бобы, сладкие ягоды | $6,825\text{ тактов}$ | ✅ Да (Стадии 0 $\to$ 2/3) | ✅ Расширенная |
| Лианы и вьюны | VineBlock | Лианы | Переменное | ✅ Да (Рост вниз) | ✅ Расширенная |
| Деревья и саженцы | SaplingBlock | Саженцы дуба, ели, березы, вишни | $95,550\text{ тактов}$ | ✅ Да (Превращение в дерево) | Ванилла |
| Модовые культуры | Любой #c:crops или AgeBlock | Farmer's Delight, Mystical Agriculture | Настраивается | ✅ Да (Масштабируемый прирост) | Динамическая |
🌾 Иерархия множителей и состояние заморозки
java
public static int getEffectiveGrowthMultiplier(Level level, Block block) {
Identifier id = BuiltInRegistries.BLOCK.getKey(block);
// 1. Check world-specific GameRule
GameRule<Integer> dynamicRule = DYNAMIC_GAMERULES.get(id);
if (dynamicRule != null && level instanceof ServerLevel serverLevel) {
int val = DynamicGameRuleManager.getInt(serverLevel, dynamicRule);
if (val > 0) return val; // Positive override
if (val == -1) return 0; // -1 = Frozen (0% growth)
}
// 2. Fall back to Global Multiplier
if (level instanceof ServerLevel serverLevel) {
return DynamicGameRuleManager.getInt(serverLevel, AgrarianGameRules.GLOBAL_GROWTH_MULTIPLIER);
}
return 100;
}🔄 Автообнаружение и безопасность удаления модов
- Динамическое обнаружение:
AgrarianCropRulesотслеживает случайные такты, загрузку чанков и взаимодействие с блоками. Новые модовые культуры обнаруживаются на лету, кэшируются за $O(1)$ и сразу получают правила без перезапуска. - Защита от сбоев при удалении модов: Динамические правила хранят строки
Identifier(namespace:path) без прямых ссылок на классы. При удалении мода несуществующие блоки безопасно игнорируются без ошибокClassNotFoundException.
🏷️ Интеграция тегов датапаков (AgrarianTags)
json
{
"replace": false,
"values": [
"#minecraft:crops",
"#c:crops",
"farmersdelight:cabbage",
"farmersdelight:tomatoes",
"farmersdelight:onions"
]
}See also: Континуум (Офлайн-рост), Глобальный множитель роста, and Двухуровневая конфигурация.
