Ejemplo n.º 1
0
        public static void MineRock5_Damage_Prefix(MineRock5 __instance, HitData hit, out Dictionary <int, Vector3> __state)
        {
            __instance.SetupColliders();
            __state = new Dictionary <int, Vector3>();

            if (Input.GetKey(VeinMine.veinMineKey.Value) && VeinMine.progressiveMode.Value)
            {
                var radiusColliders = Physics.OverlapSphere(hit.m_point, VeinMine.progressiveMult.Value * (float)GetSkillLevel(Player.m_localPlayer.GetSkills(), Skills.SkillType.Pickaxes));

                if (radiusColliders != null)
                {
                    foreach (var area in radiusColliders)
                    {
                        if (__instance.GetAreaIndex(area) >= 0)
                        {
                            __state.Add(__instance.GetAreaIndex(area), __instance.GetHitArea(__instance.GetAreaIndex(area)).m_bound.m_pos +
                                        __instance.GetHitArea(__instance.GetAreaIndex(area)).m_collider.transform.position);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
 public static void MineRock5_Damage_Patch(MineRock5 __instance, ZNetView ___m_nview, List <HitArea> ___m_hitAreas, HitData hit, Dictionary <int, Vector3> __state)
 {
     if (Player.m_localPlayer != null && hit.m_attacker == Player.m_localPlayer.GetZDOID())
     {
         if (Input.GetKey(VeinMine.veinMineKey.Value) && !VeinMine.progressiveMode.Value)
         {
             for (int i = 0; i < (___m_hitAreas.Count <= 128 ? ___m_hitAreas.Count : 128); i++)
             {
                 if (Player.m_localPlayer.GetCurrentWeapon().m_durability > 0 || !Player.m_localPlayer.GetCurrentWeapon().m_shared.m_useDurability)
                 {
                     hit.m_point            = __instance.GetHitArea(i).m_bound.m_pos;
                     hit.m_damage.m_pickaxe = __instance.m_health + 10;
                     try
                     {
                         ___m_nview.InvokeRPC("Damage", new object[]
                         {
                             hit,
                             i
                         });
                     }
                     catch
                     {
                         VeinMine.logger.LogInfo("Skipping section: " + i + ".");
                     }
                 }
             }
         }
         else if (Input.GetKey(VeinMine.veinMineKey.Value) && VeinMine.progressiveMode.Value)
         {
             foreach (var index in __state)
             {
                 hit.m_point = index.Value;
                 if (Player.m_localPlayer.GetCurrentWeapon().m_durability > 0 || !Player.m_localPlayer.GetCurrentWeapon().m_shared.m_useDurability)
                 {
                     try
                     {
                         ___m_nview.InvokeRPC("Damage", new object[]
                         {
                             hit,
                             index.Key
                         });
                     }
                     catch
                     {
                         VeinMine.logger.LogInfo("Skipping section: " + index.Key + ".");
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 3
0
        public static bool MineRock5_DamageArea_Prefix(MineRock5 __instance, HitData hit, int hitAreaIndex, ref EffectList ___m_destroyedEffect, ref EffectList ___m_hitEffect, out float __state, ref bool __result)
        {
            bool isVeinmined = false;

            MineRock5.HitArea hitArea = __instance.GetHitArea(hitAreaIndex);
            __state = hitArea.m_health;

            if (VeinMine.enableSpreadDamage.Value)
            {
                hit = SpreadDamage(hit);
            }
            if (Input.GetKey(VeinMine.veinMineKey.Value))
            {
                isVeinmined = true;
            }

            ZLog.Log("hit mine rock " + hitAreaIndex);
            if (hitArea == null)
            {
                ZLog.Log("Missing hit area " + hitAreaIndex);
                __result = false;
                return(false);
            }
            __instance.LoadHealth();
            if (hitArea.m_health <= 0f)
            {
                ZLog.Log("Already destroyed");
                __result = false;
                return(false);
            }
            HitData.DamageModifier type;
            hit.ApplyResistance(__instance.m_damageModifiers, out type);
            float totalDamage = hit.GetTotalDamage();

            if (hit.m_toolTier < __instance.m_minToolTier)
            {
                DamageText.instance.ShowText(DamageText.TextType.TooHard, hit.m_point, 0f, false);
                __result = false;
                return(false);
            }
            DamageText.instance.ShowText(type, hit.m_point, totalDamage, false);
            if (totalDamage <= 0f)
            {
                __result = false;
                return(false);
            }
            hitArea.m_health -= totalDamage;
            __instance.SaveHealth();
            if (!VeinMine.removeEffects.Value)
            {
                __instance.m_hitEffect.Create(hit.m_point, Quaternion.identity, null, 1f);
            }
            Player closestPlayer = Player.GetClosestPlayer(hit.m_point, 10f);

            if (closestPlayer)
            {
                closestPlayer.AddNoise(100f);
            }
            if (hitArea.m_health <= 0f)
            {
                __instance.m_nview.InvokeRPC(ZNetView.Everybody, "SetAreaHealth", new object[]
                {
                    hitAreaIndex,
                    hitArea.m_health
                });
                if (!VeinMine.removeEffects.Value)
                {
                    __instance.m_destroyedEffect.Create(hit.m_point, Quaternion.identity, null, 1f);
                }
                foreach (GameObject gameObject in __instance.m_dropItems.GetDropList())
                {
                    if (isVeinmined)
                    {
                        Vector3 position = Player.m_localPlayer.GetTransform().position + new Vector3 {
                            x = 0, y = 2, z = 0
                        } +UnityEngine.Random.insideUnitSphere * 0.3f;
                        UnityEngine.Object.Instantiate <GameObject>(gameObject, position, Quaternion.identity);
                        hit.m_point = Player.m_localPlayer.GetTransform().position + new Vector3 {
                            x = 0, y = 2, z = 0
                        };
                    }
                    else if (!isVeinmined)
                    {
                        Vector3 position = hit.m_point + UnityEngine.Random.insideUnitSphere * 0.3f;
                        UnityEngine.Object.Instantiate <GameObject>(gameObject, position, Quaternion.identity);
                    }
                }
                if (__instance.AllDestroyed())
                {
                    __instance.m_nview.Destroy();
                }
                __result = true;
                return(false);
            }
            __result = false;
            return(false);
        }