[bug] При смене мира сохраняются старые модели, отложенные звуки и выбранная техника #23

Closed
opened 2026-10-29 12:24:07 +00:00 by chexit · 2 comments
Owner

Проверено на опубликованном 90379f6 при проверке дополнительного ревью. Незакоммиченные изменения из чужой рабочей копии недоступны.

open_world() пересоздаёт Sim и Ground, но не очищает pending, moving и немедленно не отправляет пустой model list. emit() отправляет пустые модели лишь при sim.tick%20==0. В пустом новом мире первые тики 1..19 могут оставлять старые модели (если новый список непустой, он заменит старый сразу).

Проверена также логика форка после применения патчей: Game::finish_close_world очищает игровые сущности/звук, но не сбрасывает mods.models и клиентский экземпляр AirDef. Простой stop_all не удаляет отложенные события внутри мода.

Следствия: до ~1 игровой секунды чужой техники в пустом мире; pending хранит due tick старой Sim, а новая начинает с 0, поэтому старый звук может прозвучать гораздо позже; moving хранит старый ID, который новая Sim может выдать другой машине.

Исправление: при смене world identity явно очищать transient очереди/выбор, немедленно сбрасывать model list и необходимые HUD/camera ресурсы. Сохранения настроек/техники при этом оставить per-world.

Критерий: два мира в одной игровой сессии: в первом пуск/задержанный звук/выбранный mover, второй пустой или с совпавшим ID. Никаких моделей/звуков/приказов из первого мира во втором. В игре пока не проверено, вывод получен прослеживанием обеих сторон API.

Код:

fn open_world(&mut self, world: Option<String>) {
,
if !models.is_empty() || self.sim.tick % 20 == 0 {
.

Проверено на опубликованном `90379f6` при проверке дополнительного ревью. Незакоммиченные изменения из чужой рабочей копии недоступны. open_world() пересоздаёт Sim и Ground, но не очищает `pending`, `moving` и немедленно не отправляет пустой model list. emit() отправляет пустые модели лишь при sim.tick%20==0. В пустом новом мире первые тики 1..19 могут оставлять старые модели (если новый список непустой, он заменит старый сразу). Проверена также логика форка после применения патчей: Game::finish_close_world очищает игровые сущности/звук, но не сбрасывает mods.models и клиентский экземпляр AirDef. Простой stop_all не удаляет отложенные события внутри мода. Следствия: до ~1 игровой секунды чужой техники в пустом мире; pending хранит due tick старой Sim, а новая начинает с 0, поэтому старый звук может прозвучать гораздо позже; moving хранит старый ID, который новая Sim может выдать другой машине. Исправление: при смене world identity явно очищать transient очереди/выбор, немедленно сбрасывать model list и необходимые HUD/camera ресурсы. Сохранения настроек/техники при этом оставить per-world. Критерий: два мира в одной игровой сессии: в первом пуск/задержанный звук/выбранный mover, второй пустой или с совпавшим ID. Никаких моделей/звуков/приказов из первого мира во втором. В игре пока не проверено, вывод получен прослеживанием обеих сторон API. Код: https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/src/lib.rs#L628, https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/src/lib.rs#L411.
Author
Owner

Смежный UX-случай из дополнительного ревью: в use_item(mover) уже выбранная машина может быть уничтожена/удалена до указания назначения. Если find(ID) или order_move() не сработали, код молча снимает выбор. При исправлении invalidation выбранного ID стоит показать причину («техника уничтожена/снята», «не может двигаться»), а не оставлять игрока без обратной связи. Это не утверждение, что обычный валидный марш всегда молчит.

Смежный UX-случай из дополнительного ревью: в use_item(mover) уже выбранная машина может быть уничтожена/удалена до указания назначения. Если find(ID) или order_move() не сработали, код молча снимает выбор. При исправлении invalidation выбранного ID стоит показать причину («техника уничтожена/снята», «не может двигаться»), а не оставлять игрока без обратной связи. Это не утверждение, что обычный валидный марш всегда молчит.
chexit added the area:audioarea:persistencearea:renderingpriority:P2type:bug labels 2026-10-29 13:10:42 +00:00
Author
Owner

🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/67a2a52 (запушено в main).

🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/67a2a52 (запушено в main).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#23