Skip to content

Commit

Permalink
fixed issue with gear items without box collider
Browse files Browse the repository at this point in the history
  • Loading branch information
WulfMarius committed Oct 20, 2018
1 parent 6af3da5 commit 86da36a
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 64 deletions.
4 changes: 2 additions & 2 deletions VisualStudio/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
139 changes: 77 additions & 62 deletions VisualStudio/src/BetterPlacing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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<BoxCollider>();
if (boxCollider == null)
{
Log("Adding BoxCollider to " + gameObject.name);
Object.Destroy(gameObject.GetComponent<MeshCollider>());

boxCollider = gameObject.gameObject.AddComponent<BoxCollider>();
boxCollider.size = renderer.bounds.extents * 2;
}

float meshHeight = -1;

MeshFilter[] meshFilters = gameObject.GetComponentsInChildren<MeshFilter>();
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<LODGroup>() != null)
{
return gameObject;
}

return getFurnitureRoot(gameObject.transform.parent.gameObject);
}

internal static void InitializeRotation(PlayerManager playerManager)
{
BetterPlacing.playerManager = playerManager;
Expand Down Expand Up @@ -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<LODGroup>() != null)
{
return gameObject;
}

return getFurnitureRoot(gameObject.transform.parent.gameObject);
Debug.Log("Better-Placing] " + message);
}

internal static void PreparePlacableFurniture(GameObject gameObject)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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<BoxCollider>();
if (boxCollider == null)
{
return;
}

float meshHeight = -1;

MeshFilter[] meshFilters = gameObject.GetComponentsInChildren<MeshFilter>();
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);
Expand Down Expand Up @@ -349,22 +380,6 @@ private static List<GameObject> 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;
Expand Down

0 comments on commit 86da36a

Please sign in to comment.