Esempio n. 1
0
        private bool LineCrosses(Location line0, Location line1, Location point)
        {
            float LineMag = line0.GetDistanceTo(line1);             // Magnitude( LineEnd, LineStart );

            float U =
                (((point.X - line0.X) * (line1.X - line0.X)) +
                 ((point.Y - line0.Y) * (line1.Y - line0.Y)) +
                 ((point.Z - line0.Z) * (line1.Z - line0.Z))) /
                (LineMag * LineMag);

            if (U < 0.0f || U > 1.0f)
            {
                return(false);
            }

            float InterX = line0.X + U * (line1.X - line0.X);
            float InterY = line0.Y + U * (line1.Y - line0.Y);
            float InterZ = line0.Z + U * (line1.Z - line0.Z);

            float Distance = point.GetDistanceTo(new Location(InterX, InterY, InterZ));

            if (Distance < 0.5f)
            {
                return(true);
            }
            return(false);
        }
Esempio n. 2
0
        public Path CreatePath(Location fromLoc, Location toLoc,
                               float howClose,
                               ILocationHeuristics locationHeuristics)
        {
            GSpellTimer t    = new GSpellTimer(0);
            Spot        from = FindClosestSpot(fromLoc, MinStepLength);
            Spot        to   = FindClosestSpot(toLoc, MinStepLength);

            if (from == null)
            {
                from = AddAndConnectSpot(new Spot(fromLoc));
            }
            if (to == null)
            {
                to = AddAndConnectSpot(new Spot(toLoc));
            }

            Path rawPath = CreatePath(from, to, to.location, howClose, true, locationHeuristics);


            if (rawPath != null && paint != null)
            {
                Location prev = null;
                for (int i = 0; i < rawPath.Count(); i++)
                {
                    Location l = rawPath.Get(i);
                    paint.AddBigMarker(l.X, l.Y, l.Z);
                    if (prev != null)
                    {
                        paint.PaintPath(l.X, l.Y, l.Z + 3, prev.X, prev.Y, prev.Z + 3);
                    }
                    prev = l;
                }
            }
            PPather.WriteLine("CreatePath took " + -t.TicksLeft);
            if (rawPath == null)
            {
                return(null);
            }
            else
            {
                Location last = rawPath.GetLast();
                if (last.GetDistanceTo(toLoc) > 1.0)
                {
                    rawPath.AddLast(toLoc);
                }
            }
            return(rawPath);
        }
Esempio n. 3
0
        public Path CreatePath(Location fromLoc, Location toLoc,
                               float howClose,
                               ILocationHeuristics locationHeuristics)
        {
            System.DateTime t    = System.DateTime.Now;
            Spot            from = FindClosestSpot(fromLoc, MinStepLength);
            Spot            to   = FindClosestSpot(toLoc, MinStepLength);

            if (from == null)
            {
                from = AddAndConnectSpot(new Spot(fromLoc));
            }
            if (to == null)
            {
                to = AddAndConnectSpot(new Spot(toLoc));
            }

            Path rawPath = CreatePath(from, to, to.location, howClose, true, locationHeuristics);


            if (rawPath != null && paint != null)
            {
                Location prev = null;
                for (int i = 0; i < rawPath.Count; i++)
                {
                    Location l = rawPath.Get(i);
                    paint.AddBigMarker(l.X, l.Y, l.Z);
                    if (prev != null)
                    {
                        paint.PaintPath(l.X, l.Y, l.Z + 3, prev.X, prev.Y, prev.Z + 3);
                    }
                    prev = l;
                }
            }
            Console.WriteLine("CreatePath took {0}", System.DateTime.Now.Subtract(t).Seconds);
            if (rawPath == null)
            {
                return(null);
            }
            else
            {
                Location last = rawPath.GetLast();
                if (last.GetDistanceTo(toLoc) > 1.0)
                {
                    rawPath.AddLast(toLoc);
                }
            }
            return(rawPath);
        }
Esempio n. 4
0
        public MoveResult move()
        {
            if (GiveUpIfUnsafe) // fixme
            {
                //if (!pather.IsItSafeAt(Me.Target, Me.Location))
                //    return MoveResult.Unsafe;
            }
            if (PathTimeout.IsReady)
            {
                MoveAlong = null;
            }
            BoogieCore.Log(LogType.System, "[Mover] MoveAlong = {0}", MoveAlong);
            if (MoveAlong == null)
            {
                Location from = new Location(Me.Location);
                mover.Stop();
                Path path = world.CreatePath(from, target, (float)4.5, PPather.radar); //fixme
                PathTimeout.Reset();
                BoogieCore.Log(LogType.System, "[Mover (New)] PathCount = {0}", path.Count());
                if (path == null || path.Count() == 0)
                {
                    //Context.Log("EasyMover: Can not create path . giving up");
                    mover.MoveRandom();
                    Thread.Sleep(200);
                    mover.Stop();
                    return MoveResult.CantFindPath;
                }
                else
                {
                    //Context.Log("Save path to " + pathfile);
                    //path.Save(pathfile);
                    MoveAlong = new MoveAlonger(pather, path);
                }
            }

            if (MoveAlong != null)
            {
                Location from = new Location(Me.Location);
                BoogieCore.Log(LogType.System, "[Mover ] PathCount = {0}", MoveAlong.path.Count());

                if (MoveAlong.path.Count() == 0 || from.GetDistanceTo(target) < (float)5.0)
                {
                    BoogieCore.Log(LogType.System, "[Mover] Count = 0 or Dist < 5.0");
                    MoveAlong = null;
                    mover.Stop();
                    return MoveResult.GotThere;
                }
                else if (!MoveAlong.MoveAlong())
                {
                    BoogieCore.Log(LogType.System, "[Mover] Stuck!!");
                    MoveAlong = null; // got stuck!
                    if (GiveUpIfStuck) return MoveResult.Stuck;
                }
            }
            return MoveResult.Moving;
        }
