@amxts/core 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +5 -5
  2. package/README.ru.md +5 -5
  3. package/as/amxts.d.ts +13 -3
  4. package/as/entities.ts +571 -501
  5. package/as/events.ts +3323 -557
  6. package/as/facade.ts +3079 -718
  7. package/as/fetch.ts +2 -2
  8. package/as/fs.ts +352 -59
  9. package/as/hlds.ts +121 -120
  10. package/as/hooks.ts +10585 -5177
  11. package/as/lib/check.ts +3 -2
  12. package/as/natives.ts +856 -1272
  13. package/as/promise.ts +37 -27
  14. package/as/vector.ts +94 -14
  15. package/includes/order.txt +17 -19
  16. package/node_modules/assemblyscript/std/assembly/index.d.ts +1 -1
  17. package/package.json +9 -6
  18. package/runtime/deps/assemblyscript/dist/asc.js +136 -42
  19. package/runtime/deps/assemblyscript/dist/assemblyscript.js +141 -141
  20. package/runtime/licenses/README.md +9 -7
  21. package/runtime/licenses/ReGameDLL-LICENSE +21 -0
  22. package/runtime/licenses/ReHLDS-LICENSE +21 -0
  23. package/runtime/licenses/zlib-LICENSE +22 -0
  24. package/runtime/natives.txt +618 -523
  25. package/runtime/patches/README.md +87 -1
  26. package/runtime/patches/assemblyscript-0.28.20-amxts.patch +4838 -416
  27. package/runtime/patches/wamr-2.4.5-amxts.patch +417 -5
  28. package/scripts/auto-imports.ts +1 -1
  29. package/scripts/build-identity.ts +102 -65
  30. package/scripts/build-wasm.ts +12 -12
  31. package/scripts/check.ts +4 -1
  32. package/scripts/client-messages.ts +73 -1
  33. package/scripts/compile-cache.ts +11 -8
  34. package/scripts/compile-pool.ts +6 -3
  35. package/scripts/compile-worker.ts +23 -23
  36. package/scripts/compile.ts +142 -19
  37. package/scripts/docs/as/amxts.ts +10 -4
  38. package/scripts/docs/as/facade.ts +1779 -275
  39. package/scripts/docs/as/fetch.ts +2 -2
  40. package/scripts/docs/as/fs.ts +190 -6
  41. package/scripts/docs/as/vector.ts +81 -0
  42. package/scripts/docs/entities.ts +12 -0
  43. package/scripts/docs/events.ts +49 -13
  44. package/scripts/docs/game.ts +6 -0
  45. package/scripts/docs/messages.ts +10 -1
  46. package/scripts/hlds-events.ts +11 -11
  47. package/scripts/includes.ts +3 -4
  48. package/scripts/leaf-natives.ts +84 -0
  49. package/scripts/player-fields.ts +1 -1
  50. package/scripts/plugin-natives.ts +1 -1
  51. package/scripts/prebuilt.ts +41 -10
  52. package/scripts/project.ts +2 -3
  53. package/scripts/reapi-events.ts +9 -9
  54. package/scripts/server-env.ts +145 -0
  55. package/scripts/shared-modules.ts +23 -7
  56. package/scripts/system.ts +1 -1
  57. package/scripts/tracked-fs.ts +11 -2
  58. package/scripts/typed-commands.ts +153 -15
  59. package/scripts/upgrade-calls.ts +225 -0
  60. package/scripts/upgrade-names.ts +1 -4
  61. package/scripts/upgrade.ts +26 -11
  62. package/src/cli-api.mjs +3 -2
  63. package/src/system.mjs +21 -11
  64. package/src/testing/compile.ts +31 -8
  65. package/src/testing/coroutines.ts +0 -10
  66. package/src/testing/memory.ts +89 -2
  67. package/src/testing/natives.ts +67 -30
  68. package/src/testing/server.ts +1094 -155
  69. package/src/testing/tables.ts +23 -6
  70. package/src/typecheck.mjs +110 -0
  71. package/runtime/licenses/Bun-LICENSE.md +0 -84
@@ -88,12 +88,13 @@ export default {
88
88
  },
89
89
  'publicFor': {
90
90
  en: `
91
- A public name that calls \`handler\`, for an AMX Mod X native that takes a
92
- callback by name: \`register_think\`, \`set_native_filter\`.
91
+ A public name that calls \`handler\`, for what takes a callback by a public's
92
+ name: \`register_menucmd\`, and a plugin's native that calls it back with a
93
+ \`PawnFunction\` (menu-core's \`mc_register_placeholder\`).
93
94
 
94
95
  \`\`\`ts
95
- const pub = publicFor(onThink, "think:myplugin_box");
96
- if (pub.length > 0) register_think("myplugin_box", pub);
96
+ const pub = publicFor(onKey, "menu:myplugin");
97
+ if (pub.length > 0) register_menucmd(register_menuid("myplugin"), 1023, pub);
97
98
  \`\`\`
98
99
 
99
100
  An empty name means “already registered”: such a registration cannot be
@@ -102,17 +103,18 @@ export default {
102
103
  unique within the plugin. \`fallback\` is the answer when the handler returns
103
104
  nothing: \`0\` for most natives, \`1\` where the native expects the event handled.
104
105
 
105
- Register from the \`"pluginsLoaded"\` event, not at the top of the file: a console
106
- command registered that early (\`register_concmd\`, \`register_srvcmd\`) crashes
107
- the server when typed.
106
+ A native of AMX Mod X that finds the public in the calling plugin
107
+ (\`register_think\`, \`set_task\`) cannot take it: a TypeScript plugin's call
108
+ has no Pawn plugin behind it.
108
109
  `,
109
110
  ru: `
110
- Имя паблика, который вызывает \`handler\`, — для натива AMX Mod X,
111
- принимающего колбэк по имени: \`register_think\`, \`set_native_filter\`.
111
+ Имя паблика, который вызывает \`handler\`, — для того, что принимает колбэк
112
+ по имени паблика: \`register_menucmd\` и натив плагина, который вызывает его
113
+ обратно через \`PawnFunction\` (\`mc_register_placeholder\` модуля menu-core).
112
114
 
113
115
  \`\`\`ts
114
- const pub = publicFor(onThink, "think:myplugin_box");
115
- if (pub.length > 0) register_think("myplugin_box", pub);
116
+ const pub = publicFor(onKey, "menu:myplugin");
117
+ if (pub.length > 0) register_menucmd(register_menuid("myplugin"), 1023, pub);
116
118
  \`\`\`
117
119
 
118
120
  Пустое имя значит «уже зарегистрировано»: такую регистрацию нельзя
@@ -121,9 +123,8 @@ export default {
121
123
  имя, уникальное в пределах плагина. \`fallback\` — ответ, если обработчик
122
124
  ничего не вернул: \`0\` почти везде, \`1\` там, где натив ждёт обработанное событие.
123
125
 
124
- Регистрируйте из события \`"pluginsLoaded"\`, а не с верхнего уровня файла: консольная
125
- команда, зарегистрированная так рано (\`register_concmd\`, \`register_srvcmd\`),
126
- роняет сервер, когда её вводят.
126
+ Натив AMX Mod X, который ищет паблик в вызвавшем плагине (\`register_think\`,
127
+ \`set_task\`), его не примет: за вызовом TypeScript-плагина нет Pawn-плагина.
127
128
  `,
128
129
  },
