🌿 Pflanzenregister und universelle Feldfrüchte
Agrarian Reform bietet ein konfigurationsfreies Pflanzen-Erkennungssystem (AgrarianCropRules.java) mit $O(1)$-Cache. Alle Vanilla- und Mod-Pflanzen werden automatisch registriert, für Offline-Wachstum vorbereitet und mit Spielregeln versehen.
🔍 Dynamische Pflanzenerkennungs-Engine
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 unterstützter Pflanzen und Wachstumsstufen
| Kategorie | Java-Klasse / Tag | Vanilla-Beispiele | Durchschnittstakt / Stufe | Kontinuum-Wachstum | Knochenmehl |
|---|---|---|---|---|---|
| Standardpflanzen | CropBlock, #c:crops | Weizen, Karotten, Kartoffeln, Rote Bete | $\sim 6,241\text{ Ticks}$ | ✅ Ja (Gedrosselt) | Vanilla |
| Hohe Halme | SugarCaneBlock, CactusBlock | Zuckerrohr, Kaktus | $1,365\text{ Ticks}$ | ✅ Ja (Höhe max 3) | ✅ Erweitert |
| Netherflora | NetherWartBlock | Netherwarze | $13,650\text{ Ticks}$ | ✅ Ja (Stufe 0 $\to$ 3) | ✅ Erweitert |
| Hülsen & Beeren | CocoaBlock, SweetBerryBushBlock | Kakaobohnen, Süßbeeren | $6,825\text{ Ticks}$ | ✅ Ja (Stufe 0 $\to$ 2/3) | ✅ Erweitert |
| Ranken & Efeu | VineBlock | Ranken | Variabel | ✅ Ja (Ausbreitung abwärts) | ✅ Erweitert |
| Bäume & Setzlinge | SaplingBlock | Eichen-, Fichten-, Birken-, Kirschsetzlinge | $95,550\text{ Ticks}$ | ✅ Ja (Baumwachstum) | Vanilla |
| Mod-Landwirtschaft | Jedes #c:crops oder AgeBlock | Farmer's Delight, Mystical Agriculture | Konfigurierbar | ✅ Ja (Skaliertes Delta) | Dynamisch / Erweitert |
🌾 Auflösungshierarchie der Multiplikatoren
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;
}🔄 Dynamische Erkennung und Robustheit bei Mod-Entfernung
- Erkennung im Spiel:
AgrarianCropRulesfängt Zufallsticks, Chunk-Ladevorgänge und Aktionen ab. Neue Mod-Pflanzen werden sofort erfasst, im $O(1)$-Cache gespeichert und ohne Neustart bereitgestellt. - Sicherheit bei Mod-Entfernung: Regeln und Caches nutzen reine
Identifier-Strings (namespace:path). Wird eine Mod deinstalliert, werden fehlende Blöcke ignoriert – ohne Abstürze oderClassNotFoundException.
🏷️ Datapack-Tag-Integration (AgrarianTags)
json
{
"replace": false,
"values": [
"#minecraft:crops",
"#c:crops",
"farmersdelight:cabbage",
"farmersdelight:tomatoes",
"farmersdelight:onions"
]
}See also: Das Kontinuum (Offline-Wachstum), Globaler Wachstums-Multiplikator, and Zwei-Ebenen-Konfiguration.
