Пример #1
0
        public void SetDamage(HitData.DamageTypes damage, Player player)
        {
            _player = player;
            var aoeDamagePercent = player.GetTotalActiveMagicEffectValue(MagicEffectType.FrostDamageAOE, 0.01f);

            _frostDamage = damage.GetTotalDamage() * aoeDamagePercent;
        }
            public DamageContainer(ItemDrop.ItemData weapon)
            {
                var shared = weapon.m_shared;

                damage = new HitData.DamageTypes
                {
                    m_blunt     = shared.m_damages.m_blunt,
                    m_pierce    = shared.m_damages.m_pierce,
                    m_slash     = shared.m_damages.m_slash,
                    m_chop      = shared.m_damages.m_chop,
                    m_pickaxe   = shared.m_damages.m_pickaxe,
                    m_fire      = shared.m_damages.m_fire,
                    m_frost     = shared.m_damages.m_frost,
                    m_lightning = shared.m_damages.m_lightning,
                    m_poison    = shared.m_damages.m_poison,
                    m_spirit    = shared.m_damages.m_spirit
                };
                damagePerLevel = new HitData.DamageTypes
                {
                    m_blunt     = shared.m_damagesPerLevel.m_blunt,
                    m_pierce    = shared.m_damagesPerLevel.m_pierce,
                    m_slash     = shared.m_damagesPerLevel.m_slash,
                    m_chop      = shared.m_damagesPerLevel.m_chop,
                    m_pickaxe   = shared.m_damagesPerLevel.m_pickaxe,
                    m_fire      = shared.m_damagesPerLevel.m_fire,
                    m_frost     = shared.m_damagesPerLevel.m_frost,
                    m_lightning = shared.m_damagesPerLevel.m_lightning,
                    m_poison    = shared.m_damagesPerLevel.m_poison,
                    m_spirit    = shared.m_damagesPerLevel.m_spirit
                };
            }
Пример #3
0
 // Token: 0x06001141 RID: 4417 RVA: 0x00077DA8 File Offset: 0x00075FA8
 public HitData.DamageTypes GetDamage(int quality)
 {
     HitData.DamageTypes damages = this.m_shared.m_damages;
     if (quality > 1)
     {
         damages.Add(this.m_shared.m_damagesPerLevel, quality - 1);
     }
     return(damages);
 }
Пример #4
0
 // Token: 0x060002D6 RID: 726 RVA: 0x00016F50 File Offset: 0x00015150
 public HitData.DamageTypes GetDamage(int itemQuality)
 {
     if (itemQuality <= 1)
     {
         return(this.m_damage);
     }
     HitData.DamageTypes damage = this.m_damage;
     damage.Add(this.m_damagePerLevel, itemQuality - 1);
     return(damage);
 }
Пример #5
0
 private void GetDamagePerLevelValues(HitData.DamageTypes damageList)
 {
     DamageBluntPerLevel     = damageList.m_blunt;
     DamageSlashPerLevel     = damageList.m_slash;
     DamagePiercePerLevel    = damageList.m_pierce;
     DamageChopPerLevel      = damageList.m_chop;
     DamagePickaxePerLevel   = damageList.m_pickaxe;
     DamageFirePerLevel      = damageList.m_fire;
     DamageFrostPerLevel     = damageList.m_frost;
     DamageLightningPerLevel = damageList.m_lightning;
     DamagePoisonPerLevel    = damageList.m_poison;
     DamageSpiritPerLevel    = damageList.m_spirit;
 }
Пример #6
0
 private void GetDamageValues(HitData.DamageTypes damageList)
 {
     DamageBlunt     = damageList.m_blunt;
     DamageSlash     = damageList.m_slash;
     DamagePierce    = damageList.m_pierce;
     DamageChop      = damageList.m_chop;
     DamagePickaxe   = damageList.m_pickaxe;
     DamageFire      = damageList.m_fire;
     DamageFrost     = damageList.m_frost;
     DamageLightning = damageList.m_lightning;
     DamagePoison    = damageList.m_poison;
     DamageSpirit    = damageList.m_spirit;
 }
