Сообщения
Сервер говорит каждому клиенту, что рисовать и играть, сообщениями: строка чата, значок HUD, часы раунда, сообщение об убийстве. Плагин слышит сообщение до того, как оно ушло, читает его, меняет или останавливает:
server.addMessageListener("death", (event) => {
if (event.headshot) print(0, `${event.killer?.name} - headshot - ${event.victim?.name}`);
});
server.addMessageListener("text", (event) => {
if (event.text == "#Round_Draw") event.preventDefault(); // клиент его не получит
});
server.addMessageListener("team", (event) => {
if (event.team == "SPECTATOR") console.log(`${event.target?.name} наблюдает`);
});
server.addMessageListener("roundTime", (event) => {
event.seconds = 90; // часы показывают 90
});
server.removeMessageListener("death", listener) снимает обработчик: передайте
то же имя и ту же функцию, что добавляли. До плагина доходят только те
сообщения, которые он слушает.
Имя сообщения пишется строкой, и редактор подсказывает имена, у каждого —
для чего игра шлёт это сообщение и как его называет сама игра: death — это
DeathMsg игры, chat — её SayText. Все они — в таблице в конце страницы.
Несколько сообщений игры для плагина — одно и то же, и одно имя слышит их
все: progressBar — это BarTime и BarTime2, которое только добавляет, с
какого места полоса начинается. У события есть поля их всех, а event.name
говорит, какое пришло; поле, которого в пришедшем сообщении нет, читается как
0, null или пусто, а присваивание ему ничего не меняет — startPercent у
BarTime равен 0.
server.addMessageListener("progressBar", (event) => {
console.log(`${event.name}: ${event.seconds} с от ${event.startPercent}%`);
});
Событие
event.player — игрок, которому идёт сообщение, null — если всем, поэтому
игрок, о котором сообщение, — отдельное поле: target или его роль —
killer, victim, sender. preventDefault() останавливает сообщение.
event.name — имя сообщения у игры, "DeathMsg" у death.
Каждое сообщение игра пишет по своей раскладке, и у сообщения с известной
раскладкой — а это почти все, что шлёт Counter-Strike, — на каждый аргумент
есть поле с именем и типом: игрок — Player (null — никто), признак —
boolean, команда — Team, оружие — WeaponKind, маска — массив имён, время — в секундах. Редактор их подсказывает. Присвоить полю — изменить то, что
получит клиент: event.team = "CT".
server.addMessageListener("hideWeapon", (event) => {
event.flags = event.flags.concat(["money"]); // деньги тоже скрыты
});
Сообщение без известной раскладки — прогресс ботов, тексты подсказчика —
читается по месту аргументов, через event.args, которые есть у любого
сообщения для того, чего не покрывают его поля:
server.addMessageListener("botProgress", (event) => {
console.log(`${event.args.length} ${event.args.number(0)}`);
});
event.args.number(i) и event.args.text(i) читают аргумент на месте i,
0 — первый; isText(i) говорит, какой он; setNumber(i, value) и
setText(i, value) его меняют.
Аргумент, который сообщение не записало, — цвет statusIcon, когда значок
прячут, params текста без подстановок, — читается как 0 или пусто, а
присваивание ему ничего не меняет. Имя, для которого у игры нет сообщения, —
ошибка сборки.
message_begin, до обработчиков не
доходит: AMX Mod X слышит только то, что идёт через движок. Посланное через
emessage_begin доходит, как и то, что шлёт player.screen, и то, что шлёт
player.money, когда ему присваивают.Все сообщения
| Имя | Имя у игры | Что это | Поля |
|---|---|---|---|
adStop | ADStop | HUD игрока перестаёт показывать рекламу раунда. | — |
allowSpectate | AllowSpec | Можно ли игроку выбрать «Наблюдать» в меню команды. | allowed |
ammo | AmmoX | Меняется запас патронов одного вида на HUD игрока. | ammo, amount |
ammoPickup | AmmoPickup | Игрок подбирает патроны: уведомление сбоку экрана. | ammo, amount |
armor | Battery | Меняется броня игрока на его HUD. | armor |
armorType | ArmorType | Значок брони на HUD игрока: жилет или жилет со шлемом. | helmet |
bombDrop | BombDrop | Бомба на радаре террористов: брошена или заложена. | origin, planted |
bombPickup | BombPickup | Бомбу подобрали: она пропадает с радара террористов. | — |
botProgress | BotProgress | Полоса прогресса, которую клиент игрока показывает, пока боты изучают новую карту. | args |
botVoice | BotVoice | Значок голоса над ботом, который говорит по рации. | talking, target |
chat | SayText | Строка чата. | sender, text, params |
closeBuyMenu | BuyClose | Меню закупки игрока закрывается. | — |
corpse | ClCorpse | Тело погибшего игрока остаётся на земле, чтобы клиенты его нарисовали. | model, team, target |
crosshair | Crosshair | Собственный прицел Counter-Strike на экране игрока показывают или прячут. | shown |
currentWeapon | CurWeapon | Оружие в руках игрока и его обойма на HUD. | active, weapon, clip |
czCareer | CZCareer | Шаг карьеры Condition Zero, её одиночной кампании. | args |
czCareerHud | CZCareerHUD | Карьера Condition Zero на HUD игрока. | args |
damage | Damage | Игроку показывают полученный урон: красные метки сбоку экрана. | armor, damage, damageType, origin |
death | DeathMsg | Убийство в правом верхнем углу каждого экрана. | killer, victim, headshot, weapon |
flashlight | Flashlight | Значок фонарика на HUD игрока: включён ли он, и его заряд. | on, battery |
flashlightBattery | FlashBat | Меняется заряд фонарика на HUD игрока. | battery |
fog | Fog | Туман на экране игрока: его цвет и плотность. | args |
forceCamera | ForceCam | Виды, в которых мёртвый игрок может смотреть игру, как разрешают mp_forcecamera и mp_forcechasecam. | args |
fov | SetFOV | Задаётся поле зрения игрока. | fov |
gameMode | GameMode | Играют ли командами — для клиента игрока. | args |
gameTitle | GameTitle | Заголовок игры на экране игрока, когда он входит в игру. | args |
geiger | Geiger | Щелчки счётчика Гейгера, которые игрок слышит рядом с радиацией. | range |
health | Health | Меняется здоровье игрока на его HUD. | health |
hideWeapon | HideWeapon | Меняются скрытые части HUD игрока. | flags |
hint | HudText, HudTextArgs, HudTextPro | Подсказка посреди экрана игрока. | text, params |
hltv | HLTV | Заметка для прокси HLTV, например о начале нового раунда. | args |
hostageKilled | HostageK | Заложник убит: он пропадает с радара спецназа. | hostage |
hostagePosition | HostagePos | Заложник на радаре спецназа. | hostage, origin |
initHud | InitHUD | HUD игрока готовится, когда он входит в игру. | — |
itemPickup | ItemPickup | Игрок подбирает предмет: уведомление сбоку экрана. | item |
itemStatus | ItemStatus | Прибор ночного видения и набор сапёра, которые есть у игрока, для его HUD. | nightVision, defuseKit |
location | Location | Место на карте, где находится игрок, как его называет рация. | target, place |
menu | ShowMenu | Текстовое меню на экране игрока — меню команды без VGUI, рация, меню плагина. | more, text |
money | Money | Меняются деньги игрока на его HUD. | amount, flash |
moneyBlink | BlinkAcct | Деньги на HUD игрока мигают: ему не хватает на покупку. | blinks |
motd | MOTD | Часть сообщения дня — окна, которое видит вошедший игрок. | last, text |
nightVision | NVGToggle | Ночное видение игрока включают или выключают. | on |
progressBar | BarTime, BarTime2 | Полосу прогресса посреди экрана игрока показывают или прячут — пустой или заполненной не с нуля. | seconds, startPercent |
radar | Radar | Союзник на радаре игрока. | target, origin |
reloadSound | ReloadSound | Звук перезарядки оружия поблизости — для клиента игрока. | args |
requestState | ReqState | Игра запрашивает у клиента игрока его состояние — для голоса. | — |
resetHud | ResetHUD | HUD игрока сбрасывается при его появлении. | — |
roundTime | RoundTime | Задаются часы раунда вверху HUD игрока. | seconds |
scenarioIcon | Scenario | Значок сценария на HUD игрока, например бомбы или заложника. | active, sprite, alpha |
score | ScoreInfo | Строка игрока в таблице счёта. | target, frags, deaths, team |
scoreAttribute | ScoreAttrib | Отметки, которые таблица счёта показывает рядом с игроком: погиб, бомба, VIP. | target, flags |
screenFade | ScreenFade | Экран игрока окрашивается с затуханием — флешка, затемнение. | duration, hold, direction, modulate, stay, color |
screenShake | ScreenShake | Вид игрока трясётся — рядом взрыв. | amplitude, duration, frequency |
serverName | ServerName | Имя сервера, которое показывает клиент игрока. | serverName |
shadow | ShadowIdx | Спрайт, которым клиент игрока рисует тени игроков. | args |
shellCasing | Brass | Гильза, которую выбрасывает оружие, — клиенты её рисуют. | args |
showTimer | ShowTimer | На HUD игрока появляются часы раунда. | — |
sound | SendAudio | Звук, который играет игроку, например фраза рации. | sender, sound, pitch |
spectatedHealth | SpecHealth, SpecHealth2 | Здоровье игрока, за которым следит наблюдатель. | health, target |
spectator | Spectator | Игрок становится наблюдателем или перестаёт им быть — в таблице счёта. | target, spectator |
statusIcon | StatusIcon | Значок состояния на HUD игрока — зона закупки, бомба — показывается, мигает или прячется. | state, sprite, color |
statusText | StatusText | Строка состояния внизу экрана игрока, например имя игрока, в которого он целится. | line, text |
statusValue | StatusValue | Значение, которое показывает строка состояния, например игрок, в которого целится игрок. | slot, value |
taskTime | TaskTime | Отсчёт задания на HUD игрока, например спасения заложников в карьере. | seconds, active, fade |
team | TeamInfo | Команда игрока в таблице счёта. | target, team |
teamScore | TeamScore | Счёт команды в таблице счёта. | team, score |
text | TextMsg | Текст игры — объявление, подсказка — в чате, консоли или посреди экрана. | destination, text, params |
train | Train | Скорость поезда, которым управляет игрок, на его HUD. | speed |
tutorClose | TutorClose | Сообщение подсказчика на экране игрока закрывается. | — |
tutorLine | TutorLine | Указатель подсказчика на экране игрока — на предмет в мире. | args |
tutorState | TutorState | Состояние подсказчика на клиенте игрока. | args |
tutorText | TutorText | Сообщение подсказчика на экране игрока. | args |
vguiMenu | VGUIMenu | На экране игрока открывается VGUI-меню игры: меню команды, класса, закупки. | menu |
viewMode | ViewMode | Вид игрока возвращается к виду от первого лица. | — |
voiceMask | VoiceMask | Игроки, которых игрок слышит в голосовом чате, и те, кого он заглушил. | args |
weaponList | WeaponList | Описание оружия для клиента игрока: его патроны, слот, место в слоте. | classname, ammo, maxAmmo, ammo2, maxAmmo2, slot, position, weapon |
weaponPickup | WeapPickup | Игрок подбирает оружие: уведомление сбоку экрана. | weapon |
weather | ReceiveW | Погода на карте, дождь или снег, — для клиента игрока. | args |
Квары
Квар — именованная настройка сервера: mp_freezetime, sv_gravity или собственная настройка плагина. Объект Cvar читает и пишет один квар:
Хранилище
Storage хранит текст по ключу, как Map<string, string>, только на диске: то, что плагин сохранил, переживает смену карты и перезапуск сервера. Это место для накопленных очков игрока, его последнего визита, настройки.