# -*- coding: utf-8 -*-
import time

from geographiclib.geodesic import Geodesic
from random import uniform

from pokemongo_bot.human_behaviour import sleep, random_alt_delta


class StepWalker(object):
    def __init__(self, bot, dest_lat, dest_lng, dest_alt=None, precision=0.5):
        self.bot = bot
        self.api = bot.api
        self.epsilon = 0.01
        self.precision = max(precision, self.epsilon)

        self.dest_lat = dest_lat
        self.dest_lng = dest_lng

        if dest_alt is None:
            self.dest_alt = uniform(self.bot.config.alt_min, self.bot.config.alt_max)
        else:
            self.dest_alt = dest_alt

        self.saved_location = None
        self.last_update = 0

    def step(self, speed=None):
        now = time.time()

        sleep(1 - min(now - self.last_update, 1))
        self.last_update = now

        if speed is None:
            speed = uniform(self.bot.config.walk_min, self.bot.config.walk_max)

        origin_lat, origin_lng, origin_alt = self.bot.position

        new_position = self.get_next_position(origin_lat, origin_lng, origin_alt, self.dest_lat, self.dest_lng, self.dest_alt, speed)

        self.api.set_position(new_position[0], new_position[1], new_position[2])
        self.bot.event_manager.emit("position_update",
                                    sender=self,
                                    level="debug",
                                    data={"current_position": (new_position[0], new_position[1], new_position[2]),
                                          "last_position": (origin_lat, origin_lng, origin_alt),
                                          "distance": "",
                                          "distance_unit": ""})

        self.bot.heartbeat()

        return self.is_arrived()

    def is_arrived(self):
        inverse = Geodesic.WGS84.Inverse(self.bot.position[0], self.bot.position[1], self.dest_lat, self.dest_lng)
        return inverse["s12"] <= self.precision + self.epsilon

    def get_next_position(self, origin_lat, origin_lng, origin_alt, dest_lat, dest_lng, dest_alt, distance):
        inverse = Geodesic.WGS84.Inverse(origin_lat, origin_lng, dest_lat, dest_lng)
        total_distance = inverse["s12"]

        if total_distance == 0:
            total_distance = self.precision or self.epsilon

        if distance == 0:
            if not self.saved_location:
                self.saved_location = origin_lat, origin_lng, origin_alt

            dest_lat, dest_lng, dest_alt = self.saved_location
            travel = self.precision
        else:
            self.saved_location = None
            travel = min(total_distance, distance)

        direct = Geodesic.WGS84.Direct(origin_lat, origin_lng, inverse["azi1"], travel)
        next_lat = direct["lat2"]
        next_lng = direct["lon2"]

        random_azi = uniform(inverse["azi1"] - 90, inverse["azi1"] + 90)
        random_dist = uniform(0.0, self.precision)
        direct = Geodesic.WGS84.Direct(next_lat, next_lng, random_azi, random_dist)

        next_lat = direct["lat2"]
        next_lng = direct["lon2"]
        next_alt = origin_alt + (travel / total_distance) * (dest_alt - origin_alt) + random_alt_delta()

        return next_lat, next_lng, next_alt

pokemongo_bot/walkers/step_walker.py
# -*- coding: utf-8 -*-
import time

from geographiclib.geodesic import Geodesic
from random import uniform

from pokemongo_bot.human_behaviour import sleep, random_alt_delta


