[bug] Terrain-following навсегда кэширует старые высоты и не слышит world-changes #64

Closed
opened 2026-10-29 21:11:42 +00:00 by chexit · 1 comment
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Ревью 6f3fc644bc5194311a86baba722bc340215306b7. Новый обход рельефа использует Ground::rise/land/column, у которых нет ни TTL, ни связи с инвалидациями геометрии.

sim/terrain.rs::rise возвращает любое значение Ground.known без проверки времени; column делает то же для планировщика. Комментарий прямо обещает не спрашивать известную колонку повторно. В lib.rs события world_changes уходят только в ground.world.changed, то есть в другой, 3D-кэш. События изменения блоков не инвалидируют Ground.known.

Обычный Ground::at(now) имеет refresh через 200 тиков, но это не спасает lattice-колонки look-ahead: они часто никогда не совпадают с точной XZ позицией летящего аппарата. Собственный forget при взрыве не покрывает редактирование игроком/сервером и отложенное применение TNT.

Выполненный нативный пример

g.answer(vec![(4,4,150)], 0);
assert_eq!(g.land(DVec3::new(4.,70.,4.)), Some(150.));
g.world.changed(1, false, &[(0,9,0)]);
g.answer(vec![], 10000);
assert_eq!(g.land(DVec3::new(4.,70.,4.)), Some(150.));
assert!(g.take_wanted().is_empty());

Даже спустя 500 игровых секунд и после геометрической инвалидации нового запроса нет. Свежий DDA при этом может знать уже другую геометрию.

Эффект и исправление

Дроны продолжают облетать снесённую гору; новые возвышенности не видны заблаговременному набору высоты; SAM launch verdict/loft и цены планировщика опираются на разные версии мира. При изменении/замене секции инвалидировать соответствующие heightmap-колонки; иметь bounded refresh/revision и для land/column. Сохранять разделение Pending/Void/At и бюджет запросов.

Проверить изменение горы/платформы после прогрева, перепланирование налёта и уже летящие аппараты. Не регрессировать исправление голодания #1.

🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `6f3fc644bc5194311a86baba722bc340215306b7`. Новый обход рельефа использует `Ground::rise/land/column`, у которых нет ни TTL, ни связи с инвалидациями геометрии. `sim/terrain.rs::rise` возвращает любое значение `Ground.known` без проверки времени; `column` делает то же для планировщика. Комментарий прямо обещает не спрашивать известную колонку повторно. В `lib.rs` события `world_changes` уходят только в `ground.world.changed`, то есть в **другой, 3D-кэш**. События изменения блоков не инвалидируют `Ground.known`. Обычный `Ground::at(now)` имеет refresh через 200 тиков, но это не спасает lattice-колонки look-ahead: они часто никогда не совпадают с точной XZ позицией летящего аппарата. Собственный `forget` при взрыве не покрывает редактирование игроком/сервером и отложенное применение TNT. ### Выполненный нативный пример ```rust g.answer(vec![(4,4,150)], 0); assert_eq!(g.land(DVec3::new(4.,70.,4.)), Some(150.)); g.world.changed(1, false, &[(0,9,0)]); g.answer(vec![], 10000); assert_eq!(g.land(DVec3::new(4.,70.,4.)), Some(150.)); assert!(g.take_wanted().is_empty()); ``` Даже спустя 500 игровых секунд и после геометрической инвалидации нового запроса нет. Свежий DDA при этом может знать уже другую геометрию. ### Эффект и исправление Дроны продолжают облетать снесённую гору; новые возвышенности не видны заблаговременному набору высоты; SAM launch verdict/loft и цены планировщика опираются на разные версии мира. При изменении/замене секции инвалидировать соответствующие heightmap-колонки; иметь bounded refresh/revision и для land/column. Сохранять разделение Pending/Void/At и бюджет запросов. Проверить изменение горы/платформы после прогрева, перепланирование налёта и уже летящие аппараты. Не регрессировать исправление голодания #1.
chexit added the area:simulationtype:bugpriority:P2 labels 2026-10-29 21:11:42 +00:00
Author
Owner

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/5f8bff3 (запушено в main).

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

No dependencies set.

Reference: chexit/airdef#64