Add farm nearby pokemons

FeroxRev [2016-07-19 04:31:38]
Add farm nearby pokemons
Filename
PokemonGo/RocketAPI/Client.cs
PokemonGo/RocketAPI/Console/Program.cs
PokemonGo/RocketAPI/GeneratedCode/CatchPokemonResponse.cs
PokemonGo/RocketAPI/GeneratedCode/EncounterResponse.cs
PokemonGo/RocketAPI/GeneratedCode/MapObjectsResponse.cs
PokemonGo/RocketAPI/GeneratedCode/Request.cs
PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
PokemonGo/RocketAPI/Proto/CatchPokemonResponse.proto
PokemonGo/RocketAPI/Proto/EncounterResponse.proto
PokemonGo/RocketAPI/Proto/MapObjectsResponse.proto
PokemonGo/RocketAPI/Proto/Request.proto
README.md
diff --git a/PokemonGo/RocketAPI/Client.cs b/PokemonGo/RocketAPI/Client.cs
index a1d5ce4..db3837a 100644
--- a/PokemonGo/RocketAPI/Client.cs
+++ b/PokemonGo/RocketAPI/Client.cs
@@ -234,5 +234,37 @@ namespace PokemonGo.RocketAPI
             return await _httpClient.PostProto<Request, FortSearchResponse>($"https://{_apiUrl}/rpc", fortDetailRequest);
         }

+        public async Task<EncounterResponse> EncounterPokemon(ulong encounterId, string spawnPointGuid)
+        {
+            var customRequest = new Request.Types.EncounterRequest()
+            {
+                EncounterId = encounterId,
+                SpawnpointId = spawnPointGuid,
+                PlayerLatDegrees = Utils.FloatAsUlong(_currentLat),
+                PlayerLngDegrees = Utils.FloatAsUlong(_currentLng)
+            };
+
+            var encounterResponse = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30, new Request.Types.Requests() { Type = (int)RequestType.ENCOUNTER, Message = customRequest.ToByteString() });
+            return await _httpClient.PostProto<Request, EncounterResponse>($"https://{_apiUrl}/rpc", encounterResponse);
+        }
+
+        public async Task<CatchPokemonResponse> CatchPokemon(ulong encounterId, string spawnPointGuid, double pokemonLat, double pokemonLng)
+        {
+            var customRequest = new Request.Types.CatchPokemonRequest()
+            {
+                EncounterId = encounterId,
+                Pokeball = (int) MiscEnums.Item.ITEM_POKE_BALL,
+                SpawnPointGuid = spawnPointGuid,
+                HitPokemon = 1,
+                NormalizedReticleSize = Utils.FloatAsUlong(1.86440348625),
+                SpinModifier = Utils.FloatAsUlong(0.00655560661107)
+            };
+
+            var catchPokemonRequest = RequestBuilder.GetRequest(_unknownAuth, _currentLat, _currentLng, 30, new Request.Types.Requests() { Type = (int)RequestType.CATCH_POKEMON, Message = customRequest.ToByteString() });
+            return await _httpClient.PostProto<Request, CatchPokemonResponse>($"https://{_apiUrl}/rpc", catchPokemonRequest);
+        }
+
+
+
     }
 }
diff --git a/PokemonGo/RocketAPI/Console/Program.cs b/PokemonGo/RocketAPI/Console/Program.cs
index 68a23a9..c03fac0 100644
--- a/PokemonGo/RocketAPI/Console/Program.cs
+++ b/PokemonGo/RocketAPI/Console/Program.cs
@@ -32,6 +32,7 @@ namespace PokemonGo.RocketAPI.Console
             var mapObjects = await client.GetMapObjects();

             await ExecuteFarmingPokestops(client);
+            await ExecuteCatchAllNearbyPokemons(client);
         }

         private static async Task ExecuteFarmingPokestops(Client client)
@@ -52,6 +53,22 @@ namespace PokemonGo.RocketAPI.Console
             }
         }

