Skip to content

fix(dg): let a sleeping player use commands near a "*" command trigger - #3783

Merged
bylins merged 1 commit into
masterfrom
fix/sleeping-actor-command-trigger
Aug 27, 2026
Merged

fix(dg): let a sleeping player use commands near a "*" command trigger#3783
bylins merged 1 commit into
masterfrom
fix/sleeping-actor-command-trigger

Conversation

@bylins

@bylins bylins commented Aug 27, 2026

Copy link
Copy Markdown
Owner

Багрепорт от Мородея: лёг спать, а на прос / проснуться получал «Сделать это в ваших снах?». Помог только реконнект.

Что происходит

Командные триггеры проверяются в interpreter.cpp до поиска самой команды. Если триггер совпал, а игрок спит, движок отвечал и забирал команду себе:

if (!actor->IsNpc() && (actor->GetPosition() == EPosition::kSleep)) {
    SendMsgToChar("Сделать это в ваших снах?\r\n", actor);
    return 1;                       // команда считается обработанной
}

Достаточно, чтобы арглист триггера совпал с набранной командой. В мире такие есть, и совпадают они как раз с проснуться — это командные триггеры комнат снов:

триггер арглист комнаты
69318 проснуться зона 693: 69352, 69360, 69384, 69390–69396 («Синий сон», «Черный сон», «Сон во сне» …)
73794 проснуться очнуться пробудиться выйти зона 737: 73756–73758 («Порог вещего сна», «Путь огня», «Путь воды»)
85208 … проснуться проснуть просну прос про зона 852: 85211 («Черный лес»)
87005 проснуться зона 870: 87016 («Пустырь»)

Уснув в такой комнате, игрок попадал в тупик: команду проснуться забирал триггер, а сам триггер не запускался, потому что игрок спит. Всё остальное работало, но проснуться было нельзя — оставался только реконнект (при входе позиция восстанавливается). С самой командой при этом всё в порядке: у неё минимальная позиция kSleep, интерпретатор её пропускает — просто до интерпретатора дело не доходило.

Триггер на * (compare_cmd возвращает истину для любой команды) запирал бы вообще всё, но таких в мире сейчас нет — проверил все triggers.yaml.

Стамина к делу отношения не имеет, она только объясняет, почему он лёг спать.

Что сделано

Спящий игрок по-прежнему не запускает command-триггеры, но команду у него больше не отбирают: проверка позиции пропускает триггер (continue), и команду разбирает интерпретатор со своей проверкой минимальной позиции. проснуться работает, а всё, что спящему не положено, интерпретатор отсечёт сам — своим же сообщением.

Правка в трёх местах dg_triggers.cpp: command_mtrigger, command_otrigger, command_wtrigger.

О чём стоит знать

  1. Если у триггера осмысленный арглист (скажем, залезть), спящий игрок теперь получит «Чаво?» вместо «Сделать это в ваших снах?» — команды-то такой в таблице нет. Менее информативно, зато не запирает. Если хочется сохранить сообщение, можно отвечать только когда арглист не *, — скажи, переделаю.
  2. Рядом лежит тот же дефект для боя: в command_wtrigger проверка kFight так же отвечает «Вы не можете это сделать в бою» и забирает команду, то есть триггер на * в комнате глушит любые команды в бою. Не трогал — это отдельное решение, там сообщение может быть намеренным.

Проверено

Сборка чистая, 585 тестов зелёные, малый мир поднимается. Юнит-тестом не покрыть: нужен мир с триггером, спящий игрок и интерпретатор.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XUwDWDnYdXrJdvjDVd36QH

Спящий игрок не запускает command-триггеры -- но раньше команда при этом ещё и
съедалась: триггер отвечал "Сделать это в ваших снах?" и возвращал 1, то есть
"команду обработали". А compare_cmd для арглиста "*" совпадает с любой командой,
и такие триггеры не редкость. Рядом с любым из них спящий не мог выполнить
вообще ничего -- в том числе "проснуться": на каждую команду приходил один и тот
же ответ, и выбраться можно было только реконнектом. Так это и поймал Мородей.

Проверка позиции теперь просто пропускает триггер, а команду разбирает
интерпретатор, у которого своя проверка минимальной позиции: "проснуться"
исполняется, а всё, что спящему не положено, он и отсечёт сам.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUwDWDnYdXrJdvjDVd36QH
@bylins
bylins merged commit dbe44c6 into master Aug 27, 2026
20 checks passed
@bylins
bylins deleted the fix/sleeping-actor-command-trigger branch August 27, 2026 13:08
kvirund added a commit that referenced this pull request Aug 27, 2026
Конфликт один, в command_wtrigger: мастер поменял поведение для спящего игрока
(#3783 -- триггер не запускается, но команду у игрока не отбираем, continue
вместо сообщения и return 1), а в ветке та же строка переведена со strn_cmp на
utils::IsAbbr. Взято поведение мастера с вызовом из ветки.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant