| 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; |
| } |
| } |
| } |
| } |
| |
| |