Example #1
0
        private void MaybeThorns(EntityDamagedEventData data)
        {
            if (!CanBeReflected(data.Victim, data.Attacker, data.Damage))
            {
                return;
            }

            var thorns = this.properties.Get(PropertyType.Thorns).Value();

            if (thorns < 1)
            {
                return;
            }

            Timer.Instance.Wait(0.5f, () =>
            {
                data.Attacker.GetComponent <HealthComponent>().Damage(
                    gameObject, new Damage(
                        thorns,
                        DamageType.Piercing,
                        DamageFlags.CantBeCritical | DamageFlags.CantBeBlocked | DamageFlags.CantBeDodged,
                        DamageInfoFlags.Reflected
                        )
                    );
            });
        }
Example #2
0
        private void MaybeReflect(EntityDamagedEventData data)
        {
            if (!CanBeReflected(data.Victim, data.Attacker, data.Damage))
            {
                return;
            }

            var reflection = this.properties.Get(PropertyType.DamageReflection).Value();

            if (reflection < 0.01)
            {
                return;
            }

            var flags = data.Damage.Flags | DamageFlags.CantBeCritical | DamageFlags.CantBeBlocked |
                        DamageFlags.CantBeDodged;

            var reflected = new Damage(
                data.Damage.Amount, data.Damage.Type, data.Damage.WeaponSound, flags, DamageInfoFlags.Reflected);

            if (reflected < 1)
            {
                return;
            }

            Timer.Instance.Wait(0.5f, () =>
            {
                data.Attacker.GetComponent <HealthComponent>()
                .Damage(gameObject, reflected * reflection);
            });
        }
Example #3
0
        private void OnDealDamage(EntityDamagedEventData data)
        {
            if (data.Damage.Amount < 1)
            {
                return;
            }

            Timer.Instance.WaitForFixedUpdate(() =>
            {
                foreach (var behaviour in Behaviours.Where(
                             behaviour => behaviour.Flags.HasFlag(BehaviourFlags.BreaksOnDealDamage)).ToList())
                {
                    RemoveStack(behaviour, behaviour.StackCount);
                }

                if (!data.Damage.Flags.HasFlag(DamageFlags.DOT))
                {
                    foreach (var behaviour in Behaviours.Where(
                                 behaviour => behaviour.Flags.HasFlag(BehaviourFlags.BreaksOnDealDirectDamage)).ToList())
                    {
                        RemoveStack(behaviour, behaviour.StackCount);
                    }
                }
            });
        }
Example #4
0
        private void OnEntityDamaged(EntityDamagedEventData data)
        {
            if (data.Damage.Amount < 1 && Mathf.Approximately(0, data.Damage.Absorbed) || data.Attacker == data.Victim)
            {
                return;
            }

            if (data.Attacker != Target ||
                this.data.DamageFlags != DamageFlags.None &&
                (data.Damage.Flags & this.data.DamageFlags) == 0 ||
                this.data.DamageInfoFlags != DamageInfoFlags.None &&
                (data.Damage.InfoFlags & this.data.DamageInfoFlags) == 0)
            {
                return;
            }

            if ((this.data.ExcludeDamageFlags & data.Damage.Flags) > 0 ||
                (this.data.ExcludeDamageInfoFlags & data.Damage.InfoFlags) > 0)
            {
                return;
            }

            if (this.data.DamageTypes.Count > 0 && !this.data.DamageTypes.Contains(data.Damage.Type))
            {
                return;
            }

            if (!this.Validators.All(v => v.Validate(data.Attacker, data.Victim)))
            {
                return;
            }

            this.effect.Clone().Apply(Caster, EventSubject == BehaviourEventSubject.Me ? Target : data.Victim);
        }
Example #5
0
        private void OnDamaged(EntityDamagedEventData data)
        {
            var movement = GetComponent <MovementComponent>();

            if (movement != null && movement.IsMoving)
            {
                return;
            }

            if (data.Damage.IsBlocked())
            {
                AudioManager.Instance.PlayBlock();
                PlayAnimation("block");
                return;
            }

            if (data.Damage.IsDodged())
            {
                AudioManager.Instance.PlayDodge();
                PlayAnimation("dodge");
                return;
            }

            PlayAnimation("hit");
        }
Example #6
0
        private void OnEntityDamaged(EntityDamagedEventData data)
        {
            if (data.Attacker != gameObject)
            {
                return;
            }

            Restore(ResourceType.Rage, data.Damage.Amount / CalculatePower() * 100);
        }
Example #7
0
        private void OnDamaged(EntityDamagedEventData data)
        {
            if (this.health.HealthFraction >= this.data.Fraction)
            {
                return;
            }

            this.effectRepository.FindOrFail(this.data.EffectId)
            .Apply(Caster, this.data.EventSubject == BehaviourEventSubject.Me ? Target : data.Attacker);
        }
Example #8
0
 private void OnAnyEntityDamaged(EntityDamagedEventData data)
 {
     if (data.Victim == gameObject)
     {
         OnTakeDamage(data);
     }
     else if (data.Attacker == gameObject)
     {
         OnDealDamage(data);
     }
 }
Example #9
0
 private void OnEntityDamaged(EntityDamagedEventData data)
 {
     if (data.Attacker.IsOwnedByPlayer())
     {
         this.damageDealt += data.Damage;
     }
     else
     {
         this.damageTaken += data.Damage;
     }
 }
Example #10
0
        private void OnAnyEntityDamaged(EntityDamagedEventData data)
        {
            if (data.Attacker != Owner || !data.Damage.IsMagic())
            {
                return;
            }

            if (this.Data.DamageType != data.Damage.Type)
            {
                return;
            }

            Experience.Add(1);
        }
