예제 #1
0
    // Token: 0x06000E26 RID: 3622 RVA: 0x0006500C File Offset: 0x0006320C
    private bool DamageArea(int hitAreaIndex, HitData hit)
    {
        ZLog.Log("hit mine rock " + hitAreaIndex);
        MineRock5.HitArea hitArea = this.GetHitArea(hitAreaIndex);
        if (hitArea == null)
        {
            ZLog.Log("Missing hit area " + hitAreaIndex);
            return(false);
        }
        this.LoadHealth();
        if (hitArea.m_health <= 0f)
        {
            ZLog.Log("Already destroyed");
            return(false);
        }
        HitData.DamageModifier type;
        hit.ApplyResistance(this.m_damageModifiers, out type);
        float totalDamage = hit.GetTotalDamage();

        if (hit.m_toolTier < this.m_minToolTier)
        {
            DamageText.instance.ShowText(DamageText.TextType.TooHard, hit.m_point, 0f, false);
            return(false);
        }
        DamageText.instance.ShowText(type, hit.m_point, totalDamage, false);
        if (totalDamage <= 0f)
        {
            return(false);
        }
        hitArea.m_health -= totalDamage;
        this.SaveHealth();
        this.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)
        {
            this.m_nview.InvokeRPC(ZNetView.Everybody, "SetAreaHealth", new object[]
            {
                hitAreaIndex,
                hitArea.m_health
            });
            this.m_destroyedEffect.Create(hit.m_point, Quaternion.identity, null, 1f);
            foreach (GameObject original in this.m_dropItems.GetDropList())
            {
                Vector3 position = hit.m_point + UnityEngine.Random.insideUnitSphere * 0.3f;
                UnityEngine.Object.Instantiate <GameObject>(original, position, Quaternion.identity);
            }
            if (this.AllDestroyed())
            {
                this.m_nview.Destroy();
            }
            return(true);
        }
        return(false);
    }
예제 #2
0
 // Token: 0x06000E1B RID: 3611 RVA: 0x00064874 File Offset: 0x00062A74
 private void Start()
 {
     Collider[] componentsInChildren = base.gameObject.GetComponentsInChildren <Collider>();
     this.m_hitAreas       = new List <MineRock5.HitArea>(componentsInChildren.Length);
     this.m_extraRenderers = new List <Renderer>();
     foreach (Collider collider in componentsInChildren)
     {
         MineRock5.HitArea hitArea = new MineRock5.HitArea();
         hitArea.m_collider     = collider;
         hitArea.m_meshFilter   = collider.GetComponent <MeshFilter>();
         hitArea.m_meshRenderer = collider.GetComponent <MeshRenderer>();
         hitArea.m_physics      = collider.GetComponent <StaticPhysics>();
         hitArea.m_health       = this.m_health;
         hitArea.m_baseScale    = hitArea.m_collider.transform.localScale.x;
         for (int j = 0; j < collider.transform.childCount; j++)
         {
             Renderer[] componentsInChildren2 = collider.transform.GetChild(j).GetComponentsInChildren <Renderer>();
             this.m_extraRenderers.AddRange(componentsInChildren2);
         }
         this.m_hitAreas.Add(hitArea);
     }
     if (MineRock5.m_rayMask == 0)
     {
         MineRock5.m_rayMask = LayerMask.GetMask(new string[]
         {
             "piece",
             "Default",
             "static_solid",
             "Default_small",
             "terrain"
         });
     }
     if (MineRock5.m_groundLayer == 0)
     {
         MineRock5.m_groundLayer = LayerMask.NameToLayer("terrain");
     }
     Material[] array = null;
     foreach (MineRock5.HitArea hitArea2 in this.m_hitAreas)
     {
         if (array == null || hitArea2.m_meshRenderer.sharedMaterials.Length > array.Length)
         {
             array = hitArea2.m_meshRenderer.sharedMaterials;
         }
     }
     this.m_meshFilter   = base.gameObject.AddComponent <MeshFilter>();
     this.m_meshRenderer = base.gameObject.AddComponent <MeshRenderer>();
     this.m_meshRenderer.sharedMaterials = array;
     this.m_meshFilter.mesh = new Mesh();
     this.m_nview           = base.GetComponent <ZNetView>();
     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 <int, float>("SetAreaHealth", new Action <long, int, float>(this.RPC_SetAreaHealth));
     }
     this.CheckForUpdate();
     base.InvokeRepeating("CheckForUpdate", UnityEngine.Random.Range(5f, 10f), 10f);
 }
