Решили: чужое наведение показывается кольцом под бойцом, покрашенным мейн-цветом того, кто навёл. Цвет берётся из снимка палитры по имени USS-токена (--gm-color-player-N), а в кольцо приходит параметром, а не новым состоянием.

Почему: мейн-цвета игроков жили только как USS-токены, а кольцо рисуется в мире через Shapes — UI Toolkit туда не достаёт. Отвергнут второй набор цветов для мира: это ровно тот дубль, который запрещает HARD-правило про единственного владельца цвета. Оказалось, моста уже достаточно — палитра и есть снимок токенов по имени, и TryGet("--gm-color-player-1") работает без единой правки ассета. Отвергнуто пятое состояние кольца: четыре существующих описывают МОЮ руку («навёл», «тащу», «сюда можно»), а мейн-цвет — свойство чужого человека из состава сеанса. Загони его в перечисление, и цвет игрока пришлось бы дублировать в показе.

Грабли: HoveredId ехал в пакете присутствия с самого начала и не отдавался наружу ни одному потребителю — RemoteCursor его просто не нёс. Функция выглядела ненаписанной, хотя не хватало только последнего звена; искать такое надо не по «где реализовано», а по «кто читает».

Владелец правды: Core/Players/IPresenceView.cs (RemoteCursor.HoveredId), Game/DeploymentInteraction.cs (TintOfForeignHover), Presentation/DeploymentView.cs.