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 _logger; public YangdunService(IPlayerFactory playerFactory, IDialogueService dialogueService, PlayerAutoHealController healController, ITicker ticker, IEntitiesService entitiesService, ILogger 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()) { 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); } } }