[bug] При смене мира сохраняются старые модели, отложенные звуки и выбранная техника #23
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проверено на опубликованном
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.
Код:
Смежный UX-случай из дополнительного ревью: в use_item(mover) уже выбранная машина может быть уничтожена/удалена до указания назначения. Если find(ID) или order_move() не сработали, код молча снимает выбор. При исправлении invalidation выбранного ID стоит показать причину («техника уничтожена/снята», «не может двигаться»), а не оставлять игрока без обратной связи. Это не утверждение, что обычный валидный марш всегда молчит.
🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/67a2a52 (запушено в main).