Подробный гайд: 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 минуты)
- Локальная карта (
map de_dust2),sv_cheats 1не нужен. - Зажмите A и, не отпуская, зажмите D.
- Стоите на месте → null не работает.
- Едете вправо → работает.
- Отпустите D, продолжая держать A → должно снова повезти влево (проверка
chkr). - Зажмите 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— при зажатом klookforwardmoveвообще не считается (см.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
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.