NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Bullet/BulletManagerHelper.cs

217 lines
6.3 KiB
C#

using cfg.BulletCfg;
using cfg.SkillCfg;
using Gameplay.Summon;
using Gameplay.Unit;
using Gameplay.Unit.Data;
namespace Gameplay.Bullet
{
public static class BulletManagerHelper
{
/// <summary>
/// 检查是否满足需求
/// </summary>
/// <param name="sender"></param>
/// <param name="beHitter"></param>
/// <param name="bulletConfig"></param>
/// <returns></returns>
public static bool CheckBulletFilter(GameUnit sender,
GameUnit beHitter,
DataBullet bulletConfig)
{
var checkUnitType = _CheckUnitType(beHitter, bulletConfig);
if (!checkUnitType)
{
return false;
}
var troopCheck = _CheckTroopSide(sender, beHitter, bulletConfig.FilterType);
if (!troopCheck)
{
return false;
}
var jobCheck = _CheckJobSide(beHitter, bulletConfig);
if (!jobCheck)
{
return false;
}
var pretentCheck = _CheckPretentAvaliable(beHitter, bulletConfig);
if (!pretentCheck)
{
return false;
}
var moraleCheck = _CheckMoraleState(beHitter, bulletConfig);
if (!moraleCheck)
{
return false;
}
var buffGroupCheck = _CheckHasBuffGroup(beHitter, bulletConfig);
if (!buffGroupCheck)
{
return false;
}
return true;
}
private static bool _CheckPretentAvaliable(GameUnit beHitter,
DataBullet bulletConfig)
{
if (bulletConfig.CanUseOnPretent)
{
return true;
}
if (beHitter.statusData.isPretend)
{
return false;
}
return true;
}
private static bool _CheckMoraleState(GameUnit beHitter,
DataBullet bulletConfig)
{
if (bulletConfig.MoraleFilter.Count == 0)
{
return true;
}
var behitCharacter = beHitter as Character.Character;
if (behitCharacter == null)
{
return false;
}
var moraleState = behitCharacter.runtimeData.moraleState;
if (bulletConfig.MoraleFilter.Contains(moraleState))
{
return true;
}
return false;
}
private static bool _CheckHasBuffGroup(GameUnit beHitter,
DataBullet bulletConfig)
{
if (bulletConfig.ExistBuffGroupIdFilter.Count == 0)
{
return true;
}
var buffManager = beHitter.buffManager;
if (buffManager == null)
{
return false;
}
for (var i = 0; i < bulletConfig.ExistBuffGroupIdFilter.Count; ++i)
{
var buffGroupId = bulletConfig.ExistBuffGroupIdFilter[i];
if (buffManager.HasBuffGroup(buffGroupId))
{
return true;
}
}
return false;
}
private static bool _CheckUnitType(GameUnit beHitter,
DataBullet bulletConfig)
{
if (beHitter.gameunitType == EGameUnitType.Character)
{
return bulletConfig.ActiveOnCharacter;
}
if (beHitter.gameunitType == EGameUnitType.Vehicle)
{
return bulletConfig.ActiveOnVehicle;
}
if (beHitter.gameunitType == EGameUnitType.Building)
{
return bulletConfig.ActiveOnBuild;
}
if (beHitter.gameunitType == EGameUnitType.Summon)
{
var unitSummon = beHitter as BaseSummon;
if (unitSummon == null)
{
return false;
}
if (unitSummon.subUnitType == EGameUnitType.Character)
{
return bulletConfig.ActiveOnCharacter;
}
if (unitSummon.subUnitType == EGameUnitType.Vehicle)
{
return bulletConfig.ActiveOnVehicle;
}
if (unitSummon.subUnitType == EGameUnitType.Building)
{
return bulletConfig.ActiveOnBuild;
}
}
return false;
}
private static bool _CheckJobSide(GameUnit beHitter,
DataBullet bulletConfig)
{
if (bulletConfig.JobFilters == null || bulletConfig.JobFilters.Count == 0)
{
return true;
}
// 只针对character
var behitCharacter = beHitter as Character.Character;
if (behitCharacter == null)
{
return false;
}
var behitJob = behitCharacter.runtimeData.configData.job;
if (bulletConfig.JobFilters.Contains(behitJob))
{
return true;
}
return false;
}
private static bool _CheckTroopSide(GameUnit sender,
GameUnit beHitter,
ETargetType filterType)
{
switch (filterType)
{
case ETargetType.SelfSide:
if (sender.commonData.troopId == beHitter.commonData.troopId)
{
return true;
}
return false;
case ETargetType.EnemySide:
if (sender.commonData.troopId != beHitter.commonData.troopId)
{
return true;
}
return false;
case ETargetType.Self:
if (sender == beHitter)
{
return true;
}
return false;
case ETargetType.AnyUnit:
return true;
default:
DebugUtil.LogError("_CheckBulletFilter 暂未实现的filterType:{0}", filterType);
return false;
}
}
}
}