Beispiel #1
0
        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, UnityEngine.GameObject victim)
        {
            GameObject attacker = damageInfo.attacker;

            if (self && attacker)
            {
                var attackerBody = attacker.GetComponent <CharacterBody>();
                var victimBody   = victim.GetComponent <CharacterBody>();
                int thalCount    = GetCount(attackerBody);
                if (thalCount > 0)
                {
                    bool flag = (damageInfo.damageType & DamageType.PoisonOnHit) > DamageType.Generic;
                    if ((thalCount > 0 || flag) && (flag || Util.CheckRoll((procChance + (stackChance * (thalCount - 1))))))
                    {
                        ProcChainMask procChainMask = damageInfo.procChainMask;
                        procChainMask.AddProc(ProcType.BleedOnHit);
                        var dotInfo = new InflictDotInfo()
                        {
                            attackerObject   = attacker,
                            victimObject     = victim,
                            dotIndex         = poisonDot,
                            duration         = duration,
                            damageMultiplier = dmgCoefficient
                        };
                        DotController.InflictDot(ref dotInfo);
                    }
                }
            }
            orig(self, damageInfo, victim);
        }
Beispiel #2
0
        private void On_GEMOnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);
            if (!NetworkServer.active || !damageInfo.attacker)
            {
                return;
            }

            CharacterBody body = damageInfo.attacker.GetComponent <CharacterBody>();

            if (!body || !body.HasBuff(pillageBuff))
            {
                return;
            }

            CharacterMaster chrm = body.master;

            if (!chrm)
            {
                return;
            }

            int mamt = Run.instance.GetDifficultyScaledCost(body.GetBuffCount(pillageBuff));

            if (Compat_ShareSuite.enabled && Compat_ShareSuite.MoneySharing())
            {
                Compat_ShareSuite.GiveMoney((uint)mamt);
            }
            else
            {
                chrm.GiveMoney((uint)mamt);
            }
        }
Beispiel #3
0
        private static void BrittleCrownOnHitHook(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo info, GameObject victim)
        {
            if (!ShareSuite.MoneyIsShared.Value ||
                !(bool)info.attacker ||
                !(bool)info.attacker.GetComponent <CharacterBody>() ||
                !(bool)info.attacker.GetComponent <CharacterBody>().master
                )
            {
                orig(self, info, victim);
                return;
            }

            #region Sharedmoney

            // The idea here is that we track amount of money pre and post function evaluation.
            // We can subsequently apply the difference to the shared pool.
            var body = info.attacker.GetComponent <CharacterBody>();

            var preDamageMoney = body.master.money;

            orig(self, info, victim);

            var postDamageMoney = body.master.money;

            // Ignore all of this if we do not actually have the item
            if (!body.inventory || body.inventory.GetItemCount(ItemIndex.GoldOnHit) <= 0)
            {
                return;
            }

            // Apply the calculation to the shared money pool
            SharedMoneyValue += (int)postDamageMoney - (int)preDamageMoney;

            #endregion
        }
        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);

            if (!damageInfo.rejected && damageInfo.attacker && victim && victim.TryGetComponent <HealthComponent>(out var victimHealth) && damageInfo.attacker.TryGetComponent <CharacterBody>(out var attackerBody) && damageInfo.attacker.TryGetComponent <HealDamageConversionTracker>(out var hdct))
            {
                var damageFrac = damageInfo.damage / attackerBody.damage;
                if (damageFrac >= triggerBigHitFrac)
                {
                    victimHealth.TakeDamage(new DamageInfo {
                        attacker         = damageInfo.attacker,
                        canRejectForce   = true,
                        crit             = false,
                        damage           = damageFrac * hdct.EmptyDamageBuffer(),
                        damageColorIndex = DamageColorIndex.Item,
                        damageType       = DamageType.Silent | DamageType.BypassArmor | DamageType.BypassBlock,
                        force            = Vector3.zero,
                        inflictor        = damageInfo.inflictor,
                        position         = damageInfo.position,
                        procChainMask    = damageInfo.procChainMask,
                        procCoefficient  = 0f
                    });
                }
            }
        }
