summaryrefslogtreecommitdiff
path: root/Animal.cs
blob: 1d27650ef5677ca0f6586403165e8c627910c5ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using SharpPluginLoader.Core.Memory;

namespace SharpPluginLoader.Core.Entities
{
    public class Animal : Entity
    {
        /// <summary>
        /// The sAnimal singleton instance
        /// </summary>
        public static MtObject SingletonInstance => SingletonManager.GetSingleton("sAnimal")!;

        /// <summary>
        /// Gets a list of all animals in the game
        /// </summary>
        /// <returns></returns>
        public static Animal[] GetAllAnimals()
        {
            lock (_animals)
                return _animals.ToArray();
        }

        /// <summary>
        /// Constructs a new Animal from a native pointer
        /// </summary>
        /// <param name="instance">The native pointer</param>
        public Animal(nint instance) : base(instance) { }

        // @TODO: Map to names.
        public int Id => Get<int>(0x1AF8); // +0x294
        public int OtherId => Get<int>(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<AnimalAddDelegate>(0x141D2F610, AnimalAddHook);
            _animalRemoveHook = Hook.Create<AnimalRemoveDelegate>(0x141D289D0, AnimalRemoveHook);
        }

        private delegate void AnimalAddDelegate(nint instance);
        private delegate nint AnimalRemoveDelegate(nint instance);
        private static Hook<AnimalAddDelegate> _animalAddHook = null!;
        private static Hook<AnimalRemoveDelegate> _animalRemoveHook = null!;
        private static readonly List<Animal> _animals = [];
    }
}