- Могильная крыса: своя модель без волчьей шерсти; стоит на земле (центр капсулы); E - осмотр контейнеров без права взять (окно игры, рюкзак скрыт, отказ «инвентарь заполнен», контейнер не разрушается); ПКМ - проход сквозь постройки, полупрозрачная. - Стервятник: курица в когтях - слепок с обвисшими крыльями и шеей, без хитбокса. - Зомбособака: нюх - все существа рядом на компасе и карте. - Медведь: толстая шкура (вдвое меньше урона), рёв-провокация, удар лапой по блокам. - Лютоволк: бросок на цель с опрокидыванием, след крови раненых, сумка на 3 ячейки (лут, выгрузка у тела, выпадает мешком при гибели и отзыве; отдельный файл сейва). - Череп (останки): 2% при обычном обыске красного трупа вместо браслета. - Прицел книги не рисуется в одержимости; подсказки вселения на 13 языках. - Замер EntityLeakProbe: удалённые, но живые в памяти сущности - в лог. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
66 lines
4.2 KiB
C#
66 lines
4.2 KiB
C#
using UnityEngine;
|
||
|
||
namespace NecromancerTome
|
||
{
|
||
/// <summary>
|
||
/// Метка на карте для того, кем сейчас управляет игрок: дух змеи и одержимый (зомби или питомец).
|
||
/// Указание 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 у них нет.
|
||
/// </summary>
|
||
public static class NecroMapMarker
|
||
{
|
||
public const string SnakeClass = "necroSnakeSpirit";
|
||
public const string PossessedClass = "necroPossessed";
|
||
|
||
/// <summary>Метка и модель, за которой она следит.</summary>
|
||
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;
|
||
}
|
||
}
|
||
}
|