Exemplo n.º 1
0
        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()}");
            }
        }
Exemplo n.º 2
0
            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);
                    }
                }
            }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
            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");
            }
Exemplo n.º 5
0
        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();
            }
        }
Exemplo n.º 6
0
        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();
                }
            }
        }