diff --git a/src/main/java/com/pokegoapi/api/inventory/EggIncubator.java b/src/main/java/com/pokegoapi/api/inventory/EggIncubator.java new file mode 100644 index 00000000..1521fa89 --- /dev/null +++ b/src/main/java/com/pokegoapi/api/inventory/EggIncubator.java @@ -0,0 +1,91 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.pokegoapi.api.inventory; + +import POGOProtos.Inventory.EggIncubatorOuterClass; +import POGOProtos.Networking.Requests.Messages.UseItemEggIncubatorMessageOuterClass.UseItemEggIncubatorMessage; +import POGOProtos.Networking.Requests.RequestTypeOuterClass; +import POGOProtos.Networking.Responses.UseItemEggIncubatorResponseOuterClass.UseItemEggIncubatorResponse; +import com.google.protobuf.InvalidProtocolBufferException; +import com.pokegoapi.api.PokemonGo; +import com.pokegoapi.api.pokemon.EggPokemon; +import com.pokegoapi.exceptions.LoginFailedException; +import com.pokegoapi.exceptions.RemoteServerException; +import com.pokegoapi.main.ServerRequest; +import lombok.Getter; + +public class EggIncubator { + private final EggIncubatorOuterClass.EggIncubator proto; + private final PokemonGo pgo; + @Getter + private boolean inUse = false; + + /** + * Create new EggIncubator with given proto. + * + * @param pgo the api + * @param proto the proto + */ + public EggIncubator(PokemonGo pgo, EggIncubatorOuterClass.EggIncubator proto) { + this.pgo = pgo; + this.proto = proto; + this.inUse = proto.getPokemonId() != 0; + } + + /** + * Returns the remaining uses. + * + * @return uses remaining + */ + public int getUsesRemaining() { + return proto.getUsesRemaining(); + } + + /** + * Hatch an egg. + * + * @param egg the egg + * @return status of putting egg in incubator + * @throws RemoteServerException the remote server exception + * @throws LoginFailedException the login failed exception + */ + public UseItemEggIncubatorResponse.Result hatchEgg(EggPokemon egg) + throws LoginFailedException, RemoteServerException { + if (!egg.getIsEgg()) { + return null; + } + UseItemEggIncubatorMessage reqMsg = UseItemEggIncubatorMessage.newBuilder() + .setItemId(proto.getId()) + .setPokemonId(egg.getId()) + .build(); + + ServerRequest serverRequest = new ServerRequest(RequestTypeOuterClass.RequestType.USE_ITEM_EGG_INCUBATOR, reqMsg); + pgo.getRequestHandler().sendServerRequests(serverRequest); + + UseItemEggIncubatorResponse response; + try { + response = UseItemEggIncubatorResponse.parseFrom(serverRequest.getData()); + } catch (InvalidProtocolBufferException e) { + throw new RemoteServerException(e); + } + + pgo.getInventories().updateInventories(true); + + this.inUse = true; + + return response.getResult(); + } +} diff --git a/src/main/java/com/pokegoapi/api/inventory/Inventories.java b/src/main/java/com/pokegoapi/api/inventory/Inventories.java index 974d486e..ab41960f 100644 --- a/src/main/java/com/pokegoapi/api/inventory/Inventories.java +++ b/src/main/java/com/pokegoapi/api/inventory/Inventories.java @@ -16,8 +16,8 @@ package com.pokegoapi.api.inventory; import POGOProtos.Enums.PokemonFamilyIdOuterClass; -import POGOProtos.Enums.PokemonIdOuterClass; import POGOProtos.Enums.PokemonIdOuterClass.PokemonId; +import POGOProtos.Inventory.EggIncubatorOuterClass; import POGOProtos.Inventory.InventoryItemDataOuterClass; import POGOProtos.Inventory.InventoryItemOuterClass; import POGOProtos.Inventory.Item.ItemDataOuterClass.ItemData; @@ -34,6 +34,9 @@ import com.pokegoapi.main.ServerRequest; import lombok.Getter; +import java.util.ArrayList; +import java.util.List; + public class Inventories { @@ -47,6 +50,8 @@ public class Inventories { @Getter private Pokedex pokedex; @Getter + private List incubators; + @Getter private Hatchery hatchery; private long lastInventoryUpdate = 0; @@ -64,6 +69,7 @@ public Inventories(PokemonGo api) throws LoginFailedException, RemoteServerExcep pokebank = new PokeBank(api); candyjar = new CandyJar(api); pokedex = new Pokedex(api); + incubators = new ArrayList<>(); hatchery = new Hatchery(api); updateInventories(); } @@ -92,6 +98,8 @@ public void updateInventories(boolean forceUpdate) throws LoginFailedException, pokebank = new PokeBank(api); candyjar = new CandyJar(api); pokedex = new Pokedex(api); + incubators = new ArrayList<>(); + hatchery = new Hatchery(api); } GetInventoryMessage invReqMsg = GetInventoryMessage.newBuilder() .setLastTimestampMs(lastInventoryUpdate) @@ -103,7 +111,7 @@ public void updateInventories(boolean forceUpdate) throws LoginFailedException, try { response = GetInventoryResponse.parseFrom(inventoryRequest.getData()); } catch (InvalidProtocolBufferException e) { - e.printStackTrace(); + throw new RemoteServerException(e); } for (InventoryItemOuterClass.InventoryItem inventoryItem @@ -123,7 +131,7 @@ public void updateInventories(boolean forceUpdate) throws LoginFailedException, // items if (itemData.getItem().getItemId() != ItemId.UNRECOGNIZED && itemData.getItem().getItemId() != ItemId.ITEM_UNKNOWN) { - ItemData item = inventoryItem.getInventoryItemData().getItem(); + ItemData item = itemData.getItem(); itemBag.addItem(new Item(item)); } @@ -131,13 +139,13 @@ public void updateInventories(boolean forceUpdate) throws LoginFailedException, if (itemData.getPokemonFamily().getFamilyId() != PokemonFamilyIdOuterClass.PokemonFamilyId.UNRECOGNIZED && itemData.getPokemonFamily().getFamilyId() != PokemonFamilyIdOuterClass.PokemonFamilyId.FAMILY_UNSET) { candyjar.setCandy( - inventoryItem.getInventoryItemData().getPokemonFamily().getFamilyId(), - inventoryItem.getInventoryItemData().getPokemonFamily().getCandy() + itemData.getPokemonFamily().getFamilyId(), + itemData.getPokemonFamily().getCandy() ); } // player stats if (itemData.hasPlayerStats()) { - api.getPlayerProfile().setStats(inventoryItem.getInventoryItemData().getPlayerStats()); + api.getPlayerProfile().setStats(itemData.getPlayerStats()); } // pokedex @@ -145,6 +153,12 @@ public void updateInventories(boolean forceUpdate) throws LoginFailedException, pokedex.add(itemData.getPokedexEntry()); } + if (itemData.hasEggIncubators()) { + for (EggIncubatorOuterClass.EggIncubator incubator : itemData.getEggIncubators().getEggIncubatorList()) { + incubators.add(new EggIncubator(api, incubator)); + } + } + lastInventoryUpdate = System.currentTimeMillis(); } } diff --git a/src/main/java/com/pokegoapi/api/inventory/PokeBank.java b/src/main/java/com/pokegoapi/api/inventory/PokeBank.java index f3d1de05..fe40c054 100644 --- a/src/main/java/com/pokegoapi/api/inventory/PokeBank.java +++ b/src/main/java/com/pokegoapi/api/inventory/PokeBank.java @@ -54,8 +54,6 @@ public boolean test(Pokemon testPokemon) { } } - - /** * Gets pokemon by pokemon id. * diff --git a/src/main/java/com/pokegoapi/api/pokemon/EggPokemon.java b/src/main/java/com/pokegoapi/api/pokemon/EggPokemon.java index 82c8e044..120744b6 100644 --- a/src/main/java/com/pokegoapi/api/pokemon/EggPokemon.java +++ b/src/main/java/com/pokegoapi/api/pokemon/EggPokemon.java @@ -13,49 +13,16 @@ * along with this program. If not, see . */ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.pokegoapi.api.pokemon; import POGOProtos.Data.PokemonDataOuterClass.PokemonData; -import POGOProtos.Enums.PokemonFamilyIdOuterClass.PokemonFamilyId; -import POGOProtos.Enums.PokemonIdOuterClass; -import POGOProtos.Enums.PokemonMoveOuterClass; -import POGOProtos.Inventory.Item.ItemIdOuterClass.ItemId; -import POGOProtos.Networking.Requests.Messages.EvolvePokemonMessageOuterClass.EvolvePokemonMessage; -import POGOProtos.Networking.Requests.Messages.NicknamePokemonMessageOuterClass.NicknamePokemonMessage; -import POGOProtos.Networking.Requests.Messages.ReleasePokemonMessageOuterClass.ReleasePokemonMessage; -import POGOProtos.Networking.Requests.RequestTypeOuterClass.RequestType; -import POGOProtos.Networking.Responses.EvolvePokemonResponseOuterClass.EvolvePokemonResponse; -import POGOProtos.Networking.Responses.NicknamePokemonResponseOuterClass.NicknamePokemonResponse; -import POGOProtos.Networking.Responses.ReleasePokemonResponseOuterClass.ReleasePokemonResponse; -import POGOProtos.Networking.Responses.ReleasePokemonResponseOuterClass.ReleasePokemonResponse.Result; -import com.google.protobuf.InvalidProtocolBufferException; import com.pokegoapi.api.PokemonGo; -import com.pokegoapi.api.map.pokemon.EvolutionResult; -import com.pokegoapi.exceptions.LoginFailedException; -import com.pokegoapi.exceptions.RemoteServerException; -import com.pokegoapi.main.ServerRequest; -import com.pokegoapi.util.Log; import lombok.Setter; /** * The egg pokemon. */ -public class EggPokemon { +public class EggPokemon { private static final String TAG = EggPokemon.class.getSimpleName(); @Setter @@ -93,6 +60,9 @@ public long getCreationTimeMs() { return proto.getCreationTimeMs(); } + public String getEggIncubatorId() { + return proto.getEggIncubatorId(); + } @Override public int hashCode() {