🌿 Registro de plantas y soporte universal de cultivos
Agrarian Reform incorpora un motor universal de detección de cultivos (AgrarianCropRules.java) con caché $O(1)$. Cualquier cultivo vanilla o de mod se detecta automáticamente, se incluye en la simulación offline y obtiene su propia GameRule.
🔍 Motor dinámico de descubrimiento y clasificación
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📊 Índice de plantas soportadas y etapas de crecimiento
| Categoría | Clase Java / Etiqueta | Ejemplos Vanilla | Ticks medios / Fase | Simulación offline | Polvo de hueso |
|---|---|---|---|---|---|
| Cultivos estándar | CropBlock, #c:crops | Trigo, zanahorias, patatas, remolachas | $\sim 6,241\text{ ticks}$ | ✅ Sí (Cola regulada) | Nativo vanilla |
| Tallos altos | SugarCaneBlock, CactusBlock | Caña de azúcar, cactus | $1,365\text{ ticks}$ | ✅ Sí (Altura máx 3) | ✅ Soporte ampliado |
| Flora del Nether | NetherWartBlock | Verruga del Nether | $13,650\text{ ticks}$ | ✅ Sí (Fases 0 $\to$ 3) | ✅ Soporte ampliado |
| Vainas y bayas | CocoaBlock, SweetBerryBushBlock | Cacao, bayas dulces | $6,825\text{ ticks}$ | ✅ Sí (Fases 0 $\to$ 2/3) | ✅ Soporte ampliado |
| Enredaderas y lianas | VineBlock | Enredaderas | Variable | ✅ Sí (Propagación hacia abajo) | ✅ Soporte ampliado |
| Árboles y brotes | SaplingBlock | Brotes de roble, abeto, abedul, cerezo | $95,550\text{ ticks}$ | ✅ Sí (Crecimiento de árbol) | Nativo vanilla |
| Agricultura de mods | Cualquier #c:crops o AgeBlock | Farmer's Delight, Mystical Agriculture | Configurable | ✅ Sí (Delta escalado) | Dinámico / Ampliado |
🌾 Resolución de jerarquía de multiplicadores
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;
}🔄 Detección en tiempo de ejecución y resistencia a borrado de mods
- Detección dinámica en partida:
AgrarianCropRulesintercepta ticks aleatorios, escaneos de chunks y eventos de uso. Las plantas de mods nuevos se detectan al instante y generan su GameRule sin reiniciar. - Seguridad ante desinstalación de mods: Las reglas utilizan cadenas
Identifierestándar (namespace:path). Al desinstalar un mod, los bloques ausentes se ignoran de forma segura sin causar caídasClassNotFoundException.
🏷️ Integración de tags de datapacks (AgrarianTags)
json
{
"replace": false,
"values": [
"#minecraft:crops",
"#c:crops",
"farmersdelight:cabbage",
"farmersdelight:tomatoes",
"farmersdelight:onions"
]
}See also: El Continuo (Crecimiento offline), Multiplicador global de crecimiento, and Configuración de dos niveles.
