Luacraft - набор Typesctipt деклараций, содержащий все объявления наивных функций. На данный момент в NPM репозитории содержится пакет для версии 1.26 (Warcraft III - Lua), содержащий в себе все наивные функции для версии 1.26. Дополнительно определены нативные функции из UjAPI.

Настройка Typescript To Lua

Предполагается, что у вас есть базовые знания по использованию пакетного менеджера и вы можете инициализировать npm проект.
  1. Скачиваем зависимости
Выполните команду npm install -D typescript-to-lua typescript
  1. Добавьте скрипты в package.json
В JSON файл добавьте скрипты для сборки и наблюдения за изменениями:
  "scripts": {
    "build": "tstl",
    "dev": "tstl --watch"
  }
Пример package.json
{
  "name": "irina-bot-data",
  "version": "1.0.0",
  "description": "",
  "main": "./dist/index",
  "types": "./dist/index",
  "scripts": {
    "build": "tstl",
    "dev": "tstl --watch"
  },
  "files": [
    "dist/**/*.lua",
    "dist/**/*.d.ts"
  ],
  "author": "",
  "license": "MIT",
  "devDependencies": {
    "lua-types": "^2.13.0",
    "typescript": "^4.8.4",
    "luacraft-1.26": "^1.0.5",
    "typescript-to-lua": "^1.10.1"
  }
}
  1. Создайте в корне проекта файл tsconfig.json. Заполните его
Пример файла
{
  "compilerOptions": {
    "target": "esnext",
    "lib": ["esnext"],
    "moduleResolution": "node",
    "strict": true,
    "rootDir": "./src",
    "outDir": "./dist",
    "module": "CommonJS"
  },
  "tstl": {
    "luaTarget": "5.3",
  },
  "strictFunctionTypes": true
}
Вы можете изменить входной и выходной каталог, указав их в rootDir и outDir соответственно.

Подключение luacarft к проекту

  1. Устанавливаем пакет luacraft-1.26
Выполняем команду npm install -D luacraft-1.26.
  1. Подключаем декларацию типов к typescript проекту
Для этого в файле tsconfig.json добавляем путь к типам. Декларации разложены по категориям: типы, функции, константы. Вы можете подключить сразу все указав luacraft-1.26/all, либо любые другие, которые необходимы вам. Изучить можно тут: github.com/kirill-782/luacraft-1.26/tree/master/types. Должно получиться что-то на подобии этого:
{
  "compilerOptions": {
    "types": ["luacraft-1.26/all"]
  }
}
Готово. Теперь автокомплит будет подсказывать вам константы, функции. Так же будет контролироваться соблюдение типов. Рекомендуем включить строгий режим для функций объявив в tsconfig.json следующее значение:
"strictFunctionTypes": true

Сборка проекта

Выполните в корне проекта в терминале команду npm run build. Если в коде отсутствуют ошибки - в выходном каталоге появятся LUA файлы, которые можно подключать к карте Warcraft III. Обратите внимание, что Warcraft III ищет файл war3map.lua в корне карты. Его нужно создать самостоятельно и в нем подключить нужные файлы.. Скопируйте файлы в w3x архив карты.
Пример проекта сделаю позже. Возможно, позже сделаю пример по сборке в бандл.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
20
1 год назад
0
nazarpunk, в этом пакете нет вообще кода. Только декларации. Немного не понял что такое ватчер? Это когда скрипт мониторит изменения в файле и перекомпиливает его, когда что то поменялось? Или что то для самого кода?
0
37
1 год назад
0
Kokomi, думаю, именно "висящая" команда в консоли, которая ждет изменения/добавления/удаления файлов в папке и перебилживает проект
0
20
1 год назад
Отредактирован Kokomi
0
ScorpioT1000, tstl умеет это делать. tstl --watch
0
37
1 год назад
Отредактирован ScorpioT1000
0
Кстати, алиас команд dev/build - обычно отличается режимом dev/prod сборки, а не то, что одно собирает, а другое - вотчер
0
20
1 год назад
Отредактирован Kokomi
0
ScorpioT1000, ну во фронте мало, поэтому сделал так, как было сделано в документации к tstl
0
27
1 год назад
0
Как это работает.. есть пример
0
20
1 год назад
Отредактирован Kokomi
0
МрачныйВорон, вы пишите код на typescript, tstl конвертирует его в lua. LUA код подключается к warcraft III. На данный момент подход похож на классический LUA, но планируется по мере свободного времени сделать обертки на типы. Потом можно будет писать код на классах
Что хочу сделать в итоге:
const dumpType = (e: UnitEvent) => {
  if (e.detail.triggerUnit instanceof CustomTestUnit) {
    print("CustomTestUnit");
  } else {
    print("Unit");
  }
};

const customUnit = new CustomTestUnit(Player(1), FourCC("Hpal"), 0, 0, 0);
const unit = new Unit(Player(0), FourCC("Hpal"), 0, 0, 0);

unit.lifeRegen += 10;

unit.addEventListener("selected", dumpType);
customUnit.addEventListener("selected", dumpType);
0
29
1 год назад
0
Потом можно будет писать код на классах
Зачем? Это же будет гигансткая обёртка, которая будет предоставлять посредственный функционал.
0
20
1 год назад
0
nazarpunk, пишу для себя, мне так удобнее
0
19
1 год назад
0
Kokomi, таки ты это же уже сделал. :D
0
20
1 год назад
0
Ev3nt, Я сделал ну максимум 10% от того, что нужно. Самые востребованные мне обертки еще не готовы (виджет, предмет), да и реализация событий юнита требует доработок
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.