private void GenericGameEvents_OnHitEnemy(DamageInfo damageInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo attackerInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo victimInfo)
 {
     if (!damageInfo.rejected && damageInfo.procCoefficient > 0f && damageInfo.crit && attackerInfo.body && attackerInfo.body.equipmentSlot && attackerInfo.body.equipmentSlot.equipmentIndex == equipmentDef.equipmentIndex && attackerInfo.body.equipmentSlot.cooldownTimer > 0f)
     {
         attackerInfo.body.AddBuff(MysticsItemsContent.Buffs.MysticsItems_MechanicalArmCharge);
     }
 }
 private void GenericGameEvents_BeforeTakeDamage(DamageInfo damageInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo attackerInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo victimInfo)
 {
     if (attackerInfo.inventory && attackerInfo.inventory.GetItemCount(itemDef) > 0)
     {
         if (damageInfo.damageColorIndex == DamageColorIndex.Default)
         {
             damageInfo.damageColorIndex = damageColorIndex;
         }
     }
 }
Example #3
0
        private void GenericGameEvents_OnHitEnemy(DamageInfo damageInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo attackerInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo victimInfo)
        {
            if (!damageInfo.procChainMask.HasProc(ProcType.ChainLightning) && !damageInfo.rejected && attackerInfo.body && attackerInfo.inventory && victimInfo.body)
            {
                var component = victimInfo.body.GetComponent <MysticsItemsDeathCeremonyMark>();
                if (component)
                {
                    var itemCount = attackerInfo.inventory.GetItemCount(itemDef);
                    if (itemCount > 0 && damageInfo.procCoefficient > 0f && damageInfo.crit)
                    {
                        component.markTimer = duration;
                    }
                    foreach (var body in MysticsItemsDeathCeremonyMark.GetMarkedBodiesForTeam(victimInfo.teamIndex))
                    {
                        if (body != victimInfo.body && body.healthComponent && body.healthComponent.alive)
                        {
                            EffectData effectData = new EffectData
                            {
                                origin       = victimInfo.body.corePosition,
                                genericFloat = 0.2f
                            };
                            effectData.SetHurtBoxReference(body.gameObject);
                            EffectManager.SpawnEffect(damageShareOrbEffect, effectData, true);

                            DamageInfo markDamageInfo = new DamageInfo();
                            markDamageInfo.damage          = damageInfo.damage * Util.ConvertAmplificationPercentageIntoReductionPercentage(damage + damagePerStack * (itemCount - 1)) / 100f;
                            markDamageInfo.attacker        = attackerInfo.gameObject;
                            markDamageInfo.procCoefficient = canProc ? damageInfo.procCoefficient : 0f;
                            markDamageInfo.position        = body.corePosition;
                            markDamageInfo.crit            = damageInfo.crit;
                            markDamageInfo.damageType      = DamageType.Generic;
                            markDamageInfo.procChainMask   = damageInfo.procChainMask;
                            markDamageInfo.procChainMask.AddProc(ProcType.ChainLightning);
                            markDamageInfo.damageColorIndex = damageInfo.damageColorIndex;
                            body.healthComponent.TakeDamage(markDamageInfo);
                            GlobalEventManager.instance.OnHitEnemy(markDamageInfo, body.healthComponent.gameObject);
                        }
                    }
                }
            }
        }
