From 80627ff2bce1fc3629dfd7ef81b7b50ae40d039e Mon Sep 17 00:00:00 2001 From: Jasper Abbink Date: Sat, 23 Jul 2016 12:17:34 +0200 Subject: [PATCH] allow to hatch eggs; fully tested --- .../pokegoapi/api/inventory/EggIncubator.java | 72 +++++++++++++++++++ .../pokegoapi/api/inventory/Inventories.java | 33 +++++++-- .../com/pokegoapi/api/inventory/PokeBank.java | 2 - 3 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/pokegoapi/api/inventory/EggIncubator.java 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..48f9aaad --- /dev/null +++ b/src/main/java/com/pokegoapi/api/inventory/EggIncubator.java @@ -0,0 +1,72 @@ +/* + * 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.Pokemon; +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; + + public EggIncubator(PokemonGo pgo, EggIncubatorOuterClass.EggIncubator proto) { + this.pgo = pgo; + this.proto = proto; + this.inUse = proto.getPokemonId() != 0; + } + + public int getUsesRemaining() { + return proto.getUsesRemaining(); + } + + public UseItemEggIncubatorResponse.Result hatchEgg(Pokemon pokemon) throws LoginFailedException, RemoteServerException { + if (!pokemon.getIsEgg()) { + return null; + } + UseItemEggIncubatorMessage reqMsg = UseItemEggIncubatorMessage.newBuilder() + .setItemId(proto.getId()) + .setPokemonId(pokemon.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().getEggs().remove(pokemon); + 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 b5926fd5..53c022fd 100644 --- a/src/main/java/com/pokegoapi/api/inventory/Inventories.java +++ b/src/main/java/com/pokegoapi/api/inventory/Inventories.java @@ -17,6 +17,7 @@ import POGOProtos.Enums.PokemonFamilyIdOuterClass; import POGOProtos.Enums.PokemonIdOuterClass; +import POGOProtos.Inventory.EggIncubatorOuterClass; import POGOProtos.Inventory.InventoryItemDataOuterClass; import POGOProtos.Inventory.InventoryItemOuterClass; import POGOProtos.Inventory.Item.ItemDataOuterClass.ItemData; @@ -32,6 +33,9 @@ import com.pokegoapi.main.ServerRequest; import lombok.Getter; +import java.util.ArrayList; +import java.util.List; + public class Inventories { @@ -44,6 +48,10 @@ public class Inventories { private CandyJar candyjar; @Getter private Pokedex pokedex; + @Getter + private List incubators; + @Getter + private List eggs; private long lastInventoryUpdate = 0; @@ -60,6 +68,8 @@ public Inventories(PokemonGo api) throws LoginFailedException, RemoteServerExcep pokebank = new PokeBank(api); candyjar = new CandyJar(api); pokedex = new Pokedex(api); + incubators = new ArrayList<>(); + eggs = new ArrayList<>(); updateInventories(); } @@ -87,6 +97,8 @@ public void updateInventories(boolean forceUpdate) throws LoginFailedException, pokebank = new PokeBank(api); candyjar = new CandyJar(api); pokedex = new Pokedex(api); + incubators = new ArrayList<>(); + eggs = new ArrayList<>(); } GetInventoryMessage invReqMsg = GetInventoryMessage.newBuilder() .setLastTimestampMs(lastInventoryUpdate) @@ -98,7 +110,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 @@ -106,28 +118,37 @@ public void updateInventories(boolean forceUpdate) throws LoginFailedException, InventoryItemDataOuterClass.InventoryItemData itemData = inventoryItem.getInventoryItemData(); if (itemData.getPokemonData().getPokemonId() != PokemonIdOuterClass.PokemonId.MISSINGNO) { - pokebank.addPokemon(new Pokemon(inventoryItem.getInventoryItemData().getPokemonData())); + pokebank.addPokemon(new Pokemon(itemData.getPokemonData())); + } else if (itemData.getPokemonData().getIsEgg()) { + eggs.add(new Pokemon(itemData.getPokemonData())); } + 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)); } 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() ); } if (itemData.hasPlayerStats()) { - api.getPlayerProfile().setStats(inventoryItem.getInventoryItemData().getPlayerStats()); + api.getPlayerProfile().setStats(itemData.getPlayerStats()); } if (itemData.hasPokedexEntry()) { 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 4c87c08c..a0844655 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. *