private void HandleAuraEffects(AuraApplication auraApplication, bool added)
            {
                if (added)
                {
                    for (int i = 0; i < auraApplication.Aura.Effects.Count; i++)
                    {
                        if (auraApplication.EffectsToApply.HasBit(i) && !auraApplication.AppliedEffectMask.HasBit(i))
                        {
                            auraEffectsByAuraType.Insert(auraApplication.Aura.Effects[i].EffectInfo.AuraEffectType, auraApplication.Aura.Effects[i]);
                            tempAuraEffectsToHandle.Add(i);
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < auraApplication.Aura.EffectsInfos.Count; i++)
                    {
                        if (auraApplication.AppliedEffectMask.HasBit(i))
                        {
                            auraEffectsByAuraType.Delete(auraApplication.Aura.Effects[i].EffectInfo.AuraEffectType, auraApplication.Aura.Effects[i]);
                            tempAuraEffectsToHandle.Add(i);
                        }
                    }
                }

                for (int i = 0; i < tempAuraEffectsToHandle.Count; i++)
                {
                    auraApplication.HandleEffect(tempAuraEffectsToHandle[i], added, tempAuraHandleGroups);
                }

                tempAuraEffectsToHandle.Clear();
                tempAuraHandleGroups.Clear();
            }
Esempio n. 2
0
            private void HandleAuraEffects(AuraApplication auraApplication, bool added)
            {
                var auraEffectsToHandle = new List <int>();
                var auraHandleGroups    = new HashSet <AuraEffectHandleGroup>();

                if (added)
                {
                    for (int i = 0; i < auraApplication.Aura.Effects.Count; i++)
                    {
                        if (auraApplication.EffectsToApply.HasBit(i) && !auraApplication.AppliedEffectMask.HasBit(i))
                        {
                            auraEffectsByAuraType.Insert(auraApplication.Aura.Effects[i].EffectInfo.AuraEffectType, auraApplication.Aura.Effects[i]);
                            auraEffectsToHandle.Add(i);
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < auraApplication.Aura.EffectsInfos.Count; i++)
                    {
                        if (auraApplication.AppliedEffectMask.HasBit(i))
                        {
                            auraEffectsByAuraType.Delete(auraApplication.Aura.Effects[i].EffectInfo.AuraEffectType, auraApplication.Aura.Effects[i]);
                            auraEffectsToHandle.Add(i);
                        }
                    }
                }

                for (int i = 0; i < auraEffectsToHandle.Count; i++)
                {
                    auraApplication.HandleEffect(auraEffectsToHandle[i], added, auraHandleGroups);
                }
            }
            void IUnitBehaviour.DoUpdate(int deltaTime)
            {
                if (!NeedUpdate)
                {
                    return;
                }

                NeedUpdate = false;

                for (int i = 0; i < applicationSlots.Length; i++)
                {
                    AuraApplication applicationInSlot = applicationSlots[i];
                    if (applicationInSlot == null)
                    {
                        unitState.VisibleAuras[i].AuraId = 0;
                    }
                    else
                    {
                        unitState.VisibleAuras[i].AuraId       = applicationInSlot.Aura.AuraInfo.Id;
                        unitState.VisibleAuras[i].RefreshFrame = applicationInSlot.Aura.RefreshServerFrame;
                        unitState.VisibleAuras[i].Duration     = applicationInSlot.Aura.RefreshDuration;
                        unitState.VisibleAuras[i].MaxDuration  = applicationInSlot.Aura.MaxDuration;
                    }
                }
            }
            private void RemoveAuraWithApplication(AuraApplication application, AuraRemoveMode mode)
            {
                if (auraApplicationSet.Contains(application))
                {
                    UnapplyAuraApplication(application, mode);

                    if (application.Aura.Owner == unit)
                    {
                        application.Aura.Remove(mode);
                    }
                }
            }
Esempio n. 5
0
        internal void Remove(AuraRemoveMode removeMode = AuraRemoveMode.Default)
        {
            Assert.IsFalse(IsRemoved, $"Aura {AuraInfo.Id} is removed twice!");

            IsRemoved = true;
            Charges   = 0;

            while (applications.Count > 0)
            {
                AuraApplication applicationToRemove = applications[0];
                applicationToRemove.Target.Auras.UnapplyAuraApplication(applicationToRemove, removeMode);
            }

            Owner.Auras.RemoveOwnedAura(this, removeMode);
        }
Esempio n. 6
0
            internal void HandleAuraApplication(AuraApplication auraApplication, bool applied)
            {
                if (auraApplication.Aura.SpellInfo.IsPassive)
                {
                    return;
                }

                if (applied)
                {
                    if (availableSlots.Count == 0)
                    {
                        unslottedApplications.Add(auraApplication);
                    }
                    else
                    {
                        visibleSlotsByApplication[auraApplication] = availableSlots[0];
                        applicationSlots[availableSlots[0]]        = auraApplication;
                        availableSlots.RemoveAt(0);
                    }
                }
                else
                {
                    if (visibleSlotsByApplication.TryGetValue(auraApplication, out int occupiedSlotIndex))
                    {
                        visibleSlotsByApplication.Remove(auraApplication);

                        if (unslottedApplications.Count == 0)
                        {
                            availableSlots.Add(occupiedSlotIndex);
                            applicationSlots[occupiedSlotIndex] = null;
                        }
                        else
                        {
                            applicationSlots[occupiedSlotIndex] = unslottedApplications[0];
                            visibleSlotsByApplication[unslottedApplications[0]] = occupiedSlotIndex;
                            unslottedApplications.RemoveAt(0);
                        }
                    }
                    else
                    {
                        unslottedApplications.Remove(auraApplication);
                    }
                }

                NeedUpdate = true;
            }
        public override void AuraApplicationRemoved(AuraApplication application)
        {
            base.AuraApplicationRemoved(application);

            if (application.Aura.Caster == null)
            {
                return;
            }

            if (application.RemoveMode == AuraRemoveMode.Death || application.RemoveMode == AuraRemoveMode.Expired)
            {
                var explicitTargets = new SpellExplicitTargets {
                    Target = application.Aura.Owner
                };
                var castingOptions = new SpellCastingOptions(explicitTargets, SpellCastFlags.TriggeredByAura);
                application.Aura.Caster.Spells.CastSpell(livingBombExplosion, castingOptions);
            }
        }
            private void HandleStateContainingAura(AuraApplication auraApplication, bool added)
            {
                AuraStateType stateType = auraApplication.Aura.AuraInfo.StateType;

                if (stateType == AuraStateType.None)
                {
                    return;
                }

                if (added)
                {
                    auraApplicationsByAuraState.Insert(stateType, auraApplication);
                    ModifyAuraState(stateType, true);
                }
                else
                {
                    auraApplicationsByAuraState.Delete(stateType, auraApplication);
                    ModifyAuraState(stateType, auraApplicationsByAuraState.ContainsKey(stateType));
                }
            }
            internal void UnapplyAuraApplication(AuraApplication auraApplication, AuraRemoveMode removeMode)
            {
                auraApplicationsByAuraId.Delete(auraApplication.Aura.AuraInfo.Id, auraApplication);
                auraApplications.Remove(auraApplication);
                auraApplicationSet.Remove(auraApplication);

                HandleInterruptableAura(auraApplication, false);
                HandleStateContainingAura(auraApplication, false);
                HandleAuraEffects(auraApplication, false);

                auraApplication.Aura.UnregisterForTarget(unit, auraApplication);
                auraApplication.RemoveMode = removeMode;
                unit.VisibleAuras.HandleAuraApplication(auraApplication, false);

                for (int i = 0; i < auraApplication.Aura.AuraInfo.AuraScriptables.Count; i++)
                {
                    auraApplication.Aura.AuraInfo.AuraScriptables[i].AuraApplicationRemoved(auraApplication);
                }

                Logging.LogAura($"Unapplied application for target: {unit.Name} for aura: {auraApplication.Aura.AuraInfo.name}");
            }
Esempio n. 10
0
            internal void DamageBySpell(SpellDamageInfo damageInfo, Spell spell = null)
            {
                unit.Spells.CalculateSpellDamageTaken(ref damageInfo, spell);

                EventHandler.ExecuteEvent(EventHandler.GlobalDispatcher, GameEvents.ServerDamageDone, damageInfo);

                for (int i = unit.Auras.AuraApplications.Count - 1; i >= 0; i--)
                {
                    AuraApplication application = unit.Auras.AuraApplications[i];

                    for (int j = 0; j < application.Aura.AuraInfo.AuraScriptables.Count; j++)
                    {
                        AuraScriptable auraScriptable = application.Aura.AuraInfo.AuraScriptables[j];
                        if (auraScriptable is IAuraScriptSpellDamageHandler spellDamageHandler)
                        {
                            spellDamageHandler.OnSpellDamageDone(damageInfo);
                        }
                    }
                }

                unit.DealDamage(damageInfo.Target, (int)damageInfo.Damage, damageInfo.SpellDamageType);
            }
            internal void ApplyAuraApplication(AuraApplication auraApplication)
            {
                Logging.LogAura($"Applying application for target: {unit.Name} for aura: {auraApplication.Aura.AuraInfo.name}");

                RemoveNonStackableAuras(auraApplication.Aura);

                auraApplications.Add(auraApplication);
                auraApplicationSet.Add(auraApplication);
                auraApplicationsByAuraId.Insert(auraApplication.Aura.AuraInfo.Id, auraApplication);

                HandleStateContainingAura(auraApplication, true);
                HandleInterruptableAura(auraApplication, true);
                HandleAuraEffects(auraApplication, true);

                auraApplication.Aura.RegisterForTarget(unit, auraApplication);
                unit.VisibleAuras.HandleAuraApplication(auraApplication, true);

                for (int i = 0; i < auraApplication.Aura.AuraInfo.AuraScriptables.Count; i++)
                {
                    auraApplication.Aura.AuraInfo.AuraScriptables[i].AuraApplicationApplied(auraApplication);
                }
            }
            private void HandleInterruptableAura(AuraApplication auraApplication, bool added)
            {
                if (!auraApplication.Aura.AuraInfo.HasInterruptFlags)
                {
                    return;
                }

                if (added)
                {
                    interruptableAuraApplications.Add(auraApplication);
                    auraInterruptFlags |= auraApplication.Aura.AuraInfo.InterruptFlags;
                }
                else
                {
                    interruptableAuraApplications.Remove(auraApplication);

                    auraInterruptFlags = 0;
                    foreach (AuraApplication interruptableAura in interruptableAuraApplications)
                    {
                        auraInterruptFlags |= interruptableAura.Aura.AuraInfo.InterruptFlags;
                    }
                }
            }
Esempio n. 13
0
 internal void UnregisterForTarget(Unit target, AuraApplication auraApplication)
 {
     applications.Remove(auraApplication);
     applicationsByTargetId.Remove(target.Id);
 }
Esempio n. 14
0
 internal void RegisterForTarget(Unit target, AuraApplication auraApplication)
 {
     applications.Add(auraApplication);
     applicationsByTargetId.Add(target.Id, auraApplication);
 }
Esempio n. 15
0
 public virtual void HandleEffect(AuraApplication auraApplication, AuraEffectHandleMode mode, bool apply)
 {
     Logging.LogAura($"Handle aura effect {EffectInfo.name} for target: {auraApplication.Target.Name} in mode {mode}, applying: {apply}");
 }
 public virtual void AuraApplicationRemoved(AuraApplication application)
 {
 }
 public virtual void AuraApplicationApplied(AuraApplication application)
 {
 }