Example #4
0
        private void GenericGameEvents_OnHitEnemy(DamageInfo damageInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo attackerInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo victimInfo)
        {
            if (damageInfo.crit && !damageInfo.procChainMask.HasProc(ProcType.Behemoth) && damageInfo.procCoefficient > 0f && attackerInfo.inventory && attackerInfo.body && attackerInfo.body.inputBank)
            {
                var itemCount = attackerInfo.inventory.GetItemCount(itemDef);
                if (itemCount > 0)
                {
                    var component = attackerInfo.body.GetComponent <MysticsItemsJudgementCutCounter>();
                    if (!component)
                    {
                        component = attackerInfo.body.gameObject.AddComponent <MysticsItemsJudgementCutCounter>();
                    }
                    component.count += damageInfo.procCoefficient;
                    if (component.count >= critInterval)
                    {
                        component.count = 0;

                        GameObject hitterObject = UnityEngine.Object.Instantiate(judgementCutHitterPrefab, damageInfo.position, Quaternion.identity);
                        MysticsItemsJudgementCutHitter hitter = hitterObject.GetComponent <MysticsItemsJudgementCutHitter>();
                        hitter.position         = damageInfo.position;
                        hitter.baseDamage       = (!alternateDamage ? attackerInfo.body.damage : damageInfo.damage) * damagePerSlash / 100f;
                        hitter.baseForce        = 200f;
                        hitter.attacker         = attackerInfo.gameObject;
                        hitter.radius           = radius + radiusPerStack * (itemCount - 1);
                        hitter.crit             = attackerInfo.body.RollCrit();
                        hitter.procCoefficient  = procCoefficient;
                        hitter.maxTimer         = 0.1f;
                        hitter.falloffModel     = BlastAttack.FalloffModel.None;
                        hitter.damageColorIndex = DamageColorIndex.Item;
                        hitter.procChainMask    = damageInfo.procChainMask;
                        hitter.procChainMask.AddProc(ProcType.Behemoth);
                        hitter.ammo = slashCount + slashCountPerStack * (itemCount - 1);
                        hitterObject.GetComponent <TeamFilter>().teamIndex = TeamComponent.GetObjectTeam(hitter.attacker);

                        MysticsItemsJudgementCutItemDisplayHelper.TriggerFlashForBody(attackerInfo.body);
                    }
                }
            }
        }
        private void GenericGameEvents_OnHitEnemy(DamageInfo damageInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo attackerInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo victimInfo)
        {
            if (!damageInfo.rejected && damageInfo.procCoefficient > 0f && !damageInfo.procChainMask.HasProc(ProcType.ChainLightning) && attackerInfo.body && attackerInfo.inventory)
            {
                var itemCount = attackerInfo.inventory.GetItemCount(itemDef);
                if (itemCount > 0)
                {
                    var component = attackerInfo.body.GetComponent <MysticsItemsVyraelCommandmentsHelper>();
                    if (!component)
                    {
                        component = attackerInfo.body.gameObject.AddComponent <MysticsItemsVyraelCommandmentsHelper>();
                    }
                    if (component.bonusActive <= 0)
                    {
                        component.hitCount += damageInfo.procCoefficient;
                        if (component.hitCount >= (float)hits)
                        {
                            component.hitCount -= (float)hits;
                            component.bonusActive++;

                            attackerInfo.body.crit /= chanceIncreaseOnProc;

                            for (var i = 0; i < itemCount; i++)
                            {
                                GlobalEventManager.instance.OnHitEnemy(damageInfo, victimInfo.gameObject);
                            }

                            attackerInfo.body.crit *= chanceIncreaseOnProc;

                            component.bonusActive--;
                            component.playEffect = true;
                        }
                    }
                }
            }
        }
 public void GenericGameEvents_OnApplyDamageIncreaseModifiers(DamageInfo damageInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo attackerInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo victimInfo, ref float damage)
 {
     if (!damageInfo.crit && attackerInfo.inventory)
     {
         var itemCount = attackerInfo.inventory.GetItemCount(itemDef);
         if (attackerInfo.body && itemCount > 0)
         {
             if (halveNonCritDamageForBackstabbers && attackerInfo.body.bodyFlags.HasFlag(CharacterBody.BodyFlags.HasBackstabPassive) ||
                 halveNonCritDamageForCritChanceConverters && attackerInfo.inventory.GetItemCount(DLC1Content.Items.ConvertCritChanceToCritDamage) > 0)
             {
                 damage /= Mathf.Pow(2, itemCount);
             }
         }
     }
 }
        private void GenericGameEvents_OnHitEnemy(DamageInfo damageInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo attackerInfo, MysticsRisky2UtilsPlugin.GenericCharacterInfo victimInfo)
        {
            if (attackerInfo.body && victimInfo.body && attackerInfo.inventory && !damageInfo.rejected)
            {
                var isAshDamage = DamageAPI.HasModdedDamageType(damageInfo, ashDamageType);

                var itemCount = 0;
                var itemLevel = 1;
                var ashHelper = attackerInfo.body.GetComponent <MysticsItemsMarwanAshHelper>();
                if (ashHelper)
                {
                    itemCount = ashHelper.itemCount;
                    itemLevel = ashHelper.itemLevel;
                }

                if (!isAshDamage && victimInfo.healthComponent && attackerInfo.gameObject && damageInfo.procCoefficient > 0f)
                {
                    if (itemCount > 0)
                    {
                        var _damage = damage + damagePerLevel * (attackerInfo.body.level - 1f) * itemCount;
                        if (attackerInfo.teamIndex != TeamIndex.Player)
                        {
                            _damage = Mathf.Min(_damage, enemyExtraDamageCap);
                        }
                        var _crit = attackerInfo.body.RollCrit();
                        if (itemLevel < 3)
                        {
                            DamageInfo extraDamageInfo = new DamageInfo();
                            extraDamageInfo.damage           = _damage;
                            extraDamageInfo.attacker         = attackerInfo.gameObject;
                            extraDamageInfo.procCoefficient  = procCoefficient;
                            extraDamageInfo.position         = damageInfo.position;
                            extraDamageInfo.crit             = _crit;
                            extraDamageInfo.damageColorIndex = ashDamageColor;
                            extraDamageInfo.procChainMask    = damageInfo.procChainMask;
                            extraDamageInfo.damageType       = DamageType.Silent;
                            DamageAPI.AddModdedDamageType(extraDamageInfo, ashDamageType);
                            victimInfo.healthComponent.TakeDamage(extraDamageInfo);
                            GlobalEventManager.instance.OnHitEnemy(extraDamageInfo, victimInfo.healthComponent.gameObject);
                        }
                        else
                        {
                            var _radius = radius + radiusPerLevel * (attackerInfo.body.level - (float)upgradeLevel23) * itemCount;
                            if (attackerInfo.teamIndex != TeamIndex.Player)
                            {
                                _radius = Mathf.Min(_radius, enemySpreadRadiusCap);
                            }
                            var blastAttack = new BlastAttack
                            {
                                radius            = _radius,
                                baseDamage        = _damage,
                                procCoefficient   = procCoefficient,
                                crit              = _crit,
                                damageColorIndex  = ashDamageColor,
                                attackerFiltering = AttackerFiltering.Default,
                                falloffModel      = BlastAttack.FalloffModel.None,
                                attacker          = attackerInfo.gameObject,
                                teamIndex         = attackerInfo.teamIndex,
                                position          = damageInfo.position,
                            };
                            DamageAPI.AddModdedDamageType(blastAttack, ashDamageType);
                            blastAttack.Fire();
                        }
                    }
                }
                if (isAshDamage)
                {
                    EffectManager.SimpleImpactEffect(ashHitVFX, damageInfo.position, Vector3.Normalize(Random.onUnitSphere), true);

                    if (itemLevel >= 2)
                    {
                        var dotInfo = new InflictDotInfo
                        {
                            victimObject     = victimInfo.gameObject,
                            attackerObject   = attackerInfo.gameObject,
                            dotIndex         = Buffs.MarwanAshBurn.ashDotIndex,
                            duration         = dotDuration,
                            damageMultiplier = 1f,
                            totalDamage      = null
                        };

                        var strengthenBurnCount = attackerInfo.inventory.GetItemCount(DLC1Content.Items.StrengthenBurn);
                        if (strengthenBurnCount > 0)
                        {
                            dotInfo.dotIndex = Buffs.MarwanAshBurnStrong.ashDotIndex;
                            var multiplier = 1f + 3f * (float)strengthenBurnCount;
                            dotInfo.damageMultiplier *= multiplier;
                            dotInfo.duration         *= multiplier;
                        }

                        DotController.InflictDot(ref dotInfo);
                    }
                }
            }
        }