Голографические метки и пороги количества (MC 26.2)
Этот документ описывает систему парящих индикаторов количества, порог label_min_count и нативный рендеринг меток на клиентах без модов в Minecraft 26.2.
📊 Информационный блок функции
| Свойство | Спецификация |
|---|---|
| Имя системы | Серверный провайдер голографических бирок |
| Стратегия рендеринга | Стандартные бирки имен ванильных сущностей (setCustomName / setCustomNameVisible) |
| Нужен клиентский мод? | Нет (на 100% рендерится ванильным клиентом) |
| Формат метки | <название_предмета> x<число> (напр. Алмаз x128, Дубовое бревно x500) |
| Правило порога | item_clumps:label_min_count (по умолч.: -1, берет DataComponents.MAX_STACK_SIZE) |
| Переключатель отображения | item_clumps:render_labels (по умолч.: true) |
| Нагрузка за тик | $0.00\text{ мс}$ (срабатывает строго при изменении в setItem()) |
🏷️ Как парящие метки отображаются на ванильных клиентах
Вместо установки мода на клиент или отправки специальных пакетов отрисовки, Item Clumps использует встроенный в ванильный Minecraft механизм рендеринга именных бирок сущностей:
┌───────────────────────────────┐
│ Ground Item Stack Size Changes│
│ (ItemEntity.setItem) │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ Is render_labels Enabled? │
│ Does count > maxStack? │
└───────────────┬───────────────┘
│
┌────────────────┴────────────────┐
│ (Yes) │ (No)
▼ ▼
┌───────────────────────────┐ ┌───────────────────────────┐
│ Set Entity Custom Name │ │ Clear Entity Custom Name │
│ setCustomName(name xCount)│ │ setCustomName(null) │
│ setCustomNameVisible(true)│ │ setCustomNameVisible(false│
└─────────────┬─────────────┘ └───────────────────────────┘
│
▼
┌───────────────────────────┐
│ SyncedEntityData Packet │
│ Sent to all nearby clients│
└─────────────┬─────────────┘
│
▼
┌───────────────────────────┐
│ Vanilla Client Renders │
│ Clean Floating Name Tag! │
└───────────────────────────┘⚙️ Настройка порога отображения (label_min_count)
В Minecraft 26.2 администраторы могут точно настроить условия появления меток с помощью правила item_clumps:label_min_count:
Значение label_min_count | Поведение порога |
|---|---|
-1 (По умолчанию) | Ванильный размер стака: Метка появляется только при превышении максимального стака ($> 64$ для камня, $> 16$ для жемчуга, $> 1$ для мечей). |
0 | Всегда видима: Любой выброшенный предмет в мире отображает метку (напр. Земля x1). |
100 | Фильтр мега-стаков: Метки скрыты до накопления $101$ и более предметов. |
1000 | Режим супер-ферм: Метки показываются только у гигантских скоплений. |
💻 Исходный код реализации на Java
Из ItemEntityMixin.java в Minecraft 26.2:
java
private void item_clumps$updateVanillaNameTag() {
if (this.level() == null || this.level().isClientSide()) return;
ItemStack stack = this.getItem();
if (stack.isEmpty()) {
this.setCustomName(null);
this.setCustomNameVisible(false);
return;
}
int count = stack.getCount();
int labelMin = DynamicGameRuleManager.getInt(this.level(), ItemClumpsFabric.LABEL_MIN_COUNT);
int maxStack = (labelMin == -1) ? stack.getOrDefault(DataComponents.MAX_STACK_SIZE, 1) : labelMin;
if (DynamicGameRuleManager.getBoolean(this.level(), ItemClumpsFabric.RENDER_LABELS) && count > maxStack) {
Component name = stack.getItemName().copy().append(" x" + count);
if (!this.hasCustomName() || !this.getCustomName().getString().equals(name.getString())) {
this.setCustomName(name);
this.setCustomNameVisible(true);
}
} else {
if (this.hasCustomName()) {
this.setCustomName(null);
this.setCustomNameVisible(false);
}
}
}
@Inject(method = "setItem", at = @At("TAIL"))
private void item_clumps$onSetItem(ItemStack itemStack, CallbackInfo ci) {
if (!this.level().isClientSide()) {
this.item_clumps$updateVanillaNameTag();
}
}