コード例 #1
0
ファイル: SwipeMutator.cs プロジェクト: studentutu/Last-Epoch
 public void OnHit(Ability _ability, GameObject target)
 {
     if (firstHit)
     {
         firstHit = false;
         // buffs
         if (increasedDamageOnFirstHit != 0)
         {
             statBuffs.addBuff(4f, Tags.Properties.Damage, 0, increasedDamageOnFirstHit, null, null);
         }
         if (increasedAttackSpeedOnFirstHit != 0)
         {
             statBuffs.addBuff(4f, Tags.Properties.AttackSpeed, 0, increasedAttackSpeedOnFirstHit, null, null, null, "Swipe attack speed");
             statBuffs.addBuff(4f, Tags.Properties.CastSpeed, 0, increasedAttackSpeedOnFirstHit, null, null, null, "Swipe cast speed");
         }
         if (increasedCritChanceOnFirstHit != 0)
         {
             statBuffs.addBuff(4f, Tags.Properties.CriticalChance, 0, increasedCritChanceOnFirstHit, null, null, null, "Swipe crit chance");
         }
         if (addedCritMultiOnFirstHit != 0)
         {
             statBuffs.addBuff(4f, Tags.Properties.CriticalMultiplier, addedCritMultiOnFirstHit, 0, null, null, null, "Swipe crit multi");
         }
         // wolf
         float random = Random.Range(0f, 1f);
         if (!usingAbility)
         {
             usingAbility = GetComponent <UsingAbility>();
         }
         if (random < spiritWolvesOnFirstHitChance)
         {
             usingAbility.UseAbility(AbilityIDList.getAbility(AbilityID.spiritWolves), lastTargetPosition, false, false);
         }
     }
 }
コード例 #2
0
 public void onKill(Ability _ability, GameObject target)
 {
     if (snakeOnKillChance > 0 && (_ability == ability))
     {
         float rand = Random.Range(0f, 1f);
         if (rand < snakeOnKillChance)
         {
             if (!usingAbility)
             {
                 usingAbility = GetComponent <UsingAbility>();
             }
             if (usingAbility)
             {
                 usingAbility.UseAbility(AbilityIDList.getAbility(AbilityID.summonSerpent), target.transform.position, false, false);
             }
         }
     }
     if (lifeOnKill != 0 && (_ability == ability))
     {
         float rand = Random.Range(0f, 1f);
         if (rand < lifeOnKill)
         {
             if (!baseHealth)
             {
                 baseHealth = GetComponent <BaseHealth>();
             }
             if (baseHealth)
             {
                 baseHealth.Heal(lifeOnKill);
             }
         }
     }
 }
コード例 #3
0
 // Use this for initialization
 void Start()
 {
     if (transform.parent)
     {
         usingAbility = transform.parent.GetComponent <UsingAbility>();
         if (usingAbility)
         {
             usingAbility.usedAbilityEvent += die;
         }
     }
 }
コード例 #4
0
 public void OnCrit(Ability _ability, GameObject target)
 {
     if (_ability == Ability.getAbility(AbilityID.erasingStrikeHit) && voidChargeOnCrit)
     {
         if (!ua)
         {
             ua = GetComponent <UsingAbility>();
         }
         ua.UseAbility(Ability.getAbility(AbilityID.voidEssence), transform.position, false, false);
     }
 }
コード例 #5
0
    public void Start()
    {
        CreationReferences references = GetComponent <CreationReferences>();

        if (references && references.creator)
        {
            health = references.creator.GetComponent <BaseHealth>();
            ua     = references.creator.GetComponent <UsingAbility>();
            ua.usedAbilityManaEvent += dealDamage;
        }
    }
コード例 #6
0
    protected override void Awake()
    {
        ability = AbilityIDList.getAbility(AbilityID.entanglingRoots);
        base.Awake();
        AbilityEventListener eventListener = GetComponent <AbilityEventListener>();

        if (eventListener)
        {
            eventListener.onKillEvent += OnKill;
        }
        usingAbility = GetComponent <UsingAbility>();
    }
