Введение
amxts позволяет писать плагины AMX Mod X для Counter-Strike 1.6 на
TypeScript. Плагин — обычный файл .ts: привычные типы, классы, замыкания,
async/await, события, на которые подписываетесь. Он работает на сервере
рядом с вашими плагинами на Pawn, и они вызывают друг друга.
plugin({ name: "Welcome", version: "1.0.0", author: "you" });
server.addEventListener("putInServer", (event) => {
print(event.player, `Добро пожаловать, ${event.player.name}!`);
});
game.addEventListener("takeDamage", (event) => {
if (event.attacker.team == event.player.team) event.preventDefault(); // без урона по своим
});
server.addCommand("/heal", ({ player }) => {
if (player.health < 100) player.health = 100;
});
Что вы получаете
- TypeScript, каким вы его знаете:
number,string,boolean, массивы,Map, классы и интерфейсы, необязательные поля, замыкания, шаблонные строки. - Игроки и сущности — объекты:
player.health = 100,player.team,player.hideHud.push("money"),Entity.findAll({ classname: "grenade" })(Игроки и сущности). - События как в браузере:
server.addEventListener("putInServer", ...)для сервера,game.addEventListener("takeDamage", ...)для игры, сevent.preventDefault()(События игры). - Редактор знает игру: каждый натив, каждое событие игры и каждое поле сущности приходят с типом и описанием; опечатка — красная строка, а не ошибка на сервере.
- Ожидание без блокировки:
await sleep(1000),await useFetch<Stats>(url), которые сами отменяются, когда игрок уходит (Async). - Сохранили — и уже в игре:
amxts devпересобирает плагин при сохранении и перезагружает его на работающем сервере без смены карты (Начало работы). - Тесты без игрового сервера: плагин проверяется на фейковом сервере командой
npx amxts test(Тесты). - Плагины на Pawn продолжают работать: плагин на TypeScript экспортирует для них нативы и форварды и вызывает их собственные (Нативы, Форварды).
Как это работает
Сборка заранее компилирует каждый плагин в машинный код — файл .aot.
Модуль amxts_amxx, модуль AMX Mod X, который вы ставите на сервер,
загружает эти файлы и выполняет их внутри AMX Mod X. Каждый натив сервера —
AMX Mod X, ReAPI, других модулей и других плагинов — это функция с типами,
которую плагин может вызвать.
Что нужно серверу
- AMX Mod X 1.9 или новее.
- Модуль
amxts_amxxна сервере под Windows или Linux:amxts_amxx.dllилиamxts_amxx_i386.so— строкаamxts_amxxвmodules.iniнаходит его на обеих. - Для всех событий игры, которые есть только у ReGameDLL, в том виде, в
каком их поднимает игра (
playerSpawn,roundEnd, …), — ReHLDS, ReGameDLL и ReAPI. Свойства сущностей, действия с игроком (give,respawn, …) и большинство событий игры работают и без них — через модули самого AMX Mod X, некоторые события — не целиком (установка).
amxts собирается и проверяется на ReHLDS с ReGameDLL и ReAPI и на HLDS от Valve. На обычном HLDS плагин пишется так же, а события игры приходят через Ham Sandwich, лог игры и её сообщения: большинство слышно, только когда игра уже сделала своё, поэтому их не остановить и не изменить, а некоторые —
fallDamage, giveDefaultItems, движение игрока — не слышно вовсе
(сервер без ReAPI).Как поставить amxts на сервер и куда ложится каждый файл — Установка на сервер.
Чего amxts пока не умеет и что писать вместо этого — в Ограничениях.
Модули
Модуль — пакет на TypeScript, общий для плагинов
(Общие модули). Проект перечисляет модули, которыми
пользуется, в amxts.config.ts: модуль, который нужен одному из них, идёт
вместе с ним, а модуль, которым не пользуется ни один плагин, не собирается.
Официальные:
- menu-core — меню из файлов INI, YAML или JSON или из кода
(Меню): модуль, который стоит добавить для
меню сервера. Быстрое меню только в коде — это
Menuядра (меню); - config-core — конфиги в INI, YAML или JSON, прочитанные в типизированные объекты (Конфиги);
- resemiclip — кто сквозь кого проходит, правилом над двумя игроками, поверх модуля ReSemiclip (resemiclip);
- ftp с v0.2 — FTP, FTPS и SFTP: загрузка, скачивание и список файлов на другом сервере, каждый вызов — промис (ftp).
useFetch и fetch для веб-запросов идут вместе с amxts (HTTP). Другие
модули — в каталоге модулей, а ещё можно
написать свой.
Дальше
Начало работы: проект, первый плагин и команда, которая пересобирает его при каждом сохранении.