protected override bool CanPlaceRotor(MyMotorRotor rotorBlock, long builtBy) { BoundingSphereD sphere = rotorBlock.Model.BoundingSphere; sphere.Center = Vector3D.Transform(sphere.Center, rotorBlock.WorldMatrix); CubeGrid.GetBlocksInsideSphere(ref sphere, m_tmpSet); HkSphereShape spShape = new HkSphereShape((float)sphere.Radius); Quaternion q = Quaternion.Identity;//Quaternion.CreateFromForwardUp(rotorBlock.WorldMatrix.Forward, rotorBlock.WorldMatrix.Up); var position = rotorBlock.WorldMatrix.Translation; MyPhysics.GetPenetrationsShape(spShape, ref position, ref q, m_tmpList, MyPhysics.CharacterNetworkCollisionLayer); if (m_tmpSet.Count > 1 || m_tmpList.Count > 0) { m_tmpList.Clear(); m_tmpSet.Clear(); if (builtBy == MySession.LocalPlayerId) { MyHud.Notifications.Add(MyNotificationSingletons.WheelNotPlaced); } return(false); } m_tmpList.Clear(); m_tmpSet.Clear(); return(true); }
protected override bool CanPlaceRotor(MyAttachableTopBlockBase rotorBlock, long builtBy) { // Compute the rough actual position for the wheel, this improves the detection if it can be placed float wheelDistance = BlockDefinition.Size.Y * CubeGrid.GridSize - 0.2f * CubeGrid.GridSize; Vector3D wheelPosition = this.WorldMatrix.Translation + this.WorldMatrix.Up * wheelDistance; float wheelRadius = rotorBlock.ModelCollision.HavokCollisionShapes[0].ConvexRadius * 0.9f; // First test if we intersect any blocks of our own grid BoundingSphereD sphere = rotorBlock.Model.BoundingSphere; sphere.Center = wheelPosition; sphere.Radius = wheelRadius; CubeGrid.GetBlocksInsideSphere(ref sphere, m_tmpSet); // If we intersect more than 1 block (because wheel sometimes intersects suspension), don't add wheel if (m_tmpSet.Count > 1) { m_tmpSet.Clear(); if (builtBy == MySession.Static.LocalPlayerId) { MyHud.Notifications.Add(MyNotificationSingletons.WheelNotPlaced); } return(false); } m_tmpSet.Clear(); // Next test if we intersect any physics objects HkSphereShape spShape = new HkSphereShape(wheelRadius); Quaternion q = Quaternion.Identity; MyPhysics.GetPenetrationsShape(rotorBlock.ModelCollision.HavokCollisionShapes[0], ref wheelPosition, ref q, m_tmpList, MyPhysics.CollisionLayers.DefaultCollisionLayer); // If we have any collisions with anything other than our own grid, don't add the wheel // We already checked for inner-grid collisions in the previous case for (int i = 0; i < m_tmpList.Count; i++) { MyCubeGrid grid = m_tmpList[i].GetCollisionEntity() as MyCubeGrid; if (grid == null || grid != CubeGrid) { m_tmpList.Clear(); if (builtBy == MySession.Static.LocalPlayerId) { MyHud.Notifications.Add(MyNotificationSingletons.WheelNotPlaced); } return(false); } } m_tmpList.Clear(); return(true); }
protected virtual bool CanPlaceTop(MyAttachableTopBlockBase topBlock, long builtBy) { // Compute the rough actual position for the head, this improves the detection if it can be placed float topDistance = (Subpart3.Model.BoundingBoxSize.Y); Vector3D topPosition = this.Subpart3.WorldMatrix.Translation + this.WorldMatrix.Up * topDistance; float topRadius = topBlock.ModelCollision.HavokCollisionShapes[0].ConvexRadius * 0.9f; // First test if we intersect any blocks of our own grid BoundingSphereD sphere = topBlock.Model.BoundingSphere; sphere.Center = topPosition; sphere.Radius = topRadius; CubeGrid.GetBlocksInsideSphere(ref sphere, m_tmpSet); // If we intersect more than 1 block (because top sometimes intersects piston), don't add top if (m_tmpSet.Count > 1) { m_tmpSet.Clear(); if (builtBy == MySession.Static.LocalPlayerId) { MyHud.Notifications.Add(MyNotificationSingletons.HeadNotPlaced); } return(false); } m_tmpSet.Clear(); // Next test if we intersect any physics objects HkSphereShape spShape = new HkSphereShape(topRadius); Quaternion q = Quaternion.Identity; MyPhysics.GetPenetrationsShape(topBlock.ModelCollision.HavokCollisionShapes[0], ref topPosition, ref q, m_penetrations, MyPhysics.CollisionLayers.DefaultCollisionLayer); // If we have any collisions with anything other than our own grid, don't add the head // We already checked for inner-grid collisions in the previous case for (int i = 0; i < m_penetrations.Count; i++) { MyCubeGrid grid = m_penetrations[i].GetCollisionEntity().GetTopMostParent() as MyCubeGrid; if (grid == null || grid != CubeGrid) { m_penetrations.Clear(); if (builtBy == MySession.Static.LocalPlayerId) { MyHud.Notifications.Add(MyNotificationSingletons.HeadNotPlaced); } return(false); } } m_penetrations.Clear(); return(true); }