// Token: 0x06003916 RID: 14614 RVA: 0x000CA524 File Offset: 0x000C8724
    public virtual void RenderDeployPreview(Vector3 point, Quaternion rot, global::TransCarrier carrier)
    {
        if (this._aimGizmo != null)
        {
            this._aimGizmo.rotation = rot;
            this._aimGizmo.position = point;
        }
        if (this._prefabRenderer == null)
        {
            T datablock = this.datablock;
            global::DeployableObject objectToPlace = datablock.ObjectToPlace;
            if (!objectToPlace)
            {
                return;
            }
            this._prefabRenderer = global::PrefabRenderer.GetOrCreateRender(objectToPlace.gameObject);
        }
        Material overrideMat = this.datablock.overrideMat;

        if (overrideMat)
        {
            global::PrefabRenderer prefabRenderer = this._prefabRenderer;
            Camera camera     = global::MountedCamera.main.camera;
            T      datablock2 = this.datablock;
            prefabRenderer.RenderOneMaterial(camera, Matrix4x4.TRS(point, rot, datablock2.ObjectToPlace.transform.localScale), this._aimGizmo.propertyBlock, overrideMat);
        }
        else
        {
            global::PrefabRenderer prefabRenderer2 = this._prefabRenderer;
            Camera camera2    = global::MountedCamera.main.camera;
            T      datablock3 = this.datablock;
            prefabRenderer2.Render(camera2, Matrix4x4.TRS(point, rot, datablock3.ObjectToPlace.transform.localScale), this._aimGizmo.propertyBlock, null);
        }
        if (this._aimGizmo != null)
        {
            bool flag = false;
            if (carrier)
            {
                Renderer renderer = carrier.renderer;
                if (renderer is MeshRenderer && renderer && renderer.enabled)
                {
                    flag = true;
                    this._aimGizmo.carrierRenderer = (MeshRenderer)renderer;
                }
            }
            if (!flag)
            {
                this._aimGizmo.carrierRenderer = null;
            }
        }
    }
    // Token: 0x060033CD RID: 13261 RVA: 0x000C2024 File Offset: 0x000C0224
    public void CheckPlacementResults(Ray ray, out Vector3 pos, out Quaternion rot, out global::TransCarrier carrier, out global::DeployableItemDataBlock.DeployPlaceResults results)
    {
        float num   = this.placeRange;
        bool  flag  = false;
        bool  flag2 = false;
        bool  flag3 = false;
        global::DeployableObject deployableObject = null;
        bool              flag4 = false;
        bool              flag5 = false;
        bool              flag6 = this.minCastRadius >= float.Epsilon;
        RaycastHit        raycastHit;
        bool              flag8;
        MeshBatchInstance meshBatchInstance;
        bool              flag7 = (!flag6) ? Facepunch.MeshBatch.MeshBatchPhysics.Raycast(ray, ref raycastHit, num, -472317957, ref flag8, ref meshBatchInstance) : Facepunch.MeshBatch.MeshBatchPhysics.SphereCast(ray, this.minCastRadius, ref raycastHit, num, -472317957, ref flag8, ref meshBatchInstance);
        Vector3           point = ray.GetPoint(num);

        if (!flag7)
        {
            Vector3 vector = point;
            vector.y += 0.5f;
            flag4     = Facepunch.MeshBatch.MeshBatchPhysics.Raycast(vector, Vector3.down, ref raycastHit, 5f, -472317957, ref flag8, ref meshBatchInstance);
        }
        Vector3 vector2;
        Vector3 vector3;

        if (flag7 || flag4)
        {
            IDMain idmain = (!flag8) ? IDBase.GetMain(raycastHit.collider) : meshBatchInstance.idMain;
            flag3   = (idmain is global::StructureComponent || idmain is global::StructureMaster);
            vector2 = raycastHit.point;
            vector3 = raycastHit.normal;
            flag    = (!flag3 && (deployableObject = (idmain as global::DeployableObject)));
            if (this.carrierSphereCastMode != global::DeployableItemDataBlock.CarrierSphereCastMode.Allowed && flag7 && flag6 && !global::DeployableItemDataBlock.NonVariantSphereCast(ray, vector2))
            {
                float num2;
                Ray   ray2;
                if (this.carrierSphereCastMode == global::DeployableItemDataBlock.CarrierSphereCastMode.AdjustedRay)
                {
                    Vector3 origin  = ray.origin;
                    Vector3 point2  = raycastHit.point;
                    Vector3 vector4 = point2 - origin;
                    num2 = vector4.magnitude + this.minCastRadius * 2f;
                    ray2..ctor(origin, vector4);
                    Debug.DrawLine(ray.origin, ray.GetPoint(num2), Color.cyan);
                }
                else
                {
                    num2 = num + this.minCastRadius;
                    ray2 = ray;
                }
                RaycastHit        raycastHit2;
                bool              flag10;
                MeshBatchInstance meshBatchInstance2;
                bool              flag9;
                if (!(flag9 = Facepunch.MeshBatch.MeshBatchPhysics.Raycast(ray2, ref raycastHit2, num2, -472317957, ref flag10, ref meshBatchInstance2)))
                {
                    Vector3 vector5 = vector2;
                    vector5.y += 0.5f;
                    flag9      = Facepunch.MeshBatch.MeshBatchPhysics.Raycast(vector5, Vector3.down, ref raycastHit2, 5f, -472317957, ref flag10, ref meshBatchInstance2);
                }
                if (flag9)
                {
                    IDMain idmain2 = (!flag10) ? IDBase.GetMain(raycastHit2.collider) : meshBatchInstance2.idMain;
                    carrier = ((!idmain2) ? raycastHit2.collider.GetComponent <global::TransCarrier>() : idmain2.GetLocal <global::TransCarrier>());
                }
                else
                {
                    carrier = null;
                }
            }
            else
            {
                carrier = ((!idmain) ? raycastHit.collider.gameObject : idmain.gameObject).GetComponent <global::TransCarrier>();
            }
            flag2 = (raycastHit.collider is TerrainCollider || raycastHit.collider.gameObject.layer == 10);
            flag5 = true;
        }
        else
        {
            vector2 = point;
            vector3 = Vector3.up;
            carrier = null;
        }
        bool flag11 = false;
        global::Hardpoint hardpoint = null;

        if (this.hardpointType != global::Hardpoint.hardpoint_type.None)
        {
            hardpoint = global::Hardpoint.GetHardpointFromRay(ray, this.hardpointType);
            if (hardpoint)
            {
                flag11  = true;
                vector2 = hardpoint.transform.position;
                vector3 = hardpoint.transform.up;
                carrier = hardpoint.GetMaster().GetTransCarrier();
                flag5   = true;
            }
        }
        bool flag12 = false;

        if (this.spacingRadius > 0f)
        {
            Collider[] array = Physics.OverlapSphere(vector2, this.spacingRadius);
            foreach (Collider collider in array)
            {
                GameObject gameObject = collider.gameObject;
                IDBase     component  = collider.gameObject.GetComponent <IDBase>();
                if (component != null)
                {
                    gameObject = component.idMain.gameObject;
                }
                if (gameObject.CompareTag(this.ObjectToPlace.gameObject.tag) && Vector3.Distance(vector2, gameObject.transform.position) < this.spacingRadius)
                {
                    flag12 = true;
                    break;
                }
            }
        }
        bool flag13 = false;

        if (flag && !this.forcePlaceable && deployableObject.cantPlaceOn)
        {
            flag13 = true;
        }
        pos = vector2;
        if (this.orientationMode == global::DeployableOrientationMode.Default)
        {
            if (this.uprightOnly)
            {
                this.orientationMode = global::DeployableOrientationMode.Upright;
            }
            else
            {
                this.orientationMode = global::DeployableOrientationMode.NormalUp;
            }
        }
        Quaternion quaternion;

        switch (this.orientationMode)
        {
        case global::DeployableOrientationMode.NormalUp:
            quaternion = global::TransformHelpers.LookRotationForcedUp(ray.direction, vector3);
            break;

        case global::DeployableOrientationMode.Upright:
            quaternion = global::TransformHelpers.LookRotationForcedUp(ray.direction, Vector3.up);
            break;

        case global::DeployableOrientationMode.NormalForward:
        {
            Vector3 forward = Vector3.Cross(ray.direction, Vector3.up);
            quaternion = global::TransformHelpers.LookRotationForcedUp(forward, vector3);
            break;
        }

        case global::DeployableOrientationMode.HardpointPosRot:
            if (flag11)
            {
                quaternion = hardpoint.transform.rotation;
            }
            else
            {
                quaternion = global::TransformHelpers.LookRotationForcedUp(ray.direction, Vector3.up);
            }
            break;

        default:
            throw new NotImplementedException();
        }
        rot = quaternion * this.ObjectToPlace.transform.localRotation;
        bool flag14 = false;

        if (this.checkPlacementZones)
        {
            flag14 = global::NoPlacementZone.ValidPos(pos);
        }
        float num3 = Vector3.Angle(vector3, Vector3.up);

        results.falseFromDeployable      = ((!this.CanStackOnDeployables && flag) || flag13);
        results.falseFromTerrian         = (this.TerrainOnly && !flag2);
        results.falseFromClose           = (this.spacingRadius > 0f && flag12);
        results.falseFromHardpoint       = (this.requireHardpoint && !flag11);
        results.falseFromAngle           = (!this.requireHardpoint && num3 >= this.ObjectToPlace.maxSlope);
        results.falseFromPlacementZone   = (this.checkPlacementZones && !flag14);
        results.falseFromHittingNothing  = !flag5;
        results.falseFromStructure       = (this.StructureOnly && !flag3);
        results.falseFromFitRequirements = (this.fitRequirements != null && !this.fitRequirements.Test(pos, (!this.fitTestForcedUp) ? rot : global::TransformHelpers.LookRotationForcedUp(rot, Vector3.up), this.ObjectToPlace.transform.localScale));
    }
    // Token: 0x06003C20 RID: 15392 RVA: 0x000D6DDC File Offset: 0x000D4FDC
    public static bool IsValidLocation(Vector3 location, Vector3 surfaceNormal, UnityEngine.Quaternion rotation, global::DeployableObject prefab)
    {
        if (prefab.doEdgeCheck)
        {
            return(false);
        }
        float num = Vector3.Angle(surfaceNormal, Vector3.up);

        return(num <= prefab.maxSlope);
    }