Таймер исчезновения и наследование возраста (MC 26.1.2)
Этот документ описывает жизненный цикл исчезновения, перевод тиков в секунды, наследование возраста самого молодого предмета и защиту ферм в Minecraft 26.1.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 |
⏳ Математика перевода тиков в секунды
В 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 на $+1$ каждый игровой тик. При $\text{age} \ge 6000$ предмет навсегда удаляется из мира.
🛡️ Правило сохранения возраста самого молодого предмета
При слиянии двух предметов в Item Clumps уцелевшая сущность выполняет:
$$\text{age}{\text{merged}} = \min(\text{age}{\text{this}}, \text{age}_{\text{other}})$$
Постоянный поток предметов на работающих фермах непрерывно сбрасывает возраст скопления на 0. Пока идет приток предметов, они никогда не пропадут.
Когда производство останавливается, скопление лежит на земле, и таймер возраста доходит до 6000 тиков, удаляя несобранный лут через 5 минут.
💻 Исходный код реализации на Java
Из ItemEntityMixin.java в Minecraft 26.1.2:
// Complete Merge: larger stack absorbs the smaller stack
if (otherCount < thisCount) {
thisStack.setCount(thisCount + otherCount);
this.setItem(thisStack);
this.pickupDelay = Math.max(this.pickupDelay, ((ItemEntityMixin)(Object)other).pickupDelay);
this.age = Math.min(this.age, ((ItemEntityMixin)(Object)other).age);
other.discard();
} else {
otherStack.setCount(thisCount + otherCount);
other.setItem(otherStack);
((ItemEntityMixin)(Object)other).pickupDelay = Math.max(((ItemEntityMixin)(Object)other).pickupDelay, this.pickupDelay);
((ItemEntityMixin)(Object)other).age = Math.min(((ItemEntityMixin)(Object)other).age, this.age);
this.discard();
}