Пример #7
0
 // Token: 0x060011AE RID: 4526 RVA: 0x00079868 File Offset: 0x00077A68
 public void Add(HitData.DamageTypes other, int multiplier = 1)
 {
     this.m_damage    += other.m_damage * (float)multiplier;
     this.m_blunt     += other.m_blunt * (float)multiplier;
     this.m_slash     += other.m_slash * (float)multiplier;
     this.m_pierce    += other.m_pierce * (float)multiplier;
     this.m_chop      += other.m_chop * (float)multiplier;
     this.m_pickaxe   += other.m_pickaxe * (float)multiplier;
     this.m_fire      += other.m_fire * (float)multiplier;
     this.m_frost     += other.m_frost * (float)multiplier;
     this.m_lightning += other.m_lightning * (float)multiplier;
     this.m_poison    += other.m_poison * (float)multiplier;
     this.m_spirit    += other.m_spirit * (float)multiplier;
 }
Пример #8
0
            private HitData.DamageTypes SetDamagePerLevelValues()
            {
                HitData.DamageTypes newDamage = new HitData.DamageTypes();
                newDamage.m_blunt     = DamageBluntPerLevel;
                newDamage.m_slash     = DamageSlashPerLevel;
                newDamage.m_pierce    = DamagePiercePerLevel;
                newDamage.m_chop      = DamageChopPerLevel;
                newDamage.m_pickaxe   = DamagePickaxePerLevel;
                newDamage.m_fire      = DamageFirePerLevel;
                newDamage.m_frost     = DamageFrostPerLevel;
                newDamage.m_lightning = DamageLightningPerLevel;
                newDamage.m_poison    = DamagePoisonPerLevel;
                newDamage.m_spirit    = DamageSpiritPerLevel;

                return(newDamage);
            }
Пример #9
0
            private HitData.DamageTypes SetDamageValues()
            {
                HitData.DamageTypes newDamage = new HitData.DamageTypes();
                newDamage.m_blunt     = DamageBlunt;
                newDamage.m_slash     = DamageSlash;
                newDamage.m_pierce    = DamagePierce;
                newDamage.m_chop      = DamageChop;
                newDamage.m_pickaxe   = DamagePickaxe;
                newDamage.m_fire      = DamageFire;
                newDamage.m_frost     = DamageFrost;
                newDamage.m_lightning = DamageLightning;
                newDamage.m_poison    = DamagePoison;
                newDamage.m_spirit    = DamageSpirit;

                return(newDamage);
            }
Пример #10
0
        public static void Postfix(ItemDrop.ItemData __instance, ref HitData.DamageTypes __result)
        {
            if (!__instance.IsMagic())
            {
                return;
            }

            var magicItem = __instance.GetMagicItem();

            // Add damages first
            __result.m_blunt     += GetAddedDamageType(magicItem, MagicEffectType.AddBluntDamage);
            __result.m_slash     += GetAddedDamageType(magicItem, MagicEffectType.AddSlashingDamage);
            __result.m_pierce    += GetAddedDamageType(magicItem, MagicEffectType.AddPiercingDamage);
            __result.m_fire      += GetAddedDamageType(magicItem, MagicEffectType.AddFireDamage);
            __result.m_frost     += GetAddedDamageType(magicItem, MagicEffectType.AddFrostDamage);
            __result.m_lightning += GetAddedDamageType(magicItem, MagicEffectType.AddLightningDamage);
            __result.m_poison    += GetAddedDamageType(magicItem, MagicEffectType.AddPoisonDamage);
            __result.m_spirit    += GetAddedDamageType(magicItem, MagicEffectType.AddSpiritDamage);

            // Then modify
            if (magicItem.HasEffect(MagicEffectType.ModifyPhysicalDamage))
            {
                var totalDamageMod = magicItem.GetTotalEffectValue(MagicEffectType.ModifyPhysicalDamage, 0.01f);
                var modifier       = 1.0f + totalDamageMod;

                __result.m_blunt  *= modifier;
                __result.m_slash  *= modifier;
                __result.m_pierce *= modifier;
            }

            if (magicItem.HasEffect(MagicEffectType.ModifyElementalDamage))
            {
                var totalDamageMod = magicItem.GetTotalEffectValue(MagicEffectType.ModifyElementalDamage, 0.01f);
                var modifier       = 1.0f + totalDamageMod;

                __result.m_fire      *= modifier;
                __result.m_frost     *= modifier;
                __result.m_lightning *= modifier;
            }

            if (magicItem.HasEffect(MagicEffectType.ModifyDamage))
            {
                var totalDamageMod = magicItem.GetTotalEffectValue(MagicEffectType.ModifyDamage, 0.01f);
                __result.Modify(1.0f + totalDamageMod);
            }
        }