Beispiel #5
0
        private void GrantOnKillEffectsOnHighDamage(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, RoR2.GlobalEventManager self, RoR2.DamageInfo damageInfo, GameObject victim)
        {
            var attacker = damageInfo.attacker;

            if (attacker)
            {
                var body       = attacker.GetComponent <CharacterBody>();
                var victimBody = victim.GetComponent <CharacterBody>();
                if (body && victimBody)
                {
                    var InventoryCount = GetCount(body);
                    if (InventoryCount > 0)
                    {
                        if (damageInfo.damage / body.damage >= witchesRingTriggerThreshold && !victimBody.HasBuff(WitchesRingImmunityBuff))
                        {
                            if (NetworkServer.active)
                            {
                                victimBody.AddTimedBuffAuthority(WitchesRingImmunityBuff, baseCooldownDuration / (1 + additionalCooldownReduction * (InventoryCount - 1)));
                                DamageReport damageReport = new DamageReport(damageInfo, victimBody.healthComponent, damageInfo.damage, victimBody.healthComponent.combinedHealth);
                                GlobalEventManager.instance.OnCharacterDeath(damageReport);
                            }
                        }
                    }
                }
            }
            orig(self, damageInfo, victim);
        }
Beispiel #6
0
        ////// Hooks //////

        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);
            if (NetworkServer.active && damageInfo != null && damageInfo.attacker)
            {
                var count = GetCount(damageInfo.attacker.GetComponent <CharacterBody>());
                if (count > 0 && damageInfo.attacker != victim)
                {
                    var sricd = damageInfo.attacker.GetComponent <ShrinkRayICDComponent>();
                    if (!sricd)
                    {
                        sricd = damageInfo.attacker.AddComponent <ShrinkRayICDComponent>();
                    }
                    if (Time.fixedTime - sricd.lastHit > icd)
                    {
                        sricd.lastHit = Time.fixedTime;
                        var stsd = victim.GetComponent <ServerTimedSkillDisable>();
                        if (!stsd)
                        {
                            stsd = victim.AddComponent <ServerTimedSkillDisable>();
                        }
                        stsd.ServerApply(duration * count, SkillSlot.Secondary);
                        stsd.ServerApply(duration * count, SkillSlot.Utility);
                        stsd.ServerApply(duration * count, SkillSlot.Special);
                        if (victim.TryGetComponent <CharacterBody>(out var vbody))
                        {
                            vbody.AddTimedBuff(shrinkDebuff, duration * count);
                        }
                    }
                }
            }
        }
Beispiel #7
0
 private static void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
 {
     orig(self, damageInfo, victim);
     if (damageInfo.attacker && damageInfo.attacker.GetComponent <CharacterBody>())
     {
         var attackerBody = damageInfo.attacker.GetComponent <CharacterBody>();
         if (attackerBody.HasBuff(PylonPoweredBuff.BuffDef) && !damageInfo.procChainMask.HasProc(ProcType.LoaderLightning))
         {
             float        damageValue  = Util.OnHitProcDamage(damageInfo.damage, attackerBody.damage, pylonPowerDamageCoefficient);
             LightningOrb lightningOrb = new LightningOrb();
             lightningOrb.origin           = damageInfo.position;
             lightningOrb.damageValue      = damageValue;
             lightningOrb.isCrit           = damageInfo.crit;
             lightningOrb.bouncesRemaining = pylonPowerMaxBounces;
             lightningOrb.teamIndex        = attackerBody.teamComponent ? attackerBody.teamComponent.teamIndex : TeamIndex.None;
             lightningOrb.attacker         = damageInfo.attacker;
             lightningOrb.bouncedObjects   = new List <HealthComponent>
             {
                 victim.GetComponent <HealthComponent>()
             };
             lightningOrb.procChainMask = damageInfo.procChainMask;
             lightningOrb.procChainMask.AddProc(ProcType.LoaderLightning);
             lightningOrb.procCoefficient  = 0f;
             lightningOrb.lightningType    = LightningOrb.LightningType.Loader;
             lightningOrb.damageColorIndex = DamageColorIndex.Item;
             lightningOrb.range            = pylonPowerRange;
             HurtBox hurtBox = lightningOrb.PickNextTarget(damageInfo.position);
             if (hurtBox)
             {
                 lightningOrb.target = hurtBox;
                 OrbManager.instance.AddOrb(lightningOrb);
             }
         }
     }
 }
