Подробный гайд: Null-алиас (nkey) в CS 1.6: как скрипт убирает перехлёст клавиш WASD - Часть 2

Полный гайд по null-алиасу (nkey) в CS 1.6: как скрипт убирает перехлёст клавиш WASD, правильная настройка конфигов, баги и легальность на KZ-серверах.

2026.10.30                  


Подробный гайд: Null-алиас (nkey) в CS 1.6: как скрипт убирает перехлёст клавиш WASD - Часть 2Подробный гайд: Null-алиас (nkey) в CS 1.6: как скрипт убирает перехлёст клавиш WASD - Часть 2

7. Вариант «neutral SOCD» — обе клавиши отпускаются

Поведение fightstick'ов/аппаратного SOCD‑neutral: при нажатии противоположной клавиши обе отпускаются, персонаж стоит; когда одну отпускаешь — вторая снова начинает работать.

alias none ""
alias guardf +forward        // «разрешено ли нажать forward»
alias guardb +back
alias guardl +moveleft
alias guardr +moveright
alias chkf none
alias chkb none
alias chkl none
alias chkr none

alias +mfwd   "-back;guardf;alias chkf +forward;alias guardb none"
alias -mfwd   "-forward;chkb;alias chkf none;alias guardb +back"
alias +mback  "-forward;guardb;alias chkb +back;alias guardf none"
alias -mback  "-back;chkf;alias chkb none;alias guardf +forward"

alias +mleft  "-moveright;guardl;alias chkl +moveleft;alias guardr none"
alias -mleft  "-moveleft;chkr;alias chkl none;alias guardr +moveright"
alias +mright "-moveleft;guardr;alias chkr +moveright;alias guardl none"
alias -mright "-moveright;chkl;alias chkr none;alias guardl +moveleft"

bind w +mfwd
bind s +mback
bind a +mleft
bind d +mright



Логика:

guardf normally = +forward, но пока зажата S он переписывается в none → нажатие W ничего не включает. Обязательно прогоните на локальной карте перед использованием.


8. Вариант «только A/D» — минимум риска для KZ

Если вам нужны только чистые стрейфы и вы не хотите трогать W/S (pre‑run, backpedal):

alias none ""
alias chkl none
alias chkr none
alias +mleft  "-moveright;+moveleft;alias chkl +moveleft"
alias -mleft  "-moveleft;chkr;alias chkl none"
alias +mright "-moveleft;+moveright;alias chkr +moveright"
alias -mright "-moveright;chkl;alias chkr none"
bind a +mleft
bind d +mright

W и S остаются +forward / +back — конфиг почти не отличается от дефолтного, меньше шансов на конфликты и меньше поводов для подозрений.


9. Проверка и отладка

9.1. Консольная диагностика

alias          // выводит "Current alias commands:" и все алиасы [[406]]
bind           // выводит все бинды

Проверьте, что bind w показывает +mfwd, а не +forward.


9.2. Функциональный тест (2 минуты)

  1. Локальная карта (map de_dust2), sv_cheats 1 не нужен.
  2. Зажмите A и, не отпуская, зажмите D.
    • Стоите на месте → null не работает.
    • Едете вправо → работает.
  3. Отпустите D, продолжая держать A → должно снова повезти влево (проверка chkr).
  4. Зажмите W, добавьте A → должна быть диагональ (null её не должен ломать).

9.3. Быстрый сброс без перезапуска

exec null.cfg      // перечитать
nkey_off           // выключить
nkey_on            // включить
host_writeconfig   // принудительно сохранить config.cfg

10. Подводные камни и баги

10.1. Залипание клавиш («бегу вперёд, хотя всё отпустил»)

Причина — рассинхрон слотов down[0]/down[1] в kbutton_t. Алиас вызывает +forward без номера клавиши → записывается down[0] = -1. Если потом движок попытается отпустить кнопку с номером клавиши (-forward 44), совпадения не будет и кнопка останется нажатой.


Типичные триггеры:

  • перебиндили W на обычный +forward, пока W была зажата;
  • exec другого конфига во время движения;
  • alt‑tab / открытие консоли с зажатой клавишей.

Лечится мгновенно: наберите в консоли «голую» команду —

-forward
-back
-moveleft
-moveright

