Skip to content

fix(dg): stop HitPrcnt shake-off log spam + guard re-entry by pending wait (#3658) - #3668

Merged
bylins merged 1 commit into
masterfrom
fix/hitprcnt-shakeoff-spam-3658
Jul 31, 2026
Merged

fix(dg): stop HitPrcnt shake-off log spam + guard re-entry by pending wait (#3658)#3668
bylins merged 1 commit into
masterfrom
fix/hitprcnt-shakeoff-spam-3658

Conversation

@bylins

@bylins bylins commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Продолжение #3658. Триггер #97132 «зовём младенцев» (HitPercent) при 30% HP: echo → wait 5 → while(2-5){ load mob; echo }. В сислоге лог shake-off «моб отжил из лага/стана» сыпался на каждой команде цикла (строки 10/16/22/26…) в один миллисекунд.

Причина 1 — спам лога

Условие shake-off содержало || ch->get_wait() > 0. Моб в бою при kFight постоянно имеет боевой лаг → на каждой команде цикла условие истинно → shake-off + лог. При этом боевой лаг сам триггер не стопает (стан-блок get_wait не проверяет) — значит в условии он лишний.

Фикс: get_wait() > 0ch->GetPosition() < EPosition::kFight. Стряхиваем, когда моб реально сбит/оглушён/сидит, а не просто лагает в бою. Боец при kFight больше не стряхивается → лога нет.

Причина 2 — копии от группы

Гард в hitprcnt_mtrigger по GET_TRIG_DEPTH не сработал (TRIG_NEW сам ставит depth=1). Переключено на пендинг-wait GET_TRIG_WAIT(t).time_remaining — пока триггер висит на wait 5, хит от следующего игрока группы не запускает копию.

Патч VERSION 0.1.210.1.22. Собирается/линкуется чисто.

Заметка на ревью

При мерже #3659 из master, похоже, потерялись две правки: ошеломить снова kIncap (не kStun), из-за чего ошеломлённый (pos < kStun) не проходит внешний гейт shake-off. Если нужно, верну kStun отдельным патчем.

@bylins
bylins force-pushed the fix/hitprcnt-shakeoff-spam-3658 branch from 7e4a650 to 192c7da Compare July 31, 2026 13:21
…3658)

Триггер #97132 ("зовём младенцев", HitPercent) при 30% HP делает
echo -> wait 5 -> while(2-5){ load mob; echo }. При ударах от группы
он грузил младенцев многократно и спамил лог shake-off.

Причина: hitprcnt_mtrigger на КАЖДЫЙ удар зовёт script_driver(TRIG_NEW).
Это не копия, а ПЕРЕЗАПУСК того же триггера с начала. Пока он висит на
wait 5, новый удар стартует его заново -- в очереди событий копится по
орфанному trig_wait_event на каждый удар, и каждое потом отдельно
возобновляет цикл (отсюда лишние загрузки и покомандный shake-off/лог).

Гард: не (пере)запускаем, если триггер висит на wait --
`GET_TRIG_WAIT(t).time_remaining`. Это и есть кэш "у триггера в очереди
событий висит trig_wait_event" (проверять event_list вручную -- то же
самое, но O(n)). depth не годится: TRIG_NEW сам ставит его в 1.

Условие shake-off (dg_mobcmd) НЕ трогаем: get_wait там нужен (моб мог
сам применить умение и быть в лаге), а спам лечится именно гардом.

Патч VERSION 0.1.21 -> 0.1.22.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@bylins
bylins force-pushed the fix/hitprcnt-shakeoff-spam-3658 branch from 192c7da to 93b901d Compare July 31, 2026 13:29
@bylins
bylins merged commit 571404a into master Jul 31, 2026
20 checks passed
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