🌿 Registri Tanaman & Tanaman Universal
Agrarian Reform menghadirkan mesin penemuan tanaman universal (AgrarianCropRules.java) dengan cache $O(1)$. Seluruh tanaman vanilla maupun mod otomatis terdeteksi, didukung dalam pertumbuhan offline, dan diberikan GameRule tersendiri.
🔍 Mesin Penemuan & Klasifikasi Tanaman Dinamis
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📊 Indeks Tanaman yang Didukung & Tahapan Pertumbuhan
| Kategori | Target Class Java / Tag | Contoh Vanilla | Rata-rata Tick / Tahap | Pertumbuhan Offline | Tepung Tulang |
|---|---|---|---|---|---|
| Tanaman Standar | CropBlock, #c:crops | Gandum, Wortel, Kentang, Bit Merah | $\sim 6,241\text{ tick}$ | ✅ Ya (Antrean Bertahap) | Standar Vanilla |
| Batang Tinggi | SugarCaneBlock, CactusBlock | Tebu, Kaktus | $1,365\text{ tick}$ | ✅ Ya (Tinggi Maks 3) | ✅ Dukungan Ekstra |
| Flora Nether | NetherWartBlock | Nether Wart | $13,650\text{ tick}$ | ✅ Ya (Tahap 0 $\to$ 3) | ✅ Dukungan Ekstra |
| Polong & Buah | CocoaBlock, SweetBerryBushBlock | Biji Kakao, Buah Beri | $6,825\text{ tick}$ | ✅ Ya (Tahap 0 $\to$ 2/3) | ✅ Dukungan Ekstra |
| Sulur Tanaman | VineBlock | Sulur | Fleksibel | ✅ Ya (Tumbuh ke Bawah) | ✅ Dukungan Ekstra |
| Pohon & Bibit | SaplingBlock | Bibit Ek, Spruce, Birch, Ceri | $95,550\text{ tick}$ | ✅ Ya (Menjadi Pohon) | Standar Vanilla |
| Tanaman Mod | Semua #c:crops atau AgeBlock | Farmer's Delight, Mystical Agriculture | Dapat Diatur | ✅ Ya (Delta Seimbang) | Dinamis / Ekstra |
🌾 Resolusi Hierarki Pengali & Status Beku
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;
}🔄 Deteksi Saat Bermain & Ketahanan Hapus Mod
- Deteksi Dinamis:
AgrarianCropRulesmencegat random tick dan pemuatan chunk. Tanaman mod baru langsung dikenali seketika, disimpan di cache $O(1)$, dan langsung memiliki GameRule tanpa perlu restart. - Keamanan Saat Mod Dihapus: Aturan dinamis hanya menyimpan teks
Identifier(namespace:path). Saat mod dicopot, blok yang hilang diabaikan dengan aman tanpa menyebabkan crash atauClassNotFoundException.
🏷️ Integrasi Tag Datapack (AgrarianTags)
json
{
"replace": false,
"values": [
"#minecraft:crops",
"#c:crops",
"farmersdelight:cabbage",
"farmersdelight:tomatoes",
"farmersdelight:onions"
]
}See also: The Continuum (Pertumbuhan Luar Jaringan), Pengali Pertumbuhan Global, and Konfigurasi Dua Tingkat.