Beispiel #8
0
 private void PoisonEliteChanges(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, RoR2.GlobalEventManager self, RoR2.DamageInfo damageInfo, GameObject victim)
 {
     if (damageInfo.attacker)
     {
         RoR2.CharacterBody component     = damageInfo.attacker.GetComponent <RoR2.CharacterBody>();
         RoR2.CharacterBody characterBody = victim ? victim.GetComponent <RoR2.CharacterBody>() : null;
         if (component)
         {
             RoR2.CharacterMaster master = component.master;
             if (master)
             {
                 if ((component.HasBuff(Resources.Load <BuffDef>("buffdefs/AffixPoison")) ? 1 : 0) > 0 && characterBody)
                 {
                     int   itemCount = master.inventory.GetItemCount(AspectsToItems.AspectsToItems.NewDefsList.Find(x => x.name == "AffixPoison").itemIndex);
                     float amount    = damageInfo.damage * (0.05f + 0.05f * itemCount);
                     if (itemCount == 0)
                     {
                         amount = damageInfo.damage * .1f;
                     }
                     component.healthComponent.Heal(amount, damageInfo.procChainMask, true);
                 }
             }
         }
     }
     orig(self, damageInfo, victim);
 }
Beispiel #9
0
        private void On_GEMOnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);
            if (!NetworkServer.active || !victim || !damageInfo.attacker || damageInfo.procCoefficient <= 0f)
            {
                return;
            }

            var vicb = victim.GetComponent <CharacterBody>();

            CharacterBody body = damageInfo.attacker.GetComponent <CharacterBody>();

            if (!body || !vicb || !vicb.healthComponent || !vicb.mainHurtBox || (bossImmunity && vicb.isBoss))
            {
                return;
            }

            CharacterMaster chrm = body.master;

            if (!chrm)
            {
                return;
            }

            int icnt = GetCount(body);

            if (icnt == 0)
            {
                return;
            }

            icnt--;
            float tProc = procChance;

            if (icnt > 0)
            {
                tProc += stackChance * icnt;
            }
            if (tProc > capChance)
            {
                tProc = capChance;
            }
            if (!Util.CheckRoll(tProc * damageInfo.procCoefficient, chrm))
            {
                return;
            }

            OrbManager.instance.AddOrb(new TeleSightOrb {
                attacker         = damageInfo.attacker,
                damageColorIndex = DamageColorIndex.WeakPoint,
                damageValue      = vicb.healthComponent.fullCombinedHealth + vicb.healthComponent.fullBarrier,
                isCrit           = true,
                origin           = body.corePosition,
                procChainMask    = damageInfo.procChainMask,
                procCoefficient  = 1f,
                target           = vicb.mainHurtBox,
                teamIndex        = body.GetComponent <TeamComponent>()?.teamIndex ?? TeamIndex.Neutral
            });
        }
Beispiel #10
0
 private static void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
 {
     if (damageInfo.HasModdedDamageType(OriginalPoisonOnHit))
     {
         DotController.InflictDot(victim, damageInfo.attacker, OriginalPoisonDot, 2f, 1f);
     }
     orig(self, damageInfo, victim);
 }
Beispiel #11
0
 private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
 {
     orig(self, damageInfo, victim);
     if (damageInfo.attacker)
     {
         var com = damageInfo.attacker.GetComponent <AccuracyTracker>();
         if (com)
         {
             com.hitEnemyCount++;
         }
     }
 }
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member

        private void On_GEMOnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);

            if (!NetworkServer.active || !victim || !damageInfo.attacker || damageInfo.procCoefficient <= 0f || damageInfo.procChainMask.HasProc(ProcType.Missile))
            {
                return;
            }

            var vicb = victim.GetComponent <CharacterBody>();

            CharacterBody body = damageInfo.attacker.GetComponent <CharacterBody>();

            if (!body || !vicb || !vicb.healthComponent || !vicb.mainHurtBox)
            {
                return;
            }

            CharacterMaster chrm = body.master;

            if (!chrm)
            {
                return;
            }

            int icnt = GetCount(body);

            if (icnt == 0)
            {
                return;
            }

            icnt--;
            float m2Proc = procChance;

            if (icnt > 0)
            {
                m2Proc += stackChance * icnt;
            }
            if (m2Proc > capChance)
            {
                m2Proc = capChance;
            }
            if (!Util.CheckRoll(m2Proc * damageInfo.procCoefficient, chrm))
            {
                return;
            }

            for (int t = 0; t < missileAmount; t++)
            {
                ProcMissile(t, body, damageInfo.procChainMask, victim, damageInfo, icnt);
            }
        }
        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            int InventoryCount = damageInfo.attacker.GetComponent <CharacterBody>().inventory.GetItemCount(catalogIndex);

            if (InventoryCount > 0)
            {
                float ResultDamageMult = 1 + DamageBonus + DamageBonusStack * (InventoryCount - 1);
                Debug.Log("+1 Bullets: " + damageInfo.damage.ToString() + " increased by " + ResultDamageMult.ToString() + "%", self);
                damageInfo.damage *= ResultDamageMult;
            }
            orig(self, damageInfo, victim);
        }
        //ChronoRework
        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);
            var attacker    = damageInfo.attacker ? damageInfo.attacker.GetComponent <CharacterBody>() : null;
            var cbVictim    = victim ? victim.GetComponent <CharacterBody>() : null;
            var chronoCount = attacker.inventory ? attacker.inventory.GetItemCount(ItemIndex.SlowOnHit) : 0;

            if (attacker && victim && !cbVictim.isBoss && chronoCount > 0 && Util.CheckRoll((1f - 1f / (damageInfo.procCoefficient * _chronoChance * (float)chronoCount + 1f)) * 100f, attacker.master))
            {
                cbVictim.AddTimedBuff(BuffIndex.BeetleJuice, 2f);
            }
        }
