114 lines
3.1 KiB
C#
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);
|
|
}
|
|
}
|
|
|
|
}
|
|
|