public static IEnumerable <uint> EnumerateForwardNetworkConnections(RailEntity Leaving, RailEntity Entering) { if (Leaving == null) { foreach (var neighbor in Entering.NeighborRails) { yield return(neighbor.NeighborID); } yield break; } var connectionPoint = FindConnectionPoint(Leaving, Entering); if (connectionPoint != null) { if (Library.GetRailPiece(Entering.GetPiece().RailPiece).HasValue(out var enteringPiece)) { var transformToEntitySpace = Matrix.CreateRotationY((float)Math.PI * 0.5f * (float)Entering.GetPiece().Orientation) * Entering.GlobalTransform; var backConnection = FindConnectionPoint(Entering, Leaving); var connection = FindConnectionFromTransformedEntrancePoint(enteringPiece, transformToEntitySpace, backConnection.Raised ? (connectionPoint.Position - Vector3.UnitY) : connectionPoint.Position); if (connection != null) { foreach (var exit in connection.Exits) { var transformedExit = Vector3.Transform(exit, transformToEntitySpace); foreach (var neighbor in Entering.NeighborRails) { if (neighbor.Raised) { transformedExit += Vector3.UnitY; } if ((neighbor.Position - transformedExit).LengthSquared() < 0.01f) { yield return(neighbor.NeighborID); } } } } } } }
public static bool CanPlace(WorldManager World, RailEntity PreviewEntity) { // Todo: Make sure this uses BuildObjectTool.IsValidPlacement to enforce building rules. var junctionPiece = PreviewEntity.GetPiece(); var actualPosition = PreviewEntity.GetContainingVoxel(); if (!actualPosition.IsValid) { return(false); } if (!actualPosition.IsEmpty) { return(false); } if (actualPosition.Coordinate.Y == 0) { return(false); // ??? } var voxelUnder = VoxelHelpers.GetVoxelBelow(actualPosition); if (voxelUnder.IsEmpty) { return(false); } var box = actualPosition.GetBoundingBox().Expand(-0.2f); foreach (var entity in World.EnumerateIntersectingObjects(box, CollisionType.Static)) { if ((entity as GameComponent).IsDead) { continue; } if (Object.ReferenceEquals(entity, PreviewEntity)) { continue; } if (Object.ReferenceEquals(entity.GetRoot(), PreviewEntity.GetRoot())) { continue; } if (entity is GenericVoxelListener) { continue; } if (entity is WorkPile) { continue; } if (entity is Health) { continue; } if (entity is CraftDetails) { continue; } if (entity is SimpleSprite) { continue; } if (FindPossibleCombination(junctionPiece, entity).HasValue(out var possibleCombination)) { var combinedPiece = new Rail.JunctionPiece { RailPiece = possibleCombination.Result, Orientation = Rail.OrientationHelper.Rotate((entity as RailEntity).GetPiece().Orientation, (int)possibleCombination.ResultRelativeOrientation), }; PreviewEntity.UpdatePiece(combinedPiece, PreviewEntity.GetContainingVoxel()); return(true); } if (Debugger.Switches.DrawToolDebugInfo) { Drawer3D.DrawBox(box, Color.Yellow, 0.2f, false); } World.UserInterface.ShowTooltip(String.Format("Can't place {0}. Entity in the way: {1}", junctionPiece.RailPiece, entity.ToString())); return(false); } return(true); }
public static bool CanPlace(GameMaster Player, RailEntity PreviewEntity) { // Todo: Make sure this uses BuildObjectTool.IsValidPlacement to enforce building rules. var junctionPiece = PreviewEntity.GetPiece(); var actualPosition = PreviewEntity.GetContainingVoxel(); if (!actualPosition.IsValid) { return(false); } if (!actualPosition.IsEmpty) { return(false); } if (actualPosition.Coordinate.Y == 0) { return(false); // ??? } var local = actualPosition.Coordinate.GetLocalVoxelCoordinate(); var voxelUnder = new VoxelHandle(actualPosition.Chunk, new LocalVoxelCoordinate(local.X, local.Y - 1, local.Z)); if (voxelUnder.IsEmpty) { return(false); } foreach (var entity in Player.World.EnumerateIntersectingObjects(actualPosition.GetBoundingBox().Expand(-0.2f), CollisionType.Static)) { if ((entity as GameComponent).IsDead) { continue; } if (Object.ReferenceEquals(entity, PreviewEntity)) { continue; } if (entity is GenericVoxelListener) { continue; } if (entity is WorkPile) { continue; } var possibleCombination = FindPossibleCombination(junctionPiece, entity); if (possibleCombination != null) { var combinedPiece = new Rail.JunctionPiece { RailPiece = possibleCombination.Result, Orientation = Rail.OrientationHelper.Rotate((entity as RailEntity).GetPiece().Orientation, (int)possibleCombination.ResultRelativeOrientation), }; PreviewEntity.UpdatePiece(combinedPiece, PreviewEntity.GetContainingVoxel()); return(true); } if (Debugger.Switches.DrawBoundingBoxes) { Drawer3D.DrawBox(entity.GetBoundingBox(), Color.Yellow, 0.1f, false); Player.World.ShowTooltip(String.Format("Can't place {0}. Entity in the way: {1}", junctionPiece.RailPiece, entity.ToString())); } return(false); } return(true); }