using System.Collections.Generic; using Kitchen; using KitchenMods; using Pets.Components.Creation; using Unity.Collections; using Unity.Entities; namespace Pets.Systems { public class TransitionFix : GameSystemBase, IModSystem { private EntityQuery _players; private static Dictionary _requiresPet = new Dictionary(); private static Dictionary _linkedPet = new Dictionary(); protected override void Initialise() { base.Initialise(); _players = GetEntityQuery(new QueryHelper().All(typeof(CPlayer))); } protected override void OnUpdate() { NativeArray players = _players.ToEntityArray(Allocator.Temp); _requiresPet.Clear(); _linkedPet.Clear(); foreach (Entity player in players) { if (!Require(player, out CPlayer cPlayer)) continue; if (Require(player, out CRequiresPet cRequiresPet)) { _requiresPet.Add(cPlayer.ID, cRequiresPet); } if (Require(player, out CLinkedPet cLinkedPet)) { _linkedPet.Add(cPlayer.ID, cLinkedPet); } } players.Dispose(); } public override void AfterLoading(SaveSystemType system_type) { base.AfterLoading(system_type); if (_requiresPet == null) return; NativeArray players = _players.ToEntityArray(Allocator.Temp); for (int i = 0; i < players.Length; i++) { Entity player = players[i]; if (Has(player)) { EntityManager.RemoveComponent(player); } if (!Require(player, out CPlayer cPlayer)) continue; if (_linkedPet.TryGetValue(cPlayer.ID, out CLinkedPet cLinkedPet)) { EntityManager.AddComponentData(player, cLinkedPet); } if (_requiresPet.TryGetValue(cPlayer.ID, out CRequiresPet cRequiresPet)) { EntityManager.AddComponentData(player, cRequiresPet); } } _requiresPet.Clear(); players.Dispose(); } } }