Пример #11
0
 private static void CustomDamageCalculations(int newLvl, int oldLvl)
 {
     HitData.DamageTypes oldItem = _item.GetDamage(oldLvl);
     HitData.DamageTypes newItem = _item.GetDamage(newLvl);
     if (newItem.m_damage > oldItem.m_damage)
     {
         _sb.AppendFormat("\n$inventory_damage: <color=silver>{0}</color> {1} <color=orange>{2}</color>", oldItem.m_damage, arrow, newItem.m_damage);
     }
     if (newItem.m_blunt > oldItem.m_blunt)
     {
         _sb.AppendFormat("\n$inventory_blunt: <color=silver>{0}</color> {1} <color=orange>{2}</color>", oldItem.m_blunt, arrow, newItem.m_blunt);
     }
     if (newItem.m_slash > oldItem.m_slash)
     {
         _sb.AppendFormat("\n$inventory_slash: <color=silver>{0}</color> {1} <color=orange>{2}</color>", oldItem.m_slash, arrow, newItem.m_slash);
     }
     if (newItem.m_pierce > oldItem.m_pierce)
     {
         _sb.AppendFormat("\n$inventory_pierce: <color=silver>{0}</color> {1} <color=orange>{2}</color>", oldItem.m_pierce, arrow, newItem.m_pierce);
     }
     if (newItem.m_fire > oldItem.m_fire)
     {
         _sb.AppendFormat("\n$inventory_fire: <color=silver>{0}</color> {1} <color=orange>{2}</color>", oldItem.m_fire, arrow, newItem.m_fire);
     }
     if (newItem.m_frost > oldItem.m_frost)
     {
         _sb.AppendFormat("\n$inventory_frost: <color=silver>{0}</color> {1} <color=orange>{2}</color>", oldItem.m_frost, arrow, newItem.m_frost);
     }
     if (newItem.m_lightning > oldItem.m_lightning)
     {
         _sb.AppendFormat("\n$inventory_lightning: <color=silver>{0}</color> {1} <color=orange>{2}</color>", oldItem.m_lightning, arrow, newItem.m_lightning);
     }
     if (newItem.m_poison > oldItem.m_poison)
     {
         _sb.AppendFormat("\n$inventory_poison: <color=silver>{0}</color> {1} <color=orange>{2}</color>", oldItem.m_poison, arrow, newItem.m_poison);
     }
     if (newItem.m_spirit > oldItem.m_spirit)
     {
         _sb.AppendFormat("\n$inventory_spirit: <color=silver>{0}</color> {1} <color=orange>{2}</color>", oldItem.m_spirit, arrow, newItem.m_spirit);
     }
 }
