D:\ValheimDev\Dumps\Old\assembly_valheim\MineRock5.cs D:\ValheimDev\Dumps\Latest\assembly_valheim\MineRock5.cs
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
   
public class MineRock5 : MonoBehaviour, IDestructible, Hoverable public class MineRock5 : MonoBehaviour, IDestructible, Hoverable
{ {
.    private void Start()     private void Awake()
    {     {
        Collider[] componentsInChildren = base.gameObject.GetComponentsInChildren<Collider>();         Collider[] componentsInChildren = base.gameObject.GetComponentsInChildren<Collider>();
        this.m_hitAreas = new List<MineRock5.HitArea>(componentsInChildren.Length);         this.m_hitAreas = new List<MineRock5.HitArea>(componentsInChildren.Length);
        this.m_extraRenderers = new List<Renderer>();         this.m_extraRenderers = new List<Renderer>();
        foreach (Collider collider in componentsInChildren)         foreach (Collider collider in componentsInChildren)
        {         {
            MineRock5.HitArea hitArea = new MineRock5.HitArea();             MineRock5.HitArea hitArea = new MineRock5.HitArea();
            hitArea.m_collider = collider;             hitArea.m_collider = collider;
            hitArea.m_meshFilter = collider.GetComponent<MeshFilter>();             hitArea.m_meshFilter = collider.GetComponent<MeshFilter>();
            hitArea.m_meshRenderer = collider.GetComponent<MeshRenderer>();             hitArea.m_meshRenderer = collider.GetComponent<MeshRenderer>();
            hitArea.m_physics = collider.GetComponent<StaticPhysics>();             hitArea.m_physics = collider.GetComponent<StaticPhysics>();
            hitArea.m_health = this.m_health + (float)Game.m_worldLevel * this.m_health * Game.instance.m_worldLevelMineHPMultiplier;             hitArea.m_health = this.m_health + (float)Game.m_worldLevel * this.m_health * Game.instance.m_worldLevelMineHPMultiplier;
            hitArea.m_baseScale = hitArea.m_collider.transform.localScale.x;             hitArea.m_baseScale = hitArea.m_collider.transform.localScale.x;
            for (int j = 0; j < collider.transform.childCount; j++)             for (int j = 0; j < collider.transform.childCount; j++)
            {             {
                Renderer[] componentsInChildren2 = collider.transform.GetChild(j).GetComponentsInChildren<Renderer>();                 Renderer[] componentsInChildren2 = collider.transform.GetChild(j).GetComponentsInChildren<Renderer>();
                this.m_extraRenderers.AddRange(componentsInChildren2);                 this.m_extraRenderers.AddRange(componentsInChildren2);
            }             }
            this.m_hitAreas.Add(hitArea);             this.m_hitAreas.Add(hitArea);
        }         }
        if (MineRock5.m_rayMask == 0)         if (MineRock5.m_rayMask == 0)
        {         {
            MineRock5.m_rayMask = LayerMask.GetMask(new string[] { "piece", "Default", "static_solid", "Default_small", "terrain" });             MineRock5.m_rayMask = LayerMask.GetMask(new string[] { "piece", "Default", "static_solid", "Default_small", "terrain" });
        }         }
        if (MineRock5.m_groundLayer == 0)         if (MineRock5.m_groundLayer == 0)
        {         {
            MineRock5.m_groundLayer = LayerMask.NameToLayer("terrain");             MineRock5.m_groundLayer = LayerMask.NameToLayer("terrain");
        }         }
        Material[] array = null;         Material[] array = null;
        foreach (MineRock5.HitArea hitArea2 in this.m_hitAreas)         foreach (MineRock5.HitArea hitArea2 in this.m_hitAreas)
        {         {
            if (array == null || hitArea2.m_meshRenderer.sharedMaterials.Length > array.Length)             if (array == null || hitArea2.m_meshRenderer.sharedMaterials.Length > array.Length)
            {             {
                array = hitArea2.m_meshRenderer.sharedMaterials;                 array = hitArea2.m_meshRenderer.sharedMaterials;
            }             }
        }         }
        this.m_meshFilter = base.gameObject.AddComponent<MeshFilter>();         this.m_meshFilter = base.gameObject.AddComponent<MeshFilter>();
        this.m_meshRenderer = base.gameObject.AddComponent<MeshRenderer>();         this.m_meshRenderer = base.gameObject.AddComponent<MeshRenderer>();
        this.m_meshRenderer.sharedMaterials = array;         this.m_meshRenderer.sharedMaterials = array;
        this.m_meshFilter.mesh = new Mesh();         this.m_meshFilter.mesh = new Mesh();
        this.m_meshFilter.name = "___MineRock5 m_meshFilter";         this.m_meshFilter.name = "___MineRock5 m_meshFilter";
        this.m_nview = base.GetComponent<ZNetView>();         this.m_nview = base.GetComponent<ZNetView>();
        if (this.m_nview && this.m_nview.GetZDO() != null)         if (this.m_nview && this.m_nview.GetZDO() != null)
        {         {
.            this.m_nview.Register<HitData, int>("Damage", new Action<long, HitData, int>(this.RPC_Damage));             this.m_nview.Register<HitData, int>("RPC_Damage", new Action<long, HitData, int>(this.RPC_Damage));
            this.m_nview.Register<int, float>("SetAreaHealth", new Action<long, int, float>(this.RPC_SetAreaHealth));             this.m_nview.Register<int, float>("RPC_SetAreaHealth", new Action<long, int, float>(this.RPC_SetAreaHealth));
        }         }
        this.CheckForUpdate();         this.CheckForUpdate();
        base.InvokeRepeating("CheckForUpdate", UnityEngine.Random.Range(5f, 10f), 10f);         base.InvokeRepeating("CheckForUpdate", UnityEngine.Random.Range(5f, 10f), 10f);
    }     }
   
    private void CheckSupport()     private void CheckSupport()
    {     {
        if (!this.m_nview.IsValid() || !this.m_nview.IsOwner())         if (!this.m_nview.IsValid() || !this.m_nview.IsOwner())
        {         {
            return;             return;
        }         }
        this.UpdateSupport();         this.UpdateSupport();
        for (int i = 0; i < this.m_hitAreas.Count; i++)         for (int i = 0; i < this.m_hitAreas.Count; i++)
        {         {
            MineRock5.HitArea hitArea = this.m_hitAreas[i];             MineRock5.HitArea hitArea = this.m_hitAreas[i];
            if (hitArea.m_health > 0f && !hitArea.m_supported)             if (hitArea.m_health > 0f && !hitArea.m_supported)
            {             {
                HitData hitData = new HitData();                 HitData hitData = new HitData();
                hitData.m_damage.m_damage = this.m_health;                 hitData.m_damage.m_damage = this.m_health;
                hitData.m_point = hitArea.m_collider.bounds.center;                 hitData.m_point = hitArea.m_collider.bounds.center;
                hitData.m_toolTier = 100;                 hitData.m_toolTier = 100;
                hitData.m_hitType = HitData.HitType.Structural;                 hitData.m_hitType = HitData.HitType.Structural;
                this.DamageArea(i, hitData);                 this.DamageArea(i, hitData);
            }             }
        }         }
    }     }
   
    private void CheckForUpdate()     private void CheckForUpdate()
    {     {
        if (!this.m_nview.IsValid())         if (!this.m_nview.IsValid())
        {         {
            return;             return;
        }         }
        if (this.m_nview.GetZDO().DataRevision != this.m_lastDataRevision)         if (this.m_nview.GetZDO().DataRevision != this.m_lastDataRevision)
        {         {
            this.LoadHealth();             this.LoadHealth();
            this.UpdateMesh();             this.UpdateMesh();
        }         }
    }     }
   
    private void LoadHealth()     private void LoadHealth()
    {     {
        string @string = this.m_nview.GetZDO().GetString(ZDOVars.s_health, "");         string @string = this.m_nview.GetZDO().GetString(ZDOVars.s_health, "");
        if (@string.Length > 0)         if (@string.Length > 0)
        {         {
            ZPackage zpackage = new ZPackage(Convert.FromBase64String(@string));             ZPackage zpackage = new ZPackage(Convert.FromBase64String(@string));
            int num = zpackage.ReadInt();             int num = zpackage.ReadInt();
            for (int i = 0; i < num; i++)             for (int i = 0; i < num; i++)
            {             {
                float num2 = zpackage.ReadSingle();                 float num2 = zpackage.ReadSingle();
                MineRock5.HitArea hitArea = this.GetHitArea(i);                 MineRock5.HitArea hitArea = this.GetHitArea(i);
                if (hitArea != null)                 if (hitArea != null)
                {                 {
                    hitArea.m_health = num2;                     hitArea.m_health = num2;
                }                 }
            }             }
        }         }
        this.m_lastDataRevision = this.m_nview.GetZDO().DataRevision;         this.m_lastDataRevision = this.m_nview.GetZDO().DataRevision;
    }     }
   
    private void SaveHealth()     private void SaveHealth()
    {     {
        ZPackage zpackage = new ZPackage();         ZPackage zpackage = new ZPackage();
        zpackage.Write(this.m_hitAreas.Count);         zpackage.Write(this.m_hitAreas.Count);
        foreach (MineRock5.HitArea hitArea in this.m_hitAreas)         foreach (MineRock5.HitArea hitArea in this.m_hitAreas)
        {         {
            zpackage.Write(hitArea.m_health);             zpackage.Write(hitArea.m_health);
        }         }
        string text = Convert.ToBase64String(zpackage.GetArray());         string text = Convert.ToBase64String(zpackage.GetArray());
        this.m_nview.GetZDO().Set(ZDOVars.s_health, text);         this.m_nview.GetZDO().Set(ZDOVars.s_health, text);
        this.m_lastDataRevision = this.m_nview.GetZDO().DataRevision;         this.m_lastDataRevision = this.m_nview.GetZDO().DataRevision;
    }     }
   
    private void UpdateMesh()     private void UpdateMesh()
    {     {
        MineRock5.m_tempInstancesA.Clear();         MineRock5.m_tempInstancesA.Clear();
        MineRock5.m_tempInstancesB.Clear();         MineRock5.m_tempInstancesB.Clear();
        Material material = this.m_meshRenderer.sharedMaterials[0];         Material material = this.m_meshRenderer.sharedMaterials[0];
        Matrix4x4 inverse = base.transform.localToWorldMatrix.inverse;         Matrix4x4 inverse = base.transform.localToWorldMatrix.inverse;
        for (int i = 0; i < this.m_hitAreas.Count; i++)         for (int i = 0; i < this.m_hitAreas.Count; i++)
        {         {
            MineRock5.HitArea hitArea = this.m_hitAreas[i];             MineRock5.HitArea hitArea = this.m_hitAreas[i];
            if (hitArea.m_health > 0f)             if (hitArea.m_health > 0f)
            {             {
                CombineInstance combineInstance = default(CombineInstance);                 CombineInstance combineInstance = default(CombineInstance);
                combineInstance.mesh = hitArea.m_meshFilter.sharedMesh;                 combineInstance.mesh = hitArea.m_meshFilter.sharedMesh;
                combineInstance.transform = inverse * hitArea.m_meshFilter.transform.localToWorldMatrix;                 combineInstance.transform = inverse * hitArea.m_meshFilter.transform.localToWorldMatrix;
                for (int j = 0; j < hitArea.m_meshFilter.sharedMesh.subMeshCount; j++)                 for (int j = 0; j < hitArea.m_meshFilter.sharedMesh.subMeshCount; j++)
                {                 {
                    combineInstance.subMeshIndex = j;                     combineInstance.subMeshIndex = j;
                    if (hitArea.m_meshRenderer.sharedMaterials[j] == material)                     if (hitArea.m_meshRenderer.sharedMaterials[j] == material)
                    {                     {
                        MineRock5.m_tempInstancesA.Add(combineInstance);                         MineRock5.m_tempInstancesA.Add(combineInstance);
                    }                     }
                    else                     else
                    {                     {
                        MineRock5.m_tempInstancesB.Add(combineInstance);                         MineRock5.m_tempInstancesB.Add(combineInstance);
                    }                     }
                }                 }
                hitArea.m_meshRenderer.enabled = false;                 hitArea.m_meshRenderer.enabled = false;
                hitArea.m_collider.gameObject.SetActive(true);                 hitArea.m_collider.gameObject.SetActive(true);
            }             }
            else             else
            {             {
                hitArea.m_collider.gameObject.SetActive(false);                 hitArea.m_collider.gameObject.SetActive(false);
            }             }
        }         }
        if (MineRock5.m_tempMeshA == null)         if (MineRock5.m_tempMeshA == null)
        {         {
            MineRock5.m_tempMeshA = new Mesh();             MineRock5.m_tempMeshA = new Mesh();
            MineRock5.m_tempMeshB = new Mesh();             MineRock5.m_tempMeshB = new Mesh();
            MineRock5.m_tempMeshA.name = "___MineRock5 m_tempMeshA";             MineRock5.m_tempMeshA.name = "___MineRock5 m_tempMeshA";
            MineRock5.m_tempMeshB.name = "___MineRock5 m_tempMeshB";             MineRock5.m_tempMeshB.name = "___MineRock5 m_tempMeshB";
        }         }
        MineRock5.m_tempMeshA.CombineMeshes(MineRock5.m_tempInstancesA.ToArray());         MineRock5.m_tempMeshA.CombineMeshes(MineRock5.m_tempInstancesA.ToArray());
        MineRock5.m_tempMeshB.CombineMeshes(MineRock5.m_tempInstancesB.ToArray());         MineRock5.m_tempMeshB.CombineMeshes(MineRock5.m_tempInstancesB.ToArray());
        CombineInstance combineInstance2 = default(CombineInstance);         CombineInstance combineInstance2 = default(CombineInstance);
        combineInstance2.mesh = MineRock5.m_tempMeshA;         combineInstance2.mesh = MineRock5.m_tempMeshA;
        CombineInstance combineInstance3 = default(CombineInstance);         CombineInstance combineInstance3 = default(CombineInstance);
        combineInstance3.mesh = MineRock5.m_tempMeshB;         combineInstance3.mesh = MineRock5.m_tempMeshB;
        this.m_meshFilter.mesh.CombineMeshes(new CombineInstance[] { combineInstance2, combineInstance3 }, false, false);         this.m_meshFilter.mesh.CombineMeshes(new CombineInstance[] { combineInstance2, combineInstance3 }, false, false);
        this.m_meshRenderer.enabled = true;         this.m_meshRenderer.enabled = true;
        Renderer[] array = new Renderer[this.m_extraRenderers.Count + 1];         Renderer[] array = new Renderer[this.m_extraRenderers.Count + 1];
        this.m_extraRenderers.CopyTo(0, array, 0, this.m_extraRenderers.Count);         this.m_extraRenderers.CopyTo(0, array, 0, this.m_extraRenderers.Count);
        array[array.Length - 1] = this.m_meshRenderer;         array[array.Length - 1] = this.m_meshRenderer;
        LODGroup component = base.gameObject.GetComponent<LODGroup>();         LODGroup component = base.gameObject.GetComponent<LODGroup>();
        LOD[] lods = component.GetLODs();         LOD[] lods = component.GetLODs();
        lods[0].renderers = array;         lods[0].renderers = array;
        component.SetLODs(lods);         component.SetLODs(lods);
    }     }
   
    public string GetHoverText()     public string GetHoverText()
    {     {
        return Localization.instance.Localize(this.m_name);         return Localization.instance.Localize(this.m_name);
    }     }
   
    public string GetHoverName()     public string GetHoverName()
    {     {
        return this.m_name;         return this.m_name;
    }     }
   
    public DestructibleType GetDestructibleType()     public DestructibleType GetDestructibleType()
    {     {
        return DestructibleType.Default;         return DestructibleType.Default;
    }     }
   
    public void Damage(HitData hit)     public void Damage(HitData hit)
    {     {
        if (this.m_nview == null || !this.m_nview.IsValid())         if (this.m_nview == null || !this.m_nview.IsValid())
        {         {
            return;             return;
        }         }
        if (this.m_hitAreas == null)         if (this.m_hitAreas == null)
        {         {
            return;             return;
        }         }
.        if (hit.m_hitCollider == null)         if (hit.m_hitCollider == null || hit.m_radius > 0f)
        {         {
.            ZLog.Log("Minerock hit has no collider");             int num = 0;
              MineRock5.m_tempColliderSet.Clear(); 
              int num2 = Physics.OverlapSphereNonAlloc(hit.m_point, (hit.m_radius > 0f) ? hit.m_radius : 0.05f, MineRock5.m_tempColliders, MineRock5.m_rayMask); 
              for (int i = 0; i < num2; i++) 
              { 
                  if (MineRock5.m_tempColliders[i].transform.parent == base.transform || MineRock5.m_tempColliders[i].transform.parent.parent == base.transform) 
                  { 
                      MineRock5.m_tempColliderSet.Add(MineRock5.m_tempColliders[i]); 
                  } 
              } 
              if (MineRock5.m_tempColliderSet.Count > 0) 
              { 
                  foreach (Collider collider in MineRock5.m_tempColliderSet) 
                  { 
                      int areaIndex = this.GetAreaIndex(collider); 
                      if (areaIndex >= 0) 
                      { 
                          num++; 
                          this.m_nview.InvokeRPC("RPC_Damage", new object[] { hit, areaIndex }); 
                          if (this.m_allDestroyed) 
                          { 
                              return; 
                          } 
                      } 
                  } 
              } 
              if (num == 0) 
              { 
                  ZLog.Log("Minerock hit has no collider or invalid hit area on " + base.gameObject.name); 
              } 
            return;             return;
        }         }
.        int areaIndex = this.GetAreaIndex(hit.m_hitCollider);         int areaIndex2 = this.GetAreaIndex(hit.m_hitCollider);
        if (areaIndex == -1)         if (areaIndex2 < 0)
        {         {
            ZLog.Log("Invalid hit area on " + base.gameObject.name);             ZLog.Log("Invalid hit area on " + base.gameObject.name);
            return;             return;
        }         }
.        this.m_nview.InvokeRPC("Damage", new object[] { hit, areaIndex });         this.m_nview.InvokeRPC("RPC_Damage", new object[] { hit, areaIndex2 });
    }     }
   
    private void RPC_Damage(long sender, HitData hit, int hitAreaIndex)     private void RPC_Damage(long sender, HitData hit, int hitAreaIndex)
    {     {
.        if (!this.m_nview.IsValid())         if (this.m_nview == null || !this.m_nview.IsValid())
        {         {
            return;             return;
        }         }
        if (!this.m_nview.IsOwner())         if (!this.m_nview.IsOwner())
        {         {
            return;             return;
        }         }
        bool flag = this.DamageArea(hitAreaIndex, hit);         bool flag = this.DamageArea(hitAreaIndex, hit);
        if (flag && this.m_supportCheck)         if (flag && this.m_supportCheck)
        {         {
            this.CheckSupport();             this.CheckSupport();
        }         }
        if (this.m_triggerPrivateArea)         if (this.m_triggerPrivateArea)
        {         {
            Character attacker = hit.GetAttacker();             Character attacker = hit.GetAttacker();
            if (attacker != null)             if (attacker != null)
            {             {
                PrivateArea.OnObjectDamaged(base.transform.position, attacker, flag);                 PrivateArea.OnObjectDamaged(base.transform.position, attacker, flag);
            }             }
        }         }
    }     }
   
    private bool DamageArea(int hitAreaIndex, HitData hit)     private bool DamageArea(int hitAreaIndex, HitData hit)
    {     {
        ZLog.Log("hit mine rock " + hitAreaIndex.ToString());         ZLog.Log("hit mine rock " + hitAreaIndex.ToString());
        MineRock5.HitArea hitArea = this.GetHitArea(hitAreaIndex);         MineRock5.HitArea hitArea = this.GetHitArea(hitAreaIndex);
        if (hitArea == null)         if (hitArea == null)
        {         {
            ZLog.Log("Missing hit area " + hitAreaIndex.ToString());             ZLog.Log("Missing hit area " + hitAreaIndex.ToString());
            return false;             return false;
        }         }
        this.LoadHealth();         this.LoadHealth();
        if (hitArea.m_health <= 0f)         if (hitArea.m_health <= 0f)
        {         {
            ZLog.Log("Already destroyed");             ZLog.Log("Already destroyed");
            return false;             return false;
        }         }
        HitData.DamageModifier damageModifier;         HitData.DamageModifier damageModifier;
        hit.ApplyResistance(this.m_damageModifiers, out damageModifier);         hit.ApplyResistance(this.m_damageModifiers, out damageModifier);
        float totalDamage = hit.GetTotalDamage();         float totalDamage = hit.GetTotalDamage();
.        if ((int)hit.m_toolTier < this.m_minToolTier || ((int)hit.m_itemWorldLevel < Game.m_worldLevel && ZoneSystem.instance.GetGlobalKey(GlobalKeys.WorldLevelLockedTools)))          Vector3 vector = ((this.m_hitEffectAreaCenter && hitArea.m_collider != null) ? hitArea.m_collider.bounds.center : hit.m_point); 
          if (!hit.CheckToolTier(this.m_minToolTier, false)) 
        {         {
.            DamageText.instance.ShowText(DamageText.TextType.TooHard, hit.m_point, 0f, false);             DamageText.instance.ShowText(DamageText.TextType.TooHard, vector, 0f, false);
            return false;             return false;
        }         }
.        DamageText.instance.ShowText(damageModifier, hit.m_point, totalDamage, false);         DamageText.instance.ShowText(damageModifier, vector, totalDamage, false);
        if (totalDamage <= 0f)         if (totalDamage <= 0f)
        {         {
            return false;             return false;
        }         }
        hitArea.m_health -= totalDamage;         hitArea.m_health -= totalDamage;
        this.SaveHealth();         this.SaveHealth();
.        this.m_hitEffect.Create(hit.m_point, Quaternion.identity, null, 1f, -1);         this.m_hitEffect.Create(vector, Quaternion.identity, null, 1f, -1);
        Player closestPlayer = Player.GetClosestPlayer(hit.m_point, 10f);          if (hit.m_hitType != HitData.HitType.CinderFire) 
        if (closestPlayer)   
        {         {
.            closestPlayer.AddNoise(100f);             Player closestPlayer = Player.GetClosestPlayer(vector, 10f); 
              if (closestPlayer != null) 
              { 
                  closestPlayer.AddNoise(100f);
              } 
        }         }
        if (hit.GetAttacker() == Player.m_localPlayer)         if (hit.GetAttacker() == Player.m_localPlayer)
        {         {
            Game.instance.IncrementPlayerStat(PlayerStatType.MineHits, 1f);             Game.instance.IncrementPlayerStat(PlayerStatType.MineHits, 1f);
        }         }
        if (hitArea.m_health <= 0f)         if (hitArea.m_health <= 0f)
        {         {
.            this.m_nview.InvokeRPC(ZNetView.Everybody, "SetAreaHealth", new object[] { hitAreaIndex, hitArea.m_health });             this.m_nview.InvokeRPC(ZNetView.Everybody, "RPC_SetAreaHealth", new object[] { hitAreaIndex, hitArea.m_health });
            this.m_destroyedEffect.Create(hit.m_point, Quaternion.identity, null, 1f, -1);             this.m_destroyedEffect.Create(vector, Quaternion.identity, null, 1f, -1);
            foreach (GameObject gameObject in this.m_dropItems.GetDropList())             foreach (GameObject gameObject in this.m_dropItems.GetDropList())
            {             {
.                Vector3 vector = hit.m_point + UnityEngine.Random.insideUnitSphere * 0.3f;                 Vector3 vector2 = vector + UnityEngine.Random.insideUnitSphere * 0.3f;
                UnityEngine.Object.Instantiate<GameObject>(gameObject, vector, Quaternion.identity);                 UnityEngine.Object.Instantiate<GameObject>(gameObject, vector2, Quaternion.identity);
                ItemDrop.OnCreateNew(gameObject);                 ItemDrop.OnCreateNew(gameObject);
            }             }
            if (this.AllDestroyed())             if (this.AllDestroyed())
            {             {
                this.m_nview.Destroy();                 this.m_nview.Destroy();
.                  this.m_allDestroyed = true;
            }             }
            if (hit.GetAttacker() == Player.m_localPlayer)             if (hit.GetAttacker() == Player.m_localPlayer)
            {             {
                Game.instance.IncrementPlayerStat(PlayerStatType.Mines, 1f);                 Game.instance.IncrementPlayerStat(PlayerStatType.Mines, 1f);
                switch (this.m_minToolTier)                 switch (this.m_minToolTier)
                {                 {
                case 0:                 case 0:
                    Game.instance.IncrementPlayerStat(PlayerStatType.MineTier0, 1f);                     Game.instance.IncrementPlayerStat(PlayerStatType.MineTier0, 1f);
                    break;                     break;
                case 1:                 case 1:
                    Game.instance.IncrementPlayerStat(PlayerStatType.MineTier1, 1f);                     Game.instance.IncrementPlayerStat(PlayerStatType.MineTier1, 1f);
                    break;                     break;
                case 2:                 case 2:
                    Game.instance.IncrementPlayerStat(PlayerStatType.MineTier2, 1f);                     Game.instance.IncrementPlayerStat(PlayerStatType.MineTier2, 1f);
                    break;                     break;
                case 3:                 case 3:
                    Game.instance.IncrementPlayerStat(PlayerStatType.MineTier3, 1f);                     Game.instance.IncrementPlayerStat(PlayerStatType.MineTier3, 1f);
                    break;                     break;
                case 4:                 case 4:
                    Game.instance.IncrementPlayerStat(PlayerStatType.MineTier4, 1f);                     Game.instance.IncrementPlayerStat(PlayerStatType.MineTier4, 1f);
                    break;                     break;
                case 5:                 case 5:
                    Game.instance.IncrementPlayerStat(PlayerStatType.MineTier5, 1f);                     Game.instance.IncrementPlayerStat(PlayerStatType.MineTier5, 1f);
                    break;                     break;
                default:                 default:
                    ZLog.LogWarning("No stat for mine tier: " + this.m_minToolTier.ToString());                     ZLog.LogWarning("No stat for mine tier: " + this.m_minToolTier.ToString());
                    break;                     break;
                }                 }
            }             }
            return true;             return true;
        }         }
        return false;         return false;
    }     }
   
    private bool AllDestroyed()     private bool AllDestroyed()
    {     {
        for (int i = 0; i < this.m_hitAreas.Count; i++)         for (int i = 0; i < this.m_hitAreas.Count; i++)
        {         {
            if (this.m_hitAreas[i].m_health > 0f)             if (this.m_hitAreas[i].m_health > 0f)
            {             {
                return false;                 return false;
            }             }
        }         }
        return true;         return true;
    }     }
   
    private bool NonDestroyed()     private bool NonDestroyed()
    {     {
        for (int i = 0; i < this.m_hitAreas.Count; i++)         for (int i = 0; i < this.m_hitAreas.Count; i++)
        {         {
            if (this.m_hitAreas[i].m_health <= 0f)             if (this.m_hitAreas[i].m_health <= 0f)
            {             {
                return false;                 return false;
            }             }
        }         }
        return true;         return true;
    }     }
   
    private void RPC_SetAreaHealth(long sender, int index, float health)     private void RPC_SetAreaHealth(long sender, int index, float health)
    {     {
        MineRock5.HitArea hitArea = this.GetHitArea(index);         MineRock5.HitArea hitArea = this.GetHitArea(index);
        if (hitArea != null)         if (hitArea != null)
        {         {
            hitArea.m_health = health;             hitArea.m_health = health;
        }         }
        this.UpdateMesh();         this.UpdateMesh();
    }     }
   
    private int GetAreaIndex(Collider area)     private int GetAreaIndex(Collider area)
    {     {
        for (int i = 0; i < this.m_hitAreas.Count; i++)         for (int i = 0; i < this.m_hitAreas.Count; i++)
        {         {
            if (this.m_hitAreas[i].m_collider == area)             if (this.m_hitAreas[i].m_collider == area)
            {             {
                return i;                 return i;
            }             }
        }         }
        return -1;         return -1;
    }     }
   
    private MineRock5.HitArea GetHitArea(int index)     private MineRock5.HitArea GetHitArea(int index)
    {     {
        if (index < 0 || index >= this.m_hitAreas.Count)         if (index < 0 || index >= this.m_hitAreas.Count)
        {         {
            return null;             return null;
        }         }
        return this.m_hitAreas[index];         return this.m_hitAreas[index];
    }     }
   
    private void UpdateSupport()     private void UpdateSupport()
    {     {
        float realtimeSinceStartup = Time.realtimeSinceStartup;         float realtimeSinceStartup = Time.realtimeSinceStartup;
        if (!this.m_haveSetupBounds)         if (!this.m_haveSetupBounds)
        {         {
            this.SetupColliders();             this.SetupColliders();
            this.m_haveSetupBounds = true;             this.m_haveSetupBounds = true;
        }         }
        foreach (MineRock5.HitArea hitArea in this.m_hitAreas)         foreach (MineRock5.HitArea hitArea in this.m_hitAreas)
        {         {
            hitArea.m_supported = false;             hitArea.m_supported = false;
        }         }
        Vector3 position = base.transform.position;         Vector3 position = base.transform.position;
        for (int i = 0; i < 3; i++)         for (int i = 0; i < 3; i++)
        {         {
            foreach (MineRock5.HitArea hitArea2 in this.m_hitAreas)             foreach (MineRock5.HitArea hitArea2 in this.m_hitAreas)
            {             {
                if (!hitArea2.m_supported)                 if (!hitArea2.m_supported)
                {                 {
                    int num = Physics.OverlapBoxNonAlloc(position + hitArea2.m_bound.m_pos, hitArea2.m_bound.m_size, MineRock5.m_tempColliders, hitArea2.m_bound.m_rot, MineRock5.m_rayMask);                     int num = Physics.OverlapBoxNonAlloc(position + hitArea2.m_bound.m_pos, hitArea2.m_bound.m_size, MineRock5.m_tempColliders, hitArea2.m_bound.m_rot, MineRock5.m_rayMask);
                    for (int j = 0; j < num; j++)                     for (int j = 0; j < num; j++)
                    {                     {
                        Collider collider = MineRock5.m_tempColliders[j];                         Collider collider = MineRock5.m_tempColliders[j];
                        if (!(collider == hitArea2.m_collider) && !(collider.attachedRigidbody != null) && !collider.isTrigger)                         if (!(collider == hitArea2.m_collider) && !(collider.attachedRigidbody != null) && !collider.isTrigger)
                        {                         {
                            hitArea2.m_supported = hitArea2.m_supported || this.GetSupport(collider);                             hitArea2.m_supported = hitArea2.m_supported || this.GetSupport(collider);
                            if (hitArea2.m_supported)                             if (hitArea2.m_supported)
                            {                             {
                                break;                                 break;
                            }                             }
                        }                         }
                    }                     }
                }                 }
            }             }
        }         }
        ZLog.Log("Suport time " + ((Time.realtimeSinceStartup - realtimeSinceStartup) * 1000f).ToString());         ZLog.Log("Suport time " + ((Time.realtimeSinceStartup - realtimeSinceStartup) * 1000f).ToString());
    }     }
   
    private bool GetSupport(Collider c)     private bool GetSupport(Collider c)
    {     {
        if (c.gameObject.layer == MineRock5.m_groundLayer)         if (c.gameObject.layer == MineRock5.m_groundLayer)
        {         {
            return true;             return true;
        }         }
        IDestructible componentInParent = c.gameObject.GetComponentInParent<IDestructible>();         IDestructible componentInParent = c.gameObject.GetComponentInParent<IDestructible>();
        if (componentInParent != null)         if (componentInParent != null)
        {         {
            if (componentInParent == this)             if (componentInParent == this)
            {             {
                foreach (MineRock5.HitArea hitArea in this.m_hitAreas)                 foreach (MineRock5.HitArea hitArea in this.m_hitAreas)
                {                 {
                    if (hitArea.m_collider == c)                     if (hitArea.m_collider == c)
                    {                     {
                        return hitArea.m_supported;                         return hitArea.m_supported;
                    }                     }
                }                 }
            }             }
            return c.transform.position.y < base.transform.position.y;             return c.transform.position.y < base.transform.position.y;
        }         }
        return true;         return true;
    }     }
   
    private void SetupColliders()     private void SetupColliders()
    {     {
        Vector3 position = base.transform.position;         Vector3 position = base.transform.position;
        foreach (MineRock5.HitArea hitArea in this.m_hitAreas)         foreach (MineRock5.HitArea hitArea in this.m_hitAreas)
        {         {
            hitArea.m_bound.m_rot = Quaternion.identity;             hitArea.m_bound.m_rot = Quaternion.identity;
            hitArea.m_bound.m_pos = hitArea.m_collider.bounds.center - position;             hitArea.m_bound.m_pos = hitArea.m_collider.bounds.center - position;
            hitArea.m_bound.m_size = hitArea.m_collider.bounds.size * 0.5f;             hitArea.m_bound.m_size = hitArea.m_collider.bounds.size * 0.5f;
        }         }
    }     }
   
    private static Mesh m_tempMeshA;     private static Mesh m_tempMeshA;
   
    private static Mesh m_tempMeshB;     private static Mesh m_tempMeshB;
   
    private static List<CombineInstance> m_tempInstancesA = new List<CombineInstance>();     private static List<CombineInstance> m_tempInstancesA = new List<CombineInstance>();
   
    private static List<CombineInstance> m_tempInstancesB = new List<CombineInstance>();     private static List<CombineInstance> m_tempInstancesB = new List<CombineInstance>();
   
    public string m_name = "";     public string m_name = "";
   
    public float m_health = 2f;     public float m_health = 2f;
   
    public HitData.DamageModifiers m_damageModifiers;     public HitData.DamageModifiers m_damageModifiers;
   
    public int m_minToolTier;     public int m_minToolTier;
   
    public bool m_supportCheck = true;     public bool m_supportCheck = true;
   
    public bool m_triggerPrivateArea;     public bool m_triggerPrivateArea;
   
    public EffectList m_destroyedEffect = new EffectList();     public EffectList m_destroyedEffect = new EffectList();
   
    public EffectList m_hitEffect = new EffectList();     public EffectList m_hitEffect = new EffectList();
   
    public DropTable m_dropItems;     public DropTable m_dropItems;
   
.      public bool m_hitEffectAreaCenter = true;
   
    private List<MineRock5.HitArea> m_hitAreas;     private List<MineRock5.HitArea> m_hitAreas;
   
    private List<Renderer> m_extraRenderers;     private List<Renderer> m_extraRenderers;
   
    private bool m_haveSetupBounds;     private bool m_haveSetupBounds;
   
    private ZNetView m_nview;     private ZNetView m_nview;
   
    private MeshFilter m_meshFilter;     private MeshFilter m_meshFilter;
   
    private MeshRenderer m_meshRenderer;     private MeshRenderer m_meshRenderer;
   
    private uint m_lastDataRevision = uint.MaxValue;     private uint m_lastDataRevision = uint.MaxValue;
   
    private const int m_supportIterations = 3;     private const int m_supportIterations = 3;
   
.      private bool m_allDestroyed;
   
    private static int m_rayMask = 0;     private static int m_rayMask = 0;
   
    private static int m_groundLayer = 0;     private static int m_groundLayer = 0;
   
    private static Collider[] m_tempColliders = new Collider[128];     private static Collider[] m_tempColliders = new Collider[128];
.   
      private static HashSet<Collider> m_tempColliderSet = new HashSet<Collider>();
   
    private struct BoundData     private struct BoundData
    {     {
        public Vector3 m_pos;         public Vector3 m_pos;
   
        public Quaternion m_rot;         public Quaternion m_rot;
   
        public Vector3 m_size;         public Vector3 m_size;
    }     }
   
    private class HitArea     private class HitArea
    {     {
        public Collider m_collider;         public Collider m_collider;
   
        public MeshRenderer m_meshRenderer;         public MeshRenderer m_meshRenderer;
   
        public MeshFilter m_meshFilter;         public MeshFilter m_meshFilter;
   
        public StaticPhysics m_physics;         public StaticPhysics m_physics;
   
        public float m_health;         public float m_health;
   
        public MineRock5.BoundData m_bound;         public MineRock5.BoundData m_bound;
   
        public bool m_supported;         public bool m_supported;
   
        public float m_baseScale;         public float m_baseScale;
    }     }
} }