Вызов без аргумента уходит в ветку «assume for unsticking, so clear all» и полностью сбрасывает кнопку. Именно поэтому в nkey_off я добавил -forward;-back;-moveleft;-moveright.


10.2. Меню Options → Keyboard

Любое изменение раскладки через игровое меню перезаписывает config.cfg дефолтными bind "w" "+forward". Так как userconfig.cfg грузится последним, null всё равно перетрёт их при следующем запуске — но в текущей сессии бинды уже сбиты. После ковыряния в меню сделайте exec userconfig.cfg.


10.3. Никогда не используйте wait внутри алиасов движения

wait прерывает обработку командного буфера до следующего кадра. Вставленный между -back и +forward, он даёт целый кадр «нулевого» ввода — ровно тот эффект, от которого мы избавляемся.




10.4. Не делайте самовызывающиеся алиасы

Cmd_ExecuteString вставляет тело алиаса в начало командного буфера → цикл alias a a = мгновенный фриз игры.


10.5. Ограничения имён и длин

Имя ≤ 31 символ, значение ≤ 1023 символа. Все мои алиасы (+mright, guardf, nkey_off) в лимиты укладываются — но если будете переименовывать, следите.


10.6. Что null НЕ покрывает

  • Мышиный стрейф (+strafe, lookstrafe) — добавляет sidemove напрямую в IN_MouseMove, в обход kbutton'ов.
  • Джойстик — оси идут отдельным путём (IN_JoyMove).
  • +moveup / +movedown (лестницы, вода) — отдельные кнопки in_up/in_down. При желании добавляются той же схемой (+mup/+mdown).
  • +klook — при зажатом klook forwardmove вообще не считается (см. if (!(in_klook.state & 1)) в CL_CreateMove).

10.7. Кодировка

echo с кириллицей в файле, сохранённом как UTF‑8, даст кракозябры. Только ANSI/Windows‑1251.


11. Совместимость с другими скриптами

Скрипт Конфликт Решение
LongJump / klook (+longjump "+jump;-forward;-back") LJ‑бинд сам делает -forward;-back — это нормально и даже полезно Оставить как есть; -forward без аргумента корректно сбросит кнопки
Doubleduck (+dd "+duck;wait;-duck") wait в другом алиасе не мешает, если не в одном буфере с движением Не объединять duck и движение в один алиас
+speed (ходьба) cl_movespeedkey 0.3 → кадр «перезажима» даёт 0.75×120 = 90 вместо 120 Практически незаметно; если критично — используйте вариант «только A/D»
Сторонние конфиги с WASD‑биндами Перетирают bind w +mfwd Держите null в userconfig.cfg — он грузится последним
Alias Checker на сервере Плагин блокирует алиасы по маске Обойти нельзя; не использовать на таких серверах

12. Легальность: можно или забанят

Разберём честно, по слоям.


VAC — нет. Это чистые консольные команды движка, никакого вмешательства в .exe/.dll, sv_cheats не требуется. Русскоязычный гайд по CS 1.6 скриптингу прямо указывает, что alias/bind/wait — штатные инструменты GoldSrc, доступные всегда.


Серверные античиты и KZ‑лиги — ДА, банят.


Это не теория:

KZ‑Rush, новость «[CS16] Release #326» (февраль 2025): «Причина — новая проверка, касающаяся так называемого null‑скрипта, который может отпускать клавиши во время стрейфов, избавляя игроков от перехлёстов, то есть одновременного нажатия двух стрейф‑клавиш… Согласно нашим правилам, использование таких скриптов/функциональности запрещено, поскольку влияет на физику игры. Таким образом, все выданные баны корректны, рекорды всех забаненных игроков будут удалены… следующий бан для них будет переквалифицирован в перманентный».


То есть в CS 1.6 KZ детектор именно ищет отпускание клавиш во время стрейфа — сервер видит usercmd, где sidemove переключается быстрее/чище, чем это физически возможно при удержании обеих клавиш.


Показательно, что и в современном CS историю ведут оттуда же: «null‑bind был запрещён начиная с первой версии таких штук, ещё со времён CS 1.6», и про CS2‑snap‑tap: «это запрещено правилами и наказуемо баном в нескольких других играх… cs 1.6 kz, насколько я знаю».