Пример #12
0
        private static void WeaponStats(Player player, StringBuilder sb)
        {
            ItemDrop.ItemData leftHand  = GetHand(player, true);  // Shield, Torch, 2H
            ItemDrop.ItemData rightHand = GetHand(player, false); // 1H
            ItemDrop.ItemData ammoItem  = player.GetAmmoItem();

            // 1H at right hand, shield left

            // 2H at left hand
            if (leftHand != null)
            {
                if (leftHand.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Shield)
                {
                    // Has shield, weapon in right hand.
                }
                else
                {
                    HitData.DamageTypes hd = leftHand.GetDamage(leftHand.m_quality);

                    if (leftHand.m_shared.m_skillType == Skills.SkillType.Bows && ammoItem != null)
                    {
                        hd.Add(ammoItem.GetDamage()); // Add current ammo to damage calculations.
                    }
                    sb.AppendFormat("{0}", hd.GetTooltipString(leftHand.m_shared.m_skillType));

                    sb.AppendFormat("\n\n$item_knockback: <color=orange>{0}</color>", leftHand.m_shared.m_attackForce);
                    sb.AppendFormat("\n$item_backstab: <color=orange>{0}x</color>", leftHand.m_shared.m_backstabBonus);
                }
            }

            if (rightHand != null)
            {
                HitData.DamageTypes hd = rightHand.GetDamage(rightHand.m_quality);

                // Show Item Damage
                sb.AppendFormat("{0}", hd.GetTooltipString(rightHand.m_shared.m_skillType));
                sb.AppendFormat("\n\n$item_knockback: <color=orange>{0}</color>", rightHand.m_shared.m_attackForce);
                sb.AppendFormat("\n$item_backstab: <color=orange>{0}x</color>", rightHand.m_shared.m_backstabBonus);
            }
        }
        public static string GetDamageTooltipString(MagicItem item, HitData.DamageTypes instance, Skills.SkillType skillType, string magicColor)
        {
            if (Player.m_localPlayer == null)
            {
                return("");
            }

            var allMagic       = item.HasEffect(MagicEffectType.ModifyDamage);
            var physMagic      = item.HasEffect(MagicEffectType.ModifyPhysicalDamage);
            var elemMagic      = item.HasEffect(MagicEffectType.ModifyElementalDamage);
            var bluntMagic     = item.HasEffect(MagicEffectType.AddBluntDamage);
            var slashMagic     = item.HasEffect(MagicEffectType.AddSlashingDamage);
            var pierceMagic    = item.HasEffect(MagicEffectType.AddPiercingDamage);
            var fireMagic      = item.HasEffect(MagicEffectType.AddFireDamage);
            var frostMagic     = item.HasEffect(MagicEffectType.AddFrostDamage);
            var lightningMagic = item.HasEffect(MagicEffectType.AddLightningDamage);
            var poisonMagic    = item.HasEffect(MagicEffectType.AddPoisonDamage);
            var spiritMagic    = item.HasEffect(MagicEffectType.AddSpiritDamage);

            Player.m_localPlayer.GetSkills().GetRandomSkillRange(out var min, out var max, skillType);
            var str = "";

            if (instance.m_damage != 0.0)
            {
                str = str + "\n$inventory_damage: " + DamageRange(instance.m_damage, min, max, allMagic, magicColor);
            }
            if (instance.m_blunt != 0.0)
            {
                var magic = allMagic || physMagic || bluntMagic;
                str = str + "\n$inventory_blunt: " + DamageRange(instance.m_blunt, min, max, magic, magicColor);
            }
            if (instance.m_slash != 0.0)
            {
                var magic = allMagic || physMagic || slashMagic;
                str = str + "\n$inventory_slash: " + DamageRange(instance.m_slash, min, max, magic, magicColor);
            }
            if (instance.m_pierce != 0.0)
            {
                var magic = allMagic || physMagic || pierceMagic;
                str = str + "\n$inventory_pierce: " + DamageRange(instance.m_pierce, min, max, magic, magicColor);
            }
            if (instance.m_fire != 0.0)
            {
                var magic = allMagic || elemMagic || fireMagic;
                str = str + "\n$inventory_fire: " + DamageRange(instance.m_fire, min, max, magic, magicColor);
            }
            if (instance.m_frost != 0.0)
            {
                var magic = allMagic || elemMagic || frostMagic;
                str = str + "\n$inventory_frost: " + DamageRange(instance.m_frost, min, max, magic, magicColor);
            }
            if (instance.m_lightning != 0.0)
            {
                var magic = allMagic || elemMagic || lightningMagic;
                str = str + "\n$inventory_lightning: " + DamageRange(instance.m_lightning, min, max, magic, magicColor);
            }
            if (instance.m_poison != 0.0)
            {
                var magic = allMagic || elemMagic || poisonMagic;
                str = str + "\n$inventory_poison: " + DamageRange(instance.m_poison, min, max, magic, magicColor);
            }
            if (instance.m_spirit != 0.0)
            {
                var magic = allMagic || elemMagic || spiritMagic;
                str = str + "\n$inventory_spirit: " + DamageRange(instance.m_spirit, min, max, magic, magicColor);
            }
            return(str);
        }
