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); }
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); } }
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 }); } } }
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); }
////// 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); } } } } }
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); } } } }
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); }
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 }); }
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); }
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); } }
////// 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); } } } }
#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); }
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); }
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(); }
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(); } }
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); } } } } }
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!"); } } } } } }
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); } }
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; } } }
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() } }); } } }
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); }
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 } }); } } }
////// 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) { }