private static BuildingProximity.ProximityInfo GetProximity( Construction construction1, Vector3 position1, Quaternion rotation1, Construction construction2, Vector3 position2, Quaternion rotation2) { BuildingProximity.ProximityInfo proximityInfo = new BuildingProximity.ProximityInfo(); proximityInfo.hit = false; proximityInfo.connection = false; proximityInfo.line = (Line)null; proximityInfo.sqrDist = float.MaxValue; for (int index1 = 0; index1 < construction1.allSockets.Length; ++index1) { ConstructionSocket allSocket1 = construction1.allSockets[index1] as ConstructionSocket; if (!((PrefabAttribute)allSocket1 == (PrefabAttribute)null)) { for (int index2 = 0; index2 < construction2.allSockets.Length; ++index2) { Socket_Base allSocket2 = construction2.allSockets[index2]; if (allSocket1.CanConnect(position1, rotation1, allSocket2, position2, rotation2)) { proximityInfo.connection = true; return(proximityInfo); } } } } if (!proximityInfo.connection && construction1.allProximities.Length != 0) { for (int index1 = 0; index1 < construction1.allSockets.Length; ++index1) { ConstructionSocket allSocket = construction1.allSockets[index1] as ConstructionSocket; if (!((PrefabAttribute)allSocket == (PrefabAttribute)null) && allSocket.socketType == ConstructionSocket.Type.Wall) { Vector3 selectPivot1 = allSocket.GetSelectPivot(position1, rotation1); for (int index2 = 0; index2 < construction2.allProximities.Length; ++index2) { Vector3 selectPivot2 = construction2.allProximities[index2].GetSelectPivot(position2, rotation2); Line line; ((Line) ref line).\u002Ector(selectPivot1, selectPivot2); Vector3 vector3 = Vector3.op_Subtraction((Vector3)line.point1, (Vector3)line.point0); float sqrMagnitude = ((Vector3) ref vector3).get_sqrMagnitude(); if ((double)sqrMagnitude < (double)proximityInfo.sqrDist) { proximityInfo.hit = true; proximityInfo.line = line; proximityInfo.sqrDist = sqrMagnitude; } } } } } return(proximityInfo); }
public override bool IsCompatible(Socket_Base socket) { if (!base.IsCompatible(socket)) { return(false); } ConstructionSocket constructionSocket = socket as ConstructionSocket; return(!((PrefabAttribute)constructionSocket == (PrefabAttribute)null) && constructionSocket.socketType != ConstructionSocket.Type.None && (this.socketType != ConstructionSocket.Type.None && constructionSocket.socketType == this.socketType)); }
private static BuildingProximity.ProximityInfo GetProximity(Construction construction1, Vector3 position1, Quaternion rotation1, Construction construction2, Vector3 position2, Quaternion rotation2) { BuildingProximity.ProximityInfo proximityInfo = new BuildingProximity.ProximityInfo() { hit = false, connection = false, line = new Line(), sqrDist = Single.MaxValue }; for (int i = 0; i < (int)construction1.allSockets.Length; i++) { ConstructionSocket constructionSocket = construction1.allSockets[i] as ConstructionSocket; if (constructionSocket != null) { for (int j = 0; j < (int)construction2.allSockets.Length; j++) { if (constructionSocket.CanConnect(position1, rotation1, construction2.allSockets[j], position2, rotation2)) { proximityInfo.connection = true; return(proximityInfo); } } } } if (!proximityInfo.connection && construction1.allProximities.Length != 0) { for (int k = 0; k < (int)construction1.allSockets.Length; k++) { ConstructionSocket constructionSocket1 = construction1.allSockets[k] as ConstructionSocket; if (!(constructionSocket1 == null) && constructionSocket1.socketType == ConstructionSocket.Type.Wall) { Vector3 selectPivot = constructionSocket1.GetSelectPivot(position1, rotation1); for (int l = 0; l < (int)construction2.allProximities.Length; l++) { Vector3 vector3 = construction2.allProximities[l].GetSelectPivot(position2, rotation2); Line line = new Line(selectPivot, vector3); float single = (line.point1 - line.point0).sqrMagnitude; if (single < proximityInfo.sqrDist) { proximityInfo.hit = true; proximityInfo.line = line; proximityInfo.sqrDist = single; } } } } } return(proximityInfo); }
public override bool IsCompatible(Socket_Base socket) { if (!base.IsCompatible(socket)) { return(false); } ConstructionSocket constructionSocket = socket as ConstructionSocket; if (constructionSocket == null) { return(false); } if (constructionSocket.socketType == ConstructionSocket.Type.None || this.socketType == ConstructionSocket.Type.None) { return(false); } if (constructionSocket.socketType != this.socketType) { return(false); } return(true); }
public override Construction.Placement DoPlacement(Construction.Target target) { if (!target.entity || !target.entity.transform) { return(null); } if (!CanConnectToEntity(target)) { return(null); } ConstructionSocket constructionSocket = target.socket as ConstructionSocket; Vector3 vector = target.GetWorldPosition(); Quaternion quaternion = target.GetWorldRotation(true); if (constructionSocket != null && !IsCompatible(constructionSocket)) { return(null); } if (rotationDegrees > 0 && (constructionSocket == null || !constructionSocket.restrictPlacementRotation)) { Construction.Placement placement = new Construction.Placement(); float num = float.MaxValue; float num2 = 0f; for (int i = 0; i < 360; i += rotationDegrees) { Quaternion quaternion2 = Quaternion.Euler(0f, rotationOffset + i, 0f); Vector3 direction = target.ray.direction; Vector3 to = quaternion2 * quaternion * Vector3.up; float num3 = Vector3.Angle(direction, to); if (num3 < num) { num = num3; num2 = i; } } for (int j = 0; j < 360; j += rotationDegrees) { Quaternion quaternion3 = quaternion * Quaternion.Inverse(rotation); Quaternion quaternion4 = Quaternion.Euler(target.rotation); Quaternion quaternion5 = Quaternion.Euler(0f, (float)(rotationOffset + j) + num2, 0f); Quaternion quaternion6 = quaternion4 * quaternion5 * quaternion3; Vector3 vector2 = quaternion6 * position; placement.position = vector - vector2; placement.rotation = quaternion6; if (CheckSocketMods(placement)) { return(placement); } } } Construction.Placement placement2 = new Construction.Placement(); Quaternion quaternion7 = quaternion * Quaternion.Inverse(rotation); Vector3 vector3 = quaternion7 * position; placement2.position = vector - vector3; placement2.rotation = quaternion7; if (!TestRestrictedAngles(vector, quaternion, target)) { return(null); } return(placement2); }