/// <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); }
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); }
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; }