В Minecraft существует два «приворотных» (проклятых) чары:
- Проклятие несъёмности (
binding_curse) – предмет нельзя снять с экипировки. - Проклятие утраты (
vanishing_curse) – предмет исчезает после смерти игрока.
Иногда необходимо быстро определить, есть ли у предмета один из этих чар. Ниже описаны все способы проверки, начиная от простых методов в ванильной игре и заканчивая более продвинутыми решениями с помощью команд, дата‑пака и модов.
Содержание
- Визуальный осмотр в инвентаре
- Проверка с помощью команд
- Отслеживание через scoreboard
- Автоматизация в дата‑паках
- Как проверить в моде (Java‑код)
- Полезные советы и типичные ошибки
Визуальный осмотр в инвентаре
Самый простой способ – открыть инвентарь или меню наковальни и посмотреть на описание предмета.
- Если рядом с названием стоит
§5Проклятие несъёмности(обычно фиолетовым цветом), то предмет обладаетbinding_curse. - Если написано
§5Проклятие утраты, то у предметаvanishing_curse.
Эта информация видна только в клиенте и не подходит для автоматизации, но полезна для быстрой проверки в одиночной игре.
Проверка с помощью команд
Команды позволяют получить точные данные о NBT‑тегах предмета. Ниже рассмотрены два самых популярных подхода.
Команда /data get
Синтаксис (для проверки предмета в руке игрока @s):
/data get entity @s SelectedItem.tag.Enchantments Если в списке присутствует запись с "id":"minecraft:binding_curse" или "id":"minecraft:vanishing_curse", значит чар присутствует.
Команда /execute if data
Для более компактной проверки можно использовать условный блок:
# Проверка на проклятие несъёмности
/execute if data entity @s SelectedItem.tag.Enchantments[{id:"minecraft:binding_curse"}] run say У вас есть Проклятие несъёмности!
/execute if data entity @s SelectedItem.tag.Enchantments[{id:"minecraft:vanishing_curse"}] run say У вас есть Проклятие утраты!
Эти команды работают начиная с версии 1.13 (и далее). Они не требуют установки модов.
Проверка в сундуке, на стойке или в контейнере
Если предмет находится в слоте контейнера, используйте путь Items[{Slot:XXb}].tag. Пример для первого слота в сундуке:
/execute if data block ~ ~-1 ~ Items[0].tag.Enchantments[{id:"minecraft:binding_curse"}] run say Проклятие несъёмности найдено в сундуке!
Отслеживание через scoreboard
Для создания объективов, которые будут автоматически подсчитывать количество предметов с определённым проклятием, воспользуемся scoreboard objectives и trigger.
Создание цели
/scoreboard objectives add hasBindingCurse dummy "Проклятие несъёмности"
Обновление счётчика
Запустите функцию (или командный блок), которая проверит каждый предмет в инвентаре игрока и выставит значение 1, если найдено нужное проклятие.
# Сбрасываем счётчик
scoreboard players set @a hasBindingCurse 0
execute as @a run function mypack:check_binding_curse
Содержимое функции mypack:check_binding_curse:
scoreboard players set @s temp 0
execute as @s store result score @s temp run data get entity @s Inventory[{Slot:0b}].tag.Enchantments[{id:"minecraft:binding_curse"}] 1
execute as @s if score @s temp matches 1.. run scoreboard players set @s hasBindingCurse 1
Использование результата
Теперь можно построить любые механизмы: открыть дверь, если у игрока есть предмет с проклятием, или выдать штрафные XP.
/execute as @a[scores={hasBindingCurse=1.;}] run say Вы держите предмет с Проклятием несъёмности!
Автоматизация в дата‑паках
Для удобства рекомендуется собрать проверки в один датапак. Ниже – минимальный пример, который проверяет оба проклятия у всех предметов в инвентаре и записывает результат в две отдельные цели.
Структура папок
mydatapack/
├─ pack.mcmeta
└─ data/
└─ mypack/
├─ functions/
│ ├─ init.mcfunction
│ └─ check_curses.mcfunction
└─ tags/
└─ functions/
└─ tick.json
pack.mcmeta
{
"pack": {
"pack_format": 15,
"description": "Проверка приворотных чар"
}
}
tick.json (запуск каждую игровую тик)
{
"values": [
"mypack:check_curses"
]
}
init.mcfunction (один раз при загрузке)
scoreboard objectives add hasBindingCurse dummy
scoreboard objectives add hasVanishingCurse dummy
check_curses.mcfunction
# Сброс счетчиков
scoreboard players set @a hasBindingCurse 0
scoreboard players set @a hasVanishingCurse 0
execute as @a run function mypack:check_curses_one_player
А теперь вспомогательная функция check_curses_one_player.mcfunction (можно разместить в той же папке):
scoreboard players set @s temp 0
execute as @s store result score @s temp run data get entity @s Inventory[{Slot:0b}].tag.Enchantments[{id:"minecraft:binding_curse"}] 1
execute as @s if score @s temp matches 1.. scoreboard players set @s hasBindingCurse 1
execute as @s store result score @s temp run data get entity @s Inventory[{Slot:0b}].tag.Enchantments[{id:"minecraft:vanishing_curse"}] 1
execute as @s if score @s temp matches 1.. scoreboard players set @s hasVanishingCurse 1
Для экономии кода удобно использовать циклы через функции или /execute store result в массиве. Однако даже простая реализация работает без проблем на серверах с небольшим количеством игроков.
Как проверить в моде (Java‑код)
Если вы разрабатываете мод на Fabric или Forge, проверка чар происходит через NBT‑теги Enchantments. Ниже – пример кода, совместимый с обоими API (используется net.minecraft.item.ItemStack).
Метод проверки
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtList;
public class CurseUtil {
/* Возвращает true, если у предмета есть Проклятие несъёмности /
public static boolean hasBindingCurse(ItemStack stack) {
return hasEnchantment(stack, Enchantments.BINDING_CURSE);
}
/* Возвращает true, если у предмета есть Проклятие утраты /
public static boolean hasVanishingCurse(ItemStack stack) {
return hasEnchantment(stack, Enchantments.VANISHING_CURSE);
}
private static boolean hasEnchantment(ItemStack stack, Enchantment enchantment) {
if (stack.isEmpty) return false;
NbtCompound nbt = stack.getNbt;
if (nbt == null) return false;
NbtList enchList = nbt.getList("Enchantments", 10); // 10 = CompoundTag
for (int i = 0; i < enchList.size; i++) {
NbtCompound entry = enchList.getCompound(i);
if (entry.getString("id").equals(enchantment.getRegistryName.toString)) {
return true;
}
}
return false;
}
}
Пример использования в обработчике события
@SubscribeEvent
public void onPlayerTick(PlayerTickEvent event) {
PlayerEntity player = event.player;
for (ItemStack stack : player.getInventory.main) {
if (CurseUtil.hasBindingCurse(stack)) {
// Делать что‑то: например, отнять XP
player.addExperience(-1);
}
}
}
Этот код будет работать как на клиенте, так и на сервере, если правильно зарегистрировать событие.
Полезные советы и типичные ошибки
- Не путайте ID чар. В NBT используется полное имя
minecraft:binding_curse, а в командах — простоbinding_curse. - Проверка только в текущем слоте. Команда
/data get entity @s SelectedItemсмотрит лишь на предмет в руке. Чтобы проверить весь инвентарь, используйте путьInventory(см. раздел 2.3). - Кратковременные эффекты. Если вам нужно знать, есть ли проклятие только в момент взаимодействия (например, при открытии сундука), лучше использовать
/execute if dataпрямо в командном блоке, а не постоянно обновлять scoreboard. - Сокрытие чар. При помощи
/enchantможно добавить проклятия к предметам без их отображения в подсказке (если использоватьhideFlags). Поэтому проверка NBT более надёжна. - Оптимизация дата‑пака. Если ваш сервер имеет сотни игроков, проверяйте только те предметы, которые могут иметь проклятия (броня, инструменты, мечи). Можно добавить фильтрацию по
Item ID. - Тестирование. После написания функции запустите
/function mypack:check_cursesвручную, чтобы убедиться, что цели правильно обновляются.
Проверка наличия приворотных (проклятых) чар в Minecraft может быть выполнена разными способами – от простого визуального осмотра до сложных автоматических систем на базе команд, scoreboard и дата‑пака. Выбор метода зависит от ваших целей:
- Однократная проверка – используйте
/execute if dataили/data get. - Постоянный мониторинг – создайте scoreboard‑цели и обновляйте их функцией в дата‑паках.
- Разработка мода – работайте напрямую с NBT‑тегами через Java‑код.
Помните, что правильная работа с NBT‑тегами гарантирует точный результат, а использование hideFlags может скрывать чары от игрока, но не от системы проверок.
Удачной игры и безупречного зачарования!
Дата генерации статьи: 23:39:53