Beispiel #15
0
        ////// Hooks //////

        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);
            if (NetworkServer.active && damageInfo != null && damageInfo.attacker)
            {
                var count      = GetCount(damageInfo.attacker.GetComponent <CharacterBody>());
                var victimBody = victim.GetComponent <CharacterBody>();
                if (count > 0 && damageInfo.attacker != victim && victimBody &&
                    !victimBody.gameObject.name.Contains("Brother") &&
                    !victimBody.gameObject.name.Contains("VoidRaidCrab") &&
                    !victimBody.gameObject.name.Contains("ScavLunar") &&
                    victimBody.master && victimBody.master.inventory && victimBody.master.inventory.GetItemCount(gupDebuff) < count)
                {
                    var sricd = damageInfo.attacker.GetComponent <ShrinkRayICDComponent>();
                    if (!sricd)
                    {
                        sricd = damageInfo.attacker.AddComponent <ShrinkRayICDComponent>();
                    }
                    if (Time.fixedTime - sricd.lastHit > icd)
                    {
                        sricd.lastHit = Time.fixedTime;

                        victimBody.master.inventory.GiveItem(gupDebuff);

                        EffectManager.SpawnEffect(EntityStates.Gup.BaseSplitDeath.deathEffectPrefab, new EffectData {
                            origin = victim.GetComponent <CharacterBody>().corePosition,
                            scale  = 10f
                        }, true);
                        var masterPrefab = MasterCatalog.GetMasterPrefab(victimBody.master.masterIndex);
                        currentSplitIsGupRay = true;
                        new BodySplitter {
                            body         = victimBody,
                            masterSummon =
                            {
                                masterPrefab = masterPrefab
                            },
                            count = splitCount,
                            splinterInitialVelocityLocal = new Vector3(0f, 20f, 10f),
                            minSpawnCircleRadius         = 3f,
                            moneyMultiplier = 1f / (float)splitCount
                        }.Perform();
                        currentSplitIsGupRay = false;
                        if (victimBody.master)
                        {
                            victimBody.master.TrueKill();
                        }
                        GameObject.Destroy(victimBody.gameObject);
                    }
                }
            }
        }
Beispiel #16
0
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member

        private void On_GEMOnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);

            if (!NetworkServer.active || !victim || !damageInfo.attacker || damageInfo.procCoefficient <= 0f)
            {
                return;
            }

            var vicb = victim.GetComponent <CharacterBody>();

            CharacterBody body = damageInfo.attacker.GetComponent <CharacterBody>();

            if (!body || !vicb || !vicb.healthComponent || !vicb.mainHurtBox || vicb.HasBuff(poisonBuff))
            {
                return;
            }

            CharacterMaster chrm = body.master;

            if (!chrm)
            {
                return;
            }

            int icnt = GetCount(body);

            if (icnt == 0)
            {
                return;
            }

            icnt--;
            float m2Proc = procChance;

            if (icnt > 0)
            {
                m2Proc += stackChance * icnt;
            }
            if (m2Proc > capChance)
            {
                m2Proc = capChance;
            }
            if (!Util.CheckRoll(m2Proc * damageInfo.procCoefficient, chrm))
            {
                return;
            }

            DotController.InflictDot(victim, damageInfo.attacker, poisonDot, duration);
        }
