Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 3
0
 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));
 }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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;
            }
        }
Ejemplo n.º 6
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
 }
Ejemplo n.º 7
0
 ///<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));
 }
Ejemplo n.º 8
0
 public void Read(MpqFileStream stream)
 {
     this.Z = stream.ReadValueF32();
     this.Flags = (NavCellFlags)stream.ReadValueS32();
 }
Ejemplo n.º 9
0
        ///<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;
        }
Ejemplo n.º 10
0
 public void Read(MpqFileStream stream)
 {
     this.Z     = stream.ReadValueF32();
     this.Flags = (NavCellFlags)stream.ReadValueS32();
 }
Ejemplo n.º 11
0
 ///<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);
 }
Ejemplo n.º 12
0
        ///<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;
        }
Ejemplo n.º 13
0
 public NavMeshSquare(Stream stream)
 {
     Z     = stream.ReadFloat32();
     Flags = (NavCellFlags)stream.ReadInt32();
 }
Ejemplo n.º 14
0
 ///<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
 }
Ejemplo n.º 15
0
        ///<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
        }
Ejemplo n.º 16
0
        ///<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);
        }
Ejemplo n.º 17
0
 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);
 }