public NavCell(float minX, float minY, float minZ, float maxX, float maxY, float maxZ, int flags) { BoundingBox = new AABB( new Vector3f(minX, minY, minZ), new Vector3f(maxX, maxY, maxZ)); Flags = (NavCellFlags)flags; }
public NavCell(float minX, float minY, float minZ, float maxX, float maxY, float maxZ, int flags) { BoundingBox = new AABB( new Vector3f(minX, minY, minZ), new Vector3f(maxX, maxY, maxZ)); Flags = (NavCellFlags)flags; }
private Brush GetNavCellBrush(NavCellFlags flags) { if (flags.HasFlag(NavCellFlags.AllowWalk)) { return(new SolidColorBrush(Colors.NavajoWhite) { Opacity = 0.2 }); } if (flags.HasFlag(NavCellFlags.AllowProjectile)) { return(new SolidColorBrush(Colors.DarkGray) { Opacity = 0.2 }); } if (flags.HasFlag(NavCellFlags.RoundedCorner0) || flags.HasFlag(NavCellFlags.RoundedCorner1) || flags.HasFlag(NavCellFlags.RoundedCorner2) || flags.HasFlag(NavCellFlags.RoundedCorner3)) { return(new SolidColorBrush(Colors.DarkGreen) { Opacity = 0.2 }); } return(new SolidColorBrush(Colors.Black)); }
public WorldSceneCell(NavCell navCell, Vector2 zoneMin) { MinX = zoneMin.X + navCell.Min.X; MinY = zoneMin.Y + navCell.Min.Y; MaxX = zoneMin.X + navCell.Max.X; MaxY = zoneMin.Y + navCell.Max.Y; NavCellFlags = navCell.Flags; IsWalkable = NavCellFlags.HasFlag(NavCellFlags.AllowWalk); Z = Math.Max(navCell.Min.Z, navCell.Max.Z); }
public WorldSceneCell(NavCell navCell, Vector2 zoneMin) { MinX = zoneMin.X + navCell.Min.X; MinY = zoneMin.Y + navCell.Min.Y; MaxX = zoneMin.X + navCell.Max.X; MaxY = zoneMin.Y + navCell.Max.Y; NavCellFlags = navCell.Flags; IsWalkable = NavCellFlags.HasFlag(NavCellFlags.AllowWalk); Z = navCell.Min.Z; if (Z < 0.1f) { Z = 0; } }
//Static Methods #region Static Movement Methods ///<summary> ///Ray Cast -- if no navcellflags parameter is given then it will use Navigator.Raycast -- else it uses ZetaDia.Physics.Raycast to test navcellflags ///</summary> public static bool CanRayCast(Vector3 vStartLocation, Vector3 vDestination, NavCellFlags NavType = NavCellFlags.None, bool UseSearchGridProvider = false) { if (!NavType.Equals(NavCellFlags.None)) { return(ZetaDia.Physics.Raycast(vStartLocation, vDestination, NavType)); //False means nothing hit } if (UseSearchGridProvider) { Vector2 hitVector; if (vStartLocation.Z >= vDestination.Z) { return(!Navigator.SearchGridProvider.Raycast(vStartLocation.ToVector2(), vDestination.ToVector2(), out hitVector)); } return(!Navigator.SearchGridProvider.Raycast(vDestination.ToVector2(), vStartLocation.ToVector2(), out hitVector)); } return(!Navigator.Raycast(vStartLocation, vDestination)); //True means nothing hit }
///<summary> ///Runs raycasting and intersection tests to validate LOS. ///</summary> public bool LOSTest(Vector3 PositionToTestFrom, bool NavRayCast = true, bool searchGridRayCast = false, bool ServerObjectIntersection = true, NavCellFlags Flags = NavCellFlags.None, bool ContinueOnFailures = true) { return(LOSTest(PositionToTestFrom, Obj.Position, NavRayCast, searchGridRayCast, ServerObjectIntersection, Flags, ContinueOnFailures)); }
public void Read(MpqFileStream stream) { this.Z = stream.ReadValueF32(); this.Flags = (NavCellFlags)stream.ReadValueS32(); }
///<summary> ///Runs raycasting and intersection tests to validate LOS. ///</summary> public bool LOSTest(Vector3 PositionToTestFrom, bool NavRayCast=true, bool ServerObjectIntersection=true, NavCellFlags Flags=NavCellFlags.None) { this.LastLOSCheck=DateTime.Now; Vector3 botmeleeVector=!this.IsBoss?this.BotMeleeVector:this.Position; if (NavRayCast&&Zeta.Navigation.Navigator.Raycast(PositionToTestFrom, botmeleeVector)) return false; if (ServerObjectIntersection&&ObjectCache.Obstacles.Values.OfType<CacheServerObject>().Any(obstacle => obstacle.Obstacletype.HasValue&&obstacle.Obstacletype.Value!=ObstacleType.Monster&&obstacle.TestIntersection(PositionToTestFrom, botmeleeVector))) return false; if (!Flags.Equals(NavCellFlags.None)&&!Navigation.CanRayCast(PositionToTestFrom, botmeleeVector, Flags)) return false; return true; }
public void Read(MpqFileStream stream) { this.Z = stream.ReadValueF32(); this.Flags = (NavCellFlags)stream.ReadValueS32(); }
///<summary> ///Runs raycasting and intersection tests to validate LOS. ///</summary> public bool LOSTest(Vector3 PositionToTestFrom, bool NavRayCast = true, bool searchGridRayCast = false, bool ServerObjectIntersection = true, NavCellFlags Flags = NavCellFlags.None, bool ContinueOnFailures = true) { return LOSTest(PositionToTestFrom, Obj.Position, NavRayCast, searchGridRayCast, ServerObjectIntersection, Flags, ContinueOnFailures); }
///<summary> ///Runs raycasting and intersection tests to validate LOS. ///</summary> public bool LOSTest(Vector3 PositionToTestFrom, Vector3 objposition, bool NavRayCast = true, bool searchGridRayCast = false, bool ServerObjectIntersection = true, NavCellFlags Flags = NavCellFlags.None, bool ContinueOnFailures = true) { LastLOSCheck=DateTime.Now; bool Failed=false; if (NavRayCast) {//This is a basic raycast test to see if we have clear view of the object. if (PositionToTestFrom.Z > objposition.Z) RayCast = Navigation.Navigation.CanRayCast(PositionToTestFrom, objposition); else RayCast = Navigation.Navigation.CanRayCast(objposition, PositionToTestFrom); if (!RayCast.Value) { Failed=true; if (!ContinueOnFailures) return false; } } if (searchGridRayCast) { Vector2 hitpos; //Must check the Z difference.. (so we don't get false-positive result) if (PositionToTestFrom.Z > objposition.Z) SearchGridRayCast = !Navigator.SearchGridProvider.Raycast(PositionToTestFrom.ToVector2(), objposition.ToVector2(), out hitpos); else SearchGridRayCast = !Navigator.SearchGridProvider.Raycast(objposition.ToVector2(), PositionToTestFrom.ToVector2(), out hitpos); if (!SearchGridRayCast.Value) { Failed = true; if (!ContinueOnFailures) return false; } } if (ServerObjectIntersection) {//This test uses the obstacle cache to check objects for intersection if (FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, objposition.Z) > 1f) { //Get actual height using MGP objposition.Z = Navigation.Navigation.MGP.GetHeight(objposition.ToVector2()); } ObjectIntersection=ObjectCache.Obstacles.Values.OfType<CacheServerObject>() .Any(obstacle => obstacle.RAGUID!=Obj.RAGUID&& obstacle.Obstacletype.HasValue&& obstacle.Obstacletype.Value==ObstacleType.ServerObject && obstacle.TestIntersection(PositionToTestFrom, objposition,false)); if (!Failed&&ObjectIntersection.Value) { Failed=true; if (!ContinueOnFailures) return false; } } if (!Flags.Equals(NavCellFlags.None)) {//Raycast test to validate it can preform the path -- walk/projectile bool NavTest = Navigation.Navigation.CanRayCast(PositionToTestFrom, objposition, Flags); if (Flags.HasFlag(NavCellFlags.AllowWalk)) NavCellWalk=NavTest; if (Flags.HasFlag(NavCellFlags.AllowProjectile)) NavCellProjectile=NavTest; if (!Failed&&!NavTest) { Failed=true; } } //this.LastVectorTested=PositionToTestFrom; return !Failed; }
public NavMeshSquare(Stream stream) { Z = stream.ReadFloat32(); Flags = (NavCellFlags)stream.ReadInt32(); }
///<summary> ///Ray Cast -- if no navcellflags parameter is given then it will use Navigator.Raycast -- else it uses ZetaDia.Physics.Raycast to test navcellflags ///</summary> public static bool CanRayCast(Vector3 vStartLocation, Vector3 vDestination, NavCellFlags NavType=NavCellFlags.None) { if (!NavType.Equals(NavCellFlags.None)) return ZetaDia.Physics.Raycast(vStartLocation, vDestination, NavType); //False means nothing hit else return !Navigator.Raycast(vStartLocation, vDestination); //True means nothing hit }
///<summary> ///Ray Cast -- if no navcellflags parameter is given then it will use Navigator.Raycast -- else it uses ZetaDia.Physics.Raycast to test navcellflags ///</summary> public static bool CanRayCast(Vector3 vStartLocation, Vector3 vDestination, NavCellFlags NavType = NavCellFlags.None, bool UseSearchGridProvider = false) { if (!NavType.Equals(NavCellFlags.None)) return ZetaDia.Physics.Raycast(vStartLocation, vDestination, NavType); //False means nothing hit if (UseSearchGridProvider) { Vector2 hitVector; if (vStartLocation.Z >= vDestination.Z) return !Navigator.SearchGridProvider.Raycast(vStartLocation.ToVector2(), vDestination.ToVector2(), out hitVector); return !Navigator.SearchGridProvider.Raycast(vDestination.ToVector2(), vStartLocation.ToVector2(), out hitVector); } return !Navigator.Raycast(vStartLocation, vDestination); //True means nothing hit }
///<summary> ///Runs raycasting and intersection tests to validate LOS. ///</summary> public bool LOSTest(Vector3 PositionToTestFrom, bool NavRayCast = true, bool ServerObjectIntersection = true, NavCellFlags Flags = NavCellFlags.None, bool ContinueOnFailures = true) { LastLOSCheck = DateTime.Now; bool Failed = false; if (NavRayCast) { //This is a basic raycast test to see if we have clear view of the object. //Navigator.SearchGridProvider.Update(); Vector2 hitpos; Vector3 ObjectPosition = Obj.Position; //Must check the Z difference.. (so we don't get false-positive result) if (PositionToTestFrom.Z >= ObjectPosition.Z) { RayCast = !Navigator.SearchGridProvider.Raycast(PositionToTestFrom.ToVector2(), ObjectPosition.ToVector2(), out hitpos); } else { RayCast = !Navigator.SearchGridProvider.Raycast(ObjectPosition.ToVector2(), PositionToTestFrom.ToVector2(), out hitpos); } if (!RayCast.Value) { Failed = true; if (!ContinueOnFailures) { return(false); } } } if (ServerObjectIntersection) { //This test uses the obstacle cache to check objects for intersection Vector3 TargetTestLocation = Obj.Position; if (Funky.Difference(Bot.Character.Data.Position.Z, TargetTestLocation.Z) > 1f) { //Get actual height using MGP TargetTestLocation.Z = Navigation.MGP.GetHeight(TargetTestLocation.ToVector2()); } ObjectIntersection = ObjectCache.Obstacles.Values.OfType <CacheServerObject>() .Any(obstacle => obstacle.RAGUID != Obj.RAGUID && obstacle.Obstacletype.HasValue && obstacle.Obstacletype.Value != ObstacleType.Monster && obstacle.TestIntersection(PositionToTestFrom, TargetTestLocation)); if (!Failed && ObjectIntersection.Value) { Failed = true; if (!ContinueOnFailures) { return(false); } } } if (!Flags.Equals(NavCellFlags.None)) { //Raycast test to validate it can preform the path -- walk/projectile bool NavTest = Navigation.CanRayCast(PositionToTestFrom, Obj.Position, Flags); if (Flags.HasFlag(NavCellFlags.AllowWalk)) { NavCellWalk = NavTest; } if (Flags.HasFlag(NavCellFlags.AllowProjectile)) { NavCellProjectile = NavTest; } if (!Failed && !NavTest) { Failed = true; } } //this.LastVectorTested=PositionToTestFrom; return(!Failed); }
private Brush GetNavCellBrush(NavCellFlags flags) { if (flags.HasFlag(NavCellFlags.AllowWalk)) { return new SolidColorBrush(Colors.NavajoWhite) { Opacity = 0.2 }; } if (flags.HasFlag(NavCellFlags.AllowProjectile)) { return new SolidColorBrush(Colors.DarkGray) { Opacity = 0.2 }; } if (flags.HasFlag(NavCellFlags.RoundedCorner0) || flags.HasFlag(NavCellFlags.RoundedCorner1) || flags.HasFlag(NavCellFlags.RoundedCorner2) || flags.HasFlag(NavCellFlags.RoundedCorner3)) { return new SolidColorBrush(Colors.DarkGreen) { Opacity = 0.2 }; } return new SolidColorBrush(Colors.Black); }