예제 #3
0
 // Token: 0x06000E29 RID: 3625 RVA: 0x00065280 File Offset: 0x00063480
 private void RPC_SetAreaHealth(long sender, int index, float health)
 {
     MineRock5.HitArea hitArea = this.GetHitArea(index);
     if (hitArea != null)
     {
         hitArea.m_health = health;
     }
     this.UpdateMesh();
 }
예제 #4
0
 // Token: 0x06000E1C RID: 3612 RVA: 0x00064AE4 File Offset: 0x00062CE4
 private void CheckSupport()
 {
     if (!this.m_nview.IsValid() || !this.m_nview.IsOwner())
     {
         return;
     }
     this.UpdateSupport();
     for (int i = 0; i < this.m_hitAreas.Count; i++)
     {
         MineRock5.HitArea hitArea = this.m_hitAreas[i];
         if (hitArea.m_health > 0f && !hitArea.m_supported)
         {
             HitData hitData = new HitData();
             hitData.m_damage.m_damage = this.m_health;
             hitData.m_point           = hitArea.m_collider.bounds.center;
             this.DamageArea(i, hitData);
         }
     }
 }
예제 #5
0
 // Token: 0x06000E1E RID: 3614 RVA: 0x00064BB8 File Offset: 0x00062DB8
 private void LoadHealth()
 {
     byte[] byteArray = this.m_nview.GetZDO().GetByteArray("health");
     if (byteArray != null)
     {
         ZPackage zpackage = new ZPackage(byteArray);
         int      num      = zpackage.ReadInt();
         for (int i = 0; i < num; i++)
         {
             float             health  = zpackage.ReadSingle();
             MineRock5.HitArea hitArea = this.GetHitArea(i);
             if (hitArea != null)
             {
                 hitArea.m_health = health;
             }
         }
     }
     this.m_lastDataRevision = this.m_nview.GetZDO().m_dataRevision;
 }
예제 #6
0
    // Token: 0x06000E20 RID: 3616 RVA: 0x00064CCC File Offset: 0x00062ECC
    private void UpdateMesh()
    {
        MineRock5.m_tempInstancesA.Clear();
        MineRock5.m_tempInstancesB.Clear();
        Material  y       = this.m_meshRenderer.sharedMaterials[0];
        Matrix4x4 inverse = base.transform.localToWorldMatrix.inverse;

        for (int i = 0; i < this.m_hitAreas.Count; i++)
        {
            MineRock5.HitArea hitArea = this.m_hitAreas[i];
            if (hitArea.m_health > 0f)
            {
                CombineInstance item = default(CombineInstance);
                item.mesh      = hitArea.m_meshFilter.sharedMesh;
                item.transform = inverse * hitArea.m_meshFilter.transform.localToWorldMatrix;
                for (int j = 0; j < hitArea.m_meshFilter.sharedMesh.subMeshCount; j++)
                {
                    item.subMeshIndex = j;
                    if (hitArea.m_meshRenderer.sharedMaterials[j] == y)
                    {
                        MineRock5.m_tempInstancesA.Add(item);
                    }
                    else
                    {
                        MineRock5.m_tempInstancesB.Add(item);
                    }
                }
                hitArea.m_meshRenderer.enabled = false;
                hitArea.m_collider.gameObject.SetActive(true);
            }
            else
            {
                hitArea.m_collider.gameObject.SetActive(false);
            }
        }
        if (MineRock5.m_tempMeshA == null)
        {
            MineRock5.m_tempMeshA = new Mesh();
            MineRock5.m_tempMeshB = new Mesh();
        }
        MineRock5.m_tempMeshA.CombineMeshes(MineRock5.m_tempInstancesA.ToArray());
        MineRock5.m_tempMeshB.CombineMeshes(MineRock5.m_tempInstancesB.ToArray());
        CombineInstance combineInstance = default(CombineInstance);

        combineInstance.mesh = MineRock5.m_tempMeshA;
        CombineInstance combineInstance2 = default(CombineInstance);

        combineInstance2.mesh = MineRock5.m_tempMeshB;
        this.m_meshFilter.mesh.CombineMeshes(new CombineInstance[]
        {
            combineInstance,
            combineInstance2
        }, false, false);
        this.m_meshRenderer.enabled = true;
        Renderer[] array = new Renderer[this.m_extraRenderers.Count + 1];
        this.m_extraRenderers.CopyTo(0, array, 0, this.m_extraRenderers.Count);
        array[array.Length - 1] = this.m_meshRenderer;
        LODGroup component = base.gameObject.GetComponent <LODGroup>();

        LOD[] lods = component.GetLODs();
        lods[0].renderers = array;
        component.SetLODs(lods);
    }
예제 #7
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);
        }