217 lines
6.3 KiB
C#
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;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|