Esempio n. 5
0
        public bool MoveAlong()
        {
            double max = 3.0;
            Coordinate loc = Me.Location;
            Location isAt = new Location(loc.X, loc.Y, loc.Z);
            /*
            while (isAt.GetDistanceTo(current) < max && next != null)
            {
                //Context.Log(current + " - " + next);
                path.RemoveFirst();
                if (path.Count() == 0)
                {
                    //Context.Log("ya");
                    //return true; // good in some way
                }
                else
                {
                    prev = current;
                    current = path.GetFirst();
                    next = path.GetSecond();
                }
            }
            */
            bool consume = false;
            do
            {

                bool blocked = false;

                consume = false;
                if (next != null)
                    world.triangleWorld.IsStepBlocked(loc.X, loc.Y, loc.Z, next.X, next.Y, next.Z,
                                                      PathGraph.toonHeight, PathGraph.toonSize, null);
                double d = isAt.GetDistanceTo(current);
                if ((d < max && !blocked) ||
                   d < 1.5)
                    consume = true;

                if (consume)
                {
                    //GContext.Main.Log("Consume spot " + current + " d " + d + " block " + blocked);
                    path.RemoveFirst();
                    if (path.Count() == 0)
                    {
                        break;
                    }
                    else
                    {
                        prev = current;
                        current = path.GetFirst();
                        next = path.GetSecond();
                    }
                }

            } while (consume);

            {
                //Context.Log("Move towards " + current);
                Coordinate gto = new Coordinate((float)current.X, (float)current.Y, (float)current.Z);
                Coordinate face;
                if (next != null)
                    face = new Coordinate(next.X, next.Y, next.Z);
                else
                    face = gto;

                if (!mover.moveTowardsFacing(gto, 0.5, face))
                {
                    //Context.Log("Can't move " + current);
                    world.BlacklistStep(prev, current);
                    //world.MarkStuckAt(loc, Me.Heading);
                    mover.MoveRandom();
                    Thread.Sleep(500);
                    mover.Stop();
                    return false;
                    // hmm, mover does not want to move, must be up or down
                }

                {
                    double h; double speed;
                    h = mover.GetMoveHeading(out speed);
                    float stand_z = 0.0f;
                    int flags = 0;
                    float x = isAt.X + (float)Math.Cos(h) * 1.0f;
                    float y = isAt.Y + (float)Math.Sin(h) * 1.0f;
                    float z = isAt.Z;
                    bool aheadOk = world.triangleWorld.FindStandableAt(x, y,
                                                                       z - 4,
                                                                       z + 6,
                                                                       out stand_z, out flags, 0, 0);
                    if (!aheadOk)
                    {
                        blockCount++;
                        world.MarkStuckAt(isAt, Me.Location.O);

                        if (prev != null)
                        {
                            Coordinate gprev = new Coordinate((float)prev.X, (float)prev.Y, (float)prev.Z);

                            if (!mover.moveTowardsFacing(gprev, 0.5, face))
                            {
                                mover.Stop();
                                return false;
                            }
                        }
                        if (blockCount > 1)
                        {
                            world.BlacklistStep(prev, current);
                            return false;
                        }

                        return true;
                    }
                    else
                        blockCount = 0;
                }

                if (sd.checkStuck())
                {
                    //Context.Log("Stuck at " + isAt);
                    world.MarkStuckAt(isAt, (float)Me.Heading);
                    world.BlacklistStep(prev, current);
                    mover.Stop();
                    return false;
                }
            }
            return true;
        }
Esempio n. 6
0
        private bool LineCrosses(Location line0, Location line1, Location point)
        {
            float LineMag = line0.GetDistanceTo(line1); // Magnitude( LineEnd, LineStart );

            float U =
                (((point.X - line0.X) * (line1.X - line0.X)) +
                  ((point.Y - line0.Y) * (line1.Y - line0.Y)) +
                  ((point.Z - line0.Z) * (line1.Z - line0.Z))) /
                (LineMag * LineMag);

            if (U < 0.0f || U > 1.0f)
                return false;

            float InterX = line0.X + U * (line1.X - line0.X);
            float InterY = line0.Y + U * (line1.Y - line0.Y);
            float InterZ = line0.Z + U * (line1.Z - line0.Z);

            float Distance = point.GetDistanceTo(new Location(InterX, InterY, InterZ));
            if (Distance < 0.5f)
                return true;
            return false;
        }