🌿 Registre des plantes et cultures universelles
Agrarian Reform intègre un moteur universel de découverte de cultures (AgrarianCropRules.java) avec cache $O(1)$. Toutes les cultures vanilla ou de mods sont reconnues automatiquement, simulées hors-ligne et associées à une GameRule.
🔍 Moteur de détection dynamique et classification
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📊 Index des plantes prises en charge et stades de croissance
| Catégorie | Classe Java / Tag | Exemples Vanilla | Ticks moyens / Stade | Simulation hors-ligne | Poudre d'os |
|---|---|---|---|---|---|
| Cultures courantes | CropBlock, #c:crops | Blé, carottes, pommes de terre, betteraves | $\sim 6,241\text{ ticks}$ | ✅ Oui (File régulée) | Natif vanilla |
| Hautes tiges | SugarCaneBlock, CactusBlock | Canne à sucre, cactus | $1,365\text{ ticks}$ | ✅ Oui (Hauteur max 3) | ✅ Étendu |
| Flore du Nether | NetherWartBlock | Verrue du Nether | $13,650\text{ ticks}$ | ✅ Oui (Stades 0 $\to$ 3) | ✅ Étendu |
| Gousses et baies | CocoaBlock, SweetBerryBushBlock | Cacao, baies sucrées | $6,825\text{ ticks}$ | ✅ Oui (Stades 0 $\to$ 2/3) | ✅ Étendu |
| Lianes et feuillage | VineBlock | Lianes | Variable | ✅ Oui (Propagation bas) | ✅ Étendu |
| Arbres et pousses | SaplingBlock | Pousses de chêne, sapin, bouleau, cerisier | $95,550\text{ ticks}$ | ✅ Oui (Pousse d'arbre) | Natif vanilla |
| Agriculture de mods | Tout #c:crops ou AgeBlock | Farmer's Delight, Mystical Agriculture | Configurable | ✅ Oui (Delta ajusté) | Dynamique / Étendu |
🌾 Résolution de la hiérarchie des multiplicateurs
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;
}🔄 Découverte dynamique et tolérance au retrait de mods
- Découverte en jeu :
AgrarianCropRulesintercepte les ticks et interactions. Les nouvelles cultures de mods sont détectées en direct, stockées en cache $O(1)$ et dotées de GameRules sans redémarrage. - Protection contre la suppression de mods : Les règles s'appuient sur des chaînes
Identifier(namespace:path). Si un mod est désinstallé, les blocs absents sont ignorés sans crash niClassNotFoundException.
🏷️ Intégration des tags de datapacks (AgrarianTags)
json
{
"replace": false,
"values": [
"#minecraft:crops",
"#c:crops",
"farmersdelight:cabbage",
"farmersdelight:tomatoes",
"farmersdelight:onions"
]
}See also: Le Continuum (Croissance hors-ligne), Multiplicateur global de croissance, and Configuration à deux niveaux.
