[{"data":1,"prerenderedAt":4731},["ShallowReactive",2],{"navigation-docs_ru":3,"\u002Fru\u002Fdocs\u002Fgetting-started\u002Fcli":140,"\u002Fru\u002Fdocs\u002Fgetting-started\u002Fcli-surround":4725,"\u002Fru\u002Fdocs\u002Fgetting-started\u002Fcli-current":4730},[4,35,61,91,109,123,133],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":34},"Начало работы","i-lucide-rocket","\u002Fru\u002Fdocs\u002Fgetting-started","ru\u002Fdocs\u002F1.getting-started",[10,14,18,22,26,30],{"title":11,"path":12,"stem":13},"Введение","\u002Fru\u002Fdocs\u002Fgetting-started\u002Fintroduction","ru\u002Fdocs\u002F1.getting-started\u002F01.introduction",{"title":15,"path":16,"stem":17},"Быстрый старт","\u002Fru\u002Fdocs\u002Fgetting-started\u002Fquick-start","ru\u002Fdocs\u002F1.getting-started\u002F02.quick-start",{"title":19,"path":20,"stem":21},"CLI","\u002Fru\u002Fdocs\u002Fgetting-started\u002Fcli","ru\u002Fdocs\u002F1.getting-started\u002F03.cli",{"title":23,"path":24,"stem":25},"Установка на сервер","\u002Fru\u002Fdocs\u002Fgetting-started\u002Finstall","ru\u002Fdocs\u002F1.getting-started\u002F04.install",{"title":27,"path":28,"stem":29},"Сервер в Docker","\u002Fru\u002Fdocs\u002Fgetting-started\u002Fdocker","ru\u002Fdocs\u002F1.getting-started\u002F05.docker",{"title":31,"path":32,"stem":33},"Ограничения","\u002Fru\u002Fdocs\u002Fgetting-started\u002Flimitations","ru\u002Fdocs\u002F1.getting-started\u002F06.limitations",false,{"title":36,"icon":37,"path":38,"stem":39,"children":40,"page":34},"Основы","i-lucide-zap","\u002Fru\u002Fdocs\u002Fcore","ru\u002Fdocs\u002F2.core",[41,45,49,53,57],{"title":42,"path":43,"stem":44},"Плагин","\u002Fru\u002Fdocs\u002Fcore\u002Fplugin","ru\u002Fdocs\u002F2.core\u002F01.plugin",{"title":46,"path":47,"stem":48},"События игры","\u002Fru\u002Fdocs\u002Fcore\u002Fhooks","ru\u002Fdocs\u002F2.core\u002F02.hooks",{"title":50,"path":51,"stem":52},"Форварды","\u002Fru\u002Fdocs\u002Fcore\u002Fforwards","ru\u002Fdocs\u002F2.core\u002F03.forwards",{"title":54,"path":55,"stem":56},"Async и промисы","\u002Fru\u002Fdocs\u002Fcore\u002Fasync","ru\u002Fdocs\u002F2.core\u002F04.async",{"title":58,"path":59,"stem":60},"Производительность","\u002Fru\u002Fdocs\u002Fcore\u002Fperformance","ru\u002Fdocs\u002F2.core\u002F05.performance",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":34},"Игра","i-lucide-gamepad-2","\u002Fru\u002Fdocs\u002Fgame","ru\u002Fdocs\u002F3.game",[67,71,75,79,83,87],{"title":68,"path":69,"stem":70},"Игроки и сущности","\u002Fru\u002Fdocs\u002Fgame\u002Fentities","ru\u002Fdocs\u002F3.game\u002F01.entities",{"title":72,"path":73,"stem":74},"Игроки: действия","\u002Fru\u002Fdocs\u002Fgame\u002Fplayers","ru\u002Fdocs\u002F3.game\u002F02.players",{"title":76,"path":77,"stem":78},"Эффекты","\u002Fru\u002Fdocs\u002Fgame\u002Feffects","ru\u002Fdocs\u002F3.game\u002F03.effects",{"title":80,"path":81,"stem":82},"Флаги","\u002Fru\u002Fdocs\u002Fgame\u002Fflags","ru\u002Fdocs\u002F3.game\u002F04.flags",{"title":84,"path":85,"stem":86},"Квары","\u002Fru\u002Fdocs\u002Fgame\u002Fcvars","ru\u002Fdocs\u002F3.game\u002F05.cvars",{"title":88,"path":89,"stem":90},"Сообщения","\u002Fru\u002Fdocs\u002Fgame\u002Fmessages","ru\u002Fdocs\u002F3.game\u002F06.messages",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":34},"Данные","i-lucide-database","\u002Fru\u002Fdocs\u002Fdata","ru\u002Fdocs\u002F4.data",[97,101,105],{"title":98,"path":99,"stem":100},"Хранилище","\u002Fru\u002Fdocs\u002Fdata\u002Fstorage","ru\u002Fdocs\u002F4.data\u002F01.storage",{"title":102,"path":103,"stem":104},"Файлы","\u002Fru\u002Fdocs\u002Fdata\u002Ffs","ru\u002Fdocs\u002F4.data\u002F02.fs",{"title":106,"path":107,"stem":108},"HTTP","\u002Fru\u002Fdocs\u002Fdata\u002Fhttp","ru\u002Fdocs\u002F4.data\u002F03.http",{"title":110,"icon":111,"path":112,"stem":113,"children":114,"page":34},"Модули","i-lucide-package","\u002Fru\u002Fdocs\u002Fmodules","ru\u002Fdocs\u002F5.modules",[115,119],{"title":116,"path":117,"stem":118},"Общие модули","\u002Fru\u002Fdocs\u002Fmodules\u002Fshared-modules","ru\u002Fdocs\u002F5.modules\u002F01.shared-modules",{"title":120,"path":121,"stem":122},"Свой модуль","\u002Fru\u002Fdocs\u002Fmodules\u002Fcreating-a-module","ru\u002Fdocs\u002F5.modules\u002F02.creating-a-module",{"title":124,"icon":125,"path":126,"stem":127,"children":128,"page":34},"Pawn","i-lucide-plug","\u002Fru\u002Fdocs\u002Fpawn","ru\u002Fdocs\u002F6.pawn",[129],{"title":130,"path":131,"stem":132},"Нативы","\u002Fru\u002Fdocs\u002Fpawn\u002Fnatives","ru\u002Fdocs\u002F6.pawn\u002F01.natives",{"title":134,"path":135,"stem":136,"children":137,"icon":139},"Тесты","\u002Fru\u002Fdocs\u002Ftesting","ru\u002Fdocs\u002F7.testing\u002F01.index",[138],{"title":134,"path":135,"stem":136},"i-lucide-flask-conical",{"id":141,"title":142,"body":143,"description":4719,"extension":4720,"meta":4721,"navigation":4722,"path":20,"seo":4723,"stem":21,"__hash__":4724},"docs_ru\u002Fru\u002Fdocs\u002F1.getting-started\u002F03.cli.md","Команда amxts",{"type":144,"value":145,"toc":4699},"minimark",[146,162,264,285,295,303,310,315,487,489,505,562,572,578,585,708,900,911,1385,1388,1394,1399,1411,1443,1795,1807,1820,1834,1838,1847,2082,2084,2139,2145,2151,2166,2177,2223,2226,2237,2252,2267,2289,2307,2315,2321,2328,2357,2421,2437,2439,2662,2692,2696,2703,2746,2775,2797,2799,2854,2860,2862,3025,3039,3041,3279,3302,3345,3353,3359,3361,3416,3444,3446,3501,3510,3556,3575,3582,3756,3772,3870,3873,3876,3983,3989,4041,4044,4050,4067,4069,4079,4241,4261,4294,4330,4443,4551,4570,4626,4628,4683,4689,4695],[147,148,149,153,154,157,158,161],"p",{},[150,151,152],"code",{},"amxts"," — команда, которой пользуется проект: создаёт проекты и модули,\nдобавляет модули, собирает, выкладывает, проверяет типы и запускает тесты.\nЭто пакет ",[150,155,156],{},"@amxts\u002Fcli",", от которого зависит ",[150,159,160],{},"@amxts\u002Fcore",", поэтому она есть\nв каждом проекте и проект запускает её через свой менеджер пакетов:",[163,164,166,203,223,243],"code-group",{"sync":165},"pm",[167,168,174],"pre",{"className":169,"code":170,"filename":171,"language":172,"meta":173,"style":173},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx amxts \u003Cкоманда>\n","npm","sh","",[150,175,176],{"__ignoreMap":173},[177,178,181,185,189,193,196,200],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sBMFI","npx",[177,186,188],{"class":187},"sfazB"," amxts",[177,190,192],{"class":191},"sMK4o"," \u003C",[177,194,195],{"class":187},"команд",[177,197,199],{"class":198},"sTEyZ","а",[177,201,202],{"class":191},">\n",[167,204,207],{"className":169,"code":205,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts \u003Cкоманда>\n","pnpm",[150,208,209],{"__ignoreMap":173},[177,210,211,213,215,217,219,221],{"class":179,"line":180},[177,212,206],{"class":183},[177,214,188],{"class":187},[177,216,192],{"class":191},[177,218,195],{"class":187},[177,220,199],{"class":198},[177,222,202],{"class":191},[167,224,227],{"className":169,"code":225,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts \u003Cкоманда>\n","yarn",[150,228,229],{"__ignoreMap":173},[177,230,231,233,235,237,239,241],{"class":179,"line":180},[177,232,226],{"class":183},[177,234,188],{"class":187},[177,236,192],{"class":191},[177,238,195],{"class":187},[177,240,199],{"class":198},[177,242,202],{"class":191},[167,244,247],{"className":169,"code":245,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts \u003Cкоманда>\n","bun",[150,248,249],{"__ignoreMap":173},[177,250,251,254,256,258,260,262],{"class":179,"line":180},[177,252,253],{"class":183},"bunx",[177,255,188],{"class":187},[177,257,192],{"class":191},[177,259,195],{"class":187},[177,261,199],{"class":198},[177,263,202],{"class":191},[147,265,266,267,269,270,273,274,277,278,280,281,284],{},"Команда работает с собственным ядром проекта — ",[150,268,160],{}," из его\n",[150,271,272],{},"node_modules",": ядро старше или новее, чем команда знает, — это ошибка, которая\nговорит, что из двух обновить. Установленная глобально\n(",[150,275,276],{},"npm install -g @amxts\u002Fcli","), ",[150,279,152],{}," так же работает в любом проекте, а\n",[150,282,283],{},"init"," — где угодно.",[147,286,287,290,291,294],{},[150,288,289],{},"amxts --help"," перечисляет команды, ",[150,292,293],{},"amxts \u003Cкоманда> --help"," показывает\nпараметры команды с примерами. На опечатку команда подсказывает:",[167,296,301],{"className":297,"code":299,"language":300},[298],"language-text","$ npx amxts buidl\n✖ Unknown command buidl\n  Did you mean amxts build?\n","text",[150,302,299],{"__ignoreMap":173},[147,304,305,306,309],{},"Ошибка — одна строка и подсказка под ней. ",[150,307,308],{},"--debug"," добавляет, где она\nслучилась, — для отчёта об ошибке.",[311,312,314],"h2",{"id":313},"команды","Команды",[316,317,318,331],"table",{},[319,320,321],"thead",{},[322,323,324,328],"tr",{},[325,326,327],"th",{},"команда",[325,329,330],{},"что делает",[332,333,334,352,365,381,398,411,431,444,461,474],"tbody",{},[322,335,336,345],{},[337,338,339],"td",{},[340,341,343],"a",{"href":342},"#init",[150,344,283],{},[337,346,347,348,351],{},"создаёт проект, а с ",[150,349,350],{},"--module"," — пакет модуля",[322,353,354,362],{},[337,355,356],{},[340,357,359],{"href":358},"#dev",[150,360,361],{},"dev",[337,363,364],{},"собирает, выкладывает на сервер и снова — на каждое сохранение",[322,366,367,375],{},[337,368,369],{},[340,370,372],{"href":371},"#build",[150,373,374],{},"build",[337,376,377,378],{},"собирает плагины и модули в ",[150,379,380],{},"dist\u002F",[322,382,383,391],{},[337,384,385],{},[340,386,388],{"href":387},"#typecheck",[150,389,390],{},"typecheck",[337,392,393,394,397],{},"проверяет плагины и ",[150,395,396],{},"amxts.config.ts"," так же, как редактор",[322,399,400,408],{},[337,401,402],{},[340,403,405],{"href":404},"#test",[150,406,407],{},"test",[337,409,410],{},"запускает тесты проекта на поддельном сервере",[322,412,413,421],{},[337,414,415],{},[340,416,418],{"href":417},"#module",[150,419,420],{},"module",[337,422,423,426,427,430],{},[150,424,425],{},"module add"," ставит модуль и вписывает его в конфиг; ",[150,428,429],{},"module list"," показывает модули",[322,432,433,441],{},[337,434,435],{},[340,436,438],{"href":437},"#check",[150,439,440],{},"check",[337,442,443],{},"в пакете модуля: проверяет, что он готов к публикации",[322,445,446,454],{},[337,447,448],{},[340,449,451],{"href":450},"#prepare",[150,452,453],{},"prepare",[337,455,456,457,460],{},"получает include сервера и пишет ",[150,458,459],{},".amxts\u002F"," для редактора",[322,462,463,471],{},[337,464,465],{},[340,466,468],{"href":467},"#upgrade",[150,469,470],{},"upgrade",[337,472,473],{},"переводит проект на другой выпуск amxts: пакеты, код, сборку и сервер",[322,475,476,484],{},[337,477,478],{},[340,479,481],{"href":480},"#info",[150,482,483],{},"info",[337,485,486],{},"версии и настройки — для отчёта об ошибке",[311,488,283],{"id":283},[147,490,491,492,496,497,499,500,504],{},"Создаёт проект. Спрашивает по порядку: менеджер пакетов (выбран тот, что\nзапустил команду), папку, модули (из ",[340,493,495],{"href":494},"\u002Fru\u002Fmodules","каталога модулей","), oxlint и\noxfmt, git, папку сервера для ",[150,498,361],{}," и — когда этого не говорят include\nсервера — для какого сервера проект. Потом пишет файлы, ставит зависимости,\nполучает ",[340,501,503],{"href":502},"#include-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0","include сервера"," и говорит, что запускать дальше:",[163,506,507,522,536,549],{"sync":165},[167,508,510],{"className":169,"code":509,"filename":171,"language":172,"meta":173,"style":173},"npm create amxts@latest\n",[150,511,512],{"__ignoreMap":173},[177,513,514,516,519],{"class":179,"line":180},[177,515,171],{"class":183},[177,517,518],{"class":187}," create",[177,520,521],{"class":187}," amxts@latest\n",[167,523,525],{"className":169,"code":524,"filename":206,"language":172,"meta":173,"style":173},"pnpm create amxts\n",[150,526,527],{"__ignoreMap":173},[177,528,529,531,533],{"class":179,"line":180},[177,530,206],{"class":183},[177,532,518],{"class":187},[177,534,535],{"class":187}," amxts\n",[167,537,539],{"className":169,"code":538,"filename":226,"language":172,"meta":173,"style":173},"yarn create amxts\n",[150,540,541],{"__ignoreMap":173},[177,542,543,545,547],{"class":179,"line":180},[177,544,226],{"class":183},[177,546,518],{"class":187},[177,548,535],{"class":187},[167,550,552],{"className":169,"code":551,"filename":246,"language":172,"meta":173,"style":173},"bun create amxts\n",[150,553,554],{"__ignoreMap":173},[177,555,556,558,560],{"class":179,"line":180},[177,557,246],{"class":183},[177,559,518],{"class":187},[177,561,535],{"class":187},[147,563,564,567,568,571],{},[150,565,566],{},"npm create amxts"," и ",[150,569,570],{},"npx amxts init"," — одна и та же команда. Вопросы\nвыглядят так:",[167,573,576],{"className":574,"code":575,"language":300},[298],"┌  amxts 0.2.0 · a new project\n│\n◇  Which package manager?\n│  npm\n│\n◇  Where should the project go?\n│  my-server\n│\n◇  Which modules? (space to pick, enter to go on)\n│  menu-core\n│\n◇  Add oxlint and oxfmt? (lint and format)\n│  Yes\n│\n◇  Initialize a git repository?\n│  Yes\n│\n◇  Where is the server? its addons\u002Famxts folder, for npm run dev - empty to skip\n│  D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts\n│\n◆  Created my-server in my-server\n│\n●  config-core is listed too: menu-core needs it\n│\n◇  Installed dependencies with npm 11.16.0\n│\n◆  Includes: the server's own (D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxmodx\u002Fscripting\u002Finclude)\n│\n◆  Initialized a git repository\n│\n◆  Prepared the editor config (.amxts\u002Ftsconfig.json)\n│\n◇  Next steps ──────────────────────────────────────╮\n│                                                   │\n│  cd my-server                                     │\n│  npm run dev    # build, deploy, rebuild on save  │\n│                                                   │\n├───────────────────────────────────────────────────╯\n│\n└  Docs: https:\u002F\u002Famxts.github.io\u002Fdocs\u002Fgetting-started\u002Fquick-start\n",[150,577,575],{"__ignoreMap":173},[147,579,580,581,584],{},"У каждого вопроса есть флаг, а ",[150,582,583],{},"--yes"," берёт значения по умолчанию для\nостального — для скрипта или CI:",[163,586,587,622,652,681],{"sync":165},[167,588,590],{"className":169,"code":589,"filename":171,"language":172,"meta":173,"style":173},"npx amxts init my-server --modules menu-core,config-core --no-git --server D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts --yes\n",[150,591,592],{"__ignoreMap":173},[177,593,594,596,598,601,604,607,610,613,616,619],{"class":179,"line":180},[177,595,184],{"class":183},[177,597,188],{"class":187},[177,599,600],{"class":187}," init",[177,602,603],{"class":187}," my-server",[177,605,606],{"class":187}," --modules",[177,608,609],{"class":187}," menu-core,config-core",[177,611,612],{"class":187}," --no-git",[177,614,615],{"class":187}," --server",[177,617,618],{"class":187}," D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts",[177,620,621],{"class":187}," --yes\n",[167,623,625],{"className":169,"code":624,"filename":206,"language":172,"meta":173,"style":173},"pnpm dlx amxts init my-server --modules menu-core,config-core --no-git --server D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts --yes\n",[150,626,627],{"__ignoreMap":173},[177,628,629,631,634,636,638,640,642,644,646,648,650],{"class":179,"line":180},[177,630,206],{"class":183},[177,632,633],{"class":187}," dlx",[177,635,188],{"class":187},[177,637,600],{"class":187},[177,639,603],{"class":187},[177,641,606],{"class":187},[177,643,609],{"class":187},[177,645,612],{"class":187},[177,647,615],{"class":187},[177,649,618],{"class":187},[177,651,621],{"class":187},[167,653,655],{"className":169,"code":654,"filename":226,"language":172,"meta":173,"style":173},"yarn dlx amxts init my-server --modules menu-core,config-core --no-git --server D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts --yes\n",[150,656,657],{"__ignoreMap":173},[177,658,659,661,663,665,667,669,671,673,675,677,679],{"class":179,"line":180},[177,660,226],{"class":183},[177,662,633],{"class":187},[177,664,188],{"class":187},[177,666,600],{"class":187},[177,668,603],{"class":187},[177,670,606],{"class":187},[177,672,609],{"class":187},[177,674,612],{"class":187},[177,676,615],{"class":187},[177,678,618],{"class":187},[177,680,621],{"class":187},[167,682,684],{"className":169,"code":683,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts init my-server --modules menu-core,config-core --no-git --server D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts --yes\n",[150,685,686],{"__ignoreMap":173},[177,687,688,690,692,694,696,698,700,702,704,706],{"class":179,"line":180},[177,689,253],{"class":183},[177,691,188],{"class":187},[177,693,600],{"class":187},[177,695,603],{"class":187},[177,697,606],{"class":187},[177,699,609],{"class":187},[177,701,612],{"class":187},[177,703,615],{"class":187},[177,705,618],{"class":187},[177,707,621],{"class":187},[316,709,710,719],{},[319,711,712],{},[322,713,714,717],{},[325,715,716],{},"параметр",[325,718,330],{},[332,720,721,734,744,762,772,785,814,832,853,863,876,886],{},[322,722,723,728],{},[337,724,725],{},[150,726,727],{},"[папка]",[337,729,730,731],{},"куда положить проект; по умолчанию ",[150,732,733],{},"my-server",[322,735,736,741],{},[337,737,738],{},[150,739,740],{},"--pm \u003Cnpm|pnpm|yarn|bun>",[337,742,743],{},"менеджер пакетов; по умолчанию тот, что запустил команду",[322,745,746,751],{},[337,747,748],{},[150,749,750],{},"--modules \u003Cсписок>",[337,752,753,754,757,758,761],{},"модули через запятую, по именам в каталоге или как пакеты npm: ",[150,755,756],{},"menu-core,config-core","; ",[150,759,760],{},"\"\""," — без модулей",[322,763,764,769],{},[337,765,766],{},[150,767,768],{},"--no-lint",[337,770,771],{},"без oxlint и oxfmt (по умолчанию они добавляются)",[322,773,774,779],{},[337,775,776],{},[150,777,778],{},"--no-git",[337,780,781,782],{},"без ",[150,783,784],{},"git init",[322,786,787,792],{},[337,788,789],{},[150,790,791],{},"--server \u003Cпуть>",[337,793,794,795,798,799,802,803,806,807,810,811,813],{},"сервер: его папка, его ",[150,796,797],{},"cstrike"," или его ",[150,800,801],{},"addons\u002Famxts","; в ",[150,804,805],{},".env"," как ",[150,808,809],{},"AMXTS_SERVER"," пишется ",[150,812,801],{},", а сборка берёт include, которые стоят на нём",[322,815,816,821],{},[337,817,818],{},[150,819,820],{},"--target \u003Crehlds|hlds>",[337,822,823,824,827,828,831],{},"для какого сервера проект, когда этого не говорят include сервера: ",[150,825,826],{},"rehlds"," — ReHLDS, ReGameDLL и ReAPI (по умолчанию) — или ",[150,829,830],{},"hlds",", обычный HLDS",[322,833,834,839],{},[337,835,836],{},[150,837,838],{},"--os \u003Cwindows|linux>",[337,840,841,842,806,844,847,848,852],{},"система сервера, когда её не видно по его папке: пишется в ",[150,843,805],{},[150,845,846],{},"AMXTS_SERVER_OS"," (",[340,849,851],{"href":850},"#%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0","система сервера",")",[322,854,855,860],{},[337,856,857],{},[150,858,859],{},"--no-install",[337,861,862],{},"записать файлы, но не ставить зависимости",[322,864,865,873],{},[337,866,867,869,870],{},[150,868,583],{},", ",[150,871,872],{},"-y",[337,874,875],{},"ничего не спрашивать",[322,877,878,883],{},[337,879,880],{},[150,881,882],{},"--force",[337,884,885],{},"писать в непустую папку",[322,887,888,893],{},[337,889,890],{},[150,891,892],{},"--local",[337,894,895,896,899],{},"подключить ядро и официальные модули ссылками на их папки на этой машине, а не ставить из npm, — для работы над самим amxts; ",[150,897,898],{},"AMXTS_CORE"," задаёт папку ядра",[147,901,902,903,906,907,910],{},"Модуль, которому нужен другой, приводит его с собой: с ",[150,904,905],{},"menu-core"," ставится и\nconfig-core, а ",[150,908,909],{},"modules"," перечисляет его сразу за menu-core, с комментарием,\nкакому модулю он нужен. Сборка загружает его первым:",[167,912,917],{"className":913,"code":914,"language":915,"meta":916,"style":173},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight twoslash lsp","import { hostIndex, handled, floatCell, rounded, cellFloat, ret, publicFor, nativeFn, arg, argText, argc, caller, setArg, setArgText, argString, cellsToString, stringToCells, cells, out, text, arrayOf, cell, putCell, noOrigin, hasModule, readText, playerIds, accessOf, paint, print, cmd, cmdWide, setTimeout, sleep, setInterval, clearTimeout, clearInterval, hook, plugin, defineModule, callingPlugin, onPluginStop, createCellArray, destroyCellArray, cellArrayRows, pushCellArrayRow, cellsText, textCells, menuColors, colorTags, showMenu, Handler, WideHandler, Float, CellArray, CellBuffer, TEXT_MAX, Team, AuthType, WeaponName, ItemName, ModuleName, KillOptions, MoveOptions, Client, Player, CommandOptions, CommandInfo, HudOptions, HudEffect, HudLine, FadeDirection, FadeOptions, ShakeOptions, ProgressBarOptions, StatusIconState, Screen, SoundChannel, SoundOptions, Resource, MessageArgs, ClientMessage, PlayerChangeEvent, ServerListenerOptions, CvarChangeEvent, CvarListener, Cvar, Server, server, Game, GameListenerOptions, UseType, ActionOptions, TouchEvent, RoundWinner, EndRoundOptions, game, Variant, VariantName, Flag, Entity, Weapon, WeaponKind, weaponKindOf, RenderMode, RenderFx, MoveType, Solid, TakeDamage, DeadFlag, WaterLevel, Contents, FixAngle, HitGroup, ArmorType, ObserverMode, JoinState, GameMenu, PlayerModel, IgnoredChat, ThrowDirection, BloodColor, MusicState, Target, swapTeam, lang, cvar, TimerHandler, SleepOptions, Call, Ref, PluginInfo, ModuleOptions, ForwardStop, NoArgument, Forward, Storage, EntityFilter, PawnFunction, PawnCall, MenuColor, MenuOptions, MenuContext, MenuItemOptions, Menu, protocolMessageNames, addServerListener, removeServerListener, PluginInitEvent, PluginPauseEvent, PluginUnpauseEvent, ServerChangelevelEvent, PluginCfgEvent, PluginEndEvent, PluginLogEvent, PluginPrecacheEvent, ClientInfochangedEvent, ClientConnectEvent, ClientConnectexEvent, ClientAuthorizedEvent, ClientDisconnectedEvent, ClientRemoveEvent, ClientCommandEvent, ClientPutinserverEvent, InconsistentFileEvent, PluginModulesEvent, OnConfigsExecutedEvent, OnAutoConfigsBufferedEvent, CS_InternalCommandEvent, CS_OnBuyAttemptEvent, CS_OnBuyEvent, ServerFrameEvent, ClientKillEvent, ClientImpulseEvent, ClientCmdStartEvent, PfnThinkEvent, PfnPlaybackeventEvent, PfnKeyvalueEvent, PfnSpawnEvent, ADStopMessage, AllowSpecMessage, AmmoPickupMessage, AmmoXMessage, ArmorTypeMessage, BarTimeMessage, BatteryMessage, BlinkAcctMessage, BombDropMessage, BombPickupMessage, BotVoiceMessage, BuyCloseMessage, ClCorpseMessage, CrosshairMessage, CurWeaponMessage, DamageMessage, DeathMsgMessage, FlashlightMessage, FlashBatMessage, GeigerMessage, HealthMessage, HideWeaponMessage, HostageKMessage, HostagePosMessage, HudTextMessage, InitHUDMessage, ItemPickupMessage, ItemStatusMessage, LocationMessage, MoneyMessage, MOTDMessage, NVGToggleMessage, RadarMessage, ReqStateMessage, ResetHUDMessage, RoundTimeMessage, SayTextMessage, ScenarioMessage, ScoreAttribMessage, ScoreInfoMessage, ScreenFadeMessage, ScreenShakeMessage, SendAudioMessage, ServerNameMessage, SetFOVMessage, ShowMenuMessage, ShowTimerMessage, SpecHealthMessage, SpectatorMessage, StatusIconMessage, StatusTextMessage, StatusValueMessage, TaskTimeMessage, TeamInfoMessage, TeamScoreMessage, TextMsgMessage, TrainMessage, TutorCloseMessage, VGUIMenuMessage, ViewModeMessage, WeaponListMessage, WeapPickupMessage, ServerEventMap, ServerMessageMap, flagList, FlagFamily, FlagStore, EntvarFlags, MemberFlags, FlagList, HideHud, HIDE_HUD, Button, BUTTON, Effect, EFFECT, EntityFlag, ENTITY_FLAG, Damage, DAMAGE, Access, ACCESS, ScoreStatus, SCORE_STATUS, WeaponState, WEAPON_STATE, PhysicsFlag, PHYSICS_FLAG, addGameListener, removeGameListener, HookEvent, HookEntry, RewardReason, ResourceType, TeamChoice, ItemKind, ItemRestriction, BotEvent, RoundEndReason, DeathMessageFlag, KillRarity, PlayerAnimation, VguiMenu, ActivateEvent, ActivateServerEvent, AddFragsEvent, AddItemEvent, AddMoneyEvent, AddMultiDamageEvent, AddResourceEvent, AddTeamScoreEvent, AddToPlayerEvent, AddWeaponEvent, AirAccelerateEvent, AirMoveEvent, ApplyMultiDamageEvent, AttachToPlayerEvent, AutoaimVectorEvent, BalanceTeamsEvent, BecomeBomberEvent, BecomeDeadEvent, BecomeProneEvent, BecomeVipEvent, BestVisibleEnemyEvent, BlindEvent, BlockedEvent, BloodColorEvent, BodyTargetEvent, BounceGibTouchEvent, BuyAmmoEvent, BuyItemEvent, BuyWeaponEvent, CanDeployEvent, CanDropEvent, CanHaveItemEvent, CanHolsterEvent, CanPlayerHearPlayerEvent, CanRespawnEvent, CanShootThroughEvent, CanSpectateEvent, CanSwitchTeamEvent, CanTakeDamageEvent, CenterEvent, ChangeLevelEvent, ChangeModelEvent, ChangeNameEvent, ChangeYawEvent, ChatMessageEvent, CheckMapConditionsEvent, CheckTimeBasedDamageEvent, CheckUserInfoEvent, CheckWaterJumpEvent, CheckWinConditionsEvent, ChildDeathNoticeEvent, ChooseAppearanceEvent, ChooseTeamEvent, ClassifyEvent, ClearMultiDamageEvent, ClientConnectedEvent, ConnectClientEvent, ConsoleMessageEvent, CreateWeaponBoxEvent, DamageDecalEvent, DeathActivityEvent, DeathNoticeEvent, DeathSoundEvent, DefaultDeployEvent, DefaultReloadEvent, DefaultShotgunReloadEvent, DefuseBombEndEvent, DefuseBombStartEvent, DelayEvent, DeployEvent, DisappearEvent, DisconnectClientEvent, DropEvent, DropIdlePlayerEvent, DropPlayerItemEvent, DropShieldEvent, DropWeaponsOnDeathEvent, DuckEvent, DuckMovementEvent, EarPositionEvent, ExplodeBombEvent, ExplodeFlashbangEvent, ExplodeHeGrenadeEvent, ExplodeSmokeGrenadeEvent, ExtractAmmoEvent, ExtractClipAmmoEvent, EyePositionEvent, FadeMonsterEvent, FallDamageEvent, FireBulletsEvent, GameEventEvent, GameThinkEvent, GetForceCameraEvent, GetIntoGameEvent, GetNextBestWeaponEvent, GibMonsterEvent, GibSpawnEvent, GiveAmmoEvent, GiveBombEvent, GiveDefaultItemsEvent, GiveItemEvent, GiveShieldEvent, GunPositionEvent, HasAlienGibsEvent, HasHumanGibsEvent, HasTargetEvent, HealEvent, HintMessageEvent, HolsterEvent, IlluminationEvent, ImpulseEvent, IntermissionEvent, InViewConeEvent, IsAliveEvent, IsBotEvent, IsBspModelEvent, IsInWorldEvent, IsMovingEvent, IsNetClientEvent, IsPlayerEvent, IsSneakingEvent, IsTriggeredEvent, IsUsableEvent, IsWeaponEvent, ItemPostFrameEvent, ItemPreFrameEvent, ItemRestrictedEvent, ItemSlotEvent, ItemUpdateClientDataEvent, JoiningThinkEvent, JumpEvent, JumpMovementEvent, KillEvent, KilledEvent, LadderMoveEvent, LookEvent, MapResetEvent, MaxSpeedEvent, MonsterInitDeadEvent, MoveEvent, NewRoundEvent, NextTargetEvent, ObserverSetModeEvent, ObserverThinkEvent, PainEvent, PainSoundEvent, PlantBombEvent, PlayEmptySoundEvent, PlayerBlindEvent, PlayerDeathThinkEvent, PlayerGotWeaponEvent, PlayerKilledEvent, PlayerSpawnEvent, PlayStepSoundEvent, PointInViewConeEvent, PointVisibleEvent, PostThinkEvent, PrecacheEvent, PrecacheFileEvent, PrecacheModelEvent, PrecacheSoundEvent, PreThinkEvent, PrimaryAmmoIndexEvent, PrimaryAttackEvent, PrintfEvent, RadioEvent, RecoilEvent, ReflectGaussEvent, RelationshipEvent, ReloadEvent, RemoveAllItemsEvent, RemoveGunsEvent, RemoveItemEvent, RemoveSpawnProtectionEvent, ResetEmptySoundEvent, ResetMaxSpeedEvent, ResetSequenceInfoEvent, RespawnEvent, RestartEvent, RetireWeaponEvent, RoundEndEvent, RoundRespawnEvent, RoundStartEvent, SecondaryAmmoIndexEvent, SecondaryAttackEvent, SelectSpawnPointEvent, SendDeathMessageEvent, SendWeaponAnimEvent, ServerCommandEvent, ServerDeactivateEvent, SetAnimationEvent, SetModelEvent, SetObjectCollisionBoxEvent, SetSpawnProtectionEvent, SetToggleStateEvent, ShootEvent, ShootBuckshotEvent, ShouldFadeOnDeathEvent, ShouldSwitchWeaponEvent, ShouldWeaponIdleEvent, ShowMenuEvent, ShowVguiMenuEvent, SpawnEvent, SpawnEquipEvent, SpawnHeadGibEvent, SpawnRandomGibsEvent, SpawnSpotEvent, SpectateNextEvent, StartDeathCamEvent, StartSneakingEvent, StartSoundEvent, StartSpectatingEvent, StopSneakingEvent, SwitchTeamEvent, TakeDamageEvent, TakeDamageImpulseEvent, TeamFullEvent, TeamIdEvent, TeamStackedEvent, ThinkEvent, ThrowFlashbangEvent, ThrowGrenadeEvent, ThrowHeGrenadeEvent, ThrowSmokeGrenadeEvent, ToggleStateEvent, TouchingWeaponEvent, TraceAttackEvent, TraceBleedEvent, TraceLineEvent, UnDuckEvent, UpdateClientDataEvent, UpdateItemInfoEvent, UpdateStatusBarEvent, UseEvent, UseEmptyEvent, UserInfoChangeEvent, VisibleEvent, WaitTillLandEvent, WaterJumpEvent, WeaponIdleEvent, GameEventMap, GameAnswerMap, Vector, EffectRecipients, PointEffectOptions, SegmentEffectOptions, EntityEffectOptions, PlayerEffectOptions, BeamPointsOptions, BeamEntityPointOptions, BeamEntitiesOptions, BeamCircleOptions, BeamFollowOptions, BeamSpriteOptions, LightningOptions, ExplosionOptions, SmokeOptions, ParticleExplosionOptions, ImplosionOptions, SpriteTrailOptions, SpriteOptions, GlowSpriteOptions, StreakSplashOptions, DynamicLightOptions, EntityLightOptions, LineOptions, BoxOptions, LargeFunnelOptions, BloodOptions, FizzOptions, BounceSound, ModelOptions, ExplodeModelOptions, BreakMaterial, BreakModelOptions, SpriteSprayOptions, ArmorRicochetOptions, BubblesOptions, BloodSpriteOptions, ProjectileOptions, SprayOptions, PlayerSpritesOptions, ParticleBurstOptions, FireRise, FireBlend, FireFieldOptions, PlayerAttachmentOptions, effects, request, fetch, useFetch, URL, URLSearchParams, Headers, TlsOptions, RequestInit, Request, ResponseInit, Response, RequestErrorKind, RequestOptions, RequestResult, UseFetchOptions, FetchResult, FetchError } from \"~\u002Ffacade\";\n\u002F\u002F ---cut---\n\u002F\u002F amxts.config.ts\nexport default defineConfig({\n    modules: [\n        \"@amxts\u002Fmenu-core\",\n        \"@amxts\u002Fconfig-core\", \u002F\u002F needed by menu-core\n    ],\n    target: \"rehlds\",\n});\n","ts","twoslash types-ru",[150,918,919,925,1207,1258,1271,1285,1293,1375],{"__ignoreMap":173},[177,920,921],{"class":179,"line":180},[177,922,924],{"class":923},"sHwdD","\u002F\u002F amxts.config.ts\n",[177,926,928,932,935,939,1202,1204],{"class":179,"line":927},2,[177,929,931],{"class":930},"s7zQu","export",[177,933,934],{"class":930}," default",[177,936,938],{"class":937},"s2Zo4"," ",[177,940,941],{"class":937},[942,943,947,950],"v-menu",{"class":944,"popper-class":945,"theme":946},"twoslash-hover","shiki twoslash-floating vp-copy-ignore","twoslash",[177,948,949],{},"defineConfig",[951,952,954],"template",{"v-slot:popper":953},"{}",[177,955,957,1105],{"class":956,"v-pre":173},"twoslash-popup-container vp-copy-ignore",[150,958,960],{"class":959},"twoslash-popup-code",[167,961,965],{"class":962,"style":963,"tabindex":964},"shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#babed8;--shiki-light-bg:#FAFAFA;--shiki-default-bg:#263238;--shiki-dark-bg:#292D3E","0",[150,966,967,981,1006,1022,1037,1067,1083,1100],{},[177,968,969,973,977],{"class":179},[177,970,972],{"style":971},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA","interface",[177,974,976],{"style":975},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B"," AmxtsConfig",[177,978,980],{"style":979},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF"," {",[177,982,983,987,990,993,997,1000,1003],{"class":179},[177,984,986],{"style":985},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178","    modules",[177,988,989],{"style":979},"?:",[177,991,992],{"style":975}," string",[177,994,996],{"style":995},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8","[] ",[177,998,999],{"style":979},"|",[177,1001,1002],{"style":975}," undefined",[177,1004,1005],{"style":979},";",[177,1007,1008,1011,1013,1015,1018,1020],{"class":179},[177,1009,1010],{"style":985},"    pluginsDir",[177,1012,989],{"style":979},[177,1014,992],{"style":975},[177,1016,1017],{"style":979}," |",[177,1019,1002],{"style":975},[177,1021,1005],{"style":979},[177,1023,1024,1027,1029,1031,1033,1035],{"class":179},[177,1025,1026],{"style":985},"    outDir",[177,1028,989],{"style":979},[177,1030,992],{"style":975},[177,1032,1017],{"style":979},[177,1034,1002],{"style":975},[177,1036,1005],{"style":979},[177,1038,1039,1042,1044,1047,1050,1053,1055,1057,1059,1061,1063,1065],{"class":179},[177,1040,1041],{"style":985},"    target",[177,1043,989],{"style":979},[177,1045,1046],{"style":979}," \"",[177,1048,826],{"style":1049},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[177,1051,1052],{"style":979},"\"",[177,1054,1017],{"style":979},[177,1056,1046],{"style":979},[177,1058,830],{"style":1049},[177,1060,1052],{"style":979},[177,1062,1017],{"style":979},[177,1064,1002],{"style":975},[177,1066,1005],{"style":979},[177,1068,1069,1072,1074,1077,1079,1081],{"class":179},[177,1070,1071],{"style":985},"    imports",[177,1073,989],{"style":979},[177,1075,1076],{"style":975}," AmxtsImports",[177,1078,1017],{"style":979},[177,1080,1002],{"style":975},[177,1082,1005],{"style":979},[177,1084,1085,1088,1090,1092,1094,1096,1098],{"class":179},[177,1086,1087],{"style":985},"    pawn",[177,1089,989],{"style":979},[177,1091,992],{"style":975},[177,1093,996],{"style":995},[177,1095,999],{"style":979},[177,1097,1002],{"style":975},[177,1099,1005],{"style":979},[177,1101,1102],{"class":179},[177,1103,1104],{"style":979},"}",[1106,1107,1109,1115],"div",{"class":1108},"twoslash-popup-docs vp-doc",[147,1110,1111,1112,1114],{},"Описывает настройки проекта в ",[150,1113,396],{},":",[150,1116,1117],{},[167,1118,1119],{"class":962,"style":963,"tabindex":964},[150,1120,1121,1138,1170,1194],{},[177,1122,1123,1126,1128,1132,1135],{"class":179},[177,1124,931],{"style":1125},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[177,1127,934],{"style":1125},[177,1129,1131],{"style":1130},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF"," defineConfig",[177,1133,1134],{"style":995},"(",[177,1136,1137],{"style":979},"{",[177,1139,1140,1143,1145,1148,1150,1153,1155,1158,1160,1163,1165,1168],{"class":179},[177,1141,1142],{"style":985},"  modules",[177,1144,1114],{"style":979},[177,1146,1147],{"style":995}," [",[177,1149,1052],{"style":979},[177,1151,1152],{"style":1049},"@amxts\u002Fconfig-core",[177,1154,1052],{"style":979},[177,1156,1157],{"style":979},",",[177,1159,1046],{"style":979},[177,1161,1162],{"style":1049},"@amxts\u002Fmenu-core",[177,1164,1052],{"style":979},[177,1166,1167],{"style":995},"]",[177,1169,1157],{"style":979},[177,1171,1172,1175,1177,1179,1182,1184,1186,1189,1191],{"class":179},[177,1173,1174],{"style":985},"  menus",[177,1176,1114],{"style":979},[177,1178,980],{"style":979},[177,1180,1181],{"style":985}," file",[177,1183,1114],{"style":979},[177,1185,1046],{"style":979},[177,1187,1188],{"style":1049},"myserver\u002Fmenu",[177,1190,1052],{"style":979},[177,1192,1193],{"style":979}," },",[177,1195,1196,1198,1200],{"class":179},[177,1197,1104],{"style":979},[177,1199,852],{"style":995},[177,1201,1005],{"style":979},[177,1203,1134],{"class":198},[177,1205,1206],{"class":191},"{\n",[177,1208,1210,1214,1253,1255],{"class":179,"line":1209},3,[177,1211,1213],{"class":1212},"swJcz","    ",[177,1215,1216],{"class":1212},[942,1217,1218,1220],{"class":944,"popper-class":945,"theme":946},[177,1219,909],{},[951,1221,1222],{"v-slot:popper":953},[177,1223,1224,1244],{"class":956,"v-pre":173},[150,1225,1226],{"class":959},[167,1227,1228],{"class":962,"style":963,"tabindex":964},[150,1229,1230],{},[177,1231,1232,1234,1236,1238,1240,1242],{"class":179},[177,1233,909],{"style":985},[177,1235,989],{"style":979},[177,1237,992],{"style":975},[177,1239,996],{"style":995},[177,1241,999],{"style":979},[177,1243,1002],{"style":975},[1106,1245,1246],{"class":1108},[147,1247,1248,1249,1252],{},"Пакеты модулей проекта по имени, например ",[150,1250,1251],{},"\"@amxts\u002Fmenu-core\"",". Сборка загружает каждый после тех, от которых он зависит.",[177,1254,1114],{"class":191},[177,1256,1257],{"class":198}," [\n",[177,1259,1261,1264,1266,1268],{"class":179,"line":1260},4,[177,1262,1263],{"class":191},"        \"",[177,1265,1162],{"class":187},[177,1267,1052],{"class":191},[177,1269,1270],{"class":191},",\n",[177,1272,1274,1276,1278,1280,1282],{"class":179,"line":1273},5,[177,1275,1263],{"class":191},[177,1277,1152],{"class":187},[177,1279,1052],{"class":191},[177,1281,1157],{"class":191},[177,1283,1284],{"class":923}," \u002F\u002F needed by menu-core\n",[177,1286,1288,1291],{"class":179,"line":1287},6,[177,1289,1290],{"class":198},"    ]",[177,1292,1270],{"class":191},[177,1294,1296,1298,1365,1367,1369,1371,1373],{"class":179,"line":1295},7,[177,1297,1213],{"class":1212},[177,1299,1300],{"class":1212},[942,1301,1302,1305],{"class":944,"popper-class":945,"theme":946},[177,1303,1304],{},"target",[951,1306,1307],{"v-slot:popper":953},[177,1308,1309,1339],{"class":956,"v-pre":173},[150,1310,1311],{"class":959},[167,1312,1313],{"class":962,"style":963,"tabindex":964},[150,1314,1315],{},[177,1316,1317,1319,1321,1323,1325,1327,1329,1331,1333,1335,1337],{"class":179},[177,1318,1304],{"style":985},[177,1320,989],{"style":979},[177,1322,1046],{"style":979},[177,1324,826],{"style":1049},[177,1326,1052],{"style":979},[177,1328,1017],{"style":979},[177,1330,1046],{"style":979},[177,1332,830],{"style":1049},[177,1334,1052],{"style":979},[177,1336,1017],{"style":979},[177,1338,1002],{"style":975},[1106,1340,1341],{"class":1108},[147,1342,1343,1344,1347,1348,1351,1352,1354,1355,1357,1358,1360,1361,1364],{},"Для какого сервера проект, одно из ",[150,1345,1346],{},"\"rehlds\""," (ReHLDS, ReGameDLL и ReAPI)\nили ",[150,1349,1350],{},"\"hlds\""," (обычный HLDS); по умолчанию ",[150,1353,1346],{},". Без сервера (",[150,1356,809],{},")\nкоманда ",[150,1359,152],{}," скачивает include такого сервера в ",[150,1362,1363],{},".amxts\u002Finclude","; с\nсервером сборка берёт его собственные.",[177,1366,1114],{"class":191},[177,1368,1046],{"class":191},[177,1370,826],{"class":187},[177,1372,1052],{"class":191},[177,1374,1270],{"class":191},[177,1376,1378,1380,1382],{"class":179,"line":1377},8,[177,1379,1104],{"class":191},[177,1381,852],{"class":198},[177,1383,1384],{"class":191},";\n",[147,1386,1387],{},"Проект получается такой:",[167,1389,1392],{"className":1390,"code":1391,"language":300},[298],"my-server\u002F\n├── package.json        скрипты: dev, build, typecheck, test, lint\n├── amxts.config.ts     выбранные модули и те, что им нужны\n├── tsconfig.json       { \"extends\": \".\u002F.amxts\u002Ftsconfig.json\" }\n├── .oxlintrc.json      правила линтера: @antfu\u002Feslint-config, для oxlint\n├── .oxfmtrc.json       oxfmt, для файлов JSON и YAML\n├── knip.json           точки входа для knip: плагины, конфиг, тесты\n├── .env                AMXTS_SERVER, если папка сервера указана; AMXTS_SERVER_OS\n├── pnpm-workspace.yaml с pnpm: скрипт установки bun не нужен\n├── .gitignore\n├── .gitattributes      LF для файлов, которые форматирует oxfmt\n├── .vscode\u002F            настройки и рекомендуемые расширения\n├── README.md\n├── plugins\u002F\n│   └── hello.ts        плагин, который пользуется выбранными модулями\n└── test\u002F\n    ├── hello.test.ts   его тесты на поддельном сервере\n    └── tsconfig.json   свой у тестов: типы Bun, а не плагинов\n",[150,1393,1391],{"__ignoreMap":173},[1395,1396,1398],"h3",{"id":1397},"include-сервера","Include сервера",[147,1400,1401,1402,1406,1407,1410],{},"Там, где плагину нужен Pawn-include, — ",[340,1403,1405],{"href":1404},"\u002Fru\u002Fdocs\u002Fpawn\u002Fnatives#%D1%81%D0%B2%D0%BE%D0%B9-%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82-%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-include-include","include, который он реализует",",\nнативы или форварды Pawn-плагина, Pawn-тест — сборка ищет сначала в\n",[150,1408,1409],{},"includes\u002F"," проекта, потом среди include сервера, потом среди тех, что идут\nс amxts (там и собственные include AMX Mod X). Include сервера — это:",[1412,1413,1414,1425],"ul",{},[1415,1416,1417,1418,1420,1421,1424],"li",{},"с ",[150,1419,809],{}," — собственная ",[150,1422,1423],{},"addons\u002Famxmodx\u002Fscripting\u002Finclude","\nсервера, ровно то, что на нём стоит;",[1415,1426,1427,1428,1430,1431,1433,1434,1436,1437,1439,1440,1442],{},"без сервера — include того сервера, который называет ",[150,1429,1304],{}," в\n",[150,1432,396],{},": для ",[150,1435,1346],{}," — ReHLDS, ReGameDLL и ReAPI, по\nумолчанию — amxts скачивает include ReAPI в ",[150,1438,1363],{},", из того\nвыпуска, из которого сделан его API; ",[150,1441,1350],{}," — обычному HLDS — ничего,\nкроме собственных include AMX Mod X, не нужно.",[167,1444,1446],{"className":913,"code":1445,"language":915,"meta":916,"style":173},"import { hostIndex, handled, floatCell, rounded, cellFloat, ret, publicFor, nativeFn, arg, argText, argc, caller, setArg, setArgText, argString, cellsToString, stringToCells, cells, out, text, arrayOf, cell, putCell, noOrigin, hasModule, readText, playerIds, accessOf, paint, print, cmd, cmdWide, setTimeout, sleep, setInterval, clearTimeout, clearInterval, hook, plugin, defineModule, callingPlugin, onPluginStop, createCellArray, destroyCellArray, cellArrayRows, pushCellArrayRow, cellsText, textCells, menuColors, colorTags, showMenu, Handler, WideHandler, Float, CellArray, CellBuffer, TEXT_MAX, Team, AuthType, WeaponName, ItemName, ModuleName, KillOptions, MoveOptions, Client, Player, CommandOptions, CommandInfo, HudOptions, HudEffect, HudLine, FadeDirection, FadeOptions, ShakeOptions, ProgressBarOptions, StatusIconState, Screen, SoundChannel, SoundOptions, Resource, MessageArgs, ClientMessage, PlayerChangeEvent, ServerListenerOptions, CvarChangeEvent, CvarListener, Cvar, Server, server, Game, GameListenerOptions, UseType, ActionOptions, TouchEvent, RoundWinner, EndRoundOptions, game, Variant, VariantName, Flag, Entity, Weapon, WeaponKind, weaponKindOf, RenderMode, RenderFx, MoveType, Solid, TakeDamage, DeadFlag, WaterLevel, Contents, FixAngle, HitGroup, ArmorType, ObserverMode, JoinState, GameMenu, PlayerModel, IgnoredChat, ThrowDirection, BloodColor, MusicState, Target, swapTeam, lang, cvar, TimerHandler, SleepOptions, Call, Ref, PluginInfo, ModuleOptions, ForwardStop, NoArgument, Forward, Storage, EntityFilter, PawnFunction, PawnCall, MenuColor, MenuOptions, MenuContext, MenuItemOptions, Menu, protocolMessageNames, addServerListener, removeServerListener, PluginInitEvent, PluginPauseEvent, PluginUnpauseEvent, ServerChangelevelEvent, PluginCfgEvent, PluginEndEvent, PluginLogEvent, PluginPrecacheEvent, ClientInfochangedEvent, ClientConnectEvent, ClientConnectexEvent, ClientAuthorizedEvent, ClientDisconnectedEvent, ClientRemoveEvent, ClientCommandEvent, ClientPutinserverEvent, InconsistentFileEvent, PluginModulesEvent, OnConfigsExecutedEvent, OnAutoConfigsBufferedEvent, CS_InternalCommandEvent, CS_OnBuyAttemptEvent, CS_OnBuyEvent, ServerFrameEvent, ClientKillEvent, ClientImpulseEvent, ClientCmdStartEvent, PfnThinkEvent, PfnPlaybackeventEvent, PfnKeyvalueEvent, PfnSpawnEvent, ADStopMessage, AllowSpecMessage, AmmoPickupMessage, AmmoXMessage, ArmorTypeMessage, BarTimeMessage, BatteryMessage, BlinkAcctMessage, BombDropMessage, BombPickupMessage, BotVoiceMessage, BuyCloseMessage, ClCorpseMessage, CrosshairMessage, CurWeaponMessage, DamageMessage, DeathMsgMessage, FlashlightMessage, FlashBatMessage, GeigerMessage, HealthMessage, HideWeaponMessage, HostageKMessage, HostagePosMessage, HudTextMessage, InitHUDMessage, ItemPickupMessage, ItemStatusMessage, LocationMessage, MoneyMessage, MOTDMessage, NVGToggleMessage, RadarMessage, ReqStateMessage, ResetHUDMessage, RoundTimeMessage, SayTextMessage, ScenarioMessage, ScoreAttribMessage, ScoreInfoMessage, ScreenFadeMessage, ScreenShakeMessage, SendAudioMessage, ServerNameMessage, SetFOVMessage, ShowMenuMessage, ShowTimerMessage, SpecHealthMessage, SpectatorMessage, StatusIconMessage, StatusTextMessage, StatusValueMessage, TaskTimeMessage, TeamInfoMessage, TeamScoreMessage, TextMsgMessage, TrainMessage, TutorCloseMessage, VGUIMenuMessage, ViewModeMessage, WeaponListMessage, WeapPickupMessage, ServerEventMap, ServerMessageMap, flagList, FlagFamily, FlagStore, EntvarFlags, MemberFlags, FlagList, HideHud, HIDE_HUD, Button, BUTTON, Effect, EFFECT, EntityFlag, ENTITY_FLAG, Damage, DAMAGE, Access, ACCESS, ScoreStatus, SCORE_STATUS, WeaponState, WEAPON_STATE, PhysicsFlag, PHYSICS_FLAG, addGameListener, removeGameListener, HookEvent, HookEntry, RewardReason, ResourceType, TeamChoice, ItemKind, ItemRestriction, BotEvent, RoundEndReason, DeathMessageFlag, KillRarity, PlayerAnimation, VguiMenu, ActivateEvent, ActivateServerEvent, AddFragsEvent, AddItemEvent, AddMoneyEvent, AddMultiDamageEvent, AddResourceEvent, AddTeamScoreEvent, AddToPlayerEvent, AddWeaponEvent, AirAccelerateEvent, AirMoveEvent, ApplyMultiDamageEvent, AttachToPlayerEvent, AutoaimVectorEvent, BalanceTeamsEvent, BecomeBomberEvent, BecomeDeadEvent, BecomeProneEvent, BecomeVipEvent, BestVisibleEnemyEvent, BlindEvent, BlockedEvent, BloodColorEvent, BodyTargetEvent, BounceGibTouchEvent, BuyAmmoEvent, BuyItemEvent, BuyWeaponEvent, CanDeployEvent, CanDropEvent, CanHaveItemEvent, CanHolsterEvent, CanPlayerHearPlayerEvent, CanRespawnEvent, CanShootThroughEvent, CanSpectateEvent, CanSwitchTeamEvent, CanTakeDamageEvent, CenterEvent, ChangeLevelEvent, ChangeModelEvent, ChangeNameEvent, ChangeYawEvent, ChatMessageEvent, CheckMapConditionsEvent, CheckTimeBasedDamageEvent, CheckUserInfoEvent, CheckWaterJumpEvent, CheckWinConditionsEvent, ChildDeathNoticeEvent, ChooseAppearanceEvent, ChooseTeamEvent, ClassifyEvent, ClearMultiDamageEvent, ClientConnectedEvent, ConnectClientEvent, ConsoleMessageEvent, CreateWeaponBoxEvent, DamageDecalEvent, DeathActivityEvent, DeathNoticeEvent, DeathSoundEvent, DefaultDeployEvent, DefaultReloadEvent, DefaultShotgunReloadEvent, DefuseBombEndEvent, DefuseBombStartEvent, DelayEvent, DeployEvent, DisappearEvent, DisconnectClientEvent, DropEvent, DropIdlePlayerEvent, DropPlayerItemEvent, DropShieldEvent, DropWeaponsOnDeathEvent, DuckEvent, DuckMovementEvent, EarPositionEvent, ExplodeBombEvent, ExplodeFlashbangEvent, ExplodeHeGrenadeEvent, ExplodeSmokeGrenadeEvent, ExtractAmmoEvent, ExtractClipAmmoEvent, EyePositionEvent, FadeMonsterEvent, FallDamageEvent, FireBulletsEvent, GameEventEvent, GameThinkEvent, GetForceCameraEvent, GetIntoGameEvent, GetNextBestWeaponEvent, GibMonsterEvent, GibSpawnEvent, GiveAmmoEvent, GiveBombEvent, GiveDefaultItemsEvent, GiveItemEvent, GiveShieldEvent, GunPositionEvent, HasAlienGibsEvent, HasHumanGibsEvent, HasTargetEvent, HealEvent, HintMessageEvent, HolsterEvent, IlluminationEvent, ImpulseEvent, IntermissionEvent, InViewConeEvent, IsAliveEvent, IsBotEvent, IsBspModelEvent, IsInWorldEvent, IsMovingEvent, IsNetClientEvent, IsPlayerEvent, IsSneakingEvent, IsTriggeredEvent, IsUsableEvent, IsWeaponEvent, ItemPostFrameEvent, ItemPreFrameEvent, ItemRestrictedEvent, ItemSlotEvent, ItemUpdateClientDataEvent, JoiningThinkEvent, JumpEvent, JumpMovementEvent, KillEvent, KilledEvent, LadderMoveEvent, LookEvent, MapResetEvent, MaxSpeedEvent, MonsterInitDeadEvent, MoveEvent, NewRoundEvent, NextTargetEvent, ObserverSetModeEvent, ObserverThinkEvent, PainEvent, PainSoundEvent, PlantBombEvent, PlayEmptySoundEvent, PlayerBlindEvent, PlayerDeathThinkEvent, PlayerGotWeaponEvent, PlayerKilledEvent, PlayerSpawnEvent, PlayStepSoundEvent, PointInViewConeEvent, PointVisibleEvent, PostThinkEvent, PrecacheEvent, PrecacheFileEvent, PrecacheModelEvent, PrecacheSoundEvent, PreThinkEvent, PrimaryAmmoIndexEvent, PrimaryAttackEvent, PrintfEvent, RadioEvent, RecoilEvent, ReflectGaussEvent, RelationshipEvent, ReloadEvent, RemoveAllItemsEvent, RemoveGunsEvent, RemoveItemEvent, RemoveSpawnProtectionEvent, ResetEmptySoundEvent, ResetMaxSpeedEvent, ResetSequenceInfoEvent, RespawnEvent, RestartEvent, RetireWeaponEvent, RoundEndEvent, RoundRespawnEvent, RoundStartEvent, SecondaryAmmoIndexEvent, SecondaryAttackEvent, SelectSpawnPointEvent, SendDeathMessageEvent, SendWeaponAnimEvent, ServerCommandEvent, ServerDeactivateEvent, SetAnimationEvent, SetModelEvent, SetObjectCollisionBoxEvent, SetSpawnProtectionEvent, SetToggleStateEvent, ShootEvent, ShootBuckshotEvent, ShouldFadeOnDeathEvent, ShouldSwitchWeaponEvent, ShouldWeaponIdleEvent, ShowMenuEvent, ShowVguiMenuEvent, SpawnEvent, SpawnEquipEvent, SpawnHeadGibEvent, SpawnRandomGibsEvent, SpawnSpotEvent, SpectateNextEvent, StartDeathCamEvent, StartSneakingEvent, StartSoundEvent, StartSpectatingEvent, StopSneakingEvent, SwitchTeamEvent, TakeDamageEvent, TakeDamageImpulseEvent, TeamFullEvent, TeamIdEvent, TeamStackedEvent, ThinkEvent, ThrowFlashbangEvent, ThrowGrenadeEvent, ThrowHeGrenadeEvent, ThrowSmokeGrenadeEvent, ToggleStateEvent, TouchingWeaponEvent, TraceAttackEvent, TraceBleedEvent, TraceLineEvent, UnDuckEvent, UpdateClientDataEvent, UpdateItemInfoEvent, UpdateStatusBarEvent, UseEvent, UseEmptyEvent, UserInfoChangeEvent, VisibleEvent, WaitTillLandEvent, WaterJumpEvent, WeaponIdleEvent, GameEventMap, GameAnswerMap, Vector, EffectRecipients, PointEffectOptions, SegmentEffectOptions, EntityEffectOptions, PlayerEffectOptions, BeamPointsOptions, BeamEntityPointOptions, BeamEntitiesOptions, BeamCircleOptions, BeamFollowOptions, BeamSpriteOptions, LightningOptions, ExplosionOptions, SmokeOptions, ParticleExplosionOptions, ImplosionOptions, SpriteTrailOptions, SpriteOptions, GlowSpriteOptions, StreakSplashOptions, DynamicLightOptions, EntityLightOptions, LineOptions, BoxOptions, LargeFunnelOptions, BloodOptions, FizzOptions, BounceSound, ModelOptions, ExplodeModelOptions, BreakMaterial, BreakModelOptions, SpriteSprayOptions, ArmorRicochetOptions, BubblesOptions, BloodSpriteOptions, ProjectileOptions, SprayOptions, PlayerSpritesOptions, ParticleBurstOptions, FireRise, FireBlend, FireFieldOptions, PlayerAttachmentOptions, effects, request, fetch, useFetch, URL, URLSearchParams, Headers, TlsOptions, RequestInit, Request, ResponseInit, Response, RequestErrorKind, RequestOptions, RequestResult, UseFetchOptions, FetchResult, FetchError } from \"~\u002Ffacade\";\n\u002F\u002F ---cut---\n\u002F\u002F amxts.config.ts\nexport default defineConfig({\n    modules: [],\n    target: \"hlds\",\n});\n",[150,1447,1448,1452,1670,1717,1787],{"__ignoreMap":173},[177,1449,1450],{"class":179,"line":180},[177,1451,924],{"class":923},[177,1453,1454,1456,1458,1460,1666,1668],{"class":179,"line":927},[177,1455,931],{"class":930},[177,1457,934],{"class":930},[177,1459,938],{"class":937},[177,1461,1462],{"class":937},[942,1463,1464,1466],{"class":944,"popper-class":945,"theme":946},[177,1465,949],{},[951,1467,1468],{"v-slot:popper":953},[177,1469,1470,1588],{"class":956,"v-pre":173},[150,1471,1472],{"class":959},[167,1473,1474],{"class":962,"style":963,"tabindex":964},[150,1475,1476,1484,1500,1514,1528,1554,1568,1584],{},[177,1477,1478,1480,1482],{"class":179},[177,1479,972],{"style":971},[177,1481,976],{"style":975},[177,1483,980],{"style":979},[177,1485,1486,1488,1490,1492,1494,1496,1498],{"class":179},[177,1487,986],{"style":985},[177,1489,989],{"style":979},[177,1491,992],{"style":975},[177,1493,996],{"style":995},[177,1495,999],{"style":979},[177,1497,1002],{"style":975},[177,1499,1005],{"style":979},[177,1501,1502,1504,1506,1508,1510,1512],{"class":179},[177,1503,1010],{"style":985},[177,1505,989],{"style":979},[177,1507,992],{"style":975},[177,1509,1017],{"style":979},[177,1511,1002],{"style":975},[177,1513,1005],{"style":979},[177,1515,1516,1518,1520,1522,1524,1526],{"class":179},[177,1517,1026],{"style":985},[177,1519,989],{"style":979},[177,1521,992],{"style":975},[177,1523,1017],{"style":979},[177,1525,1002],{"style":975},[177,1527,1005],{"style":979},[177,1529,1530,1532,1534,1536,1538,1540,1542,1544,1546,1548,1550,1552],{"class":179},[177,1531,1041],{"style":985},[177,1533,989],{"style":979},[177,1535,1046],{"style":979},[177,1537,830],{"style":1049},[177,1539,1052],{"style":979},[177,1541,1017],{"style":979},[177,1543,1046],{"style":979},[177,1545,826],{"style":1049},[177,1547,1052],{"style":979},[177,1549,1017],{"style":979},[177,1551,1002],{"style":975},[177,1553,1005],{"style":979},[177,1555,1556,1558,1560,1562,1564,1566],{"class":179},[177,1557,1071],{"style":985},[177,1559,989],{"style":979},[177,1561,1076],{"style":975},[177,1563,1017],{"style":979},[177,1565,1002],{"style":975},[177,1567,1005],{"style":979},[177,1569,1570,1572,1574,1576,1578,1580,1582],{"class":179},[177,1571,1087],{"style":985},[177,1573,989],{"style":979},[177,1575,992],{"style":975},[177,1577,996],{"style":995},[177,1579,999],{"style":979},[177,1581,1002],{"style":975},[177,1583,1005],{"style":979},[177,1585,1586],{"class":179},[177,1587,1104],{"style":979},[1106,1589,1590,1594],{"class":1108},[147,1591,1111,1592,1114],{},[150,1593,396],{},[150,1595,1596],{},[167,1597,1598],{"class":962,"style":963,"tabindex":964},[150,1599,1600,1612,1638,1658],{},[177,1601,1602,1604,1606,1608,1610],{"class":179},[177,1603,931],{"style":1125},[177,1605,934],{"style":1125},[177,1607,1131],{"style":1130},[177,1609,1134],{"style":995},[177,1611,1137],{"style":979},[177,1613,1614,1616,1618,1620,1622,1624,1626,1628,1630,1632,1634,1636],{"class":179},[177,1615,1142],{"style":985},[177,1617,1114],{"style":979},[177,1619,1147],{"style":995},[177,1621,1052],{"style":979},[177,1623,1152],{"style":1049},[177,1625,1052],{"style":979},[177,1627,1157],{"style":979},[177,1629,1046],{"style":979},[177,1631,1162],{"style":1049},[177,1633,1052],{"style":979},[177,1635,1167],{"style":995},[177,1637,1157],{"style":979},[177,1639,1640,1642,1644,1646,1648,1650,1652,1654,1656],{"class":179},[177,1641,1174],{"style":985},[177,1643,1114],{"style":979},[177,1645,980],{"style":979},[177,1647,1181],{"style":985},[177,1649,1114],{"style":979},[177,1651,1046],{"style":979},[177,1653,1188],{"style":1049},[177,1655,1052],{"style":979},[177,1657,1193],{"style":979},[177,1659,1660,1662,1664],{"class":179},[177,1661,1104],{"style":979},[177,1663,852],{"style":995},[177,1665,1005],{"style":979},[177,1667,1134],{"class":198},[177,1669,1206],{"class":191},[177,1671,1672,1674,1710,1712,1715],{"class":179,"line":1209},[177,1673,1213],{"class":1212},[177,1675,1676],{"class":1212},[942,1677,1678,1680],{"class":944,"popper-class":945,"theme":946},[177,1679,909],{},[951,1681,1682],{"v-slot:popper":953},[177,1683,1684,1704],{"class":956,"v-pre":173},[150,1685,1686],{"class":959},[167,1687,1688],{"class":962,"style":963,"tabindex":964},[150,1689,1690],{},[177,1691,1692,1694,1696,1698,1700,1702],{"class":179},[177,1693,909],{"style":985},[177,1695,989],{"style":979},[177,1697,992],{"style":975},[177,1699,996],{"style":995},[177,1701,999],{"style":979},[177,1703,1002],{"style":975},[1106,1705,1706],{"class":1108},[147,1707,1248,1708,1252],{},[150,1709,1251],{},[177,1711,1114],{"class":191},[177,1713,1714],{"class":198}," []",[177,1716,1270],{"class":191},[177,1718,1719,1721,1777,1779,1781,1783,1785],{"class":179,"line":1260},[177,1720,1213],{"class":1212},[177,1722,1723],{"class":1212},[942,1724,1725,1727],{"class":944,"popper-class":945,"theme":946},[177,1726,1304],{},[951,1728,1729],{"v-slot:popper":953},[177,1730,1731,1761],{"class":956,"v-pre":173},[150,1732,1733],{"class":959},[167,1734,1735],{"class":962,"style":963,"tabindex":964},[150,1736,1737],{},[177,1738,1739,1741,1743,1745,1747,1749,1751,1753,1755,1757,1759],{"class":179},[177,1740,1304],{"style":985},[177,1742,989],{"style":979},[177,1744,1046],{"style":979},[177,1746,830],{"style":1049},[177,1748,1052],{"style":979},[177,1750,1017],{"style":979},[177,1752,1046],{"style":979},[177,1754,826],{"style":1049},[177,1756,1052],{"style":979},[177,1758,1017],{"style":979},[177,1760,1002],{"style":975},[1106,1762,1763],{"class":1108},[147,1764,1343,1765,1347,1767,1351,1769,1354,1771,1357,1773,1360,1775,1364],{},[150,1766,1346],{},[150,1768,1350],{},[150,1770,1346],{},[150,1772,809],{},[150,1774,152],{},[150,1776,1363],{},[177,1778,1114],{"class":191},[177,1780,1046],{"class":191},[177,1782,830],{"class":187},[177,1784,1052],{"class":191},[177,1786,1270],{"class":191},[177,1788,1789,1791,1793],{"class":179,"line":1273},[177,1790,1104],{"class":191},[177,1792,852],{"class":198},[177,1794,1384],{"class":191},[147,1796,1797,1799,1800,1803,1804,1806],{},[150,1798,283],{}," спрашивает target, когда сервера нет или в его папке нет include;\n",[150,1801,1802],{},"--target"," отвечает на вопрос. ",[150,1805,453],{}," — после каждой установки — и каждая\nсборка скачивают include, если их ещё нет.",[1808,1809,1810],"warning",{},[147,1811,1812,1813,1816,1817,1819],{},"Без сети include не скачать: команда говорит об этом и идёт дальше, а\nсборка останавливается, только если плагин называет include, которого нет.\nПодключитесь и запустите ",[150,1814,1815],{},"npx amxts prepare"," или укажите в ",[150,1818,809],{},"\nсервер с его include.",[147,1821,1822,1825,1826,1829,1830,1833],{},[150,1823,1824],{},"lint"," проверяет код oxlint'ом по правилам @antfu\u002Feslint-config, а файлы\nJSON и YAML — oxfmt; ",[150,1827,1828],{},"lint:fix"," исправляет, что может, — TypeScript\nформатируют эти же правила. В VS Code то же при наборе и сохранении делает\nрасширение oxc, которое советует ",[150,1831,1832],{},".vscode\u002Fextensions.json",".",[1395,1835,1837],{"id":1836},"пакет-модуля","Пакет модуля",[147,1839,1840,1841,1843,1844,1114],{},"С ",[150,1842,350],{}," создаётся пакет модуля — работающий модуль с проектом-песочницей\nи тестом, — см. ",[340,1845,1846],{"href":121},"свой модуль",[163,1848,1849,1911,1970,2029],{"sync":165},[167,1850,1852],{"className":169,"code":1851,"filename":171,"language":172,"meta":173,"style":173},"npx amxts init --module @you\u002Fgreeter               # .\u002Fgreeter\nnpx amxts init --module @you\u002Fgreeter --natives     # с нативами для Pawn-плагинов\nnpx amxts init --module greeter --dir my-greeter   # в .\u002Fmy-greeter\n",[150,1853,1854,1871,1889],{"__ignoreMap":173},[177,1855,1856,1858,1860,1862,1865,1868],{"class":179,"line":180},[177,1857,184],{"class":183},[177,1859,188],{"class":187},[177,1861,600],{"class":187},[177,1863,1864],{"class":187}," --module",[177,1866,1867],{"class":187}," @you\u002Fgreeter",[177,1869,1870],{"class":923},"               # .\u002Fgreeter\n",[177,1872,1873,1875,1877,1879,1881,1883,1886],{"class":179,"line":927},[177,1874,184],{"class":183},[177,1876,188],{"class":187},[177,1878,600],{"class":187},[177,1880,1864],{"class":187},[177,1882,1867],{"class":187},[177,1884,1885],{"class":187}," --natives",[177,1887,1888],{"class":923},"     # с нативами для Pawn-плагинов\n",[177,1890,1891,1893,1895,1897,1899,1902,1905,1908],{"class":179,"line":1209},[177,1892,184],{"class":183},[177,1894,188],{"class":187},[177,1896,600],{"class":187},[177,1898,1864],{"class":187},[177,1900,1901],{"class":187}," greeter",[177,1903,1904],{"class":187}," --dir",[177,1906,1907],{"class":187}," my-greeter",[177,1909,1910],{"class":923},"   # в .\u002Fmy-greeter\n",[167,1912,1914],{"className":169,"code":1913,"filename":206,"language":172,"meta":173,"style":173},"pnpm dlx amxts init --module @you\u002Fgreeter               # .\u002Fgreeter\npnpm dlx amxts init --module @you\u002Fgreeter --natives     # с нативами для Pawn-плагинов\npnpm dlx amxts init --module greeter --dir my-greeter   # в .\u002Fmy-greeter\n",[150,1915,1916,1932,1950],{"__ignoreMap":173},[177,1917,1918,1920,1922,1924,1926,1928,1930],{"class":179,"line":180},[177,1919,206],{"class":183},[177,1921,633],{"class":187},[177,1923,188],{"class":187},[177,1925,600],{"class":187},[177,1927,1864],{"class":187},[177,1929,1867],{"class":187},[177,1931,1870],{"class":923},[177,1933,1934,1936,1938,1940,1942,1944,1946,1948],{"class":179,"line":927},[177,1935,206],{"class":183},[177,1937,633],{"class":187},[177,1939,188],{"class":187},[177,1941,600],{"class":187},[177,1943,1864],{"class":187},[177,1945,1867],{"class":187},[177,1947,1885],{"class":187},[177,1949,1888],{"class":923},[177,1951,1952,1954,1956,1958,1960,1962,1964,1966,1968],{"class":179,"line":1209},[177,1953,206],{"class":183},[177,1955,633],{"class":187},[177,1957,188],{"class":187},[177,1959,600],{"class":187},[177,1961,1864],{"class":187},[177,1963,1901],{"class":187},[177,1965,1904],{"class":187},[177,1967,1907],{"class":187},[177,1969,1910],{"class":923},[167,1971,1973],{"className":169,"code":1972,"filename":226,"language":172,"meta":173,"style":173},"yarn dlx amxts init --module @you\u002Fgreeter               # .\u002Fgreeter\nyarn dlx amxts init --module @you\u002Fgreeter --natives     # с нативами для Pawn-плагинов\nyarn dlx amxts init --module greeter --dir my-greeter   # в .\u002Fmy-greeter\n",[150,1974,1975,1991,2009],{"__ignoreMap":173},[177,1976,1977,1979,1981,1983,1985,1987,1989],{"class":179,"line":180},[177,1978,226],{"class":183},[177,1980,633],{"class":187},[177,1982,188],{"class":187},[177,1984,600],{"class":187},[177,1986,1864],{"class":187},[177,1988,1867],{"class":187},[177,1990,1870],{"class":923},[177,1992,1993,1995,1997,1999,2001,2003,2005,2007],{"class":179,"line":927},[177,1994,226],{"class":183},[177,1996,633],{"class":187},[177,1998,188],{"class":187},[177,2000,600],{"class":187},[177,2002,1864],{"class":187},[177,2004,1867],{"class":187},[177,2006,1885],{"class":187},[177,2008,1888],{"class":923},[177,2010,2011,2013,2015,2017,2019,2021,2023,2025,2027],{"class":179,"line":1209},[177,2012,226],{"class":183},[177,2014,633],{"class":187},[177,2016,188],{"class":187},[177,2018,600],{"class":187},[177,2020,1864],{"class":187},[177,2022,1901],{"class":187},[177,2024,1904],{"class":187},[177,2026,1907],{"class":187},[177,2028,1910],{"class":923},[167,2030,2032],{"className":169,"code":2031,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts init --module @you\u002Fgreeter               # .\u002Fgreeter\nbunx amxts init --module @you\u002Fgreeter --natives     # с нативами для Pawn-плагинов\nbunx amxts init --module greeter --dir my-greeter   # в .\u002Fmy-greeter\n",[150,2033,2034,2048,2064],{"__ignoreMap":173},[177,2035,2036,2038,2040,2042,2044,2046],{"class":179,"line":180},[177,2037,253],{"class":183},[177,2039,188],{"class":187},[177,2041,600],{"class":187},[177,2043,1864],{"class":187},[177,2045,1867],{"class":187},[177,2047,1870],{"class":923},[177,2049,2050,2052,2054,2056,2058,2060,2062],{"class":179,"line":927},[177,2051,253],{"class":183},[177,2053,188],{"class":187},[177,2055,600],{"class":187},[177,2057,1864],{"class":187},[177,2059,1867],{"class":187},[177,2061,1885],{"class":187},[177,2063,1888],{"class":923},[177,2065,2066,2068,2070,2072,2074,2076,2078,2080],{"class":179,"line":1209},[177,2067,253],{"class":183},[177,2069,188],{"class":187},[177,2071,600],{"class":187},[177,2073,1864],{"class":187},[177,2075,1901],{"class":187},[177,2077,1904],{"class":187},[177,2079,1907],{"class":187},[177,2081,1910],{"class":923},[311,2083,361],{"id":361},[163,2085,2086,2100,2113,2126],{"sync":165},[167,2087,2089],{"className":169,"code":2088,"filename":171,"language":172,"meta":173,"style":173},"npx amxts dev\n",[150,2090,2091],{"__ignoreMap":173},[177,2092,2093,2095,2097],{"class":179,"line":180},[177,2094,184],{"class":183},[177,2096,188],{"class":187},[177,2098,2099],{"class":187}," dev\n",[167,2101,2103],{"className":169,"code":2102,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts dev\n",[150,2104,2105],{"__ignoreMap":173},[177,2106,2107,2109,2111],{"class":179,"line":180},[177,2108,206],{"class":183},[177,2110,188],{"class":187},[177,2112,2099],{"class":187},[167,2114,2116],{"className":169,"code":2115,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts dev\n",[150,2117,2118],{"__ignoreMap":173},[177,2119,2120,2122,2124],{"class":179,"line":180},[177,2121,226],{"class":183},[177,2123,188],{"class":187},[177,2125,2099],{"class":187},[167,2127,2129],{"className":169,"code":2128,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts dev\n",[150,2130,2131],{"__ignoreMap":173},[177,2132,2133,2135,2137],{"class":179,"line":180},[177,2134,253],{"class":183},[177,2136,188],{"class":187},[177,2138,2099],{"class":187},[147,2140,2141,2142,2144],{},"Собирает все плагины и модули, копирует их на сервер из ",[150,2143,809],{},",\nперезагружает его, а потом следит за папкой плагинов и модулями проекта:\nсохранение пересобирает плагины, которые импортируют сохранённый файл.",[167,2146,2149],{"className":2147,"code":2148,"language":300},[298],"amxts 0.2.0 · dev\n\n  Core      @amxts\u002Fcore 0.2.0\n  Modules   menu-core 0.2.0 · config-core 0.1.1\n  Server    D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts · Windows · ReHLDS · running\n  Plugins   1 in plugins\u002F\n\n✔ hello · 6.2s\n✔ 14:02:11 deployed, the server reloaded config-core, menu-core, hello (7.1s)\n◇ watching plugins - save a plugin and it goes to the server (Ctrl+C stops)\n✔ hello · 4.1s\n✔ 14:03:40 plugins\u002Fhello.ts changed: deployed, the server reloaded hello (4.2s)\n",[150,2150,2148],{"__ignoreMap":173},[147,2152,2153,2154,2157,2158,2161,2162,2165],{},"Сначала — с чем она работает: ядро и модули с версиями — модуль, которым не пользуется ни\nодин плагин, — так и говорит (",[150,2155,2156],{},"no plugin uses it","), модуль из папки на этой\nмашине, а не из npm, — ",[150,2159,2160],{},"local","; затем сервер — его папка, система\n(",[340,2163,2164],{"href":850},"ниже","), ReHLDS или обычный HLDS и запущен ли он; и\nсколько плагинов.",[147,2167,2168,2169,2172,2173,2176],{},"Каждый плагин и модуль виден, пока компилируется: ",[150,2170,2171],{},"◇ compiling hello 1\u002F1",",\nпока идёт, ",[150,2174,2175],{},"✔ hello · 6.2s",", когда готов, — в терминале одна строка сменяет\nдругую, в логе (CI) остаются обе. Плагин проходит два компилятора, в\nWebAssembly и затем в машинный код, — на это сборка и тратит время. Поэтому:",[1412,2178,2179,2189,2199],{},[1415,2180,2181,2182,2184,2185,2188],{},"официальные модули приходят из npm уже скомпилированными для Windows и\nLinux, и сборка берёт их как есть, ничего не компилируя. Если проект скомпилировал бы\nмодуль иначе — его настройки заданы в ",[150,2183,396],{},", ядро другой\nверсии, — сборка говорит почему\n(",[150,2186,2187],{},"menu-core 0.2.0 was built for @amxts\u002Fcore 0.2.0, the project has 0.2.1 - compiling it here",")\nи компилирует его, один раз. Плагин, который пользуется модулем, тоже\nкомпилируется по тому, с чем модуль пришёл, а не разбирает модуль сначала\nсам;",[1415,2190,2191,2192,2195,2196,2198],{},"плагин, для которого с прошлой сборки ничего не изменилось — ни его файл,\nни то, что он импортирует, — заново не компилируется: он берётся готовым из ",[150,2193,2194],{},"node_modules\u002F.cache\u002Famxts",". ",[150,2197,361],{},",\nзапущенный снова, выкладывает плагины на сервер за секунды;",[1415,2200,2201,2202,2195,2205,1430,2208,2210,2211,2214,2215,2218,2219,2222],{},"несколько плагинов компилируются сразу, каждый в своём процессе: столько,\nсколько помещается в 3 ГБ памяти — одной компиляции нужен примерно\nгигабайт, — и не больше, чем у машины ядер процессора. В терминале строка\nназывает их все: ",[150,2203,2204],{},"◇ compiling hello, shop 2\u002F3",[150,2206,2207],{},"AMXTS_BUILD_MEMORY",[150,2209,805],{}," или в окружении задаёт память в мегабайтах (",[150,2212,2213],{},"AMXTS_BUILD_MEMORY=6144","),\n",[150,2216,2217],{},"AMXTS_BUILD_JOBS"," — прямо число компиляций (",[150,2220,2221],{},"1"," — по одной). Плагин\nполучается одинаковым в любом случае.",[147,2224,2225],{},"Сохранение пересобирает, только когда в файле что-то изменилось: редактор,\nсохранивший файл без изменений, или менеджер пакетов, заново записавший\nмодуль, — не изменение, — и строка называет файл.",[147,2227,2228,2230,2231,2233,2234,1833],{},[150,2229,361],{}," компилирует на скорость: маленький плагин — за несколько секунд, там\nгде ",[150,2232,374],{}," тратит около десяти. Его плагины делают то же самое, чуть\nмедленнее, — на сервер, где играют, выкладывайте ",[150,2235,2236],{},"npx amxts build --deploy",[147,2238,2239,2241,2242,2244,2245,2248,2249,2251],{},[150,2240,809],{}," — папка ",[150,2243,801],{}," сервера с amxts\n(",[340,2246,2247],{"href":24},"установка на сервер","), в ",[150,2250,805],{}," проекта:",[167,2253,2255],{"className":169,"code":2254,"language":172,"meta":173,"style":173},"AMXTS_SERVER=D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts\n",[150,2256,2257],{"__ignoreMap":173},[177,2258,2259,2261,2264],{"class":179,"line":180},[177,2260,809],{"class":198},[177,2262,2263],{"class":191},"=",[177,2265,2266],{"class":187},"D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts\n",[147,2268,2269,2270,2273,2274,2276,2277,2280,2281,2284,2285,2288],{},"Можно указать и папку самого сервера (",[150,2271,2272],{},"D:\u002Fhlds","), его ",[150,2275,797],{}," или\n",[150,2278,2279],{},"cstrike\u002Faddons",": сборка берёт ",[150,2282,2283],{},"cstrike\u002Faddons\u002Famxts"," внутри неё, а строка\n",[150,2286,2287],{},"Server"," говорит, какая это папка. Папка, которая не подходит ни под один\nвариант, останавливает сборку одной строкой о том, где она искала.",[147,2290,2291,2292,567,2294,2297,2298,2300,2301,2303,2304,2306],{},"Без него ",[150,2293,361],{},[150,2295,2296],{},"build --deploy"," спрашивают папку, как ",[150,2299,283],{},", и\nзаписывают её в ",[150,2302,805],{},". В CI или когда вывод идёт в конвейер ничего не\nспрашивается: сборка останавливается и говорит, что ",[150,2305,809],{}," не задан.",[147,2308,2309,2310,567,2312,2314],{},"Когда модуль сервера из другого выпуска, чем ядро проекта, ",[150,2311,361],{},[150,2313,374],{},"\nсначала говорят об этом — плагины, которые собирает проект, загружаются только\nмодулем его выпуска:",[167,2316,2319],{"className":2317,"code":2318,"language":300},[298],"▲ the server runs amxts 0.1.0, this project 0.2.0 - run amxts upgrade\n",[150,2320,2318],{"__ignoreMap":173},[147,2322,2323,2327],{},[340,2324,2325],{"href":467},[150,2326,470],{}," обновляет и сервер. Выпуск читается из файла модуля, а\nне у запущенного сервера.",[147,2329,2330,2331,2334,2335,2338,2339,2342,2343,2346,2347,2195,2351,2354,2355,1833],{},"Перезагрузка идёт через rcon на ",[150,2332,2333],{},"127.0.0.1:27015"," (другой порт задаёт\n",[150,2336,2337],{},"AMXTS_PORT","), с ",[150,2340,2341],{},"rcon_password"," из ",[150,2344,2345],{},"cstrike\u002Fserver.cfg"," сервера. См.\n",[340,2348,2350],{"href":2349},"\u002Fru\u002Fdocs\u002Fgetting-started\u002Fquick-start#%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B0%D1%8F-%D0%BF%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0","горячую перезагрузку",[150,2352,2353],{},"--os"," — как у ",[150,2356,374],{},[163,2358,2359,2376,2391,2406],{"sync":165},[167,2360,2362],{"className":169,"code":2361,"filename":171,"language":172,"meta":173,"style":173},"npx amxts dev --docker\n",[150,2363,2364],{"__ignoreMap":173},[177,2365,2366,2368,2370,2373],{"class":179,"line":180},[177,2367,184],{"class":183},[177,2369,188],{"class":187},[177,2371,2372],{"class":187}," dev",[177,2374,2375],{"class":187}," --docker\n",[167,2377,2379],{"className":169,"code":2378,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts dev --docker\n",[150,2380,2381],{"__ignoreMap":173},[177,2382,2383,2385,2387,2389],{"class":179,"line":180},[177,2384,206],{"class":183},[177,2386,188],{"class":187},[177,2388,2372],{"class":187},[177,2390,2375],{"class":187},[167,2392,2394],{"className":169,"code":2393,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts dev --docker\n",[150,2395,2396],{"__ignoreMap":173},[177,2397,2398,2400,2402,2404],{"class":179,"line":180},[177,2399,226],{"class":183},[177,2401,188],{"class":187},[177,2403,2372],{"class":187},[177,2405,2375],{"class":187},[167,2407,2409],{"className":169,"code":2408,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts dev --docker\n",[150,2410,2411],{"__ignoreMap":173},[177,2412,2413,2415,2417,2419],{"class":179,"line":180},[177,2414,253],{"class":183},[177,2416,188],{"class":187},[177,2418,2372],{"class":187},[177,2420,2375],{"class":187},[147,2422,2423,2424,2427,2428,2430,2431,2433,2434,2436],{},"То же для ",[340,2425,2426],{"href":28},"сервера в Docker",", который монтирует проект: собирает\nдля Linux в ",[150,2429,380],{}," и снова при каждом сохранении, ничего не выкладывает —\nсервер читает ",[150,2432,380],{}," и перезагружает плагин, файл которого изменился, — и\nпоказывает под сборкой строки amxts из консоли этого сервера.\n",[150,2435,809],{}," не используется.",[311,2438,374],{"id":374},[163,2440,2441,2503,2556,2609],{"sync":165},[167,2442,2444],{"className":169,"code":2443,"filename":171,"language":172,"meta":173,"style":173},"npx amxts build              # dist\u002F: файлы .aot и plugins.ini\nnpx amxts build --deploy     # и копирует их в AMXTS_SERVER, перезагружая сервер\nnpx amxts build --os linux   # для сервера на Linux\nnpx amxts build --watch      # и снова при каждом сохранении, без выкладки\n",[150,2445,2446,2458,2472,2489],{"__ignoreMap":173},[177,2447,2448,2450,2452,2455],{"class":179,"line":180},[177,2449,184],{"class":183},[177,2451,188],{"class":187},[177,2453,2454],{"class":187}," build",[177,2456,2457],{"class":923},"              # dist\u002F: файлы .aot и plugins.ini\n",[177,2459,2460,2462,2464,2466,2469],{"class":179,"line":927},[177,2461,184],{"class":183},[177,2463,188],{"class":187},[177,2465,2454],{"class":187},[177,2467,2468],{"class":187}," --deploy",[177,2470,2471],{"class":923},"     # и копирует их в AMXTS_SERVER, перезагружая сервер\n",[177,2473,2474,2476,2478,2480,2483,2486],{"class":179,"line":1209},[177,2475,184],{"class":183},[177,2477,188],{"class":187},[177,2479,2454],{"class":187},[177,2481,2482],{"class":187}," --os",[177,2484,2485],{"class":187}," linux",[177,2487,2488],{"class":923},"   # для сервера на Linux\n",[177,2490,2491,2493,2495,2497,2500],{"class":179,"line":1260},[177,2492,184],{"class":183},[177,2494,188],{"class":187},[177,2496,2454],{"class":187},[177,2498,2499],{"class":187}," --watch",[177,2501,2502],{"class":923},"      # и снова при каждом сохранении, без выкладки\n",[167,2504,2506],{"className":169,"code":2505,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts build              # dist\u002F: файлы .aot и plugins.ini\npnpm amxts build --deploy     # и копирует их в AMXTS_SERVER, перезагружая сервер\npnpm amxts build --os linux   # для сервера на Linux\npnpm amxts build --watch      # и снова при каждом сохранении, без выкладки\n",[150,2507,2508,2518,2530,2544],{"__ignoreMap":173},[177,2509,2510,2512,2514,2516],{"class":179,"line":180},[177,2511,206],{"class":183},[177,2513,188],{"class":187},[177,2515,2454],{"class":187},[177,2517,2457],{"class":923},[177,2519,2520,2522,2524,2526,2528],{"class":179,"line":927},[177,2521,206],{"class":183},[177,2523,188],{"class":187},[177,2525,2454],{"class":187},[177,2527,2468],{"class":187},[177,2529,2471],{"class":923},[177,2531,2532,2534,2536,2538,2540,2542],{"class":179,"line":1209},[177,2533,206],{"class":183},[177,2535,188],{"class":187},[177,2537,2454],{"class":187},[177,2539,2482],{"class":187},[177,2541,2485],{"class":187},[177,2543,2488],{"class":923},[177,2545,2546,2548,2550,2552,2554],{"class":179,"line":1260},[177,2547,206],{"class":183},[177,2549,188],{"class":187},[177,2551,2454],{"class":187},[177,2553,2499],{"class":187},[177,2555,2502],{"class":923},[167,2557,2559],{"className":169,"code":2558,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts build              # dist\u002F: файлы .aot и plugins.ini\nyarn amxts build --deploy     # и копирует их в AMXTS_SERVER, перезагружая сервер\nyarn amxts build --os linux   # для сервера на Linux\nyarn amxts build --watch      # и снова при каждом сохранении, без выкладки\n",[150,2560,2561,2571,2583,2597],{"__ignoreMap":173},[177,2562,2563,2565,2567,2569],{"class":179,"line":180},[177,2564,226],{"class":183},[177,2566,188],{"class":187},[177,2568,2454],{"class":187},[177,2570,2457],{"class":923},[177,2572,2573,2575,2577,2579,2581],{"class":179,"line":927},[177,2574,226],{"class":183},[177,2576,188],{"class":187},[177,2578,2454],{"class":187},[177,2580,2468],{"class":187},[177,2582,2471],{"class":923},[177,2584,2585,2587,2589,2591,2593,2595],{"class":179,"line":1209},[177,2586,226],{"class":183},[177,2588,188],{"class":187},[177,2590,2454],{"class":187},[177,2592,2482],{"class":187},[177,2594,2485],{"class":187},[177,2596,2488],{"class":923},[177,2598,2599,2601,2603,2605,2607],{"class":179,"line":1260},[177,2600,226],{"class":183},[177,2602,188],{"class":187},[177,2604,2454],{"class":187},[177,2606,2499],{"class":187},[177,2608,2502],{"class":923},[167,2610,2612],{"className":169,"code":2611,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts build              # dist\u002F: файлы .aot и plugins.ini\nbunx amxts build --deploy     # и копирует их в AMXTS_SERVER, перезагружая сервер\nbunx amxts build --os linux   # для сервера на Linux\nbunx amxts build --watch      # и снова при каждом сохранении, без выкладки\n",[150,2613,2614,2624,2636,2650],{"__ignoreMap":173},[177,2615,2616,2618,2620,2622],{"class":179,"line":180},[177,2617,253],{"class":183},[177,2619,188],{"class":187},[177,2621,2454],{"class":187},[177,2623,2457],{"class":923},[177,2625,2626,2628,2630,2632,2634],{"class":179,"line":927},[177,2627,253],{"class":183},[177,2629,188],{"class":187},[177,2631,2454],{"class":187},[177,2633,2468],{"class":187},[177,2635,2471],{"class":923},[177,2637,2638,2640,2642,2644,2646,2648],{"class":179,"line":1209},[177,2639,253],{"class":183},[177,2641,188],{"class":187},[177,2643,2454],{"class":187},[177,2645,2482],{"class":187},[177,2647,2485],{"class":187},[177,2649,2488],{"class":923},[177,2651,2652,2654,2656,2658,2660],{"class":179,"line":1260},[177,2653,253],{"class":183},[177,2655,188],{"class":187},[177,2657,2454],{"class":187},[177,2659,2499],{"class":187},[177,2661,2502],{"class":923},[147,2663,2664,2667,2668,847,2671,2675,2676,2679,2680,2682,2683,2685,2686,2688,2689,2691],{},[150,2665,2666],{},"plugins.ini"," перечисляет сначала модули, каждый после тех, что ему нужны,\nпотом плагины проекта. Модуль, которым не пользуется ни один плагин, в сборку\nне попадает, если его не оставляет ",[150,2669,2670],{},"pawn",[340,2672,2674],{"href":2673},"\u002Fru\u002Fdocs\u002Fcore\u002Fplugin#%D1%81%D0%BE%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D1%82%D1%81%D1%8F-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D1%82%D0%BE-%D1%87%D0%B5%D0%BC-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8E%D1%82%D1%81%D1%8F","собирается только то, чем\nпользуются","). Куда писать,\nменяет ",[150,2677,2678],{},"outDir"," в ",[150,2681,396],{},". Плагин, для которого с прошлой ",[150,2684,374],{},"\nничего не изменилось, берётся готовым, официальный модуль — каким пришёл\n(",[340,2687,361],{"href":358},"); без ",[150,2690,2194],{}," все компилируются заново.",[1395,2693,2695],{"id":2694},"система-сервера","Система сервера",[147,2697,2698,2699,2702],{},"Плагин компилируется в машинный код под систему своего сервера, Windows или\nLinux, и ",[150,2700,2701],{},".aot",", собранный под одну, не загрузится на другой. Систему сборка\nберёт, по порядку:",[2704,2705,2706,2720,2727,2743],"ol",{},[1415,2707,2708,2711,2712,2715,2716,2711,2718,1005],{},[150,2709,2710],{},"--os windows"," или ",[150,2713,2714],{},"--os linux"," у ",[150,2717,374],{},[150,2719,361],{},[1415,2721,2722,2724,2725,1005],{},[150,2723,846],{}," в окружении или ",[150,2726,805],{},[1415,2728,2729,2730,2732,2733,2711,2736,2739,2740,1005],{},"папку ",[150,2731,809],{},": ",[150,2734,2735],{},"hlds_linux",[150,2737,2738],{},"hlds.exe"," рядом с папкой игры,\nиначе файлы в её ",[150,2741,2742],{},"addons\u002Famxmodx\u002Fmodules",[1415,2744,2745],{},"систему машины, на которой идёт сборка.",[147,2747,2748,2749,2715,2751,567,2753,2732,2755,2758,2759,2761,2762,2764,2765,2768,2769,2771,2772,2774],{},"Какую именно, говорит строка ",[150,2750,2287],{},[150,2752,361],{},[150,2754,374],{},[150,2756,2757],{},"Linux",". Так\nпроект, собранный на Windows, выкладывается на сервер на Linux как есть — когда ",[150,2760,809],{}," указывает на него (например, на\nподключённую сетевую папку) или в ",[150,2763,805],{}," есть ",[150,2766,2767],{},"AMXTS_SERVER_OS=linux",".\n",[150,2770,283],{}," спрашивает систему, когда её не видно по папке сервера, а ",[150,2773,483],{},"\nпоказывает, какую выберет сборка.",[1808,2776,2777],{},[147,2778,2779,2783,2786,2788,2789,2792,2793,2796],{},[2780,2781,2782],"strong",{},"Плагин под другую систему",[2784,2785],"br",{},[150,2787,2701],{},", собранный под другую систему, не загрузится, и консоль об этом\nскажет: ",[150,2790,2791],{},"was compiled for a Linux server, and this one runs Windows"," (или\nнаоборот). ",[150,2794,2795],{},".ts",", который сервер компилирует сам, всегда собран под него.",[311,2798,390],{"id":390},[163,2800,2801,2815,2828,2841],{"sync":165},[167,2802,2804],{"className":169,"code":2803,"filename":171,"language":172,"meta":173,"style":173},"npx amxts typecheck\n",[150,2805,2806],{"__ignoreMap":173},[177,2807,2808,2810,2812],{"class":179,"line":180},[177,2809,184],{"class":183},[177,2811,188],{"class":187},[177,2813,2814],{"class":187}," typecheck\n",[167,2816,2818],{"className":169,"code":2817,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts typecheck\n",[150,2819,2820],{"__ignoreMap":173},[177,2821,2822,2824,2826],{"class":179,"line":180},[177,2823,206],{"class":183},[177,2825,188],{"class":187},[177,2827,2814],{"class":187},[167,2829,2831],{"className":169,"code":2830,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts typecheck\n",[150,2832,2833],{"__ignoreMap":173},[177,2834,2835,2837,2839],{"class":179,"line":180},[177,2836,226],{"class":183},[177,2838,188],{"class":187},[177,2840,2814],{"class":187},[167,2842,2844],{"className":169,"code":2843,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts typecheck\n",[150,2845,2846],{"__ignoreMap":173},[177,2847,2848,2850,2852],{"class":179,"line":180},[177,2849,253],{"class":183},[177,2851,188],{"class":187},[177,2853,2814],{"class":187},[147,2855,2856,2857,2859],{},"Проверяет плагины и ",[150,2858,396],{}," TypeScript'ом, так же, как редактор:\nопечатку в настройке модуля, неверное имя события, поле, которого нет.",[311,2861,407],{"id":407},[163,2863,2864,2908,2947,2986],{"sync":165},[167,2865,2867],{"className":169,"code":2866,"filename":171,"language":172,"meta":173,"style":173},"npx amxts test           # все тесты проекта\nnpx amxts test hello     # файлы, в имени которых есть \"hello\"\nnpx amxts test --watch   # и снова на каждое сохранение\n",[150,2868,2869,2881,2895],{"__ignoreMap":173},[177,2870,2871,2873,2875,2878],{"class":179,"line":180},[177,2872,184],{"class":183},[177,2874,188],{"class":187},[177,2876,2877],{"class":187}," test",[177,2879,2880],{"class":923},"           # все тесты проекта\n",[177,2882,2883,2885,2887,2889,2892],{"class":179,"line":927},[177,2884,184],{"class":183},[177,2886,188],{"class":187},[177,2888,2877],{"class":187},[177,2890,2891],{"class":187}," hello",[177,2893,2894],{"class":923},"     # файлы, в имени которых есть \"hello\"\n",[177,2896,2897,2899,2901,2903,2905],{"class":179,"line":1209},[177,2898,184],{"class":183},[177,2900,188],{"class":187},[177,2902,2877],{"class":187},[177,2904,2499],{"class":187},[177,2906,2907],{"class":923},"   # и снова на каждое сохранение\n",[167,2909,2911],{"className":169,"code":2910,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts test           # все тесты проекта\npnpm amxts test hello     # файлы, в имени которых есть \"hello\"\npnpm amxts test --watch   # и снова на каждое сохранение\n",[150,2912,2913,2923,2935],{"__ignoreMap":173},[177,2914,2915,2917,2919,2921],{"class":179,"line":180},[177,2916,206],{"class":183},[177,2918,188],{"class":187},[177,2920,2877],{"class":187},[177,2922,2880],{"class":923},[177,2924,2925,2927,2929,2931,2933],{"class":179,"line":927},[177,2926,206],{"class":183},[177,2928,188],{"class":187},[177,2930,2877],{"class":187},[177,2932,2891],{"class":187},[177,2934,2894],{"class":923},[177,2936,2937,2939,2941,2943,2945],{"class":179,"line":1209},[177,2938,206],{"class":183},[177,2940,188],{"class":187},[177,2942,2877],{"class":187},[177,2944,2499],{"class":187},[177,2946,2907],{"class":923},[167,2948,2950],{"className":169,"code":2949,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts test           # все тесты проекта\nyarn amxts test hello     # файлы, в имени которых есть \"hello\"\nyarn amxts test --watch   # и снова на каждое сохранение\n",[150,2951,2952,2962,2974],{"__ignoreMap":173},[177,2953,2954,2956,2958,2960],{"class":179,"line":180},[177,2955,226],{"class":183},[177,2957,188],{"class":187},[177,2959,2877],{"class":187},[177,2961,2880],{"class":923},[177,2963,2964,2966,2968,2970,2972],{"class":179,"line":927},[177,2965,226],{"class":183},[177,2967,188],{"class":187},[177,2969,2877],{"class":187},[177,2971,2891],{"class":187},[177,2973,2894],{"class":923},[177,2975,2976,2978,2980,2982,2984],{"class":179,"line":1209},[177,2977,226],{"class":183},[177,2979,188],{"class":187},[177,2981,2877],{"class":187},[177,2983,2499],{"class":187},[177,2985,2907],{"class":923},[167,2987,2989],{"className":169,"code":2988,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts test           # все тесты проекта\nbunx amxts test hello     # файлы, в имени которых есть \"hello\"\nbunx amxts test --watch   # и снова на каждое сохранение\n",[150,2990,2991,3001,3013],{"__ignoreMap":173},[177,2992,2993,2995,2997,2999],{"class":179,"line":180},[177,2994,253],{"class":183},[177,2996,188],{"class":187},[177,2998,2877],{"class":187},[177,3000,2880],{"class":923},[177,3002,3003,3005,3007,3009,3011],{"class":179,"line":927},[177,3004,253],{"class":183},[177,3006,188],{"class":187},[177,3008,2877],{"class":187},[177,3010,2891],{"class":187},[177,3012,2894],{"class":923},[177,3014,3015,3017,3019,3021,3023],{"class":179,"line":1209},[177,3016,253],{"class":183},[177,3018,188],{"class":187},[177,3020,2877],{"class":187},[177,3022,2499],{"class":187},[177,3024,2907],{"class":923},[147,3026,3027,3028,3031,3032,3035,3036,1833],{},"Запускает ",[150,3029,3030],{},"bun test",": его параметры передаются как есть. Тест кладёт проект\nна поддельный сервер через ",[150,3033,3034],{},"setup()"," — см. ",[340,3037,3038],{"href":135},"тесты",[311,3040,420],{"id":420},[163,3042,3043,3108,3165,3222],{"sync":165},[167,3044,3046],{"className":169,"code":3045,"filename":171,"language":172,"meta":173,"style":173},"npx amxts module add menu-core      # @amxts\u002Fmenu-core\nnpx amxts module add @you\u002Fgreeter   # любой пакет-модуль из npm\nnpx amxts module add ..\u002Fgreeter     # модуль из папки\nnpx amxts module list\n",[150,3047,3048,3066,3081,3097],{"__ignoreMap":173},[177,3049,3050,3052,3054,3057,3060,3063],{"class":179,"line":180},[177,3051,184],{"class":183},[177,3053,188],{"class":187},[177,3055,3056],{"class":187}," module",[177,3058,3059],{"class":187}," add",[177,3061,3062],{"class":187}," menu-core",[177,3064,3065],{"class":923},"      # @amxts\u002Fmenu-core\n",[177,3067,3068,3070,3072,3074,3076,3078],{"class":179,"line":927},[177,3069,184],{"class":183},[177,3071,188],{"class":187},[177,3073,3056],{"class":187},[177,3075,3059],{"class":187},[177,3077,1867],{"class":187},[177,3079,3080],{"class":923},"   # любой пакет-модуль из npm\n",[177,3082,3083,3085,3087,3089,3091,3094],{"class":179,"line":1209},[177,3084,184],{"class":183},[177,3086,188],{"class":187},[177,3088,3056],{"class":187},[177,3090,3059],{"class":187},[177,3092,3093],{"class":187}," ..\u002Fgreeter",[177,3095,3096],{"class":923},"     # модуль из папки\n",[177,3098,3099,3101,3103,3105],{"class":179,"line":1260},[177,3100,184],{"class":183},[177,3102,188],{"class":187},[177,3104,3056],{"class":187},[177,3106,3107],{"class":187}," list\n",[167,3109,3111],{"className":169,"code":3110,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts module add menu-core      # @amxts\u002Fmenu-core\npnpm amxts module add @you\u002Fgreeter   # любой пакет-модуль из npm\npnpm amxts module add ..\u002Fgreeter     # модуль из папки\npnpm amxts module list\n",[150,3112,3113,3127,3141,3155],{"__ignoreMap":173},[177,3114,3115,3117,3119,3121,3123,3125],{"class":179,"line":180},[177,3116,206],{"class":183},[177,3118,188],{"class":187},[177,3120,3056],{"class":187},[177,3122,3059],{"class":187},[177,3124,3062],{"class":187},[177,3126,3065],{"class":923},[177,3128,3129,3131,3133,3135,3137,3139],{"class":179,"line":927},[177,3130,206],{"class":183},[177,3132,188],{"class":187},[177,3134,3056],{"class":187},[177,3136,3059],{"class":187},[177,3138,1867],{"class":187},[177,3140,3080],{"class":923},[177,3142,3143,3145,3147,3149,3151,3153],{"class":179,"line":1209},[177,3144,206],{"class":183},[177,3146,188],{"class":187},[177,3148,3056],{"class":187},[177,3150,3059],{"class":187},[177,3152,3093],{"class":187},[177,3154,3096],{"class":923},[177,3156,3157,3159,3161,3163],{"class":179,"line":1260},[177,3158,206],{"class":183},[177,3160,188],{"class":187},[177,3162,3056],{"class":187},[177,3164,3107],{"class":187},[167,3166,3168],{"className":169,"code":3167,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts module add menu-core      # @amxts\u002Fmenu-core\nyarn amxts module add @you\u002Fgreeter   # любой пакет-модуль из npm\nyarn amxts module add ..\u002Fgreeter     # модуль из папки\nyarn amxts module list\n",[150,3169,3170,3184,3198,3212],{"__ignoreMap":173},[177,3171,3172,3174,3176,3178,3180,3182],{"class":179,"line":180},[177,3173,226],{"class":183},[177,3175,188],{"class":187},[177,3177,3056],{"class":187},[177,3179,3059],{"class":187},[177,3181,3062],{"class":187},[177,3183,3065],{"class":923},[177,3185,3186,3188,3190,3192,3194,3196],{"class":179,"line":927},[177,3187,226],{"class":183},[177,3189,188],{"class":187},[177,3191,3056],{"class":187},[177,3193,3059],{"class":187},[177,3195,1867],{"class":187},[177,3197,3080],{"class":923},[177,3199,3200,3202,3204,3206,3208,3210],{"class":179,"line":1209},[177,3201,226],{"class":183},[177,3203,188],{"class":187},[177,3205,3056],{"class":187},[177,3207,3059],{"class":187},[177,3209,3093],{"class":187},[177,3211,3096],{"class":923},[177,3213,3214,3216,3218,3220],{"class":179,"line":1260},[177,3215,226],{"class":183},[177,3217,188],{"class":187},[177,3219,3056],{"class":187},[177,3221,3107],{"class":187},[167,3223,3225],{"className":169,"code":3224,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts module add menu-core      # @amxts\u002Fmenu-core\nbunx amxts module add @you\u002Fgreeter   # любой пакет-модуль из npm\nbunx amxts module add ..\u002Fgreeter     # модуль из папки\nbunx amxts module list\n",[150,3226,3227,3241,3255,3269],{"__ignoreMap":173},[177,3228,3229,3231,3233,3235,3237,3239],{"class":179,"line":180},[177,3230,253],{"class":183},[177,3232,188],{"class":187},[177,3234,3056],{"class":187},[177,3236,3059],{"class":187},[177,3238,3062],{"class":187},[177,3240,3065],{"class":923},[177,3242,3243,3245,3247,3249,3251,3253],{"class":179,"line":927},[177,3244,253],{"class":183},[177,3246,188],{"class":187},[177,3248,3056],{"class":187},[177,3250,3059],{"class":187},[177,3252,1867],{"class":187},[177,3254,3080],{"class":923},[177,3256,3257,3259,3261,3263,3265,3267],{"class":179,"line":1209},[177,3258,253],{"class":183},[177,3260,188],{"class":187},[177,3262,3056],{"class":187},[177,3264,3059],{"class":187},[177,3266,3093],{"class":187},[177,3268,3096],{"class":923},[177,3270,3271,3273,3275,3277],{"class":179,"line":1260},[177,3272,253],{"class":183},[177,3274,188],{"class":187},[177,3276,3056],{"class":187},[177,3278,3107],{"class":187},[147,3280,3281,3283,3284,2679,3286,3288,3289,3292,3293,2732,3296,3298,3299,3301],{},[150,3282,425],{}," ставит пакет менеджером пакетов проекта (его узнаёт по\nlock-файлу) и добавляет в ",[150,3285,909],{},[150,3287,396],{},", а за ним — модули,\nкоторые ему нужны и которых в списке ещё нет, каждый с комментарием\n",[150,3290,3291],{},"\u002F\u002F needed by menu-core","; меняется только список, остальной файл остаётся как\nвы его написали. Короткое имя — имя\nмодуля в ",[340,3294,3295],{"href":494},"каталоге модулей",[150,3297,905],{}," — это ",[150,3300,1162],{},".\nПакет, которого нет в каталоге, всё равно ставится из npm, но с\nпредупреждением; пакет, который не модуль amxts, ставится, но в конфиг не\nдобавляется. Модуль из npm приходит в своей новейшей версии, которая работает\nс ядром проекта. Каталог команда читает из реестра на GitHub, а без сети\nберёт копию, с которой была опубликована.",[316,3303,3304,3312],{},[319,3305,3306],{},[322,3307,3308,3310],{},[325,3309,716],{},[325,3311,330],{},[332,3313,3314,3326,3336],{},[322,3315,3316,3321],{},[337,3317,3318],{},[150,3319,3320],{},"--skip-install",[337,3322,3323,3324],{},"только добавить в ",[150,3325,396],{},[322,3327,3328,3333],{},[337,3329,3330],{},[150,3331,3332],{},"--skip-config",[337,3334,3335],{},"только поставить",[322,3337,3338,3342],{},[337,3339,3340],{},[150,3341,892],{},[337,3343,3344],{},"официальный модуль из его папки на этой машине, ссылкой, — для работы над самим amxts",[147,3346,3347,3349,3350,1114],{},[150,3348,429],{}," показывает модули из конфига и стоят ли они, стоящие модули,\nкоторых нет в конфиге, и модули каталога, которых у проекта ещё нет, — модуль\nсообщества помечен ",[150,3351,3352],{},"(community)",[167,3354,3357],{"className":3355,"code":3356,"language":300},[298],"In amxts.config.ts\n  ✔ @amxts\u002Fmenu-core    0.2.0  An opinionated way to create menus\n  ✔ @amxts\u002Fconfig-core  0.1.1  Configs in INI, YAML or JSON, read into typed objects and written back\n\nIn the amxts catalog\n  ○ resemiclip          Semiclip over the ReSemiclip module - who walks through whom, as a rule over two players - npx amxts module add resemiclip\n  ○ ftp                 FTP, FTPS and SFTP - upload, download and list files on another server, every call a promise - npx amxts module add ftp\n",[150,3358,3356],{"__ignoreMap":173},[311,3360,440],{"id":440},[163,3362,3363,3377,3390,3403],{"sync":165},[167,3364,3366],{"className":169,"code":3365,"filename":171,"language":172,"meta":173,"style":173},"npx amxts check\n",[150,3367,3368],{"__ignoreMap":173},[177,3369,3370,3372,3374],{"class":179,"line":180},[177,3371,184],{"class":183},[177,3373,188],{"class":187},[177,3375,3376],{"class":187}," check\n",[167,3378,3380],{"className":169,"code":3379,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts check\n",[150,3381,3382],{"__ignoreMap":173},[177,3383,3384,3386,3388],{"class":179,"line":180},[177,3385,206],{"class":183},[177,3387,188],{"class":187},[177,3389,3376],{"class":187},[167,3391,3393],{"className":169,"code":3392,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts check\n",[150,3394,3395],{"__ignoreMap":173},[177,3396,3397,3399,3401],{"class":179,"line":180},[177,3398,226],{"class":183},[177,3400,188],{"class":187},[177,3402,3376],{"class":187},[167,3404,3406],{"className":169,"code":3405,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts check\n",[150,3407,3408],{"__ignoreMap":173},[177,3409,3410,3412,3414],{"class":179,"line":180},[177,3411,253],{"class":183},[177,3413,188],{"class":187},[177,3415,3376],{"class":187},[147,3417,3418,3419,3421,3422,3425,3426,3429,3430,3433,3434,3437,3438,3441,3442,1833],{},"В папке модуля, перед публикацией: поле ",[150,3420,152],{}," указывает на существующие\nфайлы, у файла модуля есть ",[150,3423,3424],{},"defineModule"," с ",[150,3427,3428],{},"meta.name",", есть ",[150,3431,3432],{},"README.md"," и\n",[150,3435,3436],{},"LICENSE",", а ",[150,3439,3440],{},"include\u002F\u003Cимя>.inc"," совпадает с тем, что сборка пишет из\nнативов. Ничего не записывает. См. ",[340,3443,1846],{"href":121},[311,3445,453],{"id":453},[163,3447,3448,3462,3475,3488],{"sync":165},[167,3449,3451],{"className":169,"code":3450,"filename":171,"language":172,"meta":173,"style":173},"npx amxts prepare\n",[150,3452,3453],{"__ignoreMap":173},[177,3454,3455,3457,3459],{"class":179,"line":180},[177,3456,184],{"class":183},[177,3458,188],{"class":187},[177,3460,3461],{"class":187}," prepare\n",[167,3463,3465],{"className":169,"code":3464,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts prepare\n",[150,3466,3467],{"__ignoreMap":173},[177,3468,3469,3471,3473],{"class":179,"line":180},[177,3470,206],{"class":183},[177,3472,188],{"class":187},[177,3474,3461],{"class":187},[167,3476,3478],{"className":169,"code":3477,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts prepare\n",[150,3479,3480],{"__ignoreMap":173},[177,3481,3482,3484,3486],{"class":179,"line":180},[177,3483,226],{"class":183},[177,3485,188],{"class":187},[177,3487,3461],{"class":187},[167,3489,3491],{"className":169,"code":3490,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts prepare\n",[150,3492,3493],{"__ignoreMap":173},[177,3494,3495,3497,3499],{"class":179,"line":180},[177,3496,253],{"class":183},[177,3498,188],{"class":187},[177,3500,3461],{"class":187},[147,3502,3503,3504,3506,3507,3509],{},"Получает ",[340,3505,503],{"href":502},", если их ещё нет, и пишет в\n",[150,3508,459],{}," то, что читает редактор:",[1412,3511,3512,3532,3543],{},[1415,3513,3514,3517,3518,3521,3522,3525,3526,3528,3529,3531],{},[150,3515,3516],{},".amxts\u002Ftsconfig.json",", который расширяет ",[150,3519,3520],{},"tsconfig.json"," проекта: ",[150,3523,3524],{},"~\u002F"," —\nпапка плагинов, ",[150,3527,160],{}," и его точки входа — API ядра, модули\nнаходятся по именам, а ",[150,3530,396],{}," получает типы из них;",[1415,3533,3534,3537,3538,3542],{},[150,3535,3536],{},".amxts\u002Fimports.d.ts"," — то, чем плагины пользуются без импорта, глобальными\nименами для редактора (",[340,3539,3541],{"href":3540},"\u002Fru\u002Fdocs\u002Fcore\u002Fplugin#%D0%B0%D0%B2%D1%82%D0%BE%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D1%8B","автоимпорты",");",[1415,3544,3545,3548,3549,3552,3553,3555],{},[150,3546,3547],{},".amxts\u002Fapi\u002F"," — только когда ",[150,3550,3551],{},"AMXTS_DOCS_LANG"," выбирает не английский:\nкопия API ядра и модулей с подсказками на этом языке, которую редактор\nчитает вместо установленных пакетов. Пакеты в ",[150,3554,272],{}," не меняются\nникогда, а собирает сборка именно их, поэтому плагины выходят одинаковыми\nна любом языке.",[147,3557,3558,869,3560,567,3562,3564,3565,3567,3568,3570,3571,3574],{},[150,3559,374],{},[150,3561,361],{},[150,3563,390],{}," делают это первым шагом, ",[150,3566,283],{}," — после\nустановки. ",[150,3569,459],{}," принадлежит команде: она в ",[150,3572,3573],{},".gitignore"," и пишется\nзаново, когда устарела.",[311,3576,3577,3578],{"id":470},"upgrade ",[3579,3580],"since",{"v":3581},"0.2",[163,3583,3584,3633,3674,3715],{"sync":165},[167,3585,3587],{"className":169,"code":3586,"filename":171,"language":172,"meta":173,"style":173},"npx amxts upgrade              # до последнего выпуска\nnpx amxts upgrade --to 0.2.0   # до выпуска на ваш выбор\nnpx amxts upgrade --dry-run    # что изменилось бы, ничего не меняя\n",[150,3588,3589,3601,3619],{"__ignoreMap":173},[177,3590,3591,3593,3595,3598],{"class":179,"line":180},[177,3592,184],{"class":183},[177,3594,188],{"class":187},[177,3596,3597],{"class":187}," upgrade",[177,3599,3600],{"class":923},"              # до последнего выпуска\n",[177,3602,3603,3605,3607,3609,3612,3616],{"class":179,"line":927},[177,3604,184],{"class":183},[177,3606,188],{"class":187},[177,3608,3597],{"class":187},[177,3610,3611],{"class":187}," --to",[177,3613,3615],{"class":3614},"sbssI"," 0.2.0",[177,3617,3618],{"class":923},"   # до выпуска на ваш выбор\n",[177,3620,3621,3623,3625,3627,3630],{"class":179,"line":1209},[177,3622,184],{"class":183},[177,3624,188],{"class":187},[177,3626,3597],{"class":187},[177,3628,3629],{"class":187}," --dry-run",[177,3631,3632],{"class":923},"    # что изменилось бы, ничего не меняя\n",[167,3634,3636],{"className":169,"code":3635,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts upgrade              # до последнего выпуска\npnpm amxts upgrade --to 0.2.0   # до выпуска на ваш выбор\npnpm amxts upgrade --dry-run    # что изменилось бы, ничего не меняя\n",[150,3637,3638,3648,3662],{"__ignoreMap":173},[177,3639,3640,3642,3644,3646],{"class":179,"line":180},[177,3641,206],{"class":183},[177,3643,188],{"class":187},[177,3645,3597],{"class":187},[177,3647,3600],{"class":923},[177,3649,3650,3652,3654,3656,3658,3660],{"class":179,"line":927},[177,3651,206],{"class":183},[177,3653,188],{"class":187},[177,3655,3597],{"class":187},[177,3657,3611],{"class":187},[177,3659,3615],{"class":3614},[177,3661,3618],{"class":923},[177,3663,3664,3666,3668,3670,3672],{"class":179,"line":1209},[177,3665,206],{"class":183},[177,3667,188],{"class":187},[177,3669,3597],{"class":187},[177,3671,3629],{"class":187},[177,3673,3632],{"class":923},[167,3675,3677],{"className":169,"code":3676,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts upgrade              # до последнего выпуска\nyarn amxts upgrade --to 0.2.0   # до выпуска на ваш выбор\nyarn amxts upgrade --dry-run    # что изменилось бы, ничего не меняя\n",[150,3678,3679,3689,3703],{"__ignoreMap":173},[177,3680,3681,3683,3685,3687],{"class":179,"line":180},[177,3682,226],{"class":183},[177,3684,188],{"class":187},[177,3686,3597],{"class":187},[177,3688,3600],{"class":923},[177,3690,3691,3693,3695,3697,3699,3701],{"class":179,"line":927},[177,3692,226],{"class":183},[177,3694,188],{"class":187},[177,3696,3597],{"class":187},[177,3698,3611],{"class":187},[177,3700,3615],{"class":3614},[177,3702,3618],{"class":923},[177,3704,3705,3707,3709,3711,3713],{"class":179,"line":1209},[177,3706,226],{"class":183},[177,3708,188],{"class":187},[177,3710,3597],{"class":187},[177,3712,3629],{"class":187},[177,3714,3632],{"class":923},[167,3716,3718],{"className":169,"code":3717,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts upgrade              # до последнего выпуска\nbunx amxts upgrade --to 0.2.0   # до выпуска на ваш выбор\nbunx amxts upgrade --dry-run    # что изменилось бы, ничего не меняя\n",[150,3719,3720,3730,3744],{"__ignoreMap":173},[177,3721,3722,3724,3726,3728],{"class":179,"line":180},[177,3723,253],{"class":183},[177,3725,188],{"class":187},[177,3727,3597],{"class":187},[177,3729,3600],{"class":923},[177,3731,3732,3734,3736,3738,3740,3742],{"class":179,"line":927},[177,3733,253],{"class":183},[177,3735,188],{"class":187},[177,3737,3597],{"class":187},[177,3739,3611],{"class":187},[177,3741,3615],{"class":3614},[177,3743,3618],{"class":923},[177,3745,3746,3748,3750,3752,3754],{"class":179,"line":1209},[177,3747,253],{"class":183},[177,3749,188],{"class":187},[177,3751,3597],{"class":187},[177,3753,3629],{"class":187},[177,3755,3632],{"class":923},[147,3757,3758,3759,3761,3762,3764,3765,3768,3769,3771],{},"::: warning Сначала сама команда\n",[150,3760,470],{}," — команда пакета ",[150,3763,156],{},", и проект запускает ту его версию, с которой пришло его ядро, или ту, что названа в его собственном ",[150,3766,3767],{},"package.json",". Если в команде проекта ещё нет ",[150,3770,470],{},", сначала добавьте новейшую команду тем менеджером пакетов, что у проекта:",[163,3773,3774,3801,3824,3847],{"sync":165},[167,3775,3777],{"className":169,"code":3776,"filename":171,"language":172,"meta":173,"style":173},"npm i @amxts\u002Fcli@latest   # или: bun add @amxts\u002Fcli@latest, pnpm add @amxts\u002Fcli@latest, yarn add @amxts\u002Fcli@latest\nnpx amxts upgrade\n",[150,3778,3779,3792],{"__ignoreMap":173},[177,3780,3781,3783,3786,3789],{"class":179,"line":180},[177,3782,171],{"class":183},[177,3784,3785],{"class":187}," i",[177,3787,3788],{"class":187}," @amxts\u002Fcli@latest",[177,3790,3791],{"class":923},"   # или: bun add @amxts\u002Fcli@latest, pnpm add @amxts\u002Fcli@latest, yarn add @amxts\u002Fcli@latest\n",[177,3793,3794,3796,3798],{"class":179,"line":927},[177,3795,184],{"class":183},[177,3797,188],{"class":187},[177,3799,3800],{"class":187}," upgrade\n",[167,3802,3804],{"className":169,"code":3803,"filename":206,"language":172,"meta":173,"style":173},"pnpm add @amxts\u002Fcli@latest   # или: bun add @amxts\u002Fcli@latest, pnpm add @amxts\u002Fcli@latest, yarn add @amxts\u002Fcli@latest\npnpm amxts upgrade\n",[150,3805,3806,3816],{"__ignoreMap":173},[177,3807,3808,3810,3812,3814],{"class":179,"line":180},[177,3809,206],{"class":183},[177,3811,3059],{"class":187},[177,3813,3788],{"class":187},[177,3815,3791],{"class":923},[177,3817,3818,3820,3822],{"class":179,"line":927},[177,3819,206],{"class":183},[177,3821,188],{"class":187},[177,3823,3800],{"class":187},[167,3825,3827],{"className":169,"code":3826,"filename":226,"language":172,"meta":173,"style":173},"yarn add @amxts\u002Fcli@latest   # или: bun add @amxts\u002Fcli@latest, pnpm add @amxts\u002Fcli@latest, yarn add @amxts\u002Fcli@latest\nyarn amxts upgrade\n",[150,3828,3829,3839],{"__ignoreMap":173},[177,3830,3831,3833,3835,3837],{"class":179,"line":180},[177,3832,226],{"class":183},[177,3834,3059],{"class":187},[177,3836,3788],{"class":187},[177,3838,3791],{"class":923},[177,3840,3841,3843,3845],{"class":179,"line":927},[177,3842,226],{"class":183},[177,3844,188],{"class":187},[177,3846,3800],{"class":187},[167,3848,3850],{"className":169,"code":3849,"filename":246,"language":172,"meta":173,"style":173},"bun add @amxts\u002Fcli@latest   # или: bun add @amxts\u002Fcli@latest, pnpm add @amxts\u002Fcli@latest, yarn add @amxts\u002Fcli@latest\nbunx amxts upgrade\n",[150,3851,3852,3862],{"__ignoreMap":173},[177,3853,3854,3856,3858,3860],{"class":179,"line":180},[177,3855,246],{"class":183},[177,3857,3059],{"class":187},[177,3859,3788],{"class":187},[177,3861,3791],{"class":923},[177,3863,3864,3866,3868],{"class":179,"line":927},[177,3865,253],{"class":183},[177,3867,188],{"class":187},[177,3869,3800],{"class":187},[147,3871,3872],{},":::",[147,3874,3875],{},"Переводит проект на другой выпуск amxts за один раз:",[2704,3877,3878,3926,3937,3946,3977],{},[1415,3879,3880,938,3883,3885,3886,3889,3890,2679,3893,3895,3896,3899,3900,3903,3904,869,3907,3910,3911,3914,3915,3918,3919,869,3922,3925],{},[2780,3881,3882],{},"Пакеты.",[150,3884,160],{}," переходит на последнюю версию в реестре или\nна ",[150,3887,3888],{},"--to",". У каждого другого пакета ",[150,3891,3892],{},"@amxts\u002F",[150,3894,3767],{}," —\nофициальных модулей, команды — своя версия, и он переходит на свою\nновейшую версию, которая работает с этим ядром: модуль называет ядра, с\nкоторыми работает, в своих ",[150,3897,3898],{},"peerDependencies",". Каждая записывается так,\nкак её пишет проект: ",[150,3901,3902],{},"^0.1.0"," становится ",[150,3905,3906],{},"^0.2.0",[150,3908,3909],{},"0.1.0"," — ",[150,3912,3913],{},"0.2.0",".\nПакет из папки (",[150,3916,3917],{},"file:",") остаётся как есть; модуль, у которого ещё нет\nверсии для этого ядра, останавливает перевод до любых изменений. Ставит\nих пакетный менеджер проекта — тот, чей lock-файл в проекте, — из\nреестра, на который настроен npm (",[150,3920,3921],{},".npmrc",[150,3923,3924],{},"NPM_CONFIG_REGISTRY",").",[1415,3927,3928,3931,3932,3936],{},[2780,3929,3930],{},"Код"," переписывается под новый API новым ядром, каждое изменение\nперечисляется: ",[340,3933,3935],{"href":3934},"#%D0%BA%D0%BE%D0%B4","код",", ниже.",[1415,3938,3939,3942,3943,1833],{},[2780,3940,3941],{},"Сборка"," — как её делает ",[150,3944,3945],{},"amxts build",[1415,3947,3948,2342,3951,3953,3954,3956,3957,3960,3961,3964,3965,2679,3968,3970,3971,3973,3974,3976],{},[2780,3949,3950],{},"Сервер",[150,3952,809],{},": его модуль — и компилятор ",[150,3955,2795],{},", написанных\nна сервере, если он там есть, — из ",[340,3958,3959],{"href":24},"GitHub Release"," новой\nверсии, каждый файл сверяется с sha256 из списка выпуска. Заменённый файл\nостаётся рядом со своей версией: ",[150,3962,3963],{},"amxts_amxx.dll.0.1.0",". Строка\n",[150,3966,3967],{},"amxts_host.amxx",[150,3969,2666],{}," AMX Mod X убирается: модуль загружает\nсвой host-плагин сам. Без ",[150,3972,809],{}," — для\n",[340,3975,2426],{"href":28}," — говорит, какой образ скачать.",[1415,3978,3979,3982],{},[2780,3980,3981],{},"Итог",": версии, переписанные файлы, что проверить вручную и что стало с\nсервером.",[167,3984,3987],{"className":3985,"code":3986,"language":300},[298],"amxts 0.2.0 · upgrade\n◇ Packages: amxts 0.2.0 (latest)\ni @amxts\u002Fcore  ^0.1.0 → ^0.2.0\ni @amxts\u002Fcli  ^0.1.0 → ^0.2.0\ni @amxts\u002Fmenu-core  ^0.1.0 → ^0.2.0\ni @amxts\u002Fconfig-core  ^0.1.0 → ^0.1.1\n◇ Installing with npm\n✔ Installed with npm\n◇ Code\n  plugins\u002Fhello.ts:1  ~\u002Fnatives → @amxts\u002Fcore\u002Fnatives\n  plugins\u002Fhello.ts:9  player.account → player.money\n◇ Build\n  ...\n✔ built hello into dist (11.4s)\n◇ Server: D:\u002Fhlds\u002Fcstrike (windows)\n✔ amxts_amxx.dll 0.1.0 → 0.2.0 (the old one: amxts_amxx.dll.0.1.0)\n✔ Took amxts_host.amxx out of D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxmodx\u002Fconfigs\u002Fplugins.ini: the module loads it itself\n\nUpgraded to amxts 0.2.0\n  @amxts\u002Fcore         0.1.0 → 0.2.0\n  @amxts\u002Fcli          0.1.0 → 0.2.0\n  @amxts\u002Fmenu-core    0.1.0 → 0.2.0\n  @amxts\u002Fconfig-core  0.1.0 → 0.1.1\n  ✔ rewritten: plugins\u002Fhello.ts\n  ▲ to check by hand:\n      plugins\u002Fshop.ts:14  it reads the words after the name: write them in the usage, \"\u002Fgive \u003Camount>\", and take them by name, ({ player, amount })\n  ✔ built\n  ✔ server: amxts_amxx.dll 0.1.0 → 0.2.0 - restart the server to load it\n",[150,3988,3986],{"__ignoreMap":173},[316,3990,3991,3999],{},[319,3992,3993],{},[322,3994,3995,3997],{},[325,3996,716],{},[325,3998,330],{},[332,4000,4001,4011,4021,4031],{},[322,4002,4003,4008],{},[337,4004,4005],{},[150,4006,4007],{},"--to \u003Cversion>",[337,4009,4010],{},"выпуск, на который перейти, вместо последнего",[322,4012,4013,4018],{},[337,4014,4015],{},[150,4016,4017],{},"--no-server",[337,4019,4020],{},"не трогать сервер",[322,4022,4023,4028],{},[337,4024,4025],{},[150,4026,4027],{},"--server-only",[337,4029,4030],{},"только шаг сервера — для сервера, который был запущен",[322,4032,4033,4038],{},[337,4034,4035],{},[150,4036,4037],{},"--dry-run",[337,4039,4040],{},"вывести, что было бы сделано: ничего не ставится и не пишется, из выпуска читается только список файлов",[147,4042,4043],{},"Пробный запуск перечисляет правки кода, только когда в проекте уже стоит\nэта версия ядра: до установки нового ядра спросить ещё некого.",[147,4045,4046,4047,4049],{},"Проект запускает ту команду, с которой пришло его ядро. ",[150,4048,152],{}," более\nстарого выпуска ставит новые пакеты, а остальное — код, сборку, сервер —\nпередаёт новой команде проекта.",[1808,4051,4052],{},[147,4053,4054,4057,4059,4060,4062,4063,4066],{},[2780,4055,4056],{},"Запущенный сервер",[2784,4058],{},"\nСервер на Windows держит свой модуль, пока работает, и заменить файл тогда\nнельзя. ",[150,4061,470],{}," ничего не меняет на сервере, говорит об этом и делает\nостальное: остановите сервер и запустите ",[150,4064,4065],{},"npx amxts upgrade --server-only",".\nНа любой системе новый модуль загружается при следующем старте.",[1395,4068,3930],{"id":3935},[147,4070,4071,4072,4074,4075,4078],{},"Новое ядро приводит код проекта к своему API и перечисляет каждую\nизменённую строку. Импорт API ядра через ",[150,4073,3524],{}," становится импортом по имени\nпакета, а импорт пакета модуля по его месту в сборке\n(",[150,4076,4077],{},"~\u002Fmodules\u002Fmenu-core",") — импортом по имени модуля:",[167,4080,4082],{"className":913,"code":4081,"language":915,"meta":916,"style":173},"import { hostIndex, handled, floatCell, rounded, cellFloat, ret, publicFor, nativeFn, arg, argText, argc, caller, setArg, setArgText, argString, cellsToString, stringToCells, cells, out, text, arrayOf, cell, putCell, noOrigin, hasModule, readText, playerIds, accessOf, paint, print, cmd, cmdWide, setTimeout, sleep, setInterval, clearTimeout, clearInterval, hook, plugin, defineModule, callingPlugin, onPluginStop, createCellArray, destroyCellArray, cellArrayRows, pushCellArrayRow, cellsText, textCells, menuColors, colorTags, showMenu, Handler, WideHandler, Float, CellArray, CellBuffer, TEXT_MAX, Team, AuthType, WeaponName, ItemName, ModuleName, KillOptions, MoveOptions, Client, Player, CommandOptions, CommandInfo, HudOptions, HudEffect, HudLine, FadeDirection, FadeOptions, ShakeOptions, ProgressBarOptions, StatusIconState, Screen, SoundChannel, SoundOptions, Resource, MessageArgs, ClientMessage, PlayerChangeEvent, ServerListenerOptions, CvarChangeEvent, CvarListener, Cvar, Server, server, Game, GameListenerOptions, UseType, ActionOptions, TouchEvent, RoundWinner, EndRoundOptions, game, Variant, VariantName, Flag, Entity, Weapon, WeaponKind, weaponKindOf, RenderMode, RenderFx, MoveType, Solid, TakeDamage, DeadFlag, WaterLevel, Contents, FixAngle, HitGroup, ArmorType, ObserverMode, JoinState, GameMenu, PlayerModel, IgnoredChat, ThrowDirection, BloodColor, MusicState, Target, swapTeam, lang, cvar, TimerHandler, SleepOptions, Call, Ref, PluginInfo, ModuleOptions, ForwardStop, NoArgument, Forward, Storage, EntityFilter, PawnFunction, PawnCall, MenuColor, MenuOptions, MenuContext, MenuItemOptions, Menu, protocolMessageNames, addServerListener, removeServerListener, PluginInitEvent, PluginPauseEvent, PluginUnpauseEvent, ServerChangelevelEvent, PluginCfgEvent, PluginEndEvent, PluginLogEvent, PluginPrecacheEvent, ClientInfochangedEvent, ClientConnectEvent, ClientConnectexEvent, ClientAuthorizedEvent, ClientDisconnectedEvent, ClientRemoveEvent, ClientCommandEvent, ClientPutinserverEvent, InconsistentFileEvent, PluginModulesEvent, OnConfigsExecutedEvent, OnAutoConfigsBufferedEvent, CS_InternalCommandEvent, CS_OnBuyAttemptEvent, CS_OnBuyEvent, ServerFrameEvent, ClientKillEvent, ClientImpulseEvent, ClientCmdStartEvent, PfnThinkEvent, PfnPlaybackeventEvent, PfnKeyvalueEvent, PfnSpawnEvent, ADStopMessage, AllowSpecMessage, AmmoPickupMessage, AmmoXMessage, ArmorTypeMessage, BarTimeMessage, BatteryMessage, BlinkAcctMessage, BombDropMessage, BombPickupMessage, BotVoiceMessage, BuyCloseMessage, ClCorpseMessage, CrosshairMessage, CurWeaponMessage, DamageMessage, DeathMsgMessage, FlashlightMessage, FlashBatMessage, GeigerMessage, HealthMessage, HideWeaponMessage, HostageKMessage, HostagePosMessage, HudTextMessage, InitHUDMessage, ItemPickupMessage, ItemStatusMessage, LocationMessage, MoneyMessage, MOTDMessage, NVGToggleMessage, RadarMessage, ReqStateMessage, ResetHUDMessage, RoundTimeMessage, SayTextMessage, ScenarioMessage, ScoreAttribMessage, ScoreInfoMessage, ScreenFadeMessage, ScreenShakeMessage, SendAudioMessage, ServerNameMessage, SetFOVMessage, ShowMenuMessage, ShowTimerMessage, SpecHealthMessage, SpectatorMessage, StatusIconMessage, StatusTextMessage, StatusValueMessage, TaskTimeMessage, TeamInfoMessage, TeamScoreMessage, TextMsgMessage, TrainMessage, TutorCloseMessage, VGUIMenuMessage, ViewModeMessage, WeaponListMessage, WeapPickupMessage, ServerEventMap, ServerMessageMap, flagList, FlagFamily, FlagStore, EntvarFlags, MemberFlags, FlagList, HideHud, HIDE_HUD, Button, BUTTON, Effect, EFFECT, EntityFlag, ENTITY_FLAG, Damage, DAMAGE, Access, ACCESS, ScoreStatus, SCORE_STATUS, WeaponState, WEAPON_STATE, PhysicsFlag, PHYSICS_FLAG, addGameListener, removeGameListener, HookEvent, HookEntry, RewardReason, ResourceType, TeamChoice, ItemKind, ItemRestriction, BotEvent, RoundEndReason, DeathMessageFlag, KillRarity, PlayerAnimation, VguiMenu, ActivateEvent, ActivateServerEvent, AddFragsEvent, AddItemEvent, AddMoneyEvent, AddMultiDamageEvent, AddResourceEvent, AddTeamScoreEvent, AddToPlayerEvent, AddWeaponEvent, AirAccelerateEvent, AirMoveEvent, ApplyMultiDamageEvent, AttachToPlayerEvent, AutoaimVectorEvent, BalanceTeamsEvent, BecomeBomberEvent, BecomeDeadEvent, BecomeProneEvent, BecomeVipEvent, BestVisibleEnemyEvent, BlindEvent, BlockedEvent, BloodColorEvent, BodyTargetEvent, BounceGibTouchEvent, BuyAmmoEvent, BuyItemEvent, BuyWeaponEvent, CanDeployEvent, CanDropEvent, CanHaveItemEvent, CanHolsterEvent, CanPlayerHearPlayerEvent, CanRespawnEvent, CanShootThroughEvent, CanSpectateEvent, CanSwitchTeamEvent, CanTakeDamageEvent, CenterEvent, ChangeLevelEvent, ChangeModelEvent, ChangeNameEvent, ChangeYawEvent, ChatMessageEvent, CheckMapConditionsEvent, CheckTimeBasedDamageEvent, CheckUserInfoEvent, CheckWaterJumpEvent, CheckWinConditionsEvent, ChildDeathNoticeEvent, ChooseAppearanceEvent, ChooseTeamEvent, ClassifyEvent, ClearMultiDamageEvent, ClientConnectedEvent, ConnectClientEvent, ConsoleMessageEvent, CreateWeaponBoxEvent, DamageDecalEvent, DeathActivityEvent, DeathNoticeEvent, DeathSoundEvent, DefaultDeployEvent, DefaultReloadEvent, DefaultShotgunReloadEvent, DefuseBombEndEvent, DefuseBombStartEvent, DelayEvent, DeployEvent, DisappearEvent, DisconnectClientEvent, DropEvent, DropIdlePlayerEvent, DropPlayerItemEvent, DropShieldEvent, DropWeaponsOnDeathEvent, DuckEvent, DuckMovementEvent, EarPositionEvent, ExplodeBombEvent, ExplodeFlashbangEvent, ExplodeHeGrenadeEvent, ExplodeSmokeGrenadeEvent, ExtractAmmoEvent, ExtractClipAmmoEvent, EyePositionEvent, FadeMonsterEvent, FallDamageEvent, FireBulletsEvent, GameEventEvent, GameThinkEvent, GetForceCameraEvent, GetIntoGameEvent, GetNextBestWeaponEvent, GibMonsterEvent, GibSpawnEvent, GiveAmmoEvent, GiveBombEvent, GiveDefaultItemsEvent, GiveItemEvent, GiveShieldEvent, GunPositionEvent, HasAlienGibsEvent, HasHumanGibsEvent, HasTargetEvent, HealEvent, HintMessageEvent, HolsterEvent, IlluminationEvent, ImpulseEvent, IntermissionEvent, InViewConeEvent, IsAliveEvent, IsBotEvent, IsBspModelEvent, IsInWorldEvent, IsMovingEvent, IsNetClientEvent, IsPlayerEvent, IsSneakingEvent, IsTriggeredEvent, IsUsableEvent, IsWeaponEvent, ItemPostFrameEvent, ItemPreFrameEvent, ItemRestrictedEvent, ItemSlotEvent, ItemUpdateClientDataEvent, JoiningThinkEvent, JumpEvent, JumpMovementEvent, KillEvent, KilledEvent, LadderMoveEvent, LookEvent, MapResetEvent, MaxSpeedEvent, MonsterInitDeadEvent, MoveEvent, NewRoundEvent, NextTargetEvent, ObserverSetModeEvent, ObserverThinkEvent, PainEvent, PainSoundEvent, PlantBombEvent, PlayEmptySoundEvent, PlayerBlindEvent, PlayerDeathThinkEvent, PlayerGotWeaponEvent, PlayerKilledEvent, PlayerSpawnEvent, PlayStepSoundEvent, PointInViewConeEvent, PointVisibleEvent, PostThinkEvent, PrecacheEvent, PrecacheFileEvent, PrecacheModelEvent, PrecacheSoundEvent, PreThinkEvent, PrimaryAmmoIndexEvent, PrimaryAttackEvent, PrintfEvent, RadioEvent, RecoilEvent, ReflectGaussEvent, RelationshipEvent, ReloadEvent, RemoveAllItemsEvent, RemoveGunsEvent, RemoveItemEvent, RemoveSpawnProtectionEvent, ResetEmptySoundEvent, ResetMaxSpeedEvent, ResetSequenceInfoEvent, RespawnEvent, RestartEvent, RetireWeaponEvent, RoundEndEvent, RoundRespawnEvent, RoundStartEvent, SecondaryAmmoIndexEvent, SecondaryAttackEvent, SelectSpawnPointEvent, SendDeathMessageEvent, SendWeaponAnimEvent, ServerCommandEvent, ServerDeactivateEvent, SetAnimationEvent, SetModelEvent, SetObjectCollisionBoxEvent, SetSpawnProtectionEvent, SetToggleStateEvent, ShootEvent, ShootBuckshotEvent, ShouldFadeOnDeathEvent, ShouldSwitchWeaponEvent, ShouldWeaponIdleEvent, ShowMenuEvent, ShowVguiMenuEvent, SpawnEvent, SpawnEquipEvent, SpawnHeadGibEvent, SpawnRandomGibsEvent, SpawnSpotEvent, SpectateNextEvent, StartDeathCamEvent, StartSneakingEvent, StartSoundEvent, StartSpectatingEvent, StopSneakingEvent, SwitchTeamEvent, TakeDamageEvent, TakeDamageImpulseEvent, TeamFullEvent, TeamIdEvent, TeamStackedEvent, ThinkEvent, ThrowFlashbangEvent, ThrowGrenadeEvent, ThrowHeGrenadeEvent, ThrowSmokeGrenadeEvent, ToggleStateEvent, TouchingWeaponEvent, TraceAttackEvent, TraceBleedEvent, TraceLineEvent, UnDuckEvent, UpdateClientDataEvent, UpdateItemInfoEvent, UpdateStatusBarEvent, UseEvent, UseEmptyEvent, UserInfoChangeEvent, VisibleEvent, WaitTillLandEvent, WaterJumpEvent, WeaponIdleEvent, GameEventMap, GameAnswerMap, Vector, EffectRecipients, PointEffectOptions, SegmentEffectOptions, EntityEffectOptions, PlayerEffectOptions, BeamPointsOptions, BeamEntityPointOptions, BeamEntitiesOptions, BeamCircleOptions, BeamFollowOptions, BeamSpriteOptions, LightningOptions, ExplosionOptions, SmokeOptions, ParticleExplosionOptions, ImplosionOptions, SpriteTrailOptions, SpriteOptions, GlowSpriteOptions, StreakSplashOptions, DynamicLightOptions, EntityLightOptions, LineOptions, BoxOptions, LargeFunnelOptions, BloodOptions, FizzOptions, BounceSound, ModelOptions, ExplodeModelOptions, BreakMaterial, BreakModelOptions, SpriteSprayOptions, ArmorRicochetOptions, BubblesOptions, BloodSpriteOptions, ProjectileOptions, SprayOptions, PlayerSpritesOptions, ParticleBurstOptions, FireRise, FireBlend, FireFieldOptions, PlayerAttachmentOptions, effects, request, fetch, useFetch, URL, URLSearchParams, Headers, TlsOptions, RequestInit, Request, ResponseInit, Response, RequestErrorKind, RequestOptions, RequestResult, UseFetchOptions, FetchResult, FetchError } from \"~\u002Ffacade\";\n\u002F\u002F ---cut---\nimport { user_slap } from \"~\u002Fnatives\";            \u002F\u002F было\nimport { user_slap } from \"@amxts\u002Fcore\u002Fnatives\";  \u002F\u002F стало\n",[150,4083,4084,4169],{"__ignoreMap":173},[177,4085,4086,4089,4091,4093,4151,4154,4157,4159,4162,4164,4166],{"class":179,"line":180},[177,4087,4088],{"class":930},"import",[177,4090,980],{"class":191},[177,4092,938],{"class":198},[177,4094,4095],{"class":198},[942,4096,4097,4100],{"class":944,"popper-class":945,"theme":946},[177,4098,4099],{},"user_slap",[951,4101,4102],{"v-slot:popper":953},[177,4103,4104,4146],{"class":956,"v-pre":173},[150,4105,4106,4109,4112,4114,4118,4120,4123,4125,4128,4130,4132,4134,4137,4139,4141,4144],{"class":959},[177,4107,4108],{"style":971},"function",[177,4110,4111],{"style":1130}," user_slap",[177,4113,1134],{"style":979},[177,4115,4117],{"style":4116},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic","index",[177,4119,1114],{"style":979},[177,4121,4122],{"style":975}," number",[177,4124,1157],{"style":979},[177,4126,4127],{"style":4116}," power",[177,4129,1114],{"style":979},[177,4131,4122],{"style":975},[177,4133,1157],{"style":979},[177,4135,4136],{"style":4116}," rnddir",[177,4138,989],{"style":979},[177,4140,4122],{"style":975},[177,4142,4143],{"style":979},"):",[177,4145,4122],{"style":975},[1106,4147,4148],{"class":1108},[147,4149,4150],{},"user_slap(any:index, any:power, any:rnddir)",[177,4152,4153],{"class":191}," }",[177,4155,4156],{"class":930}," from",[177,4158,1046],{"class":191},[177,4160,4161],{"class":187},"~\u002Fnatives",[177,4163,1052],{"class":191},[177,4165,1005],{"class":191},[177,4167,4168],{"class":923},"            \u002F\u002F было\n",[177,4170,4171,4173,4175,4177,4225,4227,4229,4231,4234,4236,4238],{"class":179,"line":927},[177,4172,4088],{"class":930},[177,4174,980],{"class":191},[177,4176,938],{"class":198},[177,4178,4179],{"class":198},[942,4180,4181,4183],{"class":944,"popper-class":945,"theme":946},[177,4182,4099],{},[951,4184,4185],{"v-slot:popper":953},[177,4186,4187,4221],{"class":956,"v-pre":173},[150,4188,4189,4191,4193,4195,4197,4199,4201,4203,4205,4207,4209,4211,4213,4215,4217,4219],{"class":959},[177,4190,4108],{"style":971},[177,4192,4111],{"style":1130},[177,4194,1134],{"style":979},[177,4196,4117],{"style":4116},[177,4198,1114],{"style":979},[177,4200,4122],{"style":975},[177,4202,1157],{"style":979},[177,4204,4127],{"style":4116},[177,4206,1114],{"style":979},[177,4208,4122],{"style":975},[177,4210,1157],{"style":979},[177,4212,4136],{"style":4116},[177,4214,989],{"style":979},[177,4216,4122],{"style":975},[177,4218,4143],{"style":979},[177,4220,4122],{"style":975},[1106,4222,4223],{"class":1108},[147,4224,4150],{},[177,4226,4153],{"class":191},[177,4228,4156],{"class":930},[177,4230,1046],{"class":191},[177,4232,4233],{"class":187},"@amxts\u002Fcore\u002Fnatives",[177,4235,1052],{"class":191},[177,4237,1005],{"class":191},[177,4239,4240],{"class":923},"  \u002F\u002F стало\n",[147,4242,4243,4244,3433,4247,4250,4251,4253,4254,4256,4257,567,4259,1833],{},"Код читается парсером TypeScript: меняются импорты, экспорты, ",[150,4245,4246],{},"import()",[150,4248,4249],{},"declare module","; строка или комментарий, которые только похожи на импорт, —\nнет. Ваши собственные файлы через ",[150,4252,3524],{}," остаются как есть. Второй запуск\nничего не меняет. Команда проходит все ",[150,4255,2795],{}," проекта — плагины, тесты,\nисходники модуля, — но не ",[150,4258,272],{},[150,4260,380],{},[147,4262,4263,4264,4267,4268,4271,4272,4275,4276,757,4279,4282,4283,4286,4287,4289,4290,4293],{},"Обработчик команды получает один объект\n(",[340,4265,313],{"href":4266},"\u002Fru\u002Fdocs\u002Fcore\u002Fplugin#%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B","): ",[150,4269,4270],{},"(player) =>"," становится\n",[150,4273,4274],{},"({ player }) =>",", а функция, переданная по имени и принимающая игрока,\nвызывается из ",[150,4277,4278],{},"({ player }) => name(player)",[150,4280,4281],{},"(player, args) =>",", который\nне читает ",[150,4284,4285],{},"args",", тоже становится ",[150,4288,4274],{},". Обработчик, который читает\nслова после имени команды, выводится в список со строкой — его переписывают\nруками: слова идут в использование, ",[150,4291,4292],{},"\"\u002Fgive \u003Camount>\"",", а обработчик берёт их\nпо имени.",[147,4295,4296,4297,4267,4301,4271,4304,4307,4308,757,4311,3433,4313,4316,4317,567,4319,4322,4323,4326,4327,3925],{},"Код menu-core приводится к контексту меню\n(",[340,4298,4300],{"href":4299},"\u002Fru\u002Fmodules\u002Fmenu-core","меню",[150,4302,4303],{},"addItem(\"text\", options)",[150,4305,4306],{},"addItem({ title: \"text\", ... })",", и так же ",[150,4309,4310],{},"addFixedItem",[150,4312,4270],{},[150,4314,4315],{},"(player, target) =>"," становятся ",[150,4318,4274],{},[150,4320,4321],{},"({ player, target }) =>"," — в пункте, в настройках меню, в фильтре, в источнике списка и в том, что\nрегистрируется по имени. Функция, переданная по имени и объявленная в файле,\nвызывается из стрелки, которая передаёт ей то, что она принимала. В список —\nпереписать руками — попадают функция, объявленная в другом файле, имя меню,\nпрочитанное как текст, цель, переданная числом, и ",[150,4324,4325],{},"menus.runActions"," — это\nметод меню (",[150,4328,4329],{},"menu.runActions",[147,4331,4332,4333,4271,4336,4342,4343,2732,4346,4349,4350,4353,4354,4357,4358,4361,4362,4364,4365,3903,4368,869,4371,4374,4375,869,4378,4374,4381,869,4384,3910,4387,4390,4391,3910,4394,4397,4398,4401,4402,869,4405,2711,4408,869,4411,4414,4415,869,4417,869,4420,4423,4424,847,4426,1270,4429,4432,4433,4436,4437,4271,4440,1833],{},"Имена следуют API: ",[150,4334,4335],{},"Player.all()",[340,4337,4339],{"href":4338},"\u002Fru\u002Fdocs\u002Fgame\u002Fplayers#%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D0%B8%D0%B3%D1%80%D0%BE%D0%BA%D0%BE%D0%B2",[150,4340,4341],{},"server.players",", а его поля —\n",[150,4344,4345],{},"filter",[150,4347,4348],{},"Player.all({ alive: true, team: \"CT\" })"," — это\n",[150,4351,4352],{},"server.players.filter(player => player.isAlive && player.team === \"CT\")",";\nтам, где в коде уже есть ",[150,4355,4356],{},"player",", как в обработчике команды, игрок фильтра\nзовётся ",[150,4359,4360],{},"other"," (или ",[150,4363,147],{},"), чтобы ничего не скрыть.\nПоле, метод или событие игры, названные словами движка, получают слова\nигрока: ",[150,4366,4367],{},"player.account",[150,4369,4370],{},"player.money",[150,4372,4373],{},"player.authid"," —\n",[150,4376,4377],{},"player.steamId",[150,4379,4380],{},"game.numCtWins",[150,4382,4383],{},"game.ctWins",[150,4385,4386],{},"weapon.inReload",[150,4388,4389],{},"weapon.isReloading",", событие\n",[150,4392,4393],{},"restartRound",[150,4395,4396],{},"newRound",", а класс события следует за его именем. Значение\nсчитается игроком, оружием или игрой там, где файл это говорит, —\n",[150,4399,4400],{},"event.player",", аннотация ",[150,4403,4404],{},"Player",[150,4406,4407],{},"Client",[150,4409,4410],{},"Weapon",[150,4412,4413],{},"{ player }"," из события\nили команды, первый параметр обработчика команды, элемент ",[150,4416,4341],{},[150,4418,4419],{},"player.activeItem",[150,4421,4422],{},"game",". В список,\nчтобы поправить руками, выводятся: старое имя у любого другого значения, поля,\nзаписанные не литералами, и поле или событие, которых в API нет, — до них\nпо-прежнему достают нативы ",[150,4425,4233],{},[150,4427,4428],{},"get_member",[150,4430,4431],{},"RegisterHookChain","). Игрок теста тоже заходит со ",[150,4434,4435],{},"steamId",":\n",[150,4438,4439],{},"server.join(\"Alice\", { authid })",[150,4441,4442],{},"server.join(\"Alice\", { steamId: authid })",[147,4444,4445,4446,4450,4451,4271,4454,869,4457,3910,4460,1270,4463,3910,4466,4469,4470,4473,4474,4436,4476,4271,4479,4482,4483,869,4486,4489,4490,4493,4494,847,4497,4500,4501,3903,4504,869,4507,4374,4510,869,4513,4374,4516,869,4519,3910,4522,3437,4525,4374,4528,4531,4532,3433,4535,4538,4539,869,4542,1270,4545,567,4548,1833],{},"Событие сервера называется словами автора плагина\n(",[340,4447,4449],{"href":4448},"\u002Fru\u002Fdocs\u002Fcore\u002Fplugin#%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0","события сервера","):\n",[150,4452,4453],{},"server.addEventListener(\"putinserver\", ...)",[150,4455,4456],{},"server.addEventListener(\"putInServer\", ...)",[150,4458,4459],{},"\"cfg\"",[150,4461,4462],{},"\"pluginsLoaded\"",[150,4464,4465],{},"\"kill\"",[150,4467,4468],{},"\"suicide\"",", а собственное имя форварда (",[150,4471,4472],{},"\"client_putinserver\"",") —\nименем события. Событие, которое есть событие игры, слушается через ",[150,4475,4422],{},[150,4477,4478],{},"server.addEventListener(\"PreThink\", ...)",[150,4480,4481],{},"game.addEventListener(\"preThink\", ...)",", так же ",[150,4484,4485],{},"\"PostThink\"",[150,4487,4488],{},"\"pfnTouch\"","\n(",[150,4491,4492],{},"\"touch\"",") и ",[150,4495,4496],{},"\"infochanged\"",[150,4498,4499],{},"\"userInfoChange\"","). Поле события, названное\nпо параметру Pawn, получает слово автора там, где файл говорит, какое это\nсобытие, — в обработчике или у параметра с классом события:\n",[150,4502,4503],{},"event.weapon_entity",[150,4505,4506],{},"event.weapon",[150,4508,4509],{},"event.authid",[150,4511,4512],{},"event.steamId",[150,4514,4515],{},"event.tracehandle",[150,4517,4518],{},"event.trace",[150,4520,4521],{},"event.infobuffer",[150,4523,4524],{},"event.info",[150,4526,4527],{},"({ dir })",[150,4529,4530],{},"({ direction: dir })",". В список на ручную правку попадают ",[150,4533,4534],{},"\"CS_OnBuy\"",[150,4536,4537],{},"\"CS_OnBuyAttempt\""," модуля cstrike: это события игры ",[150,4540,4541],{},"buyWeapon",[150,4543,4544],{},"buyItem",[150,4546,4547],{},"buyAmmo",[150,4549,4550],{},"itemRestricted",[147,4552,4553,4554,4450,4557,4271,4560,3437,4563,4374,4566,4569],{},"Сообщение игры слушается своим методом, по имени в словах игрока\n(",[340,4555,4556],{"href":89},"сообщения",[150,4558,4559],{},"server.addEventListener(\"message:DeathMsg\", ...)",[150,4561,4562],{},"server.addMessageListener(\"death\", ...)",[150,4564,4565],{},"removeEventListener",[150,4567,4568],{},"removeMessageListener",". Имя сообщения, которого у игры нет, выводится в\nсписок.",[147,4571,4572,4573,4450,4576,4271,4579,869,4582,4374,4585,4588,4589,567,4592,4595,4596,869,4599,2711,4602,4605,4606,4609,4610,1270,4612,869,4615,4618,4619,1270,4622,4625],{},"Имя флага — lowerCamelCase (",[340,4574,4575],{"href":81},"флаги",[150,4577,4578],{},"player.buttons.includes(\"Jump\")",[150,4580,4581],{},"player.buttons.includes(\"jump\")",[150,4583,4584],{},"{ access: \"Kick\" }",[150,4586,4587],{},"{ access: \"kick\" }",". Строка считается флагом там, где файл это говорит:\nона присваивается свойству-флагу или опциям ",[150,4590,4591],{},"buttons",[150,4593,4594],{},"access",", передаётся\nв ",[150,4597,4598],{},"includes",[150,4600,4601],{},"push",[150,4603,4604],{},"concat"," такого свойства или в\n",[150,4607,4608],{},"player.screen.hideHud",", сравнивается с его элементом — в его ",[150,4611,4345],{},[150,4613,4614],{},"for of",[150,4616,4617],{},"switch"," — или хранится в имени флагового типа (",[150,4620,4621],{},"Button",[150,4623,4624],{},"HideHud[]","). Имя, переданное туда, где ждут флаги, прослеживается до\nсписка, с которым оно объявлено; то, чего файл не говорит, — параметр без\nтипа, импорт, результат функции — выводится в список.",[311,4627,483],{"id":483},[163,4629,4630,4644,4657,4670],{"sync":165},[167,4631,4633],{"className":169,"code":4632,"filename":171,"language":172,"meta":173,"style":173},"npx amxts info\n",[150,4634,4635],{"__ignoreMap":173},[177,4636,4637,4639,4641],{"class":179,"line":180},[177,4638,184],{"class":183},[177,4640,188],{"class":187},[177,4642,4643],{"class":187}," info\n",[167,4645,4647],{"className":169,"code":4646,"filename":206,"language":172,"meta":173,"style":173},"pnpm amxts info\n",[150,4648,4649],{"__ignoreMap":173},[177,4650,4651,4653,4655],{"class":179,"line":180},[177,4652,206],{"class":183},[177,4654,188],{"class":187},[177,4656,4643],{"class":187},[167,4658,4660],{"className":169,"code":4659,"filename":226,"language":172,"meta":173,"style":173},"yarn amxts info\n",[150,4661,4662],{"__ignoreMap":173},[177,4663,4664,4666,4668],{"class":179,"line":180},[177,4665,226],{"class":183},[177,4667,188],{"class":187},[177,4669,4643],{"class":187},[167,4671,4673],{"className":169,"code":4672,"filename":246,"language":172,"meta":173,"style":173},"bunx amxts info\n",[150,4674,4675],{"__ignoreMap":173},[177,4676,4677,4679,4681],{"class":179,"line":180},[177,4678,253],{"class":183},[177,4680,188],{"class":187},[177,4682,4643],{"class":187},[147,4684,4685,4686,4688],{},"Всё, что нужно для отчёта об ошибке: система, Node, Bun, менеджер пакетов,\nкоманда, ядро и его компиляторы, модули проекта, ",[150,4687,809],{}," и система,\nпод которую компилируются плагины.",[167,4690,4693],{"className":4691,"code":4692,"language":300},[298],"amxts info - paste this into a bug report\n\n  Operating system  Windows 10.0.19045 (x64)\n  Node.js           24.18.0\n  Bun               1.4.2\n  Package manager   npm 11.16.0\n  @amxts\u002Fcli        0.2.0\n  @amxts\u002Fcore       0.2.0\n  AssemblyScript    0.28.20 + amxts patch\n  WAMR              2.4.5 + amxts patch, wamrc found\n  Project           my-server\n  Modules           @amxts\u002Fmenu-core 0.2.0\n  AMXTS_SERVER      D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts\n  Server system     Windows (hlds.exe)\n  AMXTS_DOCS_LANG   en\n",[150,4694,4692],{"__ignoreMap":173},[4696,4697,4698],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":173,"searchDepth":927,"depth":1209,"links":4700},[4701,4702,4706,4707,4710,4711,4712,4713,4714,4715,4718],{"id":313,"depth":927,"text":314},{"id":283,"depth":927,"text":283,"children":4703},[4704,4705],{"id":1397,"depth":1209,"text":1398},{"id":1836,"depth":1209,"text":1837},{"id":361,"depth":927,"text":361},{"id":374,"depth":927,"text":374,"children":4708},[4709],{"id":2694,"depth":1209,"text":2695},{"id":390,"depth":927,"text":390},{"id":407,"depth":927,"text":407},{"id":420,"depth":927,"text":420},{"id":440,"depth":927,"text":440},{"id":453,"depth":927,"text":453},{"id":470,"depth":927,"text":3577,"children":4716,"since":3581},[4717],{"id":3935,"depth":1209,"text":3930},{"id":483,"depth":927,"text":483},"amxts — команда, которой пользуется проект: создаёт проекты и модули,\nдобавляет модули, собирает, выкладывает, проверяет типы и запускает тесты.\nЭто пакет @amxts\u002Fcli, от которого зависит @amxts\u002Fcore, поэтому она есть\nв каждом проекте и проект запускает её через свой менеджер пакетов:","md",{},{"title":19},{"title":142,"description":4719},"VFnG0mNGh0x8sCWXrKDzcRnqqba6LPDXSj0id9Lnvmk",[4726,4728],{"title":15,"path":16,"stem":17,"description":4727,"children":-1},"amxts запускает плагины для Counter-Strike 1.6, написанные на TypeScript,\nвнутри AMX Mod X, рядом с вашими плагинами на Pawn. Плагин — обычный файл\n.ts: игроки — объекты, у событий есть типы, а редактор знает каждое поле\nигры. На этой странице — проект, первый плагин, как перезагружать его во\nвремя работы и чем язык отличается от привычного TypeScript.",{"title":23,"path":24,"stem":25,"description":4729,"children":-1},"Чтобы игровой сервер запускал плагины amxts, на нём нужны две вещи: модуль\namxts_amxx и папка addons\u002Famxts с плагинами. На этой странице — как\nпоставить их на свой сервер. Другой путь —\nсервер в Docker, в котором всё это уже есть.",null,1791273260180]