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); }