[{"data":1,"prerenderedAt":1297},["ShallowReactive",2],{"navigation-docs_ru":3,"\u002Fru\u002Fdocs\u002Fgetting-started\u002Finstall":140,"\u002Fru\u002Fdocs\u002Fgetting-started\u002Finstall-surround":1291,"\u002Fru\u002Fdocs\u002Fgetting-started\u002Finstall-current":1296},[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":23,"body":142,"description":1285,"extension":1286,"meta":1287,"navigation":1288,"path":24,"seo":1289,"stem":25,"__hash__":1290},"docs_ru\u002Fru\u002Fdocs\u002F1.getting-started\u002F04.install.md",{"type":143,"value":144,"toc":1267},"minimark",[145,163,168,270,373,377,380,433,447,454,464,478,482,533,536,542,548,554,561,569,572,643,668,672,713,731,744,749,774,778,794,800,825,852,857,870,887,909,935,939,959,988,1004,1008,1023,1029,1035,1058,1071,1088,1108,1112,1199,1203,1219,1250,1263],[146,147,148,149,153,154,157,158,162],"p",{},"Чтобы игровой сервер запускал плагины amxts, на нём нужны две вещи: модуль\n",[150,151,152],"code",{},"amxts_amxx"," и папка ",[150,155,156],{},"addons\u002Famxts"," с плагинами. На этой странице — как\nпоставить их на свой сервер. Другой путь —\n",[159,160,161],"a",{"href":28},"сервер в Docker",", в котором всё это уже есть.",[164,165,167],"h2",{"id":166},"что-нужно-серверу","Что нужно серверу",[169,170,171,179,203,256],"ul",{},[172,173,174,178],"li",{},[175,176,177],"strong",{},"Counter-Strike 1.6 на HLDS, Windows или Linux."," Рекомендуем ReHLDS.",[172,180,181,184,185,188,189,188,192,188,195,198,199,202],{},[175,182,183],{},"Metamod и AMX Mod X 1.9 или новее"," с модулями самого AMX Mod X\n",[150,186,187],{},"engine",", ",[150,190,191],{},"fakemeta",[150,193,194],{},"hamsandwich",[150,196,197],{},"cstrike"," и ",[150,200,201],{},"fun",". amxts проверяется\nна AMX Mod X 1.10 с Metamod-R.",[172,204,205,208,209,212,213,216,217,188,220,223,224,188,226,228,229,198,231,233,234,238,239,242,243,246,247,250,251,255],{},[175,206,207],{},"ReGameDLL и ReAPI"," — для всех ",[159,210,211],{"href":47},"событий игры",",\nкоторые есть только у ReGameDLL и ReHLDS, в том виде, в каком их поднимает\nигра, и для полей правил игры, которые добавляет ReGameDLL. Без них плагин\nпишется так же: свойства сущностей\n(",[159,214,215],{"href":69},"игроки и сущности",") и действия с игроком\n(",[150,218,219],{},"give",[150,221,222],{},"respawn",", …) работают через модули AMX Mod X ",[150,225,201],{},[150,227,197],{},",\n",[150,230,194],{},[150,232,191],{},", и большинство событий игры слышно через них\nже, некоторые — не целиком\n(",[159,235,237],{"href":236},"\u002Fru\u002Fdocs\u002Fcore\u002Fhooks#%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%B1%D0%B5%D0%B7-reapi","сервер без ReAPI","). Плагин\nспрашивает об этом через ",[150,240,241],{},"hasModule(\"reapi\")",". Проект для такого сервера\nпишет ",[150,244,245],{},"target: \"hlds\""," в ",[150,248,249],{},"amxts.config.ts","\n(",[159,252,254],{"href":253},"\u002Fru\u002Fdocs\u002Fgetting-started\u002Fcli#include-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0","include сервера","), и обработчик события,\nкоторое там никто не слышит, не собирается.",[172,257,258,265,266,269],{},[175,259,260,261,264],{},"Для плагинов ",[150,262,263],{},".ts",", которые компилирует сервер:"," 64-битная система —\nWindows x64 или Linux x86-64 с glibc 2.27 или новее. 32-битный\n",[150,267,268],{},"hlds_linux"," работает на ней как есть. Серверу, который только запускает\nплагины, собранные в другом месте, это не нужно.",[271,272,273,282],"warning",{},[146,274,275,278,281],{},[175,276,277],{},"Оригинальный HLDS",[279,280],"br",{},"\nНа HLDS от Valve — Metamod и AMX Mod X, без ReHLDS, ReGameDLL и ReAPI;\nпроверено на Linux с metamod-p — события, которые есть только у ReGameDLL и\nReHLDS, слышны через собственные модули AMX Mod X, так, как их слышит там\nплагин на Pawn. Чего нет:",[169,283,284,312,323,357],{},[172,285,286,287,188,290,293,294,228,297,300,301,188,304,307,308,311],{},"событий, которые там никто не слышит, — вопросов правил игры\n(",[150,288,289],{},"fallDamage",[150,291,292],{},"canHaveItem",", …), движения игрока (",[150,295,296],{},"jumpMovement",[150,298,299],{},"move",", …), собственных событий движка (",[150,302,303],{},"printf",[150,305,306],{},"addResource",", …),\n",[150,309,310],{},"giveDefaultItems"," и взрывов гранат: обработчик такого события не\nвызывается никогда, и консоль сервера говорит об этом один раз, когда его\nдобавляют;",[172,313,314,315,318,319,322],{},"того, чего не могут дать некоторые из слышных, — большинство приходит,\nкогда игра уже сделала своё, и ",[150,316,317],{},"preventDefault()"," и запись поля там ничего\nне делают, а у некоторых нет какого-то поля: это перечислено в\n",[159,320,321],{"href":236},"событиях игры",", и просьба об этом —\nодна строка в консоли;",[172,324,325,326,188,329,188,332,228,335,198,338,341,342,345,346,198,349,352,353,356],{},"полей правил игры ",[150,327,328],{},"teamBalanced",[150,330,331],{},"neededPlayers",[150,333,334],{},"skipShowMenu",[150,336,337],{},"escapeRatio",[150,339,340],{},"updateInterval",": они читаются как ",[150,343,344],{},"0"," и не записываются, о\nчём сказано один раз; ",[150,347,348],{},"timeLimit",[150,350,351],{},"gameStartTime"," считаются из\n",[150,354,355],{},"mp_timelimit",";",[172,358,359,360,188,363,188,366,369,370,372],{},"собственных нативов ReAPI (",[150,361,362],{},"get_entvar",[150,364,365],{},"get_member",[150,367,368],{},"rg_*","): вызов\nничего не делает и отвечает ",[150,371,344],{},", о чём сказано один раз для каждого натива.",[164,374,376],{"id":375},"серверный-набор","Серверный набор",[146,378,379],{},"Набор — один архив на систему, в нём всё, что ставится на сервер:",[381,382,383,399],"table",{},[384,385,386],"thead",{},[387,388,389,393,396],"tr",{},[390,391,392],"th",{},"система",[390,394,395],{},"архив",[390,397,398],{},"модуль",[400,401,402,418],"tbody",{},[387,403,404,408,413],{},[405,406,407],"td",{},"Windows",[405,409,410],{},[150,411,412],{},"amxts-server-windows-x64.zip",[405,414,415],{},[150,416,417],{},"amxts_amxx.dll",[387,419,420,423,428],{},[405,421,422],{},"Linux",[405,424,425],{},[150,426,427],{},"amxts-server-linux-x64.tar.gz",[405,429,430],{},[150,431,432],{},"amxts_amxx_i386.so",[146,434,435,436,442,443,446],{},"Скачайте его из ",[159,437,441],{"href":438,"rel":439},"https:\u002F\u002Fgithub.com\u002Famxts\u002Famxts\u002Freleases",[440],"nofollow","выпусков",": той же\nверсии, что ",[150,444,445],{},"@amxts\u002Fcore"," в ваших проектах.",[146,448,449,450,453],{},"Что внутри — так, как оно ложится в папку игры (",[150,451,452],{},"cstrike\u002F","):",[455,456,461],"pre",{"className":457,"code":459,"language":460},[458],"language-text","addons\u002F\n├── amxmodx\u002F\n│   ├── modules\u002Famxts_amxx.dll          на Linux — amxts_amxx_i386.so\n│   └── scripting\u002Finclude\u002Famxts.inc     для плагинов на Pawn: поля, которые плагины добавляют Player\n└── amxts\u002F\n    ├── plugins.ini                     список плагинов amxts: hello.ts\n    ├── plugins\u002F                        ваши плагины, а рядом с ними:\n    │   ├── hello.ts                    плагин-пример\n    │   ├── facade.ts, natives.ts, …    API, которым пользуется плагин\n    │   ├── imports.d.ts                чем плагин пользуется без импорта, для редактора\n    │   ├── tsconfig.json               для редактора, открытого на этой папке\n    │   └── .assemblyscript\u002F            типы, на которые указывает tsconfig.json\n    ├── build\u002F                          куда сервер компилирует плагины .ts\n    └── tools\u002F                          компилятор: amxts-compile, wamrc, natives.txt, licenses\u002F\nREADME.txt\n","text",[150,462,459],{"__ignoreMap":463},"",[146,465,466,469,470,473,474,477],{},[150,467,468],{},"tools\u002F"," — для своей системы: на Windows это ",[150,471,472],{},"amxts-compile.exe"," и\n",[150,475,476],{},"wamrc.exe",". Если при загрузке на Linux у файлов пропал бит исполнения —\nничего страшного: модуль ставит его заново перед запуском.",[164,479,481],{"id":480},"установка","Установка",[483,484,485,495,530],"ol",{},[172,486,487,488,491,492,494],{},"Скопируйте ",[150,489,490],{},"addons\u002F"," из набора поверх ",[150,493,490],{}," в папке игры.",[172,496,497,498,501,502,505,506,512,514,515,517,518,520,521,524,525,529],{},"Добавьте модуль в ",[150,499,500],{},"addons\u002Famxmodx\u002Fconfigs\u002Fmodules.ini",", рядом с ",[150,503,504],{},"reapi"," —\nили одной строкой на обычном HLDS:",[455,507,510],{"className":508,"code":509,"language":460},[458],"reapi\namxts_amxx\n",[150,511,509],{"__ignoreMap":463},[279,513],{},"AMX Mod X находит ",[150,516,417],{}," или ",[150,519,432],{}," по этому\nимени. В ",[150,522,523],{},"plugins.ini"," строка не нужна: что нужно модулю, он загружает\nсам (",[159,526,528],{"href":527},"#%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD-%D1%85%D0%BE%D1%81%D1%82","плагин-хост",").",[172,531,532],{},"Запустите сервер или перезапустите, если он работает.",[146,534,535],{},"При первом запуске сервер компилирует пример и загружает его. В консоли:",[455,537,540],{"className":538,"code":539,"language":460},[458],"[amxts] compiling ...\u002Faddons\u002Famxts\u002Fplugins\u002Fhello.ts\n[amxts] compiler exited with 0\n[amxts] loaded hello.ts\n",[150,541,539],{"__ignoreMap":463},[146,543,544,547],{},[150,545,546],{},"amxts_plugins"," в консоли сервера показывает плагины и что с каждым из них,\nи сколько обработчиков, которые модуль одалживает плагинам, — для команд,\nтаймеров и событий игры, — занято:",[455,549,552],{"className":550,"code":551,"language":460},[458],"[amxts] 1 plugin(s): 1 running, 0 unloaded, 0 refused; 2 of 512 callback slots in use\n  hello.ts  running   Hello 1.0.0  by you - An example to edit\n",[150,553,551],{"__ignoreMap":463},[146,555,556,557,560],{},"Зайдите на сервер и напишите в чат ",[150,558,559],{},"\u002Fhp"," — пример ответит.",[164,562,564,565],{"id":563},"обновление","Обновление ",[566,567],"since",{"v":568},"0.2",[146,570,571],{},"Сервер, на который выкладывает проект, обновляется из проекта:",[573,574,576,600,614,628],"code-group",{"sync":575},"pm",[455,577,582],{"className":578,"code":579,"filename":580,"language":581,"meta":463,"style":463},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx amxts upgrade\n","npm","sh",[150,583,584],{"__ignoreMap":463},[585,586,589,593,597],"span",{"class":587,"line":588},"line",1,[585,590,592],{"class":591},"sBMFI","npx",[585,594,596],{"class":595},"sfazB"," amxts",[585,598,599],{"class":595}," upgrade\n",[455,601,604],{"className":578,"code":602,"filename":603,"language":581,"meta":463,"style":463},"pnpm amxts upgrade\n","pnpm",[150,605,606],{"__ignoreMap":463},[585,607,608,610,612],{"class":587,"line":588},[585,609,603],{"class":591},[585,611,596],{"class":595},[585,613,599],{"class":595},[455,615,618],{"className":578,"code":616,"filename":617,"language":581,"meta":463,"style":463},"yarn amxts upgrade\n","yarn",[150,619,620],{"__ignoreMap":463},[585,621,622,624,626],{"class":587,"line":588},[585,623,617],{"class":591},[585,625,596],{"class":595},[585,627,599],{"class":595},[455,629,632],{"className":578,"code":630,"filename":631,"language":581,"meta":463,"style":463},"bunx amxts upgrade\n","bun",[150,633,634],{"__ignoreMap":463},[585,635,636,639,641],{"class":587,"line":588},[585,637,638],{"class":591},"bunx",[585,640,596],{"class":595},[585,642,599],{"class":595},[146,644,645,646,650,651,654,655,658,659,662,663,667],{},"Вместе с пакетами и кодом проекта (",[159,647,649],{"href":648},"\u002Fru\u002Fdocs\u002Fgetting-started\u002Fcli#upgrade","upgrade",") команда\nкладёт модуль нового выпуска в ",[150,652,653],{},"addons\u002Famxmodx\u002Fmodules\u002F"," — и компилятор в\n",[150,656,657],{},"addons\u002Famxts\u002Ftools\u002F",", если он есть на сервере, — оставляя каждый старый файл\nрядом с его версией (",[150,660,661],{},"amxts_amxx.dll.0.1.0","). Перезапустите сервер, чтобы\nзагрузить новый модуль. Сервер без проекта берёт набор нового выпуска, как\nпри ",[159,664,666],{"href":665},"#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0","установке",".",[164,669,671],{"id":670},"что-пишет-модуль","Что пишет модуль",[146,673,674,675,677,678,228,681,198,684,687,688,188,691,188,694,697,698,473,701,246,704,188,707,246,710,712],{},"При каждом запуске модуль раскладывает ",[150,676,156],{},": папки ",[150,679,680],{},"plugins",[150,682,683],{},"build",[150,685,686],{},"tools"," и файлы, с которыми он запускает плагины, — API ядра\n(",[150,689,690],{},"facade.ts",[150,692,693],{},"natives.ts",[150,695,696],{},"constants.ts"," и остальные), ",[150,699,700],{},"imports.d.ts",[150,702,703],{},"tsconfig.json",[150,705,706],{},"plugins\u002F",[150,708,709],{},"natives.txt",[150,711,468],{},". Их он переписывает\nкаждый раз: они принадлежат модулю, и правка в них пропадёт.",[146,714,715,198,718,720,721,723,724,726,727,730],{},[150,716,717],{},"hello.ts",[150,719,523],{}," (с ",[150,722,717],{},") он пишет, только когда их нет, и\nдальше не трогает: они ваши. Поэтому пример появится и на сервере, где есть\nтолько модуль, — но чтобы его скомпилировать, нужна ",[150,725,468],{}," из набора. Без\nнеё консоль скажет\n",[150,728,729],{},"amxts-compile is missing - a .ts plugin needs the compiler beside the module",", и сервер будет запускать только плагины, собранные в другом месте.",[271,732,733],{},[146,734,735,738,740,741,667],{},[175,736,737],{},"Один набор — один модуль",[279,739],{},"\nМодуль и остальные файлы набора — из одной сборки. Новый модуль ставьте на\nсервер вместе с остальным его набором: компилятор или файл API\nиз другой сборки делают плагины, которые не загрузятся. Компилятор другой\nсборки ничего не компилирует, а консоль называет обе сборки:\n",[150,742,743],{},"...\u002Fplugins\u002Fhello.ts is not compiled: amxts-compile is 0.1.0+5f1c2a9e07, the module 0.2.0+1bf291c0ab - take both from the same release",[164,745,746,747],{"id":528},"Плагин-хост ",[566,748],{"v":568},[146,750,751,752,755,756,759,760,763,764,766,767,769,770,773],{},"До AMX Mod X — его нативов, его форвардов, нативов, которые регистрируют\nплагины на Pawn, — модуль дотягивается через свой плагин, ",[150,753,754],{},"amxts_host.amxx",",\nкоторый носит в себе. При каждом запуске он пишет этот плагин в\n",[150,757,758],{},"addons\u002Famxmodx\u002Fplugins\u002F"," и называет его в\n",[150,761,762],{},"addons\u002Famxmodx\u002Fconfigs\u002Fplugins-amxts.ini"," — списке, который AMX Mod X\nчитает после ",[150,765,523],{},"; когда сервер останавливается, модуль удаляет\nоба. Поэтому хост загружается после плагинов на Pawn из ",[150,768,523],{},", а\n",[150,771,772],{},"amxx plugins"," показывает его среди них — все плагины amxts работают внутри\nнего. Ни тот, ни другой файл не правят и никуда не копируют: они\nпринадлежат модулю.",[164,775,777],{"id":776},"плагины","Плагины",[146,779,780,783,784,787,788,517,790,793],{},[150,781,782],{},"addons\u002Famxts\u002Fplugins.ini"," перечисляет плагины, которые запускает сервер, —\nпо одному файлу из ",[150,785,786],{},"addons\u002Famxts\u002Fplugins\u002F"," на строку, в порядке загрузки.\nСтрока, которая начинается с ",[150,789,356],{},[150,791,792],{},"#",", пропускается.",[455,795,798],{"className":796,"code":797,"language":460},[458],"; One plugin per line, as a file in plugins\u002F.\n; A .ts is compiled by the server; a .aot is loaded as it is.\nmyplugin.aot\nhello.ts\n",[150,799,797],{"__ignoreMap":463},[169,801,802,814],{},[172,803,804,809,810,529],{},[175,805,806],{},[150,807,808],{},".aot"," — плагин, собранный в проекте; загружается как есть. Он собран\nпод систему сервера: собранный для Windows на Linux не загрузится\n(",[159,811,813],{"href":812},"\u002Fru\u002Fdocs\u002Fgetting-started\u002Fcli#%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","система сервера",[172,815,816,820,821,824],{},[175,817,818],{},[150,819,263],{}," сервер компилирует в ",[150,822,823],{},"addons\u002Famxts\u002Fbuild\u002F\u003Cимя>.aot"," и\nкомпилирует снова, только когда исходник новее или когда сборка там\nсделана другой версией amxts.",[271,826,827],{},[146,828,829,832,834,836,837,840,841,844,845,848,849,851],{},[175,830,831],{},"Плагин собран под одну версию amxts",[279,833],{},[150,835,808],{}," помнит, какой версией amxts он собран, и модуль загружает только\nплагины, собранные под него самого: плагин другого выпуска обращался бы к\nмодулю так, как тот уже не принимает. Такой плагин не загружается, остальные\nзагружаются, а консоль говорит, какой собрать заново:\n",[150,838,839],{},"[amxts] myplugin.aot was built for amxts 0.1.0, this is 0.2.0 - build it again","\n(или ",[150,842,843],{},"was built for an older amxts","). Обновив модуль, соберите проект заново\nи выложите его (",[150,846,847],{},"npx amxts build --deploy","); ",[150,850,263],{}," на сервере\nперекомпилируется сам.",[853,854,856],"h3",{"id":855},"из-проекта","Из проекта",[146,858,859,860,862,863,246,866,869],{},"Проект выкладывается в папку ",[150,861,156],{}," сервера, которую называет\n",[150,864,865],{},"AMXTS_SERVER",[150,867,868],{},".env"," проекта:",[455,871,873],{"className":578,"code":872,"language":581,"meta":463,"style":463},"AMXTS_SERVER=D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts\n",[150,874,875],{"__ignoreMap":463},[585,876,877,880,884],{"class":587,"line":588},[585,878,865],{"class":879},"sTEyZ",[585,881,883],{"class":882},"sMK4o","=",[585,885,886],{"class":595},"D:\u002Fhlds\u002Fcstrike\u002Faddons\u002Famxts\n",[146,888,889,890,893,894,896,897,900,901,904,905,908],{},"Подойдёт и папка самого сервера (",[150,891,892],{},"D:\u002Fhlds","), его ",[150,895,197],{}," или\n",[150,898,899],{},"cstrike\u002Faddons",": сборка берёт ",[150,902,903],{},"cstrike\u002Faddons\u002Famxts"," внутри неё и называет\nвыбранную папку в строке ",[150,906,907],{},"Server"," своего заголовка. Папка, которая не подходит\nни под один вариант, останавливает сборку одной строкой о том, где она искала.",[146,910,911,913,914,916,917,919,920,922,923,926,927,930,931,529],{},[150,912,847],{}," копирует собранные ",[150,915,808],{}," в\n",[150,918,786],{}," и пишет ",[150,921,782],{},": сначала модули,\nпотом плагины проекта, а после них — все строки, которых сборка не знает.\nInclude плагина, который экспортирует нативы, тоже копируется — в\n",[150,924,925],{},"addons\u002Famxmodx\u002Fscripting\u002Finclude\u002F",", для плагинов на Pawn, которые\nкомпилируются на сервере. ",[150,928,929],{},"npx amxts dev"," делает это при каждом сохранении и\nперезагружает сервер через rcon\n(",[159,932,934],{"href":933},"\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","горячая перезагрузка",[853,936,938],{"id":937},"написанные-на-сервере","Написанные на сервере",[146,940,941,942,944,945,947,948,950,951,954,955,958],{},"Файлу ",[150,943,263],{}," проект не нужен: положите его в ",[150,946,786],{},",\nвпишите в ",[150,949,523],{}," и загрузите через ",[150,952,953],{},"amxts_reload"," или со следующей\nкартой. Дальше каждое сохранение снова компилирует и перезагружает его.\nОшибка компиляции идёт в консоль сервера и в\n",[150,956,957],{},"addons\u002Famxts\u002Fbuild\u002Fcompile.log","; за плагином, который не собрался, тоже\nследят, так что загружает его сохранение исправления.",[146,960,961,962,966,967,188,970,188,973,976,977,980,981,984,985,987],{},"Такой плагин пользуется тем, что лежит в его папке: API ядра — без импорта,\nкак в проекте (",[159,963,965],{"href":964},"\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","автоимпорты","), а\n",[150,968,969],{},"@amxts\u002Fcore\u002Fnatives",[150,971,972],{},"@amxts\u002Fcore\u002Fconstants",[150,974,975],{},"@amxts\u002Fcore\u002Ffs"," и вашими собственными файлами —\nчерез импорт. Пакет\nмодуля, например ",[150,978,979],{},"@amxts\u002Fmenu-core",", — для плагинов, собранных в проекте. В\nредакторе открывайте саму ",[150,982,983],{},"addons\u002Famxts\u002Fplugins",", а не корень сервера: её\n",[150,986,703],{}," и говорит редактору о типах.",[271,989,990],{},[146,991,992,995,997,998,1000,1001,1003],{},[175,993,994],{},"Компиляция задерживает сервер",[279,996],{},"\nПока сервер компилирует плагин ",[150,999,263],{},", он ждёт — секунду-две. При смене карты\nэтого никто не заметит; посреди раунда игра на это время замрёт. На сервер,\nгде играют, выкладывайте ",[150,1002,808],{},", собранные в проекте.",[853,1005,1007],{"id":1006},"перезагрузка","Перезагрузка",[146,1009,1010,1011,1013,1014,1016,1017,1019,1020,1022],{},"Модуль проверяет плагины десять раз в секунду. ",[150,1012,808],{},", записанный заново\nпосле загрузки, или ",[150,1015,263],{},", сохранённый и скомпилированный без ошибок,\nперезапускает все плагины amxts с диска — без смены карты и без команды.\n",[150,1018,953],{}," делает то же вручную. Перезапуск заново читает ",[150,1021,523],{},",\nтак что плагин, добавленный в список, загружается со следующим.",[853,1024,1026,1027],{"id":1025},"один-плагин","Один плагин ",[566,1028],{"v":568},[455,1030,1033],{"className":1031,"code":1032,"language":460},[458],"amxts_unload shop       \u002F\u002F останавливает shop.ts\namxts_load shop         \u002F\u002F запускает его снова\namxts_reload shop       \u002F\u002F перезапускает с диска, перекомпилировав, если его .ts изменился\namxts_load arena.ts     \u002F\u002F файл из plugins\u002F, которого нет в списке, — до смены карты\n",[150,1034,1032],{"__ignoreMap":463},[146,1036,1037,1038,1040,1041,517,1043,1045,1046,1049,1050,1053,1054,1057],{},"Плагин называют его строкой в ",[150,1039,523],{},", с ",[150,1042,263],{},[150,1044,808],{}," или без\nних. ",[150,1047,1048],{},"amxts_unload"," останавливает его и забирает всё, что он\nзарегистрировал, — таймеры, команды, события игры, обработчики меню и\nслушателей сообщений, — и плагин остаётся остановленным до ",[150,1051,1052],{},"amxts_load"," или\nследующей карты; перезапуск всех плагинов тоже его не запускает.\n",[150,1055,1056],{},"amxts_reload \u003Cплагин>"," перезапускает только этот плагин, остальные работают\nдальше.",[146,1059,1060,1061,1064,1065,1067,1068,1070],{},"Плагин, чьим ",[159,1062,1063],{"href":117},"общим модулем"," пользуются\nдругие плагины, держит то, что они через него сделали, — меню, функцию,\nкоторую ему передали. Поэтому ",[150,1066,1048],{}," отказывает, пока работает хоть\nодин из них, и называет их: сначала выгрузите их. ",[150,1069,953],{}," такого\nплагина перезапускает их после него.",[146,1072,1073,1075,1076,1079,1080,1083,1084,1087],{},[150,1074,546],{}," показывает каждый плагин как ",[150,1077,1078],{},"running"," (работает),\n",[150,1081,1082],{},"unloaded"," (выгружен) или ",[150,1085,1086],{},"refused"," (отвергнут) с причиной: не\nкомпилируется, собран для другой версии amxts или другой системы, его\nверхний уровень упал.",[271,1089,1090],{},[146,1091,1092,1095,1097,1098,1102,1103,667],{},[175,1093,1094],{},"Плагин начинает заново",[279,1096],{},"\nЗагруженный снова плагин начинает со своего верхнего уровня: то, что он\nдержал в переменных, пропадает. То, что должно его пережить, кладите в\n",[159,1099,1101],{"href":1100},"\u002Fru\u002Fdocs\u002Fgame\u002Fplayers#%D0%BE%D0%B1%D1%89%D0%B8%D0%B5-%D0%BF%D0%BE%D0%BB%D1%8F-%D0%B8%D0%B3%D1%80%D0%BE%D0%BA%D0%B0","общие поля игрока"," или в\n",[159,1104,1105],{"href":99},[150,1106,1107],{},"Storage",[164,1109,1111],{"id":1110},"команды-сервера","Команды сервера",[381,1113,1114,1124],{},[384,1115,1116],{},[387,1117,1118,1121],{},[390,1119,1120],{},"команда",[390,1122,1123],{},"что делает",[400,1125,1126,1142,1154,1163,1176,1189],{},[387,1127,1128,1132],{},[405,1129,1130],{},[150,1131,546],{},[405,1133,1134,1135,188,1137,188,1139,1141],{},"список плагинов: файл, состояние (",[150,1136,1078],{},[150,1138,1082],{},[150,1140,1086],{}," и почему), имя, версия, автор; и сколько слотов обработчиков занято",[387,1143,1144,1148],{},[405,1145,1146],{},[150,1147,953],{},[405,1149,1150,1151,1153],{},"заново читает ",[150,1152,523],{}," и перезапускает все плагины amxts с диска",[387,1155,1156,1160],{},[405,1157,1158],{},[150,1159,1056],{},[405,1161,1162],{},"перезапускает один плагин с диска и плагины, которые пользуются его модулем",[387,1164,1165,1170],{},[405,1166,1167],{},[150,1168,1169],{},"amxts_unload \u003Cплагин>",[405,1171,1172,1173,1175],{},"останавливает плагин и то, что он зарегистрировал, до ",[150,1174,1052],{}," или следующей карты",[387,1177,1178,1183],{},[405,1179,1180],{},[150,1181,1182],{},"amxts_load \u003Cплагин>",[405,1184,1185,1186,1188],{},"запускает остановленный плагин или плагин из ",[150,1187,706],{},", которого нет в списке",[387,1190,1191,1196],{},[405,1192,1193],{},[150,1194,1195],{},"amxts_trace",[405,1197,1198],{},"пишет в лог каждый вызов плагина — чтобы найти, что роняет сервер; повторный вызов выключает",[164,1200,1202],{"id":1201},"другой-список-плагинов","Другой список плагинов",[146,1204,1205,1208,1209,1211,1212,1214,1215,1218],{},[150,1206,1207],{},"+localinfo amxts_plugins \u003Cфайл>"," в командной строке сервера даёт модулю\nдругой список — путь от папки игры. Его плагины — файлы в ",[150,1210,706],{}," рядом с\nэтим списком, а ",[150,1213,263],{}," среди них компилируется в ",[150,1216,1217],{},"build\u002F"," рядом с ним:",[455,1220,1222],{"className":578,"code":1221,"language":581,"meta":463,"style":463},"hlds.exe -game cstrike +localinfo amxts_plugins addons\u002Famxts\u002Fmyserver\u002Fplugins.ini +map de_dust2\n",[150,1223,1224],{"__ignoreMap":463},[585,1225,1226,1229,1232,1235,1238,1241,1244,1247],{"class":587,"line":588},[585,1227,1228],{"class":591},"hlds.exe",[585,1230,1231],{"class":595}," -game",[585,1233,1234],{"class":595}," cstrike",[585,1236,1237],{"class":595}," +localinfo",[585,1239,1240],{"class":595}," amxts_plugins",[585,1242,1243],{"class":595}," addons\u002Famxts\u002Fmyserver\u002Fplugins.ini",[585,1245,1246],{"class":595}," +map",[585,1248,1249],{"class":595}," de_dust2\n",[146,1251,1252,1253,1255,1256,1258,1259,1262],{},"Со своим списком модуль не раскладывает ",[150,1254,156],{},": он запускает этот\nсписок, а остальную установку оставляет как есть. Так\n",[159,1257,161],{"href":28}," запускает ",[150,1260,1261],{},"dist\u002F"," проекта.",[1264,1265,1266],"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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":463,"searchDepth":1268,"depth":1269,"links":1270},2,3,[1271,1272,1273,1274,1275,1276,1277,1283,1284],{"id":166,"depth":1268,"text":167},{"id":375,"depth":1268,"text":376},{"id":480,"depth":1268,"text":481},{"id":563,"depth":1268,"text":564,"since":568},{"id":670,"depth":1268,"text":671},{"id":528,"depth":1268,"text":746,"since":568},{"id":776,"depth":1268,"text":777,"children":1278},[1279,1280,1281,1282],{"id":855,"depth":1269,"text":856},{"id":937,"depth":1269,"text":938},{"id":1006,"depth":1269,"text":1007},{"id":1025,"depth":1269,"text":1026,"since":568},{"id":1110,"depth":1268,"text":1111},{"id":1201,"depth":1268,"text":1202},"Чтобы игровой сервер запускал плагины amxts, на нём нужны две вещи: модуль\namxts_amxx и папка addons\u002Famxts с плагинами. На этой странице — как\nпоставить их на свой сервер. Другой путь —\nсервер в Docker, в котором всё это уже есть.","md",{},true,{"title":23,"description":1285},"63hgcAEeO7n7pZOrc6k9kAH8dN4uZak62Yav31p8tMQ",[1292,1294],{"title":19,"path":20,"stem":21,"description":1293,"children":-1},"amxts — команда, которой пользуется проект: создаёт проекты и модули,\nдобавляет модули, собирает, выкладывает, проверяет типы и запускает тесты.\nЭто пакет @amxts\u002Fcli, от которого зависит @amxts\u002Fcore, поэтому она есть\nв каждом проекте и проект запускает её через свой менеджер пакетов:",{"title":27,"path":28,"stem":29,"description":1295,"children":-1},"ghcr.io\u002Famxts\u002Fserver — образ Docker с сервером Counter-Strike 1.6 на\nLinux, на котором работает amxts: HLDS с ReHLDS, ReGameDLL, Metamod-R, AMX Mod\nX 1.10 и ReAPI, модуль amxts и его компилятор. Ваш проект монтируется в него,\nи сервер запускает ваши плагины с вашими конфигами и файлами — на Windows,\nmacOS или Linux, и ставить не нужно ничего, кроме Docker.",null,1791276257688]