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 override void UpdateBeforeSimulation() { if (gun.IsShooting && !hitDebounce) { if (link == null) { var source = new GrabInfoSlimBlock(gun.CubeGrid.GetCubeBlock(gun.Position), gun.GetPosition()); var startPos = gun.GetPosition() + gun.WorldMatrix.Forward; var endPos = gun.GetPosition() + gun.WorldMatrix.Forward * 10f; IGrabInfo info; if (Extensions.RaycastDetailed(startPos, endPos, out info)) { link = new Spring(source, info); LinkHandler.Links.Add(link); } } else { LinkHandler.Links.Remove(link); link = null; } hitDebounce = true; } else { hitDebounce = false; } }