コード例 #7
0
 public void Start()
 {
     references = GetComponent <CreationReferences>();
     if (references && references.creator)
     {
         usingAbility = references.creator.GetComponent <UsingAbility>();
         if (usingAbility)
         {
             usingAbility.usedAbilityManaEvent += destroyThis;
         }
     }
 }
コード例 #8
0
 public void initialise()
 {
     initialised  = true;
     usingAbility = usingAbilityGo.GetComponent <UsingAbility>();
     if (usingAbility)
     {
         usingAbility.usedAbilityManaEvent += pause;
     }
     if (constantRotation)
     {
         degreesPerSecond = constantRotation.degreesPerSecond;
     }
 }
コード例 #9
0
    // Use this for initialization
    void Start()
    {
        CreationReferences references = GetComponent <CreationReferences>();

        if (references && references.creator)
        {
            usingAbility = references.creator.GetComponent <UsingAbility>();
            if (usingAbility)
            {
                usingAbility.channelEndEvent += DestroyThis;
            }
        }
    }
コード例 #10
0
 public void OnKill(Ability _ability, GameObject target)
 {
     if (_ability && _ability == Ability.getAbility(AbilityID.erasingStrikeHit))
     {
         // void beams
         killsSinceUse++;
         if (killsSinceUse >= 5 && ua && voidBeamsOnkill)
         {
             killsSinceUse = -10000;
             ua.UseAbility(Ability.getAbility(AbilityID.playerVoidBeams), transform.position + transform.forward, false, false);
         }
         // stationary void beam
         if (!ua)
         {
             ua = GetComponent <UsingAbility>();
         }
         if (stationaryVoidBeamChance != 0 && ua)
         {
             if ((Random.Range(0f, 1f) < stationaryVoidBeamChance) && target)
             {
                 ua.UseAbility(Ability.getAbility(AbilityID.stationaryVoidBeam), target.transform.position, false, false);
             }
         }
         // mana and health
         if (mana && manaGainedOnKill != 0)
         {
             mana.currentMana += manaGainedOnKill; if (mana.currentMana > mana.maxMana)
             {
                 mana.currentMana = mana.maxMana;
             }
         }
         if (health && percentLifeGainedOnKill != 0 && target)
         {
             BaseHealth targetHealth = target.GetComponent <BaseHealth>();
             if (targetHealth)
             {
                 health.Heal(targetHealth.maxHealth * percentLifeGainedOnKill);
             }
         }
         // move speed
         if (movementSpeedOnKill != 0)
         {
             TaggedStatsHolder.Stat stat = new TaggedStatsHolder.Stat(Tags.Properties.Movespeed);
             stat.increasedValue = movementSpeedOnKill;
             Buff buff = new Buff(stat, 4f);
             statBuffs.addBuff(buff);
         }
     }
 }
コード例 #11
0
    // Use this for initialization
    protected override void Awake()
    {
        ability = AbilityIDList.getAbility(AbilityID.vengeance);
        base.Awake();
        mana   = GetComponent <BaseMana>();
        health = GetComponent <BaseHealth>();
        AbilityEventListener ael = AbilityEventListener.GetOrAdd(gameObject);

        statBuffs = Comp <StatBuffs> .GetOrAdd(gameObject);

        ua = GetComponent <UsingAbility>();

        ael.onHitEvent += OnHit;
        ael.onHitEvent += OnKill;
    }
コード例 #12
0
    // Use this for initialization
    protected override void Awake()
    {
        ability = AbilityIDList.getAbility(AbilityID.staticOrb);
        base.Awake();
        AbilityEventListener eventListener = GetComponent <AbilityEventListener>();

        if (eventListener)
        {
            eventListener.onKillEvent += OnKill;
            eventListener.onHitEvent  += OnHit;
        }
        protectionClass = GetComponent <ProtectionClass>();
        mana            = GetComponent <BaseMana>();
        usingAbility    = GetComponent <UsingAbility>();
    }
