Skip to content

🌿 作物レジストリと汎用作物自動検出エンジン

Agrarian Reformには、$O(1)$高速キャッシュを活用した設定不要の全作物自動検出エンジンAgrarianCropRules.java)が備わっています。バニラやMODの作物を自動的に検知し、オフライン成長に対応させ、専用GameRuleを生成します。


🔍 動的作物検出・分類エンジン

                               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

📊 サポート対象植物一覧と成長ステージ数学

分類Java対象クラス / タグバニラでの代表例1段階の平均ティック数オフライン追いつき骨粉機能拡張
一般作物CropBlock, #c:crops小麦、ニンジン、ジャガイモ、ビートルート$\sim 6,241\text{ ティック}$✅ 対応(分散処理)バニラ標準
高茎植物SugarCaneBlock, CactusBlockサトウキビ、サボテン$1,365\text{ ティック}$✅ 対応(最大3段)✅ 拡張対応
ネザー植物NetherWartBlockネザーウォート$13,650\text{ ティック}$✅ 対応(段階0 $\to$ 3)✅ 拡張対応
果実・低木CocoaBlock, SweetBerryBushBlockカカオ豆、スイートベリー$6,825\text{ ティック}$✅ 対応(段階0 $\to$ 2/3)✅ 拡張対応
ツタ・植物VineBlockツタ変動✅ 対応(下方拡散)✅ 拡張対応
樹木・苗木SaplingBlockオーク、トウヒ、シラカバ、桜の苗木$95,550\text{ ティック}$✅ 対応(成木へ成長)バニラ標準
MOD農業作物#c:crops または AgeBlockFarmer's Delight、Mystical Agriculture設定可能✅ 対応(等比進行)動的 / 拡張対応

🌾 成長倍率の決定階層と凍結状態

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;
}

🔄 実行時検出とMOD削除時の安全性

  1. ゲーム中の動的検出AgrarianCropRulesはランダムティックやチャンク読み込みを監視します。新たに出現したMOD作物をその場で検出し、$O(1)$キャッシュに登録してGameRuleを即座に生成します。
  2. MOD削除時のクラッシュ防止:動的ルールとキャッシュは標準のIdentifier文字列(namespace:path)のみを保持します。MOD削除時も該当ブロックを安全にスキップし、クラッシュやClassNotFoundExceptionは一切発生しません

🏷️ データパックタグ統合 (AgrarianTags)

json
{
  "replace": false,
  "values": [
    "#minecraft:crops",
    "#c:crops",
    "farmersdelight:cabbage",
    "farmersdelight:tomatoes",
    "farmersdelight:onions"
  ]
}

See also: コンティニュアム (オフライン成長持続), グローバル成長倍率と個別調整, and 2層設定システム.

Official documentation & web portal for Dasik Igaijinn mods.