デスポーンタイマーと寿命継承 (MC 26.2)
本書では、Minecraft 26.2 におけるデスポーンのライフサイクル、時間計算、最新寿命継承ルール、トラップ保護機能を解説します。
📊 機能情報ボックス
| 項目 | 仕様 |
|---|---|
| システム名 | 最新寿命デスポーン保護システム |
| バニラの消滅時間 | $6,000\text{ ティック}$ ($300\text{ 秒} = 5.0\text{ 分}$) |
| 寿命継承ルール | $\text{age}_{\text{merged}} = \min(\text{age}_A, \text{age}_B)$ (最も新しいアイテムを継承) |
| 拾得遅延ルール | $\text{pickupDelay}_{\text{merged}} = \max(\text{pickupDelay}_A, \text{pickupDelay}_B)$ (長い方を維持) |
| 対象フィールド | ItemEntity.age および ItemEntity.pickupDelay |
| 放置時の挙動 | 新規アイテムの結合がない場合、通常の5分タイマーで安全に消滅 |
⏳ ティックから秒への換算計算
Minecraftでは、エンティティのタイマーは毎秒20ティックで動作します:
$$1\text{ second} = 20\text{ ticks}$$ $$1\text{ minute} = 60\text{ seconds} = 1,200\text{ ticks}$$ $$5\text{ minutes} = 300\text{ seconds} = 6,000\text{ ticks}$$
バニラでは、ItemEntity の内部フィールド age が毎tick $+1$ 加算されます。$\text{age} \ge 6000$ に達するとアイテムは消滅 (デスポーン) します。
🛡️ 最も新しいアイテムの保護ルール
Item Clumps で2つのアイテムが結合すると、残ったエンティティは以下を実行します:
$$\text{age}{\text{merged}} = \min(\text{age}{\text{this}}, \text{age}_{\text{other}})$$
Existing Ground Clump Newly Dropped Item
- Count: 500 Cobblestone - Count: 1 Cobblestone
- Age: 5,800 ticks (4m 50s old) - Age: 0 ticks (Brand new)
│ │
└──────────────────────┬───────────────────────┘
│ (Item Clumps Merging)
▼
Merged Mega-Stack Entity
- Count: 501 Cobblestone
- Age: min(5800, 0) = 0 ticks (Fresh 5-minute timer)高効率トラップタワーが保護される理由
- バニラの寿命問題: バニラではアイテム回収が遅い場合、4分50秒経過した古いアイテムに新しいアイテムが結合すると、わずか10秒後にすべて消滅してしまう問題がありました。
- Item Clumpsの解決策: トラップタワーなどで継続的にアイテムが供給される限り、集約アイテムの寿命は常に
0にリセットされます。したがって、稼働中のトラップでアイテムが消滅することは一切ありません。 - 放置時のクリーンアップ: 装置が停止して新たなアイテムが来なくなると、寿命タイマーが $0$ から $6000$ まで進行し、5分後にアイテムが自動消滅してワールドデータの肥大化を防ぎます。
🛑 拾得遅延の安全性
手から投げ捨てたアイテムを即座に再回収してしまわないよう、Minecraftは pickupDelay (通常40ティック=2秒) を設定します。
アイテムが結合する際:
$$\text{pickupDelay}{\text{merged}} = \max(\text{pickupDelay}{\text{this}}, \text{pickupDelay}_{\text{other}})$$
これにより、プレイヤーが意図してアイテムを集約の山に投げ入れた場合でも、遅延時間が切れるまでインベントリに吸い戻されることはありません。
💻 実際のJavaソースコード実装
Minecraft 26.2 の ItemEntityMixin.java より:
// During Complete or Partial Merging:
this.pickupDelay = Math.max(this.pickupDelay, ((ItemEntityMixin)(Object)other).pickupDelay);
this.age = Math.min(this.age, ((ItemEntityMixin)(Object)other).age);