class StepWalker(object):
    def __init__(self, bot, dest_lat, dest_lng, dest_alt=None, precision=0.5):
        self.bot = bot
        self.api = bot.api
        self.epsilon = 0.01
        self.precision = max(precision, self.epsilon)

        self.dest_lat = dest_lat
        self.dest_lng = dest_lng

        if dest_alt is None:
            self.dest_alt = uniform(self.bot.config.alt_min, self.bot.config.alt_max)
        else:
            self.dest_alt = dest_alt

        self.saved_location = None
        self.last_update = time.time()

    def step(self, speed=None):
        now = time.time()

        sleep(1 - min(now - self.last_update, 1))
        self.last_update = now

        if speed is None:
            speed = uniform(self.bot.config.walk_min, self.bot.config.walk_max)

        origin_lat, origin_lng, origin_alt = self.bot.position

        new_position = self.get_next_position(origin_lat, origin_lng, origin_alt, self.dest_lat, self.dest_lng, self.dest_alt, speed)

        self.api.set_position(new_position[0], new_position[1], new_position[2])
        self.bot.event_manager.emit("position_update",
                                    sender=self,
                                    level="debug",
                                    data={"current_position": (new_position[0], new_position[1], new_position[2]),
                                          "last_position": (origin_lat, origin_lng, origin_alt),
                                          "distance": "",
                                          "distance_unit": ""})

        self.bot.heartbeat()

        return self.is_arrived()

    def is_arrived(self):
        inverse = Geodesic.WGS84.Inverse(self.bot.position[0], self.bot.position[1], self.dest_lat, self.dest_lng)
        return inverse["s12"] <= self.precision + self.epsilon

    def get_next_position(self, origin_lat, origin_lng, origin_alt, dest_lat, dest_lng, dest_alt, distance):
        inverse = Geodesic.WGS84.Inverse(origin_lat, origin_lng, dest_lat, dest_lng)
        total_distance = inverse["s12"]

        if total_distance == 0:
            total_distance = self.precision or self.epsilon

        if distance == 0:
            if not self.saved_location:
                self.saved_location = origin_lat, origin_lng, origin_alt

            dest_lat, dest_lng, dest_alt = self.saved_location
            travel = self.precision
        else:
            self.saved_location = None
            travel = min(total_distance, distance)

        direct = Geodesic.WGS84.Direct(origin_lat, origin_lng, inverse["azi1"], travel)
        next_lat = direct["lat2"]
        next_lng = direct["lon2"]

        random_azi = uniform(inverse["azi1"] - 90, inverse["azi1"] + 90)
        random_dist = uniform(0.0, self.precision)
        direct = Geodesic.WGS84.Direct(next_lat, next_lng, random_azi, random_dist)

        next_lat = direct["lat2"]
        next_lng = direct["lon2"]
        next_alt = origin_alt + (travel / total_distance) * (dest_alt - origin_alt) + random_alt_delta()

        return next_lat, next_lng, next_alt

pokemongo_bot/walkers/step_walker.py
diff --git a/pokemongo_bot/walkers/step_walker.py b/pokemongo_bot/walkers/step_walker.py
index da5a659736..34555373b1 100644
--- a/pokemongo_bot/walkers/step_walker.py
+++ b/pokemongo_bot/walkers/step_walker.py
@@ -23,7 +23,7 @@ def __init__(self, bot, dest_lat, dest_lng, dest_alt=None, precision=0.5):
             self.dest_alt = dest_alt
 
         self.saved_location = None
-        self.last_update = 0
+        self.last_update = time.time()
 
     def step(self, speed=None):
         now = time.time()

<dev> Followpath completes 100m within 17 secs
### Expected Behavior

<!-- Tell us what you expect to happen -->

To slowly walk to the waypoint using the speed from walk_max and walk_min
### Actual Behavior

<!-- Tell us what is happening -->

Completed a 100m dash in 17 secs
### Your FULL config.json (remove your username, password, gmapkey and any other private info)

<!-- Provide your FULL config file, feel free to use services such as pastebin.com to reduce clutter -->
### > {

