internal void EffectDispelMechanic(EffectDispelMechanic effect, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitFinal || target == null) { return; } var aurasToDispel = new List <Aura>(); IReadOnlyList <Aura> ownedAuras = target.Auras.OwnedAuras; for (int i = 0; i < ownedAuras.Count; i++) { if (ownedAuras[i].AuraInfo.HasAnyMechanics(effect.MechanicToDispel)) { aurasToDispel.Add(ownedAuras[i]); } } foreach (Aura aura in aurasToDispel) { if (!aura.IsRemoved) { aura.Remove(AuraRemoveMode.Spell); } } }
internal void EffectKill(EffectKill effect, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitFinal || target == null || !target.IsAlive) { return; } Caster.Kill(target); }
internal void EffectAddPower(EffectAddPower effect, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitStart || target == null || !target.IsAlive) { return; } target.Attributes.ModifyPower(effect.PowerType, (int)effect.Value); }
internal void EffectTriggerSpell(EffectTriggerSpell effect, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitFinal || target == null) { return; } Caster.Spells.TriggerSpell(effect.TriggerSpell, target, effect.ExtraCastFlags); }
internal void EffectAddComboPoints(EffectAddComboPoints effect, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitFinal) { return; } target.ModifyComboPoints(effect.ComboPoints); }
internal void EffectResurrect(EffectResurrect effect, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitFinal || target == null || target.IsAlive) { return; } Caster.DealHeal(target, target.MaxHealth.CalculatePercentage(effect.HealthPercent)); target.ModifyDeathState(DeathState.Alive); }
internal void EffectApplyAura(EffectApplyAura effect, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitFinal || target == null || OriginalCaster == null) { return; } if (target.IsDead && !effect.AuraInfo.HasAttribute(AuraAttributes.DeathPersistent)) { return; } target.Auras.RefreshOrCreateAura(effect.AuraInfo, SpellInfo, OriginalCaster, this); }
public void HandleEffects(Unit unitTarget, int i, SpellEffectHandleMode mode) { EffectHandleMode = mode; UnitTarget = unitTarget; EffectInfo = GetEffect(i); if (EffectInfo == null) { Debug.LogErrorFormat("Spell: {0} HandleEffects at EffectIndex: {1} missing effect", SpellInfo.Id, i); return; } Debug.LogFormat("Spell: {0} Effect: {1}", SpellInfo.Id, EffectInfo.Effect); Damage += CalculateDamage(i, UnitTarget, Variance); ExecuteEffect(EffectInfo.Effect, i); }
internal void EffectHeal(EffectHeal effect, int effectIndex, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitStart || !target.IsAlive) { return; } float spellHealAmount = effect.CalculateSpellHeal(SpellInfo, effectIndex, Caster, target); for (var i = 0; i < effect.ConditionalModifiers.Count; i++) { ConditionalModifier modifier = effect.ConditionalModifiers[i]; if (modifier.Condition.With(Caster, target, this).IsApplicableAndValid) { modifier.Modify(ref spellHealAmount); } } EffectHealing += (int)spellHealAmount; }
internal void EffectChargeTarget(EffectChargeTarget effect, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitFinal || target == null || OriginalCaster == null) { return; } Vector3 chargePoint; switch (SpellInfo.ExplicitTargetType) { case SpellExplicitTargetType.Target when ExplicitTargets.Target != null: chargePoint = ExplicitTargets.Target.Position; break; case SpellExplicitTargetType.Destination when ExplicitTargets.Destination.HasValue: chargePoint = ExplicitTargets.Destination.Value; break; default: Assert.Fail($"Unexpected explicit targeting for charging: {SpellInfo.ExplicitTargetType} in spell: {SpellInfo.name}"); return; } switch (effect.ChargeKind) { case Core.EffectChargeTarget.Kind.Charge: Caster.Motion.StartChargingMovement(chargePoint, effect.ChargeSpeed); break; case Core.EffectChargeTarget.Kind.Pounce: Caster.Motion.StartPounceMovement(chargePoint, effect.ChargeSpeed); break; default: throw new ArgumentOutOfRangeException(); } }
internal void EffectSchoolDamage(EffectSchoolDamage effect, int effectIndex, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitStart || target == null || !target.IsAlive) { return; } float spellDamage = effect.CalculateSpellDamage(SpellInfo, effectIndex, Caster, target); if (SpellInfo.HasAttribute(SpellCustomAttributes.ShareDamage)) { spellDamage /= Mathf.Min(1, ImplicitTargets.TargetCountForEffect(effectIndex)); } for (var i = 0; i < effect.ConditionalModifiers.Count; i++) { ConditionalModifier modifier = effect.ConditionalModifiers[i]; if (modifier.Condition.With(Caster, target, this).IsApplicableAndValid) { modifier.Modify(ref spellDamage); } } EffectDamage += (int)spellDamage; }
internal override void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode) { spell.EffectApplyAura(this, target, mode); }
internal void EffectApplyAuraOverride(EffectApplyAuraDurationOverride effect, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitFinal || target == null || OriginalCaster == null) { return; } if (target.IsDead && !effect.AuraInfo.HasAttribute(AuraAttributes.DeathPersistent)) { return; } int overrideDuration = effect.BaseDuraiton + ConsumedComboPoints * effect.DurationPerCombo; target.Auras.RefreshOrCreateAura(effect.AuraInfo, SpellInfo, OriginalCaster, this, overrideDuration); }
internal override void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode) { spell.EffectDispelMechanic(this, target, mode); }
internal abstract void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode);
internal void EffectTeleportDirect(EffectTeleportDirect effect, int effectIndex, Unit target, SpellEffectHandleMode mode) { if (mode != SpellEffectHandleMode.HitFinal) { return; } if (target == null || !target.IsAlive) { return; } float topCheck = Math.Abs(target.UnitCollider.bounds.max.y); float safeExtentsY = Math.Abs(target.UnitCollider.bounds.extents.y); float safeExtentsX = Math.Abs(target.UnitCollider.bounds.extents.x); float distance = effect.HorizontalDistance; Vector3 targetTop = target.UnitCollider.bounds.center + Vector3.up * topCheck; Vector3 targetPosition; Drawing.DrawLine(target.UnitCollider.bounds.center, target.UnitCollider.bounds.center + Vector3.up * topCheck, Color.red, 3f); if (Physics.Raycast(target.UnitCollider.bounds.center, Vector3.up, out RaycastHit hitInfo, topCheck, PhysicsReference.Mask.Ground)) { targetPosition = hitInfo.point - Vector3.up * safeExtentsY; }
internal override void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode) { spell.EffectTeleportDirect(this, effectIndex, target, mode); }
internal override void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode) { spell.EffectAddComboPoints(this, target, mode); }
internal override void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode) { spell.EffectSchoolDamage(this, effectIndex, target, mode); }