Net.Like.Xue.Tokyo/Assets/Artists/Scripts/YangdunService.cs

114 lines
3.1 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using Animancer;
using BITKit;
using BITKit.Entities;
using Cysharp.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Net.Project.B.AI;
using Net.Project.B.Dialogue;
using Net.Project.B.Health;
using Project.B.Entities;
using UnityEngine;
namespace Net.Like.Xue.Tokyo
{
public class YangdunService:IDisposable
{
private readonly IEntitiesService _entitiesService;
private readonly IPlayerFactory _playerFactory;
private readonly IDialogueService _dialogueService;
private readonly PlayerAutoHealController _healController;
private readonly ITicker _ticker;
private readonly ValidHandle _disabledHealth = new();
private IEntity _player;
private readonly ILogger<YangdunService> _logger;
public YangdunService(IPlayerFactory playerFactory, IDialogueService dialogueService, PlayerAutoHealController healController, ITicker ticker, IEntitiesService entitiesService, ILogger<YangdunService> logger)
{
_playerFactory = playerFactory;
_dialogueService = dialogueService;
_healController = healController;
_ticker = ticker;
_entitiesService = entitiesService;
_logger = logger;
_playerFactory.OnEntityCreated += OnEntityCreated;
_disabledHealth.AddListener(OnDisableHealth);
_disabledHealth.Invoke();
ticker.Add(OnTick);
}
void OnDisableHealth(bool x)
{
_logger.LogInformation(!x ? "开启回血" : "关闭回血");
_healController.Enabled = !x;
}
private void OnTick(float obj)
{
if (_player is null)
{
_disabledHealth.RemoveElement(0);
return;
}
foreach (var blackBoard in _entitiesService.QueryComponents<AIBlackBoard>())
{
if (blackBoard.Dialogue != _player) continue;
_disabledHealth.AddElement(0);
return;
}
_disabledHealth.RemoveElement(0);
}
private UniTask OnEntityCreated(string arg1, IEntity arg2)
{
arg2.ServiceProvider.QueryComponents(out IHealthComponent healthComponent);
healthComponent.OnHealthChanged += OnHealthChanged;
_player = arg2;
DisposeEntity();
return UniTask.CompletedTask;
async void DisposeEntity()
{
await arg2.CancellationToken.WaitUntilCanceled();
_player = null;
}
}
private void OnHealthChanged(int arg1, int arg2)
{
if(arg2>=0)return;
Debug.Log("Game Over");
_dialogueService.CreateDialogue(new DialogueData()
{
Text = "你其实是一只羊吧"
});
}
public void Dispose()
{
_ticker.Remove(OnTick);
}
}
}