Пример #14
0
        public static void SetItemDropDataFromJItemData(ref ItemDrop.ItemData itemData, JItemData data)
        {
            if (data.m_damages != null)
            {
                HitData.DamageTypes damages = new HitData.DamageTypes();
                damages.m_blunt             = data.m_damages.m_blunt;
                damages.m_chop              = data.m_damages.m_chop;
                damages.m_damage            = data.m_damages.m_damage;
                damages.m_fire              = data.m_damages.m_fire;
                damages.m_frost             = data.m_damages.m_frost;
                damages.m_lightning         = data.m_damages.m_lightning;
                damages.m_pickaxe           = data.m_damages.m_pickaxe;
                damages.m_pierce            = data.m_damages.m_pierce;
                damages.m_poison            = data.m_damages.m_poison;
                damages.m_slash             = data.m_damages.m_slash;
                damages.m_spirit            = data.m_damages.m_spirit;
                itemData.m_shared.m_damages = damages;
            }

            if (data.m_damagesPerLevel != null)
            {
                HitData.DamageTypes damagesPerLevel = new HitData.DamageTypes();
                damagesPerLevel.m_blunt             = data.m_damagesPerLevel.m_blunt;
                damagesPerLevel.m_chop              = data.m_damagesPerLevel.m_chop;
                damagesPerLevel.m_damage            = data.m_damagesPerLevel.m_damage;
                damagesPerLevel.m_fire              = data.m_damagesPerLevel.m_fire;
                damagesPerLevel.m_frost             = data.m_damagesPerLevel.m_frost;
                damagesPerLevel.m_lightning         = data.m_damagesPerLevel.m_lightning;
                damagesPerLevel.m_pickaxe           = data.m_damagesPerLevel.m_pickaxe;
                damagesPerLevel.m_pierce            = data.m_damagesPerLevel.m_pierce;
                damagesPerLevel.m_poison            = data.m_damagesPerLevel.m_poison;
                damagesPerLevel.m_slash             = data.m_damagesPerLevel.m_slash;
                damagesPerLevel.m_spirit            = data.m_damagesPerLevel.m_spirit;
                itemData.m_shared.m_damagesPerLevel = damagesPerLevel;
            }


            itemData.m_shared.m_name         = data.m_name;
            itemData.m_shared.m_description  = data.m_description;
            itemData.m_shared.m_weight       = data.m_weight;
            itemData.m_shared.m_maxStackSize = data.m_maxStackSize;
            itemData.m_shared.m_food         = data.m_food;
            itemData.m_shared.m_foodStamina  = data.m_foodStamina;
            itemData.m_shared.m_foodRegen    = data.m_foodRegen;
            itemData.m_shared.m_foodBurnTime = data.m_foodBurnTime;

            if (data.m_foodColor != null && data.m_foodColor != "" && data.m_foodColor.StartsWith("#"))
            {
                itemData.m_shared.m_foodColor = ColorUtil.GetColorFromHex(data.m_foodColor);
            }

            itemData.m_shared.m_armor                   = data.m_armor;
            itemData.m_shared.m_armorPerLevel           = data.m_armorPerLevel;
            itemData.m_shared.m_blockPower              = data.m_blockPower;
            itemData.m_shared.m_blockPowerPerLevel      = data.m_blockPowerPerLevel;
            itemData.m_shared.m_canBeReparied           = data.m_canBeReparied;
            itemData.m_shared.m_timedBlockBonus         = data.m_timedBlockBonus;
            itemData.m_shared.m_deflectionForce         = data.m_deflectionForce;
            itemData.m_shared.m_deflectionForcePerLevel = data.m_deflectionForcePerLevel;
            itemData.m_shared.m_destroyBroken           = data.m_destroyBroken;
            itemData.m_shared.m_dodgeable               = data.m_dodgeable;
            itemData.m_shared.m_maxDurability           = data.m_maxDurability;
            itemData.m_shared.m_durabilityDrain         = data.m_durabilityDrain;
            itemData.m_shared.m_durabilityPerLevel      = data.m_durabilityPerLevel;
            itemData.m_shared.m_equipDuration           = data.m_equipDuration;
            itemData.m_shared.m_holdDurationMin         = data.m_holdDurationMin;
            itemData.m_shared.m_holdStaminaDrain        = data.m_holdStaminaDrain;
            itemData.m_shared.m_maxQuality              = data.m_maxQuality;
            itemData.m_shared.m_useDurability           = data.m_useDurability;
            itemData.m_shared.m_useDurabilityDrain      = data.m_useDurabilityDrain;
            itemData.m_shared.m_questItem               = data.m_questItem;
            itemData.m_shared.m_teleportable            = data.m_teleportable;
            itemData.m_shared.m_toolTier                = data.m_toolTier;
            itemData.m_shared.m_value                   = data.m_value;
        }
