using Items; using Unity.Entities; using UnityEngine; using UnityEngine.AddressableAssets; namespace DefaultNamespace { public class PlayerWeaponSwitcherSystem : AdvancedComponentSystem { protected override void OnSystemUpdate() { Entities.WithAllReadOnly() .ForEach( (Entity entity, ActorWeaponPropertiesData weapon, ref ActorWeaponReferenceData weaponReference) => { var inventory = EntityManager.GetBuffer(entity); var weaponEntity = weaponReference.Weapon; var weaponSlotIndex = inventory.Length - 1; if (weaponSlotIndex >= 0) { var inventoryWeapon = inventory[weaponSlotIndex]; if (!inventoryWeapon.Item.Item.IsValid) { RemoveWeapon(entity, weaponEntity); } else if (inventoryWeapon.Item.Item != weapon.Id) { RemoveWeapon(entity, weaponEntity); } } else { RemoveWeapon(entity, weaponEntity); } }); Entities.WithAll() .WithNone() .ForEach( entity => { var inventory = EntityManager.GetBuffer(entity); var weaponSlotIndex = inventory.Length - 1; if (weaponSlotIndex >= 0 && inventory[weaponSlotIndex].Item.Item.IsValid) { var itemOperation = Addressables.LoadAssetAsync(inventory[weaponSlotIndex].Item.Item.ToString()); if (itemOperation.IsValid() && itemOperation.IsDone && itemOperation.Result is RangedWeaponItem weaponItem) { PostUpdateCommands.AddSharedComponent( entity, new ActorWeaponPropertiesData { Weapon = weaponItem, Id = inventory[weaponSlotIndex].Item.Item }); } } }); } private void RemoveWeaponComponents(Entity entity, Entity weaponEntity) { PostUpdateCommands.RemoveComponent(entity); PostUpdateActions.Enqueue( () => { EntityManager.DestroyEntityWithObjects(weaponEntity); if (EntityManager.HasComponent(entity)) { var animator = EntityManager.GetComponentObject(entity); var overrideController = animator.runtimeAnimatorController as AnimatorOverrideController; if (overrideController != null) { animator.runtimeAnimatorController = overrideController.runtimeAnimatorController; } } }); } private void RemoveWeapon(Entity entity, Entity weaponEntity) { PostUpdateCommands.RemoveComponent(entity); RemoveWeaponComponents(entity, weaponEntity); } } }