// 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); }
// 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); }
// 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(); }
// 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); } } }
// 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; }
// 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); }
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); }