コード例 #13
0
    public void MoveCaster()
    {
        CreationReferences references = GetComponent <CreationReferences>();

        if (references && references.creator)
        {
            PositionRecorder recorder = references.creator.GetComponent <PositionRecorder>();
            if (recorder)
            {
                UsingAbility ua = references.creator.GetComponent <UsingAbility>();
                if (ua)
                {
                    if (ua.getController().currentState == ua.getController().dying)
                    {
                        return;
                    }

                    if (ua.movementFromAbility && ua.movementFromAbility.moving)
                    {
                        ua.movementFromAbility.onReachingDestination();
                    }

                    StateController controller = ua.getController();
                    if (controller)
                    {
                        controller.forceChangeState(controller.waiting);
                    }
                }

                Vector3 newPosition = recorder.getPositionFromDuration(positionAge);
                references.creator.transform.eulerAngles = recorder.getAngleFromDuration(positionAge);
                references.creator.transform.position    = newPosition;

                if (restoreHealth && recorder.health)
                {
                    recorder.health.currentHealth = Mathf.Clamp(recorder.getHealthFromDuration(positionAge + additionalAgeForHealthRestoration), 1f, recorder.health.maxHealth);
                }

                if (restoreMana && recorder.mana)
                {
                    recorder.mana.currentMana = Mathf.Min(recorder.getManaFromDuration(positionAge + additionalAgeForManaRestoration), recorder.mana.maxMana);
                }
            }
        }
    }
コード例 #14
0
ファイル: SwipeMutator.cs プロジェクト: studentutu/Last-Epoch
 public void SummonOnKill(Ability _ability, GameObject target)
 {
     if (clawTotemOnKillChance > 0 && (_ability == ability))
     {
         float rand = Random.Range(0f, 1f);
         if (rand < clawTotemOnKillChance)
         {
             if (!usingAbility)
             {
                 usingAbility = GetComponent <UsingAbility>();
             }
             if (usingAbility)
             {
                 usingAbility.UseAbility(AbilityIDList.getAbility(AbilityID.summonClawTotem), target.transform.position, false, false);
             }
         }
     }
 }
コード例 #15
0
    // Use this for initialization
    protected override void Awake()
    {
        ability = AbilityIDList.getAbility(AbilityID.thornBurst);
        base.Awake();
        ProtectionClass protectionClass = GetComponent <ProtectionClass>();

        if (protectionClass)
        {
            GetComponent <ProtectionClass>().detailedDamageEvent += whenHit;
        }
        ua = GetComponent <UsingAbility>();
        if (ua)
        {
            AbilityEventListener listener = GetComponent <AbilityEventListener>();
            if (listener)
            {
                listener.onKillEvent += OnKill;
                listener.onHitEvent  += OnHit;
            }
        }
    }
コード例 #16
0
 public void parentTookDamage(int damage)
 {
     damageTakenSinceTrigger += damage;
     if (damageTakenSinceTrigger > damageTakenTrigger)
     {
         damageTakenSinceTrigger = damageTakenSinceTrigger % damageTakenTrigger;
         if (damageTakenSinceTrigger >= damageTakenTrigger)
         {
             damageTakenSinceTrigger = damageTakenTrigger - 1;
         }
         Transform target         = parent.GetComponent <TargetFinder>().updateTarget();
         Vector3   targetPosition = transform.forward;
         if (target)
         {
             targetPosition = new Vector3(target.position.x, target.position.y + 1f, target.position.z);
         }
         else
         {
             targetPosition = new Vector3(transform.forward.x, transform.forward.y + 1f, transform.forward.z);
         }
         if (sourceOfAbility == SourceOfAbilityObjectConstructor.This)
         {
             GetComponent <AbilityObjectConstructor>().constructAbilityObject(ability, new Vector3(transform.position.x, transform.position.y + 1f, transform.position.z),
                                                                              targetPosition);
         }
         else
         {
             UsingAbility usingAbility = GetComponentInParent <UsingAbility>();
             if (usingAbility)
             {
                 usingAbility.UseAbility(ability, targetPosition, false, false);
             }
         }
         if (limitRetaliations)
         {
             retaliationsRemaining--;
         }
         retaliated = true;
     }
 }