Beispiel #17
0
        private static void PoisonOnHit_OnHit(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager gem,
                                              DamageInfo damageInfo, [NotNull] GameObject victim)
        {
            try
            {
                if (damageInfo.procCoefficient == 0f || damageInfo.rejected)
                {
                    return;
                }
                if (!NetworkServer.active)
                {
                    return;
                }
                CharacterBody component     = damageInfo.attacker.GetComponent <CharacterBody>();
                CharacterBody characterBody = victim ? victim.GetComponent <CharacterBody>() : null;
                if (component)
                {
                    CharacterMaster master = component.master;
                    if (master)
                    {
                        Inventory     inventory  = master.inventory;
                        TeamComponent component2 = component.GetComponent <TeamComponent>();
                        TeamIndex     teamIndex  = component2 ? component2.teamIndex : TeamIndex.Neutral;
                        Vector3       aimOrigin  = component.aimOrigin;
                        int           itemCount2 = inventory.GetItemCount(GNCItemSuite.PoisonOnHitItemIndex);
                        int           itemCount3 = inventory.GetItemCount(GNCItemSuite.BlightOnHitItemIndex);


                        if ((itemCount2 > 0) && (Util.CheckRoll(5f * (float)itemCount2 * damageInfo.procCoefficient, master)))
                        {
                            ProcChainMask procChainMask2 = damageInfo.procChainMask;
                            procChainMask2.AddProc(ProcType.BleedOnHit);
                            DotController.InflictDot(victim, damageInfo.attacker, DotController.DotIndex.Poison, 10f * damageInfo.procCoefficient, 1f);
                        }

                        if ((itemCount3 > 0) && (Util.CheckRoll(10f * (float)itemCount3 * damageInfo.procCoefficient, master)))
                        {
                            ProcChainMask procChainMask2 = damageInfo.procChainMask;
                            procChainMask2.AddProc(ProcType.BleedOnHit);
                            DotController.InflictDot(victim, damageInfo.attacker, DotController.DotIndex.Blight, 10f * damageInfo.procCoefficient, 1f);
                        }
                    }
                }
            }
            catch
            {
            }

            orig(gem, damageInfo, victim);
        }
 private void InflictPulverized(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victimGameObject)
 {
     if ((bool)self && (bool)damageInfo.attacker)
     {
         CharacterBody victim   = victimGameObject.GetComponent <CharacterBody>();
         CharacterBody attacker = damageInfo.attacker.GetComponent <CharacterBody>();
         int           count    = GetCount(attacker);
         if (count > 0)
         {
             victim.AddTimedBuff(RoR2Content.Buffs.Pulverized, 8);
         }
     }
     orig(self, damageInfo, victimGameObject);
 }
Beispiel #19
0
        static public void ModdedHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            if (damageInfo.procCoefficient == 0 || !NetworkServer.active || (!(bool)damageInfo.attacker || damageInfo.procCoefficient <= 0))
            {
                return;
            }

            CharacterBody Attacker      = damageInfo.attacker.GetComponent <CharacterBody>();
            CharacterBody characterBody = victim ? victim.GetComponent <CharacterBody>() : null;

            if (!Attacker)
            {
                return;
            }
            CharacterMaster master = Attacker.master;

            if (!master)
            {
                return;
            }
            damageInfo.procChainMask.LinkToManager();

            Inventory     inventory         = master.inventory;
            TeamComponent Team              = Attacker.GetComponent <TeamComponent>();
            TeamIndex     attackerTeamIndex = Team ? Team.teamIndex : TeamIndex.Neutral;

            Vector3 aimOrigin = Attacker.aimOrigin;

            ModItemManager.OnHitEnemyEffects(self, damageInfo, victim);


            //SetOnFire . Can't realy do much for this one
            int  DamageType = (uint)(damageInfo.damageType & RoR2.DamageType.IgniteOnHit) > 0U ? 1 : 0;
            bool CanSetFire = (damageInfo.damageType & RoR2.DamageType.PercentIgniteOnHit) != RoR2.DamageType.Generic || Attacker.HasBuff(BuffIndex.AffixRed);
            int  num2       = CanSetFire ? 1 : 0;

            if ((DamageType | num2) != 0)
            {
                DotController.InflictDot(victim, damageInfo.attacker, CanSetFire ? DotController.DotIndex.PercentBurn : DotController.DotIndex.Burn, 4f * damageInfo.procCoefficient, 1f);
            }

            //Apply Ice Elite (Will have to wait for Buff Change for that)
            if ((Attacker.HasBuff(BuffIndex.AffixWhite) ? 1 : 0) > 0 && (bool)((UnityEngine.Object)characterBody))
            {
                characterBody.AddTimedBuff(BuffIndex.Slow80, 1.5f * damageInfo.procCoefficient);
            }

            damageInfo.procChainMask.UnlinkToManager();
        }