Пример #15
0
        public static void Postfix(ItemDrop.ItemData __instance, ref HitData.DamageTypes __result)
        {
            if (!__instance.IsMagic())
            {
                return;
            }

            var magicItem          = __instance.GetMagicItem();
            var magicItemskillType = __instance.m_shared.m_skillType;

            var player = PlayerExtensions.GetPlayerWithEquippedItem(__instance);

            // Add damages first
            __result.m_blunt     += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.AddBluntDamage);
            __result.m_slash     += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.AddSlashingDamage);
            __result.m_pierce    += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.AddPiercingDamage);
            __result.m_fire      += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.AddFireDamage);
            __result.m_frost     += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.AddFrostDamage);
            __result.m_lightning += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.AddLightningDamage);
            __result.m_poison    += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.AddPoisonDamage);
            __result.m_spirit    += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.AddSpiritDamage);

            if (magicItemskillType == Skills.SkillType.Axes)
            {
                __result.m_chop += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.AddSlashingDamage);
            }
            else if (magicItemskillType == Skills.SkillType.Pickaxes)
            {
                __result.m_pickaxe += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.AddPiercingDamage);
            }

            // Then modify
            if (MagicEffectsHelper.HasActiveMagicEffect(player, magicItem, MagicEffectType.ModifyPhysicalDamage))
            {
                var totalDamageMod = MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.ModifyPhysicalDamage, 0.01f);
                var modifier       = 1.0f + totalDamageMod;

                __result.m_blunt   *= modifier;
                __result.m_slash   *= modifier;
                __result.m_pierce  *= modifier;
                __result.m_chop    *= modifier;
                __result.m_pickaxe *= modifier;
            }

            if (MagicEffectsHelper.HasActiveMagicEffect(player, magicItem, MagicEffectType.ModifyElementalDamage))
            {
                var totalDamageMod = MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, MagicEffectType.ModifyElementalDamage, 0.01f);
                var modifier       = 1.0f + totalDamageMod;

                __result.m_fire      *= modifier;
                __result.m_frost     *= modifier;
                __result.m_lightning *= modifier;
                __result.m_poison    *= modifier;
                __result.m_spirit    *= modifier;
            }

            var damageMod = 0f;

            ModifyWithLowHealth.Apply(player, MagicEffectType.ModifyDamage, effect =>
            {
                if (MagicEffectsHelper.HasActiveMagicEffect(player, magicItem, effect))
                {
                    damageMod += MagicEffectsHelper.GetTotalActiveMagicEffectValue(player, magicItem, effect, 0.01f);
                }
            });
            __result.Modify(1.0f + damageMod);

            if (player != null && player.GetSEMan().HaveStatusEffect("BerserkerStatusEffect"))
            {
                var percentLife  = player.GetHealthPercentage();
                var berserkerMod = Mathf.Lerp(2.0f, 0.5f, percentLife);
                __result.Modify(1.0f + berserkerMod);
            }
        }
