private void DotController_UpdateDotVisuals(On.RoR2.DotController.orig_UpdateDotVisuals orig, DotController self)
 {
     orig(self);
     Items.MarwanAsh1.MysticsItemsMarwanAshHelper ashHelper = self.victimBody ? self.victimBody.GetComponent <Items.MarwanAsh1.MysticsItemsMarwanAshHelper>() : null;
     if (ashHelper)
     {
         if (self.HasDotActive(ashDotIndex))
         {
             if (!ashHelper.burnEffectControllerStrong)
             {
                 ModelLocator modelLocator = self.victimBody.modelLocator;
                 if (modelLocator && modelLocator.modelTransform)
                 {
                     ashHelper.burnEffectControllerStrong            = self.victimBody.gameObject.AddComponent <BurnEffectController>();
                     ashHelper.burnEffectControllerStrong.effectType = ashBurnEffectParams;
                     ashHelper.burnEffectControllerStrong.target     = modelLocator.modelTransform.gameObject;
                 }
             }
         }
         else if (ashHelper.burnEffectControllerStrong)
         {
             Object.Destroy(ashHelper.burnEffectControllerStrong);
             ashHelper.burnEffectControllerStrong = null;
         }
     }
 }
Exemple #2
0
 private static void OnDotControllerUpdate(On.RoR2.DotController.orig_FixedUpdate orig, DotController self)
 {
     for (int i = (int)DotController.DotIndex.Count; i < DotController.dotDefs.Length; i++)
     {
         if (self.HasDotActive((DotController.DotIndex)i) && CustomDotDefs.TryGetValue(DotController.dotDefs[i], out DotActionContainer container))
         {
             container.Update?.Invoke(self);
         }
     }
 }
Exemple #3
0
        // Token: 0x06001CD8 RID: 7384 RVA: 0x0007B5C0 File Offset: 0x000797C0
        public static void OnCharacterDeath(DamageReport damageReport)
        {
            DotController dotController    = DotController.FindDotController(damageReport.victim.gameObject);
            bool          victimWasBurning = false;

            if (dotController)
            {
                victimWasBurning = (dotController.HasDotActive(DotController.DotIndex.Burn) | dotController.HasDotActive(DotController.DotIndex.PercentBurn) | dotController.HasDotActive(DotController.DotIndex.Helfire));
            }
            StatManager.deathEvents.Enqueue(new StatManager.DeathEvent
            {
                damageReport     = damageReport,
                victimWasBurning = victimWasBurning
            });
        }
