コード例 #1
0
 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);
 }
コード例 #2
0
    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));
    }
コード例 #3
0
 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);
 }
コード例 #4
0
    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);
    }
コード例 #5
0
    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);
    }