TauCetiStation / TauCetiClassic

Франкенштейн жив
GNU Affero General Public License v3.0
143 stars 417 forks source link

[Task] Moved signals/hooks #12899

Open volas opened 9 months ago

volas commented 9 months ago

Пока очень примерно набросаю мысли, это не готовое ТЗ.

Проблема - нам требуется лучший контроль за перемещением атомов.

https://github.com/TauCetiStation/TauCetiClassic/blob/08b998ba499b1a0ef7026df246930fa4666e6de9/code/game/atoms_movable.dm#L130-L163

https://github.com/TauCetiStation/TauCetiClassic/blob/08b998ba499b1a0ef7026df246930fa4666e6de9/code/controllers/subsystem/parallax.dm#L18-L43

https://github.com/TauCetiStation/TauCetiClassic/blob/08b998ba499b1a0ef7026df246930fa4666e6de9/code/modules/mob/dead/observer/observer.dm#L121-L125

Как вариант решения, вместо того, чтоб самим каждый раз идти в рекурсию и искать атомы, которые надо дергать по ивентам, мы могли бы сделать, чтоб сами эти атомы добавлялись в специальный список на верхний существующий atom/movable. Примерно как уже сделано с /datum/light_source - он всегда всплывает наверх и добавляется в list/light_sources верхнего атома. Или как уже сделано с clients_in_contents, только в случае клиентов они не сами всплывают, а их пересчитывает сабсистема, и это можно было бы изменить.

Соответственно, при любых перемещениях этого atom/movable, нам достаточно будет просто заглянуть в его собственный список объектов, которым был важен факт перемещения, и вызвать им специальный хук.

В перспективе может быть это можно сделать не только для сигналов движения, но еще каких-нибудь hear-слушателей, там тоже каждый раз их рекурсивно ищем. Но это уже что-то близкое с Spacial Grid с тг.

volas commented 8 months ago

Обновил описание. Пока очень абстрактно, и я думаю, как к этому можно было бы приспособить уже существующие сигналы (атом подписался на сигнал moved - ему это важно, автоматом отслеживаем его на верхнем уровне).

Про то, что надо еще починить все loc вместо forcemove, не буду писать, это очевидно.