Exemple #1
0
    /// <summary>
    /// Returns the ledge from witch the character must fall, if any
    /// </summary>
    /// <returns>The ledge; null if none</returns>
    public IGrabInfo GetFallingLedge()
    {
        IGrabInfo nearestLedge = null;

        foreach (var grabInfo in GrabInfos)
        {
            if (!grabInfo.HasTargetPosition)
            {
                continue;
            }

            var deltaHeight = 0F;
            if (grabInfo.HasFromPosition)
            {
                deltaHeight = grabInfo.TargetPosition.y - grabInfo.FromPosition.y;
            }

            if (grabInfo.TrueGrabDistance < _characterProperties.Radius * FallThresehold ||
                (grabInfo.IsValid && grabInfo.TrueGrabDistance < _characterProperties.Radius && deltaHeight > 0F))
            {
                if (nearestLedge == null || grabInfo.TrueGrabDistance < nearestLedge.TrueGrabDistance)
                {
                    nearestLedge = grabInfo;
                }
            }
        }

        return(nearestLedge);
    }
        public static bool RaycastDetailed(Vector3D start, Vector3D end, out IGrabInfo info)
        {
            IHitInfo hit;

            if (MyAPIGateway.Physics.CastRay(start, end, out hit))
            {
                if (hit.HitEntity is IMyCubeGrid || hit.HitEntity is IMySpaceBall)
                {
                    var grid   = (IMyCubeGrid)hit.HitEntity.GetTopMostParent();
                    var hitPos = grid.RayCastBlocks(start, end);
                    if (hitPos.HasValue)
                    {
                        var block = grid.GetCubeBlock(hitPos.Value);
                        if (block != null)
                        {
                            info = new GrabInfoSlimBlock(block, hit.Position);
                            return(true);
                        }
                    }
                }
                else
                {
                    info = new GrabInfo(hit);
                    return(true);
                }
            }

            info = null;
            return(false);
        }
Exemple #3
0
        public static bool TryMake()
        {
            var playerCam = MyAPIGatewayShortcuts.GetMainCamera.Invoke();

            var startPos = playerCam.Position + playerCam.WorldMatrix.Forward;
            var endPos   = playerCam.Position + playerCam.WorldMatrix.Forward * 5f;

            IGrabInfo info;

            Extensions.RaycastDetailed(startPos, endPos, out info);

            if (info == null)
            {
                MyAPIGateway.Utilities.ShowMessage("", "no hit");
                return(false);
            }

            if (lastHit == null)
            {
                MyAPIGateway.Utilities.ShowMessage("", "first hit");
                lastHit = info;
                return(false);
            }

            MyAPIGateway.Utilities.ShowMessage("", "making link");
            Links.Add(new Spring(lastHit, info, null, 1000, 100000));
            lastHit = null;
            return(true);
        }
Exemple #4
0
        public Spring(IGrabInfo left, IGrabInfo right, float?targetLength = null, float springConstant = 0, float breakForce = float.MaxValue)
        {
            leftHit  = left;
            rightHit = right;

            if (targetLength.HasValue)
            {
                this.targetLength = targetLength.Value;
            }
            else
            {
                this.targetLength = (float)(left.WorldPosition - right.WorldPosition).Length();
            }

            this.springConstant = springConstant;
            this.breakForce     = breakForce;

            IsBroken = false;
        }