Skip to content

fix(mount): stop following the horse before mounting it - #4087

Merged
bylins merged 1 commit into
masterfrom
fix/mount-while-following-the-horse
Oct 20, 2026
Merged

bylins merged 1 commit into
masterfrom
fix/mount-while-following-the-horse

Conversation

@bylins

@bylins bylins commented Oct 20, 2026

Copy link
Copy Markdown
Owner

Хвост из #4083, третья и последняя часть. #4086 убирает причину порчи списка, #4084 страхует цикл, а здесь закрывается сама ситуация, из которой всё выросло.

Что не так

Команда «следовать» ищет цель через FindCharInRoom и на NPC не проверяет — за мобом следовать можно. А MakeHorse делает скакуна последователем всадника:

void mount::MakeHorse(CharData *horse, CharData *ch) {
	AFF_FLAGS(horse).set(EAffect::kHorse);
	follow::AddFollower(ch, horse);

Если всадник в этот момент сам следует за этим мобом, выходит кольцо: set_master его отклоняет, и седловка проходит наполовину — сообщение «Вы оседлали ...» уже выведено, аффект kHorse выставлен, а подчинения нет.

Так и начиналось зависание из issue:

19:18:10  <Морхель> [след гон]
19:22:12  <Морхель> [оседлать гон]
19:22:12  попытка сделать цикл: лидер [Морхель], его текущий лидер [костяная гончая]
19:25:42  Морхель has rented → DieFollower → вечный цикл

Гончая — мир-моб #5902 из зоны 59 с флагом kMounting, её описание прямо предлагает оседлать; хозяина у неё на тот момент не было.

Правка

MakeHorse сперва снимает всадника со следования за этим мобом, и только потом седлает.

Правка в MakeHorse, а не в do_horsetake, чтобы накрыть и передачу скакуна (do_givehorse → MakeHorse(horse, victim)): принимающий точно так же мог за ним следовать.

StopFollower для всадника-игрока вернуть true не может — извлечение там только в ветке для NPC с kCorpse, — поэтому результат не проверяется.

Проверка

Сборка -Dbuild_profile=release -Dbuild_tests=true без предупреждений, ./tests/tests — 796 passed, 3 skipped (те же, что и до правки).

🤖 Generated with Claude Code

Всадник мог сам следовать за будущим скакуном: команда "следовать" ищет
цель через FindCharInRoom и на NPC не проверяет, так что "след гончая"
работает. Дальше "оседлать гончая" звало MakeHorse -> AddFollower, а тот
замыкал кольцо в цепочке лидеров: скакун становился бы хозяином всадника и
наоборот. set_master такое отклоняет, и седловка проходила наполовину --
сообщение "Вы оседлали ..." выведено, аффект kHorse выставлен, а
подчинения нет.

Именно так и начиналось зависание из #4083: 19:18 "след гон", 19:22
"оседлать гон", кольцо, гончая в свите без хозяина, 19:25 постой и вечный
цикл в DieFollower.

MakeHorse теперь сперва снимает всадника со следования за этим мобом.
Правка в MakeHorse, а не в do_horsetake, чтобы накрыть и передачу скакуна
(do_givehorse): принимающий точно так же мог за ним следовать.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@bylins
bylins merged commit a96346d into master Oct 20, 2026
20 checks passed
@bylins
bylins deleted the fix/mount-while-following-the-horse branch October 20, 2026 17:25
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