Пример #1
0
        public AttackResult DoDamage(Character attacker, IDamageable target, Vector2 worldPosition, float deltaTime, bool playSound = true)
        {
            Character targetCharacter = target as Character;

            if (OnlyHumans)
            {
                if (targetCharacter != null && !targetCharacter.IsHuman)
                {
                    return(new AttackResult());
                }
            }

            SetUser(attacker);

            DamageParticles(deltaTime, worldPosition);

            var attackResult = target.AddDamage(attacker, worldPosition, this, deltaTime, playSound);
            var effectType   = attackResult.Damage > 0.0f ? ActionType.OnUse : ActionType.OnFailure;

            if (targetCharacter != null && targetCharacter.IsDead)
            {
                effectType = ActionType.OnEating;
            }

            foreach (StatusEffect effect in statusEffects)
            {
                // TODO: do we want to apply the effect at the world position or the entity positions in each cases? -> go through also other cases where status effects are applied
                if (effect.HasTargetType(StatusEffect.TargetType.This))
                {
                    effect.Apply(effectType, deltaTime, attacker, attacker, worldPosition);
                }
                if (targetCharacter != null)
                {
                    if (effect.HasTargetType(StatusEffect.TargetType.Character))
                    {
                        effect.Apply(effectType, deltaTime, targetCharacter, targetCharacter);
                    }
                    if (effect.HasTargetType(StatusEffect.TargetType.Limb))
                    {
                        effect.Apply(effectType, deltaTime, targetCharacter, attackResult.HitLimb);
                    }
                    if (effect.HasTargetType(StatusEffect.TargetType.AllLimbs))
                    {
                        effect.Apply(effectType, deltaTime, targetCharacter, targetCharacter.AnimController.Limbs.Cast <ISerializableEntity>().ToList());
                    }
                }
                if (target is Entity entity)
                {
                    if (effect.HasTargetType(StatusEffect.TargetType.NearbyItems) ||
                        effect.HasTargetType(StatusEffect.TargetType.NearbyCharacters))
                    {
                        var targets = new List <ISerializableEntity>();
                        effect.GetNearbyTargets(worldPosition, targets);
                        effect.Apply(ActionType.OnActive, deltaTime, entity, targets);
                    }
                }
            }

            return(attackResult);
        }
Пример #2
0
        public AttackResult DoDamage(Character attacker, IDamageable target, Vector2 worldPosition, float deltaTime, bool playSound = true)
        {
            if (OnlyHumans)
            {
                Character character = target as Character;
                if (character != null && character.ConfigPath != Character.HumanConfigFile)
                {
                    return(new AttackResult());
                }
            }

            DamageParticles(deltaTime, worldPosition);

            var attackResult = target.AddDamage(attacker, worldPosition, this, deltaTime, playSound);
            var effectType   = attackResult.Damage > 0.0f ? ActionType.OnUse : ActionType.OnFailure;

            if (statusEffects == null)
            {
                return(attackResult);
            }

            foreach (StatusEffect effect in statusEffects)
            {
                if (effect.Targets.HasFlag(StatusEffect.TargetType.This))
                {
                    effect.Apply(effectType, deltaTime, attacker, attacker);
                }
                if (effect.Targets.HasFlag(StatusEffect.TargetType.Character) && target is Character)
                {
                    effect.Apply(effectType, deltaTime, (Character)target, (Character)target);
                }
            }

            return(attackResult);
        }
Пример #3
0
        public AttackResult DoDamage(IDamageable attacker, IDamageable target, Vector2 worldPosition, float deltaTime, bool playSound = true)
        {
            if (particleEmitterPrefab != null)
            {
                particleEmitterPrefab.Emit(worldPosition);
            }

            if (sound != null)
            {
                sound.Play(1.0f, 500.0f, worldPosition);
            }

            var attackResult = target.AddDamage(attacker, worldPosition, this, deltaTime, playSound);

            var effectType = attackResult.Damage > 0.0f ? ActionType.OnUse : ActionType.OnFailure;

            foreach (StatusEffect effect in statusEffects)
            {
                if (effect.Targets.HasFlag(StatusEffect.TargetType.This) && attacker is Character)
                {
                    effect.Apply(effectType, deltaTime, (Character)attacker, (Character)attacker);
                }
                if (effect.Targets.HasFlag(StatusEffect.TargetType.Character) && target is Character)
                {
                    effect.Apply(effectType, deltaTime, (Character)target, (Character)target);
                }
            }

            return(attackResult);
        }
    private void OnTriggerEnter(Collider collider)
    {
        if (!setuped)
        {
            return;
        }

        if (collider.transform.IsChildOf(launcher.transform) || collider.gameObject.layer == LayerMask.NameToLayer("FirstPass"))
        {
            return; // Don't collide with launcher or player arms
        }
        if (collider.gameObject.GetComponent <MagicProjectile>())
        {
            return; // Don't collide with other projectiles
        }
        IDamageable target = collider.gameObject.GetComponent <IDamageable>();

        if (target != null)
        {
            if (target.WillKill(Damage))
            {
                if (OnKill != null)
                {
                    OnKill(target);
                }
            }

            target.AddDamage(Damage);
        }

        AudioManager.PlaySfx(hitClip, transform.position);

        Destroy(gameObject);
    }