Пример #16
0
        private static void Postfix(Player __instance, ref Attack ___m_currentAttack, ref float ___m_lastCombatTimer, Rigidbody ___m_body, ZSyncAnimation ___m_zanim,
                                    CharacterAnimEvent ___m_animEvent, VisEquipment ___m_visEquipment, Attack ___m_previousAttack, float ___m_timeSinceLastAttack)
        {
            _hitEffectCooldown -= Time.deltaTime;

            var helm = __instance.GetInventory().GetAllItems().
                       FirstOrDefault(v => v.m_shared.m_name == "$custom_item_laserhelm");

            if (_cam == null)
            {
                _cam = Camera.main;
            }

            if (helm != null && helm.m_equiped)
            {
                var firing      = false;
                var firePressed = Input.GetKey(SurtlingHelm.SurtlingFireKey);
                if (firePressed && (!SurtlingHelm.ConsumeCoresAsFuel.Value || _laserTimeRemaining > 0f))
                {
                    firing = true;
                    _laserTimeRemaining -= Time.deltaTime;
                }
                else if (firePressed)
                {
                    //Look for surtling core in inventory and consume if have, otherwise show error message
                    var cores = __instance.GetInventory().GetAllItems().FirstOrDefault(i => i.m_shared.m_name == "$item_surtlingcore");
                    if (cores == null || cores.m_stack == 0)
                    {
                        MessageHud.instance.ShowMessage(MessageHud.MessageType.Center, Language.LanguageData.NeedResourcesErrorValue);
                    }
                    else
                    {
                        __instance.GetInventory().RemoveOneItem(cores);
                        _laserTimeRemaining = SurtlingHelm.SecondsOfUsageGrantedPerCore.Value;
                        firing = true;
                    }
                }

                if (firing)
                {
                    if (!_wasFiring || _leftEyeBeam == null)
                    {
                        _wasFiring = true;
                        var leftGO = GameObject.Instantiate(AssetHelper.EyeBeamPrefab);
                        _leftEyeBeam = leftGO.transform;

                        var rightGO = GameObject.Instantiate(AssetHelper.EyeBeamPrefab);
                        _rightEyeBeam = rightGO.transform;

                        _shaker                     = _cam.gameObject.AddComponent <CamShaker>();
                        _shaker.m_continous         = true;
                        _shaker.m_continousDuration = 0.75f;
                        _shaker.m_strength          = 1f;
                    }

                    if (__instance.IsPlayer() && helm != null && helm.m_equiped)
                    {
                        var head     = __instance.m_head;
                        var position = head.position + head.up * 0.18f;
                        var forward  = head.right;
                        var right    = head.forward;

                        var dir        = _cam.transform.forward;
                        var startPoint = position + forward * 0.4f;
                        var endPoint   = dir * 60 + _cam.transform.position;

                        _leftEyeBeam.position  = position + right * 0.06f;
                        _rightEyeBeam.position = position - right * 0.06f;
                        _leftEyeBeam.forward   = _rightEyeBeam.forward = dir;

                        bool hasDoneFlash = false;
                        bool didDamage    = false;
                        var  distToPlayer = Vector3.Distance(_cam.transform.position, __instance.transform.position);
                        foreach (var hit in Physics.RaycastAll(_cam.transform.position + dir * distToPlayer, dir, 50f))
                        {
                            var newEndpoint = hit.point;
                            var newDir      = (newEndpoint - position).normalized;
                            _leftEyeBeam.forward = _rightEyeBeam.forward = newDir;

                            if (!hasDoneFlash)
                            {
                                var goOne = GameObject.Instantiate(AssetHelper.EyeHitPrefab, hit.point + right * 0.06f - dir * 0.07f, Quaternion.identity);
                                var goTwo = GameObject.Instantiate(AssetHelper.EyeHitPrefab, hit.point - right * 0.06f - dir * 0.07f, Quaternion.identity);
                                goOne.SetActive(true);
                                goTwo.SetActive(true);
                                hasDoneFlash = true;
                            }

                            if (_hitEffectCooldown <= 0f)
                            {
                                var damageType = new HitData.DamageTypes
                                {
                                    m_damage  = SurtlingHelm.BasePhysicalDamage.Value,
                                    m_fire    = SurtlingHelm.BaseLaserDamage.Value,
                                    m_chop    = SurtlingHelm.ChopDamage.Value,
                                    m_pickaxe = SurtlingHelm.BasePhysicalDamage.Value,
                                };
                                var hitData = new HitData
                                {
                                    m_hitCollider = hit.collider,
                                    m_attacker    = __instance.GetZDOID(),
                                    m_dir         = dir,
                                    m_point       = hit.point,
                                    m_skill       = Skills.SkillType.FireMagic,
                                    m_pushForce   = SurtlingHelm.KnockbackForce.Value,
                                    m_blockable   = true,
                                    m_dodgeable   = false,
                                    m_damage      = damageType
                                };

                                var damagable = hit.collider.gameObject.GetComponent <IDestructible>();
                                if (damagable == null)
                                {
                                    damagable = hit.collider.GetComponentInParent <IDestructible>();
                                }
                                if (damagable == null)
                                {
                                    damagable = hit.collider.gameObject.GetComponentInChildren <IDestructible>();
                                }
                                if (damagable != null)
                                {
                                    damagable.Damage(hitData);
                                    didDamage = true;
                                }
                            }
                        }
                        if (didDamage)
                        {
                            _hitEffectCooldown = SurtlingHelm.LaserHitInterval.Value;
                        }
                    }
                }
                else if (_wasFiring || _leftEyeBeam != null)
                {
                    _wasFiring = false;
                    ZNetScene.instance.m_instances.Remove(_leftEyeBeam.GetComponent <ZNetView>().GetZDO());
                    ZNetScene.instance.m_instances.Remove(_rightEyeBeam.GetComponent <ZNetView>().GetZDO());
                    _leftEyeBeam.GetComponent <ZNetView>().Destroy();
                    _rightEyeBeam.GetComponent <ZNetView>().Destroy();
                    _leftEyeBeam  = null;
                    _rightEyeBeam = null;
                    Object.Destroy(_shaker);
                    _shaker = null;
                }
            }
        }