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;
}
}
}