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 = [];
}
}