Files
necromants-tome-7d2d-3-2/HarmonySrc/NecroMapMarker.cs
T
AlexCubeandClaude Opus 5.5 31aa99860c Одержимость питомцев: роли медведя, волка, собаки и крысы; ноша стервятника; череп при обыске
- Могильная крыса: своя модель без волчьей шерсти; стоит на земле (центр капсулы);
  E - осмотр контейнеров без права взять (окно игры, рюкзак скрыт, отказ «инвентарь
  заполнен», контейнер не разрушается); ПКМ - проход сквозь постройки, полупрозрачная.
- Стервятник: курица в когтях - слепок с обвисшими крыльями и шеей, без хитбокса.
- Зомбособака: нюх - все существа рядом на компасе и карте.
- Медведь: толстая шкура (вдвое меньше урона), рёв-провокация, удар лапой по блокам.
- Лютоволк: бросок на цель с опрокидыванием, след крови раненых, сумка на 3 ячейки
  (лут, выгрузка у тела, выпадает мешком при гибели и отзыве; отдельный файл сейва).
- Череп (останки): 2% при обычном обыске красного трупа вместо браслета.
- Прицел книги не рисуется в одержимости; подсказки вселения на 13 языках.
- Замер EntityLeakProbe: удалённые, но живые в памяти сущности - в лог.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:58:40 +03:00

66 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}