+        private static async Task ExecuteCatchAllNearbyPokemons(Client client)
+        {
+            var mapObjects = await client.GetMapObjects();
+
+            var pokemons = mapObjects.Payload[0].Profile.SelectMany(i => i.MapPokemon);
+
+            foreach (var pokemon in pokemons)
+            {
+                var update = await client.UpdatePlayerLocation(pokemon.Latitude, pokemon.Longitude);
+                var encounterPokemonRespone = await client.EncounterPokemon(pokemon.EncounterId, pokemon.SpawnpointId);
+                var caughtPokemonResponse = await client.CatchPokemon(pokemon.EncounterId, pokemon.SpawnpointId, pokemon.Latitude, pokemon.Longitude);
+                await Task.Delay(15000);
+            }
+
+        }
+
         private static string GetFriendlyItemsString(IEnumerable<FortSearchResponse.Types.Item> items)
         {
             var sb = new StringBuilder();
diff --git a/PokemonGo/RocketAPI/GeneratedCode/CatchPokemonResponse.cs b/PokemonGo/RocketAPI/GeneratedCode/CatchPokemonResponse.cs
new file mode 100644
index 0000000..22f939b
--- /dev/null
+++ b/PokemonGo/RocketAPI/GeneratedCode/CatchPokemonResponse.cs
@@ -0,0 +1,925 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: CatchPokemonResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace PokemonGo.RocketAPI.GeneratedCode {
+
+  /// <summary>Holder for reflection information generated from CatchPokemonResponse.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class CatchPokemonResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for CatchPokemonResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static CatchPokemonResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChpDYXRjaFBva2Vtb25SZXNwb25zZS5wcm90bxIhUG9rZW1vbkdvLlJvY2tl",
+            "dEFQSS5HZW5lcmF0ZWRDb2RlIpUFChRDYXRjaFBva2Vtb25SZXNwb25zZRIQ",
+            "Cgh1bmtub3duMRgBIAEoBRIQCgh1bmtub3duMhgCIAEoAxIPCgdhcGlfdXJs",
+            "GAMgASgJElIKCHVua25vd242GAYgASgLMkAuUG9rZW1vbkdvLlJvY2tldEFQ",
+            "SS5HZW5lcmF0ZWRDb2RlLkNhdGNoUG9rZW1vblJlc3BvbnNlLlVua25vd242",
+            "ElIKCHVua25vd243GAcgASgLMkAuUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5l",
+            "cmF0ZWRDb2RlLkNhdGNoUG9rZW1vblJlc3BvbnNlLlVua25vd243ElAKB3Bh",
+            "eWxvYWQYZCADKAsyPy5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENv",
+            "ZGUuQ2F0Y2hQb2tlbW9uUmVzcG9uc2UuUGF5bG9hZBIUCgxlcnJvck1lc3Nh",
+            "Z2UYZSABKAkalwEKCFVua25vd242EhAKCHVua25vd24xGAEgASgFElsKCHVu",
+            "a25vd24yGAIgASgLMkkuUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRD",
+            "b2RlLkNhdGNoUG9rZW1vblJlc3BvbnNlLlVua25vd242LlVua25vd24yGhwK",
+            "CFVua25vd24yEhAKCHVua25vd24xGAEgASgMGkMKCFVua25vd243EhEKCXVu",
+            "a25vd243MRgBIAEoDBIRCgl1bmtub3duNzIYAiABKAMSEQoJdW5rbm93bjcz",
+            "GAMgASgMGlkKB1BheWxvYWQSDgoGU3RhdHVzGAEgASgFEhMKC01pc3NQZXJj",
+            "ZW50GAIgASgFEhkKEUNhcHR1cmVkUG9rZW1vbklkGAMgASgFEg4KBlNjb3Jl",
+            "cxgEIAEoBWIGcHJvdG8z"));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse), global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Parser, new[]{ "Unknown1", "Unknown2", "ApiUrl", "Unknown6", "Unknown7", "Payload", "ErrorMessage" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6), global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6.Parser, new[]{ "Unknown1", "Unknown2" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6.Types.Unknown2), global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6.Types.Unknown2.Parser, new[]{ "Unknown1" }, null, null, null)}),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown7), global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown7.Parser, new[]{ "Unknown71", "Unknown72", "Unknown73" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Payload), global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Payload.Parser, new[]{ "Status", "MissPercent", "CapturedPokemonId", "Scores" }, null, null, null)})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class CatchPokemonResponse : pb::IMessage<CatchPokemonResponse> {
+    private static readonly pb::MessageParser<CatchPokemonResponse> _parser = new pb::MessageParser<CatchPokemonResponse>(() => new CatchPokemonResponse());
+    public static pb::MessageParser<CatchPokemonResponse> Parser { get { return _parser; } }
+
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    public CatchPokemonResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    public CatchPokemonResponse(CatchPokemonResponse other) : this() {
+      unknown1_ = other.unknown1_;
+      unknown2_ = other.unknown2_;
+      apiUrl_ = other.apiUrl_;
+      Unknown6 = other.unknown6_ != null ? other.Unknown6.Clone() : null;
+      Unknown7 = other.unknown7_ != null ? other.Unknown7.Clone() : null;
+      payload_ = other.payload_.Clone();
+      errorMessage_ = other.errorMessage_;
+    }
+
+    public CatchPokemonResponse Clone() {
+      return new CatchPokemonResponse(this);
+    }
+
+    /// <summary>Field number for the "unknown1" field.</summary>
+    public const int Unknown1FieldNumber = 1;
+    private int unknown1_;
+    public int Unknown1 {
+      get { return unknown1_; }
+      set {
+        unknown1_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown2" field.</summary>
+    public const int Unknown2FieldNumber = 2;
+    private long unknown2_;
+    public long Unknown2 {
+      get { return unknown2_; }
+      set {
+        unknown2_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "api_url" field.</summary>
+    public const int ApiUrlFieldNumber = 3;
+    private string apiUrl_ = "";
+    public string ApiUrl {
+      get { return apiUrl_; }
+      set {
+        apiUrl_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "unknown6" field.</summary>
+    public const int Unknown6FieldNumber = 6;
+    private global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6 unknown6_;
+    public global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6 Unknown6 {
+      get { return unknown6_; }
+      set {
+        unknown6_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown7" field.</summary>
+    public const int Unknown7FieldNumber = 7;
+    private global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown7 unknown7_;
+    public global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown7 Unknown7 {
+      get { return unknown7_; }
+      set {
+        unknown7_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "payload" field.</summary>
+    public const int PayloadFieldNumber = 100;
+    private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Payload> _repeated_payload_codec
+        = pb::FieldCodec.ForMessage(802, global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Payload.Parser);
+    private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Payload> payload_ = new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Payload>();
+    public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Payload> Payload {
+      get { return payload_; }
+    }
+
+    /// <summary>Field number for the "errorMessage" field.</summary>
+    public const int ErrorMessageFieldNumber = 101;
+    private string errorMessage_ = "";
+    /// <summary>
+    /// Should be moved to an error-proto file if error is always 101 field
+    /// </summary>
+    public string ErrorMessage {
+      get { return errorMessage_; }
+      set {
+        errorMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as CatchPokemonResponse);
+    }
+
+    public bool Equals(CatchPokemonResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Unknown1 != other.Unknown1) return false;
+      if (Unknown2 != other.Unknown2) return false;
+      if (ApiUrl != other.ApiUrl) return false;
+      if (!object.Equals(Unknown6, other.Unknown6)) return false;
+      if (!object.Equals(Unknown7, other.Unknown7)) return false;
+      if(!payload_.Equals(other.payload_)) return false;
+      if (ErrorMessage != other.ErrorMessage) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
+      if (Unknown2 != 0L) hash ^= Unknown2.GetHashCode();
+      if (ApiUrl.Length != 0) hash ^= ApiUrl.GetHashCode();
+      if (unknown6_ != null) hash ^= Unknown6.GetHashCode();
+      if (unknown7_ != null) hash ^= Unknown7.GetHashCode();
+      hash ^= payload_.GetHashCode();
+      if (ErrorMessage.Length != 0) hash ^= ErrorMessage.GetHashCode();
+      return hash;
+    }
+
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Unknown1 != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(Unknown1);
+      }
+      if (Unknown2 != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(Unknown2);
+      }
+      if (ApiUrl.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(ApiUrl);
+      }
+      if (unknown6_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(Unknown6);
+      }
+      if (unknown7_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(Unknown7);
+      }
+      payload_.WriteTo(output, _repeated_payload_codec);
+      if (ErrorMessage.Length != 0) {
+        output.WriteRawTag(170, 6);
+        output.WriteString(ErrorMessage);
+      }
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      if (Unknown1 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
+      }
+      if (Unknown2 != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown2);
+      }
+      if (ApiUrl.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(ApiUrl);
+      }
+      if (unknown6_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown6);
+      }
+      if (unknown7_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown7);
+      }
+      size += payload_.CalculateSize(_repeated_payload_codec);
+      if (ErrorMessage.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(ErrorMessage);
+      }
+      return size;
+    }
+
+    public void MergeFrom(CatchPokemonResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Unknown1 != 0) {
+        Unknown1 = other.Unknown1;
+      }
+      if (other.Unknown2 != 0L) {
+        Unknown2 = other.Unknown2;
+      }
+      if (other.ApiUrl.Length != 0) {
+        ApiUrl = other.ApiUrl;
+      }
+      if (other.unknown6_ != null) {
+        if (unknown6_ == null) {
+          unknown6_ = new global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6();
+        }
+        Unknown6.MergeFrom(other.Unknown6);
+      }
+      if (other.unknown7_ != null) {
+        if (unknown7_ == null) {
+          unknown7_ = new global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown7();
+        }
+        Unknown7.MergeFrom(other.Unknown7);
+      }
+      payload_.Add(other.payload_);
+      if (other.ErrorMessage.Length != 0) {
+        ErrorMessage = other.ErrorMessage;
+      }
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Unknown1 = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            Unknown2 = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            ApiUrl = input.ReadString();
+            break;
+          }
+          case 50: {
+            if (unknown6_ == null) {
+              unknown6_ = new global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6();
+            }
+            input.ReadMessage(unknown6_);
+            break;
+          }
+          case 58: {
+            if (unknown7_ == null) {
+              unknown7_ = new global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown7();
+            }
+            input.ReadMessage(unknown7_);
+            break;
+          }
+          case 802: {
+            payload_.AddEntriesFrom(input, _repeated_payload_codec);
+            break;
+          }
+          case 810: {
+            ErrorMessage = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the CatchPokemonResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Unknown6 : pb::IMessage<Unknown6> {
+        private static readonly pb::MessageParser<Unknown6> _parser = new pb::MessageParser<Unknown6>(() => new Unknown6());
+        public static pb::MessageParser<Unknown6> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Descriptor.NestedTypes[0]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public Unknown6() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public Unknown6(Unknown6 other) : this() {
+          unknown1_ = other.unknown1_;
+          Unknown2 = other.unknown2_ != null ? other.Unknown2.Clone() : null;
+        }
+
+        public Unknown6 Clone() {
+          return new Unknown6(this);
+        }
+
+        /// <summary>Field number for the "unknown1" field.</summary>
+        public const int Unknown1FieldNumber = 1;
+        private int unknown1_;
+        public int Unknown1 {
+          get { return unknown1_; }
+          set {
+            unknown1_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unknown2" field.</summary>
+        public const int Unknown2FieldNumber = 2;
+        private global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6.Types.Unknown2 unknown2_;
+        public global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6.Types.Unknown2 Unknown2 {
+          get { return unknown2_; }
+          set {
+            unknown2_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Unknown6);
+        }
+
+        public bool Equals(Unknown6 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown1 != other.Unknown1) return false;
+          if (!object.Equals(Unknown2, other.Unknown2)) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
+          if (unknown2_ != null) hash ^= Unknown2.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown1 != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Unknown1);
+          }
+          if (unknown2_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(Unknown2);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown1 != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
+          }
+          if (unknown2_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown2);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Unknown6 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown1 != 0) {
+            Unknown1 = other.Unknown1;
+          }
+          if (other.unknown2_ != null) {
+            if (unknown2_ == null) {
+              unknown2_ = new global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6.Types.Unknown2();
+            }
+            Unknown2.MergeFrom(other.Unknown2);
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 8: {
+                Unknown1 = input.ReadInt32();
+                break;
+              }
+              case 18: {
+                if (unknown2_ == null) {
+                  unknown2_ = new global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6.Types.Unknown2();
+                }
+                input.ReadMessage(unknown2_);
+                break;
+              }
+            }
+          }
+        }
+
+        #region Nested types
+        /// <summary>Container for nested types declared in the Unknown6 message type.</summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public static partial class Types {
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+          public sealed partial class Unknown2 : pb::IMessage<Unknown2> {
+            private static readonly pb::MessageParser<Unknown2> _parser = new pb::MessageParser<Unknown2>(() => new Unknown2());
+            public static pb::MessageParser<Unknown2> Parser { get { return _parser; } }
+
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Types.Unknown6.Descriptor.NestedTypes[0]; }
+            }
+
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            public Unknown2() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            public Unknown2(Unknown2 other) : this() {
+              unknown1_ = other.unknown1_;
+            }
+
+            public Unknown2 Clone() {
+              return new Unknown2(this);
+            }
+
+            /// <summary>Field number for the "unknown1" field.</summary>
+            public const int Unknown1FieldNumber = 1;
+            private pb::ByteString unknown1_ = pb::ByteString.Empty;
+            public pb::ByteString Unknown1 {
+              get { return unknown1_; }
+              set {
+                unknown1_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+              }
+            }
+
+            public override bool Equals(object other) {
+              return Equals(other as Unknown2);
+            }
+
+            public bool Equals(Unknown2 other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (Unknown1 != other.Unknown1) return false;
+              return true;
+            }
+
+            public override int GetHashCode() {
+              int hash = 1;
+              if (Unknown1.Length != 0) hash ^= Unknown1.GetHashCode();
+              return hash;
+            }
+
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (Unknown1.Length != 0) {
+                output.WriteRawTag(10);
+                output.WriteBytes(Unknown1);
+              }
+            }
+
+            public int CalculateSize() {
+              int size = 0;
+              if (Unknown1.Length != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown1);
+              }
+              return size;
+            }
+
+            public void MergeFrom(Unknown2 other) {
+              if (other == null) {
+                return;
+              }
+              if (other.Unknown1.Length != 0) {
+                Unknown1 = other.Unknown1;
+              }
+            }
+
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 10: {
+                    Unknown1 = input.ReadBytes();
+                    break;
+                  }
+                }
+              }
+            }
+
+          }
+
+        }
+        #endregion
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Unknown7 : pb::IMessage<Unknown7> {
+        private static readonly pb::MessageParser<Unknown7> _parser = new pb::MessageParser<Unknown7>(() => new Unknown7());
+        public static pb::MessageParser<Unknown7> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Descriptor.NestedTypes[1]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public Unknown7() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public Unknown7(Unknown7 other) : this() {
+          unknown71_ = other.unknown71_;
+          unknown72_ = other.unknown72_;
+          unknown73_ = other.unknown73_;
+        }
+
+        public Unknown7 Clone() {
+          return new Unknown7(this);
+        }
+
+        /// <summary>Field number for the "unknown71" field.</summary>
+        public const int Unknown71FieldNumber = 1;
+        private pb::ByteString unknown71_ = pb::ByteString.Empty;
+        public pb::ByteString Unknown71 {
+          get { return unknown71_; }
+          set {
+            unknown71_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "unknown72" field.</summary>
+        public const int Unknown72FieldNumber = 2;
+        private long unknown72_;
+        public long Unknown72 {
+          get { return unknown72_; }
+          set {
+            unknown72_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unknown73" field.</summary>
+        public const int Unknown73FieldNumber = 3;
+        private pb::ByteString unknown73_ = pb::ByteString.Empty;
+        public pb::ByteString Unknown73 {
+          get { return unknown73_; }
+          set {
+            unknown73_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Unknown7);
+        }
+
+        public bool Equals(Unknown7 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown71 != other.Unknown71) return false;
+          if (Unknown72 != other.Unknown72) return false;
+          if (Unknown73 != other.Unknown73) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown71.Length != 0) hash ^= Unknown71.GetHashCode();
+          if (Unknown72 != 0L) hash ^= Unknown72.GetHashCode();
+          if (Unknown73.Length != 0) hash ^= Unknown73.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown71.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteBytes(Unknown71);
+          }
+          if (Unknown72 != 0L) {
+            output.WriteRawTag(16);
+            output.WriteInt64(Unknown72);
+          }
+          if (Unknown73.Length != 0) {
+            output.WriteRawTag(26);
+            output.WriteBytes(Unknown73);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown71.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown71);
+          }
+          if (Unknown72 != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown72);
+          }
+          if (Unknown73.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown73);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Unknown7 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown71.Length != 0) {
+            Unknown71 = other.Unknown71;
+          }
+          if (other.Unknown72 != 0L) {
+            Unknown72 = other.Unknown72;
+          }
+          if (other.Unknown73.Length != 0) {
+            Unknown73 = other.Unknown73;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                Unknown71 = input.ReadBytes();
+                break;
+              }
+              case 16: {
+                Unknown72 = input.ReadInt64();
+                break;
+              }
+              case 26: {
+                Unknown73 = input.ReadBytes();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Payload : pb::IMessage<Payload> {
+        private static readonly pb::MessageParser<Payload> _parser = new pb::MessageParser<Payload>(() => new Payload());
+        public static pb::MessageParser<Payload> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.CatchPokemonResponse.Descriptor.NestedTypes[2]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public Payload() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public Payload(Payload other) : this() {
+          status_ = other.status_;
+          missPercent_ = other.missPercent_;
+          capturedPokemonId_ = other.capturedPokemonId_;
+          scores_ = other.scores_;
+        }
+
+        public Payload Clone() {
+          return new Payload(this);
+        }
+
+        /// <summary>Field number for the "Status" field.</summary>
+        public const int StatusFieldNumber = 1;
+        private int status_;
+        public int Status {
+          get { return status_; }
+          set {
+            status_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "MissPercent" field.</summary>
+        public const int MissPercentFieldNumber = 2;
+        private int missPercent_;
+        public int MissPercent {
+          get { return missPercent_; }
+          set {
+            missPercent_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "CapturedPokemonId" field.</summary>
+        public const int CapturedPokemonIdFieldNumber = 3;
+        private int capturedPokemonId_;
+        public int CapturedPokemonId {
+          get { return capturedPokemonId_; }
+          set {
+            capturedPokemonId_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "Scores" field.</summary>
+        public const int ScoresFieldNumber = 4;
+        private int scores_;
+        public int Scores {
+          get { return scores_; }
+          set {
+            scores_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Payload);
+        }
+
+        public bool Equals(Payload other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Status != other.Status) return false;
+          if (MissPercent != other.MissPercent) return false;
+          if (CapturedPokemonId != other.CapturedPokemonId) return false;
+          if (Scores != other.Scores) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Status != 0) hash ^= Status.GetHashCode();
+          if (MissPercent != 0) hash ^= MissPercent.GetHashCode();
+          if (CapturedPokemonId != 0) hash ^= CapturedPokemonId.GetHashCode();
+          if (Scores != 0) hash ^= Scores.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Status != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Status);
+          }
+          if (MissPercent != 0) {
+            output.WriteRawTag(16);
+            output.WriteInt32(MissPercent);
+          }
+          if (CapturedPokemonId != 0) {
+            output.WriteRawTag(24);
+            output.WriteInt32(CapturedPokemonId);
+          }
+          if (Scores != 0) {
+            output.WriteRawTag(32);
+            output.WriteInt32(Scores);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Status != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Status);
+          }
+          if (MissPercent != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(MissPercent);
+          }
+          if (CapturedPokemonId != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(CapturedPokemonId);
+          }
+          if (Scores != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Scores);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Payload other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Status != 0) {
+            Status = other.Status;
+          }
+          if (other.MissPercent != 0) {
+            MissPercent = other.MissPercent;
+          }
+          if (other.CapturedPokemonId != 0) {
+            CapturedPokemonId = other.CapturedPokemonId;
+          }
+          if (other.Scores != 0) {
+            Scores = other.Scores;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 8: {
+                Status = input.ReadInt32();
+                break;
+              }
+              case 16: {
+                MissPercent = input.ReadInt32();
+                break;
+              }
+              case 24: {
+                CapturedPokemonId = input.ReadInt32();
+                break;
+              }
+              case 32: {
+                Scores = input.ReadInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/RocketAPI/GeneratedCode/EncounterResponse.cs b/PokemonGo/RocketAPI/GeneratedCode/EncounterResponse.cs
new file mode 100644
index 0000000..28147d4
--- /dev/null
+++ b/PokemonGo/RocketAPI/GeneratedCode/EncounterResponse.cs
@@ -0,0 +1,924 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: EncounterResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace PokemonGo.RocketAPI.GeneratedCode {
+
+  /// <summary>Holder for reflection information generated from EncounterResponse.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class EncounterResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for EncounterResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static EncounterResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChdFbmNvdW50ZXJSZXNwb25zZS5wcm90bxIhUG9rZW1vbkdvLlJvY2tldEFQ",
+            "SS5HZW5lcmF0ZWRDb2RlIocFChFFbmNvdW50ZXJSZXNwb25zZRIQCgh1bmtu",
+            "b3duMRgBIAEoBRIQCgh1bmtub3duMhgCIAEoAxIPCgdhcGlfdXJsGAMgASgJ",
+            "Ek8KCHVua25vd242GAYgASgLMj0uUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5l",
+            "cmF0ZWRDb2RlLkVuY291bnRlclJlc3BvbnNlLlVua25vd242Ek8KCHVua25v",
+            "d243GAcgASgLMj0uUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2Rl",
+            "LkVuY291bnRlclJlc3BvbnNlLlVua25vd243Ek0KB3BheWxvYWQYZCADKAsy",
+            "PC5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuRW5jb3VudGVy",
+            "UmVzcG9uc2UuUGF5bG9hZBIUCgxlcnJvck1lc3NhZ2UYZSABKAkalAEKCFVu",
+            "a25vd242EhAKCHVua25vd24xGAEgASgFElgKCHVua25vd24yGAIgASgLMkYu",
+            "UG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLkVuY291bnRlclJl",
+            "c3BvbnNlLlVua25vd242LlVua25vd24yGhwKCFVua25vd24yEhAKCHVua25v",
+            "d24xGAEgASgMGkMKCFVua25vd243EhEKCXVua25vd243MRgBIAEoDBIRCgl1",
+            "bmtub3duNzIYAiABKAMSEQoJdW5rbm93bjczGAMgASgMGloKB1BheWxvYWQS",
+            "DwoHUG9rZW1vbhgBIAEoBRISCgpCYWNrZ3JvdW5kGAIgASgFEg4KBlN0YXR1",
+            "cxgDIAEoBRIaChJDYXB0dXJlUHJvYmFiaWxpdHkYBCABKAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse), global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Parser, new[]{ "Unknown1", "Unknown2", "ApiUrl", "Unknown6", "Unknown7", "Payload", "ErrorMessage" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6), global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6.Parser, new[]{ "Unknown1", "Unknown2" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6.Types.Unknown2), global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6.Types.Unknown2.Parser, new[]{ "Unknown1" }, null, null, null)}),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown7), global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown7.Parser, new[]{ "Unknown71", "Unknown72", "Unknown73" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Payload), global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Payload.Parser, new[]{ "Pokemon", "Background", "Status", "CaptureProbability" }, null, null, null)})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class EncounterResponse : pb::IMessage<EncounterResponse> {
+    private static readonly pb::MessageParser<EncounterResponse> _parser = new pb::MessageParser<EncounterResponse>(() => new EncounterResponse());
+    public static pb::MessageParser<EncounterResponse> Parser { get { return _parser; } }
+
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    public EncounterResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    public EncounterResponse(EncounterResponse other) : this() {
+      unknown1_ = other.unknown1_;
+      unknown2_ = other.unknown2_;
+      apiUrl_ = other.apiUrl_;
+      Unknown6 = other.unknown6_ != null ? other.Unknown6.Clone() : null;
+      Unknown7 = other.unknown7_ != null ? other.Unknown7.Clone() : null;
+      payload_ = other.payload_.Clone();
+      errorMessage_ = other.errorMessage_;
+    }
+
+    public EncounterResponse Clone() {
+      return new EncounterResponse(this);
+    }
+
+    /// <summary>Field number for the "unknown1" field.</summary>
+    public const int Unknown1FieldNumber = 1;
+    private int unknown1_;
+    public int Unknown1 {
+      get { return unknown1_; }
+      set {
+        unknown1_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown2" field.</summary>
+    public const int Unknown2FieldNumber = 2;
+    private long unknown2_;
+    public long Unknown2 {
+      get { return unknown2_; }
+      set {
+        unknown2_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "api_url" field.</summary>
+    public const int ApiUrlFieldNumber = 3;
+    private string apiUrl_ = "";
+    public string ApiUrl {
+      get { return apiUrl_; }
+      set {
+        apiUrl_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "unknown6" field.</summary>
+    public const int Unknown6FieldNumber = 6;
+    private global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6 unknown6_;
+    public global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6 Unknown6 {
+      get { return unknown6_; }
+      set {
+        unknown6_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown7" field.</summary>
+    public const int Unknown7FieldNumber = 7;
+    private global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown7 unknown7_;
+    public global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown7 Unknown7 {
+      get { return unknown7_; }
+      set {
+        unknown7_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "payload" field.</summary>
+    public const int PayloadFieldNumber = 100;
+    private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Payload> _repeated_payload_codec
+        = pb::FieldCodec.ForMessage(802, global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Payload.Parser);
+    private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Payload> payload_ = new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Payload>();
+    public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Payload> Payload {
+      get { return payload_; }
+    }
+
+    /// <summary>Field number for the "errorMessage" field.</summary>
+    public const int ErrorMessageFieldNumber = 101;
+    private string errorMessage_ = "";
+    /// <summary>
+    /// Should be moved to an error-proto file if error is always 101 field
+    /// </summary>
+    public string ErrorMessage {
+      get { return errorMessage_; }
+      set {
+        errorMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as EncounterResponse);
+    }
+
+    public bool Equals(EncounterResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Unknown1 != other.Unknown1) return false;
+      if (Unknown2 != other.Unknown2) return false;
+      if (ApiUrl != other.ApiUrl) return false;
+      if (!object.Equals(Unknown6, other.Unknown6)) return false;
+      if (!object.Equals(Unknown7, other.Unknown7)) return false;
+      if(!payload_.Equals(other.payload_)) return false;
+      if (ErrorMessage != other.ErrorMessage) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
+      if (Unknown2 != 0L) hash ^= Unknown2.GetHashCode();
+      if (ApiUrl.Length != 0) hash ^= ApiUrl.GetHashCode();
+      if (unknown6_ != null) hash ^= Unknown6.GetHashCode();
+      if (unknown7_ != null) hash ^= Unknown7.GetHashCode();
+      hash ^= payload_.GetHashCode();
+      if (ErrorMessage.Length != 0) hash ^= ErrorMessage.GetHashCode();
+      return hash;
+    }
+
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Unknown1 != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(Unknown1);
+      }
+      if (Unknown2 != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(Unknown2);
+      }
+      if (ApiUrl.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(ApiUrl);
+      }
+      if (unknown6_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(Unknown6);
+      }
+      if (unknown7_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(Unknown7);
+      }
+      payload_.WriteTo(output, _repeated_payload_codec);
+      if (ErrorMessage.Length != 0) {
+        output.WriteRawTag(170, 6);
+        output.WriteString(ErrorMessage);
+      }
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      if (Unknown1 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
+      }
+      if (Unknown2 != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown2);
+      }
+      if (ApiUrl.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(ApiUrl);
+      }
+      if (unknown6_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown6);
+      }
+      if (unknown7_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown7);
+      }
+      size += payload_.CalculateSize(_repeated_payload_codec);
+      if (ErrorMessage.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(ErrorMessage);
+      }
+      return size;
+    }
+
+    public void MergeFrom(EncounterResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Unknown1 != 0) {
+        Unknown1 = other.Unknown1;
+      }
+      if (other.Unknown2 != 0L) {
+        Unknown2 = other.Unknown2;
+      }
+      if (other.ApiUrl.Length != 0) {
+        ApiUrl = other.ApiUrl;
+      }
+      if (other.unknown6_ != null) {
+        if (unknown6_ == null) {
+          unknown6_ = new global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6();
+        }
+        Unknown6.MergeFrom(other.Unknown6);
+      }
+      if (other.unknown7_ != null) {
+        if (unknown7_ == null) {
+          unknown7_ = new global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown7();
+        }
+        Unknown7.MergeFrom(other.Unknown7);
+      }
+      payload_.Add(other.payload_);
+      if (other.ErrorMessage.Length != 0) {
+        ErrorMessage = other.ErrorMessage;
+      }
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Unknown1 = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            Unknown2 = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            ApiUrl = input.ReadString();
+            break;
+          }
+          case 50: {
+            if (unknown6_ == null) {
+              unknown6_ = new global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6();
+            }
+            input.ReadMessage(unknown6_);
+            break;
+          }
+          case 58: {
+            if (unknown7_ == null) {
+              unknown7_ = new global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown7();
+            }
+            input.ReadMessage(unknown7_);
+            break;
+          }
+          case 802: {
+            payload_.AddEntriesFrom(input, _repeated_payload_codec);
+            break;
+          }
+          case 810: {
+            ErrorMessage = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the EncounterResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Unknown6 : pb::IMessage<Unknown6> {
+        private static readonly pb::MessageParser<Unknown6> _parser = new pb::MessageParser<Unknown6>(() => new Unknown6());
+        public static pb::MessageParser<Unknown6> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Descriptor.NestedTypes[0]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public Unknown6() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public Unknown6(Unknown6 other) : this() {
+          unknown1_ = other.unknown1_;
+          Unknown2 = other.unknown2_ != null ? other.Unknown2.Clone() : null;
+        }
+
+        public Unknown6 Clone() {
+          return new Unknown6(this);
+        }
+
+        /// <summary>Field number for the "unknown1" field.</summary>
+        public const int Unknown1FieldNumber = 1;
+        private int unknown1_;
+        public int Unknown1 {
+          get { return unknown1_; }
+          set {
+            unknown1_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unknown2" field.</summary>
+        public const int Unknown2FieldNumber = 2;
+        private global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6.Types.Unknown2 unknown2_;
+        public global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6.Types.Unknown2 Unknown2 {
+          get { return unknown2_; }
+          set {
+            unknown2_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Unknown6);
+        }
+
+        public bool Equals(Unknown6 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown1 != other.Unknown1) return false;
+          if (!object.Equals(Unknown2, other.Unknown2)) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
+          if (unknown2_ != null) hash ^= Unknown2.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown1 != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Unknown1);
+          }
+          if (unknown2_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(Unknown2);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown1 != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
+          }
+          if (unknown2_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown2);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Unknown6 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown1 != 0) {
+            Unknown1 = other.Unknown1;
+          }
+          if (other.unknown2_ != null) {
+            if (unknown2_ == null) {
+              unknown2_ = new global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6.Types.Unknown2();
+            }
+            Unknown2.MergeFrom(other.Unknown2);
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 8: {
+                Unknown1 = input.ReadInt32();
+                break;
+              }
+              case 18: {
+                if (unknown2_ == null) {
+                  unknown2_ = new global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6.Types.Unknown2();
+                }
+                input.ReadMessage(unknown2_);
+                break;
+              }
+            }
+          }
+        }
+
+        #region Nested types
+        /// <summary>Container for nested types declared in the Unknown6 message type.</summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public static partial class Types {
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+          public sealed partial class Unknown2 : pb::IMessage<Unknown2> {
+            private static readonly pb::MessageParser<Unknown2> _parser = new pb::MessageParser<Unknown2>(() => new Unknown2());
+            public static pb::MessageParser<Unknown2> Parser { get { return _parser; } }
+
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Types.Unknown6.Descriptor.NestedTypes[0]; }
+            }
+
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            public Unknown2() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            public Unknown2(Unknown2 other) : this() {
+              unknown1_ = other.unknown1_;
+            }
+
+            public Unknown2 Clone() {
+              return new Unknown2(this);
+            }
+
+            /// <summary>Field number for the "unknown1" field.</summary>
+            public const int Unknown1FieldNumber = 1;
+            private pb::ByteString unknown1_ = pb::ByteString.Empty;
+            public pb::ByteString Unknown1 {
+              get { return unknown1_; }
+              set {
+                unknown1_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+              }
+            }
+
+            public override bool Equals(object other) {
+              return Equals(other as Unknown2);
+            }
+
+            public bool Equals(Unknown2 other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (Unknown1 != other.Unknown1) return false;
+              return true;
+            }
+
+            public override int GetHashCode() {
+              int hash = 1;
+              if (Unknown1.Length != 0) hash ^= Unknown1.GetHashCode();
+              return hash;
+            }
+
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (Unknown1.Length != 0) {
+                output.WriteRawTag(10);
+                output.WriteBytes(Unknown1);
+              }
+            }
+
+            public int CalculateSize() {
+              int size = 0;
+              if (Unknown1.Length != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown1);
+              }
+              return size;
+            }
+
+            public void MergeFrom(Unknown2 other) {
+              if (other == null) {
+                return;
+              }
+              if (other.Unknown1.Length != 0) {
+                Unknown1 = other.Unknown1;
+              }
+            }
+
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 10: {
+                    Unknown1 = input.ReadBytes();
+                    break;
+                  }
+                }
+              }
+            }
+
+          }
+
+        }
+        #endregion
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Unknown7 : pb::IMessage<Unknown7> {
+        private static readonly pb::MessageParser<Unknown7> _parser = new pb::MessageParser<Unknown7>(() => new Unknown7());
+        public static pb::MessageParser<Unknown7> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Descriptor.NestedTypes[1]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public Unknown7() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public Unknown7(Unknown7 other) : this() {
+          unknown71_ = other.unknown71_;
+          unknown72_ = other.unknown72_;
+          unknown73_ = other.unknown73_;
+        }
+
+        public Unknown7 Clone() {
+          return new Unknown7(this);
+        }
+
+        /// <summary>Field number for the "unknown71" field.</summary>
+        public const int Unknown71FieldNumber = 1;
+        private pb::ByteString unknown71_ = pb::ByteString.Empty;
+        public pb::ByteString Unknown71 {
+          get { return unknown71_; }
+          set {
+            unknown71_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "unknown72" field.</summary>
+        public const int Unknown72FieldNumber = 2;
+        private long unknown72_;
+        public long Unknown72 {
+          get { return unknown72_; }
+          set {
+            unknown72_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unknown73" field.</summary>
+        public const int Unknown73FieldNumber = 3;
+        private pb::ByteString unknown73_ = pb::ByteString.Empty;
+        public pb::ByteString Unknown73 {
+          get { return unknown73_; }
+          set {
+            unknown73_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Unknown7);
+        }
+
+        public bool Equals(Unknown7 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown71 != other.Unknown71) return false;
+          if (Unknown72 != other.Unknown72) return false;
+          if (Unknown73 != other.Unknown73) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown71.Length != 0) hash ^= Unknown71.GetHashCode();
+          if (Unknown72 != 0L) hash ^= Unknown72.GetHashCode();
+          if (Unknown73.Length != 0) hash ^= Unknown73.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown71.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteBytes(Unknown71);
+          }
+          if (Unknown72 != 0L) {
+            output.WriteRawTag(16);
+            output.WriteInt64(Unknown72);
+          }
+          if (Unknown73.Length != 0) {
+            output.WriteRawTag(26);
+            output.WriteBytes(Unknown73);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown71.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown71);
+          }
+          if (Unknown72 != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown72);
+          }
+          if (Unknown73.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown73);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Unknown7 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown71.Length != 0) {
+            Unknown71 = other.Unknown71;
+          }
+          if (other.Unknown72 != 0L) {
+            Unknown72 = other.Unknown72;
+          }
+          if (other.Unknown73.Length != 0) {
+            Unknown73 = other.Unknown73;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                Unknown71 = input.ReadBytes();
+                break;
+              }
+              case 16: {
+                Unknown72 = input.ReadInt64();
+                break;
+              }
+              case 26: {
+                Unknown73 = input.ReadBytes();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Payload : pb::IMessage<Payload> {
+        private static readonly pb::MessageParser<Payload> _parser = new pb::MessageParser<Payload>(() => new Payload());
+        public static pb::MessageParser<Payload> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.EncounterResponse.Descriptor.NestedTypes[2]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public Payload() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public Payload(Payload other) : this() {
+          pokemon_ = other.pokemon_;
+          background_ = other.background_;
+          status_ = other.status_;
+          captureProbability_ = other.captureProbability_;
+        }
+
+        public Payload Clone() {
+          return new Payload(this);
+        }
+
+        /// <summary>Field number for the "Pokemon" field.</summary>
+        public const int PokemonFieldNumber = 1;
+        private int pokemon_;
+        public int Pokemon {
+          get { return pokemon_; }
+          set {
+            pokemon_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "Background" field.</summary>
+        public const int BackgroundFieldNumber = 2;
+        private int background_;
+        public int Background {
+          get { return background_; }
+          set {
+            background_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "Status" field.</summary>
+        public const int StatusFieldNumber = 3;
+        private int status_;
+        public int Status {
+          get { return status_; }
+          set {
+            status_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "CaptureProbability" field.</summary>
+        public const int CaptureProbabilityFieldNumber = 4;
+        private int captureProbability_;
+        public int CaptureProbability {
+          get { return captureProbability_; }
+          set {
+            captureProbability_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Payload);
+        }
+
+        public bool Equals(Payload other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Pokemon != other.Pokemon) return false;
+          if (Background != other.Background) return false;
+          if (Status != other.Status) return false;
+          if (CaptureProbability != other.CaptureProbability) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Pokemon != 0) hash ^= Pokemon.GetHashCode();
+          if (Background != 0) hash ^= Background.GetHashCode();
+          if (Status != 0) hash ^= Status.GetHashCode();
+          if (CaptureProbability != 0) hash ^= CaptureProbability.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Pokemon != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Pokemon);
+          }
+          if (Background != 0) {
+            output.WriteRawTag(16);
+            output.WriteInt32(Background);
+          }
+          if (Status != 0) {
+            output.WriteRawTag(24);
+            output.WriteInt32(Status);
+          }
+          if (CaptureProbability != 0) {
+            output.WriteRawTag(32);
+            output.WriteInt32(CaptureProbability);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Pokemon != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Pokemon);
+          }
+          if (Background != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Background);
+          }
+          if (Status != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Status);
+          }
+          if (CaptureProbability != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(CaptureProbability);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Payload other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Pokemon != 0) {
+            Pokemon = other.Pokemon;
+          }
+          if (other.Background != 0) {
+            Background = other.Background;
+          }
+          if (other.Status != 0) {
+            Status = other.Status;
+          }
+          if (other.CaptureProbability != 0) {
+            CaptureProbability = other.CaptureProbability;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 8: {
+                Pokemon = input.ReadInt32();
+                break;
+              }
+              case 16: {
+                Background = input.ReadInt32();
+                break;
+              }
+              case 24: {
+                Status = input.ReadInt32();
+                break;
+              }
+              case 32: {
+                CaptureProbability = input.ReadInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/RocketAPI/GeneratedCode/MapObjectsResponse.cs b/PokemonGo/RocketAPI/GeneratedCode/MapObjectsResponse.cs
index bfbfd10..59ab48f 100644
--- a/PokemonGo/RocketAPI/GeneratedCode/MapObjectsResponse.cs
+++ b/PokemonGo/RocketAPI/GeneratedCode/MapObjectsResponse.cs
@@ -62,7 +62,7 @@ namespace PokemonGo.RocketAPI.GeneratedCode {
             "ZW1vbhgLIAMoCzJQLlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29k",
             "ZS5NYXBPYmplY3RzUmVzcG9uc2UuUGF5bG9hZC5OZWFyYnlQb2tlbW9uUHJv",
             "dG8akgEKD01hcFBva2Vtb25Qcm90bxIUCgxTcGF3bnBvaW50SWQYASABKAkS",
-            "EwoLRW5jb3VudGVySWQYAiABKAQSFQoNUG9rZWRleFR5cGVJZBgDIAEoBRIY",
+            "EwoLRW5jb3VudGVySWQYAiABKAYSFQoNUG9rZWRleFR5cGVJZBgDIAEoBRIY",
             "ChBFeHBpcmF0aW9uVGltZU1zGAQgASgDEhAKCExhdGl0dWRlGAUgASgBEhEK",
             "CUxvbmdpdHVkZRgGIAEoARqUAwoQUG9rZW1vbkZvcnRQcm90bxIOCgZGb3J0",
             "SWQYASABKAkSFgoOTGFzdE1vZGlmaWVkTXMYAiABKAMSEAoITGF0aXR1ZGUY",
@@ -1488,8 +1488,8 @@ namespace PokemonGo.RocketAPI.GeneratedCode {
                 output.WriteString(SpawnpointId);
               }
               if (EncounterId != 0UL) {
-                output.WriteRawTag(16);
-                output.WriteUInt64(EncounterId);
+                output.WriteRawTag(17);
+                output.WriteFixed64(EncounterId);
               }
               if (PokedexTypeId != 0) {
                 output.WriteRawTag(24);
@@ -1515,7 +1515,7 @@ namespace PokemonGo.RocketAPI.GeneratedCode {
                 size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnpointId);
               }
               if (EncounterId != 0UL) {
-                size += 1 + pb::CodedOutputStream.ComputeUInt64Size(EncounterId);
+                size += 1 + 8;
               }
               if (PokedexTypeId != 0) {
                 size += 1 + pb::CodedOutputStream.ComputeInt32Size(PokedexTypeId);
@@ -1567,8 +1567,8 @@ namespace PokemonGo.RocketAPI.GeneratedCode {
                     SpawnpointId = input.ReadString();
                     break;
                   }
-                  case 16: {
-                    EncounterId = input.ReadUInt64();
+                  case 17: {
+                    EncounterId = input.ReadFixed64();
                     break;
                   }
                   case 24: {
diff --git a/PokemonGo/RocketAPI/GeneratedCode/Request.cs b/PokemonGo/RocketAPI/GeneratedCode/Request.cs
index fc703b9..4cda532 100644
--- a/PokemonGo/RocketAPI/GeneratedCode/Request.cs
+++ b/PokemonGo/RocketAPI/GeneratedCode/Request.cs
@@ -24,7 +24,7 @@ namespace PokemonGo.RocketAPI.GeneratedCode {
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
             "Cg1SZXF1ZXN0LnByb3RvEiFQb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRl",
-            "ZENvZGUi0gkKB1JlcXVlc3QSEAoIdW5rbm93bjEYASABKAUSDgoGcnBjX2lk",
+            "ZENvZGUihAwKB1JlcXVlc3QSEAoIdW5rbm93bjEYASABKAUSDgoGcnBjX2lk",
             "GAMgASgDEkUKCHJlcXVlc3RzGAQgAygLMjMuUG9rZW1vbkdvLlJvY2tldEFQ",
             "SS5HZW5lcmF0ZWRDb2RlLlJlcXVlc3QuUmVxdWVzdHMSRQoIdW5rbm93bjYY",
             "BiABKAsyMy5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENvZGUuUmVx",
@@ -50,8 +50,15 @@ namespace PokemonGo.RocketAPI.GeneratedCode {
             "cmVlcxgCIAEoBhIYChBQbGF5ZXJMbmdEZWdyZWVzGAMgASgGEhYKDkZvcnRM",
             "YXREZWdyZWVzGAQgASgGEhYKDkZvcnRMbmdEZWdyZWVzGAUgASgGGkUKEkZv",
             "cnREZXRhaWxzUmVxdWVzdBIKCgJJZBgBIAEoDBIQCghMYXRpdHVkZRgCIAEo",
-            "BhIRCglMb25naXR1ZGUYAyABKAYaHAoMU2V0dGluZ3NHdWlkEgwKBGd1aWQY",
-            "ASABKAwaFAoEVGltZRIMCgR0aW1lGAEgASgDYgZwcm90bzM="));
+            "BhIRCglMb25naXR1ZGUYAyABKAYacQoQRW5jb3VudGVyUmVxdWVzdBITCgtF",
+            "bmNvdW50ZXJJZBgBIAEoBhIUCgxTcGF3bnBvaW50SWQYAiABKAkSGAoQUGxh",
+            "eWVyTGF0RGVncmVlcxgDIAEoBhIYChBQbGF5ZXJMbmdEZWdyZWVzGAQgASgG",
+            "GrwBChNDYXRjaFBva2Vtb25SZXF1ZXN0EhMKC0VuY291bnRlcklkGAEgASgG",
+            "EhAKCFBva2ViYWxsGAIgASgFEh0KFU5vcm1hbGl6ZWRSZXRpY2xlU2l6ZRgD",
+            "IAEoBhIWCg5TcGF3blBvaW50R3VpZBgEIAEoCRISCgpIaXRQb2tlbW9uGAUg",
+            "ASgFEhQKDFNwaW5Nb2RpZmllchgGIAEoBhIdChVOb3JtYWxpemVkSGl0UG9z",
+            "aXRpb24YByABKAYaHAoMU2V0dGluZ3NHdWlkEgwKBGd1aWQYASABKAwaFAoE",
+            "VGltZRIMCgR0aW1lGAEgASgDYgZwcm90bzM="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
@@ -64,6 +71,8 @@ namespace PokemonGo.RocketAPI.GeneratedCode {
             new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.MapObjectsRequest), global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.MapObjectsRequest.Parser, new[]{ "CellIds", "Unknown14", "Latitude", "Longitude" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.FortSearchRequest), global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.FortSearchRequest.Parser, new[]{ "Id", "PlayerLatDegrees", "PlayerLngDegrees", "FortLatDegrees", "FortLngDegrees" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.FortDetailsRequest), global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.FortDetailsRequest.Parser, new[]{ "Id", "Latitude", "Longitude" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.EncounterRequest), global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.EncounterRequest.Parser, new[]{ "EncounterId", "SpawnpointId", "PlayerLatDegrees", "PlayerLngDegrees" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.CatchPokemonRequest), global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.CatchPokemonRequest.Parser, new[]{ "EncounterId", "Pokeball", "NormalizedReticleSize", "SpawnPointGuid", "HitPokemon", "SpinModifier", "NormalizedHitPosition" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.SettingsGuid), global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.SettingsGuid.Parser, new[]{ "Guid" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Time), global::PokemonGo.RocketAPI.GeneratedCode.Request.Types.Time.Parser, new[]{ "Time_" }, null, null, null)})
           }));
@@ -2021,13 +2030,462 @@ namespace PokemonGo.RocketAPI.GeneratedCode {

       }

+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class EncounterRequest : pb::IMessage<EncounterRequest> {
+        private static readonly pb::MessageParser<EncounterRequest> _parser = new pb::MessageParser<EncounterRequest>(() => new EncounterRequest());
+        public static pb::MessageParser<EncounterRequest> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[9]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public EncounterRequest() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public EncounterRequest(EncounterRequest other) : this() {
+          encounterId_ = other.encounterId_;
+          spawnpointId_ = other.spawnpointId_;
+          playerLatDegrees_ = other.playerLatDegrees_;
+          playerLngDegrees_ = other.playerLngDegrees_;
+        }
+
+        public EncounterRequest Clone() {
+          return new EncounterRequest(this);
+        }
+
+        /// <summary>Field number for the "EncounterId" field.</summary>
+        public const int EncounterIdFieldNumber = 1;
+        private ulong encounterId_;
+        public ulong EncounterId {
+          get { return encounterId_; }
+          set {
+            encounterId_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "SpawnpointId" field.</summary>
+        public const int SpawnpointIdFieldNumber = 2;
+        private string spawnpointId_ = "";
+        public string SpawnpointId {
+          get { return spawnpointId_; }
+          set {
+            spawnpointId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "PlayerLatDegrees" field.</summary>
+        public const int PlayerLatDegreesFieldNumber = 3;
+        private ulong playerLatDegrees_;
+        public ulong PlayerLatDegrees {
+          get { return playerLatDegrees_; }
+          set {
+            playerLatDegrees_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "PlayerLngDegrees" field.</summary>
+        public const int PlayerLngDegreesFieldNumber = 4;
+        private ulong playerLngDegrees_;
+        public ulong PlayerLngDegrees {
+          get { return playerLngDegrees_; }
+          set {
+            playerLngDegrees_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as EncounterRequest);
+        }
+
+        public bool Equals(EncounterRequest other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (EncounterId != other.EncounterId) return false;
+          if (SpawnpointId != other.SpawnpointId) return false;
+          if (PlayerLatDegrees != other.PlayerLatDegrees) return false;
+          if (PlayerLngDegrees != other.PlayerLngDegrees) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+          if (SpawnpointId.Length != 0) hash ^= SpawnpointId.GetHashCode();
+          if (PlayerLatDegrees != 0UL) hash ^= PlayerLatDegrees.GetHashCode();
+          if (PlayerLngDegrees != 0UL) hash ^= PlayerLngDegrees.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (EncounterId != 0UL) {
+            output.WriteRawTag(9);
+            output.WriteFixed64(EncounterId);
+          }
+          if (SpawnpointId.Length != 0) {
+            output.WriteRawTag(18);
+            output.WriteString(SpawnpointId);
+          }
+          if (PlayerLatDegrees != 0UL) {
+            output.WriteRawTag(25);
+            output.WriteFixed64(PlayerLatDegrees);
+          }
+          if (PlayerLngDegrees != 0UL) {
+            output.WriteRawTag(33);
+            output.WriteFixed64(PlayerLngDegrees);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (EncounterId != 0UL) {
+            size += 1 + 8;
+          }
+          if (SpawnpointId.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnpointId);
+          }
+          if (PlayerLatDegrees != 0UL) {
+            size += 1 + 8;
+          }
+          if (PlayerLngDegrees != 0UL) {
+            size += 1 + 8;
+          }
+          return size;
+        }
+
+        public void MergeFrom(EncounterRequest other) {
+          if (other == null) {
+            return;
+          }
+          if (other.EncounterId != 0UL) {
+            EncounterId = other.EncounterId;
+          }
+          if (other.SpawnpointId.Length != 0) {
+            SpawnpointId = other.SpawnpointId;
+          }
+          if (other.PlayerLatDegrees != 0UL) {
+            PlayerLatDegrees = other.PlayerLatDegrees;
+          }
+          if (other.PlayerLngDegrees != 0UL) {
+            PlayerLngDegrees = other.PlayerLngDegrees;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 9: {
+                EncounterId = input.ReadFixed64();
+                break;
+              }
+              case 18: {
+                SpawnpointId = input.ReadString();
+                break;
+              }
+              case 25: {
+                PlayerLatDegrees = input.ReadFixed64();
+                break;
+              }
+              case 33: {
+                PlayerLngDegrees = input.ReadFixed64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class CatchPokemonRequest : pb::IMessage<CatchPokemonRequest> {
+        private static readonly pb::MessageParser<CatchPokemonRequest> _parser = new pb::MessageParser<CatchPokemonRequest>(() => new CatchPokemonRequest());
+        public static pb::MessageParser<CatchPokemonRequest> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[10]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public CatchPokemonRequest() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public CatchPokemonRequest(CatchPokemonRequest other) : this() {
+          encounterId_ = other.encounterId_;
+          pokeball_ = other.pokeball_;
+          normalizedReticleSize_ = other.normalizedReticleSize_;
+          spawnPointGuid_ = other.spawnPointGuid_;
+          hitPokemon_ = other.hitPokemon_;
+          spinModifier_ = other.spinModifier_;
+          normalizedHitPosition_ = other.normalizedHitPosition_;
+        }
+
+        public CatchPokemonRequest Clone() {
+          return new CatchPokemonRequest(this);
+        }
+
+        /// <summary>Field number for the "EncounterId" field.</summary>
+        public const int EncounterIdFieldNumber = 1;
+        private ulong encounterId_;
+        public ulong EncounterId {
+          get { return encounterId_; }
+          set {
+            encounterId_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "Pokeball" field.</summary>
+        public const int PokeballFieldNumber = 2;
+        private int pokeball_;
+        public int Pokeball {
+          get { return pokeball_; }
+          set {
+            pokeball_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "NormalizedReticleSize" field.</summary>
+        public const int NormalizedReticleSizeFieldNumber = 3;
+        private ulong normalizedReticleSize_;
+        public ulong NormalizedReticleSize {
+          get { return normalizedReticleSize_; }
+          set {
+            normalizedReticleSize_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "SpawnPointGuid" field.</summary>
+        public const int SpawnPointGuidFieldNumber = 4;
+        private string spawnPointGuid_ = "";
+        public string SpawnPointGuid {
+          get { return spawnPointGuid_; }
+          set {
+            spawnPointGuid_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "HitPokemon" field.</summary>
+        public const int HitPokemonFieldNumber = 5;
+        private int hitPokemon_;
+        public int HitPokemon {
+          get { return hitPokemon_; }
+          set {
+            hitPokemon_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "SpinModifier" field.</summary>
+        public const int SpinModifierFieldNumber = 6;
+        private ulong spinModifier_;
+        public ulong SpinModifier {
+          get { return spinModifier_; }
+          set {
+            spinModifier_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "NormalizedHitPosition" field.</summary>
+        public const int NormalizedHitPositionFieldNumber = 7;
+        private ulong normalizedHitPosition_;
+        public ulong NormalizedHitPosition {
+          get { return normalizedHitPosition_; }
+          set {
+            normalizedHitPosition_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as CatchPokemonRequest);
+        }
+
+        public bool Equals(CatchPokemonRequest other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (EncounterId != other.EncounterId) return false;
+          if (Pokeball != other.Pokeball) return false;
+          if (NormalizedReticleSize != other.NormalizedReticleSize) return false;
+          if (SpawnPointGuid != other.SpawnPointGuid) return false;
+          if (HitPokemon != other.HitPokemon) return false;
+          if (SpinModifier != other.SpinModifier) return false;
+          if (NormalizedHitPosition != other.NormalizedHitPosition) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (EncounterId != 0UL) hash ^= EncounterId.GetHashCode();
+          if (Pokeball != 0) hash ^= Pokeball.GetHashCode();
+          if (NormalizedReticleSize != 0UL) hash ^= NormalizedReticleSize.GetHashCode();
+          if (SpawnPointGuid.Length != 0) hash ^= SpawnPointGuid.GetHashCode();
+          if (HitPokemon != 0) hash ^= HitPokemon.GetHashCode();
+          if (SpinModifier != 0UL) hash ^= SpinModifier.GetHashCode();
+          if (NormalizedHitPosition != 0UL) hash ^= NormalizedHitPosition.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (EncounterId != 0UL) {
+            output.WriteRawTag(9);
+            output.WriteFixed64(EncounterId);
+          }
+          if (Pokeball != 0) {
+            output.WriteRawTag(16);
+            output.WriteInt32(Pokeball);
+          }
+          if (NormalizedReticleSize != 0UL) {
+            output.WriteRawTag(25);
+            output.WriteFixed64(NormalizedReticleSize);
+          }
+          if (SpawnPointGuid.Length != 0) {
+            output.WriteRawTag(34);
+            output.WriteString(SpawnPointGuid);
+          }
+          if (HitPokemon != 0) {
+            output.WriteRawTag(40);
+            output.WriteInt32(HitPokemon);
+          }
+          if (SpinModifier != 0UL) {
+            output.WriteRawTag(49);
+            output.WriteFixed64(SpinModifier);
+          }
+          if (NormalizedHitPosition != 0UL) {
+            output.WriteRawTag(57);
+            output.WriteFixed64(NormalizedHitPosition);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (EncounterId != 0UL) {
+            size += 1 + 8;
+          }
+          if (Pokeball != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Pokeball);
+          }
+          if (NormalizedReticleSize != 0UL) {
+            size += 1 + 8;
+          }
+          if (SpawnPointGuid.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(SpawnPointGuid);
+          }
+          if (HitPokemon != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(HitPokemon);
+          }
+          if (SpinModifier != 0UL) {
+            size += 1 + 8;
+          }
+          if (NormalizedHitPosition != 0UL) {
+            size += 1 + 8;
+          }
+          return size;
+        }
+
+        public void MergeFrom(CatchPokemonRequest other) {
+          if (other == null) {
+            return;
+          }
+          if (other.EncounterId != 0UL) {
+            EncounterId = other.EncounterId;
+          }
+          if (other.Pokeball != 0) {
+            Pokeball = other.Pokeball;
+          }
+          if (other.NormalizedReticleSize != 0UL) {
+            NormalizedReticleSize = other.NormalizedReticleSize;
+          }
+          if (other.SpawnPointGuid.Length != 0) {
+            SpawnPointGuid = other.SpawnPointGuid;
+          }
+          if (other.HitPokemon != 0) {
+            HitPokemon = other.HitPokemon;
+          }
+          if (other.SpinModifier != 0UL) {
+            SpinModifier = other.SpinModifier;
+          }
+          if (other.NormalizedHitPosition != 0UL) {
+            NormalizedHitPosition = other.NormalizedHitPosition;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 9: {
+                EncounterId = input.ReadFixed64();
+                break;
+              }
+              case 16: {
+                Pokeball = input.ReadInt32();
+                break;
+              }
+              case 25: {
+                NormalizedReticleSize = input.ReadFixed64();
+                break;
+              }
+              case 34: {
+                SpawnPointGuid = input.ReadString();
+                break;
+              }
+              case 40: {
+                HitPokemon = input.ReadInt32();
+                break;
+              }
+              case 49: {
+                SpinModifier = input.ReadFixed64();
+                break;
+              }
+              case 57: {
+                NormalizedHitPosition = input.ReadFixed64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
       [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       public sealed partial class SettingsGuid : pb::IMessage<SettingsGuid> {
         private static readonly pb::MessageParser<SettingsGuid> _parser = new pb::MessageParser<SettingsGuid>(() => new SettingsGuid());
         public static pb::MessageParser<SettingsGuid> Parser { get { return _parser; } }

         public static pbr::MessageDescriptor Descriptor {
-          get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[9]; }
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[11]; }
         }

         pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -2130,7 +2588,7 @@ namespace PokemonGo.RocketAPI.GeneratedCode {
         public static pb::MessageParser<Time> Parser { get { return _parser; } }

         public static pbr::MessageDescriptor Descriptor {
-          get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[10]; }
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.Request.Descriptor.NestedTypes[12]; }
         }

         pbr::MessageDescriptor pb::IMessage.Descriptor {
diff --git a/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj b/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
index ac38e10..d11cd45 100644
--- a/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
+++ b/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
@@ -79,6 +79,8 @@
     <Compile Include="Enums\MiscEnums.cs" />
     <Compile Include="Enums\RequestType.cs" />
     <Compile Include="Extensions\DateTimeExtensions.cs" />
+    <Compile Include="GeneratedCode\CatchPokemonResponse.cs" />
+    <Compile Include="GeneratedCode\EncounterResponse.cs" />
     <Compile Include="GeneratedCode\FortDetailResponse.cs" />
     <Compile Include="GeneratedCode\FortSearchResponse.cs" />
     <Compile Include="GeneratedCode\MapObjectsResponse.cs" />
@@ -102,6 +104,8 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
+    <None Include="Proto\EncounterResponse.proto" />
+    <None Include="Proto\CatchPokemonResponse.proto" />
     <None Include="Proto\FortDetailResponse.proto" />
     <None Include="Proto\FortSearchResponse.proto" />
     <None Include="Proto\PlayerUpdateResponse.proto" />
diff --git a/PokemonGo/RocketAPI/Proto/CatchPokemonResponse.proto b/PokemonGo/RocketAPI/Proto/CatchPokemonResponse.proto
new file mode 100644
index 0000000..9b6021f
--- /dev/null
+++ b/PokemonGo/RocketAPI/Proto/CatchPokemonResponse.proto
@@ -0,0 +1,37 @@
+syntax = "proto3";
+
+package PokemonGo.RocketAPI.GeneratedCode;
+
+message CatchPokemonResponse {
+  int32 unknown1 = 1;
+  int64 unknown2 = 2;
+  string api_url = 3;
+  Unknown6 unknown6 = 6;
+  Unknown7 unknown7 = 7;
+  repeated Payload payload = 100;
+  string errorMessage = 101; //Should be moved to an error-proto file if error is always 101 field
+
+  message Unknown6 {
+    int32 unknown1 = 1;
+    Unknown2 unknown2 = 2;
+
+    message Unknown2 {
+      bytes unknown1 = 1;
+    }
+
+  }
+
+  message Unknown7 {
+    bytes unknown71 = 1;
+    int64 unknown72 = 2;
+    bytes unknown73 = 3;
+  }
+
+  message Payload {
+	int32 Status = 1;
+	int32 MissPercent = 2;
+	int32 CapturedPokemonId = 3;
+	int32 Scores = 4;
+}
+
+  }
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Proto/EncounterResponse.proto b/PokemonGo/RocketAPI/Proto/EncounterResponse.proto
new file mode 100644
index 0000000..91485e4
--- /dev/null
+++ b/PokemonGo/RocketAPI/Proto/EncounterResponse.proto
@@ -0,0 +1,37 @@
+syntax = "proto3";
+
+package PokemonGo.RocketAPI.GeneratedCode;
+
+message EncounterResponse {
+  int32 unknown1 = 1;
+  int64 unknown2 = 2;
+  string api_url = 3;
+  Unknown6 unknown6 = 6;
+  Unknown7 unknown7 = 7;
+  repeated Payload payload = 100;
+  string errorMessage = 101; //Should be moved to an error-proto file if error is always 101 field
+
+  message Unknown6 {
+    int32 unknown1 = 1;
+    Unknown2 unknown2 = 2;
+
+    message Unknown2 {
+      bytes unknown1 = 1;
+    }
+
+  }
+
+  message Unknown7 {
+    bytes unknown71 = 1;
+    int64 unknown72 = 2;
+    bytes unknown73 = 3;
+  }
+
+  message Payload {
+	int32 Pokemon = 1;
+	int32 Background = 2;
+	int32 Status = 3;
+	int32 CaptureProbability = 4;
+}
+
+  }
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Proto/MapObjectsResponse.proto b/PokemonGo/RocketAPI/Proto/MapObjectsResponse.proto
index 735efab..1e54a1e 100644
--- a/PokemonGo/RocketAPI/Proto/MapObjectsResponse.proto
+++ b/PokemonGo/RocketAPI/Proto/MapObjectsResponse.proto
@@ -59,7 +59,7 @@ message MapObjectsResponse {

   message MapPokemonProto {
     string SpawnpointId = 1;
-    uint64 EncounterId = 2;
+    fixed64 EncounterId = 2;
     int32 PokedexTypeId = 3;
     int64 ExpirationTimeMs = 4;
     double Latitude = 5;
diff --git a/PokemonGo/RocketAPI/Proto/Request.proto b/PokemonGo/RocketAPI/Proto/Request.proto
index bc0b8a6..1f937bf 100644
--- a/PokemonGo/RocketAPI/Proto/Request.proto
+++ b/PokemonGo/RocketAPI/Proto/Request.proto
@@ -77,6 +77,23 @@ message Request {
 		fixed64 Latitude = 2;
 		fixed64 Longitude = 3;
 	}
+
+	 message EncounterRequest {
+		 fixed64 EncounterId = 1;
+		 string SpawnpointId = 2;
+		 fixed64 PlayerLatDegrees = 3;
+		 fixed64 PlayerLngDegrees = 4;
+	}
+
+	 message CatchPokemonRequest {
+		fixed64 EncounterId = 1;
+		int32 Pokeball = 2;
+		fixed64 NormalizedReticleSize = 3;
+		string SpawnPointGuid = 4;
+		int32 HitPokemon = 5;
+		fixed64 SpinModifier = 6;
+		fixed64 NormalizedHitPosition = 7;
+	}

 	message SettingsGuid
 	{
diff --git a/README.md b/README.md
index 369d102..9af5e31 100644
--- a/README.md
+++ b/README.md
@@ -15,6 +15,7 @@ var settings = await client.GetSettings();
 var mapObjects = await client.GetMapObjects();

 await ExecuteFarmingPokestops(client);
+await ExecuteCatchAllNearbyPokemons(client);
 ```

 Features
@@ -23,11 +24,11 @@ Features
 #Get Map Objects
 #Search for gyms/pokestops/spawns
 #Farm pokestops
+#Farm all pokemons in neighbourhood
 ```

 Todo

 ```
-#catch the pokemon!
 #Gotta catch them all
 ```
You may download the files in Public Git.