1
This commit is contained in:
108
Assets/Artists/Scripts/YangdunService.cs
Normal file
108
Assets/Artists/Scripts/YangdunService.cs
Normal file
@@ -0,0 +1,108 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
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 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;
|
||||
_ticker = ticker;
|
||||
_entitiesService = entitiesService;
|
||||
_logger = logger;
|
||||
|
||||
_playerFactory.OnEntityCreated += OnEntityCreated;
|
||||
|
||||
_disabledHealth.AddListener(x =>
|
||||
{
|
||||
_logger.LogInformation(!x ? "开启回血" : "关闭回血");
|
||||
healController.Enabled = !x;
|
||||
});
|
||||
|
||||
_disabledHealth.Invoke();
|
||||
|
||||
ticker.Add(OnTick);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user