BITFALL/Assets/Artists/Scripts/Entities/Improvised/ImprovisedService.cs

95 lines
2.3 KiB
C#
Raw Normal View History

2023-10-20 19:31:12 +08:00
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))]
2023-10-30 01:25:53 +08:00
public class ImprovisedService : EntityBehavior,ImprovisedServiceInterface
2023-10-20 19:31:12 +08:00
{
[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;
}
2023-10-29 15:27:13 +08:00
if (TryGetImprovisedItem(out var current))
{
TryUnEquipImprovised(out _);
}
2023-10-20 19:31:12 +08:00
_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;
}
}
}