static void OnDamagedPrefix(Character __instance, ref HitData hit) { if (hit.HaveAttacker() && hit.GetAttacker().IsPlayer() && hit.GetAttacker().GetSEMan().HaveStatusEffect("Wyrdarrow")) { (hit.GetAttacker().GetSEMan().GetStatusEffect("Wyrdarrow") as SE_AoECounter).IncreaseCounter(); } if (hit.HaveAttacker() && hit.GetAttacker().IsPlayer() && hit.GetAttacker().GetSEMan().HaveStatusEffect("Brassflesh Listener")) { if (hit.GetAttacker().GetSEMan().HaveStatusEffect("Brassflesh")) { (hit.GetAttacker().GetSEMan().GetStatusEffect("Brassflesh") as SE_ArmorOnHit).OnHit(); } else { SEMan seman = hit.GetAttacker().GetSEMan(); float maxArmor = (seman.GetStatusEffect("Brassflesh Listener") as SE_ArmorOnHitListener).GetMaxArmor(); seman.AddStatusEffect("Brassflesh"); (seman.GetStatusEffect("Brassflesh") as SE_ArmorOnHit).SetMaxArmor(maxArmor); } } if (__instance.IsPlayer() && __instance.GetSEMan().HaveStatusEffect("Challenge Move Speed")) { //Log.LogInfo($"starting damage: {hit.GetTotalDamage()}"); float damageMod = 2f; hit.m_damage.m_blunt *= damageMod; hit.m_damage.m_chop *= damageMod; hit.m_damage.m_damage *= damageMod; hit.m_damage.m_fire *= damageMod; hit.m_damage.m_frost *= damageMod; hit.m_damage.m_lightning *= damageMod; hit.m_damage.m_pickaxe *= damageMod; hit.m_damage.m_pierce *= damageMod; hit.m_damage.m_poison *= damageMod; hit.m_damage.m_slash *= damageMod; hit.m_damage.m_spirit *= damageMod; //Log.LogInfo($"ending damage: {hit.GetTotalDamage()}"); } if (__instance.IsPlayer() && __instance.GetSEMan().HaveStatusEffect("Brassflesh")) { //Log.LogInfo($"starting damage: {hit.GetTotalDamage()}"); float damageMod = (__instance.GetSEMan().GetStatusEffect("Brassflesh") as SE_ArmorOnHit).GetCurrentDamageReduction(); hit.m_damage.m_blunt *= 1 - damageMod; hit.m_damage.m_chop *= 1 - damageMod; hit.m_damage.m_damage *= 1 - damageMod; hit.m_damage.m_fire *= 1 - damageMod; hit.m_damage.m_frost *= 1 - damageMod; hit.m_damage.m_lightning *= 1 - damageMod; hit.m_damage.m_pickaxe *= 1 - damageMod; hit.m_damage.m_pierce *= 1 - damageMod; hit.m_damage.m_poison *= 1 - damageMod; hit.m_damage.m_slash *= 1 - damageMod; hit.m_damage.m_spirit *= 1 - damageMod; //Log.LogInfo($"ending damage: {hit.GetTotalDamage()}"); } }
static void Postfix(float dt, Player __instance, ItemDrop.ItemData ___m_chestItem, ItemDrop.ItemData ___m_legItem, ItemDrop.ItemData ___m_helmetItem, ItemDrop.ItemData ___m_shoulderItem, SEMan ___m_seman) { if (!modEnabled.Value) { return; } if (___m_seman.HaveStatusEffect("Wet")) { HitData.DamageModifier water = GetNewDamageTypeMod(NewDamageTypes.Water, ___m_chestItem, ___m_legItem, ___m_helmetItem, ___m_shoulderItem); var wet = ___m_seman.GetStatusEffect("Wet"); var t = Traverse.Create(wet); if (water == HitData.DamageModifier.Ignore || water == HitData.DamageModifier.Immune) { ___m_seman.RemoveStatusEffect("Wet", true); } else if (water == HitData.DamageModifier.VeryResistant && !__instance.InLiquidSwimDepth()) { ___m_seman.RemoveStatusEffect("Wet", true); } else if (water == HitData.DamageModifier.Resistant) { t.Field("m_time").SetValue(t.Field("m_time").GetValue <float>() + dt); ___m_seman.RemoveStatusEffect("Wet", true); ___m_seman.AddStatusEffect(wet); } else if (water == HitData.DamageModifier.Weak) { t.Field("m_time").SetValue(t.Field("m_time").GetValue <float>() - dt / 3); ___m_seman.RemoveStatusEffect("Wet", true); ___m_seman.AddStatusEffect(wet); } else if (water == HitData.DamageModifier.VeryWeak) { t.Field("m_time").SetValue(t.Field("m_time").GetValue <float>() - dt * 2 / 3); ___m_seman.RemoveStatusEffect("Wet", true); ___m_seman.AddStatusEffect(wet); } } }
public static void DamagePostfix(Character __instance, HitData hit) { SEMan seman = __instance.GetSEMan(); if (seman.HaveStatusEffect("Wolftears") && seman.m_character.GetHealth() <= hit.m_damage.GetTotalDamage() && !seman.HaveStatusEffect("Tear Protection Exhausted")) { Log.LogInfo($"Would Kill defender! Damage: {hit.m_damage.GetTotalDamage()}, attacker health: {__instance.GetHealth()}"); hit.m_damage.Modify(0); seman.AddStatusEffect("Tear Protection Exhausted"); __instance.SetHealth(1f); } }
static void Postfix(Humanoid __instance, ItemDrop.ItemData ___m_utilityItem, ref HashSet <StatusEffect> ___m_eqipmentStatusEffects, SEMan ___m_seman) { if (!modEnabled.Value || !__instance.IsPlayer()) { return; } var list = __instance.GetInventory().GetAllItems().FindAll(i => i.m_equiped && i.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Utility && i != ___m_utilityItem); foreach (var item in list) { if (!item.m_shared.m_equipStatusEffect) { continue; } ___m_seman.AddStatusEffect(item.m_shared.m_equipStatusEffect, false); } //Dbgl($"added {list.Count} effects"); }
public static void AddRunicEffect(this SEMan __instance, string name, Player caster, string dsbuffs, bool resetTime) { // getting the rune data of this runic effect var data = RunicPower.GetRuneData(name); // if there is none, stop here if (data == null) { return; } // checking if the target already has this effect var currentEffect = __instance.m_statusEffects.Find(se => se.GetRune()?.data.core == data.core); // if it does if (currentEffect != null) { var currentRune = currentEffect.GetRune(); // and its rank is greater than the one we're trying to apply if (currentRune.data.rank > data.rank) { // stop here. we won't replace the buff with a worse version of it! return; } else { // if the current rune is of equal or lower rank, let's remove it so it can be reapplied __instance.RemoveStatusEffect(currentEffect, true); } } // preparing a new effect var rune = RunicPower.CreateRunicEffect(name, caster, dsbuffs); var effect = rune?.statusEffect; // and adding it to the player if (effect != null) { SetTempRune(effect, rune); __instance.AddStatusEffect(effect); UnsetTemp(); } }
public static void DamagePostfix(Character __instance, ref HitData hit) { SEMan seman = __instance.GetSEMan(); Character attacker = hit.GetAttacker(); if (attacker == null || attacker.IsPlayer() || attacker.m_seman == null) { return; } if (seman.HaveStatusEffect("Thorns") && !seman.m_character.IsBlocking()) { SE_Thorns effect = seman.GetStatusEffect("Thorns") as SE_Thorns; Log.LogMessage($"Damage dealt: {hit.GetTotalDamage()} thorns %${effect.GetReflectPercent()}"); HitData reflectedDamage = new HitData(); reflectedDamage.m_damage.Add(hit.m_damage); reflectedDamage.m_damage.m_blunt *= effect.GetReflectPercent(); reflectedDamage.m_damage.m_chop *= effect.GetReflectPercent(); reflectedDamage.m_damage.m_damage *= effect.GetReflectPercent(); reflectedDamage.m_damage.m_fire *= effect.GetReflectPercent(); reflectedDamage.m_damage.m_frost *= effect.GetReflectPercent(); reflectedDamage.m_damage.m_lightning *= effect.GetReflectPercent(); reflectedDamage.m_damage.m_pickaxe *= effect.GetReflectPercent(); reflectedDamage.m_damage.m_pierce *= effect.GetReflectPercent(); reflectedDamage.m_damage.m_poison *= effect.GetReflectPercent(); reflectedDamage.m_damage.m_slash *= effect.GetReflectPercent(); reflectedDamage.m_damage.m_spirit *= effect.GetReflectPercent(); reflectedDamage.m_staggerMultiplier = 0; Log.LogMessage($"Reflected Damage ${reflectedDamage.m_damage.GetTotalDamage()}"); if (attacker.GetHealth() <= reflectedDamage.GetTotalDamage() && attacker.GetHealthPercentage() >= (float)balance["thornsKillThreshold"]) { var totalDamage = attacker.GetHealth() - 1; reflectedDamage.m_damage.m_blunt = totalDamage * (reflectedDamage.m_damage.m_blunt / reflectedDamage.GetTotalDamage()); reflectedDamage.m_damage.m_chop = totalDamage * (reflectedDamage.m_damage.m_chop / reflectedDamage.GetTotalDamage()); reflectedDamage.m_damage.m_damage = totalDamage * (reflectedDamage.m_damage.m_damage / reflectedDamage.GetTotalDamage()); reflectedDamage.m_damage.m_fire = totalDamage * (reflectedDamage.m_damage.m_fire / reflectedDamage.GetTotalDamage()); reflectedDamage.m_damage.m_frost = totalDamage * (reflectedDamage.m_damage.m_frost / reflectedDamage.GetTotalDamage()); reflectedDamage.m_damage.m_lightning = totalDamage * (reflectedDamage.m_damage.m_lightning / reflectedDamage.GetTotalDamage()); reflectedDamage.m_damage.m_pickaxe = totalDamage * (reflectedDamage.m_damage.m_pickaxe / reflectedDamage.GetTotalDamage()); reflectedDamage.m_damage.m_pierce = totalDamage * (reflectedDamage.m_damage.m_pierce / reflectedDamage.GetTotalDamage()); reflectedDamage.m_damage.m_poison = totalDamage * (reflectedDamage.m_damage.m_poison / reflectedDamage.GetTotalDamage()); reflectedDamage.m_damage.m_slash = totalDamage * (reflectedDamage.m_damage.m_slash / reflectedDamage.GetTotalDamage()); reflectedDamage.m_damage.m_spirit = totalDamage * (reflectedDamage.m_damage.m_spirit / reflectedDamage.GetTotalDamage()); //Log.LogMessage($"Would Kill attacker! New damage: {reflectedDamage.m_damage.GetTotalDamage()}, attacker health: {attacker.GetHealth()}"); } attacker.ApplyDamage(reflectedDamage, true, false); var vfx = Object.Instantiate(AssetHelper.FXThorns, attacker.GetCenterPoint(), Quaternion.identity); ParticleSystem[] children = vfx.GetComponentsInChildren <ParticleSystem>(); foreach (ParticleSystem particle in children) { particle.Play(); //Log.LogMessage("Playing particle"); } } if (__instance.GetSEMan().HaveStatusEffect("Wolftears")) { var effect = __instance.GetSEMan().GetStatusEffect("Wolftears") as SE_Wolftears; effect.SetIcon(); if (seman.m_character.GetHealth() <= hit.m_damage.GetTotalDamage() && !seman.HaveStatusEffect("Tear Protection Exhausted")) { Log.LogInfo($"Would Kill defender! Damage: {hit.m_damage.GetTotalDamage()}, attacker health: {__instance.GetHealth()}"); hit.m_damage.Modify(0); seman.AddStatusEffect("Tear Protection Exhausted"); __instance.SetHealth(1f); } } if (__instance.GetSEMan().HaveStatusEffect("Battle Furor")) { var effect = __instance.GetSEMan().GetStatusEffect("Battle Furor") as SE_FullHPDamageBonus; //Log.LogWarning("HP Percentage " + __instance.m_character.GetHealthPercentage() + " Activation Threshold " + effect.GetActivationHP()); if (__instance.GetHealthPercentage() < effect.GetActivationHP()) { effect.ClearIcon(); } } }