Сначала сделай скорборд
/scoreboard objectives add Dialog minecraft.custom:minecraft.talked_to_villager (пропиши в чат)
Если хочешь ВЕДАТЬ, то пропиши и следующую команду и нажми на жителя (любого)
/scoreboard objectives setdisplay sidebar Dialog (тоже в чат)
/scoreboard objectives setdisplay sidebar (чтобы отменить предыдущее)
Теперь когда ты нажимаешь на жителя тебе прибавляется 1 значение в только что созданный скорборд. Далее упомянутым тобой execute, нужно проверить есть ли у игрока это значение. И если оно есть вывести в чат ему желанный текст. Чтобы красиво отформатировать текст можно воспользоваться tellraw генераторами
execute as @a[scores={Dialog=1..}] at @s run tellraw @s "текст который житель должен говорить" (цикличный, всегда активный, стрелка должна указывать на следующий)
execute as @a[scores={Dialog=1..}] at @s run scorboard scoreboard players set @s Dialog 0 (цепной, всегда активный, стрелка в сторону от предыдущего)
Но все жители при таком варианте будут говорить одно и тоже. По этому тебе нужно распихать им теги или что-то в этом роде, чтобы фильтровать одного жителя от другого. Я предлагаю такой вариант - Первая команда активирует игрока начавшего диалог [scores={Dialog=1..}], имеющего жителя [type=minecraft:villager] на расстоянии 7ми блоков [distance=..7] с уникальным тегом [tag=BrrBrrPatapim] и если находит, то выводит ему текст конкретно для жителя с конкретно этим тегом. Следующая команда отличается только тегом и наверное сообщением для игрока. Последняя команда как и в предыдущем варианте просто чистит скорборд диалога чтобы игроку не спамило в чат.
execute as @a[scores={Dialog=1..}] at @s if entity @e[type=minecraft:villager,tag=BrrBrrPatapim,distance=..7] run tellraw @s "я брр брр патапим" (цикличный, всегда активный)
execute as @a[scores={Dialog=1..}] at @s if entity @e[type=minecraft:villager,tag=GlorboFrutodrillo,distance=..7] run tellraw @s "я глорбо фрутодрилло" (цикличный, всегда активный)
execute as @a[scores={Dialog=1..}] at @s run scorboard scoreboard players set @s Dialog 0 (цепной, всегда активный)
Единственная проблема в том что моя команда не проверяет жителя по которому нажали, она просто ищет жителя рядом с игроком в момент когда игрок получил единицу скорборда, а это значит что механизм может лагать если 2 разных жителя будут рядом в тот момент когда игрок нажмёт по одному из них. Ему просто может выдать не тот текст. Это 100% можно как-то исправить но мне лень думать. Если не узнаешь как, то просто поставь жителей подальше друг от друга
Чтобы дать жителю тег подлети к нему вплотную и впиши в чат эту команду:
/tag @e[type=minecraft:villager,distance=..3] add GlorboFrutodrillo (в место GlorboFrutodrillo можешь писать любые нужные тебе теги)
таким образом если тыкнуть по жителю находясь рядом с жителем с тегом "BrrBrrPatapim" в чат тебе напишет "я брр брр патапим", а если рядом будет "GlorboFrutodrillo" то в чат напишет "я глорбо фрутодрилло". А ещё вопросы по командным блокам лучше в эту часть форма задавать, там больше шансов что ответят (ответят лучше чем я)