using System; using System.Collections; using System.Collections.Generic; using System.Linq; using BITKit; using BITKit.Entities; using JetBrains.Annotations; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Interactions; namespace BITFALL.Entities.Improvised { [CustomType(typeof(ImprovisedServiceInterface))] public class ImprovisedService : EntityBehavior,ImprovisedServiceInterface { [Inject] private IHealth _health; [Inject(true)] private IKnockdown _knockdown; private IBasicItem _improvisedItem; public event Func OnTryEquipImprovisedItem; public event Func OnTryUnEquipImprovisedItem; public event Action OnEquipImprovisedItem; public event Action OnUnEquipImprovisedItem; public override void OnAwake() { _health.OnSetAlive += _ => { TryUnEquipImprovised(out var _); }; if (_knockdown is not null) { _knockdown.OnKnockdown += () => { TryUnEquipImprovised(out _); }; } } public bool IsImprovised => _improvisedItem is not null; public bool TryGetImprovisedItem(out IBasicItem item) { item = _improvisedItem; return item is not null; } public bool TryEquipImprovisedItem(IBasicItem weapon) { if (OnTryEquipImprovisedItem.CastAsFunc().Any(func => func.Invoke(weapon) is false)) { return false; } if (TryGetImprovisedItem(out var current)) { TryUnEquipImprovised(out _); } _improvisedItem = weapon; OnEquipImprovisedItem?.Invoke(weapon); return true; } public void TryUnEquipImprovised()=> TryUnEquipImprovised(out var _); public void TryUnEquipImprovised(InputAction.CallbackContext context) { if (context is { interaction: PressInteraction, performed: true }) //if (context is { interaction: HoldInteraction, performed: true }) { TryUnEquipImprovised(out var _); } } public bool TryUnEquipImprovised(out IBasicItem weapon) { if (_improvisedItem is null) { weapon = null; return false; } if (OnTryUnEquipImprovisedItem.CastAsFunc().Any(x => x.Invoke(_improvisedItem) is false)) { weapon = null; return false; } weapon = _improvisedItem; _improvisedItem = null; OnUnEquipImprovisedItem?.Invoke(weapon); return true; } } }