Ты умеешь писать код для нпс в моде на майнкрафт C...

創建於:2025年7月27日

使用 O3 回答 Chat01

問題

Ты умеешь писать код для нпс в моде на майнкрафт Custom Npc? мне нужно чтобы при нажатии на npc выполнясь команда от лица npc "/say фраза" при нажатии на него, при повтором выводется следующая фраза, которая берётся из списка фраз

思考

Thought for 41 seconds

回答

Вот самый простой скрипт (JavaScript / ECMAScript) для вкладки “Interact” в редакторе Custom NPCs.
Он перебирает список реплик и при каждом клике даёт команду /say … от имени NPC:

js
// ====== настроить под себя ====== var lines = [ "Привет, путник!", "Как погода за пределами деревни?", "Береги себя в шахтах.", "Увидимся позже!" ]; // ================================= function interact(event) { var npc = event.npc; // сам NPC var data = npc.getStoreddata(); // память, переживает перезагрузку мира var index = data.get("lineIndex"); // читаем индекс фразы // если ещё не было кликов – начинаем с 0 if (index == null) index = 0; else index = parseInt(index); // выполняем /say как NPC (слэш убираем!) npc.executeCommand("say " + lines[index]); // /say Привет … // альтернатива без команд: npc.say(lines[index]); // готовим следующий индекс index = (index + 1) % lines.length; data.put("lineIndex", index); }

Как это работает

ШагЧто происходит
1.getStoreddata() даёт объект‑хранилище, который сохраняется даже после перезапуска сервера. (kodevelopment.nl)
2.Там мы храним номер текущей строки lineIndex.
3.При каждом клике скрипт берёт фразу lines[index], даёт NPC команду say … через executeCommand() — она запускается именно “от лица” NPC. (kodevelopment.nl)
4.Индекс увеличивается, а когда список заканчивается — начинаем с первой строки.
5.Поскольку executeCommand() фактически выполняет OP‑команду, убедитесь, что в CustomNPCs.cfg включено NpcUseOpCommands=true, иначе «/say» может быть заблокирована. (kodevelopment.nl)

Где вставить

  1. Откройте нужного NPC → AdvancedScripts → вкладка Interact.
  2. Тип скрипта — JavaScript (ECMAScript).
  3. Вставьте код выше, сохраните.
  4. При желании расширяйте массив lines или меняйте логику (например, сбрасывать индекс таймером).

Подсказки

  • Если хотите, чтобы фразы не сохранялись после перезапуска сервера (например, тестовый NPC), поменяйте getStoreddata() на getTempdata().
  • В 1.12.2+ слэш в executeCommand() писать не нужно; команда передаётся без него (см. пример dummy.executeCommand в справке). (Pastebin)
  • Для коротких фраз можно вовсе обойтись без команды и вызвать npc.say(text) — игроки увидят тот же вывод, но без необходимости править конфиг.

Пробуйте — скрипт готов к копированию и сразу работает!

問題

замены команду /say на /tellraw, обрати внимание на мой пример использования /tellraw @p "" кавычки должны быть обязательными, в них нужна фраза: "[имя нпс]" перед основным текстом

思考

Providing script and explanation

Here’s how we can modify the script:

js
var lines = [...]; function interact(event) { var npc = event.npc; var data = npc.getStoreddata(); var i = data.get("lineIndex"); if (i == null) i = 0; else i = parseInt(i); // Constructing the message: "[NPC Name] text" var message = '[' + npc.getName() + '] ' + lines[i]; // Quotes MUST be escaped: "... "message" npc.executeCommand('tellraw @p "' + message.replace(/"/g, '\\"') + '"'); data.put("lineIndex", (i + 1) % lines.length); }

This .replace(/"/g, '\\"') escapes inner quotes to avoid breaking the format. /tellraw expects quotes around the message, like /tellraw @a "Hello, world!" (as seen in sources). We can cite lines 11-13 from one source or line 5 from UMA Technology.

Crafting answer with citation

Let's summarize: The script uses the /tellraw command, which accepts a simple string argument enclosed in double quotes, like /tellraw @a "Hello, world!". There’s no need for color codes here,

Thought for 34 seconds

回答

Ниже — обновлённый скрипт для вкладки Interact.
Он использует /tellraw (строгий формат — цель @p, далее ОБЯЗАТЕЛЬНЫ двойные кавычки), добавляя в начале каждой реплики тег [Имя NPC].

js
// ====== Список ваших фраз ====== var lines = [ "Привет, путник!", "Как погода за пределами деревни?", "Береги себя в шахтах.", "Увидимся позже!" ]; // ================================= function interact(event) { var npc = event.npc; var data = npc.getStoreddata(); // сохраняем индекс между перезапусками var i = data.get("lineIndex"); i = (i == null) ? 0 : parseInt(i); // формируем текст сообщения: [ИмяNPC] ваша_фраза var rawMsg = '[' + npc.getName() + '] ' + lines[i]; /* /tellraw @p "<текст>" ─── кавычки внутри команды ОБЯЗАТЕЛЬНЫ ─── экранируем возможные " внутри строки, чтобы не сломать сам JavaScript‑литерал */ var cmd = 'tellraw @p "' + rawMsg.replace(/"/g, '\\"') + '"'; npc.executeCommand(cmd); // выполняем от лица NPC // следующий индекс data.put("lineIndex", (i + 1) % lines.length); }

Как это работает

  1. lines[] — массив всех реплик. При каждом клике берётся текущая, после чего индекс циклически увеличивается.
  2. Команда собирается в одну строку: tellraw @p "…”. Глобальное сообщение ​[NPC] текст увидит только ближайший игрок @p.
  3. Если внутри реплики могут встретиться кавычки " — они экранируются (\"), иначе команда бы оборвалась.
  4. Память хранится в Storeddata, так что цикл не сбросится после перезапуска. Нужен временный счётчик? Замените на getTempdata().
  5. Требование: в CustomNPCs.cfg должно быть NpcUseOpCommands=true, иначе NPC не сможет запускать команды.

В Minecraft допускается простой «строковый» вариант /tellraw, например
/tellraw @a "Hello, world!" (то, что нам и нужно) (UMA Technology, Sportskeeda)

Скрипт можно вставлять «как есть» — он сразу начнёт выводить фразы с меткой [Имя NPC] и чётким соблюдением кавычек внутри /tellraw.

分享這個問答