Перейти к содержимому

Решение проблем

Начните с:

Окно терминала
npm run doctor

Команда проверяет killscript.config.json, точки входа, оба TypeScript-контекста, результат компилятора и сохранённое подключение к игре. Исправьте первую найденную ошибку, прежде чем случайно менять generated-файлы или переустанавливать пакеты.

Игра не загружает папку TypeScript-проекта. Ей нужна сгенерированная папка непосредственно внутри Modules:

Modules/
└── MyModule/
├── module.json
└── scripts/main.lua

Запустите:

Окно терминала
npm run install:game -- --modules "/path/to/KILLSCRIPT/Modules"

Откройте или переоткройте список модулей и один раз включите MyModule. Если уже открытый список не сканирует папку повторно, один раз перезапустите игру. Дальнейший npm run dev сохраняет UUID и обновляет этот модуль на месте.

Файл .KillScript — упакованный модуль с той же внутренней структурой, а не одиночный текстовый Lua-скрипт.

Откройте игровую консоль кнопкой ~. Возле поля поиска нажмите значок фильтра и включите категорию с выводом модулей. Иначе правильное сообщение легко теряется среди логов движка, сети и voice chat.

На время диагностики добавьте однозначную стартовую строку:

import { logger } from "@killscript/sdk/client";
logger("Startup").info("client bundle loaded");

После нахождения причины удалите лишнюю диагностику.

Проверьте, что npm run dev всё ещё запущен и последнее сохранение завершилось синхронизацией. При ошибке компиляции CLI намеренно оставляет в игре предыдущую рабочую версию.

Если устарело только поведение Reflex, убедитесь, что scripts/server.lua действительно изменился. Для реального изменения CLI выводит notice о server reload. Переключение модуля в списке некоторых сборок перезапускает только клиент.

npm run dev -- --once превращает следующую сборку в одну команду с понятным успешным или ошибочным exit code.

Оставьте dev запущенным: он повторяет временные блокировки. Неудачная сборка вообще не запускает синхронизацию; если ошибка возникает при замене файла, этот файл восстанавливается. Обновление всей папки не является одной транзакцией, поэтому ранее заменённые файлы уже могут относиться к новой сборке.

  • редактируйте TypeScript в проекте, а не сгенерированный Lua в SMB-папке;
  • закройте инструменты, удерживающие сгенерированный файл;
  • проверьте право записи в SMB-папку;
  • запустите npm run doctor и сверьте сохранённый путь.

Синхронизация предпочитает одно переименование с заменой. Если файловая система его отклоняет, восстановимый вариант через резервную копию может создать очень короткий промежуток замены.

Используйте статический относительный импорт без расширения:

import "./features/feature";

Импорты реализации должны оставаться внутри src/. Клиент не может импортировать серверную реализацию и наоборот. Пакеты npm с кодом выполнения отклоняются: перенесите небольшую вспомогательную функцию в src/ или используйте пакет только с типами.

Не вызывайте Lua require() вручную. Компилятор объединяет вложенные файлы, потому что загрузчик игры надёжно разрешает только пути верхнего уровня.

Глобальный API или метод отсутствует в TypeScript

Заголовок раздела «Глобальный API или метод отсутствует в TypeScript»

Проверьте контекст текущего файла. Камеры, управление, UI, звук и визуальные объекты доступны только клиенту. Reflex-файл получает серверные объявления типов. Перенесите код к его владельцу, а для общей задачи передайте простое состояние через типизированную сеть.

Если элемент публичен и документирован в этом контексте, но отсутствует в типах, оформите баг покрытия объявлений вместо использования any.

CLI отказывается перезаписывать или удалять папку

Заголовок раздела «CLI отказывается перезаписывать или удалять папку»

У цели другой UUID модуля или папка не управляется этим проектом. Это защитная проверка.

  1. проверьте содержимое и владельца папки;
  2. выберите другое имя в killscript.config.json или самостоятельно удалите конфликтующую папку после проверки;
  3. снова выполните npm run install:game.

killscript clean --game тоже удаляет только папку с доказанным владением.