コード例 #17
0
 public void OnKill(Ability _ability, GameObject target)
 {
     // vengeance
     if (_ability && _ability == ability)
     {
         if (!ua)
         {
             ua = GetComponent <UsingAbility>();
         }
         if (darkBladeOnVengeanceKillChance != 0 && ua)
         {
             if (Random.Range(0f, 1f) < darkBladeOnVengeanceKillChance)
             {
                 ua.UseAbility(Ability.getAbility(AbilityID.darkBlade), target.transform.position + new Vector3(Random.Range(-1f, 1f), 0f, Random.Range(-1f, 1f)), false, false);
             }
         }
         if (voidEssenceOnVengeanceKillChance != 0 && ua)
         {
             if (Random.Range(0f, 1f) < voidEssenceOnVengeanceKillChance)
             {
                 ua.UseAbility(Ability.getAbility(AbilityID.voidEssence), transform.position, false, false);
             }
         }
     }
     // riposte
     if (_ability && _ability == Ability.getAbility(AbilityID.riposteRetaliationHit))
     {
         if (!ua)
         {
             ua = GetComponent <UsingAbility>();
         }
         if (darkBladeOnRiposteKillChance != 0 && ua)
         {
             if (Random.Range(0f, 1f) < darkBladeOnRiposteKillChance)
             {
                 ua.UseAbility(Ability.getAbility(AbilityID.darkBlade), target.transform.position + new Vector3(Random.Range(-1f, 1f), 0f, Random.Range(-1f, 1f)), false, false);
             }
         }
     }
 }
コード例 #18
0
    // Use this for initialization
    void Start()
    {
        abilityObjectConstructor = Comp <AbilityObjectConstructor> .GetOrAdd(gameObject);

        // calculate scaling
        if (scalingProperty != Tags.Properties.None)
        {
            CreationReferences references = GetComponent <CreationReferences>();
            if (references && references.creator)
            {
                BaseStats stats = references.creator.GetComponent <BaseStats>();
                if (stats)
                {
                    float scaler = stats.GetStatValue(scalingProperty);
                    if (scaler != 0)
                    {
                        interval /= scaler;
                    }
                }
            }
        }
        // get creator components if necessery
        if (castFromCreatorCastPoint || castAtCreatorTargetLocation)
        {
            CreationReferences references = GetComponent <CreationReferences>();
            if (references && references.creator)
            {
                if (castFromCreatorCastPoint)
                {
                    creatorSizeManager = references.creator.GetComponent <SizeManager>();
                }

                if (castAtCreatorTargetLocation)
                {
                    creatorUsingAbility = references.creator.GetComponent <UsingAbility>();
                }
            }
        }
    }
コード例 #19
0
    public void Start()
    {
        CreationReferences references = GetComponent <CreationReferences>();

        if (references && references.creator)
        {
            SummonTracker summonTracker = references.creator.GetComponent <SummonTracker>();
            if (summonTracker)
            {
                List <Summoned> minionsToUse   = new List <Summoned>();
                List <Summoned> creatorMinions = summonTracker.summons;
                if (creatorMinions.Count > 0)
                {
                    // select minions
                    if (minionsToUseAbility == MinionUseType.Nearest)
                    {
                        Summoned selected         = creatorMinions[0];
                        float    selectedDistance = Vector3.Distance(transform.position, creatorMinions[0].transform.position);
                        float    distance         = 0;
                        foreach (Summoned minion in creatorMinions)
                        {
                            distance = Vector3.Distance(transform.position, minion.transform.position);
                            if (distance < selectedDistance && (!requiresCanUseMovementAbilities || minion.GetComponent <CanUseMovementAbilities>()))
                            {
                                selectedDistance = distance;
                                selected         = minion;
                            }
                        }
                        if (!requiresCanUseMovementAbilities || selected.GetComponent <CanUseMovementAbilities>())
                        {
                            minionsToUse.Add(selected);
                        }
                    }
                    else if (minionsToUseAbility == MinionUseType.Random)
                    {
                        int      attempts = 0;
                        Summoned selected = null;
                        while (attempts < 20)
                        {
                            selected = creatorMinions[Random.Range(0, creatorMinions.Count)];
                            if (!requiresCanUseMovementAbilities || selected.GetComponent <CanUseMovementAbilities>())
                            {
                                attempts = 100000;
                                minionsToUse.Add(selected);
                            }
                        }
                    }
                    else if (minionsToUseAbility == MinionUseType.All)
                    {
                        if (!requiresCanUseMovementAbilities)
                        {
                            minionsToUse.AddRange(creatorMinions);
                        }
                        else
                        {
                            foreach (Summoned minion in creatorMinions)
                            {
                                if (minion.GetComponent <CanUseMovementAbilities>())
                                {
                                    minionsToUse.Add(minion);
                                }
                            }
                        }
                    }
                    // make the minions use the ability
                    Vector3      targetPostion = GetComponent <LocationDetector>().targetLocation;
                    UsingAbility ua            = null;
                    foreach (Summoned minion in minionsToUse)
                    {
                        ua = minion.GetComponent <UsingAbility>();
                        if (ua)
                        {
                            ua.UseAbility(ability, targetPostion, false, false);
                            ua.transform.LookAt(targetPostion);
                        }
                    }
                }
            }
        }
    }