Exemple #4
0
        public static void AddHook()
        {
            On.RoR2.HealthComponent.TakeDamage += (orig, self, damageInfo) =>
            {
                bool  aliveBeforeHit       = self.alive;
                bool  resetCooldownsOnKill = false;
                bool  isDynamiteBundle     = false;
                bool  isBarrage            = false;
                float resetDuration        = 0f;

                GracePeriodComponent graceComponent = self.gameObject.GetComponent <GracePeriodComponent>();
                if (!graceComponent)
                {
                    graceComponent = self.gameObject.AddComponent <GracePeriodComponent>();
                }
                bool banditAttacker         = false;
                AssignDynamiteTeamFilter ad = self.gameObject.GetComponent <AssignDynamiteTeamFilter>();
                if (ad)
                {
                    isDynamiteBundle = true;
                }


                CharacterBody attackerCB = null;
                if (damageInfo.attacker)
                {
                    attackerCB = damageInfo.attacker.GetComponent <CharacterBody>();
                    if (attackerCB)
                    {
                        banditAttacker = attackerCB.baseNameToken == "BANDITRELOADED_BODY_NAME";
                    }
                }

                if (banditAttacker && graceComponent)
                {
                    if ((damageInfo.damageType & DamageType.ResetCooldownsOnKill) > 0)
                    {
                        resetCooldownsOnKill = true;
                        if ((damageInfo.damageType & DamageType.SlowOnHit) > 0)
                        {
                            damageInfo.damageType &= ~DamageType.SlowOnHit;
                            isBarrage              = true;
                        }

                        int           debuffCount = 0;
                        DotController d           = DotController.FindDotController(self.gameObject);

                        foreach (BuffIndex buffType in BuffCatalog.debuffBuffIndices)
                        {
                            if (self.body.HasBuff(buffType))
                            {
                                if (buffType != ModContentPack.skullBuff.buffIndex)
                                {
                                    debuffCount++;
                                }
                                else
                                {
                                    debuffCount += self.body.GetBuffCount(buffType);
                                }
                            }
                        }
                        DotController dotController = DotController.FindDotController(self.gameObject);
                        if (dotController)
                        {
                            for (DotController.DotIndex dotIndex = DotController.DotIndex.Bleed; dotIndex < DotController.DotIndex.Count; dotIndex++)
                            {
                                if (dotController.HasDotActive(dotIndex))
                                {
                                    debuffCount++;
                                }
                            }
                        }

                        if (isBarrage && self.body.HasBuff(ModContentPack.lightsOutBuff))
                        {
                            debuffCount--;
                        }

                        float buffDamage     = 0f;
                        float buffBaseDamage = damageInfo.damage * specialDebuffBonus;
                        buffDamage         = buffBaseDamage * debuffCount;
                        damageInfo.damage += buffDamage;

                        bool lightWeight = false;
                        if (self.body)
                        {
                            Rigidbody rb = self.body.rigidbody;
                            if (rb)
                            {
                                if (rb.mass < 50f)
                                {
                                    lightWeight = true;
                                }
                            }
                        }

                        resetDuration = 3.6f;
                        if (!lightWeight)
                        {
                            resetDuration = GracePeriodComponent.graceDuration;
                        }
                    }

                    if (self.alive && (damageInfo.damageType & DamageType.ResetCooldownsOnKill) == 0 && graceComponent.HasReset(attackerCB))
                    {
                        damageInfo.damageType |= DamageType.ResetCooldownsOnKill;
                    }
                }

                if (isDynamiteBundle)
                {
                    if (!ad.fired && banditAttacker && (damageInfo.damageType & DamageType.AOE) == 0 && damageInfo.procCoefficient > 0f)
                    {
                        ad.fired                   = true;
                        damageInfo.crit            = true;
                        damageInfo.procCoefficient = 0f;
                        ProjectileImpactExplosion pie = self.gameObject.GetComponent <ProjectileImpactExplosion>();
                        if (pie)
                        {
                            pie.blastRadius *= 2f;
                        }

                        ProjectileDamage pd = self.gameObject.GetComponent <ProjectileDamage>();
                        if (pd)
                        {
                            if (resetCooldownsOnKill)
                            {
                                pd.damage *= 2f;

                                BanditNetworkCommands bnc = damageInfo.attacker.GetComponent <BanditNetworkCommands>();
                                if (bnc)
                                {
                                    bnc.RpcResetSpecialCooldown();
                                }
                            }
                            else
                            {
                                pd.damage *= 1.5f;
                            }
                        }
                    }
                    else
                    {
                        damageInfo.rejected = true;
                    }
                }

                orig(self, damageInfo);

                if (!self.alive && graceComponent)
                {
                    if (aliveBeforeHit && self.globalDeathEventChanceCoefficient > 0f && self.body && self.body.master)
                    {
                        graceComponent.TriggerEffects(attackerCB);
                    }
                }
                else if (!damageInfo.rejected && self.alive)
                {
                    if (banditAttacker)
                    {
                        if (resetCooldownsOnKill)
                        {
                            if (isBarrage)
                            {
                                self.body.AddTimedBuff(ModContentPack.skullBuff, 3f);
                            }
                            self.body.AddTimedBuff(ModContentPack.lightsOutBuff, resetDuration);

                            if (graceComponent && resetDuration > 0f)
                            {
                                graceComponent.AddTimer(attackerCB, damageInfo.damageType, resetDuration);
                            }
                        }
                    }

                    if (self.body.HasBuff(ModContentPack.lightsOutBuff) && specialExecuteThreshold > 0f)
                    {
                        if (((self.body.bodyFlags & CharacterBody.BodyFlags.ImmuneToExecutes) == 0 && !self.body.isChampion) || specialExecuteBosses)
                        {
                            float executeThreshold = specialExecuteThreshold;
                            float executeToAdd     = 0f;
                            if (self.body.isElite)
                            {
                                executeToAdd = damageInfo.inflictor.GetComponent <CharacterBody>().executeEliteHealthFraction;
                            }
                            if (self.isInFrozenState && executeToAdd < 0.3f)
                            {
                                executeToAdd = 0.3f;
                            }
                            executeThreshold += executeToAdd;

                            if (self.alive && (self.combinedHealthFraction < executeThreshold))
                            {
                                damageInfo.damage           = self.combinedHealth / 2f + 1f;
                                damageInfo.damageType       = (DamageType.ResetCooldownsOnKill | DamageType.BypassArmor);
                                damageInfo.procCoefficient  = 0f;
                                damageInfo.crit             = true;
                                damageInfo.damageColorIndex = DamageColorIndex.WeakPoint;
                                orig(self, damageInfo);
                            }
                        }
                    }
                }
            };
        }