Практический вывод:

  • Обычные паблики / noname‑серверы — работает, никто не проверяет.
  • KZ / HNS / CPM / рекорд‑серверы — высокий риск бана и удаления рекордов. Перед игрой читайте правила сервера.
  • Турниры/лиги — только с разрешения админов.

13. Итоговая сборка «всё в одном файле»

cstrike\null.cfg — финальная версия с тремя режимами и тумблером:

// ==========================================================
//  NULL.CFG  —  nkey / 1key / null-cancel  |  CS 1.6 GoldSrc
//  Режимы:  0 = выкл   1 = null (противоположные)
//           2 = 1key (строго одна клавиша)
// ==========================================================

alias none ""
alias chkf none
alias chkb none
alias chkl none
alias chkr none

// ---------- РЕЖИМ 1: классический null ----------
alias +mfwd   "-back;+forward;alias chkf +forward"
alias -mfwd   "-forward;chkb;alias chkf none"
alias +mback  "-forward;+back;alias chkb +back"
alias -mback  "-back;chkf;alias chkb none"
alias +mleft  "-moveright;+moveleft;alias chkl +moveleft"
alias -mleft  "-moveleft;chkr;alias chkl none"
alias +mright "-moveleft;+moveright;alias chkr +moveright"
alias -mright "-moveright;chkl;alias chkr none"

// ---------- переключение ----------
alias nkey_reset "-forward;-back;-moveleft;-moveright;alias chkf none;alias chkb none;alias chkl none;alias chkr none"

alias nkey_on   "nkey_reset;bind w +mfwd;bind s +mback;bind a +mleft;bind d +mright;echo NULL ON;alias nkey nkey_off"
alias nkey_off  "nkey_reset;bind w +forward;bind s +back;bind a +moveleft;bind d +moveright;echo NULL OFF;alias nkey nkey_on"
alias nkey      nkey_on

// строгий 1key (включается отдельной командой, переиспользует те же бинды)
alias 1key_aliases "alias +mfwd "-back;-moveleft;-moveright;+forward;alias chkf +forward";alias -mfwd "-forward;chkb;chkl;chkr;alias chkf none";alias +mback "-forward;-moveleft;-moveright;+back;alias chkb +back";alias -mback "-back;chkf;chkl;chkr;alias chkb none";alias +mleft "-forward;-back;-moveright;+moveleft;alias chkl +moveleft";alias -mleft "-moveleft;chkf;chkb;chkr;alias chkl none";alias +mright "-forward;-back;-moveleft;+moveright;alias chkr +moveright";alias -mright "-moveright;chkf;chkb;chkl;alias chkr none""

alias 1key_on  "nkey_on;1key_aliases;nkey_on;echo 1KEY MODE ON"
alias 1key_off "exec null.cfg;echo 1KEY MODE OFF (reload null.cfg)"

// ---------- старт ----------
nkey_on

// bind F6 nkey



Замечание по 1key_on: переопределение алиасов внутри строки с вложенными кавычками в GoldSrc работает, но это самый хрупкий участок конфига. Если глючит — просто держите два отдельных файла (null.cfg и 1key.cfg) и переключайтесь командами exec null.cfg / exec 1key.cfg. Это надёжнее и читабельнее.


14. Чек‑лист перед первым запуском

  • [ ] Файл null.cfg лежит в ...\Half-Life\cstrike\
  • [ ] Файл userconfig.cfg там же и содержит exec null.cfg
  • [ ] Оба сохранены в ANSI (Windows‑1251), без BOM
  • [ ] В config.cfg в конце есть строка exec userconfig.cfg (она там по умолчанию)
  • [ ] Зашли в игру → консоль → alias → видите +mfwd, chkf, nkey и т.д.
  • [ ] bind → видите w "+mfwd"
  • [ ] Тест «A+D»: едем вправо, а не стоим
  • [ ] Тест «W+A»: диагональ работает
  • [ ] Прочитали правила сервера, на котором играете

Источник

  • cl_dll/input.cpp (Half-Life SDK, CL_CreateMove, KeyDown/KeyUp, CL_KeyState) — https://github.com/ValveSoftware/halflife/blob/master/cl_dll/input.cpp

Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта