using SharpPluginLoader.Core.Memory; namespace SharpPluginLoader.Core.Entities { public class Animal : Entity { /// /// The sAnimal singleton instance /// public static MtObject SingletonInstance => SingletonManager.GetSingleton("sAnimal")!; /// /// Gets a list of all animals in the game /// /// public static Animal[] GetAllAnimals() { lock (_animals) return _animals.ToArray(); } /// /// Constructs a new Animal from a native pointer /// /// The native pointer public Animal(nint instance) : base(instance) { } // @TODO: Map to names. public int Id => Get(0x1AF8); // +0x294 public int OtherId => Get(0x1AF0); private static void AnimalAddHook(nint instance) { var animal = new Animal(instance); lock (_animals) _animals.Add(animal); _animalAddHook.Original(instance); } private static nint AnimalRemoveHook(nint instance) { var animal = new Animal(instance); lock(_animals) _animals.Remove(animal); return _animalRemoveHook.Original(instance); } internal static void Initialize() { _animalAddHook = Hook.Create(0x141D2F610, AnimalAddHook); _animalRemoveHook = Hook.Create(0x141D289D0, AnimalRemoveHook); } private delegate void AnimalAddDelegate(nint instance); private delegate nint AnimalRemoveDelegate(nint instance); private static Hook _animalAddHook = null!; private static Hook _animalRemoveHook = null!; private static readonly List _animals = []; } }