Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Для того, чтобы добавить "ресурс" на форум, требуется перейти по ссылке и создать ресурс в нужной категории форума.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно. Необходимо обновить браузер или попробовать использовать другой.
amxts — фреймворк для плагинов AMX Mod X на TypeScript. Плагин пишется как обычный TypeScript — с типами, классами, async/await, подсказками и проверкой ошибок в редакторе — компилируется в машинный код (AssemblyScript → WebAssembly → AOT) и работает на сервере рядом с плагинами на Pawn. Pawn-плагины трогать не нужно: они работают как раньше.
Что умеет
Игроки, сущности и события в понятных именах: player.health...
amxts 0.3.0 — большое обновление: модуль стал один, ReAPI больше не нужен, а плагины на TypeScript работают не медленнее Pawn.
Главное
amxts — теперь один модуль
В 0.2 было две части: модуль amxts_amxx и плагин-хост amxts_host.amxx в plugins.ini, через который события игры шли в TypeScript. В 0.3 хоста нет: модуль сам слушает игру — команды игроков, сообщения, квары, лог, меню и хуки ReGameDLL/ReHLDS...
amxts 0.3.1 — база данных MySQL прямо в плагине, и ничего больше не держит кадр сервера.
Плагины, собранные под 0.3.0, работают на модуле 0.3.1 как есть. Для нового нужен модуль 0.3.1 — npx amxts upgrade ставит его на сервер.
MySQL в amxts
Модуль сам говорит с MySQL и MariaDB — без сторонних библиотек, с TLS — и каждый запрос идёт в своём потоке: сервер никогда не ждёт базу. Таблицы описываются на TypeScript, как в Drizzle, строки приходят с...
amxts 0.3.2 — forward'ы C++-модулей в TypeScript, обычный HLDS слышит игру до того, как она действует.
Плагины, собранные под 0.3.0 и 0.3.1, работают на модуле 0.3.2 как есть. Для нового нужен модуль 0.3.2 — npx amxts upgrade ставит его на сервер.
Forward'ы C++-модулей
Forward, который поднимает модуль AMX Mod X на C++ (MF_ExecuteForward), доходит до Forward.subscribe после Pawn-плагинов — с числами, строками...
Я не критикую, если что. Оговорка, на всякий случай.
Просто хотел узнать если мой Metamod-модуль начнёт вызывать один и тот же натив (или форвард, который ведёт к amxts-плагину) из нескольких потоков одновременно, на сколько это безопасно? Просто мне нужно SQL-callback-и (и не только) пробрасывать в плагин и желательно выполнять их "одновременно" (параллельно).. В AMXX я реализовал "костыль" с контролем стека, все как бы работает, но сервер крашится с ~0,2% вероятностью, т.е. раз в 3-4 дня он стабильно... Работает все супер-шустро, никаких лагов и привязки к кадрам.
И я подумал, раз у вас код выполняется (возможно?) вне контекста AMXX машины и не двигает туда-сюда значения ее системных регистров, этот вариант прокатит?
.amxx — это байткод виртуальной машины AMX, и для него есть готовые декомпиляторы, которые выдают почти исходный Pawn. .aot — уже машинный код x86, собранный через LLVM с оптимизациями: мелкие функции встроены в вызывающие, инструмента «обратно в TypeScript» нет, IDA или Ghidra дадут только псевдо-C.
Но учтите две вещи. Строки лежат в файле как есть. И плагин несёт с собой карту — имена функций, пути файлов и номера строк, — чтобы ошибка в консоли показывала стек прямо в вашем TypeScript. Так что разобрать логику можно, просто дольше. Если нужно спрятать что-то по-настоящему (ключи, пароли), держите это не в плагине, а в конфиге на сервере.
Я не критикую, если что. Оговорка, на всякий случай.
Просто хотел узнать если мой Metamod-модуль начнёт вызывать один и тот же натив (или форвард, который ведёт к amxts-плагину) из нескольких потоков одновременно, на сколько это безопасно? Просто мне нужно SQL-callback-и (и не только) пробрасывать в плагин и желательно выполнять их "одновременно" (параллельно).. В AMXX я реализовал "костыль" с контролем стека, все как бы работает, но сервер крашится с ~0,2% вероятностью, т.е. раз в 3-4 дня он стабильно... Работает все супер-шустро, никаких лагов и привязки к кадрам.
И я подумал, раз у вас код выполняется (возможно?) вне контекста AMXX машины и не двигает туда-сюда значения ее системных регистров, этот вариант прокатит?
Нет, так нельзя — ни натив, ни форвард, который ведёт в amxts-плагин, из чужого потока вызывать нельзя. Плагин выполняется в игровом потоке: его память, сборщик мусора и стек принадлежат этому потоку, и вызов из другого потока в тот момент, когда игра тоже в нём работает, портит его состояние. Мьютекс не спасает: плагин внутри вызывает функции движка и AMX Mod X, а они рассчитаны только на игровой поток. Получится тот же редкий краш раз в несколько дней.
Схема, которая работает: тяжёлую часть (SQL) делайте в своих потоках, готовые результаты складывайте в очередь под мьютексом, а в игровом потоке — например, в StartFrame — забирайте их и вызывайте форвард. Так устроена и сама amxts: запросы к базе и fetch идут в отдельных потоках, игра их не ждёт, а результат приходит в плагин раз в кадр, и await продолжается уже в игровом потоке. Задержка — не больше одного кадра, лагов нет.
Может быть, модуль вам и не нужен: в amxts встроен клиент MySQL/MariaDB — Database, запросы асинхронные, игра их не ждёт:
JavaScript:
const top = await db.select().from(records).where(eq(records.map, server.map)).limit(10);
amxts 0.3.3 — семиклип в самом ядре, что видит каждый игрок, ошибка слушателя больше не теряется.
Плагины, собранные под 0.3.0, 0.3.1 и 0.3.2, работают на модуле 0.3.3 как есть. Для нового нужен модуль 0.3.3 — npx amxts upgrade ставит его на сервер.
Игроки проходят друг сквозь друга — без других модулей
Для семиклипа был нужен модуль ReSemiclip. Теперь это делает само ядро: два игрока, которых вы связали, проходят друг сквозь друга, клиент...
На данном сайте используются cookie-файлы, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших cookie-файлов.