122 lines
4.0 KiB
C#
122 lines
4.0 KiB
C#
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);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|