AMX Mod X · Counter-Strike 1.6
Плагины для CS 1.6 на TypeScript.
Пишите плагин так же, как любой код на TypeScript: привычные типы, классы,
import { Player, plugin, print, server } from "~/facade";
plugin({
name: "Say HP",
version: "1.0.0",
author: "Author",
description: "An example",
});
server.addCommand("/hp", sayHp);
server.addEventListener("putinserver", (event) => {
print(0, `${event.player.name} joined`);
});
function sayHp(player: Player) {
print(player, `${player.name}, your HP: ${player.health}`);
if (player.health < 50) player.health = 100;
}
import { expect, test } from "vitest"; // или "bun:test"
import { loadPlugin } from "../src/testing";
test("/hp heals a hurt player", async () => {
const server = await loadPlugin("as/say-hp.ts");
const player = server.join("Alice", { health: 40 });
player.say("/hp");
expect(player.chat).toContain("Alice, your HP: 40");
expect(player.health).toBe(100);
}, 60_000);
TypeScript, а не новый язык
Плагин — обычный TypeScript. Всё, что нужно AssemblyScript и Pawn — ячейки, битовые представления дробных, строковые буферы — спрятано под капот: в фасад и сгенерированные нативы.
Под капотом
Заранее скомпилирован, работает внутри AMX Mod X
amxts ничего не переводит в Pawn. Плагин компилируется в WebAssembly компилятором AssemblyScript, затем в машинный код i386 утилитой
Машинный код, а не интерпретатор
Плагин компилируется в машинный код до того, как сервер его загрузит.
Любой натив, с типами
Генератор читает
Сервер CS 1.6
AMX Mod X
amxts_amxx
запускает ваши плагины .aot через WAMR
say-hp.aot загруженamxts_host.amxx
сгенерирован, без логики
нативы по имени
Модули и Pawn-плагины
reapi, hamsandwich, cstrike, ваши .amxx
Pawn продолжает работать
Pawn-плагины вызывают TypeScript
Каждая
/** A value from a config file, or false when the key is not there. */
export function cfg_get_value(file: string, section: string, key: string) {
return lookup(file, section, key); // string | null
}
/** A value from a config file, or false when the key is not there. */
native bool:cfg_get_value(const file[], const section[], const key[], out[], len);