Beispiel #20
0
        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            bool          hasBody = damageInfo != null && damageInfo.attacker;
            CharacterBody body    = null;

            if (hasBody)
            {
                body    = damageInfo.attacker.GetComponent <CharacterBody>();
                hasBody = body;
            }
            if (hasBody)
            {
                healingSourceStack.Push(body);
            }
            orig(self, damageInfo, victim);
            if (hasBody)
            {
                healingSourceStack.Pop();
            }
        }
Beispiel #21
0
        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);

            if (damageInfo.attacker && damageInfo.procCoefficient >= 1f)
            {
                CharacterBody attackerBody = damageInfo.attacker.GetComponent <CharacterBody>();
                if (attackerBody)
                {
                    if (attackerBody.HasBuff(Modules.Buffs.overchargeBuff))
                    {
                        float damageCoefficient = 0.75f;
                        float damageValue       = Util.OnHitProcDamage(damageInfo.damage, attackerBody.damage, damageCoefficient);

                        LightningOrb lightningOrb = new LightningOrb();
                        lightningOrb.origin           = damageInfo.position;
                        lightningOrb.damageValue      = damageValue;
                        lightningOrb.isCrit           = damageInfo.crit;
                        lightningOrb.bouncesRemaining = 3;
                        lightningOrb.teamIndex        = attackerBody.teamComponent.teamIndex;
                        lightningOrb.attacker         = damageInfo.attacker;
                        lightningOrb.bouncedObjects   = new List <HealthComponent>
                        {
                            victim.GetComponent <HealthComponent>()
                        };
                        lightningOrb.procChainMask = damageInfo.procChainMask;
                        lightningOrb.procChainMask.AddProc(ProcType.ChainLightning);
                        lightningOrb.procCoefficient  = 0f;
                        lightningOrb.lightningType    = LightningOrb.LightningType.Loader;
                        lightningOrb.damageColorIndex = DamageColorIndex.Default;
                        lightningOrb.range           += 6f;
                        HurtBox hurtBox = lightningOrb.PickNextTarget(damageInfo.position);
                        if (hurtBox)
                        {
                            lightningOrb.target = hurtBox;
                            OrbManager.instance.AddOrb(lightningOrb);
                        }
                    }
                }
            }
        }
Beispiel #22
0
 private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
 {
     orig(self, damageInfo, victim);
     if (teleporterCharging)
     {
         if (!hasBeenHit)
         {
             for (int i = 0; i < CharacterMaster.readOnlyInstancesList.Count; i++)
             { //CharacterMaster.readOnlyInstancesList[i] is the player. }
                 var player = CharacterMaster.readOnlyInstancesList[i];
                 if (hasBeenHit)
                 {
                     Chat.AddMessage("MasterRound OnDamageNotified: " + hasBeenHit.ToString() + "=Player was Hit!");
                 }
                 if (!victim)
                 {
                     Chat.AddMessage("MasterRound OnDamageNotified: " + victim.ToString() + "=victim doesn't exist");
                 }
                 if (victim != player.gameObject)
                 {
                     Chat.AddMessage("MasterRound OnDamageNotified: " + victim.ToString() + "=victim did not equal " + player.gameObject.ToString());
                 }
                 if (!hasBeenHit && victim && victim == player.gameObject && !damageInfo.rejected)
                 {
                     if (currentHits < allowedHits)
                     {
                         currentHits++;
                         Chat.AddMessage("MasterRound: " + victim.name + " got hit! Remaining Hits: " + (allowedHits - currentHits).ToString());
                     }
                     else
                     {
                         hasBeenHit = true;
                         Chat.AddMessage("MasterRound: dequalified!");
                     }
                 }
             }
         }
     }
 }
Beispiel #23
0
        private void On_GEMOnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);
            if (!NetworkServer.active || !damageInfo.attacker)
            {
                return;
            }

            CharacterBody body = damageInfo.attacker.GetComponent <CharacterBody>();

            if (!body || !body.HasBuff(pillageBuff))
            {
                return;
            }

            CharacterMaster chrm = body.master;

            if (!chrm)
            {
                return;
            }

            float mamt = (float)Run.instance.GetDifficultyScaledCost(body.GetBuffCount(pillageBuff)) * amount;

            if (!body.gameObject.TryGetComponent <PillageMoneyBuffer>(out var pmb))
            {
                pmb = body.gameObject.AddComponent <PillageMoneyBuffer>();
            }
            var bufferAmt = pmb.AddMoneyAndEmptyBuffer(Mathf.Max(mamt, 0f));

            if (Compat_ShareSuite.enabled && Compat_ShareSuite.MoneySharing())
            {
                Compat_ShareSuite.GiveMoney(bufferAmt);
            }
            else
            {
                chrm.GiveMoney(bufferAmt);
            }
        }
