From 86da36a17f0fcf351b7b78884b8c5263e86a6d2f Mon Sep 17 00:00:00 2001 From: WulfMarius Date: Sat, 20 Oct 2018 21:42:05 +0200 Subject: [PATCH] fixed issue with gear items without box collider --- VisualStudio/Properties/AssemblyInfo.cs | 4 +- VisualStudio/src/BetterPlacing.cs | 139 +++++++++++++----------- 2 files changed, 79 insertions(+), 64 deletions(-) diff --git a/VisualStudio/Properties/AssemblyInfo.cs b/VisualStudio/Properties/AssemblyInfo.cs index 13c24a4..d59d152 100644 --- a/VisualStudio/Properties/AssemblyInfo.cs +++ b/VisualStudio/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.1.4")] -[assembly: AssemblyFileVersion("2.1.4")] +[assembly: AssemblyVersion("2.1.5")] +[assembly: AssemblyFileVersion("2.1.5")] diff --git a/VisualStudio/src/BetterPlacing.cs b/VisualStudio/src/BetterPlacing.cs index b29936d..7e03207 100644 --- a/VisualStudio/src/BetterPlacing.cs +++ b/VisualStudio/src/BetterPlacing.cs @@ -19,7 +19,7 @@ internal class BetterPlacing public static void OnLoad() { - Debug.Log("[Better-Placing] Version " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); + Log("Version " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); AddTranslations(); PlaceableFurniture.Initialize(); @@ -53,6 +53,64 @@ internal static void ChangeLayer(GameObject gameObject, int from, int to) } } + internal static void FixBoxCollider(GameObject gameObject) + { + if (gameObject == null) + { + return; + } + + Renderer renderer = Utils.GetLargestBoundsRenderer(gameObject.gameObject); + if (renderer == null) + { + return; + } + + BoxCollider boxCollider = gameObject.GetComponentInChildren(); + if (boxCollider == null) + { + Log("Adding BoxCollider to " + gameObject.name); + Object.Destroy(gameObject.GetComponent()); + + boxCollider = gameObject.gameObject.AddComponent(); + boxCollider.size = renderer.bounds.extents * 2; + } + + float meshHeight = -1; + + MeshFilter[] meshFilters = gameObject.GetComponentsInChildren(); + foreach (MeshFilter eachMeshFilter in meshFilters) + { + if (eachMeshFilter.transform.parent && "OpenedMesh" == eachMeshFilter.transform.parent.name) + { + continue; + } + + GameObject transformObject = new GameObject(); + transformObject.transform.localRotation = eachMeshFilter.transform.localRotation; + transformObject.transform.localScale = eachMeshFilter.transform.localScale; + meshHeight = Mathf.Max(meshHeight, Mathf.Abs(transformObject.transform.TransformVector(eachMeshFilter.mesh.bounds.size).y)); + } + + if (meshHeight <= 0) + { + return; + } + + boxCollider.center = new Vector3(boxCollider.center.x, meshHeight / 2f + COLLIDER_OFFSET, boxCollider.center.z); + boxCollider.size = new Vector3(boxCollider.size.x, meshHeight - COLLIDER_OFFSET, boxCollider.size.z); + } + + internal static GameObject getFurnitureRoot(GameObject gameObject) + { + if (gameObject.GetComponent() != null) + { + return gameObject; + } + + return getFurnitureRoot(gameObject.transform.parent.gameObject); + } + internal static void InitializeRotation(PlayerManager playerManager) { BetterPlacing.playerManager = playerManager; @@ -120,14 +178,9 @@ internal static bool IsStackableGearItem(GameObject gameObject) return true; } - internal static GameObject getFurnitureRoot(GameObject gameObject) + internal static void Log(string message) { - if (gameObject.GetComponent() != null) - { - return gameObject; - } - - return getFurnitureRoot(gameObject.transform.parent.gameObject); + Debug.Log("Better-Placing] " + message); } internal static void PreparePlacableFurniture(GameObject gameObject) @@ -181,6 +234,22 @@ internal static void RemoveNpcFromPhysiclaCollisionMask() Utils.m_PhysicalCollisionLayerMask &= ~(1 << vp_Layer.NPC); } + internal static void RemovePickupHelper(GameObject gameObject) + { + if (gameObject == null) + { + return; + } + + Transform pickupHelper = gameObject.transform.Find("PickupHelper"); + if (pickupHelper == null) + { + return; + } + + pickupHelper.gameObject.SetActive(false); + } + internal static void RestoreFurnitureLayers(GameObject furniture) { vp_Layer.Set(furniture, vp_Layer.Default, true); @@ -267,44 +336,6 @@ private static void AddTranslations() Localization.dictionary.Add("GAMEPLAY_BlockedByItemAbove", translations); } - internal static void FixBoxCollider(GameObject gameObject) - { - if (gameObject == null) - { - return; - } - - BoxCollider boxCollider = gameObject.GetComponentInChildren(); - if (boxCollider == null) - { - return; - } - - float meshHeight = -1; - - MeshFilter[] meshFilters = gameObject.GetComponentsInChildren(); - foreach (MeshFilter eachMeshFilter in meshFilters) - { - if (eachMeshFilter.transform.parent && "OpenedMesh" == eachMeshFilter.transform.parent.name) - { - continue; - } - - GameObject transformObject = new GameObject(); - transformObject.transform.localRotation = eachMeshFilter.transform.localRotation; - transformObject.transform.localScale = eachMeshFilter.transform.localScale; - meshHeight = Mathf.Max(meshHeight, Mathf.Abs(transformObject.transform.TransformVector(eachMeshFilter.mesh.bounds.size).y)); - } - - if (meshHeight <= 0) - { - return; - } - - boxCollider.center = new Vector3(boxCollider.center.x, meshHeight / 2f + COLLIDER_OFFSET, boxCollider.center.z); - boxCollider.size = new Vector3(boxCollider.size.x, meshHeight - COLLIDER_OFFSET, boxCollider.size.z); - } - private static GameObject GetGearItemBelow(GameObject gameObject, float maxDistance) { RaycastHit[] hits = Physics.RaycastAll(gameObject.transform.position + gameObject.transform.up * CONTACT_DISTANCE, -gameObject.transform.up, maxDistance, 1 << vp_Layer.Gear); @@ -349,22 +380,6 @@ private static List GetGearItemsAbove(GameObject gameObject, Collide return result; } - internal static void RemovePickupHelper(GameObject gameObject) - { - if (gameObject == null) - { - return; - } - - Transform pickupHelper = gameObject.transform.Find("PickupHelper"); - if (pickupHelper == null) - { - return; - } - - pickupHelper.gameObject.SetActive(false); - } - private static void SetRotation(Quaternion rotation) { BetterPlacing.rotation = rotation;