Клиентские игры

Нужна помощь с командой в Майнкрафт 1.17.1

Мне нужно, чтобы если у игрока 2 или более сахара, то у него удаляются 2 сахара. Вот то, что уже имеется:
/execute if entity @a[nbt={Inventory:[{id:"minecraft:sugar",Count:2b}]}] run clear @a minecraft:sugar 2
Как поставить "2 или более"?
Проверка по NBT в селекторе использует точные значения, диапазон в ней указать действительно невозможно, как верно подметил автор предыдущего ответа. Но ведь нам и не обязательно использовать проверку по NBT.

Сделать проверку диапазона можно, как минимум, двумя другими способами:

1) через предикат
Это одна из новых полезных возможностей датапаков, добавленная в 1.15. Они довольно практичны, так как любое количество условий (с поддержкой диапазонов) можно записать в текстовом файле с особой структурой, а затем просто проверять все эти условия разом при помощи /execute if predicate <имя_предиката>.
Недостаток один – нужен датапак. Однако их создание – не такой уж и сложный процесс, как может показаться на первый взгляд. Вот гайд на тему предикатов в датапаках.

2) через переменную (задача/скорборд)
Как известно, при помощи конструкции "if score <игрок> <задача> matches 2.." можно указать проверяемый диапазон. Всё, что нам осталось сделать в этом случае – сохранить количество предметов в инвентаре в переменную. Думаю, с процессом её назначения вопросов возникнуть не должно, перейду сразу к важному.
Само получение количества предметов осуществляется при помощи модификатора "store" у /execute и интересного свойства команды /clear. Дело в том, что любая команда возвращает какой-то результат. Его можно записать куда-то при помощи /execute store result/success. Если указать в команде /clear какое-то количество очищаемых предметов, команда вернёт нам количество успешно очищенных предметов.
Интересность в том, что если указать 0 предметов для очистки, команда вернёт нам их общее количество в инвентаре и курсоре (т. е. если игрок в выживании держит предметы мышкой, полезно для детектора кликов), при этом никак на них не повлияв. Вот пример конструкции для записи в переменную:
/execute store result score <игрок/селектор> <задача> run clear <игрок> <предмет> 0
На практике удобнее использовать другую:
/execute as <игрок> store result score @s <задача> run clear@s <предмет> 0
Ну а затем уже можно спокойно использовать проверку диапазона хоть в /execute if score, хоть в самом селекторе (@a[scores={задача=2..}])
Закир Ташполатов
Закир Ташполатов
35 383
Лучший ответ
именно так сделать нельзя, но ты можешь зациклить либо команду /execute, либо команду /clear до тех пор, пока у игрока не закончится сахар. в зависимости от того, что тебе нужно сделать.
но именно сделать условие "больше 2" - невозможно. по крайней мере через NBT
VG
Vanea Golubenco
6 625