Пример #5
0
    private void OnLevelUpCallback(object sender, EventArgs args)
    {
        IDamageable dmg = GetComponent <IDamageable>();

        dmg.AddDamage(-dmg.Damage);

        Debug.Log("Congratulations ! You reached level " + currentLevel + " !");
        Debug.Log("You have " + unspentPoints + " attributes point(s) to spend.");
    }
Пример #6
0
 private void TryDoFreeze(IDamageable <float> healthManager, IFreezeable ifreeze, IInvulnerable iInvulnerable)
 {
     if (!iInvulnerable.InvFreeze)
     {
         healthManager.AddDamage(damage); ifreeze.FreezeMe();
     }
     else
     {
         rejected = true;
     }
 }
Пример #7
0
    public void Hit(IDamageable damageable)
    {
        float damages = Random.Range(minDamages, maxDamages);

        if (damageable is HealthManager && (damageable as HealthManager).MaxHealth > damageable.Damage && damageable.WillKill(damages))
        {
            weapon.ProjectileOnKillCallback(this, damageable, damages);
        }
        else
        {
            weapon.ProjectileHitCallback(this, damageable, damages);
        }

        damageable.AddDamage(damages);
    }
Пример #8
0
        public AttackResult DoDamage(Character attacker, IDamageable target, Vector2 worldPosition, float deltaTime, bool playSound = true)
        {
            Character targetCharacter = target as Character;

            if (OnlyHumans)
            {
                if (targetCharacter != null && targetCharacter.ConfigPath != Character.HumanConfigFile)
                {
                    return(new AttackResult());
                }
            }

            SetUser(attacker);

            DamageParticles(deltaTime, worldPosition);

            var attackResult = target.AddDamage(attacker, worldPosition, this, deltaTime, playSound);
            var effectType   = attackResult.Damage > 0.0f ? ActionType.OnUse : ActionType.OnFailure;

            if (targetCharacter != null && targetCharacter.IsDead)
            {
                effectType = ActionType.OnEating;
            }
            if (statusEffects == null)
            {
                return(attackResult);
            }

            foreach (StatusEffect effect in statusEffects)
            {
                if (effect.HasTargetType(StatusEffect.TargetType.This))
                {
                    effect.Apply(effectType, deltaTime, attacker, attacker);
                }
                if (target is Character)
                {
                    if (effect.HasTargetType(StatusEffect.TargetType.Character))
                    {
                        effect.Apply(effectType, deltaTime, (Character)target, (Character)target);
                    }
                    if (effect.HasTargetType(StatusEffect.TargetType.Limb))
                    {
                        effect.Apply(effectType, deltaTime, (Character)target, attackResult.HitLimb);
                    }
                    if (effect.HasTargetType(StatusEffect.TargetType.AllLimbs))
                    {
                        effect.Apply(effectType, deltaTime, (Character)target, ((Character)target).AnimController.Limbs.Cast <ISerializableEntity>().ToList());
                    }
                }
                if (target is Entity entity)
                {
                    if (effect.HasTargetType(StatusEffect.TargetType.NearbyItems) ||
                        effect.HasTargetType(StatusEffect.TargetType.NearbyCharacters))
                    {
                        var targets = new List <ISerializableEntity>();
                        effect.GetNearbyTargets(worldPosition, targets);
                        effect.Apply(ActionType.OnActive, deltaTime, entity, targets);
                    }
                }
            }

            return(attackResult);
        }
Пример #9
0
    private void TryRegisterHit(RaycastHit hit, IDamageable damageable)
    {
        if (stManager == null)
        {
            if ((damageable as Behaviour).gameObject.tag == transform.root.tag)
            {
                return;
            }
        }
        else
        {
            if ((damageable as Behaviour).gameObject.tag == stManager.tag)
            {
                return;
            }
        }

        if ((damageable = hit.collider.GetComponentInParent <IDamageable>()) != null && (damageable as Behaviour).enabled)
        {
            if (!hits.Exists(x => x == damageable))
            {
                float damages = 0.0f;
                if (stManager != null)
                {
                    damages = UnityEngine.Random.Range(minDamages, maxDamages) + (0.4f * stManager.Stats.Strength);
                }
                else
                {
                    damages = UnityEngine.Random.Range(minDamages, maxDamages);
                }

                if (OnHit != null)
                {
                    OnHit(this, new OnHitArgs(damageable, damages));
                }

                if (stManager != null)
                {
                    if (damageable.WillKill(damages, stManager))
                    {
                        if (OnKill != null)
                        {
                            OnKill(this, new OnKillArgs(damageable));
                        }
                    }
                }
                else
                {
                    if (damageable.WillKill(damages))
                    {
                        if (OnKill != null)
                        {
                            OnKill(this, new OnKillArgs(damageable));
                        }
                    }
                }

                if (stManager != null)
                {
                    damageable.AddDamage(damages, stManager);
                }
                else
                {
                    damageable.AddDamage(damages);
                }

                hits.Add(damageable);

                if (hitEffectPrefab != null)
                {
                    GameObject.Destroy(GameObject.Instantiate(hitEffectPrefab, hit.point, Quaternion.identity), 5.0f);
                }
            }
        }
    }
Пример #10
0
 public void Attack(int damage)
 {
     target.AddDamage(damage);
 }