コード例 #20
0
 // Use this for initialization
 void Start()
 {
     usingAbility = GetComponent <UsingAbility>();
 }
コード例 #21
0
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // check if the explosion needs to be removed
        if (removeExplosion)
        {
            CreateAbilityObjectOnDeath[] components = abilityObject.GetComponents <CreateAbilityObjectOnDeath>();
            for (int i = 0; i < components.Length; i++)
            {
                if (components[i].abilityToInstantiate == AbilityIDList.getAbility(AbilityID.lightningExplosion))
                {
                    Destroy(components[i]);
                    components[i].deactivate();
                }
            }
        }
        // explosion only stuff
        else
        {
            if (increasedExplosionDamage != 0 || explosionChanceToShock != 0)
            {
                LightningExplosionMutator mut = abilityObject.AddComponent <LightningExplosionMutator>();
                mut.increasedDamage = increasedExplosionDamage;
                mut.chanceToShock   = explosionChanceToShock;
            }

            if (explodesAtTarget)
            {
                abilityObject.GetComponent <DestroyAfterDuration>().duration = 1.5f;
                if (!abilityObject.GetComponent <LocationDetector>())
                {
                    abilityObject.AddComponent <LocationDetector>();
                }
                DestroyAfterDurationAfterReachingTargetLocation component = abilityObject.AddComponent <DestroyAfterDurationAfterReachingTargetLocation>();
                component.duration = 0f;
            }

            if (chargedGroundAtEndChance > 0)
            {
                float rand = Random.Range(0f, 1f);
                if (rand < chargedGroundAtEndChance)
                {
                    CreateAbilityObjectOnDeath component = abilityObject.AddComponent <CreateAbilityObjectOnDeath>();
                    component.abilityToInstantiate = AbilityIDList.getAbility(AbilityID.chargedGround);
                }
            }
        }

        if (chanceToAttachSparkCharge > 0)
        {
            ChanceToCreateAbilityObjectOnNewEnemyHit newComponent = abilityObject.AddComponent <ChanceToCreateAbilityObjectOnNewEnemyHit>();
            newComponent.spawnAtHit           = true;
            newComponent.chance               = chanceToAttachSparkCharge;
            newComponent.abilityToInstantiate = AbilityIDList.getAbility(AbilityID.sparkCharge);
        }

        if (increasedProjectileDamage != 0)
        {
            foreach (DamageStatsHolder holder in abilityObject.GetComponents <DamageStatsHolder>())
            {
                holder.increaseAllDamage(increasedProjectileDamage);
            }
        }

        if (removePull)
        {
            PullComponent[] pullComponents = abilityObject.GetComponents <PullComponent>();
            for (int i = 0; i < pullComponents.Length; i++)
            {
                Destroy(pullComponents[i]);
            }
        }

        if (shockChance > 0)
        {
            ChanceToApplyStatusOnEnemyHit chanceTo = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>();
            chanceTo.chance       = shockChance;
            chanceTo.statusEffect = StatusEffectList.getEffect(StatusEffectID.Shock);
        }

        if (increasedSpeed > 0)
        {
            AbilityMover mover = abilityObject.GetComponent <AbilityMover>();
            if (mover)
            {
                mover.speed *= (1 + increasedSpeed);
            }
        }

        if (!usingAbility)
        {
            usingAbility = GetComponent <UsingAbility>();
        }

        // casting stuff
        if (lightningAegisChance > 0 && usingAbility)
        {
            if (lightningAegisChance >= Random.Range(0f, 1f))
            {
                usingAbility.UseAbility(AbilityIDList.getAbility(AbilityID.lightningAegis), transform.position, false, false);
            }
        }

        if (knockBackOnCastChance > 0 && usingAbility)
        {
            if (knockBackOnCastChance >= Random.Range(0f, 1f))
            {
                usingAbility.UseAbility(AbilityIDList.getAbility(AbilityID.knockBack), transform.position, false, false);
            }
        }


        return(abilityObject);
    }
