public void SearchAreaTargets(List <Unit> targets, float radius, Vector3 center, Unit referer, SpellTargetChecks checkType) { int hitCount = Physics.OverlapSphereNonAlloc(center, radius, raycastResults, PhysicsReference.Mask.Characters); Assert.IsFalse(hitCount == raycastResults.Length, "Raycast results reached maximum!"); for (int i = 0; i < hitCount; i++) { if (!WorldManager.UnitManager.TryFind(raycastResults[i], out Unit targetUnit) || targetUnit.Map != this) { continue; } switch (checkType) { case SpellTargetChecks.Ally: if (referer.IsHostileTo(targetUnit)) { continue; } break; case SpellTargetChecks.Enemy: if (!referer.IsHostileTo(targetUnit)) { continue; } break; } targets.Add(targetUnit); } }
internal SpellMissType SpellHitResult(Unit victim, SpellInfo spellInfo, bool canReflect = false) { if (unit == victim) { return(SpellMissType.None); } // all positive spells can`t miss if (spellInfo.IsPositive && !unit.IsHostileTo(victim)) { return(SpellMissType.None); } return(SpellMissType.None); }
public SpellCastResult CheckExplicitTarget(Unit caster, Unit target) { if (ExplicitTargetType != SpellExplicitTargetType.Target) { return(SpellCastResult.Success); } if (ExplicitCastTargets.HasAnyFlag(SpellCastTargetFlags.UnitMask)) { if (target == null) { return(SpellCastResult.BadTargets); } if (target.IsDead && !HasAttribute(SpellAttributes.CanTargetDead)) { return(SpellCastResult.TargetDead); } if (!HasAttribute(SpellExtraAttributes.CanTargetInvisible) && !caster.CanSeeOrDetect(target)) { return(SpellCastResult.BadTargets); } if (ExplicitCastTargets.HasTargetFlag(SpellCastTargetFlags.UnitEnemy) && caster.IsHostileTo(target)) { return(SpellCastResult.Success); } if (ExplicitCastTargets.HasTargetFlag(SpellCastTargetFlags.UnitAlly) && caster.IsFriendlyTo(target)) { return(SpellCastResult.Success); } return(SpellCastResult.BadTargets); } return(SpellCastResult.Success); }
public SpellCastResult CheckExplicitTarget(Unit caster, Unit target) { if (ExplicitTargetType == SpellExplicitTargetType.None) { return(SpellCastResult.Success); } if (ExplicitCastTargets.HasAnyFlag(SpellCastTargetFlags.UnitMask)) { if (target == null) { return(SpellCastResult.BadTargets); } if (ExplicitCastTargets.HasTargetFlag(SpellCastTargetFlags.UnitEnemy) && caster.IsHostileTo(target)) { return(SpellCastResult.Success); } if (ExplicitCastTargets.HasTargetFlag(SpellCastTargetFlags.UnitAlly) && caster.IsFriendlyTo(target)) { return(SpellCastResult.Success); } return(SpellCastResult.BadTargets); } return(SpellCastResult.Success); }