129
130
  'nativeFn': {
@@ -602,7 +603,7 @@ export default {
602
603
 
603
604
  \`\`\`ts
604
605
  server.addEventListener("putInServer", (event) => {
605
- print(event.player, \`Welcome, \${event.player.name}!\`);
606
+ event.player.print(\`Welcome, \${event.player.name}!\`);
606
607
  });
607
608
  \`\`\`
608
609
  `,
@@ -613,7 +614,7 @@ export default {
613
614
 
614
615
  \`\`\`ts
615
616
  server.addEventListener("putInServer", (event) => {
616
- print(event.player, \`Welcome, \${event.player.name}!\`);
617
+ event.player.print(\`Welcome, \${event.player.name}!\`);
617
618
  });
618
619
  \`\`\`
619
620
  `,
@@ -690,6 +691,10 @@ export default {
690
691
  en: `A signal that aborts when the player leaves the server: \`fetch(url, { signal: client.signal })\`.`,
691
692
  ru: `Сигнал, который срабатывает, когда игрок уходит с сервера: \`fetch(url, { signal: client.signal })\`.`,
692
693
  },
694
+ 'Client.print': {
695
+ en: `Sends the player a message, in the chat unless \`variant\` says another place: \`client.print("Welcome!")\`. Colour tags work as in \`player.print\`.`,
696
+ ru: `Отправляет игроку сообщение — в чат, если \`variant\` не называет другое место: \`client.print("Welcome!")\`. Цветовые метки — как в \`player.print\`.`,
697
+ },
693
698
  'Client.command': {
694
699
  en: `Runs a command in the player's console, as if he had typed it: \`client.command("stop")\`.`,
695
700
  ru: `Выполняет команду в консоли игрока, будто он сам её набрал: \`client.command("stop")\`.`,
@@ -1045,27 +1050,29 @@ export default {
1045
1050
  'Player.give': {
1046
1051
  en: `
1047
1052
  Gives the player a weapon or an item: \`player.give("weapon_flashbang")\`.
1048
- \`false\` if the game did not give it.
1053
+ \`false\` if the game did not give it. A name read from a config goes
1054
+ as it is; one the game has no item of is said once in the console.
1049
1055
 
1050
1056
  Pawn: \`rg_give_item\`, \`give_item\`
1051
1057
  `,
1052
1058
  ru: `
1053
1059
  Выдаёт игроку оружие или предмет: \`player.give("weapon_flashbang")\`.
1054
- \`false\`, если игра его не выдала.
1060
+ \`false\`, если игра его не выдала. Имя, прочитанное из конфига, передаётся как
1061
+ есть; о таком, для которого в игре нет предмета, один раз скажет консоль.
1055
1062
 
1056
1063
  Pawn: \`rg_give_item\`, \`give_item\`
1057
1064
  `,
1058
1065
  },
1059
1066
  'Player.removeAllItems': {
1060
1067
  en: `
1061
- Takes all the player's weapons away. The suit (armour, HUD) stays unless
1062
- \`removeSuit\` is \`true\`.
1068
+ Takes all the player's weapons away: \`player.removeAllItems()\`. The
1069
+ suit - armour and the HUD - stays, unless \`{ suit: true }\`.
1063
1070
 
1064
1071
  Pawn: \`rg_remove_all_items\`, \`strip_user_weapons\`
1065
1072
  `,
1066
1073
  ru: `
1067
- Отбирает у игрока всё оружие. Костюм (броня, HUD) остаётся, если
1068
- \`removeSuit\` не \`true\`.
1074
+ Забирает у игрока всё оружие: \`player.removeAllItems()\`. Костюм — броня и
1075
+ HUD — остаётся, если не указано \`{ suit: true }\`.
1069
1076
 
1070
1077
  Pawn: \`rg_remove_all_items\`, \`strip_user_weapons\`
1071
1078
  `,
@@ -1164,18 +1171,68 @@ export default {
1164
1171
  Pawn: \`rg_reset_maxspeed\`
1165
1172
  `,
1166
1173
  },
1174
+ 'Player.print': {
1175
+ en: `
1176
+ Sends the player a message; to everyone, \`server.print\`.
1177
+
1178
+ \`\`\`ts
1179
+ player.print("Health restored!"); // the player's chat
1180
+ player.print("Health restored!", "center"); // the middle of the player's screen
1181
+ server.print("Round starts in 5 seconds"); // everyone's chat
1182
+ \`\`\`
1183
+
1184
+ \`variant\` is where the message shows, one of \`"chat"\` (the default),
1185
+ \`"center"\` - the middle of the screen, \`"console"\` - the player's
1186
+ console, \`"notify"\` - the console too; CS shows it on screen only with
1187
+ \`developer 1\`.
1188
+
1189
+ Colour tags work in chat only, and a letter is the same colour as in a menu:
1190
+ - \`!y\` yellow (the usual chat colour), \`!g\` green
1191
+ - \`!r\` red, \`!b\` blue, \`!d\` grey, \`!t\` the colour of the reader's team
1192
+
1193
+ A menu's own tags (\`!w\`, \`!R\`) are dropped from a chat line. Red, blue,
1194
+ grey and \`!t\` share the message's one team colour: the first one used wins.
1195
+
1196
+ Pawn: \`client_print\`, \`client_print_color\`
1197
+ `,
1198
+ ru: `
1199
+ Отправляет игроку сообщение; всем — \`server.print\`.
1200
+
1201
+ \`\`\`ts
1202
+ player.print("Health restored!"); // чат игрока
1203
+ player.print("Health restored!", "center"); // посередине экрана игрока
1204
+ server.print("Round starts in 5 seconds"); // чат всех игроков
1205
+ \`\`\`
1206
+
1207
+ \`variant\` — где показать сообщение, одно из \`"chat"\` (по умолчанию),
1208
+ \`"center"\` — посередине экрана, \`"console"\` — в консоли игрока,
1209
+ \`"notify"\` — тоже в консоли; на экране CS показывает его только при
1210
+ \`developer 1\`.
1211
+
1212
+ Цветовые метки работают только в чате, и буква — тот же цвет, что в меню:
1213
+ - \`!y\` жёлтый (обычный цвет чата), \`!g\` зелёный
1214
+ - \`!r\` красный, \`!b\` синий, \`!d\` серый, \`!t\` цвет команды читающего
1215
+
1216
+ Метки только для меню (\`!w\`, \`!R\`) из строки чата убираются. Красный, синий,
1217
+ серый и \`!t\` делят один цвет команды на сообщение: побеждает первый.
1218
+
1219
+ Pawn: \`client_print\`, \`client_print_color\`
1220
+ `,
1221
+ },
1167
1222
  'Player.command': {
1168
1223
  en: `
1169
1224
  Runs a command in the player's own console, as if he had typed it:
1170
1225
  \`player.command("messagemode say_team")\`, \`player.command("stop")\`.
1171
- The player's game runs it, not the server.
1226
+ The player's game runs it, not the server. A bot has no game: its
1227
+ command goes to the server as one it sent, \`bot.command("say /hp")\`.
1172
1228
 
1173
1229
  Pawn: \`client_cmd\`
1174
1230
  `,
1175
1231
  ru: `
1176
1232
  Выполняет команду в консоли самого игрока, будто он набрал её сам:
1177
1233
  \`player.command("messagemode say_team")\`, \`player.command("stop")\`.
1178
- Выполняет её игра игрока, а не сервер.
1234
+ Выполняет её игра игрока, а не сервер. У бота игры нет: его команда
1235
+ приходит на сервер, будто он её прислал, \`bot.command("say /hp")\`.
1179
1236
 
1180
1237
  Pawn: \`client_cmd\`
1181
1238
  `,
@@ -1213,16 +1270,20 @@ export default {
1213
1270
  `,
1214
1271
  },
1215
1272
  'CommandOptions': {
1216
- en: `The options of a command: who may use it and its description in a listing.`,
1217
- ru: `Параметры команды: кому она доступна и её описание в списке.`,
1273
+ en: `The options of a command: who may use it, its description in a listing, the chat it is heard in.`,
1274
+ ru: `Параметры команды: кому она доступна, её описание в списке, чат, в котором её слышно.`,
1275
+ },
1276
+ 'CommandOptions.chat': {
1277
+ en: `The chat a chat command is heard in, one of: \`"say"\` the common chat, \`"team"\` the team's, \`"both"\` either (the default).`,
1278
+ ru: `Чат, в котором слышно команду чата, одно из: \`"say"\` — общий, \`"team"\` — командный, \`"both"\` — любой (по умолчанию).`,
1218
1279
  },
1219
1280
  'CommandOptions.access': {
1220
1281
  en: `The admin right a player needs to use the command; left out, everyone may.`,
1221
1282
  ru: `Право админа, которое нужно игроку для команды; если не указано, команда доступна всем.`,
1222
1283
  },
1223
1284
  'CommandOptions.description': {
1224
- en: `The command's description, shown by \`amx_help\` and in \`server.commands\`.`,
1225
- ru: `Описание команды, которое показывают \`amx_help\` и \`server.commands\`.`,
1285
+ en: `The command's description, for \`server.commands\` - what a \`/help\` prints.`,
1286
+ ru: `Описание команды для \`server.commands\` - то, что печатает \`/help\`.`,
1226
1287
  },
1227
1288
  'accessOf': {
1228
1289
  en: `
@@ -1737,6 +1798,24 @@ export default {
1737
1798
  Pawn: \`BarTime\`, \`BarTime2\`, \`rg_send_bartime\`, \`rg_send_bartime2\`
1738
1799
  `,
1739
1800
  },
1801
+ 'Screen.lightStyle': {
1802
+ en: `
1803
+ The light the player sees, \`"a"\` the darkest to \`"z"\` the brightest, as
1804
+ \`server.lightStyle\` sets it for everyone; \`""\` gives him the server's
1805
+ again: \`player.screen.lightStyle("z")\` for night vision. The server's
1806
+ next light and the next map reach him too.
1807
+
1808
+ Pawn: \`message_begin(MSG_ONE, SVC_LIGHTSTYLE, ...)\`
1809
+ `,
1810
+ ru: `
1811
+ Свет, который видит игрок, от \`"a"\` — самого тёмного — до \`"z"\` — самого
1812
+ яркого, как \`server.lightStyle\` ставит его всем; \`""\` возвращает ему свет
1813
+ сервера: \`player.screen.lightStyle("z")\` для ночного зрения. Следующий свет
1814
+ сервера и следующая карта доходят и до него.
1815
+
1816
+ Pawn: \`message_begin(MSG_ONE, SVC_LIGHTSTYLE, ...)\`
1817
+ `,
1818
+ },
1740
1819
  'PlayerChangeEvent': {
1741
1820
  en: `
1742
1821
  A field plugins added to \`Player\` changed on a player - written by any
@@ -1744,7 +1823,7 @@ export default {
1744
1823
 
1745
1824
  \`\`\`ts
1746
1825
  server.addEventListener("playerChange", (event) => {
1747
- print(event.player, event.value ? "You are protected" : "Your spawn protection is over");
1826
+ event.player.print(event.value ? "You are protected" : "Your spawn protection is over");
1748
1827
  }, { field: "spawnProtected" });
1749
1828
  \`\`\`
1750
1829
 
@@ -1758,7 +1837,7 @@ export default {
1758
1837
 
1759
1838
  \`\`\`ts
1760
1839
  server.addEventListener("playerChange", (event) => {
1761
- print(event.player, event.value ? "You are protected" : "Your spawn protection is over");
1840
+ event.player.print(event.value ? "You are protected" : "Your spawn protection is over");
1762
1841
  }, { field: "spawnProtected" });
1763
1842
  \`\`\`
1764
1843
 
@@ -1899,6 +1978,85 @@ export default {
1899
1978
  en: `@internal Calls the change listeners; the server does it when the cvar changes. A plugin listens with \`addEventListener\`.`,
1900
1979
  ru: `@internal Вызывает обработчики изменения; это делает сервер, когда квар меняется. Плагин слушает через \`addEventListener\`.`,
1901
1980
  },
1981
+ 'env': {
1982
+ en: `
1983
+ A setting of the server kept out of the plugin's code - a token, a password,
1984
+ a key in a URL: a line of the server's \`addons/amxts/.env\`, or a variable of
1985
+ its environment, which wins over the file. Without a default it is
1986
+ required: a plugin that reads it does not start while the server has it
1987
+ nowhere.
1988
+
1989
+ \`\`\`ts
1990
+ const token = env("MYPLUGIN_TOKEN");
1991
+ \`\`\`
1992
+ `,
1993
+ ru: `
1994
+ Настройка сервера, которой не место в коде плагина, — токен, пароль, ключ в
1995
+ URL: строка \`addons/amxts/.env\` на сервере или переменная его окружения,
1996
+ которая перекрывает файл. Без значения по умолчанию она обязательна: плагин,
1997
+ который её читает, не запускается, пока её нет ни там, ни там.
1998
+
1999
+ \`\`\`ts
2000
+ const token = env("MYPLUGIN_TOKEN");
2001
+ \`\`\`
2002
+ `,
2003
+ },
2004
+ 'env#2': {
2005
+ en: `
2006
+ A setting of the server, as text: \`defaultValue\` when the server has it
2007
+ nowhere.
2008
+
2009
+ \`\`\`ts
2010
+ const mirror = env("MYPLUGIN_MIRROR", "https://example.com/maps");
2011
+ \`\`\`
2012
+ `,
2013
+ ru: `
2014
+ Настройка сервера текстом: \`defaultValue\`, если её нет ни в окружении,
2015
+ ни в файле.
2016
+
2017
+ \`\`\`ts
2018
+ const mirror = env("MYPLUGIN_MIRROR", "https://example.com/maps");
2019
+ \`\`\`
2020
+ `,
2021
+ },
2022
+ 'env#3': {
2023
+ en: `
2024
+ A setting of the server, as a number: \`defaultValue\` when the server has it
2025
+ nowhere. A plugin does not start while it is there and no number.
2026
+
2027
+ \`\`\`ts
2028
+ const maxRecords = env("MYPLUGIN_MAX_RECORDS", 100);
2029
+ \`\`\`
2030
+ `,
2031
+ ru: `
2032
+ Настройка сервера числом: \`defaultValue\`, если её нет ни в окружении, ни в
2033
+ файле. Плагин не запускается, пока она есть, но это не число.
2034
+
2035
+ \`\`\`ts
2036
+ const maxRecords = env("MYPLUGIN_MAX_RECORDS", 100);
2037
+ \`\`\`
2038
+ `,
2039
+ },
2040
+ 'env#4': {
2041
+ en: `
2042
+ A setting of the server, as an on/off switch - \`1\`/\`0\`, \`true\`/\`false\`,
2043
+ \`yes\`/\`no\` or \`on\`/\`off\`, in any case: \`defaultValue\` when the server has it
2044
+ nowhere. A plugin does not start while it is there and none of these.
2045
+
2046
+ \`\`\`ts
2047
+ const debug = env("MYPLUGIN_DEBUG", false);
2048
+ \`\`\`
2049
+ `,
2050
+ ru: `
2051
+ Настройка сервера как переключатель — \`1\`/\`0\`, \`true\`/\`false\`, \`yes\`/\`no\`
2052
+ или \`on\`/\`off\`, в любом регистре: \`defaultValue\`, если её нет ни в окружении,
2053
+ ни в файле. Плагин не запускается, пока она есть, но это ни одно из этих слов.
2054
+
2055
+ \`\`\`ts
2056
+ const debug = env("MYPLUGIN_DEBUG", false);
2057
+ \`\`\`
2058
+ `,
2059
+ },
1902
2060
  'Server': {
1903
2061
  en: `
1904
2062
  The server, an event target like the DOM's: its events, commands, map and
@@ -1906,7 +2064,7 @@ export default {
1906
2064
 
1907
2065
  \`\`\`ts
1908
2066
  server.addEventListener("putInServer", (event) => {
1909
- print(event.player, "Welcome!"); // event is a PutinserverEvent
2067
+ event.player.print("Welcome!"); // event is a PutinserverEvent
1910
2068
  });
1911
2069
  server.map; // "de_dust2"
1912
2070
  server.maxPlayers; // 32
@@ -1923,7 +2081,7 @@ export default {
1923
2081
 
1924
2082
  \`\`\`ts
1925
2083
  server.addEventListener("putInServer", (event) => {
1926
- print(event.player, "Welcome!"); // event — это PutinserverEvent
2084
+ event.player.print("Welcome!"); // event — это PutinserverEvent
1927
2085
  });
1928
2086
  server.map; // "de_dust2"
1929
2087
  server.maxPlayers; // 32
@@ -2091,6 +2249,18 @@ export default {
2091
2249
  Pawn: \`get_configsdir\`
2092
2250
  `,
2093
2251
  },
2252
+ 'Server.logsDir': {
2253
+ en: `
2254
+ The AMX Mod X folder for logs: \`addons/amxmodx/logs\` unless the server moved it.
2255
+
2256
+ Pawn: \`get_localinfo("amxx_logs")\`
2257
+ `,
2258
+ ru: `
2259
+ Папка AMX Mod X для логов: \`addons/amxmodx/logs\`, если сервер её не перенёс.
2260
+
2261
+ Pawn: \`get_localinfo("amxx_logs")\`
2262
+ `,
2263
+ },
2094
2264
  'Server.dataDir': {
2095
2265
  en: `
2096
2266
  The AMX Mod X folder for plugins' data files: \`addons/amxmodx/data\` unless the server moved it.
@@ -2248,11 +2418,12 @@ export default {
2248
2418
  \`\`\`ts
2249
2419
  game.endRound({ winner: "TERRORIST" }); // terrorists win, next round in 5 s
2250
2420
  game.endRound({ winner: "draw", delay: 3 }); // a draw, next round in 3 s
2251
- game.endRound({ winner: "none", message: "" }); // a quiet restart: no message
2421
+ game.endRound({ winner: "none", message: "" }); // nobody scores, no message
2252
2422
  \`\`\`
2253
2423
 
2254
2424
  The winner sets the score, the message and the sound (\`"Terrorists Win!"\`);
2255
- \`message\` and \`sound\` replace them, \`""\` turns them off.
2425
+ \`message\` and \`sound\` replace them, \`""\` turns them off. The next
2426
+ round starts after \`delay\`; to start it over at once, \`game.restartRound()\`.
2256
2427
 
2257
2428
  Pawn: \`rg_round_end\`
2258
2429
  `,
@@ -2262,171 +2433,1459 @@ export default {
2262
2433
  \`\`\`ts
2263
2434
  game.endRound({ winner: "TERRORIST" }); // победа террористов, следующий раунд через 5 с
2264
2435
  game.endRound({ winner: "draw", delay: 3 }); // ничья, следующий раунд через 3 с
2265
- game.endRound({ winner: "none", message: "" }); // тихий рестарт: без сообщения
2436
+ game.endRound({ winner: "none", message: "" }); // никто не получает очко, без сообщения
2266
2437
  \`\`\`
2267
2438
 
2268
2439
  Победитель определяет счёт, сообщение и звук (\`"Terrorists Win!"\`);
2269
- \`message\` и \`sound\` заменяют их, \`""\` — выключает.
2440
+ \`message\` и \`sound\` заменяют их, \`""\` — выключает. Следующий раунд
2441
+ начинается через \`delay\`; начать раунд заново сразу — \`game.restartRound()\`.
2270
2442
 
2271
2443
  Pawn: \`rg_round_end\`
2272
2444
  `,
2273
2445
  },
2274
- 'GameListenerOptions': {
2446
+ 'Game.restartRound': {
2275
2447
  en: `
2276
- The third argument of \`game.addEventListener\`: \`true\` stands for
2277
- \`{ post: true }\`; a \`"touch"\` listener names the classes it is about.
2448
+ Starts the round over at once, as the game does when it restarts one:
2449
+ everyone back at a spawn point with the round's money and weapons, the
2450
+ map cleaned up. The score stays; with \`game.completeReset = true\` first
2451
+ it starts from zero, as after \`sv_restart\`. Every plugin's \`newRound\`
2452
+ listeners hear it.
2453
+
2454
+ Pawn: \`rg_restart_round\`
2278
2455
  `,
2279
2456
  ru: `
2280
- Третий аргумент \`game.addEventListener\`: \`true\` означает
2281
- \`{ post: true }\`; обработчик \`"touch"\` называет классы, о которых речь.
2457
+ Начинает раунд заново сразу, как это делает игра при перезапуске раунда:
2458
+ все на точках появления с деньгами и оружием раунда, карта очищена. Счёт
2459
+ остаётся; если сначала поставить \`game.completeReset = true\`, он
2460
+ начинается с нуля, как после \`sv_restart\`. Это слышат обработчики
2461
+ \`newRound\` всех плагинов.
2462
+
2463
+ Pawn: \`rg_restart_round\`
2282
2464
  `,
2283
2465
  },
2284
- 'GameListenerOptions.post': {
2285
- en: `Runs the listener after the game has acted, with its answer in \`event.result\`.`,
2286
- ru: `Вызывает обработчик после того, как игра сделала своё, с её ответом в \`event.result\`.`,
2287
- },
2288
- 'GameListenerOptions.classname': {
2289
- en: `The class of entity the event is listened for on, e.g. \`"weapon_knife"\`: only its entities reach the listener.`,
2290
- ru: `Класс сущностей, на котором слушается событие, например \`"weapon_knife"\`: до обработчика доходят только его сущности.`,
2291
- },
2292
- 'UseType': {
2466
+ 'Game.checkWinConditions': {
2293
2467
  en: `
2294
- The way one entity uses another - a button pressed, a door opened - one of
2295
- \`"off"\`, \`"on"\`, \`"set"\` or \`"toggle"\`.
2468
+ Has the game check now whether the round is won - after players were
2469
+ moved between sides or killed by a plugin - and end it if it is, as it
2470
+ checks after a death.
2296
2471
 
2297
- Pawn: \`USE_OFF\`, \`USE_ON\`, \`USE_SET\`, \`USE_TOGGLE\`
2472
+ Pawn: \`rg_check_win_conditions\`
2298
2473
  `,
2299
2474
  ru: `
2300
- Способ, которым одна сущность использует другую, — нажимает кнопку, открывает
2301
- дверь, — одно из \`"off"\`, \`"on"\`, \`"set"\` или \`"toggle"\`.
2475
+ Просит игру сейчас проверить, не выигран ли раунд, - после того как
2476
+ плагин перевёл игроков между сторонами или убил их, - и завершить его,
2477
+ если выигран, как игра проверяет после смерти.
2302
2478
 
2303
- Pawn: \`USE_OFF\`, \`USE_ON\`, \`USE_SET\`, \`USE_TOGGLE\`
2479
+ Pawn: \`rg_check_win_conditions\`
2304
2480
  `,
2305
2481
  },
2306
- 'ActionOptions': {
2307
- en: `The options of an entity's action such as \`weapon.deploy()\` or \`entity.heal(...)\`.`,
2308
- ru: `Настройки действия сущности, такого как \`weapon.deploy()\` или \`entity.heal(...)\`.`,
2482
+ 'ItemSlot': {
2483
+ en: `
2484
+ A player's item slot, one of \`"primary"\` (a rifle, a shotgun, a sniper
2485
+ rifle, the shield), \`"secondary"\` (the pistol), \`"knife"\`, \`"grenades"\` or
2486
+ \`"c4"\`.
2487
+ `,
2488
+ ru: `
2489
+ Слот предметов игрока, одно из \`"primary"\` (винтовка, дробовик,
2490
+ снайперская винтовка, щит), \`"secondary"\` (пистолет), \`"knife"\`,
2491
+ \`"grenades"\` или \`"c4"\`.
2492
+ `,
2309
2493
  },
2310
- 'ActionOptions.hooks': {
2494
+ 'UserInfo': {
2311
2495
  en: `
2312
- Whether the game's listeners run too - this plugin's and every other's,
2313
- Pawn ones included; \`true\` by default. \`false\` runs the game's own
2314
- function alone.
2496
+ The settings a player's game tells the server, his userinfo: keys such as
2497
+ \`"model"\`, \`"cl_righthand"\`, \`"_vgui_menus"\`, each a text.
2498
+ `,
2499
+ ru: `
2500
+ Настройки, которые игра игрока сообщает серверу, — его userinfo: ключи
2501
+ вроде \`"model"\`, \`"cl_righthand"\`, \`"_vgui_menus"\`, каждый — текст.
2502
+ `,
2503
+ },
2504
+ 'UserInfo.get': {
2505
+ en: `
2506
+ A key's value: \`player.info.get("cl_righthand")\` is \`"1"\`; \`""\` for a key
2507
+ his game did not send.
2315
2508
 
2316
- Pawn: \`ExecuteHamB\`, \`ExecuteHam\`
2509
+ Pawn: \`get_user_info\`
2317
2510
  `,
2318
2511
  ru: `
2319
- Вызываются ли и обработчики игры — этого плагина и всех остальных,
2320
- Pawn-плагинов тоже; по умолчанию \`true\`. \`false\` выполняет только
2321
- собственную функцию игры.
2512
+ Значение ключа: \`player.info.get("cl_righthand")\` — это \`"1"\`; \`""\` для
2513
+ ключа, которого его игра не прислала.
2322
2514
 
2323
- Pawn: \`ExecuteHamB\`, \`ExecuteHam\`
2515
+ Pawn: \`get_user_info\`
2324
2516
  `,
2325
2517
  },
2326
- 'GameListenerOptions.toucher': {
2327
- en: `For \`"touch"\`: the class of the entity that moves into the other, e.g. \`"player"\`; left out, any.`,
2328
- ru: `Для \`"touch"\`: класс сущности, которая входит в другую, например \`"player"\`; если не задан — любой.`,
2329
- },
2330
- 'GameListenerOptions.touched': {
2331
- en: `For \`"touch"\`: the class of the entity touched, e.g. \`"func_door"\`; left out, any.`,
2332
- ru: `Для \`"touch"\`: класс сущности, которой коснулись, например \`"func_door"\`; если не задан — любой.`,
2333
- },
2334
- 'TouchEvent': {
2518
+ 'UserInfo.set': {
2335
2519
  en: `
2336
- Two entities touched: \`toucher\` moved into \`touched\`. Only the classes a
2337
- listener asked for reach it:
2338
-
2339
- \`\`\`ts
2340
- game.addEventListener("touch", onTouch, { toucher: "player", touched: "player" });
2341
- \`\`\`
2520
+ Writes a key: the server and his game take the new value, as when his
2521
+ game changes it itself.
2342
2522
 
2343
- Pawn: \`register_touch\`
2523
+ Pawn: \`set_user_info\`
2344
2524
  `,
2345
2525
  ru: `
2346
- Две сущности коснулись: \`toucher\` вошла в \`touched\`. До обработчика
2347
- доходят только классы, которые он просил:
2526
+ Записывает ключ: сервер и его игра принимают новое значение, как когда
2527
+ его игра меняет его сама.
2348
2528
 
2349
- \`\`\`ts
2350
- game.addEventListener("touch", onTouch, { toucher: "player", touched: "player" });
2351
- \`\`\`
2352
-
2353
- Pawn: \`register_touch\`
2529
+ Pawn: \`set_user_info\`
2354
2530
  `,
2355
2531
  },
2356
- 'TouchEvent.toucher': {
2357
- en: `The entity that moved into the other.`,
2358
- ru: `Сущность, которая вошла в другую.`,
2359
- },
2360
- 'TouchEvent.touched': {
2361
- en: `The entity it touched.`,
2362
- ru: `Сущность, которой она коснулась.`,
2363
- },
2364
- 'TouchEvent.preventDefault': {
2365
- en: `Blocks the touch: the game does not act on it.`,
2366
- ru: `Блокирует касание: игра на него не реагирует.`,
2367
- },
2368
- 'RoundWinner': {
2369
- en: `The winner of a round, one of \`"TERRORIST"\`, \`"CT"\`, \`"draw"\`, or \`"none"\` - a restart without a winner.`,
2370
- ru: `Победитель раунда, одно из \`"TERRORIST"\`, \`"CT"\`, \`"draw"\` или \`"none"\` — рестарт без победителя.`,
2532
+ 'Client.isHltv': {
2533
+ en: `
2534
+ \`true\` for an HLTV proxy: a spectator's relay, which \`server.players\`
2535
+ leaves out.
2536
+ `,
2537
+ ru: `
2538
+ \`true\` для прокси HLTV — ретранслятора для зрителей, которого
2539
+ \`server.players\` не включает.
2540
+ `,
2371
2541
  },
2372
- 'EndRoundOptions': {
2373
- en: `The options of \`game.endRound\`; only \`winner\` is required.`,
2374
- ru: `Настройки \`game.endRound\`; обязателен только \`winner\`.`,
2542
+ 'Player.isHltv': {
2543
+ en: `
2544
+ \`true\` for an HLTV proxy: a spectator's relay, which \`server.players\`
2545
+ leaves out.
2546
+
2547
+ Pawn: \`is_user_hltv\`
2548
+ `,
2549
+ ru: `
2550
+ \`true\` для прокси HLTV — ретранслятора для зрителей, которого
2551
+ \`server.players\` не включает.
2552
+
2553
+ Pawn: \`is_user_hltv\`
2554
+ `,
2375
2555
  },
2376
- 'EndRoundOptions.winner': {
2377
- en: `The round's winner, one of \`"TERRORIST"\`, \`"CT"\`, \`"draw"\`, or \`"none"\` - a restart.`,
2378
- ru: `Победитель раунда, одно из \`"TERRORIST"\`, \`"CT"\`, \`"draw"\` или \`"none"\` — рестарт.`,
2556
+ 'Player.removeItems': {
2557
+ en: `
2558
+ Takes every item of one of the player's slots, with its ammo:
2559
+ \`player.removeItems("primary")\`. \`false\` when one stayed.
2560
+
2561
+ Pawn: \`rg_remove_items_by_slot\`
2562
+ `,
2563
+ ru: `
2564
+ Забирает все предметы одного из слотов игрока вместе с их патронами:
2565
+ \`player.removeItems("primary")\`. \`false\`, если какой-то остался.
2566
+
2567
+ Pawn: \`rg_remove_items_by_slot\`
2568
+ `,
2379
2569
  },
2380
- 'EndRoundOptions.delay': {
2381
- en: `Seconds until the next round starts; \`5\` by default.`,
2382
- ru: `Секунд до начала следующего раунда; по умолчанию \`5\`.`,
2570
+ 'Player.dropItem': {
2571
+ en: `
2572
+ Drops a weapon the player carries, as the game's \`drop\` does:
2573
+ \`player.dropItem("weapon_c4")\`; with no name, the one in his hands. The
2574
+ weapon, now in a box on the ground, or \`null\` when he has none or the
2575
+ game kept it (a knife).
2576
+
2577
+ Pawn: \`rg_drop_item\`, \`engclient_cmd(id, "drop")\`
2578
+ `,
2579
+ ru: `
2580
+ Выбрасывает оружие, которое несёт игрок, как это делает \`drop\` игры:
2581
+ \`player.dropItem("weapon_c4")\`; без имени — то, что у него в руках. Оружие,
2582
+ теперь в коробке на земле, или \`null\`, если такого нет или игра его не
2583
+ отдала (нож).
2584
+
2585
+ Pawn: \`rg_drop_item\`, \`engclient_cmd(id, "drop")\`
2586
+ `,
2383
2587
  },
2384
- 'EndRoundOptions.message': {
2385
- en: `The message in the middle of the screen, or a game text such as \`"#Terrorists_Win"\`; \`"default"\` is the usual one for this winner, \`""\` none.`,
2386
- ru: `Сообщение посередине экрана или текст игры вроде \`"#Terrorists_Win"\`; \`"default"\` — обычное для этого победителя, \`""\` — без сообщения.`,
2588
+ 'Player.slap': {
2589
+ en: `
2590
+ Slaps the player as an admin's slap does: a push in a random direction,
2591
+ his view jolted, a pain sound, and \`damage\` taken from his health - the
2592
+ last of it kills him.
2593
+
2594
+ Pawn: \`user_slap\`
2595
+ `,
2596
+ ru: `
2597
+ Шлёпает игрока, как шлепок админа: толчок в случайную сторону, рывок
2598
+ взгляда, звук боли и \`damage\`, отнятый от здоровья, — последнее здоровье его
2599
+ убивает.
2600
+
2601
+ Pawn: \`user_slap\`
2602
+ `,
2387
2603
  },
2388
- 'EndRoundOptions.sound': {
2389
- en: `The sound, a radio phrase such as \`"terwin"\`; \`"default"\` is the usual one for this winner, \`""\` none.`,
2390
- ru: `Звук — радиофраза вроде \`"terwin"\`; \`"default"\` — обычный для этого победителя, \`""\` — без звука.`,
2604
+ 'Player.userId': {
2605
+ en: `
2606
+ The player's number for the server's commands, which stays while he is
2607
+ on the server: \`\` server.command(\`kick #\${player.userId}\`) \`\`.
2608
+
2609
+ Pawn: \`get_user_userid\`
2610
+ `,
2611
+ ru: `
2612
+ Номер игрока для команд сервера, который не меняется, пока он на
2613
+ сервере: \`\` server.command(\`kick #\${player.userId}\`) \`\`.
2614
+
2615
+ Pawn: \`get_user_userid\`
2616
+ `,
2391
2617
  },
2392
- 'EndRoundOptions.dispatch': {
2618
+ 'Player.ping': {
2393
2619
  en: `
2394
- \`true\` to tell the \`roundEnd\` listeners of every plugin, Pawn ones too, as when
2395
- the game ends a round itself. \`false\` by default: a \`roundEnd\` listener that
2396
- ends the round would call itself.
2620
+ The player's ping, in milliseconds, as the scoreboard shows it.
2397
2621
 
2398
- Pawn: \`rg_round_end(..., trigger)\`
2622
+ Pawn: \`get_user_ping\`
2399
2623
  `,
2400
2624
  ru: `
2401
- \`true\` — оповестить обработчики \`roundEnd\` всех плагинов, в том числе
2402
- Pawn-плагинов, как когда игра сама завершает раунд. По умолчанию \`false\`:
2403
- обработчик \`roundEnd\`, который завершает раунд, вызвал бы сам себя.
2625
+ Пинг игрока в миллисекундах, как его показывает таблица счёта.
2404
2626
 
2405
- Pawn: \`rg_round_end(..., trigger)\`
2627
+ Pawn: \`get_user_ping\`
2406
2628
  `,
2407
2629
  },
2408
- 'game': {
2409
- en: `The game the plugin runs in: its events (reapi hookchains and Ham Sandwich functions), its rules' fields and \`endRound\`.`,
2410
- ru: `Игра, в которой работает плагин: её события (hookchain'ы reapi и функции Ham Sandwich), поля её правил и \`endRound\`.`,
2630
+ 'Player.connectedSeconds': {
2631
+ en: `
2632
+ The player's time on the server since he connected, in seconds.
2633
+
2634
+ Pawn: \`get_user_time\`
2635
+ `,
2636
+ ru: `
2637
+ Время игрока на сервере с момента подключения, в секундах.
2638
+
2639
+ Pawn: \`get_user_time\`
2640
+ `,
2411
2641
  },
2412
- 'Variant': {
2642
+ 'Player.info': {
2413
2643
  en: `
2414
- The places a message can show: \`Variant.chat\`, \`center\`, \`console\`, \`notify\`.
2415
- A plain string works the same - \`"center"\`; an unknown name goes to chat.
2644
+ The settings the player's game tells the server - his userinfo:
2645
+ \`player.info.get("cl_righthand")\`, \`player.info.set("_vgui_menus", "0")\`.
2416
2646
 
2417
- Pawn: \`print_chat\`, \`print_center\`, \`print_console\`, \`print_notify\`
2647
+ Pawn: \`get_user_info\`, \`set_user_info\`
2418
2648
  `,
2419
2649
  ru: `
2420
- Места, где показывается сообщение: \`Variant.chat\`, \`center\`, \`console\`,
2421
- \`notify\`. Обычная строка работает так же — \`"center"\`; незнакомое имя уходит
2422
- в чат.
2650
+ Настройки, которые игра игрока сообщает серверу, — его userinfo:
2651
+ \`player.info.get("cl_righthand")\`, \`player.info.set("_vgui_menus", "0")\`.
2423
2652
 
2424
- Pawn: \`print_chat\`, \`print_center\`, \`print_console\`, \`print_notify\`
2653
+ Pawn: \`get_user_info\`, \`set_user_info\`
2425
2654
  `,
2426
2655
  },
2427
- 'Variant.chat': {
2428
- en: `A line in the player's chat.`,
2429
- ru: `Строка в чате игрока.`,
2656
+ 'Player.silentSteps': {
2657
+ en: `
2658
+ Whether the player's steps make no sound: \`player.silentSteps = true\`.
2659
+ It lasts until he respawns.
2660
+
2661
+ Pawn: \`set_user_footsteps\`, \`rg_set_user_footsteps\`
2662
+ `,
2663
+ ru: `
2664
+ Беззвучны ли шаги игрока: \`player.silentSteps = true\`. Действует, пока он
2665
+ не появится заново.
2666
+
2667
+ Pawn: \`set_user_footsteps\`, \`rg_set_user_footsteps\`
2668
+ `,
2669
+ },
2670
+ 'Player.country': {
2671
+ en: `
2672
+ The country the player connects from, in English, e.g. \`"Germany"\`; \`null\`
2673
+ when the GeoIP database does not know his address (a LAN, a bot) or the
2674
+ server has none.
2675
+
2676
+ Pawn: \`geoip_country_ex\`
2677
+ `,
2678
+ ru: `
2679
+ Страна, из которой подключается игрок, по-английски, например \`"Germany"\`; \`null\`,
2680
+ если база GeoIP не знает его адрес (локальная сеть, бот) или её нет на
2681
+ сервере.
2682
+
2683
+ Pawn: \`geoip_country_ex\`
2684
+ `,
2685
+ },
2686
+ 'Player.countryCode': {
2687
+ en: `
2688
+ The two letters of the country the player connects from, e.g. \`"DE"\`;
2689
+ \`null\` when the GeoIP database does not know his address or the server
2690
+ has none.
2691
+
2692
+ Pawn: \`geoip_code2_ex\`
2693
+ `,
2694
+ ru: `
2695
+ Две буквы страны, из которой подключается игрок, например \`"DE"\`; \`null\`, если
2696
+ база GeoIP не знает его адрес или её нет на сервере.
2697
+
2698
+ Pawn: \`geoip_code2_ex\`
2699
+ `,
2700
+ },
2701
+ 'Game.swapTeams': {
2702
+ en: `
2703
+ Swaps the sides: every terrorist a counter-terrorist and back, their
2704
+ scores too, as the game swaps them halfway through a match.
2705
+
2706
+ Pawn: \`rg_swap_all_players\`
2707
+ `,
2708
+ ru: `
2709
+ Меняет стороны местами: каждый террорист становится спецназовцем и
2710
+ наоборот, их счёт тоже, как игра меняет их в середине матча.
2711
+
2712
+ Pawn: \`rg_swap_all_players\`
2713
+ `,
2714
+ },
2715
+ 'Game.balanceTeams': {
2716
+ en: `
2717
+ Evens the sides as the game does at a round's start with
2718
+ \`mp_autoteambalance\`: from the bigger side the players who came last,
2719
+ four at most - on a map with a VIP, a little more counter-terrorists.
2720
+
2721
+ Pawn: \`rg_balance_teams\`
2722
+ `,
2723
+ ru: `
2724
+ Выравнивает стороны, как игра в начале раунда с \`mp_autoteambalance\`: из
2725
+ большей стороны — игроки, пришедшие последними, не больше четырёх; на
2726
+ карте с VIP спецназовцев чуть больше.
2727
+
2728
+ Pawn: \`rg_balance_teams\`
2729
+ `,
2730
+ },
2731
+ 'Game.timeLeft': {
2732
+ en: `
2733
+ Seconds until the map ends by its time limit; \`Infinity\` without one.
2734
+
2735
+ Pawn: \`get_timeleft\`
2736
+ `,
2737
+ ru: `
2738
+ Секунды до конца карты по её лимиту времени; \`Infinity\`, если лимита нет.
2739
+
2740
+ Pawn: \`get_timeleft\`
2741
+ `,
2742
+ },
2743
+ 'HudLine.showAll': {
2744
+ en: `
2745
+ Shows \`text\` to everyone on this line: \`countdown.showAll(\`\${left}\`)\`.
2746
+
2747
+ Pawn: \`ShowSyncHudMsg(0, ...)\`
2748
+ `,
2749
+ ru: `
2750
+ Показывает \`text\` всем на этой строке: \`countdown.showAll(\`\${left}\`)\`.
2751
+
2752
+ Pawn: \`ShowSyncHudMsg(0, ...)\`
2753
+ `,
2754
+ },
2755
+ 'Screen.hint': {
2756
+ en: `
2757
+ Shows a hint in the box at the top of the player's screen, as the game
2758
+ shows its own: \`player.screen.hint("Plant the bomb")\`.
2759
+
2760
+ Pawn: \`rg_hint_message\`, \`HudTextPro\`
2761
+ `,
2762
+ ru: `
2763
+ Показывает подсказку в рамке вверху экрана игрока, как игра показывает
2764
+ свои: \`player.screen.hint("Заложи бомбу")\`.
2765
+
2766
+ Pawn: \`rg_hint_message\`, \`HudTextPro\`
2767
+ `,
2768
+ },
2769
+ 'Player.showMotd': {
2770
+ en: `
2771
+ Shows the message-of-the-day window: \`player.showMotd("Rules: ...")\`,
2772
+ a page's address (\`"https://my-server.com/rules"\`) or HTML; \`title\` on
2773
+ its top, the server's name when left out. The plugins' \`"motd"\`
2774
+ listeners do not hear it, as AMX Mod X's do not hear \`show_motd\`.
2775
+
2776
+ Pawn: \`show_motd\`
2777
+ `,
2778
+ ru: `
2779
+ Показывает окно «сообщения дня»: \`player.showMotd("Правила: ...")\`, адрес
2780
+ страницы (\`"https://my-server.com/rules"\`) или HTML; \`title\` — сверху окна,
2781
+ без него — имя сервера. Слушатели \`"motd"\` плагинов его не слышат, как
2782
+ обработчики AMX Mod X не слышат \`show_motd\`.
2783
+
2784
+ Pawn: \`show_motd\`
2785
+ `,
2786
+ },
2787
+ 'Server.plugins': {
2788
+ en: `
2789
+ Every plugin on the server, TypeScript and Pawn, read anew each time:
2790
+ \`server.plugins.find(plugin => plugin.file == "shop.aot")?.stop()\`.
2791
+
2792
+ Pawn: \`get_plugin\`, \`get_pluginsnum\`, \`find_plugin_byfile\`, \`is_plugin_loaded\`
2793
+ `,
2794
+ ru: `
2795
+ Все плагины сервера, на TypeScript и на Pawn, каждый раз заново:
2796
+ \`server.plugins.find(plugin => plugin.file == "shop.aot")?.stop()\`.
2797
+
2798
+ Pawn: \`get_plugin\`, \`get_pluginsnum\`, \`find_plugin_byfile\`, \`is_plugin_loaded\`
2799
+ `,
2800
+ },
2801
+ 'Server.loadPlugin': {
2802
+ en: `
2803
+ Loads a TypeScript plugin of the server's \`plugins\` folder the list
2804
+ does not name, at the next frame: \`server.loadPlugin("event.aot")\`. It
2805
+ runs until the map changes.
2806
+
2807
+ Pawn: \`amxts_load\`
2808
+ `,
2809
+ ru: `
2810
+ Загружает плагин на TypeScript из папки \`plugins\` сервера, которого нет в
2811
+ списке, на следующем кадре: \`server.loadPlugin("event.aot")\`. Он работает до
2812
+ смены карты.
2813
+
2814
+ Pawn: \`amxts_load\`
2815
+ `,
2816
+ },
2817
+ 'PluginLanguage': {
2818
+ en: `
2819
+ The language a plugin is written in, one of \`"typescript"\` or \`"pawn"\`.
2820
+ `,
2821
+ ru: `
2822
+ Язык, на котором написан плагин, одно из \`"typescript"\` или \`"pawn"\`.
2823
+ `,
2824
+ },
2825
+ 'ServerPlugin': {
2826
+ en: `
2827
+ A plugin on the server, TypeScript or Pawn, as \`server.plugins\` lists it:
2828
+ its file, what it says it is, whether it runs - and the means to stop it,
2829
+ start it again and reload it.
2830
+ `,
2831
+ ru: `
2832
+ Плагин на сервере, на TypeScript или на Pawn, как его перечисляет
2833
+ \`server.plugins\`: его файл, что он о себе говорит, работает ли он, — и как его
2834
+ остановить, снова запустить и перезагрузить.
2835
+ `,
2836
+ },
2837
+ 'ServerPlugin.language': {
2838
+ en: `
2839
+ \`"typescript"\` or \`"pawn"\`.
2840
+ `,
2841
+ ru: `
2842
+ \`"typescript"\` или \`"pawn"\`.
2843
+ `,
2844
+ },
2845
+ 'ServerPlugin.file': {
2846
+ en: `
2847
+ The plugin's file, as the server's list names it, e.g. \`"shop.aot"\`, \`"admin.amxx"\`.
2848
+ `,
2849
+ ru: `
2850
+ Файл плагина, как его называет список сервера, например \`"shop.aot"\`, \`"admin.amxx"\`.
2851
+ `,
2852
+ },
2853
+ 'ServerPlugin.name': {
2854
+ en: `
2855
+ The name it gives itself (\`plugin()\`, \`register_plugin\`).
2856
+ `,
2857
+ ru: `
2858
+ Имя, которое он сам себе дал (\`plugin()\`, \`register_plugin\`).
2859
+ `,
2860
+ },
2861
+ 'ServerPlugin.version': {
2862
+ en: `
2863
+ The version it gives.
2864
+ `,
2865
+ ru: `
2866
+ Версия, которую он указал.
2867
+ `,
2868
+ },
2869
+ 'ServerPlugin.author': {
2870
+ en: `
2871
+ The author it names.
2872
+ `,
2873
+ ru: `
2874
+ Автор, которого он называет.
2875
+ `,
2876
+ },
2877
+ 'ServerPlugin.running': {
2878
+ en: `
2879
+ Whether it runs: not stopped, not refused, not paused.
2880
+
2881
+ Pawn: \`get_plugin(..., status)\`
2882
+ `,
2883
+ ru: `
2884
+ Работает ли он: не остановлен, не отвергнут, не на паузе.
2885
+
2886
+ Pawn: \`get_plugin(..., status)\`
2887
+ `,
2888
+ },
2889
+ 'ServerPlugin.stop': {
2890
+ en: `
2891
+ Stops it at the next frame. A TypeScript plugin is unloaded, and what
2892
+ it registered with it, until \`start()\` or the map changes; a Pawn plugin
2893
+ is paused, as AMX Mod X pauses one.
2894
+
2895
+ Pawn: \`pause\`, \`amxts_unload\`
2896
+ `,
2897
+ ru: `
2898
+ Останавливает его на следующем кадре. Плагин на TypeScript выгружается
2899
+ вместе со всем, что он зарегистрировал, до \`start()\` или смены карты; плагин
2900
+ на Pawn ставится на паузу, как это делает AMX Mod X.
2901
+
2902
+ Pawn: \`pause\`, \`amxts_unload\`
2903
+ `,
2904
+ },
2905
+ 'ServerPlugin.start': {
2906
+ en: `
2907
+ Starts it again: a TypeScript plugin loaded at the next frame, a Pawn
2908
+ plugin let run again.
2909
+
2910
+ Pawn: \`unpause\`, \`amxts_load\`
2911
+ `,
2912
+ ru: `
2913
+ Запускает его снова: плагин на TypeScript загружается на следующем кадре,
2914
+ плагин на Pawn снимается с паузы.
2915
+
2916
+ Pawn: \`unpause\`, \`amxts_load\`
2917
+ `,
2918
+ },
2919
+ 'ServerPlugin.reload': {
2920
+ en: `
2921
+ Starts a TypeScript plugin over from its file at the next frame. A Pawn
2922
+ plugin cannot be: AMX Mod X loads its plugins once a map - it throws.
2923
+
2924
+ Pawn: \`amxts_reload\`
2925
+ `,
2926
+ ru: `
2927
+ Запускает плагин на TypeScript заново из его файла на следующем кадре.
2928
+ Плагин на Pawn так нельзя: AMX Mod X загружает плагины раз за карту — бросает
2929
+ ошибку.
2930
+
2931
+ Pawn: \`amxts_reload\`
2932
+ `,
2933
+ },
2934
+ 'ServerPlugin.call': {
2935
+ en: `
2936
+ Calls a public function of a Pawn plugin and gives what it returns:
2937
+ \`ranks.call("show_rank", player)\`. A number, a boolean, text or a
2938
+ player crosses as Pawn takes it. A TypeScript plugin is called through
2939
+ its module instead: it throws.
2940
+
2941
+ Pawn: \`callfunc_begin\`, \`callfunc_begin_i\`, \`get_func_id\`, \`callfunc_push_*\`, \`callfunc_end\`
2942
+ `,
2943
+ ru: `
2944
+ Вызывает публичную функцию плагина на Pawn и возвращает её результат:
2945
+ \`ranks.call("show_rank", player)\`. Число, булево значение, текст или игрок
2946
+ передаются так, как их принимает Pawn. Плагин на TypeScript вызывают через его
2947
+ модуль — бросает ошибку.
2948
+
2949
+ Pawn: \`callfunc_begin\`, \`callfunc_begin_i\`, \`get_func_id\`, \`callfunc_push_*\`, \`callfunc_end\`
2950
+ `,
2951
+ },
2952
+ 'Player.send': {
2953
+ en: `
2954
+ Sends him a message of the game by its name, its fields typed as
2955
+ \`server.addMessageListener\` hears them: \`player.send("team", { target:
2956
+ other, team: "CT" })\`. A field left out goes as \`0\` or empty text;
2957
+ every message listener hears it on its way.
2958
+
2959
+ Pawn: \`message_begin(MSG_ONE, ...)\`, \`write_*\`, \`message_end\`, \`get_user_msgid\`
2960
+ `,
2961
+ ru: `
2962
+ Отправляет ему сообщение игры по имени, с полями того же типа, что слышит
2963
+ \`server.addMessageListener\`: \`player.send("team", { target: other, team:
2964
+ "CT" })\`. Пропущенное поле уходит как \`0\` или пустой текст; все слушатели
2965
+ сообщений слышат его по пути.
2966
+
2967
+ Pawn: \`message_begin(MSG_ONE, ...)\`, \`write_*\`, \`message_end\`, \`get_user_msgid\`
2968
+ `,
2969
+ },
2970
+ 'Server.send': {
2971
+ en: `
2972
+ Sends everyone a message of the game by its name, its fields typed as
2973
+ \`addMessageListener\` hears them: \`server.send("score", { target: player,
2974
+ frags: 10, deaths: 2, team: "CT" })\`; with \`near\`, only the players who
2975
+ can see that point, as effects go. A field left out goes as \`0\` or empty
2976
+ text; every message listener hears it on its way.
2977
+
2978
+ Pawn: \`message_begin(MSG_ALL, ...)\`, \`write_*\`, \`message_end\`, \`get_user_msgid\`
2979
+ `,
2980
+ ru: `
2981
+ Отправляет всем сообщение игры по имени, с полями того же типа, что слышит
2982
+ \`addMessageListener\`: \`server.send("score", { target: player, frags: 10,
2983
+ deaths: 2, team: "CT" })\`; с \`near\` — только игрокам, которые видят эту
2984
+ точку, как эффекты. Пропущенное поле уходит как \`0\` или пустой текст; все
2985
+ слушатели сообщений слышат его по пути.
2986
+
2987
+ Pawn: \`message_begin(MSG_ALL, ...)\`, \`write_*\`, \`message_end\`, \`get_user_msgid\`
2988
+ `,
2989
+ },
2990
+ 'SendOptions': {
2991
+ en: `
2992
+ The options of \`server.send\`: the players a message goes to.
2993
+ `,
2994
+ ru: `
2995
+ Параметры \`server.send\`: игроки, которым уходит сообщение.
2996
+ `,
2997
+ },
2998
+ 'SendOptions.near': {
2999
+ en: `
3000
+ Only to the players who can see this point, as effects go - not reliably.
3001
+ `,
3002
+ ru: `
3003
+ Только игрокам, которые видят эту точку, как эффекты, — без гарантии доставки.
3004
+ `,
3005
+ },
3006
+ 'Player.eyes': {
3007
+ en: `
3008
+ The point he sees from: his origin and the view's height above it.
3009
+
3010
+ Pawn: \`get_user_origin(id, origin, 1)\`
3011
+ `,
3012
+ ru: `
3013
+ Точка, из которой он смотрит: его позиция и высота взгляда над ней.
3014
+
3015
+ Pawn: \`get_user_origin(id, origin, 1)\`
3016
+ `,
3017
+ },
3018
+ 'Player.aim': {
3019
+ en: `
3020
+ The player's aim: \`player.aim.entity\` is what his view meets first - a
3021
+ player, an entity, the world - and \`player.aim.point\` the point.
3022
+
3023
+ Pawn: \`get_user_aiming\`, \`get_user_origin(id, origin, 3)\`
3024
+ `,
3025
+ ru: `
3026
+ Прицел игрока: \`player.aim.entity\` — то, во что первым упирается его
3027
+ взгляд, — игрок, сущность, мир, — а \`player.aim.point\` — эта точка.
3028
+
3029
+ Pawn: \`get_user_aiming\`, \`get_user_origin(id, origin, 3)\`
3030
+ `,
3031
+ },
3032
+ 'Player.canSee': {
3033
+ en: `
3034
+ Whether he sees an entity: it is inside his field of view and nothing
3035
+ solid stands between his eyes and it - a player's eyes, an entity's
3036
+ origin. \`false\` for one that is gone.
3037
+
3038
+ Pawn: \`is_visible\`, \`is_in_viewcone\`, \`fm_is_ent_visible\`
3039
+ `,
3040
+ ru: `
3041
+ Видит ли он сущность: она в его поле зрения, и между его глазами и ней нет
3042
+ ничего твёрдого — до глаз игрока, до позиции сущности. \`false\` для сущности,
3043
+ которой уже нет.
3044
+
3045
+ Pawn: \`is_visible\`, \`is_in_viewcone\`, \`fm_is_ent_visible\`
3046
+ `,
3047
+ },
3048
+ 'Player.canSeePoint': {
3049
+ en: `
3050
+ Whether he sees a point: it is inside his field of view and nothing
3051
+ solid stands between his eyes and it.
3052
+
3053
+ Pawn: \`is_in_viewcone\`, \`trace_line\`
3054
+ `,
3055
+ ru: `
3056
+ Видит ли он точку: она в его поле зрения, и между его глазами и ней нет
3057
+ ничего твёрдого.
3058
+
3059
+ Pawn: \`is_in_viewcone\`, \`trace_line\`
3060
+ `,
3061
+ },
3062
+ 'Aim': {
3063
+ en: `
3064
+ A player's aim: the point his view reaches and what is there.
3065
+ `,
3066
+ ru: `
3067
+ Прицел игрока: точка, до которой доходит взгляд, и что там.
3068
+ `,
3069
+ },
3070
+ 'Aim.point': {
3071
+ en: `
3072
+ The point where his view first meets something, as far as 8192 units.
3073
+ `,
3074
+ ru: `
3075
+ Точка, где его взгляд впервые во что-то упирается, не дальше 8192 единиц.
3076
+ `,
3077
+ },
3078
+ 'Aim.entity': {
3079
+ en: `
3080
+ The entity at that point: a player, an entity, the world (entity \`0\`), or \`null\` for nothing in reach.
3081
+ `,
3082
+ ru: `
3083
+ Сущность в этой точке: игрок, сущность, мир (сущность \`0\`) или \`null\`, если в пределах досягаемости ничего нет.
3084
+ `,
3085
+ },
3086
+ 'Aim.hitGroup': {
3087
+ en: `
3088
+ The part of a player he aims at, \`"generic"\` for anything else.
3089
+ `,
3090
+ ru: `
3091
+ Часть тела игрока, в которую он целится; \`"generic"\` для всего остального.
3092
+ `,
3093
+ },
3094
+ 'TraceOptions': {
3095
+ en: `
3096
+ The options of \`trace.line\` and \`trace.hull\`: what a trace passes through.
3097
+ `,
3098
+ ru: `
3099
+ Параметры \`trace.line\` и \`trace.hull\`: то, что проходит трассировка.
3100
+ `,
3101
+ },
3102
+ 'TraceOptions.ignore': {
3103
+ en: `
3104
+ An entity the trace passes through: the one it starts from, as a rule.
3105
+ `,
3106
+ ru: `
3107
+ Сущность, сквозь которую трассировка проходит, — как правило, та, от которой она начинается.
3108
+ `,
3109
+ },
3110
+ 'TraceOptions.monsters': {
3111
+ en: `
3112
+ Whether it stops at players and monsters too, not only at the world and solid entities; \`true\` when left out.
3113
+ `,
3114
+ ru: `
3115
+ Останавливается ли она и на игроках и монстрах, а не только на мире и твёрдых сущностях; \`true\`, если не указано.
3116
+ `,
3117
+ },
3118
+ 'TraceHull': {
3119
+ en: `
3120
+ The size of what a hull trace moves: a point, a standing player, a large monster, a crouching player.
3121
+ `,
3122
+ ru: `
3123
+ Размер того, что двигает трассировка коробки: точка, стоящий игрок, большой монстр, присевший игрок.
3124
+ `,
3125
+ },
3126
+ 'TraceResult': {
3127
+ en: `
3128
+ A trace's result: where it stopped, at what, and how.
3129
+ `,
3130
+ ru: `
3131
+ Результат трассировки: где она остановилась, на чём и как.
3132
+ `,
3133
+ },
3134
+ 'TraceResult.fraction': {
3135
+ en: `
3136
+ The share of the way it went, \`0\` to \`1\`: \`1\` reached the end.
3137
+ `,
3138
+ ru: `
3139
+ Какую часть пути она прошла, от \`0\` до \`1\`: \`1\` — дошла до конца.
3140
+ `,
3141
+ },
3142
+ 'TraceResult.end': {
3143
+ en: `
3144
+ The point it stopped at: the end when nothing was in the way.
3145
+ `,
3146
+ ru: `
3147
+ Точка, где она остановилась: конец пути, если ничего не мешало.
3148
+ `,
3149
+ },
3150
+ 'TraceResult.normal': {
3151
+ en: `
3152
+ The direction the surface it hit faces; zero when it hit nothing.
3153
+ `,
3154
+ ru: `
3155
+ Направление, куда обращена поверхность, в которую она попала; нулевой вектор, если ни во что не попала.
3156
+ `,
3157
+ },
3158
+ 'TraceResult.entity': {
3159
+ en: `
3160
+ The entity it hit - the world is entity \`0\` - or \`null\` when nothing was in the way.
3161
+ `,
3162
+ ru: `
3163
+ Сущность, в которую она попала (мир — сущность \`0\`), или \`null\`, если ничего не мешало.
3164
+ `,
3165
+ },
3166
+ 'TraceResult.startSolid': {
3167
+ en: `
3168
+ Whether it started inside something solid.
3169
+ `,
3170
+ ru: `
3171
+ Началась ли она внутри чего-то твёрдого.
3172
+ `,
3173
+ },
3174
+ 'TraceResult.allSolid': {
3175
+ en: `
3176
+ Whether it was inside something solid all the way.
3177
+ `,
3178
+ ru: `
3179
+ Была ли она внутри чего-то твёрдого на всём пути.
3180
+ `,
3181
+ },
3182
+ 'TraceResult.inOpen': {
3183
+ en: `
3184
+ Whether it ended in the open air.
3185
+ `,
3186
+ ru: `
3187
+ Закончилась ли она на открытом воздухе.
3188
+ `,
3189
+ },
3190
+ 'TraceResult.inWater': {
3191
+ en: `
3192
+ Whether it ended in water.
3193
+ `,
3194
+ ru: `
3195
+ Закончилась ли она в воде.
3196
+ `,
3197
+ },
3198
+ 'TraceResult.hitGroup': {
3199
+ en: `
3200
+ The part of a player it hit, \`"generic"\` for anything else.
3201
+ `,
3202
+ ru: `
3203
+ Часть тела игрока, в которую она попала; \`"generic"\` для всего остального.
3204
+ `,
3205
+ },
3206
+ 'TraceResult.hit': {
3207
+ en: `
3208
+ Whether something was in the way: \`fraction\` is less than \`1\`.
3209
+ `,
3210
+ ru: `
3211
+ Мешало ли что-то: \`fraction\` меньше \`1\`.
3212
+ `,
3213
+ },
3214
+ 'trace': {
3215
+ en: `
3216
+ Traces through the world: a line, \`trace.line(start, end)\`, or a box,
3217
+ \`trace.hull(start, end, "human")\` - what a bullet or a player moving there
3218
+ would meet.
3219
+ `,
3220
+ ru: `
3221
+ Трассировки сквозь мир: линия, \`trace.line(start, end)\`, или коробка,
3222
+ \`trace.hull(start, end, "human")\`, — то, что встретила бы пуля или игрок,
3223
+ движущийся туда.
3224
+ `,
3225
+ },
3226
+ 'trace.line': {
3227
+ en: `
3228
+ Traces a line from \`start\` to \`end\` and tells where it stopped and at
3229
+ what: \`trace.line(eyes, eyes.add(forward.scale(8192)), { ignore: player
3230
+ }).entity\`.
3231
+
3232
+ Pawn: \`trace_line\`, \`engfunc(EngFunc_TraceLine, ...)\`, \`create_tr2\`, \`get_tr2\`, \`free_tr2\`
3233
+ `,
3234
+ ru: `
3235
+ Проводит линию от \`start\` до \`end\` и говорит, где и на чём она
3236
+ остановилась: \`trace.line(eyes, eyes.add(forward.scale(8192)), { ignore:
3237
+ player }).entity\`.
3238
+
3239
+ Pawn: \`trace_line\`, \`engfunc(EngFunc_TraceLine, ...)\`, \`create_tr2\`, \`get_tr2\`, \`free_tr2\`
3240
+ `,
3241
+ },
3242
+ 'trace.hull': {
3243
+ en: `
3244
+ Moves a box of a player's or a monster's size from \`start\` to \`end\`
3245
+ and tells where it stopped: \`trace.hull(origin, origin, "human").startSolid\`
3246
+ - a player put there would be stuck.
3247
+
3248
+ Pawn: \`trace_hull\`, \`engfunc(EngFunc_TraceHull, ...)\`
3249
+ `,
3250
+ ru: `
3251
+ Двигает коробку размером с игрока или монстра от \`start\` до \`end\` и
3252
+ говорит, где она остановилась: \`trace.hull(origin, origin, "human").startSolid\`
3253
+ — игрок, поставленный туда, застрянет.
3254
+
3255
+ Pawn: \`trace_hull\`, \`engfunc(EngFunc_TraceHull, ...)\`
3256
+ `,
3257
+ },
3258
+ 'pointContents': {
3259
+ en: `
3260
+ The contents of a point of the world: \`pointContents(origin) == "water"\`. A
3261
+ point inside a wall is \`"solid"\`; flowing water is one of the \`current\`
3262
+ kinds.
3263
+
3264
+ Pawn: \`point_contents\`, \`engfunc(EngFunc_PointContents, ...)\`
3265
+ `,
3266
+ ru: `
3267
+ Содержимое точки мира: \`pointContents(origin) == "water"\`. Точка внутри
3268
+ стены — \`"solid"\`; текущая вода — один из видов \`current\`.
3269
+
3270
+ Pawn: \`point_contents\`, \`engfunc(EngFunc_PointContents, ...)\`
3271
+ `,
3272
+ },
3273
+ 'Server.game': {
3274
+ en: `
3275
+ The game's folder, e.g. \`"cstrike"\`, \`"czero"\`.
3276
+
3277
+ Pawn: \`get_modname\`
3278
+ `,
3279
+ ru: `
3280
+ Папка игры, например \`"cstrike"\`, \`"czero"\`.
3281
+
3282
+ Pawn: \`get_modname\`
3283
+ `,
3284
+ },
3285
+ 'Server.versions': {
3286
+ en: `
3287
+ The versions of what the server runs: \`server.versions.reGameDll
3288
+ != null\` on ReGameDLL. ReHLDS's and ReGameDLL's are their API's,
3289
+ \`null\` on a server without them.
3290
+
3291
+ Pawn: \`get_amxx_verstring\`, \`is_rehlds\`, \`is_regamedll\`
3292
+ `,
3293
+ ru: `
3294
+ Версии того, что запущено на сервере: \`server.versions.reGameDll !=
3295
+ null\` на ReGameDLL. У ReHLDS и ReGameDLL — версия их API, \`null\` на сервере
3296
+ без них.
3297
+
3298
+ Pawn: \`get_amxx_verstring\`, \`is_rehlds\`, \`is_regamedll\`
3299
+ `,
3300
+ },
3301
+ 'Server.mapExists': {
3302
+ en: `
3303
+ Whether the server has the map: \`server.mapExists("de_dust2")\`.
3304
+
3305
+ Pawn: \`is_map_valid\`
3306
+ `,
3307
+ ru: `
3308
+ Есть ли карта на сервере: \`server.mapExists("de_dust2")\`.
3309
+
3310
+ Pawn: \`is_map_valid\`
3311
+ `,
3312
+ },
3313
+ 'Server.changeLevel': {
3314
+ en: `
3315
+ Goes to the map now: \`false\`, staying, for a map the server does not
3316
+ have.
3317
+
3318
+ Pawn: \`engine_changelevel\`, \`server_cmd("changelevel ...")\`
3319
+ `,
3320
+ ru: `
3321
+ Переходит на карту сейчас: \`false\` — и остаётся, — если такой карты на
3322
+ сервере нет.
3323
+
3324
+ Pawn: \`engine_changelevel\`, \`server_cmd("changelevel ...")\`
3325
+ `,
3326
+ },
3327
+ 'Server.lightStyle': {
3328
+ en: `
3329
+ The map's light, \`"a"\` the darkest to \`"z"\` the brightest, \`"m"\` the
3330
+ map's own: \`server.lightStyle = "b"\`. It lasts until the map changes.
3331
+
3332
+ Pawn: \`set_lights\`, \`engfunc(EngFunc_LightStyle, 0, ...)\`
3333
+ `,
3334
+ ru: `
3335
+ Свет карты, от \`"a"\`, самого тёмного, до \`"z"\`, самого яркого; \`"m"\` —
3336
+ свет самой карты: \`server.lightStyle = "b"\`. Держится до смены карты.
3337
+
3338
+ Pawn: \`set_lights\`, \`engfunc(EngFunc_LightStyle, 0, ...)\`
3339
+ `,
3340
+ },
3341
+ 'Server.print': {
3342
+ en: `
3343
+ Sends every player a message: \`server.print("Round 3")\`, in the chat;
3344
+ \`variant\` puts it in the middle of the screen (\`"center"\`) or the
3345
+ console. Colour tags work as in \`player.print\`.
3346
+
3347
+ Pawn: \`client_print(0, ...)\`, \`client_print_color(0, ...)\`
3348
+ `,
3349
+ ru: `
3350
+ Отправляет сообщение всем игрокам: \`server.print("Round 3")\` — в чат;
3351
+ \`variant\` выводит его в середину экрана (\`"center"\`) или в консоль. Цветовые
3352
+ теги работают как в \`player.print\`.
3353
+
3354
+ Pawn: \`client_print(0, ...)\`, \`client_print_color(0, ...)\`
3355
+ `,
3356
+ },
3357
+ 'ServerVersions': {
3358
+ en: `
3359
+ The versions of what a server runs: \`server.versions\`.
3360
+ `,
3361
+ ru: `
3362
+ Версии того, что запущено на сервере: \`server.versions\`.
3363
+ `,
3364
+ },
3365
+ 'ServerVersions.amxts': {
3366
+ en: `
3367
+ amxts's version, e.g. \`"0.3.0"\`.
3368
+ `,
3369
+ ru: `
3370
+ Версия amxts, например \`"0.3.0"\`.
3371
+ `,
3372
+ },
3373
+ 'ServerVersions.amxModX': {
3374
+ en: `
3375
+ AMX Mod X's version, e.g. \`"1.10.0.5467"\`.
3376
+ `,
3377
+ ru: `
3378
+ Версия AMX Mod X, например \`"1.10.0.5467"\`.
3379
+ `,
3380
+ },
3381
+ 'ServerVersions.metamod': {
3382
+ en: `
3383
+ Metamod's version, e.g. \`"1.3.0.149"\`.
3384
+ `,
3385
+ ru: `
3386
+ Версия Metamod, например \`"1.3.0.149"\`.
3387
+ `,
3388
+ },
3389
+ 'ServerVersions.reHlds': {
3390
+ en: `
3391
+ ReHLDS's API version, e.g. \`"3.14"\`; \`null\` on another engine.
3392
+ `,
3393
+ ru: `
3394
+ Версия API ReHLDS, например \`"3.14"\`; \`null\` на другом движке.
3395
+ `,
3396
+ },
3397
+ 'ServerVersions.reGameDll': {
3398
+ en: `
3399
+ ReGameDLL's API version, e.g. \`"5.28"\`; \`null\` on the original game.
3400
+ `,
3401
+ ru: `
3402
+ Версия API ReGameDLL, например \`"5.28"\`; \`null\` в оригинальной игре.
3403
+ `,
3404
+ },
3405
+ 'lang.languages': {
3406
+ en: `
3407
+ The languages of a dictionary, by their codes, in the file's order:
3408
+ \`lang.languages("myplugin")\` is \`["en", "ru"]\`. Without a name, those of
3409
+ the dictionaries this plugin loaded with \`lang.load\` - not every
3410
+ language the server's dictionaries have.
3411
+
3412
+ Pawn: \`get_langsnum\`, \`get_lang\`
3413
+ `,
3414
+ ru: `
3415
+ Языки словаря по их кодам, в порядке файла:
3416
+ \`lang.languages("myplugin")\` — это \`["en", "ru"]\`. Без имени — языки
3417
+ словарей, которые этот плагин загрузил через \`lang.load\`, а не все
3418
+ языки словарей сервера.
3419
+
3420
+ Pawn: \`get_langsnum\`, \`get_lang\`
3421
+ `,
3422
+ },
3423
+ 'Menu.addText': {
3424
+ en: `
3425
+ Adds a line of text under the last item added - under the title when
3426
+ there is none yet - with no number: a note, a price, a heading of the
3427
+ next items. It is shown and hidden with that item.
3428
+
3429
+ Pawn: \`menu_addtext\`, \`menu_addtext2\`
3430
+ `,
3431
+ ru: `
3432
+ Добавляет строку текста под последним добавленным пунктом — под заголовком,
3433
+ если пунктов ещё нет, — без номера: пояснение, цена, заголовок следующих
3434
+ пунктов. Она показывается и скрывается вместе с этим пунктом.
3435
+
3436
+ Pawn: \`menu_addtext\`, \`menu_addtext2\`
3437
+ `,
3438
+ },
3439
+ 'Menu.addBlank': {
3440
+ en: `
3441
+ Adds an empty line under the last item added: \`addText("")\`.
3442
+
3443
+ Pawn: \`menu_addblank\`, \`menu_addblank2\`
3444
+ `,
3445
+ ru: `
3446
+ Добавляет пустую строку под последним добавленным пунктом: \`addText("")\`.
3447
+
3448
+ Pawn: \`menu_addblank\`, \`menu_addblank2\`
3449
+ `,
3450
+ },
3451
+ 'Player.view': {
3452
+ en: `
3453
+ The entity he sees the world through - a camera, another player -
3454
+ or \`null\` for his own eyes: \`player.view = camera\`, \`player.view =
3455
+ null\` back.
3456
+
3457
+ Pawn: \`attach_view\`, \`engset_view\`, \`engfunc(EngFunc_SetView, ...)\`
3458
+ `,
3459
+ ru: `
3460
+ Сущность, через которую он видит мир, — камера, другой игрок, — или \`null\`
3461
+ для его собственных глаз: \`player.view = camera\`, \`player.view = null\` —
3462
+ обратно.
3463
+
3464
+ Pawn: \`attach_view\`, \`engset_view\`, \`engfunc(EngFunc_SetView, ...)\`
3465
+ `,
3466
+ },
3467
+ 'RemoveAllItemsOptions': {
3468
+ en: `
3469
+ The options of \`player.removeAllItems\`: what goes with the weapons.
3470
+ `,
3471
+ ru: `
3472
+ Параметры \`player.removeAllItems\`: что уходит вместе с оружием.
3473
+ `,
3474
+ },
3475
+ 'RemoveAllItemsOptions.suit': {
3476
+ en: `
3477
+ The suit too - his armour and the HUD; \`false\` when left out.
3478
+ `,
3479
+ ru: `
3480
+ И костюм — его броню и HUD; \`false\`, если не указано.
3481
+ `,
3482
+ },
3483
+ 'Player.loss': {
3484
+ en: `
3485
+ The share of his packets lost, in percent, as the scoreboard's ping
3486
+ column has it.
3487
+
3488
+ Pawn: \`get_user_ping(id, ping, loss)\`
3489
+ `,
3490
+ ru: `
3491
+ Доля его потерянных пакетов в процентах, как в столбце пинга таблицы
3492
+ счёта.
3493
+
3494
+ Pawn: \`get_user_ping(id, ping, loss)\`
3495
+ `,
3496
+ },
3497
+ 'Player.model': {
3498
+ en: `
3499
+ The model he wears, as his game knows it, e.g. \`"vip"\`, \`"gign"\`, or one
3500
+ of the server's own, \`models/player/<model>/<model>.mdl\`. Set, it
3501
+ stays through his respawns and team changes until \`resetModel()\` -
3502
+ \`setModel\` keeps its hitboxes too.
3503
+
3504
+ Pawn: \`cs_get_user_model\`, \`cs_set_user_model\`, \`rg_set_user_model\`
3505
+ `,
3506
+ ru: `
3507
+ Модель, которую он носит, как её знает его игра, например \`"vip"\`, \`"gign"\`,
3508
+ или своя модель сервера, \`models/player/<model>/<model>.mdl\`. Заданная,
3509
+ она остаётся при возрождениях и смене команды до \`resetModel()\`; \`setModel\`
3510
+ меняет ещё и хитбоксы.
3511
+
3512
+ Pawn: \`cs_get_user_model\`, \`cs_set_user_model\`, \`rg_set_user_model\`
3513
+ `,
3514
+ },
3515
+ 'Player.setModel': {
3516
+ en: `
3517
+ Puts a model on him, as \`player.model = name\` does; \`{ hitboxes: true
3518
+ }\` takes the model's own hitboxes too, for a model shaped other than
3519
+ the game's - precached with \`server.precache("models/player/<name>/<name>.mdl")\`.
3520
+
3521
+ Pawn: \`cs_set_user_model(id, model, true)\`, \`rg_set_user_model(id, model, true)\`
3522
+ `,
3523
+ ru: `
3524
+ Надевает на него модель, как \`player.model = name\`; \`{ hitboxes: true }\`
3525
+ берёт ещё и хитбоксы самой модели — для модели другой формы, чем у игры,
3526
+ закэшированной через \`server.precache("models/player/<name>/<name>.mdl")\`.
3527
+
3528
+ Pawn: \`cs_set_user_model(id, model, true)\`, \`rg_set_user_model(id, model, true)\`
3529
+ `,
3530
+ },
3531
+ 'Player.resetModel': {
3532
+ en: `
3533
+ Gives him back the model the game chose for him, its hitboxes too.
3534
+
3535
+ Pawn: \`cs_reset_user_model\`, \`rg_reset_user_model\`
3536
+ `,
3537
+ ru: `
3538
+ Возвращает ему модель, которую выбрала для него игра, и её хитбоксы.
3539
+
3540
+ Pawn: \`cs_reset_user_model\`, \`rg_reset_user_model\`
3541
+ `,
3542
+ },
3543
+ 'ModelOptions': {
3544
+ en: `
3545
+ The options of \`player.setModel\`: what goes with the model.
3546
+ `,
3547
+ ru: `
3548
+ Параметры \`player.setModel\`: что идёт вместе с моделью.
3549
+ `,
3550
+ },
3551
+ 'ModelOptions.hitboxes': {
3552
+ en: `
3553
+ The model's own hitboxes, not the game's: for a model shaped otherwise; \`false\` when left out.
3554
+ `,
3555
+ ru: `
3556
+ Хитбоксы самой модели, а не игры: для модели другой формы; \`false\`, если не указано.
3557
+ `,
3558
+ },
3559
+ 'EntityStateEvent': {
3560
+ en: `
3561
+ The state of an entity a player can see, as he is sent it this frame:
3562
+ its fields as he will see them. Writing one changes what he sees, not the
3563
+ entity - \`event.renderFx = "glowShell"\` makes it glow for him alone - and
3564
+ \`preventDefault()\` hides it from him.
3565
+
3566
+ \`\`\`ts
3567
+ game.addEventListener("entityState", (event) => {
3568
+ if (event.player.team != "CT") event.preventDefault();
3569
+ }, { classname: "myplugin_marker" });
3570
+ \`\`\`
3571
+
3572
+ Pawn: \`register_forward(FM_AddToFullPack, ..., 1)\`, \`get_es\`, \`set_es\`
3573
+ `,
3574
+ ru: `
3575
+ Состояние сущности, которую видит игрок, как он получает его в этом кадре:
3576
+ её поля такими, какими он их увидит. Запись поля меняет то, что видит он, а
3577
+ не саму сущность, — \`event.renderFx = "glowShell"\` подсвечивает её только для
3578
+ него, — а \`preventDefault()\` скрывает её от него.
3579
+
3580
+ \`\`\`ts
3581
+ game.addEventListener("entityState", (event) => {
3582
+ if (event.player.team != "CT") event.preventDefault();
3583
+ }, { classname: "myplugin_marker" });
3584
+ \`\`\`
3585
+
3586
+ Pawn: \`register_forward(FM_AddToFullPack, ..., 1)\`, \`get_es\`, \`set_es\`
3587
+ `,
3588
+ },
3589
+ 'EntityStateEvent.player': {
3590
+ en: `
3591
+ The player it is sent to.
3592
+ `,
3593
+ ru: `
3594
+ Игрок, которому оно отправляется.
3595
+ `,
3596
+ },
3597
+ 'EntityStateEvent.entity': {
3598
+ en: `
3599
+ The entity it is about: a player, or another entity.
3600
+ `,
3601
+ ru: `
3602
+ Сущность, о которой оно: игрок или другая сущность.
3603
+ `,
3604
+ },
3605
+ 'EntityStateEvent.origin': {
3606
+ en: `
3607
+ The entity's position as he sees it.
3608
+
3609
+ Pawn: \`ES_Origin\`
3610
+ `,
3611
+ ru: `
3612
+ Позиция сущности, какой он её видит.
3613
+
3614
+ Pawn: \`ES_Origin\`
3615
+ `,
3616
+ },
3617
+ 'EntityStateEvent.angles': {
3618
+ en: `
3619
+ The entity's angles as he sees them.
3620
+
3621
+ Pawn: \`ES_Angles\`
3622
+ `,
3623
+ ru: `
3624
+ Углы сущности, какими он их видит.
3625
+
3626
+ Pawn: \`ES_Angles\`
3627
+ `,
3628
+ },
3629
+ 'EntityStateEvent.renderMode': {
3630
+ en: `
3631
+ The entity's render mode as he sees it, as its \`renderMode\`.
3632
+
3633
+ Pawn: \`ES_RenderMode\`
3634
+ `,
3635
+ ru: `
3636
+ Режим отрисовки сущности, каким он его видит, как её \`renderMode\`.
3637
+
3638
+ Pawn: \`ES_RenderMode\`
3639
+ `,
3640
+ },
3641
+ 'EntityStateEvent.renderAmount': {
3642
+ en: `
3643
+ The entity's opacity as he sees it, \`0\` to \`255\`, as its \`renderAmount\`.
3644
+
3645
+ Pawn: \`ES_RenderAmt\`
3646
+ `,
3647
+ ru: `
3648
+ Непрозрачность сущности, какой он её видит, от \`0\` до \`255\`, как её \`renderAmount\`.
3649
+
3650
+ Pawn: \`ES_RenderAmt\`
3651
+ `,
3652
+ },
3653
+ 'EntityStateEvent.renderColor': {
3654
+ en: `
3655
+ The entity's render colour as he sees it, red, green, blue, as its \`renderColor\`.
3656
+
3657
+ Pawn: \`ES_RenderColor\`
3658
+ `,
3659
+ ru: `
3660
+ Цвет отрисовки сущности, каким он его видит, — красный, зелёный, синий, как её \`renderColor\`.
3661
+
3662
+ Pawn: \`ES_RenderColor\`
3663
+ `,
3664
+ },
3665
+ 'EntityStateEvent.renderFx': {
3666
+ en: `
3667
+ The entity's render effect as he sees it, as its \`renderFx\`: \`"glowShell"\` a shell around it.
3668
+
3669
+ Pawn: \`ES_RenderFx\`
3670
+ `,
3671
+ ru: `
3672
+ Эффект отрисовки сущности, каким он его видит, как её \`renderFx\`: \`"glowShell"\` — оболочка вокруг неё.
3673
+
3674
+ Pawn: \`ES_RenderFx\`
3675
+ `,
3676
+ },
3677
+ 'EntityStateEvent.effects': {
3678
+ en: `
3679
+ The entity's effects as he sees them, as its \`effects\`.
3680
+
3681
+ Pawn: \`ES_Effects\`
3682
+ `,
3683
+ ru: `
3684
+ Эффекты сущности, какими он их видит, как её \`effects\`.
3685
+
3686
+ Pawn: \`ES_Effects\`
3687
+ `,
3688
+ },
3689
+ 'EntityStateEvent.modelIndex': {
3690
+ en: `
3691
+ The model he sees, by its precache index.
3692
+
3693
+ Pawn: \`ES_ModelIndex\`
3694
+ `,
3695
+ ru: `
3696
+ Модель, которую он видит, по её индексу прекэша.
3697
+
3698
+ Pawn: \`ES_ModelIndex\`
3699
+ `,
3700
+ },
3701
+ 'EntityStateEvent.body': {
3702
+ en: `
3703
+ The model's body part he sees.
3704
+
3705
+ Pawn: \`ES_Body\`
3706
+ `,
3707
+ ru: `
3708
+ Часть тела модели, которую он видит.
3709
+
3710
+ Pawn: \`ES_Body\`
3711
+ `,
3712
+ },
3713
+ 'EntityStateEvent.skin': {
3714
+ en: `
3715
+ The model's skin he sees.
3716
+
3717
+ Pawn: \`ES_Skin\`
3718
+ `,
3719
+ ru: `
3720
+ Скин модели, который он видит.
3721
+
3722
+ Pawn: \`ES_Skin\`
3723
+ `,
3724
+ },
3725
+ 'EntityStateEvent.preventDefault': {
3726
+ en: `
3727
+ Hides the entity from him this frame.
3728
+ `,
3729
+ ru: `
3730
+ Скрывает от него сущность в этом кадре.
3731
+ `,
3732
+ },
3733
+ 'GameListenerOptions': {
3734
+ en: `
3735
+ The third argument of \`game.addEventListener\`: \`true\` stands for
3736
+ \`{ post: true }\`; a \`"touch"\` listener names the classes it is about.
3737
+ `,
3738
+ ru: `
3739
+ Третий аргумент \`game.addEventListener\`: \`true\` означает
3740
+ \`{ post: true }\`; обработчик \`"touch"\` называет классы, о которых речь.
3741
+ `,
3742
+ },
3743
+ 'GameListenerOptions.post': {
3744
+ en: `Runs the listener after the game has acted, with its answer in \`event.result\`.`,
3745
+ ru: `Вызывает обработчик после того, как игра сделала своё, с её ответом в \`event.result\`.`,
3746
+ },
3747
+ 'GameListenerOptions.classname': {
3748
+ en: `The class of entity the event is listened for on, e.g. \`"weapon_knife"\`: only its entities reach the listener.`,
3749
+ ru: `Класс сущностей, на котором слушается событие, например \`"weapon_knife"\`: до обработчика доходят только его сущности.`,
3750
+ },
3751
+ 'UseType': {
3752
+ en: `
3753
+ The way one entity uses another - a button pressed, a door opened - one of
3754
+ \`"off"\`, \`"on"\`, \`"set"\` or \`"toggle"\`.
3755
+
3756
+ Pawn: \`USE_OFF\`, \`USE_ON\`, \`USE_SET\`, \`USE_TOGGLE\`
3757
+ `,
3758
+ ru: `
3759
+ Способ, которым одна сущность использует другую, — нажимает кнопку, открывает
3760
+ дверь, — одно из \`"off"\`, \`"on"\`, \`"set"\` или \`"toggle"\`.
3761
+
3762
+ Pawn: \`USE_OFF\`, \`USE_ON\`, \`USE_SET\`, \`USE_TOGGLE\`
3763
+ `,
3764
+ },
3765
+ 'ActionOptions': {
3766
+ en: `The options of an entity's action such as \`weapon.deploy()\` or \`entity.heal(...)\`.`,
3767
+ ru: `Настройки действия сущности, такого как \`weapon.deploy()\` или \`entity.heal(...)\`.`,
3768
+ },
3769
+ 'ActionOptions.hooks': {
3770
+ en: `
3771
+ Whether the game's listeners run too - this plugin's and every other's,
3772
+ Pawn ones included; \`true\` by default. \`false\` runs the game's own
3773
+ function alone.
3774
+
3775
+ Pawn: \`ExecuteHamB\`, \`ExecuteHam\`
3776
+ `,
3777
+ ru: `
3778
+ Вызываются ли и обработчики игры — этого плагина и всех остальных,
3779
+ Pawn-плагинов тоже; по умолчанию \`true\`. \`false\` выполняет только
3780
+ собственную функцию игры.
3781
+
3782
+ Pawn: \`ExecuteHamB\`, \`ExecuteHam\`
3783
+ `,
3784
+ },
3785
+ 'GameListenerOptions.toucher': {
3786
+ en: `For \`"touch"\`: the class of the entity that moves into the other, e.g. \`"player"\`; left out, any.`,
3787
+ ru: `Для \`"touch"\`: класс сущности, которая входит в другую, например \`"player"\`; если не задан — любой.`,
3788
+ },
3789
+ 'GameListenerOptions.touched': {
3790
+ en: `For \`"touch"\`: the class of the entity touched, e.g. \`"func_door"\`; left out, any.`,
3791
+ ru: `Для \`"touch"\`: класс сущности, которой коснулись, например \`"func_door"\`; если не задан — любой.`,
3792
+ },
3793
+ 'TouchEvent': {
3794
+ en: `
3795
+ Two entities touched: \`toucher\` moved into \`touched\`. Only the classes a
3796
+ listener asked for reach it:
3797
+
3798
+ \`\`\`ts
3799
+ game.addEventListener("touch", onTouch, { toucher: "player", touched: "player" });
3800
+ \`\`\`
3801
+
3802
+ Pawn: \`register_touch\`
3803
+ `,
3804
+ ru: `
3805
+ Две сущности коснулись: \`toucher\` вошла в \`touched\`. До обработчика
3806
+ доходят только классы, которые он просил:
3807
+
3808
+ \`\`\`ts
3809
+ game.addEventListener("touch", onTouch, { toucher: "player", touched: "player" });
3810
+ \`\`\`
3811
+
3812
+ Pawn: \`register_touch\`
3813
+ `,
3814
+ },
3815
+ 'TouchEvent.toucher': {
3816
+ en: `The entity that moved into the other.`,
3817
+ ru: `Сущность, которая вошла в другую.`,
3818
+ },
3819
+ 'TouchEvent.touched': {
3820
+ en: `The entity it touched.`,
3821
+ ru: `Сущность, которой она коснулась.`,
3822
+ },
3823
+ 'TouchEvent.preventDefault': {
3824
+ en: `Blocks the touch: the game does not act on it.`,
3825
+ ru: `Блокирует касание: игра на него не реагирует.`,
3826
+ },
3827
+ 'RoundWinner': {
3828
+ en: `The winner of a round, one of \`"TERRORIST"\`, \`"CT"\`, \`"draw"\`, or \`"none"\` - a restart without a winner.`,
3829
+ ru: `Победитель раунда, одно из \`"TERRORIST"\`, \`"CT"\`, \`"draw"\` или \`"none"\` — рестарт без победителя.`,
3830
+ },
3831
+ 'EndRoundOptions': {
3832
+ en: `The options of \`game.endRound\`; only \`winner\` is required.`,
3833
+ ru: `Настройки \`game.endRound\`; обязателен только \`winner\`.`,
3834
+ },
3835
+ 'EndRoundOptions.winner': {
3836
+ en: `The round's winner, one of \`"TERRORIST"\`, \`"CT"\`, \`"draw"\`, or \`"none"\` - a restart.`,
3837
+ ru: `Победитель раунда, одно из \`"TERRORIST"\`, \`"CT"\`, \`"draw"\` или \`"none"\` — рестарт.`,
3838
+ },
3839
+ 'EndRoundOptions.delay': {
3840
+ en: `Seconds until the next round starts; \`5\` by default.`,
3841
+ ru: `Секунд до начала следующего раунда; по умолчанию \`5\`.`,
3842
+ },
3843
+ 'EndRoundOptions.message': {
3844
+ en: `The message in the middle of the screen, or a game text such as \`"#Terrorists_Win"\`; \`"default"\` is the usual one for this winner, \`""\` none.`,
3845
+ ru: `Сообщение посередине экрана или текст игры вроде \`"#Terrorists_Win"\`; \`"default"\` — обычное для этого победителя, \`""\` — без сообщения.`,
3846
+ },
3847
+ 'EndRoundOptions.sound': {
3848
+ en: `The sound, a radio phrase such as \`"terwin"\`; \`"default"\` is the usual one for this winner, \`""\` none.`,
3849
+ ru: `Звук — радиофраза вроде \`"terwin"\`; \`"default"\` — обычный для этого победителя, \`""\` — без звука.`,
3850
+ },
3851
+ 'EndRoundOptions.dispatch': {
3852
+ en: `
3853
+ \`true\` to tell the \`roundEnd\` listeners of every plugin, Pawn ones too, as when
3854
+ the game ends a round itself. \`false\` by default: a \`roundEnd\` listener that
3855
+ ends the round would call itself.
3856
+
3857
+ Pawn: \`rg_round_end(..., trigger)\`
3858
+ `,
3859
+ ru: `
3860
+ \`true\` — оповестить обработчики \`roundEnd\` всех плагинов, в том числе
3861
+ Pawn-плагинов, как когда игра сама завершает раунд. По умолчанию \`false\`:
3862
+ обработчик \`roundEnd\`, который завершает раунд, вызвал бы сам себя.
3863
+
3864
+ Pawn: \`rg_round_end(..., trigger)\`
3865
+ `,
3866
+ },
3867
+ 'game': {
3868
+ en: `The game the plugin runs in: its events (reapi hookchains and Ham Sandwich functions), its rules' fields and \`endRound\`.`,
3869
+ ru: `Игра, в которой работает плагин: её события (hookchain'ы reapi и функции Ham Sandwich), поля её правил и \`endRound\`.`,
3870
+ },
3871
+ 'Variant': {
3872
+ en: `
3873
+ The places a message can show: \`Variant.chat\`, \`center\`, \`console\`, \`notify\`.
3874
+ A plain string works the same - \`"center"\`; an unknown name goes to chat.
3875
+
3876
+ Pawn: \`print_chat\`, \`print_center\`, \`print_console\`, \`print_notify\`
3877
+ `,
3878
+ ru: `
3879
+ Места, где показывается сообщение: \`Variant.chat\`, \`center\`, \`console\`,
3880
+ \`notify\`. Обычная строка работает так же — \`"center"\`; незнакомое имя уходит
3881
+ в чат.
3882
+
3883
+ Pawn: \`print_chat\`, \`print_center\`, \`print_console\`, \`print_notify\`
3884
+ `,
3885
+ },
3886
+ 'Variant.chat': {
3887
+ en: `A line in the player's chat.`,
3888
+ ru: `Строка в чате игрока.`,
2430
3889
  },
2431
3890
  'Variant.center': {
2432
3891
  en: `Text in the middle of the player's screen.`,
@@ -2444,21 +3903,9 @@ export default {
2444
3903
  en: `The place a message shows, as a string: one of \`"chat"\`, \`"center"\`, \`"console"\` or \`"notify"\`.`,
2445
3904
  ru: `Место показа сообщения строкой, одно из \`"chat"\`, \`"center"\`, \`"console"\` или \`"notify"\`.`,
2446
3905
  },
2447
- 'Target': {
2448
- en: `A message's recipient together with its place: \`{ id: 0, variant: "center" }\`. \`id\` is a player's \`id\`, \`0\` for everyone.`,
2449
- ru: `Получатель сообщения вместе с местом показа: \`{ id: 0, variant: "center" }\`. \`id\` — \`id\` игрока, \`0\` — все.`,
2450
- },
2451
- 'Target.id': {
2452
- en: `The recipient's player \`id\`; \`0\` for every player.`,
2453
- ru: `\`id\` игрока-получателя; \`0\` — все игроки.`,
2454
- },
2455
- 'Target.variant': {
2456
- en: `The place the message shows, one of \`"chat"\` (the default), \`"center"\`, \`"console"\` or \`"notify"\`.`,
2457
- ru: `Место показа сообщения, одно из \`"chat"\` (по умолчанию), \`"center"\`, \`"console"\` или \`"notify"\`.`,
2458
- },
2459
3906
  'paint': {
2460
- en: `Turns a chat line's colour tags (\`!g\`, \`!r\`, ...) into the colour codes the client reads, and records in \`swapTeam\` which team colour the line needs. \`print\` calls it; exported for tests.`,
2461
- ru: `Переводит цветовые метки строки чата (\`!g\`, \`!r\`, ...) в коды цвета для клиента и записывает в \`swapTeam\`, какой цвет команды нужен строке. Её вызывает \`print\`; экспортирована для тестов.`,
3907
+ en: `Turns a chat line's colour tags (\`!g\`, \`!r\`, ...) into the colour codes the client reads, and records in \`swapTeam\` which team colour the line needs. \`player.print\` calls it; exported for tests.`,
3908
+ ru: `Переводит цветовые метки строки чата (\`!g\`, \`!r\`, ...) в коды цвета для клиента и записывает в \`swapTeam\`, какой цвет команды нужен строке. Её вызывает \`player.print\`; экспортирована для тестов.`,
2462
3909
  },
2463
3910
  'menuColors': {
2464
3911
  en: `Turns a menu's colour tags (\`!y\`, \`!R\`, ...) into the codes the game draws, and drops the ones only chat has (\`!g\`, \`!b\`, \`!t\`) and the game's own codes written into the text (\`\\y\`); any other \`!\` stays. \`showMenu\` calls it, and a module hands its result to Pawn.`,
@@ -2477,58 +3924,8 @@ export default {
2477
3924
  `,
2478
3925
  },
2479
3926
  'swapTeam': {
2480
- en: `The team colour the last \`paint()\` chose for the line, one of \`"TERRORIST"\` (red), \`"CT"\` (blue), \`"SPECTATOR"\` (grey), or \`""\` - the reader's own team colour. \`print\` reads it right after.`,
2481
- ru: `Цвет команды, который последний вызов \`paint()\` выбрал для строки, — одно из \`"TERRORIST"\` (красный), \`"CT"\` (синий), \`"SPECTATOR"\` (серый) или \`""\` — цвет команды читающего. \`print\` читает его сразу после.`,
2482
- },
2483
- 'print': {
2484
- en: `
2485
- Sends a message to a player, or to every player (\`0\`).
2486
-
2487
- \`\`\`ts
2488
- print(player, "Health restored!"); // the player's chat
2489
- print(0, "Round starts in 5 seconds"); // everyone's chat
2490
- print(player, "Health restored!", "center"); // the middle of the player's screen
2491
- print({ id: 0, variant: "center" }, "Go!"); // the middle of everyone's screen
2492
- \`\`\`
2493
-
2494
- The first argument is a player, a player's \`id\`, or \`0\` for everyone. The third
2495
- is where the message shows, one of \`"chat"\` (the default), \`"center"\` - the middle of
2496
- the screen, \`"console"\` - the player's console, \`"notify"\` - the console too; CS
2497
- shows it on screen only with \`developer 1\`.
2498
-
2499
- Colour tags work in chat only, and a letter is the same colour as in a menu:
2500
- - \`!y\` yellow (the usual chat colour), \`!g\` green
2501
- - \`!r\` red, \`!b\` blue, \`!d\` grey, \`!t\` the colour of the reader's team
2502
-
2503
- A menu's own tags (\`!w\`, \`!R\`) are dropped from a chat line. Red, blue,
2504
- grey and \`!t\` share the message's one team colour: the first one used wins.
2505
-
2506
- Pawn: \`client_print\`, \`client_print_color\`
2507
- `,
2508
- ru: `
2509
- Отправляет сообщение игроку или всем игрокам (\`0\`).
2510
-
2511
- \`\`\`ts
2512
- print(player, "Health restored!"); // чат игрока
2513
- print(0, "Round starts in 5 seconds"); // чат всех игроков
2514
- print(player, "Health restored!", "center"); // посередине экрана игрока
2515
- print({ id: 0, variant: "center" }, "Go!"); // посередине экрана у всех
2516
- \`\`\`
2517
-
2518
- Первый аргумент — игрок, \`id\` игрока или \`0\` — все. Третий — где показать
2519
- сообщение, одно из \`"chat"\` (по умолчанию), \`"center"\` — посередине экрана, \`"console"\` —
2520
- в консоли игрока, \`"notify"\` — тоже в консоли; на экране CS показывает его
2521
- только при \`developer 1\`.
2522
-
2523
- Цветовые метки работают только в чате, и буква — тот же цвет, что в меню:
2524
- - \`!y\` жёлтый (обычный цвет чата), \`!g\` зелёный
2525
- - \`!r\` красный, \`!b\` синий, \`!d\` серый, \`!t\` цвет команды читающего
2526
-
2527
- Метки только для меню (\`!w\`, \`!R\`) из строки чата убираются. Красный, синий,
2528
- серый и \`!t\` делят один цвет команды на сообщение: побеждает первый.
2529
-
2530
- Pawn: \`client_print\`, \`client_print_color\`
2531
- `,
3927
+ en: `The team colour the last \`paint()\` chose for the line, one of \`"TERRORIST"\` (red), \`"CT"\` (blue), \`"SPECTATOR"\` (grey), or \`""\` - the reader's own team colour.`,
3928
+ ru: `Цвет команды, который последний вызов \`paint()\` выбрал для строки, — одно из \`"TERRORIST"\` (красный), \`"CT"\` (синий), \`"SPECTATOR"\` (серый) или \`""\` — цвет команды читающего.`,
2532
3929
  },
2533
3930
  'lang': {
2534
3931
  en: `
@@ -2537,7 +3934,7 @@ export default {
2537
3934
 
2538
3935
  \`\`\`ts
2539
3936
  lang.load("myplugin"); // data/lang/myplugin.txt
2540
- print(player, lang.translate(player, "MYPLUGIN_WELCOME", [player.name]));
3937
+ player.print(lang.translate(player, "MYPLUGIN_WELCOME", [player.name]));
2541
3938
  \`\`\`
2542
3939
 
2543
3940
  Pawn: \`register_dictionary\`, \`LookupLangKey\`
@@ -2548,7 +3945,7 @@ export default {
2548
3945
 
2549
3946
  \`\`\`ts
2550
3947
  lang.load("myplugin"); // data/lang/myplugin.txt
2551
- print(player, lang.translate(player, "MYPLUGIN_WELCOME", [player.name]));
3948
+ player.print(lang.translate(player, "MYPLUGIN_WELCOME", [player.name]));
2552
3949
  \`\`\`
2553
3950
 
2554
3951
  Pawn: \`register_dictionary\`, \`LookupLangKey\`
@@ -2695,7 +4092,7 @@ export default {
2695
4092
  as in the browser:
2696
4093
 
2697
4094
  \`\`\`ts
2698
- const handle = setTimeout(() => print(player, "Welcome!"), 2000);
4095
+ const handle = setTimeout(() => player.print("Welcome!"), 2000);
2699
4096
  clearTimeout(handle);
2700
4097
  \`\`\`
2701
4098
 
@@ -2708,7 +4105,7 @@ export default {
2708
4105
  таймера, как в браузере:
2709
4106
 
2710
4107
  \`\`\`ts
2711
- const handle = setTimeout(() => print(player, "Welcome!"), 2000);
4108
+ const handle = setTimeout(() => player.print("Welcome!"), 2000);
2712
4109
  clearTimeout(handle);
2713
4110
  \`\`\`
2714
4111
 
@@ -2934,28 +4331,60 @@ export default {
2934
4331
  },
2935
4332
  'hook': {
2936
4333
  en: `
2937
- Registers a reapi hookchain with a raw handler of four numbers - the low
2938
- level under \`game.addEventListener\`, which is what a plugin uses.
4334
+ Hooks a ReGameDLL or ReHLDS hookchain with a raw handler of four numbers -
4335
+ the low level under \`game.addEventListener\`, which is what a plugin uses.
4336
+ The handler reads the arguments past the fourth with \`arg()\`, and blocks the
4337
+ game's function with \`handled()\`.
2939
4338
 
2940
4339
  The name is reapi's, without the class where it is not needed:
2941
- \`"restart_round"\`, \`"player_spawn"\`; the editor completes them. The numbers
2942
- behind the names come from reapi's includes, so they must be the ones of the
2943
- reapi the server runs. Returns the hook's handle.
4340
+ \`"restart_round"\`, \`"player_spawn"\`; the editor completes them. Returns the
4341
+ hook's handle for \`unhook\`, or \`0\` when the server has not the chain's API -
4342
+ ReGameDLL for the game's chains, ReHLDS for the engine's.
2944
4343
 
2945
- Pawn: \`RegisterHookChain\`, \`EnableHookChain\`, \`DisableHookChain\`
4344
+ Pawn: \`RegisterHookChain\`
2946
4345
  `,
2947
4346
  ru: `
2948
- Регистрирует хукчейн reapi с сырым обработчиком из четырёх чисел — нижний
2949
- уровень под \`game.addEventListener\`, которым пользуется плагин.
4347
+ Перехватывает хукчейн ReGameDLL или ReHLDS сырым обработчиком из четырёх
4348
+ чисел — нижний уровень под \`game.addEventListener\`, которым пользуется
4349
+ плагин. Аргументы после четвёртого обработчик читает через \`arg()\`, а
4350
+ функцию игры блокирует через \`handled()\`.
2950
4351
 
2951
4352
  Имя — из reapi, без класса там, где он не нужен: \`"restart_round"\`,
2952
- \`"player_spawn"\`; редактор их дополняет. Числа за именами берутся из
2953
- инклудов reapi, поэтому инклуды должны быть от того reapi, что стоит на
2954
- сервере. Возвращает дескриптор хука.
4353
+ \`"player_spawn"\`; редактор их дополняет. Возвращает дескриптор хука для
4354
+ \`unhook\` или \`0\`, если на сервере нет API этого хукчейна — ReGameDLL для
4355
+ хукчейнов игры, ReHLDS для хукчейнов движка.
4356
+
4357
+ Pawn: \`RegisterHookChain\`
4358
+ `,
4359
+ },
4360
+ 'unhook': {
4361
+ en: `
4362
+ Takes off a hook \`hook\` made: its handler is not called again.
4363
+
4364
+ Pawn: \`DisableHookChain\`
4365
+ `,
4366
+ ru: `
4367
+ Снимает хук, который поставил \`hook\`: его обработчик больше не вызывается.
2955
4368
 
2956
- Pawn: \`RegisterHookChain\`, \`EnableHookChain\`, \`DisableHookChain\`
4369
+ Pawn: \`DisableHookChain\`
2957
4370
  `,
2958
4371
  },
4372
+ '__hookOn': {
4373
+ en: `@hidden Switches a hook the hood made off and on (as/hooks.ts).`,
4374
+ ru: `@hidden Выключает и включает хук, поставленный капотом (as/hooks.ts).`,
4375
+ },
4376
+ '__chainSet': {
4377
+ en: `@hidden Writes an argument of the hooked call that is running; \`-1\` is its answer.`,
4378
+ ru: `@hidden Записывает аргумент идущего перехваченного вызова; \`-1\` — его ответ.`,
4379
+ },
4380
+ '__chainSetText': {
4381
+ en: `@hidden Writes a text argument of the hooked call that is running; \`-1\` is its answer.`,
4382
+ ru: `@hidden Записывает текстовый аргумент идущего перехваченного вызова; \`-1\` — его ответ.`,
4383
+ },
4384
+ '__hasChains': {
4385
+ en: `@hidden Whether the server has the hookchains of ReHLDS (\`rehlds\`) or of ReGameDLL.`,
4386
+ ru: `@hidden Есть ли на сервере хукчейны ReHLDS (\`rehlds\`) или ReGameDLL.`,
4387
+ },
2959
4388
 
2960
4389
  'PluginInfo': {
2961
4390
  en: `The plugin's name, version, author and description, given to \`plugin({ ... })\`; \`amxts_plugins\` in the server console lists them.`,
@@ -3200,9 +4629,9 @@ export default {
3200
4629
  \`\`\`
3201
4630
 
3202
4631
  The handler's parameters take the forward's types; a named function may
3203
- take fewer of them. A forward created by a Pawn plugin reaches TypeScript
3204
- only when one of the amxts host plugin's includes declares it; one emitted
3205
- from TypeScript reaches every subscriber.
4632
+ take fewer of them. A forward a Pawn plugin makes reaches it after the
4633
+ Pawn plugins' handlers; one emitted from TypeScript reaches every
4634
+ subscriber.
3206
4635
  `,
3207
4636
  ru: `
3208
4637
  Вызывает \`handler\` при каждом срабатывании форварда — из этого плагина,
@@ -3214,9 +4643,9 @@ export default {
3214
4643
  \`\`\`
3215
4644
 
3216
4645
  Параметры обработчика получают типы форварда; именованная функция может
3217
- принимать их меньше. Форвард, созданный Pawn-плагином, доходит до
3218
- TypeScript, только если он объявлен в одном из инклудов хост-плагина
3219
- amxts; отправленный из TypeScript доходит до всех подписчиков.
4646
+ принимать их меньше. Форвард, созданный Pawn-плагином, доходит до него
4647
+ после обработчиков Pawn-плагинов; отправленный из TypeScript доходит до
4648
+ всех подписчиков.
3220
4649
  `,
3221
4650
  },
3222
4651
  'Forward.unsubscribe': {
@@ -3253,61 +4682,131 @@ export default {
3253
4682
  },
3254
4683
  'Storage': {
3255
4684
  en: `
3256
- A key-to-text store on disk: a Map that survives a map change and a server
3257
- restart.
4685
+ A key-to-value store on disk: a Map that survives a map change and a
4686
+ server restart.
3258
4687
 
3259
4688
  \`\`\`ts
3260
- const demos = new Storage("core_demo_counters");
3261
- const last = demos.get(auth); // string | null
3262
- demos.set(auth, "3");
3263
- if (demos.has(auth)) ...
3264
- demos.delete(auth);
4689
+ const points = new Storage<number>("myplugin_points");
4690
+ const mine = points.get(player.steamId) ?? 0; // undefined when there is none
4691
+ points.set(player.steamId, mine + 1);
4692
+ points.delete(player.steamId);
3265
4693
  \`\`\`
3266
4694
 
3267
- The file is named after the storage, kept in the \`vault\` folder of the AMX
3268
- Mod X data folder, and opened on first use. Values are text: a number goes
3269
- in with \`toString()\` and comes out with \`parseInt\`.
4695
+ The type argument is what it holds - text by default, a number, a boolean,
4696
+ an object of an interface - kept as JSON. The file is
4697
+ \`amxts/storage/<name>.json\` in AMX Mod X's data folder, written within a
4698
+ second of a change; a name with no file yet takes what AMX Mod X's \`nvault\`
4699
+ kept under that name, once.
3270
4700
 
3271
4701
  Pawn: \`nvault_open\`, \`nvault_get\`, \`nvault_set\`, \`nvault_remove\`
3272
4702
  `,
3273
4703
  ru: `
3274
- Хранилище текста по ключу на диске: Map, который переживает смену карты и
4704
+ Хранилище значений по ключу на диске: Map, который переживает смену карты и
3275
4705
  перезапуск сервера.
3276
4706
 
3277
4707
  \`\`\`ts
3278
- const demos = new Storage("core_demo_counters");
3279
- const last = demos.get(auth); // string | null
3280
- demos.set(auth, "3");
3281
- if (demos.has(auth)) ...
3282
- demos.delete(auth);
4708
+ const points = new Storage<number>("myplugin_points");
4709
+ const mine = points.get(player.steamId) ?? 0; // undefined, если ничего нет
4710
+ points.set(player.steamId, mine + 1);
4711
+ points.delete(player.steamId);
3283
4712
  \`\`\`
3284
4713
 
3285
- Файл называется по имени хранилища, лежит в папке \`vault\` в папке данных
3286
- AMX Mod X и открывается при первом обращении. Значения — текст: число
3287
- кладётся через \`toString()\`, а читается через \`parseInt\`.
4714
+ Аргумент типа — то, что в нём лежит: текст по умолчанию, число, булево
4715
+ значение, объект интерфейса; хранится как JSON. Файл —
4716
+ \`amxts/storage/<name>.json\` в папке данных AMX Mod X, записывается не позже
4717
+ чем через секунду после изменения; имя без файла один раз берёт то, что под
4718
+ этим именем хранил \`nvault\` AMX Mod X.
3288
4719
 
3289
4720
  Pawn: \`nvault_open\`, \`nvault_get\`, \`nvault_set\`, \`nvault_remove\`
3290
4721
  `,
3291
4722
  },
3292
4723
  'Storage.name': {
3293
- en: `The storage's name, which is also its file's name.`,
3294
- ru: `Имя хранилища — оно же имя его файла.`,
4724
+ en: `
4725
+ The storage's name, which is also its file's name.
4726
+ `,
4727
+ ru: `
4728
+ Имя хранилища — оно же имя его файла.
4729
+ `,
3295
4730
  },
3296
4731
  'Storage.get': {
3297
- en: `The value under \`key\`, or \`null\` when there is none.`,
3298
- ru: `Значение по ключу \`key\` или \`null\`, если его нет.`,
4732
+ en: `
4733
+ The value under \`key\`, or \`undefined\` when there is none, as
4734
+ \`Map.get\` gives: \`points.get(player.steamId) ?? 0\`.
4735
+
4736
+ Pawn: \`nvault_get\`, \`nvault_lookup\`
4737
+ `,
4738
+ ru: `
4739
+ Значение по ключу \`key\` или \`undefined\`, если его нет, как у \`Map.get\`:
4740
+ \`points.get(player.steamId) ?? 0\`.
4741
+
4742
+ Pawn: \`nvault_get\`, \`nvault_lookup\`
4743
+ `,
3299
4744
  },
3300
4745
  'Storage.set': {
3301
- en: `Puts \`value\` under \`key\`, replacing what was there.`,
3302
- ru: `Записывает \`value\` по ключу \`key\`, заменяя прежнее значение.`,
4746
+ en: `
4747
+ Puts \`value\` under \`key\`, replacing what was there; it is on disk
4748
+ within a second.
4749
+
4750
+ Pawn: \`nvault_set\`
4751
+ `,
4752
+ ru: `
4753
+ Записывает \`value\` по ключу \`key\`, заменяя прежнее; на диске оно не позже
4754
+ чем через секунду.
4755
+
4756
+ Pawn: \`nvault_set\`
4757
+ `,
3303
4758
  },
3304
4759
  'Storage.has': {
3305
- en: `\`true\` when there is a value under \`key\`.`,
3306
- ru: `\`true\`, если по ключу \`key\` есть значение.`,
4760
+ en: `
4761
+ \`true\` when there is a value under \`key\`.
4762
+ `,
4763
+ ru: `
4764
+ \`true\`, если по ключу \`key\` есть значение.
4765
+ `,
3307
4766
  },
3308
4767
  'Storage.delete': {
3309
- en: `Removes \`key\` and its value; a key that is not there is ignored.`,
3310
- ru: `Удаляет ключ \`key\` вместе со значением; отсутствующий ключ игнорируется.`,
4768
+ en: `
4769
+ Removes \`key\` and its value: \`true\` when it was there.
4770
+
4771
+ Pawn: \`nvault_remove\`
4772
+ `,
4773
+ ru: `
4774
+ Удаляет ключ \`key\` вместе со значением: \`true\`, если он был.
4775
+
4776
+ Pawn: \`nvault_remove\`
4777
+ `,
4778
+ },
4779
+ 'Storage.keys': {
4780
+ en: `
4781
+ Every key, in their order as text.
4782
+ `,
4783
+ ru: `
4784
+ Все ключи в их порядке как текста.
4785
+ `,
4786
+ },
4787
+ 'Storage.size': {
4788
+ en: `
4789
+ The number of keys it holds.
4790
+ `,
4791
+ ru: `
4792
+ Число ключей в нём.
4793
+ `,
4794
+ },
4795
+ 'Storage.prune': {
4796
+ en: `
4797
+ Removes what was last set before \`olderThan\`:
4798
+ \`points.prune(new Date(Date.now() - 30 * 24 * 3600 * 1000))\` - a month
4799
+ untouched. How many keys went.
4800
+
4801
+ Pawn: \`nvault_prune\`
4802
+ `,
4803
+ ru: `
4804
+ Удаляет то, что последний раз записывали раньше \`olderThan\`:
4805
+ \`points.prune(new Date(Date.now() - 30 * 24 * 3600 * 1000))\` — месяц без
4806
+ изменений. Сколько ключей ушло.
4807
+
4808
+ Pawn: \`nvault_prune\`
4809
+ `,
3311
4810
  },
3312
4811
  'PawnFunction': {
3313
4812
  en: `
@@ -3527,36 +5026,36 @@ export default {
3527
5026
  },
3528
5027
  'MenuOptions.backText': {
3529
5028
  en: `
3530
- The Back item's text; AMX Mod X's \`"Back"\`, in the player's language, by default.
5029
+ The Back item's text; \`"Back"\` by default.
3531
5030
 
3532
5031
  Pawn: \`MPROP_BACKNAME\`
3533
5032
  `,
3534
5033
  ru: `
3535
- Текст пункта «Назад»; по умолчанию \`"Back"\` AMX Mod X на языке игрока.
5034
+ Текст пункта «Назад»; по умолчанию \`"Back"\`.
3536
5035
 
3537
5036
  Pawn: \`MPROP_BACKNAME\`
3538
5037
  `,
3539
5038
  },
3540
5039
  'MenuOptions.nextText': {
3541
5040
  en: `
3542
- The More item's text; AMX Mod X's \`"More"\` by default.
5041
+ The More item's text; \`"More"\` by default.
3543
5042
 
3544
5043
  Pawn: \`MPROP_NEXTNAME\`
3545
5044
  `,
3546
5045
  ru: `
3547
- Текст пункта «Дальше»; по умолчанию \`"More"\` AMX Mod X.
5046
+ Текст пункта «Дальше»; по умолчанию \`"More"\`.
3548
5047
 
3549
5048
  Pawn: \`MPROP_NEXTNAME\`
3550
5049
  `,
3551
5050
  },
3552
5051
  'MenuOptions.exitText': {
3553
5052
  en: `
3554
- The Exit item's text; AMX Mod X's \`"Exit"\` by default.
5053
+ The Exit item's text; \`"Exit"\` by default.
3555
5054
 
3556
5055
  Pawn: \`MPROP_EXITNAME\`
3557
5056
  `,
3558
5057
  ru: `
3559
- Текст пункта «Выход»; по умолчанию \`"Exit"\` AMX Mod X.
5058
+ Текст пункта «Выход»; по умолчанию \`"Exit"\`.
3560
5059
 
3561
5060
  Pawn: \`MPROP_EXITNAME\`
3562
5061
  `,
@@ -3611,9 +5110,9 @@ export default {
3611
5110
  },
3612
5111
  'Menu': {
3613
5112
  en: `
3614
- A menu of AMX Mod X's own: items a player picks with the number keys, on
3615
- pages with Back and More, and Exit. \`Data\` is what it is shown with, which
3616
- its functions get beside the player.
5113
+ A menu: items a player picks with the number keys, on pages with Back and
5114
+ More, and Exit, drawn as AMX Mod X draws its own. \`Data\` is what it
5115
+ is shown with, which its functions get beside the player.
3617
5116
 
3618
5117
  \`\`\`ts
3619
5118
  interface ShopData {
@@ -3638,9 +5137,10 @@ export default {
3638
5137
  Pawn: \`menu_create\`, \`menu_setprop\`
3639
5138
  `,
3640
5139
  ru: `
3641
- Меню самого AMX Mod X: пункты, которые игрок выбирает цифровыми клавишами,
3642
- на страницах с «Назад» и «Дальше», и «Выход». \`Data\` — то, с чем его
3643
- показывают; это получают его функции рядом с игроком.
5140
+ Меню: пункты, которые игрок выбирает цифровыми клавишами, на страницах с
5141
+ «Назад» и «Дальше», и «Выход», нарисованное так, как AMX Mod X рисует свои.
5142
+ \`Data\` — то, с чем его показывают; это получают его функции рядом с
5143
+ игроком.
3644
5144
 
3645
5145
  \`\`\`ts
3646
5146
  interface ShopData {
@@ -3771,6 +5271,10 @@ export default {
3771
5271
  en: `Whether it is a command of the server console rather than a player's.`,
3772
5272
  ru: `Команда ли это консоли сервера, а не игрока.`,
3773
5273
  },
5274
+ 'CommandInfo.aliases': {
5275
+ en: `The command's other names, as \`addCommand(["/cp", "cp"], ...)\` gave them; \`[]\` for none.`,
5276
+ ru: `Другие имена команды, как их дал \`addCommand(["/cp", "cp"], ...)\`; \`[]\`, если их нет.`,
5277
+ },
3774
5278
  'Server.commands': {
3775
5279
  en: `
3776
5280
  The commands this plugin added, players' and the server's, in the order
@@ -3780,7 +5284,7 @@ export default {
3780
5284
  \`\`\`ts
3781
5285
  server.addCommand("/help", ({ player }) => {
3782
5286
  for (const command of server.commands) {
3783
- if (command.access == null || player.access.includes(command.access)) print(player, command.usage);
5287
+ if (command.access == null || player.access.includes(command.access)) player.print(command.usage);
3784
5288
  }
3785
5289
  });
3786
5290
  \`\`\`
@@ -3793,7 +5297,7 @@ export default {
3793
5297
  \`\`\`ts
3794
5298
  server.addCommand("/help", ({ player }) => {
3795
5299
  for (const command of server.commands) {
3796
- if (command.access == null || player.access.includes(command.access)) print(player, command.usage);
5300
+ if (command.access == null || player.access.includes(command.access)) player.print(command.usage);
3797
5301
  }
3798
5302
  });
3799
5303
  \`\`\`