🌿 Registro de plantas e culturas universais
O Agrarian Reform possui um mecanismo universal de identificação de plantações (AgrarianCropRules.java) com cache $O(1)$. Qualquer planta vanilla ou de mods é reconhecida automaticamente, simulada offline e associada a uma GameRule.
🔍 Motor de descoberta dinâmica e classificação
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 suportadas e estágios de crescimento
| Categoria | Classe Java / Tag | Exemplos Vanilla | Média de Ticks / Estágio | Crescimento Offline | Farinha de Osso |
|---|---|---|---|---|---|
| Culturas Comuns | CropBlock, #c:crops | Trigo, Cenouras, Batatas, Beterrabas | $\sim 6,241\text{ ticks}$ | ✅ Sim (Fila regulada) | Nativo vanilla |
| Hastes Altas | SugarCaneBlock, CactusBlock | Cana-de-açúcar, Cacto | $1,365\text{ ticks}$ | ✅ Sim (Altura máx 3) | ✅ Suporte ampliado |
| Flora do Nether | NetherWartBlock | Fungo do Nether | $13,650\text{ ticks}$ | ✅ Sim (Estágios 0 $\to$ 3) | ✅ Suporte ampliado |
| Vagens e Frutas | CocoaBlock, SweetBerryBushBlock | Cacau, Bagas Doces | $6,825\text{ ticks}$ | ✅ Sim (Estágios 0 $\to$ 2/3) | ✅ Suporte ampliado |
| Vinhas e Folhagem | VineBlock | Vinhas | Variável | ✅ Sim (Cresce para baixo) | ✅ Suporte ampliado |
| Árvores e Mudas | SaplingBlock | Mudas de Carvalho, Pinheiro, Bétula | $95,550\text{ ticks}$ | ✅ Sim (Vira árvore) | Nativo vanilla |
| Agricultura de Mods | Qualquer #c:crops ou AgeBlock | Farmer's Delight, Mystical Agriculture | Configurável | ✅ Sim (Delta ajustado) | Dinâmico / Ampliado |
🌾 Hierarquia de resolução 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;
}🔄 Detecção em Tempo Real e Tolerância a Desinstalação
- Detecção em Jogo: O
AgrarianCropRulesmonitora ticks, chunks e interações. Novas culturas de mods são detectadas na hora, salvas no cache $O(1)$ e recebem GameRules sem reiniciar. - Segurança ao Remover Mods: As regras utilizam strings
Identifier(namespace:path). Ao remover um mod, os blocos ausentes são ignorados com segurança sem gerar errosClassNotFoundException.
🏷️ Integração de tags de datapack (AgrarianTags)
json
{
"replace": false,
"values": [
"#minecraft:crops",
"#c:crops",
"farmersdelight:cabbage",
"farmersdelight:tomatoes",
"farmersdelight:onions"
]
}See also: O Continuum (Crescimento offline), Multiplicador global de crescimento, and Configuração em dois níveis.