コード例 #22
0
 public void OnHit(Ability _ability, GameObject target)
 {
     // vengeance
     if (_ability && _ability == ability)
     {
         if (reducedDamageTakenOnHit != 0)
         {
             TaggedStatsHolder.Stat newStat = new TaggedStatsHolder.Stat(Tags.Properties.DamageTaken);
             newStat.increasedValue = -reducedDamageTakenOnHit;
             Buff buff = new Buff(newStat, 2f);
             statBuffs.addBuff(buff);
         }
         if (darkBladeOnVengeanceHitChance != 0)
         {
             if (!ua)
             {
                 ua = GetComponent <UsingAbility>();
             }
             if (Random.Range(0f, 1f) < darkBladeOnVengeanceHitChance && ua)
             {
                 if (target)
                 {
                     ua.UseAbility(Ability.getAbility(AbilityID.darkBlade), target.transform.position, false, false);
                 }
                 else
                 {
                     ua.UseAbility(Ability.getAbility(AbilityID.darkBlade), target.transform.position + new Vector3(Random.Range(-1f, 1f), 0f, Random.Range(-1f, 1f)), false, false);
                 }
             }
         }
     }
     // riposte
     if (_ability && _ability == Ability.getAbility(AbilityID.riposteRetaliationHit))
     {
         if (!ua)
         {
             ua = GetComponent <UsingAbility>();
         }
         if (voidEssenceOnRiposteHitChance != 0 && ua)
         {
             if (Random.Range(0f, 1f) < voidEssenceOnRiposteHitChance)
             {
                 if (target)
                 {
                     ua.UseAbility(Ability.getAbility(AbilityID.voidEssence), target.transform.position, false, false);
                 }
                 else
                 {
                     ua.UseAbility(Ability.getAbility(AbilityID.voidEssence), transform.position, false, false);
                 }
             }
         }
         if (darkBladeOnRiposteHitChance != 0)
         {
             if (Random.Range(0f, 1f) < darkBladeOnRiposteHitChance && ua)
             {
                 if (target)
                 {
                     ua.UseAbility(Ability.getAbility(AbilityID.darkBlade), target.transform.position, false, false);
                 }
                 else
                 {
                     ua.UseAbility(Ability.getAbility(AbilityID.darkBlade), target.transform.position + new Vector3(Random.Range(-1f, 1f), 0f, Random.Range(-1f, 1f)), false, false);
                 }
             }
         }
     }
 }
