/// <summary> /// This method allows to change the state all the sockets which hit the part bounds. /// </summary> public void ChangeAreaState(OccupancyType type) { SocketBehaviour[] Sockets = PhysicExtension.GetNeighborsTypesByBox <SocketBehaviour>(GetWorldPartMeshBounds().center, GetWorldPartMeshBounds().extents, transform.rotation, LayerMask.NameToLayer(Constants.LAYER_SOCKET.ToLower()), QueryTriggerInteraction.Collide); for (int i = 0; i < Sockets.Length; i++) { if (Sockets[i] != null) { if (Sockets[i].AttachedPart != this) { if (Sockets[i].AllowPart(this) && type == OccupancyType.Busy) { Sockets[i].ChangeAreaState(type, LayerMask.NameToLayer(Constants.LAYER_DEFAULT.ToLower()), LayerMask.NameToLayer(Constants.LAYER_SOCKET.ToLower()), Sockets[i].AttachedPart); Sockets[i].ChangeState(type, this); } else if (type == OccupancyType.Free) { Sockets[i].ChangeAreaState(type, LayerMask.NameToLayer(Constants.LAYER_DEFAULT.ToLower()), LayerMask.NameToLayer(Constants.LAYER_SOCKET.ToLower()), Sockets[i].AttachedPart); Sockets[i].ChangeState(type, this); } } } } }
/// <summary> /// This method is called when a socket change state. /// </summary> public static void SocketChangedState(SocketBehaviour socket, OccupancyType occupancy) { if (OnSocketChangedState != null) { OnSocketChangedState.Invoke(socket, occupancy); } }
/// <summary> /// This method allows to change the current socket state. /// </summary> public void ChangeState(OccupancyType state, PartBehaviour part) { EventHandlers.SocketChangedState(this, state); if (state == OccupancyType.Busy) { if (!CheckOccupancy(part)) { AddOccupancy(part); } } else if (state == OccupancyType.Free) { if (CheckOccupancy(part)) { RemoveOccupancy(part); } } }
/// <summary> /// This method allows to change all around connected socket(s) state. /// </summary> public void ChangeAreaState(OccupancyType state, LayerMask freeLayer, LayerMask socketLayer, PartBehaviour placedPart) { if (placedPart == null) { return; } if (placedPart.UseConditionalPhysics) { if (!placedPart.CheckStability()) { return; } } Collider[] Colliders = Physics.OverlapBox(placedPart.GetWorldPartMeshBounds().center, placedPart.GetWorldPartMeshBounds().extents, placedPart.transform.rotation, socketLayer, QueryTriggerInteraction.Collide); for (int i = 0; i < Colliders.Length; i++) { SocketBehaviour Socket = Colliders[i].GetComponent <SocketBehaviour>(); if (Socket != null) { if (state == OccupancyType.Busy) { if (Socket.AllowPart(placedPart) && Socket.CheckState(freeLayer, placedPart) == OccupancyType.Busy) { if (Vector3.Distance(placedPart.transform.position, Socket.transform.position) < placedPart.MeshBounds.extents.magnitude) { placedPart.LinkPart(Socket.AttachedPart); Socket.ChangeState(OccupancyType.Busy, placedPart); } } } else { Socket.ChangeState(OccupancyType.Free, placedPart); } } } Colliders = Physics.OverlapSphere(transform.position, Radius, freeLayer); for (int i = 0; i < Colliders.Length; i++) { if (Colliders[i].GetComponent <SocketBehaviour>() == null) { PartBehaviour Part = Colliders[i].GetComponentInParent <PartBehaviour>(); if (Part != null) { if (Part != AttachedPart) { if (AllowPart(Part)) { ChangeState(OccupancyType.Busy, Part); } } } } } }