Example #11
0
        private void OnAnyEntityDamaged(EntityDamagedEventData data)
        {
            if (data.Attacker != Owner || !data.Damage.IsWeapon())
            {
                return;
            }

            if (WearingItemOfRequiredType().Count == 0)
            {
                return;
            }

            Experience.Add(1);
        }
Example #12
0
        private void OnAnyEntityDamaged(EntityDamagedEventData data)
        {
            var armorSound = data.Victim.GetComponent <UnitComponent>().ArmorSound;

            if (armorSound == ArmorSound.None ||
                data.Damage.WeaponSound == WeaponSound.None ||
                data.Damage.InfoFlags.HasFlag(DamageInfoFlags.Reflected) ||
                data.Damage.InfoFlags.HasFlag(DamageInfoFlags.Cleave))
            {
                return;
            }

            AudioManager.Instance.PlayOneShot($"event:/SFX/Weapon/{data.Damage.WeaponSound}_On_{armorSound}");
        }
Example #13
0
        private void OnEntityDamaged(EntityDamagedEventData data)
        {
            if ((data.Damage < 1 && data.Damage.Absorbed > 0) || data.Attacker != gameObject || data.Attacker == data.Victim ||
                data.Damage.InfoFlags.HasFlag(DamageInfoFlags.Reflected))
            {
                return;
            }

            var vampirism = this.properties.Get(PropertyType.Vampirism).Value();

            if (Math.Abs(vampirism) < 0.01)
            {
                return;
            }

            // Note: Shield Explode deals damage then removes shields, to prevent "overheal"
            // shield removal we need to wait a little bit.
            Timer.Instance.WaitForFixedUpdate(() =>
            {
                this.health.Heal(gameObject, new Healing(data.Damage * vampirism, HealingFlags.Vampirism));
            });
        }
Example #14
0
        private void OnAnyEntityDamaged(EntityDamagedEventData data)
        {
            if (data.Attacker != Target || !data.Damage.Flags.HasFlag(DamageFlags.Melee) || data.Damage.Amount < 1)
            {
                return;
            }

            if (isCleaving)
            {
                return;
            }

            isCleaving = true;

            var cleaveDamage = data.Damage * this.data.Fraction;

            cleaveDamage.Flags     |= DamageFlags.CantBeBlocked;
            cleaveDamage.Flags     |= DamageFlags.CantBeDodged;
            cleaveDamage.InfoFlags |= DamageInfoFlags.Cleave;

            foreach (var cell in this.boardNavigator.WithinCleave(Target.transform.position, data.Victim.transform.position))
            {
                if (!cell.IsOccupied)
                {
                    continue;
                }

                if (cell.OccupiedBy.IsDummy() || cell.OccupiedBy == data.Victim || cell.OccupiedBy.IsAllyOf(Target))
                {
                    continue;
                }

                cell.OccupiedBy.GetComponent <HealthComponent>().Damage(Target, cleaveDamage);
            }

            isCleaving = false;
        }
Example #15
0
        private void OnEntityDamaged(EntityDamagedEventData data)
        {
            if (!Game.Instance.State.IsScenario)
            {
                return;
            }

            if (data.Damage < 1)
            {
                if (data.Damage.Absorbed > 0)
                {
                    Enqueue(data.Victim, I18N.Instance.Get("ui_absorb"), Color.white);
                }
                else if (data.Damage.InfoFlags.HasFlag(DamageInfoFlags.Dodged))
                {
                    Enqueue(data.Victim, I18N.Instance.Get("ui_dodge") + "!\n", Color.white);
                }

                return;
            }

            var text = "";

            if (data.Damage.InfoFlags.HasFlag(DamageInfoFlags.Critical))
            {
                text = I18N.Instance.Get("ui_critical") + "!\n";
            }

            if (data.Damage.InfoFlags.HasFlag(DamageInfoFlags.Blocked))
            {
                text = I18N.Instance.Get("ui_block") + "!\n";
            }

            text += (int)data.Damage;

            Enqueue(data.Victim, text, Color.white);
        }
Example #16
0
        private void OnEntityDamaged(EntityDamagedEventData data)
        {
            var row = $"<color=#888888>[{DateTime.Now.ToLongTimeString()}]</color> " +
                      I18N.Instance.Get("ui_combat_log_damage")
                      .ToString(new object[]
            {
                ColorYellow + data.Attacker.GetComponent <UnitComponent>().Name + EndColor,
                ColorYellow + data.Victim.GetComponent <UnitComponent>().Name + EndColor,
                ColorRed + (int)data.Damage + EndColor,
                data.Damage.Type
            });

            var flags = new List <string>();

            if (data.Damage.IsCritical())
            {
                flags.Add(I18N.Instance.Get("ui_critical"));
            }

            if (data.Damage.IsBlocked())
            {
                flags.Add(I18N.Instance.Get("ui_block"));
            }

            if (data.Damage.IsDodged())
            {
                flags.Add(I18N.Instance.Get("ui_dodge"));
            }

            if (flags.Count > 0)
            {
                row += $" ({string.Join(", ", flags)})";
            }

            AddRow(row);
        }
Example #17
0
 private void OnDamage(EntityDamagedEventData data)
 {
     AdjustFillAmount(false);
 }
Example #18
0
 private void OnAnyEntityDamaged(EntityDamagedEventData data)
 {
     MaybeThorns(data);
     MaybeReflect(data);
 }