using Gameplay.Area; using Gameplay.Buff; using Gameplay.Bullet; using Gameplay.Common; using Gameplay.Level; using LTGame; namespace Gameplay.Summon { public class SummonStateTent2 : BaseSummonState { private readonly SummonTent2 _tent2; private float _remainTriggerTime; private float _remainRecoverCD; public SummonStateTent2(SummonTent2 tent) : base(tent, ESummonState.Tent2) { _tent2 = tent; } protected override void _OnEnter(NBaseState exitState, object param) { base._OnEnter(exitState, param); _remainTriggerTime = _tent2.triggerInterval; _remainRecoverCD = 0; } protected override void _OnRunning() { base._OnRunning(); // old logic _remainTriggerTime -= deltaTime; if (_remainTriggerTime <= 0) { _remainTriggerTime += _tent2.triggerInterval; _DoLogic(); } // new logic // 检测周围是否有低于触发值的单位 if (_remainRecoverCD > 0) { _remainRecoverCD -= deltaTime; } else { var searchUnit = _SearchAroundUnits(); if (searchUnit != null) { _remainRecoverCD = _tent2.recoverCD; // TODO: 这个id需要从配置读 var buffId = 10002; // 恢复护盾 var addBuff = BuffManager.instance.CreateBuffById(owner.creator, buffId); addBuff.OverrideFloatParams(_tent2.recoverValueA, _tent2.recoverValueB); BuffManager.instance.AddBuff(searchUnit, addBuff); } } } private GameUnit _SearchAroundUnits() { var map = LevelManager.Instance.CurrentLevel.Map; // 由于这里只检测友军,所以直接遍历所有友军即可 var allUnits = GameUnitMapper.Inst.unitList; for (int i = 0; i < allUnits.Count; i++) { var searchUnit = allUnits[i]; if (searchUnit.gameunitType != EGameUnitType.Character) { // 只对角色生效 continue; } if (searchUnit.commonData.troopId != owner.creator.commonData.troopId) { // 只对友军生效 continue; } if (searchUnit.statusData.isDead) { // 只对存活单位生效 continue; } var remainShiled = searchUnit.aliveData.currentShield; var maxShiled = searchUnit.aliveData.maxShield; var shieldRate = remainShiled / maxShiled; if (shieldRate > _tent2.triggerValue) { // 需要满足护甲值低于触发值 continue; } var distance = map.TerrainGridSystem.CellGetHexagonDistance(owner.transData.cellIndex, searchUnit.transData.cellIndex); if (distance > _tent2.checkDistance) { // 需要满足距离小于检测距离 continue; } return searchUnit; } return null; } private void _DoLogic() { var bulletId = _tent2.emitBulletId; var areaId = _tent2.areaId; // 根据作用区域筛选目标 var selectIndexs = AreaManager.instance.GetCellIndexs(owner.transData.cellIndex, areaId); for (var i = 0; i < selectIndexs.Count; ++i) { var cellIndex = selectIndexs[i]; BulletManager.instance.EmitBulletFromSummon(bulletId, cellIndex, _tent2); } } } }