> ```
> "// websocket_server": false,
> "heartbeat_threshold": 10,
> "enable_social": true,
> "live_config_update": {
>   "enabled": true,
>   "tasks_only": false
> },
> "tasks": [
>   {
>     "type": "TelegramTask",
>     "config": {
>       "enabled": true,
>       "master": ,
>       "password": "",
>       "alert_catch": {
>         "all": {"operator": "or", "cp": 1200, "iv": 0.9}
>         }
>     }
>   },
>   {
>     "type": "HandleSoftBan"
>   },
>   {
>     "type": "RandomAlivePause",
>     "config": {
>       "enabled": true,
>       "min_duration": "00:00:10",
>       "max_duration": "00:20:00",
>       "min_interval": "00:30:00",
>       "max_interval": "01:00:00"
>     }
>   },
>   {
>      "type": "CollectLevelUpReward",
> ```
> 
>    "config": {
>           "collect_reward": true,
>           "level_limit": -1
>         }
>       },
>       {
>         "type": "IncubateEggs",
>         "config": {
>           "enabled": true,
>           "infinite_longer_eggs_first": false,
>           "breakable_longer_eggs_first": true,
>           "min_interval": 120,
>          "infinite": [2,5,10],
>          "breakable": [5,10]
>         }
>       },
>       {
>         "type": "ShowBestPokemon",
>         "config": {
>           "enabled": true,
>           "min_interval": 60,
>           "amount": 5,
>           "order_by": "cp",
>           "info_to_show": ["cp", "ivcp", "dps", "hp"]
>         }
>       },
>       {
>             "type": "PokemonOptimizer",
>             "config": {
>                 "enabled": true,
>                 "transfer": true,
>                 "transfer_wait_min": 3,
>                 "transfer_wait_max": 5,
>                 "evolve": true,
>                 "evolve_time": 20,
>                 "evolve_for_xp": true,
>                 "evolve_only_with_lucky_egg": false,
>                 "evolve_count_for_lucky_egg": 92,
>                 "may_use_lucky_egg": false,
>                 "min_slots_left": 10,
>                 "upgrade_level": 60,
>                 "groups": {
>                             "trash" : ["Pidgey", "Rattata", "Caterpie", "Weedle", "Venonat"]
>                     },
>                 "keep": [
>                     {
>                         "mode": "by_pokemon",
>                         "names": ["Eevee"],
>                         "top": 1,
>                         "evolve": false,
>                         "sort": ["iv", "cp"],
>                         "upgrade": false
>                     },
>                     {
>                         "mode": "by_family",
>                         "top": 1,
>                         "evolve": true,
>                         "sort": ["iv", "cp"],
>                         "upgrade": false
>                     },
>                     {
>                         "mode": "by_family",
>                         "top": 1,
>                         "evolve": true,
>                         "sort": ["ncp", "iv"],
>                         "upgrade": false
>                     },
>                     {
>                         "mode": "by_family",
>                         "top": 1,
>                         "evolve": false,
>                         "sort": ["cp"],
>                         "upgrade": false
>                     },
>                     {
>                         "mode": "by_family",
>                         "names": ["trash"],
>                         "top": 1,
>                         "evolve": true,
>                         "sort": ["iv","cp"],
>                         "upgrade": false
>                     }
>                 ]
>            }
>       },
>       {
>         "type": "NicknamePokemon",
>         "config": {
>           "enabled": true,
>           "dont_nickname_favorite": true,
>           "nickname_above_iv": 0.8,
>           "nickname_template": "{name:.9s}_{iv_pct2}",
>           "nickname_wait_min": 3,
>           "nickname_wait_max": 5
>         }
>       },
>       {
>         "type": "RecycleItems",
>         "config": {
>           "min_empty_space": 30,
>           "max_balls_keep": 200,
>           "max_potions_keep": 70,
>           "max_berries_keep": 30,
>           "max_revives_keep": 20,
>           "item_filter": {
>             "Pokeball":       { "keep" : 80 },
>             "Greatball":      { "keep" : 100 },
>             "Potion":         { "keep" : 0 },
>             "Super Potion":   { "keep" : 20 },
>             "Hyper Potion":   { "keep" : 30 },
>             "Revive":         { "keep" : 20 },
>             "Razz Berry":     { "keep" : 30 }
>           },
>           "recycle_wait_min": 3,
>           "recycle_wait_max": 5,
>           "recycle_force": true,
>           "recycle_force_min": "00:01:00",
>           "recycle_force_max": "00:10:00"
>         }
>       },
>       {
>         "type": "CatchPokemon",
>         "config": {
>           "catch_visible_pokemon": true,
>           "catch_lured_pokemon": true,
>           "min_ultraball_to_keep": 10,
>           "berry_threshold": 0.40,
>           "vip_berry_threshold": 0.9,
>     "treat_unseen_as_vip": true,
>           "daily_catch_limit": 300,
>           "vanish_settings": {
>             "consecutive_vanish_limit": 10,
>             "rest_duration_min": "02:00:00",
>             "rest_duration_max": "04:00:00"
>            }, 
>           "catch_throw_parameters": {
>             "excellent_rate": 0.1,
>             "great_rate": 0.2,
>             "nice_rate": 0.3,
>             "normal_rate": 0.4,
>             "spin_success_rate" : 0.55,
>             "hit_rate": 0.70
>           },
>           "catch_simulation": {
>             "flee_count": 3,
>             "flee_duration": 2,
>             "catch_wait_min": 2,
>             "catch_wait_max": 6,
>             "berry_wait_min": 2,
>             "berry_wait_max": 3,
>             "changeball_wait_min": 3,
>             "changeball_wait_max": 5,
>             "newtodex_wait_min": 20, 
>             "newtodex_wait_max": 30
>           }
>         }
>       },
>       {
>         "type": "SpinFort",
>         "config": {
>     "enabled": true,
>           "spin_wait_min": 3,
>           "spin_wait_max": 6,
>           "daily_spin_limit": 1900
>         }
>       },
>       { "type": "UpdateWebInventory",
>         "config": {
>           "enabled": true
>         }
>       },
>       {
>         "type": "FollowPath",
>         "config": {
>           "enabled": true,
>           "walker": "PolylineWalker",
>           "path_mode": "loop",
>           "path_start_mode": "closest",
>           "path_file": "configs/path.downtown.json",
>           "number_lap": 2,
>           "timer_restart_min": "00:10:00",
>           "timer_restart_max": "00:20:00"
>         }
>       },
>       {
>   "type": "CampFort",
>   "config": {
>    "enabled": true,
>    "max_distance": 400,
>    "min_forts_count": 2,
>    "min_lured_forts_count": 1,
>    "camping_time": 1800,
>    "moving_time": 600
>   }
>       },
>       {
>         "type": "MoveToMapPokemon",
>         "config": {
>           "enabled": false,
>           "address": "http://localhost:5000",
>           "//NOTE: Change the max_sniping_distance to adjust the max sniping range (m)": {},
>           "max_sniping_distance": 20000000,
>           "//NOTE: Change the max_walking_distance to adjust the max walking range when snipe is off (m)": {},
>           "max_walking_distance": 1000,
>           "min_ball": 20,
>           "prioritize_vips": true,
>           "snipe": true,
>           "snipe_high_prio_only": true,
>           "snipe_high_prio_threshold": 500,
>           "update_map": true,
>           "mode": "priority",
>           "map_path": "raw_data",
>           "walker": "StepWalker",
>           "max_extra_dist_fort": 10,
>           "skip_rounds": 50,
>     "update_map_min_distance_meters": 500,
>     "update_map_min_time_sec": 120,
>     "snipe_sleep_sec": 2,
>     "snipe_max_in_chain": 1,
>     "debug": false,
>           "catch": {
>             "==========Legendaries==========": 0,
>             "Aerodactyl": 1000,
>             "Snorlax": 1000,
>             "Articuno": 1000,
>             "Zapdos": 1000,
>             "Moltres": 1000,
>             "Dratini": 400,
>             "Dragonair": 900,
>             "Dragonite": 1000,
>             "Mewtwo": 1000,
>             "Mew": 1000,
> 
> ```
>         "==========Region Locked==========": 0,
>         "Farfetch'd": 1000,
>         "Kangaskhan": 1000,
>         "Mr. Mime": 1000,
>         "Tauros": 400,
> 
>         "==========Very Rare==========": 0,
>         "Lapras": 900,
>         "Electabuzz": 900,
>         "Magmar": 600,
>         "Ditto": 900,
> 
>         "==========Starters==========": 0,
>         "Venusaur": 1000,
> 
>         "Charizard": 1000,
> 
>         "Blastoise": 1000,
> 
>         "Pikachu": 600,
>         "Raichu": 1000,
> 
>         "==========Semi Rare==========": 0,
>         "Porygon": 600,
>         "Scyther": 600,
>         "Jynx": 600,
>         "Hitmonlee": 600,
>         "Hitmonchan": 600,
> 
> 
>         "==========Uncommon==========": 0,
> 
>         "Omanyte": 150,
>         "Omastar": 500,
> 
>         "Seel": 300,
>         "Dewgong": 500,
> 
>         "Grimer": 200,
>         "Muk": 500,
> 
>         "Shellder": 200,
>         "Cloyster": 500,
> 
>         "Haunter": 500,
>         "Gengar": 1000,
> 
>         "Onix": 600,
> 
>         "Drowzee": 600,
> 
>         "Hypno": 600,
> 
>         "Vulpix": 200,
>         "Ninetales": 600,
> 
>         "Growlithe": 200,
>         "Arcanine": 700,
> 
>         "Mankey": 150,
>         "Primeape": 500,
> 
>         "Clefairy": 150,
>         "Clefable": 500,
> 
>         "Diglett": 200,
>         "Dugtrio": 500,
> 
>         "Meowth": 250,
>         "Persian": 500,
> 
>         "Psyduck": 150,
>         "Golduck": 500,
> 
>         "Geodude": 100,
>         "Graveler": 500,
>         "Golem": 800,
> 
>         "Kabuto": 150,
>         "Kabutops": 500,
> 
>         "Gyarados": 800,
> 
>         "Ponyta": 200,
>         "Rapidash": 500,
> 
>         "Cubone": 300,
>         "Marowak": 800,
> 
>         "Hitmonlee": 600,
> 
>         "Hitmonchan": 600,
> 
>         "Lickitung": 600,
> 
>         "Koffing": 200,
>         "Weezing": 500,
> 
>         "Rhyhorn": 200,
>         "Rhydon": 500,
> 
>         "Chansey": 800
> 
>       }
>     }
>   },
>   {
>     "type": "MoveToFort",
>     "config": {
>         "enabled": true,
>         "lure_attraction": true,
>         "lure_max_distance": 3000,
>         "walker": "PolylineWalker",
>         "log_interval": 5
>     }
>   },
>   {
>     "type": "FollowSpiral",
>     "config": {
>       "enabled": true,
>       "diameter": 4,
>       "step_size": 70
>     }
>   }
> ],
> "map_object_cache_time":5,
> "forts": {
>   "avoid_circles": false,
>   "max_circle_size": 10,
>   "cache_recent_forts": true
> },
>   "pokemon_bag": {
>   "// if 'show_at_start' is true, it will log all the pokemons in the bag (not eggs) at bot start": {},
>   "show_at_start": true,
>   "// if 'show_count' is true, it will show the amount of each pokemon (minimum 1)": {},
>   "show_count": true,
>   "// if 'show_candies' is true, it will show the amount of candies for each pokemon": {},
>   "show_candies": true,
>   "// 'pokemon_info' parameter define which info to show for each pokemon": {},
>   "// the available options are": {},
>   "// ['cp', 'iv_ads', 'iv_pct', 'ivcp', 'ncp', 'level', 'hp', 'moveset', 'dps']": {},
>   "pokemon_info": ["cp", "iv_pct"]
> },
> "walk_max": 4.05,
> "walk_min": 1.5,
> "alt_min": 50,
> "alt_max": 150,
> "gps_default_altitude": 8.0,
> "replicate_gps_xy_noise": true,
> "replicate_gps_z_noise": true,
> "gps_xy_noise_range": 0.000025,
> "gps_z_noise_range": 12.5,
> "debug": false,
> "test": false,
> "walker_limit_output": false,
> "health_record": true,
> "location_cache": true,
> "distance_unit": "km",
> "reconnecting_timeout": 15,
> "logging": {
>   "color": true,
>   "show_datetime": true,
>   "show_process_name": true,
>   "show_log_level": true,
>   "show_thread_name": false
> },
> "catch": {
> ```
> 
>   "Pidgey": {"catch_above_cp": 200, "catch_above_iv": 0.8, "logic": "and"},
>   "Rattata": {"catch_above_cp": 100, "catch_above_iv": 0.8, "logic": "and"},
>   "Venonat": {"catch_above_cp": 100, "catch_above_iv": 0.8, "logic": "and"},
>   "Caterpie": {"catch_above_cp": 100, "catch_above_iv": 0.8, "logic": "and"},
>   "Magikarp": {"catch_above_cp": 100, "catch_above_iv": 0.8, "logic": "and"},
>   "any": {"catch_above_cp": 100, "catch_above_iv": 0.80, "logic": "or"}
>     },
>     "vips" : {
>         "Any pokemon put here directly force to use Berry & Best Ball to capture, to secure the capture rate!": {},
>         "any": {"catch_above_cp": 1200, "catch_above_iv": 0.9, "logic": "or" },
>         "Lapras": {},
>         "Moltres": {},
>         "Zapdos": {},
>         "Articuno": {},
> 
> ```
>     "// S-Tier pokemons (if pokemon can be evolved into tier, list the representative)": {},
>     "Mewtwo": {},
>     "Dragonite": {},
>     "Snorlax": {},
>     "// Mew evolves to Mewtwo": {},
>     "Mew": {},
>     "Arcanine": {},
>     "Gyarados": {},
>     "Muk": {},
>     "Weezing": {},
>     "Farfetch'd": {},
>     "Kangaskhan": {},
>     "Mr. Mime": {},
>     "Tauros": {},
>     "Chansey": {},
>     "Hitmonlee": {},
>     "Hitmonchan": {},
>     "Lickitung": {}
> },
> ```
> 
>   "// websocket": {
>       "start_embedded_server": true,
>       "server_url": "127.0.0.1:4000"
>   }
> }
### Output when issue occurred

<!-- Provide a reasonable sample from your output log (not just the error message), feel free to use services such as pastebin.com to reduce clutter -->
### 

> [2016-09-08 17:14:43] [FollowPath] [INFO] Walking from (1.2822329603267415, 103.84856884464244, 6.9831008920896815) to (1.28159, 103.84954, 8.0), distance left: (0.13 km) ..
> [2016-09-08 17:14:44] [FollowPath] [INFO] Walking from (1.2822173743405245, 103.84859272724482, 7.019579344939509) to (1.28159, 103.84954, 8.0), distance left: (0.13 km) ..
> [2016-09-08 17:14:44] [FollowPath] [INFO] Walking from (1.282207140150134, 103.84861363027034, 6.870531895863424) to (1.28159, 103.84954, 8.0), distance left: (0.12 km) ..
> [2016-09-08 17:14:46] [FollowPath] [INFO] Walking from (1.2821885064333336, 103.84863530593056, 7.006849357343985) to (1.28159, 103.84954, 8.0), distance left: (0.12 km) ..
> [2016-09-08 17:14:46] [FollowPath] [INFO] Walking from (1.2821764800511342, 103.84866012210817, 6.81169709598659) to (1.28159, 103.84954, 8.0), distance left: (0.12 km) ..
> [2016-09-08 17:14:46] [FollowPath] [INFO] Walking from (1.282158851833149, 103.84868740232228, 6.5877677667145615) to (1.28159, 103.84954, 8.0), distance left: (0.11 km) ..
> [2016-09-08 17:14:47] [FollowPath] [INFO] Walking from (1.2821531514554323, 103.84870110136663, 6.737180797950861) to (1.28159, 103.84954, 8.0), distance left: (0.11 km) ..
> [2016-09-08 17:14:47] [FollowPath] [INFO] Walking from (1.2821435645809875, 103.84871428048802, 6.692980364469391) to (1.28159, 103.84954, 8.0), distance left: (0.11 km) ..
> [2016-09-08 17:14:48] [FollowPath] [INFO] Walking from (1.2821249819883451, 103.8487409365683, 6.4307794807360725) to (1.28159, 103.84954, 8.0), distance left: (0.11 km) ..
> [Errno 104] Connection reset by peer
> [2016-09-08 17:14:51] [FollowPath] [INFO] Walking from (1.2821046031059775, 103.84876790023392, 6.696229715587473) to (1.28159, 103.84954, 8.0), distance left: (0.10 km) ..
> [2016-09-08 17:14:51] [FollowPath] [INFO] Walking from (1.2820895909344112, 103.84879042769884, 6.39928771721838) to (1.28159, 103.84954, 8.0), distance left: (0.10 km) ..
> [2016-09-08 17:14:52] [FollowPath] [INFO] Walking from (1.2820736494507539, 103.84881351440362, 6.561910277071261) to (1.28159, 103.84954, 8.0), distance left: (0.10 km) ..
> [2016-09-08 17:14:52] [FollowPath] [INFO] Walking from (1.2820625565007053, 103.84883449184692, 6.1879122387896475) to (1.28159, 103.84954, 8.0), distance left: (0.09 km) ..
> [2016-09-08 17:14:53] [FollowPath] [INFO] Walking from (1.282044204740045, 103.84885864558099, 6.081337295838932) to (1.28159, 103.84954, 8.0), distance left: (0.09 km) ..
> [2016-09-08 17:14:55] [FollowPath] [INFO] Walking from (1.2820277346917104, 103.84888841962031, 6.149848154465416) to (1.28159, 103.84954, 8.0), distance left: (0.09 km) ..
> [2016-09-08 17:14:57] [FollowPath] [INFO] Walking from (1.2820157630513938, 103.84890771821017, 6.03107376132378) to (1.28159, 103.84954, 8.0), distance left: (0.08 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.282006488297446, 103.84892291668609, 6.079000003988139) to (1.28159, 103.84954, 8.0), distance left: (0.08 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.2819965841229959, 103.84894028651257, 6.239070676921683) to (1.28159, 103.84954, 8.0), distance left: (0.08 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.281983788201427, 103.84896079415076, 6.160117770656144) to (1.28159, 103.84954, 8.0), distance left: (0.08 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.2819595265958836, 103.84899211686333, 6.14419774650847) to (1.28159, 103.84954, 8.0), distance left: (0.07 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.2819530495092883, 103.84900870081783, 5.809002317798816) to (1.28159, 103.84954, 8.0), distance left: (0.07 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.2819396025193648, 103.84902747368704, 6.013795541508898) to (1.28159, 103.84954, 8.0), distance left: (0.07 km) ..
> [2016-09-08 17:14:58] [ShowBestPokemon] [INFO] [Dragonite, CP 1903, IVCP 0.61, DPS 15.04, HP 110/110] | [Exeggutor, CP 1672, IVCP 0.93, DPS 12.63, HP 120/120] | [Snorlax, CP 1592, IVCP 0.96, DPS 14.76, HP 188/188] | [Slowbro, CP 1543, IVCP 0.62, DPS 11.1, HP 128/128] | [Poliwrath, CP 1412, IVCP 0.58, DPS 15.07, HP 112/112]
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.2819212199911862, 103.84905164571042, 5.9986907722255784) to (1.28159, 103.84954, 8.0), distance left: (0.07 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.2819021017387908, 103.84908161182864, 5.884047698539518) to (1.28159, 103.84954, 8.0), distance left: (0.06 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.2818875268892536, 103.84910170591895, 5.961126733794691) to (1.28159, 103.84954, 8.0), distance left: (0.06 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.281877693976794, 103.84911227534087, 5.937811099180854) to (1.28159, 103.84954, 8.0), distance left: (0.06 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.281869464874571, 103.84911984817698, 6.169356850129349) to (1.28159, 103.84954, 8.0), distance left: (0.06 km) ..
> [2016-09-08 17:14:58] [FollowPath] [INFO] Walking from (1.2818524229388346, 103.84914677287854, 5.8894334753407644) to (1.28159, 103.84954, 8.0), distance left: (0.05 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.2818366011298046, 103.84917454290564, 6.07201137960963) to (1.28159, 103.84954, 8.0), distance left: (0.05 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.2818220605154116, 103.84920464098141, 6.060498823247519) to (1.28159, 103.84954, 8.0), distance left: (0.05 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.2818127277038827, 103.84922300901275, 5.8179675692190544) to (1.28159, 103.84954, 8.0), distance left: (0.04 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.2818015352885703, 103.84924136929958, 6.019985316072789) to (1.28159, 103.84954, 8.0), distance left: (0.04 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.2817889197071597, 103.84926829100651, 6.1629680883794205) to (1.28159, 103.84954, 8.0), distance left: (0.04 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.281779669264147, 103.8492855245992, 5.834310162945999) to (1.28159, 103.84954, 8.0), distance left: (0.04 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.2817753093145552, 103.84930155217383, 6.039551124080895) to (1.28159, 103.84954, 8.0), distance left: (0.03 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.281767773236263, 103.8493187948893, 6.1285970751347785) to (1.28159, 103.84954, 8.0), distance left: (0.03 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.2817591905414398, 103.8493346770986, 5.964372475321875) to (1.28159, 103.84954, 8.0), distance left: (0.03 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.2817397574507825, 103.84936311001428, 5.624440393289487) to (1.28159, 103.84954, 8.0), distance left: (0.03 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.2817210091065274, 103.84939309366355, 5.558625536755718) to (1.28159, 103.84954, 8.0), distance left: (0.02 km) ..
> [2016-09-08 17:14:59] [FollowPath] [INFO] Walking from (1.2817142106839563, 103.84940907866356, 5.687042991253283) to (1.28159, 103.84954, 8.0), distance left: (0.02 km) ..
> [2016-09-08 17:15:00] [FollowPath] [INFO] Walking from (1.2817010140379081, 103.84943116796408, 5.7156884003350195) to (1.28159, 103.84954, 8.0), distance left: (0.02 km) ..
> [2016-09-08 17:15:00] [FollowPath] [INFO] Walking from (1.2816940066543274, 103.84944529971715, 5.635705808826364) to (1.28159, 103.84954, 8.0), distance left: (0.02 km) ..
> [2016-09-08 17:15:00] [FollowPath] [INFO] Walking from (1.2816867237140754, 103.84945957065167, 5.540045912976002) to (1.28159, 103.84954, 8.0), distance left: (0.01 km) ..
> [2016-09-08 17:15:00] [FollowPath] [INFO] Walking from (1.2816701572800249, 103.84948273373465, 5.3368082723085815) to (1.28159, 103.84954, 8.0), distance left: (0.01 km) ..
> [2016-09-08 17:15:00] [FollowPath] [INFO] Walking from (1.281660355867361, 103.84950066095435, 5.493707363433482) to (1.28159, 103.84954, 8.0), distance left: (0.01 km) ..
> [2016-09-08 17:15:00] [FollowPath] [INFO] Walking from (1.2816425159886293, 103.84952266226941, 5.474183746956065) to (1.28159, 103.84954, 8.0), distance left: (0.01 km) ..
> [2016-09-08 17:15:00] [FollowPath] [INFO] Walking from (1.2816212333081076, 103.84953426587411, 5.261470935109754) to (1.28159, 103.84954, 8.0), distance left: (0.00 km) ..
> [2016-09-08 17:15:00] [FollowPath] [INFO] Walking from (1.281601577114721, 103.84953788323577, 5.316136500049653) to (1.28159, 103.84954, 8.0), distance left: (0.00 km) ..
### Steps to Reproduce

<!-- Tell us the steps you have taken to reproduce the issue -->

Task Bot to use followpath
### Other Information

OS: Linux Mint

<!-- Tell us what Operating system you're using --> 

Branch: dev

<!-- dev or master --> 

Git Commit: 6aea15fc0a201d529de8c9d4cb3bf19cebc1cbb4

<!-- run 'git log -n 1 --pretty=format:"%H"' --> 

Python Version: 

<!-- run 'python -V' and paste it here) --> 

Any other relevant files/configs (eg: path files) 

<!-- Anything else which may be of relevance -->

