95 lines
2.3 KiB
C#
95 lines
2.3 KiB
C#
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<IBasicItem, bool> OnTryEquipImprovisedItem;
|
|
public event Func<IBasicItem, bool> OnTryUnEquipImprovisedItem;
|
|
public event Action<IBasicItem> OnEquipImprovisedItem;
|
|
public event Action<IBasicItem> 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;
|
|
}
|
|
|
|
|
|
}
|
|
}
|