Beispiel #24
0
        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);
            var body           = victim.gameObject.GetComponent <CharacterBody>();
            int BuffCount      = body.GetBuffCount(GungeonFreezeStackDebuff);
            int InventoryCount = damageInfo.attacker.gameObject.GetComponent <CharacterBody>().inventory.GetItemCount(catalogIndex);

            if (InventoryCount > 1)
            {
                switch (BuffCount)
                {
                case stacksToFrozen:
                    Debug.Log("Froze the enemy", self);
                    body.RemoveBuff(GungeonFreezeStackDebuff);
                    body.AddTimedBuff(GungeonFrozenDebuff, Duration * 2);
                    //Add damage equal to 33% health
                    break;

                default:
                    GiveLeadEffect(damageInfo, victim, catalogIndex, GungeonFreezeStackDebuff, DotController.DotIndex.None, Duration);
                    break;
                }
            }
        }
Beispiel #25
0
        private void MasterRound_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);
            if (!victim)
            {
                return;          // no victim
            }
            var MasterRoundComponent = victim.gameObject.GetComponent <MasterRoundComponent>();

            if (!MasterRoundComponent)
            {
                return;                        // no component aka not a player
            }
            if (!MasterRoundComponent.teleporterCharging)
            {
                return;                                           // charging check
            }
            if (damageInfo.rejected || damageInfo.damage < MasterRound_MinimumDamage)
            {
                return;                                                                       //minimum damage check
            }
            var attacker = damageInfo.attacker;

            if (!attacker)
            {
                return;            // TODO: Figure out if this donkey conflicts, because I feel like it might
            }
            if (attacker == victim)
            {
                if (!MasterRound_AllowSelfDamage)
                {
                    return;
                }
            }
            else
            {
                var characterBody = attacker.gameObject.GetComponent <CharacterBody>();
                if (!characterBody)
                {
                    return;
                }
                if (MasterRound_OnlyAllowTeleBoss)
                {
                    if (!characterBody.isBoss)
                    {
                        return;
                    }
                    if (!MasterRound_TeleLunarWisps && characterBody.bodyIndex == BodyIndexLunarWisp)
                    {
                        return;
                    }
                    if (!MasterRound_TeleLunarGolems && characterBody.bodyIndex == BodyIndexLunarGolem)
                    {
                        return;
                    }
                }
            }
            MasterRoundComponent.currentHits++;
            if (MasterRound_ShowHitInChat)
            {
                if (MasterRoundComponent.currentHits <= MasterRoundComponent.allowedHits)
                {
                    var    characterBody = victim.GetComponent <CharacterBody>();
                    string username      = characterBody ? characterBody.GetUserName() : playerHitNameFailed;
                    string token         = MasterRoundComponent.currentHits < MasterRoundComponent.allowedHits ? playerHitToken : playerFailToken;
                    Chat.SendBroadcastChat(
                        new SimpleChatMessage
                    {
                        baseToken   = token,
                        paramTokens = new[] { username, MasterRoundComponent.currentHits.ToString(), MasterRoundComponent.allowedHits.ToString() }
                    });
                }
            }
        }
Beispiel #26
0
        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);

            GiveLeadEffect(damageInfo, victim, catalogIndex, BuffIndex.Blight, DotController.DotIndex.Blight, Duration);
        }