コード例 #23
0
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        if (chanceToBleed > 0)
        {
            ChanceToApplyStatusOnEnemyHit chanceTo = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>();
            chanceTo.chance       = chanceToBleed;
            chanceTo.statusEffect = StatusEffectList.getEffect(StatusEffectID.Bleed);
        }

        if (chanceToPlague > 0)
        {
            ChanceToApplyStatusOnEnemyHit chanceTo = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>();
            chanceTo.chance       = chanceToPlague;
            chanceTo.statusEffect = StatusEffectList.getEffect(StatusEffectID.Plague);
        }

        if (chanceToBlindingPoison > 0)
        {
            ChanceToApplyStatusOnEnemyHit chanceTo = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>();
            chanceTo.chance       = chanceToBlindingPoison;
            chanceTo.statusEffect = StatusEffectList.getEffect(StatusEffectID.BlindingPoison);
        }

        if (chanceToShredArmour > 0)
        {
            ChanceToApplyStatusOnEnemyHit chanceTo = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>();
            chanceTo.chance       = chanceToShredArmour;
            chanceTo.statusEffect = StatusEffectList.getEffect(StatusEffectID.ArmourShred);
        }

        if (poisonSpitChance > 0)
        {
            float rand = Random.Range(0f, 1f);
            if (rand < poisonSpitChance)
            {
                if (!usingAbility)
                {
                    usingAbility = GetComponent <UsingAbility>();
                }
                if (usingAbility)
                {
                    usingAbility.UseAbility(AbilityIDList.getAbility(AbilityID.poisonSpit), targetLocation + new Vector3(0, -1.1f, 0), false, false);
                }
            }
        }

        if (increasedHitDamage != 0)
        {
            foreach (DamageStatsHolder holder in abilityObject.GetComponents <DamageStatsHolder>())
            {
                holder.increaseAllDamage(increasedHitDamage);
                //holder.addBaseDamage(DamageType.PHYSICAL, holder.getBaseDamage(DamageType.PHYSICAL) * increasedDamage);
            }
        }

        if (addedCritChance != 0)
        {
            foreach (DamageStatsHolder damage in abilityObject.GetComponents <DamageStatsHolder>())
            {
                damage.baseDamageStats.critChance += addedCritChance;
            }
        }

        if (cullPercent > 0)
        {
            foreach (DamageStatsHolder damage in abilityObject.GetComponents <DamageStatsHolder>())
            {
                damage.baseDamageStats.cullPercent += cullPercent;
            }
        }

        if (moreDamageAgainstBlinded != 0)
        {
            // create the conditional
            DamageConditionalEffect    conditionalEffect = new DamageConditionalEffect();
            HasStatusEffectConditional conditional       = new HasStatusEffectConditional();
            conditional.statusEffect      = StatusEffectID.Blind;
            conditionalEffect.conditional = conditional;
            conditionalEffect.effect      = new DamageEffectMoreDamage(moreDamageAgainstBlinded);
            // add the conditional to all damage stats holders
            foreach (DamageStatsHolder holder in abilityObject.GetComponents <DamageStatsHolder>())
            {
                holder.baseDamageStats.conditionalEffects.Add(conditionalEffect);
            }
        }

        if (moreDamageAgainstPoisonBlinded != 0)
        {
            // create the conditional
            DamageConditionalEffect    conditionalEffect = new DamageConditionalEffect();
            HasStatusEffectConditional conditional       = new HasStatusEffectConditional();
            conditional.statusEffect      = StatusEffectID.BlindingPoison;
            conditionalEffect.conditional = conditional;
            conditionalEffect.effect      = new DamageEffectMoreDamage(moreDamageAgainstPoisonBlinded);
            // add the conditional to all damage stats holders
            foreach (DamageStatsHolder holder in abilityObject.GetComponents <DamageStatsHolder>())
            {
                holder.baseDamageStats.conditionalEffects.Add(conditionalEffect);
            }
        }

        if (dodgeRatingOnAttack != 0 || poisonDamageOnAttack != 0 || dotDamageOnAttack != 0)
        {
            StatBuffs statBuffs = GetComponent <StatBuffs>();
            if (statBuffs == null)
            {
                statBuffs = gameObject.AddComponent <StatBuffs>();
            }
            if (dodgeRatingOnAttack != 0)
            {
                statBuffs.addBuff(4f, Tags.Properties.DodgeRating, dodgeRatingOnAttack, 0, null, null);
            }
            if (poisonDamageOnAttack != 0)
            {
                List <Tags.AbilityTags> tagList = new List <Tags.AbilityTags>();
                tagList.Add(Tags.AbilityTags.Poison);
                statBuffs.addBuff(4f, Tags.Properties.Damage, 0, poisonDamageOnAttack, null, null, tagList);
            }
            if (dotDamageOnAttack != 0)
            {
                List <Tags.AbilityTags> tagList = new List <Tags.AbilityTags>();
                tagList.Add(Tags.AbilityTags.DoT);
                statBuffs.addBuff(4f, Tags.Properties.Damage, 0, dotDamageOnAttack, null, null, tagList);
            }
        }


        return(abilityObject);
    }