Как проверить предметы на наличие приворотных чар

Боитесь магии? Узнайте, как проверить предметы на приворот и защитить себя от чужого колдовства. Простые способы разоблачить чары!

В Minecraft существует два «приворотных» (проклятых) чары:

  • Проклятие несъёмности (binding_curse) – предмет нельзя снять с экипировки.
  • Проклятие утраты (vanishing_curse) – предмет исчезает после смерти игрока.

Иногда необходимо быстро определить, есть ли у предмета один из этих чар. Ниже описаны все способы проверки, начиная от простых методов в ванильной игре и заканчивая более продвинутыми решениями с помощью команд, дата‑пака и модов.


Содержание

  1. Визуальный осмотр в инвентаре
  2. Проверка с помощью команд
  3. Отслеживание через scoreboard
  4. Автоматизация в дата‑паках
  5. Как проверить в моде (Java‑код)
  6. Полезные советы и типичные ошибки

Визуальный осмотр в инвентаре

Самый простой способ – открыть инвентарь или меню наковальни и посмотреть на описание предмета.

  • Если рядом с названием стоит §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