NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Bounds/Data/CombineSingleBounds.cs

159 lines
5.2 KiB
C#
Raw Normal View History

2023-08-22 19:08:45 +08:00
using System.Collections.Generic;
using Code.Scripts.Gameplay.Enviorment;
2023-10-19 15:00:19 +08:00
using Gameplay.Buff;
using Gameplay.Character;
2023-12-13 16:20:41 +08:00
using Gameplay.Unit;
using Gameplay.Unit.Data;
2023-08-22 19:08:45 +08:00
namespace Utils.Bounds.Data
{
using cfg.BoundsCfg;
2023-10-19 15:00:19 +08:00
public class CombineSingleBounds
2023-08-22 19:08:45 +08:00
{
public int tagId;
public int triggerCount;
public List<DataBounds> rawConfigs;
2023-10-19 15:00:19 +08:00
public CombineSingleBounds(DataBounds data)
2023-08-22 19:08:45 +08:00
{
rawConfigs = new List<DataBounds>();
2023-10-19 15:00:19 +08:00
tagId = (int)data.BoundTag;
2023-08-22 19:08:45 +08:00
triggerCount = data.TriggerCount;
2023-10-19 15:00:19 +08:00
2023-08-22 19:08:45 +08:00
rawConfigs.Add(data);
}
2023-10-19 15:00:19 +08:00
2023-08-22 19:08:45 +08:00
public void AddBounds(DataBounds data)
{
rawConfigs.Add(data);
}
private bool _FilterLevelWeather(List<int> weatherIds)
{
if (weatherIds.Count == 0)
{
return true;
}
var nowLevelWeatherId = EnviormentManager.instance.currentWeatherId;
return weatherIds.Contains(nowLevelWeatherId);
}
private bool _FilterLevelTerrain(List<int> terrainIds)
{
if (terrainIds.Count == 0)
{
return true;
}
var nowLevelTerrainId = EnviormentManager.instance.currentLevelTerrainId;
return terrainIds.Contains(nowLevelTerrainId);
}
private bool _FilterUnitTag(EBoundsTarget targetType,
2023-10-19 15:00:19 +08:00
GameUnit unit)
{
if (unit.statusData.isDead) return false;
switch (targetType)
{
case EBoundsTarget.SameTag:
// 只针对同tag的单位
// 只有角色才有tag
if (unit.gameunitType == EGameUnitType.Character
&& unit.commonData.troopId == ETroopsId.Self)
{
if (unit is Character character)
{
var cTags = character.runtimeData.configData.boundTags;
if (cTags.Contains(tagId))
{
return true;
}
}
}
break;
case EBoundsTarget.AllEnemySide:
// 只针对敌方单位
if (unit.commonData.troopId != ETroopsId.Self)
{
return true;
}
break;
case EBoundsTarget.AllSelfSide:
// 只针对己方单位
if (unit.commonData.troopId == ETroopsId.Self)
{
return true;
}
break;
default:
DebugUtil.LogError("暂未处理的羁绊类型:{0}", targetType);
break;
}
return false;
}
private List<GameUnit> _FilterUnits(EBoundsTarget targetType)
{
var result = new List<GameUnit>();
2023-12-14 18:25:52 +08:00
var allUnits = GameUnitManager.instance.infightUnits;
for (int i = 0; i < allUnits.count; i++)
2023-10-19 15:00:19 +08:00
{
2023-12-14 18:25:52 +08:00
var unit = allUnits.GetByIndex(i);
2023-10-19 15:00:19 +08:00
if (unit == null) continue;
if (unit.statusData.isDead) continue;
var canAdd = _FilterUnitTag(targetType, unit);
2023-10-19 15:00:19 +08:00
if (canAdd)
{
result.Add(unit);
}
}
return result;
}
public void TriggerAdd(GameUnit unit)
{
for (int i = 0; i < rawConfigs.Count; i++)
2023-10-19 15:00:19 +08:00
{
var rawConfig = rawConfigs[i];
var filterType = rawConfig.TargetType;
var canAdd = _FilterUnitTag(filterType, unit);
2023-10-19 15:00:19 +08:00
if (!canAdd) continue;
canAdd = _FilterLevelWeather(rawConfig.TriggerWeatherIds);
if (!canAdd) continue;
canAdd = _FilterLevelTerrain(rawConfig.TriggerLevelTerrianIds);
if (!canAdd) continue;
var buffIds = rawConfig.BuffIds;
2023-10-19 15:00:19 +08:00
for (int k = 0; k < buffIds.Count; k++)
{
var buffId = buffIds[k];
var createBuff = BuffManager.instance.CreateBuffById(unit, buffId);
unit.buffManager.AddBuff(createBuff);
}
}
}
public void TriggerRemove(GameUnit unit)
{
for (int i = 0; i < rawConfigs.Count; i++)
2023-10-19 15:00:19 +08:00
{
var filterType = rawConfigs[i].TargetType;
var canRemove = _FilterUnitTag(filterType, unit);
if (!canRemove) continue;
canRemove = _FilterLevelWeather(rawConfigs[i].TriggerWeatherIds);
if (!canRemove) continue;
canRemove = _FilterLevelTerrain(rawConfigs[i].TriggerLevelTerrianIds);
2023-10-19 15:00:19 +08:00
if (!canRemove) continue;
var buffIds = rawConfigs[i].BuffIds;
2023-10-19 15:00:19 +08:00
for (int k = 0; k < buffIds.Count; k++)
{
var buffId = buffIds[k];
unit.buffManager.RemoveBuffById(buffId);
}
}
}
2023-08-22 19:08:45 +08:00
}
}