Beispiel #27
0
        private static void MasterRound_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);
            if (!victim && !victim.GetComponent <CharacterBody>())
            {
                return;                                                   // no victim
            }
            if (!victim.GetComponent <CharacterBody>().masterObject)
            {
                return;
            }
            var masterRoundComponent = victim.GetComponent <CharacterBody>().masterObject.GetComponent <MasterRoundComponent>();

            if (!masterRoundComponent || !masterRoundComponent.teleporterCharging)
            {
                return;                                                                    // no component aka not a player
            }
            if (damageInfo.rejected || damageInfo.damage < MinimumDamageBeforeInvalidation)
            {
                return;                                                                             //minimum damage check
            }
            var attacker = damageInfo.attacker;

            if (!attacker)
            {
                return;            // TODO: Figure out if this donkey conflicts, because I feel like it might
            }
            if (attacker == victim)
            {
                if (!AllowSelfDamage)
                {
                    return;
                }
            }
            else
            {
                var characterBody = attacker.gameObject.GetComponent <CharacterBody>();
                if (!characterBody)
                {
                    return;
                }
                if (OnlyAllowTeleBoss)
                {
                    if (!characterBody.isBoss)
                    {
                        return;
                    }
                    if (!EnableLunarWisps && characterBody.bodyIndex == BodyIndexLunarWisp)
                    {
                        return;
                    }
                    if (!EnableLunarGolems && characterBody.bodyIndex == BodyIndexLunarGolem)
                    {
                        return;
                    }
                    if (!EnableLunarExploders && characterBody.bodyIndex == BodyIndexLunarExploder)
                    {
                        return;
                    }
                }
            }
            masterRoundComponent.currentHits++;
            if (EnableShowHitInChat)
            {
                if (masterRoundComponent.currentHits <= masterRoundComponent.allowedHits)
                {
                    var    characterBody = victim.GetComponent <CharacterBody>();
                    string victimName    = characterBody ? characterBody.GetUserName() : characterBody.GetDisplayName();
                    string token         = masterRoundComponent.currentHits < masterRoundComponent.allowedHits ? "RISKOFBULLETSTORM_MASTERROUND_HIT" : "RISKOFBULLETSTORM_MASTERROUND_FAIL";
                    string attackerName  = damageInfo.attacker.GetComponent <CharacterBody>().GetDisplayName();
                    Chat.SendBroadcastChat(
                        new SimpleChatMessage
                    {
                        baseToken   = token,
                        paramTokens = new[] { victimName, masterRoundComponent.currentHits.ToString(), masterRoundComponent.allowedHits.ToString(), attackerName }
                    });
                }
            }
        }
Beispiel #28
0
 ////// Hooks //////
 #region Hooks
 private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
 {
     ignoreMugs = true;
     orig(self, damageInfo, victim);
     ignoreMugs = false;
 }
        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);

            CharacterBody body           = damageInfo.attacker.GetComponent <CharacterBody>();
            var           InventoryCount = body.inventory.GetItemCount(catalogIndex);

            //Check if item is in Inventory
            if (body.inventory)
            {
                if (InventoryCount <= 0)
                {
                    return;
                }

                if (pingerController.Length <= 0)
                {
                    if (!FetchPingControllers(out pingerController))
                    {
                        return;
                    }
                }
            }


            string cutText(float value) //truncating method for Scouter text specifically
            {
                var    text        = value.ToString();
                int    maxText     = Math.Min(text.Length, InventoryCount);
                var    allowedText = text.Substring(Math.Max(0, text.Length - maxText));
                string blockedText = new String('?', text.Length - maxText);

                return(blockedText + allowedText);
            }

            CharacterBody component = victim.gameObject.GetComponent <CharacterBody>();
            string        EnemyName = component.name;

            //EnemyName = EnemyName.Substring(0, Math.Max(0, EnemyName.Length - 8));
            //https://stackoverflow.com/questions/2201595/c-sharp-simplest-way-to-remove-first-occurrence-of-a-substring-from-another-st
            EnemyName = EnemyName.Replace(" (Clone)", null);
            //Add Elite Affix after name?
            var EnemyHealthMax = component.maxHealth;
            var EnemyHealth    = (int)component.healthComponent.health;
            var EnemyShieldMax = component.maxShield;
            var EnemyShield    = (int)component.healthComponent.shield;
            var DamageType     = damageInfo.damageType.ToString();
            var BaseDamage     = damageInfo.damage; //ONLY SHOWS BASE DAMAGE DEALT

            orig(self, damageInfo, victim);
            //var Damage = (int)(EnemyHealth - component.healthComponent.health);
            if (InventoryCount < 2)
            {
                DamageType = "???";
            }
            switch (InventoryCount)
            {
            case 0:
                break;
            }
            var ScouterMsg = "\n==||||||" + EnemyName.ToString().ToUpper() + "||||||==" +
                             "\n <color=#e32051>FleshHP</color>: " + cutText(EnemyHealth) + " / " + cutText(EnemyHealthMax) +
                             "\n <color=#2095e3>ShieldHP</color>:" + cutText(EnemyShield) + " / " + cutText(EnemyShieldMax) +
                             "\n Damage Received" + cutText(BaseDamage) + " (" + DamageType + ")" +
                             "\n||||||SCOUTER||||||";

            // Iterate through every player available and check their pings
            foreach (PingerController pingerControllers in pingerController)
            {
                GameObject selectedEnemy = pingerControllers.currentPing.targetGameObject;
                currentEnemy = (victim.Equals(selectedEnemy) ? selectedEnemy : null);

                if (currentEnemy)
                {
                    Chat.AddMessage(ScouterMsg);
                }
            }
        }
 private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, UnityEngine.GameObject victim)
 {
 }