public Projectile(Vector3 location, Spell spell, Single direction, Single angle, ArenaPlayer owner) { Spell = spell; Location = location; Direction = direction; Velocity = spell.Velocity; Angle = angle; Size = new Vector3(spell.Width * 0.5f, spell.Width, spell.Tall); Single zRadians = MathHelper.DegreesToRadians(Angle); Single cosZRadians = (Single)Math.Cos(zRadians); Location.X += -(((Single)Math.Sin(Direction) + (Size.X * 0.5f)) * cosZRadians); Location.Y += (Single)Math.Sin(Direction) * cosZRadians; if (zRadians < 0) { Location.Z += Math.Abs(zRadians * 4f) + 4f; } Owner = owner; Team = owner.ActiveTeam; GravityStepDelta = 0; GravityStepCount = 0; DistanceTicks = new TickCounter(30, 50); Duration = new Interval(Spell.DurationTimer, false); BoundingBox = new OrientedBoundingBox(Location, Size, direction); OriginalOrigin = BoundingBox.Origin; OriginalAngle = Angle; }
public Boolean IsBoxVisibleToPoint(Vector3 startPoint, OrientedBoundingBox blockingBox) { Boolean isBlocked = Corners.All(t => blockingBox.LineInBox(startPoint, t)); if (!blockingBox.LineInBox(startPoint, blockingBox.Origin)) { isBlocked = false; } return(isBlocked); }
public Boolean Collides(OrientedBoundingBox box) { BoundingSphere boxSphere = box.ExtentSphere; switch (ExtentSphere.Contains(ref boxSphere)) { case ContainmentType.Disjoint: { return(false); } } for (Int32 i = 0; i < 4; i++) { if (LineInBox(box.Corners[i], box.Corners[i + 4]) || box.LineInBox(Corners[i], Corners[i + 4])) { return(true); } } for (Int32 i = 0; i < 8; i++) { Int32 pIndex; switch (i) { case 3: { pIndex = 0; break; } case 7: { pIndex = 4; break; } default: { pIndex = i + 1; break; } } if (LineInBox(box.Corners[i], box.Corners[pIndex]) || box.LineInBox(Corners[i], Corners[pIndex])) { return(true); } } return(false); }