15
15
16
16
package com .pokegoapi .api .map .pokemon ;
17
17
18
- import POGOProtos .Enums .PokemonIdOuterClass ;
18
+
19
+ import POGOProtos .Enums .PokemonIdOuterClass .PokemonId ;
19
20
import POGOProtos .Inventory .Item .ItemIdOuterClass .ItemId ;
20
21
import POGOProtos .Map .Fort .FortDataOuterClass .FortData ;
21
22
import POGOProtos .Map .Pokemon .MapPokemonOuterClass .MapPokemon ;
22
23
import POGOProtos .Map .Pokemon .WildPokemonOuterClass .WildPokemon ;
23
24
import POGOProtos .Networking .Requests .Messages .CatchPokemonMessageOuterClass .CatchPokemonMessage ;
24
- import POGOProtos .Networking .Requests .Messages .EncounterMessageOuterClass ;
25
+ import POGOProtos .Networking .Requests .Messages .DiskEncounterMessageOuterClass ;
26
+ import POGOProtos .Networking .Requests .Messages .DiskEncounterMessageOuterClass .DiskEncounterMessage ;
27
+ import POGOProtos .Networking .Requests .Messages .EncounterMessageOuterClass .EncounterMessage ;
25
28
import POGOProtos .Networking .Requests .Messages .UseItemCaptureMessageOuterClass .UseItemCaptureMessage ;
26
- import POGOProtos .Networking .Requests .RequestTypeOuterClass ;
29
+ import POGOProtos .Networking .Requests .RequestTypeOuterClass . RequestType ;
27
30
import POGOProtos .Networking .Responses .CatchPokemonResponseOuterClass .CatchPokemonResponse ;
28
31
import POGOProtos .Networking .Responses .CatchPokemonResponseOuterClass .CatchPokemonResponse .CatchStatus ;
29
- import POGOProtos .Networking .Responses .EncounterResponseOuterClass ;
32
+ import POGOProtos .Networking .Responses .DiskEncounterResponseOuterClass . DiskEncounterResponse ;
30
33
import POGOProtos .Networking .Responses .EncounterResponseOuterClass .EncounterResponse ;
31
34
import POGOProtos .Networking .Responses .UseItemCaptureResponseOuterClass .UseItemCaptureResponse ;
32
35
import com .google .protobuf .ByteString ;
33
36
import com .google .protobuf .InvalidProtocolBufferException ;
34
37
import com .pokegoapi .api .PokemonGo ;
35
38
import com .pokegoapi .api .inventory .ItemBag ;
36
39
import com .pokegoapi .api .inventory .Pokeball ;
40
+ import com .pokegoapi .api .map .pokemon .encounter .DiskEncounterResult ;
41
+ import com .pokegoapi .api .map .pokemon .encounter .EncounterResult ;
42
+ import com .pokegoapi .api .map .pokemon .encounter .NormalEncounterResult ;
37
43
import com .pokegoapi .exceptions .LoginFailedException ;
38
44
import com .pokegoapi .exceptions .NoSuchItemException ;
39
45
import com .pokegoapi .exceptions .RemoteServerException ;
48
54
49
55
import java .util .concurrent .Future ;
50
56
57
+
51
58
/**
52
59
* The type Catchable pokemon.
53
60
*/
54
61
@ ToString
55
- public class CatchablePokemon implements MapPoint {
62
+ public class CatchablePokemon implements MapPoint {
63
+
64
+ private enum EncounterKind {
65
+ NORMAL ,
66
+ DISK ;
67
+ }
68
+
69
+
56
70
private static final String TAG = CatchablePokemon .class .getSimpleName ();
57
71
private final PokemonGo api ;
58
72
@@ -61,16 +75,19 @@ public class CatchablePokemon implements MapPoint{
61
75
@ Getter
62
76
private final long encounterId ;
63
77
@ Getter
64
- private final PokemonIdOuterClass . PokemonId pokemonId ;
78
+ private final PokemonId pokemonId ;
65
79
@ Getter
66
80
private final long expirationTimestampMs ;
67
81
@ Getter
68
82
private final double latitude ;
69
83
@ Getter
70
84
private final double longitude ;
85
+ private final EncounterKind encounterKind ;
71
86
72
87
private Boolean encountered = null ;
73
88
89
+
90
+
74
91
/**
75
92
* Instantiates a new Catchable pokemon.
76
93
*
@@ -79,7 +96,7 @@ public class CatchablePokemon implements MapPoint{
79
96
*/
80
97
public CatchablePokemon (PokemonGo api , MapPokemon proto ) {
81
98
this .api = api ;
82
-
99
+ this . encounterKind = EncounterKind . NORMAL ;
83
100
this .spawnPointId = proto .getSpawnPointId ();
84
101
this .encounterId = proto .getEncounterId ();
85
102
this .pokemonId = proto .getPokemonId ();
@@ -96,6 +113,7 @@ public CatchablePokemon(PokemonGo api, MapPokemon proto) {
96
113
*/
97
114
public CatchablePokemon (PokemonGo api , WildPokemon proto ) {
98
115
this .api = api ;
116
+ this .encounterKind = EncounterKind .NORMAL ;
99
117
this .spawnPointId = proto .getSpawnPointId ();
100
118
this .encounterId = proto .getEncounterId ();
101
119
this .pokemonId = proto .getPokemonData ().getPokemonId ();
@@ -116,13 +134,24 @@ public CatchablePokemon(PokemonGo api, FortData proto) {
116
134
}
117
135
this .api = api ;
118
136
// TODO: does this work?
119
- this .spawnPointId = null ;
137
+ // seems that spawnPoint it's fortId in catchAPI so it should be safe to just set it in that way
138
+ this .spawnPointId = proto .getLureInfo ().getFortId ();
120
139
this .encounterId = proto .getLureInfo ().getEncounterId ();
121
140
this .pokemonId = proto .getLureInfo ().getActivePokemonId ();
122
141
this .expirationTimestampMs = proto .getLureInfo ()
123
142
.getLureExpiresTimestampMs ();
124
143
this .latitude = proto .getLatitude ();
125
144
this .longitude = proto .getLongitude ();
145
+ this .encounterKind = EncounterKind .DISK ;
146
+ }
147
+
148
+ /**
149
+ * Encounter pokemon
150
+ *
151
+ * @return the encounter result
152
+ */
153
+ public EncounterResult encounterPokemon () throws LoginFailedException , RemoteServerException {
154
+ return encounterPokemonAsync ().toBlocking ();
126
155
}
127
156
128
157
/**
@@ -131,26 +160,41 @@ public CatchablePokemon(PokemonGo api, FortData proto) {
131
160
* @return the encounter result
132
161
*/
133
162
public PokemonFuture <EncounterResult > encounterPokemonAsync () {
134
- EncounterMessageOuterClass .EncounterMessage reqMsg = EncounterMessageOuterClass .EncounterMessage
163
+ if (encounterKind == EncounterKind .NORMAL ) {
164
+ return encounterNormalPokemonAsync ();
165
+ } else if (encounterKind == EncounterKind .DISK ) {
166
+ return encounterDiskPokemonAsync ();
167
+ }
168
+
169
+ throw new IllegalStateException ("Catchable pokemon missing encounter type" );
170
+ }
171
+
172
+ /**
173
+ * Encounter pokemon encounter result.
174
+ *
175
+ * @return the encounter result
176
+ */
177
+ public PokemonFuture <EncounterResult > encounterNormalPokemonAsync () {
178
+ EncounterMessage reqMsg = EncounterMessage
135
179
.newBuilder ().setEncounterId (getEncounterId ())
136
180
.setPlayerLatitude (api .getLatitude ())
137
181
.setPlayerLongitude (api .getLongitude ())
138
182
.setSpawnPointId (getSpawnPointId ()).build ();
139
183
AsyncServerRequest serverRequest = new AsyncServerRequest (
140
- RequestTypeOuterClass . RequestType .ENCOUNTER , reqMsg );
184
+ RequestType .ENCOUNTER , reqMsg );
141
185
return new FutureWrapper <ByteString , EncounterResult >(api .getRequestHandler ()
142
186
.sendAsyncServerRequests (serverRequest )) {
143
187
@ Override
144
188
protected EncounterResult handle (ByteString result ) throws RemoteServerException {
145
- EncounterResponseOuterClass . EncounterResponse response ;
189
+ EncounterResponse response ;
146
190
try {
147
- response = EncounterResponseOuterClass . EncounterResponse
191
+ response = EncounterResponse
148
192
.parseFrom (result );
149
193
} catch (InvalidProtocolBufferException e ) {
150
194
throw new RemoteServerException (e );
151
195
}
152
196
encountered = response .getStatus () == EncounterResponse .Status .ENCOUNTER_SUCCESS ;
153
- return new EncounterResult (response );
197
+ return new NormalEncounterResult (response );
154
198
}
155
199
};
156
200
}
@@ -162,11 +206,42 @@ protected EncounterResult handle(ByteString result) throws RemoteServerException
162
206
* @throws LoginFailedException the login failed exception
163
207
* @throws RemoteServerException the remote server exception
164
208
*/
165
- public EncounterResult encounterPokemon () throws LoginFailedException ,
209
+ public EncounterResult encounterNormalPokemon () throws LoginFailedException ,
166
210
RemoteServerException {
167
- return encounterPokemonAsync ().toBlocking ();
211
+ return encounterNormalPokemonAsync ().toBlocking ();
212
+ }
213
+
214
+
215
+
216
+ /**
217
+ * Encounter pokemon
218
+ *
219
+ * @return the encounter result
220
+ */
221
+ public PokemonFuture <EncounterResult > encounterDiskPokemonAsync () {
222
+ DiskEncounterMessage reqMsg = DiskEncounterMessage
223
+ .newBuilder ().setEncounterId (getEncounterId ())
224
+ .setPlayerLatitude (api .getLatitude ())
225
+ .setPlayerLongitude (api .getLongitude ())
226
+ .setFortId (getSpawnPointId ()).build ();
227
+ AsyncServerRequest serverRequest = new AsyncServerRequest (RequestType .DISK_ENCOUNTER , reqMsg );
228
+ return new FutureWrapper <ByteString , EncounterResult >(api .getRequestHandler ()
229
+ .sendAsyncServerRequests (serverRequest )) {
230
+ @ Override
231
+ protected EncounterResult handle (ByteString result ) throws RemoteServerException {
232
+ DiskEncounterResponse response ;
233
+ try {
234
+ response = DiskEncounterResponse .parseFrom (result );
235
+ } catch (InvalidProtocolBufferException e ) {
236
+ throw new RemoteServerException (e );
237
+ }
238
+ encountered = response .getResult () == DiskEncounterResponse .Result .SUCCESS ;
239
+ return new DiskEncounterResult (response );
240
+ }
241
+ };
168
242
}
169
243
244
+
170
245
/**
171
246
* Tries to catch a pokemon (will attempt to use a pokeball, if you have
172
247
* none will use greatball etc) and uwill use a single razz berry if available.
@@ -389,11 +464,12 @@ public PokemonFuture<CatchResult> catchPokemonAsync(double normalizedHitPosition
389
464
.setSpinModifier (spinModifier )
390
465
.setPokeball (type .getBallType ()).build ();
391
466
AsyncServerRequest serverRequest = new AsyncServerRequest (
392
- RequestTypeOuterClass . RequestType .CATCH_POKEMON , reqMsg );
467
+ RequestType .CATCH_POKEMON , reqMsg );
393
468
return new FutureWrapper <ByteString , CatchResult >(api .getRequestHandler ()
394
469
.sendAsyncServerRequests (serverRequest )) {
395
470
@ Override
396
471
protected CatchResult handle (ByteString result ) throws RemoteServerException , LoginFailedException {
472
+ System .out .println ("ASYNC CATCH CALL" );
397
473
CatchPokemonResponse response ;
398
474
399
475
try {
@@ -439,7 +515,7 @@ public PokemonFuture<CatchItemResult> useItemAsync(ItemId item) {
439
515
.build ();
440
516
441
517
AsyncServerRequest serverRequest = new AsyncServerRequest (
442
- RequestTypeOuterClass . RequestType .USE_ITEM_CAPTURE , reqMsg );
518
+ RequestType .USE_ITEM_CAPTURE , reqMsg );
443
519
return new FutureWrapper <ByteString , CatchItemResult >(api .getRequestHandler ()
444
520
.sendAsyncServerRequests (serverRequest )) {
445
521
@ Override
0 commit comments