Снижение урона и вероятность (26.1.2)
| Математическое свойство | Значение |
|---|---|
| Всего единиц урона | $\text{amount} \times 100$ |
| Базовое целочисленное деление | $\lfloor (\text{amount} \times 100) / \text{percent} \rfloor$ |
| Остаток | $(\text{amount} \times 100) \pmod{\text{percent}}$ |
| Случайная проверка | random.nextInt(percent) < remainder |
| Границы целых чисел | $\ge 0$ (глобальное по умолчанию: 200, переопределения: 0 = наследование) |
| Нижний предел нулевого урона | Гарантированно $0$ при Режиме бога или успешном броске вероятностного поглощения |
🛡️ Почему перехват урона гарантирует 100% безопасность сохранений?
Durability Multiplier is engineered to never mutate item NBT or DataComponents stored in world save files.
Почему нельзя напрямую изменять DataComponents.MAX_DAMAGE?
- Нулевое загрязнение мира: Изменение максимальной прочности навсегда запекает измененные значения в инвентарях игроков, сундуках и сохранениях. Если игрок удалит мод или изменит GameRules, предметы останутся поврежденными или измененными навсегда.
- Мгновенная горячая перезагрузка: Изменение
/gamerule ig:dm_percent_globalнемедленно вступает в силу для каждого предмета в мире без сканирования инвентарей или пересоздания предметов. - Баланс починки и наковальни: Стоимость ремонта на наковальне и поглощение опыта чарами «Починка» рассчитываются на основе стандартной прочности без переполнения чисел или штрафов.
Вместо этого мод динамически перехватывает события урона во время выполнения через ItemStackDurabilityMixin и применяет вероятностное масштабирование урона (ту же архитектуру, что и ванильные чары Прочность).
📐 Точный алгоритм масштабирования
Когда предмет используется (нанося урон originalAmount, обычно 1 при разрушении блока или ударе):
public static int calculateScaledDamage(int originalAmount, int percent, RandomSource random) {
if (originalAmount <= 0)
return 0;
if (percent <= 0 || percent == 100)
return originalAmount;
int totalDamageUnits = originalAmount * 100;
int baseDamage = totalDamageUnits / percent;
int remainder = totalDamageUnits % percent;
if (remainder > 0 && random.nextInt(percent) < remainder) {
baseDamage++;
}
return baseDamage;
}🎲 Матрица распределения вероятностей
Для события с 1 единицей урона (originalAmount = 1)
| Процент | Эффективный множитель | База (100 / P) | Остаток (100 % P) | Шанс урона за удар | Ожидаемый урон за удар | Относительная прочность |
|---|---|---|---|---|---|---|
| 25% | $0.25\times$ | 4 | 0 | $100%$ (4 урона) | $4.00$ | $0.25\times$ (износ в 4 раза быстрее) |
| 50% | $0.50\times$ | 2 | 0 | $100%$ (2 урона) | $2.00$ | $0.50\times$ (износ в 2 раза быстрее) |
| 75% | $0.75\times$ | 1 | 25 | $100%$ (1) + $33.3%$ (+1) | $1.33$ | $0.75\times$ (износ в 1.33 раза быстрее) |
| 100% | $1.00\times$ (Ваниль) | 1 | 0 | $100%$ (1 урон) | $1.00$ | $1.00\times$ (Стандарт) |
| 150% | $1.50\times$ | 0 | 100 | $\frac{100}{150} \approx 66.67%$ (1 урон) | $0.67$ | $1.50\times$ |
| 200% | $2.00\times$ | 0 | 100 | $\frac{100}{200} = 50.00%$ (1 урон) | $0.50$ | $2.00\times$ |
| 300% | $3.00\times$ | 0 | 100 | $\frac{100}{300} \approx 33.33%$ (1 урон) | $0.33$ | $3.00\times$ |
| 500% | $5.00\times$ | 0 | 100 | $\frac{100}{500} = 20.00%$ (1 урон) | $0.20$ | $5.00\times$ |
| 1000% | $10.00\times$ | 0 | 100 | $\frac{100}{1000} = 10.00%$ (1 урон) | $0.10$ | $10.00\times$ |
📈 Независимые случайные проверки и закон больших чисел
Поскольку поглощение урона рассчитывается независимо при каждом ударе (как у ванильных чар «Прочность»):
- При 500% (5x) каждый удар независимо бросает шанс $20%$ получить 1 урон и $80%$ получить 0.
- В кратких испытаниях инструмент может получить 1 урон через 2 удара или через 8 ударов.
- За весь срок службы инструмента (например, 1 561 использование алмазного топора) общее число сломанных блоков математически сходится к $\approx 7 805$ использований (ровно $5\times$).
Пусть $N$ — ванильная прочность предмета, а $P$ — активный процент ($P \ge 100$). Количество использований $U$ до поломки подчиняется отрицательному биномиальному распределению со средним значением:
$$\mathbb{E}[U] = N \times \frac{P}{100}$$
На протяжении тысяч использований закон больших чисел гарантирует, что общая прочность сойдется к ровно $\frac{P}{100}$ ванильной прочности.
