public int CalculateSpellDamage(Unit target, TrinitySpellInfo spellProto, int effectIndex, int basePoints, float variance) { TrinitySpellEffectInfo effect = spellProto.GetEffect(effectIndex); if (variance > 0) { variance = 0.0f; } return(effect != null?effect.CalcValue(this, basePoints, target, variance) : 0); }
private bool CheckEffectTarget(Unit target, TrinitySpellEffectInfo effect, Vector3 losPosition) { // check for ignore LOS on the effect itself /// @todo shit below shouldn't be here, but it's temporary //Check targets for LOS visibility /*if (losPosition) * return target->IsWithinLOS(losPosition->GetPositionX(), losPosition->GetPositionY(), losPosition->GetPositionZ()); * else * { * // Get GO cast coordinates if original caster -> GO * WorldObject* caster = NULL; * if (m_originalCasterGUID.IsGameObject()) * caster = m_caster->GetMap()->GetGameObject(m_originalCasterGUID); * if (!caster) * caster = m_caster; * if (target != m_caster && !target->IsWithinLOSInMap(caster)) * return false; * }*/ return(true); }
private void SelectImplicitAreaTargets(int effIndex, TargetTypes targetType, int effMask) { Unit referer = null; switch (targetType.ReferenceType()) { case TargetReferences.SRC: case TargetReferences.DEST: case TargetReferences.CASTER: referer = Caster; break; case TargetReferences.TARGET: referer = Targets.UnitTarget; break; case TargetReferences.LAST: { for (int i = UniqueTargets.Count - 1; i >= 0; i--) { if ((UniqueTargets[i].EffectMask & (1 << effIndex)) > 0) { referer = ArenaManager.ArenaUnits.Find(unit => unit.Character.Id == UniqueTargets[i].TargetId && unit.IsAlive()); break; } } break; } default: return; } if (referer == null) { return; } Vector3 center = Vector3.zero; switch (targetType.ReferenceType()) { case TargetReferences.SRC: center = Targets.Source; break; case TargetReferences.DEST: center = Targets.Dest; break; case TargetReferences.CASTER: case TargetReferences.TARGET: case TargetReferences.LAST: center = referer.transform.position; break; default: Debug.LogError("SelectImplicitAreaTargets: received not implemented target reference type!"); return; } List <Unit> targets = new List <Unit>(); TrinitySpellEffectInfo effect = GetEffect(effIndex); if (effect == null) { return; } float radius = effect.CalcRadius(Caster, this) * SpellValue.RadiusMod; ArenaManager.SearchAreaTargets(targets, radius, center, referer, targetType.CheckType()); if (targets.Count > 0) { // #TODO: Other special target selection goes here /*if (uint32 maxTargets = m_spellValue->MaxAffectedTargets) * Trinity::Containers::RandomResizeList(targets, maxTargets);*/ foreach (var unit in targets) { AddUnitTarget(unit, effMask, false, true, center); } } }