public Boolean Collides(OrientedBoundingBox box) { try { GridBlockCollection gridBlockCollection = GridBlocks.GetBlocksNearBoundingBox(box); if (gridBlockCollection == null) { return(true); } if (gridBlockCollection.Any(gridBlock => box.Collides(gridBlock.LowBox) || box.Collides(gridBlock.MidBox) || (box.Collides(gridBlock.HighBox) && !gridBlock.HasSkybox))) { return(true); } if (gridBlockCollection.Where(gridBlock => gridBlock.LowBoxTile != null).Any(gridBlock => gridBlock.LowBoxTile.TileBlocks.Where(tileBlock => tileBlock.BottomBoundingBox != null).Any(tileBlock => box.Collides(tileBlock.BottomBoundingBox)))) { return(true); } if (Triggers.Where(t => t.TriggerType == TriggerType.Elevator).Where(t => (Int32)System.Math.Floor(box.Origin.X / 64) == t.X1 && (Int32)System.Math.Floor(box.Origin.Y / 64) == t.Y1).Any(t => box.Origin.Z > t.OffHeight && box.Origin.Z < t.Position.Z)) { return(true); } } catch (Exception) { return(true); } return(false); }
public Grid() { GridBlocks = new GridBlockCollection(true); GridObjects = new GridObjectCollection(); GridObjectDefinitions = new GridObjectDefinitionCollection(); Thins = new ThinCollection(); Tiles = new TileCollection(true); Triggers = new TriggerCollection(true); Pools = new PoolCollection(); }
public Boolean LineToBoxIsBlocked(Vector3 startPoint, OrientedBoundingBox targetBox) { try { if (targetBox.Corners.Any(t => GridBlocks.GetBlocksInLine(startPoint, t).Count > 0)) { if (GridBlocks.GetBlocksInLine(startPoint, targetBox.Origin).Count > 0) { return(true); } } GridBlockCollection gridBlockCollection = GridBlocks.GetBlocksAroundLine(startPoint, targetBox.Origin); foreach (GridBlock gridBlock in gridBlockCollection) { if (gridBlock.LowBoxTile != null) { foreach (TileBlock tileBlock in gridBlock.LowBoxTile.TileBlocks) { if (tileBlock.TopBoundingBox != null) { if (tileBlock.TopBoundingBox.LineInBox(startPoint, targetBox.Origin)) { return(true); } } if (tileBlock.BottomBoundingBox != null) { if (tileBlock.BottomBoundingBox.LineInBox(startPoint, targetBox.Origin)) { return(true); } } } } } } catch (Exception) { return(true); } return(false); }
public GridBlock GetHighestGravityBlock(OrientedBoundingBox boundingBox) { GridBlockCollection gridBlockCollection = GetBlocksNearBoundingBox(boundingBox); for (Int32 i = gridBlockCollection.Count - 1; i > 0; i--) { if (gridBlockCollection[i].LowBoxTopZ < gridBlockCollection[i - 1].LowBoxTopZ) { gridBlockCollection.RemoveAt(i); } else { gridBlockCollection.RemoveAt(i - 1); } } return(gridBlockCollection[0]); }
public GridBlockCollection GetBlocksAroundLine(Vector3 startPoint, Vector3 endPoint) { GridBlockCollection gridBlockCollection = new GridBlockCollection(false); Vector3 currentPoint = startPoint; Vector3 direction = Vector3.Normalize(endPoint - startPoint); Single originalDistance = Vector3.Distance(currentPoint, endPoint); while (Vector3.Distance(startPoint, currentPoint) < originalDistance) { GridBlock block = GetBlockByLocation(currentPoint.X, currentPoint.Y); if (block != null && !gridBlockCollection.Contains(block)) { gridBlockCollection.Add(block); } currentPoint += direction; } for (Int32 i = gridBlockCollection.Count - 1; i >= 0; i--) { GridBlock block = gridBlockCollection[i]; if (block == null) { continue; } if (block.ContainerBox == null) { continue; } if (block.ContainerBox.LineInBox(startPoint, endPoint)) { continue; } gridBlockCollection.RemoveAt(i); } return(gridBlockCollection); }
public Boolean TileCollides(OrientedBoundingBox box) { GridBlockCollection gridBlockCollection = GridBlocks.GetBlocksNearBoundingBox(box); if (gridBlockCollection.Count == 0) { return(false); } foreach (GridBlock gridBlock in gridBlockCollection) { if (gridBlock != null && gridBlock.LowBoxTile != null) { foreach (TileBlock tileBlock in gridBlock.LowBoxTile.TileBlocks) { if (tileBlock.TopBoundingBox != null) { if (box.Collides(tileBlock.TopBoundingBox)) { return(true); } } if (tileBlock.BottomBoundingBox != null) { if (box.Collides(tileBlock.BottomBoundingBox)) { return(true); } } } } } return(false); }
public Grid(Grid grid) { GridBlocks = grid.GridBlocks; Thins = grid.Thins; Tiles = grid.Tiles; Triggers = new TriggerCollection(false); foreach (Trigger t in grid.Triggers) { Trigger nTrigger = new Trigger { Duration = null, Cooldown = new Interval(2000, false), Enabled = t.Enabled, EndAngle = t.EndAngle, InitialState = t.InitialState, IsFromValhalla = t.IsFromValhalla, MaxAngleRate = t.MaxAngleRate, MaxRate = t.MaxRate, MoveCeiling = t.MoveCeiling, MoveFloor = t.MoveFloor, MoveRooftop = t.MoveRooftop, NextTrigger = t.NextTrigger, NextTriggerTiming = t.NextTriggerTiming, OffHeight = t.OffHeight, OffSound = t.OffSound, OffText = t.OffText, OnHeight = t.OnHeight, OnSound = t.OnSound, OnText = t.OnText, Position = new Vector3(t.Position.X, t.Position.Y, t.Position.X), Random = t.Random, ResetTimer = t.ResetTimer, SlideAmount = t.SlideAmount, SlideAxis = t.SlideAxis, Speed = t.Speed, StartAngle = t.StartAngle, CurrentState = TriggerState.Inactive, Team = t.Team, TextureOff = t.TextureOff, TextureOn = t.TextureOn, TriggerId = t.TriggerId, TriggerType = t.TriggerType, X0 = t.X0, X1 = t.X1, X2 = t.X2, X3 = t.X3, X4 = t.X4, Y0 = t.Y0, Y1 = t.Y1, Y2 = t.Y2, Y3 = t.Y3, Y4 = t.Y4 }; Triggers.Add(nTrigger); } BalanceShrine = new Shrine(grid.BalanceShrine.Team, grid.BalanceShrine.ShrineId, grid.BalanceShrine.Power, grid.BalanceShrine.CurrentBias); ChaosShrine = new Shrine(grid.ChaosShrine.Team, grid.ChaosShrine.ShrineId, grid.ChaosShrine.Power, grid.ChaosShrine.CurrentBias); OrderShrine = new Shrine(grid.OrderShrine.Team, grid.OrderShrine.ShrineId, grid.OrderShrine.Power, grid.OrderShrine.CurrentBias); GameName = grid.GameName; GridFilename = grid.GridFilename; GridId = grid.GridId; MaxPlayers = grid.MaxPlayers; MiscFilename = grid.MiscFilename; Name = grid.Name; Pools = new PoolCollection(); foreach (Pool p in grid.Pools) { Pools.Add(new Pool(p)); } ShortGameName = grid.ShortGameName; TimeLimit = grid.TimeLimit; TriggerFilename = grid.TriggerFilename; WorldFilename = grid.WorldFilename; ExpBonus = grid.ExpBonus; }