Ты прав, тут действительно нужен профессионал. Хорошо, что он тут есть :)
Предупреждаю сразу, что для того, чтобы реализовать желаемое, нужно будет ооооооочень сильно потрудиться.
Начнём с того, что достижение по задумке майнкрафта предназначается строго для одного игрока. Одной простой командой изменить это не получится. Однако если речь идёт о готовом датапаке с кастомными достижениями, то наша задача немного упрощается. Разберу на примере датапака Blaze&Caves.
Итак, мы хотим добиться того, чтобы при выполнении одним игроком ачивки из датапака она начислялась всем игрокам (либо можно объединить игроков по какому-либо признаку). Для этого нам нужно будет дополнить функцию, отвечающую за награду при выполнении достижения одной командой (advancement grant @a only [путь к достижению])
0) Устанавливаем нормальную программу для редактирования кода. Я использую VSCode и расширение Datapack Helper Plus. Без них добиться результата будет тоже возможно, но процесс растянется в несколько раз.
1) Первым делом, распаковываем архив датапака, чтобы получить возможность его редактирования.
2) Внутри него расположена папка "data". Это основная папка датапака. В ней находится "корневая" подпапка "minecraft", а так же другие корневые папки датапака.
3) В каждой из корневых папок проверяем наличие папки "advancements". В ней хранятся сами достижения.
4) Если такая папка есть, открываем в ней достижение (файл с расширением .json).
5) Ищем в нём строчку, начинающуюся с "rewards": {"function":.. и смотрим, какая функция активируется при выполнении достижения (1 окно).
6) Открываем эту функцию. С новой строки в самом её конце дописываем команду, которую нужно составить, исходя из названия достижения (2 окно). Тут мы остановимся подробнее.
Сама команда выглядит так: execute as @a[advancements={ путь_к_достижению=false }] run advancement grant @s only путь_к_достижению
Разберём её.
"execute as @a[advancements={ путь_к_достижению=false }]" запускает поиск всех игроков без достижения
"run advancement grant @s only путь_к_достижению" выдаёт достижение по адресу "путь_к_достижению" игроку, у которого его нет.
Как ты уже догадался, вместо "путь_к_достижению" мы будем указывать путь, по которому расположено достижение. Он состоит из корневой папки, в которой лежало достижение (к примеру, blazeandcave), и самого достижения (допустим, all_chained_up). Если достижение в свою очередь лежало в подпапке (возьмём папку adventure), то перед названием достижения нужно указать и её, используя / (получится blazeandcave:adventure/all_chained_up)
7) сохраняем файл и повторяем процедуру для всех оставшихся файлов.
После этих операций получившийся датапак можно будет поместить в папку с миром, и достижения будут выдаваться всем игрокам, если один из них выполнил его. Если же вы играете на собственном сервере с большим количеством игроков, но хотите выполнять достижения только вдвоём, то создайте команду, вступите в неё, а в пункте 6 вместо селектора @a[advancements={ путь_к_достижению=false }] используйте селектор @a[team=КОМАНДА, advancements={ путь_к_достижению=false }]
