using UnityEngine; namespace NecromancerTome { /// /// Метка на карте для того, кем сейчас управляет игрок: дух змеи и одержимый (зомби или питомец). /// Указание 06.10: «Змея всё ещё не появляется на карте. Подозреваю, что питомцы в режиме одержимости тоже». /// /// ПОЧЕМУ НЕ Entity.AddNavObject (так было у змеи с 02.10). У сущности одна общая NavObject на все её /// классы меток; у змеи от ванильного animalSnake там уже лежат twitch_spawn, animaltracking_snake, /// clear_sleeper. AddNavObject только дописывает класс в этот список, а какой из них показывать, /// игра решает сама (NavObject.HandleActiveNavClass), и карта (XUiC_MapArea.updateNavObjectList) /// заводит спрайт метки один раз по её ключу. Метка змеи так и не появилась ни разу. /// /// ЗДЕСЬ - как у транспорта (EntityVehicle.HandleNavObject: RegisterNavObject(класс, /// vehicle.GetMeshTransform()), разбор 06.10): своя, отдельная NavObject, привязанная к Transform (перегрузка /// NavObjectManager.RegisterNavObject(className, Transform)): своя запись, свой ключ, один класс. /// Позиция - transform.position (NavObject.GetPosition для TrackTypes.Transform), т.е. сама модель. /// Снимается UnRegisterNavObject; если сущность исчезла, игра снимет метку сама (IsValid). /// /// ЧУЖУЮ МЕТКУ НЕ ТРОГАТЬ (проверка на утечки 06.10). Снятые метки игра кладёт в пул /// (removedNavObjectPool) и раздаёт заново. Если модель исчезла раньше нашего Hide, игра сама сняла /// метку, и пул мог уже отдать этот же объект другому (метка чутья, транспорт). Поэтому снимаем, только /// если объект ещё в NavObjectList и следит за НАШЕЙ моделью; иначе просто забываем ссылку. /// Классы (nav_objects.xml), только карта: necroSnakeSpirit - фиолетовая змея, necroPossessed - зелёный /// значок одержимого. Значок задан в классе: OverrideSpriteName игра берёт, только если у класса /// use_override_icon (NavObject.GetSpriteName) - без него у одержимого была змея (тест 08.10). /// hiddenOnCompass не ставим: карта красит такие метки серым (XUiC_MapArea.updateNavObjects), а на /// компас эти классы и так не попадают - compass_settings у них нет. /// public static class NecroMapMarker { public const string SnakeClass = "necroSnakeSpirit"; public const string PossessedClass = "necroPossessed"; /// Метка и модель, за которой она следит. public class Marker { public NavObject Nav; public Transform Tracked; } public static Marker Show(EntityAlive _e, string _navClass) { if (_e == null || _e.transform == null || NavObjectManager.Instance == null) { return null; } NavObject nav = NavObjectManager.Instance.RegisterNavObject(_navClass, _e.transform); Debug.Log("[NecromancerTome] NecroMapMarker: метка на карте для " + _e.EntityName + " (" + _e.entityId + ") - " + nav); return new Marker { Nav = nav, Tracked = _e.transform }; } public static void Hide(ref Marker _m) { NavObjectManager manager = NavObjectManager.Instance; if (_m != null && _m.Nav != null && manager != null && _m.Tracked != null && manager.NavObjectList.Contains(_m.Nav) && _m.Nav.IsTrackedTransform(_m.Tracked)) { manager.UnRegisterNavObject(_m.Nav); } _m = null; } } }