using cfg.BulletCfg; using cfg.SkillCfg; using Gameplay.Summon; using Gameplay.Unit; using Gameplay.Unit.Data; namespace Gameplay.Bullet { public static class BulletManagerHelper { /// /// 检查是否满足需求 /// /// /// /// /// 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; } } } }