From 84aece12d83a830c969f25e386f86bf4f291ec22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?--=3DFurtiF=E2=84=A2=3D--?= Date: Mon, 5 Dec 2016 00:20:47 +0100 Subject: [PATCH] Update UseXpBoost.js --- POGOserver Control/My Project/AssemblyInfo.vb | 4 +- package.json | 7 ++- src/models/Player/CandyBag/index.js | 6 +-- src/models/Player/Info/index.js | 13 +++-- src/models/Player/index.js | 35 ++++++++++-- src/models/Player/packets/EvolvePokemon.js | 35 ++++++++++++ src/models/Player/packets/NicknamePokemon.js | 9 ++-- src/models/Player/packets/UsePotion.js | 53 +++++++++++++++++++ src/models/Player/packets/UseRevive.js | 40 ++++++++++++++ src/models/Player/packets/UseXpBoost.js | 25 +++++++++ src/models/Player/packets/index.js | 6 ++- src/models/Pokemon/action.js | 6 ++- src/models/Pokemon/index.js | 38 +++++++++++++ src/models/World/packets/FortSearch.js | 6 ++- src/response.js | 5 ++ 15 files changed, 260 insertions(+), 28 deletions(-) create mode 100644 src/models/Player/packets/EvolvePokemon.js create mode 100644 src/models/Player/packets/UsePotion.js create mode 100644 src/models/Player/packets/UseRevive.js create mode 100644 src/models/Player/packets/UseXpBoost.js diff --git a/POGOserver Control/My Project/AssemblyInfo.vb b/POGOserver Control/My Project/AssemblyInfo.vb index cf60ade..44b4672 100644 --- a/POGOserver Control/My Project/AssemblyInfo.vb +++ b/POGOserver Control/My Project/AssemblyInfo.vb @@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices ' en utilisant '*', comme indiqué ci-dessous : ' - - + + diff --git a/package.json b/package.json index bec1e46..ddc0b9f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "POGOServer", - "version": "0.6.1", - "description": "?? Pokemon GO Server Emulator", + "version": "0.6.2", + "description": "", "repository": { "type": "git", "url": "git://github.com/maierfelix/POGOServer.git" @@ -37,6 +37,5 @@ "s2-geometry": "^1.2.9", "url": "^0.11.0" }, - "devDependencies": { - } + "devDependencies": {} } diff --git a/src/models/Player/CandyBag/index.js b/src/models/Player/CandyBag/index.js index 195d68a..b7c57aa 100644 --- a/src/models/Player/CandyBag/index.js +++ b/src/models/Player/CandyBag/index.js @@ -1,7 +1,6 @@ import { GAME_MASTER } from "../../../shared"; import ENUM from "../../../enum"; - /** * @class CandyBag */ @@ -70,9 +69,8 @@ export default class CandyBag { * @return {Number} */ getCandy(dex) { - return ( - this.getCandyByDexNumber(dex) - ); + let candy = this.getCandyByDexNumber(dex); + return (candy.amount); } /** diff --git a/src/models/Player/Info/index.js b/src/models/Player/Info/index.js index 780918f..67a6c84 100644 --- a/src/models/Player/Info/index.js +++ b/src/models/Player/Info/index.js @@ -30,9 +30,9 @@ export default class Info { this.levelReward = false; this.kmWalked = 0; - this.pkmnEncountered = 1; - this.uniquePokedexEntries = 1; - this.pkmnCaptured = 1; + this.pkmnEncountered = 151; + this.uniquePokedexEntries = 100; + this.pkmnCaptured = 101; this.pokeStopVisits = 2; this.pokeballsThrown = 3; this.eggsHatched = 0; @@ -41,6 +41,8 @@ export default class Info { this.maxPkmnStorage = 250; this.maxItemStorage = 350; + + this.LuckyEggExp = 0; } @@ -48,7 +50,7 @@ export default class Info { return (this._exp); } set exp(value) { - this._exp = value; + this._exp = value; this.updatePrevNextExp(); } @@ -58,6 +60,7 @@ export default class Info { set level(value) { this._level = value; this.updatePrevNextExp(); + } get team() { @@ -108,6 +111,8 @@ export default class Info { * @param {Number} exp */ upgradeExp(exp) { + if(this.LuckyEggExp !=0 && this.LuckyEggExp > new Date() ){exp = exp*2;} + print(exp); if (!this.maxLevelReached()) { let currentLevelExp = this.getLevelExp(this.level); let nextLevelExp = this.getLevelExp(this.level + 1); diff --git a/src/models/Player/index.js b/src/models/Player/index.js index 5150dc7..db25a1f 100644 --- a/src/models/Player/index.js +++ b/src/models/Player/index.js @@ -9,6 +9,8 @@ import Contact from "./Contact"; import CandyBag from "./CandyBag"; import Tutorial from "./Tutorial"; import Currency from "./Currency"; +import addEntry from "./PokeDex"; + import MapObject from "../World/MapObject"; @@ -143,7 +145,7 @@ export default class Player extends MapObject { this.isIOS = sig.device_info.device_brand === "Apple"; this.isAndroid = !this.isIOS; this.platform = this.isIOS ? "ios" : "android"; - print(`${this.email} is playing with an ${this.isIOS ? "Apple" : "Android"} device!`, 36); + print(`${this.username} is playing with an ${this.isIOS ? "Apple" : "Android"} device!`, 36); } } } @@ -199,7 +201,19 @@ export default class Player extends MapObject { case "CLAIM_CODENAME": resolve(this.ClaimCodename(msg)); break; - }; + case "EVOLVE_POKEMON": + resolve(this.EvolvePokemon(msg)); + break; + case "USE_ITEM_POTION": + resolve(this.UsePotion(msg)); + break; + case "USE_ITEM_REVIVE": + resolve(this.UseRevive(msg)); + break; + case "USE_ITEM_XP_BOOST": + resolve(this.UseXpBoost(msg)); + break; + }; }); } @@ -301,13 +315,22 @@ export default class Player extends MapObject { } }; } - + removeItems(rewards) { + for (let key in rewards) { + let name = ENUM.getNameById(ENUM.ITEMS, key << 0).replace("ITEM_", "").toLowerCase(); + if (this.bag.hasOwnProperty(name)) { + this.bag[name] -= rewards[key] << 0; + } + }; + } /** * @param {WildPokemon} pkmn * @param {String} ball */ catchPkmn(pkmn, ball) { - this.info.exp += 100; + let exp=100; + if(this.info.LuckyEggExp !=0 && this.info.LuckyEggExp > new Date() ){exp = exp*2;} + this.info.exp += exp; this.info.stardust += 100; this.info.pkmnCaptured += 1; this.currentEncounter = null; @@ -330,7 +353,7 @@ export default class Player extends MapObject { captured_pokemon_id: pkmn.uid, capture_award: { activity_type: ["ACTIVITY_CATCH_POKEMON"], - xp: [100], + xp: [exp], candy: [3], stardust: [100] } @@ -351,6 +374,8 @@ export default class Player extends MapObject { }); }); } + + /** * @param {string} codename diff --git a/src/models/Player/packets/EvolvePokemon.js b/src/models/Player/packets/EvolvePokemon.js new file mode 100644 index 0000000..8e5bc4b --- /dev/null +++ b/src/models/Player/packets/EvolvePokemon.js @@ -0,0 +1,35 @@ +import POGOProtos from "pokemongo-protobuf"; +import print from "../../../print"; +import * as _calc from "../../Pokemon/calc"; +/** + * @param {Object} msg + * @return {Buffer} + */ +export default function EvolvePokemon(msg) { + + + let buffer = null; + + let pkmn = this.party.getPkmnById(msg.pokemon_id); + if (pkmn) { + if (pkmn.evolve()) { + buffer = { result: "SUCCESS" }; + } else { + buffer = { result: "FAILED_INSUFFICIENT_RESOURCES" }; + } + pkmn.calcMoves(); + pkmn.cp = pkmn.calcCP(pkmn.owner); + buffer.evolved_pokemon_data = pkmn.serialize(); + pkmn.updateDatabase(); + buffer.experience_awarded = 500; + buffer.candy_awarded = 0; + } + else { + buffer = { result: "FAILED_POKEMON_MISSING" }; + } + + return ( + POGOProtos.serialize(buffer, "POGOProtos.Networking.Responses.EvolvePokemonResponse") + ); + +} \ No newline at end of file diff --git a/src/models/Player/packets/NicknamePokemon.js b/src/models/Player/packets/NicknamePokemon.js index c787868..c77246c 100644 --- a/src/models/Player/packets/NicknamePokemon.js +++ b/src/models/Player/packets/NicknamePokemon.js @@ -10,12 +10,13 @@ export default function NicknamePokemon(msg) { let schema = "POGOProtos.Networking.Responses.NicknamePokemonResponse"; let pkmn = this.party.getPkmnById(msg.pokemon_id); - buffer = { result: null }; - if (pkmn) pkmn.setNickname(String(msg.nickname)); - buffer.result = pkmn ? "SUCCESS" : "ERROR_INVALID_NICKNAME"; - + //if (pkmn) {pkmn.setNickname(String(msg.nickname)); + pkmn.nickname = msg.nickname; + pkmn.updateDatabase(); + buffer.result = "SUCCESS"; //: "ERROR_INVALID_NICKNAME"; + // } return (POGOProtos.serialize(buffer, schema)); } \ No newline at end of file diff --git a/src/models/Player/packets/UsePotion.js b/src/models/Player/packets/UsePotion.js new file mode 100644 index 0000000..d4937f3 --- /dev/null +++ b/src/models/Player/packets/UsePotion.js @@ -0,0 +1,53 @@ +import POGOProtos from "pokemongo-protobuf"; +import print from "../../../print"; +import * as _calc from "../../Pokemon/calc"; +/** + * @param {Object} msg + * @return {Buffer} + */ +export default function UsePotion(msg) { + + + let buffer = null; + buffer = { result: "SUCCESS"}; + let pkmn = this.party.getPkmnById(msg.pokemon_id); + let stamina; + let items; + switch(msg.item_id){ + case "ITEM_POTION": + stamina =20; + buffer.stamina=20; + items = {"101":1}; + break; + case "ITEM_SUPER_POTION": + stamina =50; + buffer.stamina=50; + items = {"102":1}; + break; + case "ITEM_HYPER_POTION": + stamina =200; + buffer.stamina=200; + items = {"103":1}; + break; + case "ITEM_MAX_POTION": + stamina =pkmn.staminaMax; + buffer.stamina=pkmn.staminaMax; + items = {"104":1}; + break; + +} + if((pkmn.stamina+stamina)<= pkmn.staminaMax){ + pkmn.stamina = pkmn.stamina+stamina; + pkmn.updateDatabase(); + this.removeItems(items); + } else { + pkmn.stamina = pkmn.staminaMax; + pkmn.updateDatabase(); + this.removeItems(items); + } + + return ( + POGOProtos.serialize(buffer, "POGOProtos.Networking.Responses.UseItemPotionResponse") + ); + +} \ No newline at end of file diff --git a/src/models/Player/packets/UseRevive.js b/src/models/Player/packets/UseRevive.js new file mode 100644 index 0000000..27e2aab --- /dev/null +++ b/src/models/Player/packets/UseRevive.js @@ -0,0 +1,40 @@ +import POGOProtos from "pokemongo-protobuf"; +import print from "../../../print"; +import * as _calc from "../../Pokemon/calc"; +/** + * @param {Object} msg + * @return {Buffer} + */ +export default function UseRevive(msg) { + + + let buffer = null; + buffer = { result: "SUCCESS"}; + let pkmn = this.party.getPkmnById(msg.pokemon_id); + let stamina; + let items; + switch(msg.item_id){ + case "ITEM_REVIVE": + stamina =0.5; + buffer.stamina=20; + items = {"201":1}; + break; + case "ITEM_MAX_REVIVE": + stamina =1; + buffer.stamina=50; + items = {"202":1}; + break; + + +} + + pkmn.stamina = pkmn.staminaMax*stamina; + pkmn.updateDatabase(); + this.removeItems(items); + + + return ( + POGOProtos.serialize(buffer, "POGOProtos.Networking.Responses.UseItemReviveResponse") + ); + +} \ No newline at end of file diff --git a/src/models/Player/packets/UseXpBoost.js b/src/models/Player/packets/UseXpBoost.js new file mode 100644 index 0000000..6a65fc9 --- /dev/null +++ b/src/models/Player/packets/UseXpBoost.js @@ -0,0 +1,25 @@ +import POGOProtos from "pokemongo-protobuf"; +import print from "../../../print"; +/** + * @param {Object} msg + * @return {Buffer} + */ +export default function UseXpBoost(msg) { + let buffer = null; + + buffer = { result: "SUCCESS", + applied_items:{item:[ + { + item_id: msg.item_id, + item_type: "ITEM_TYPE_XP_BOOST", + expire_ms: +new Date()+1800000 , + applied_ms:+new Date() + } + ]}}; + this.removeItems({"301":1}); + this.info.LuckyEggExp = +new Date()+1800000; + return ( + POGOProtos.serialize(buffer, "POGOProtos.Networking.Responses.UseItemXpBoostResponse") + ); + +} diff --git a/src/models/Player/packets/index.js b/src/models/Player/packets/index.js index 5a1fefc..6fc8dce 100644 --- a/src/models/Player/packets/index.js +++ b/src/models/Player/packets/index.js @@ -12,4 +12,8 @@ export GetPlayerProfile from "./GetPlayerProfile"; export SetFavoritePokemon from "./SetFavoritePokemon"; export CheckAwardedBadges from "./CheckAwardedBadges"; export RecycleInventoryItem from "./RecycleInventoryItem"; -export ClaimCodename from "./ClaimCodename"; \ No newline at end of file +export ClaimCodename from "./ClaimCodename"; +export EvolvePokemon from "./EvolvePokemon"; +export UsePotion from "./UsePotion"; +export UseRevive from "./UseRevive"; +export UseXpBoost from "./UseXpBoost"; \ No newline at end of file diff --git a/src/models/Pokemon/action.js b/src/models/Pokemon/action.js index b4d6b5f..a500d10 100644 --- a/src/models/Pokemon/action.js +++ b/src/models/Pokemon/action.js @@ -34,7 +34,7 @@ export function evolve() { let pkmnTmpl = this.getPkmnTemplate(this.dexNumber); let ownerPkmnCandies = this.owner.candyBag.getCandy(this.dexNumber); let candiesToEvolve = this.candiesToEvolve(); - if (ownerPkmnCandies < candiesToEvolve()) { + if (ownerPkmnCandies < candiesToEvolve) { return print(`You have ${ownerPkmnCandies}/${candiesToEvolve} candies to evolve ${this.getPkmnName()}!`, 31); } let evolutions = pkmnTmpl.evolution_ids; @@ -57,10 +57,12 @@ export function evolveInto(ev) { let evName = _toCC(ev); let evId = pokename.getPokemonIdByName(evName); if (evId <= 0) { - print(`Failed at retrieving id for pokemon ${ev}`, 31); + print(`Failed at retrieving id for pokemon ${ev}`, 31); return (false); } let evTmpl = this.getPkmnTemplate(evId); print(`${this.owner.username} successfully evolved ${this.getPkmnName()} into ${evName}`); + this.dexNumber = evId; + return (true); } \ No newline at end of file diff --git a/src/models/Pokemon/index.js b/src/models/Pokemon/index.js index e9fb321..e8451b1 100644 --- a/src/models/Pokemon/index.js +++ b/src/models/Pokemon/index.js @@ -256,6 +256,44 @@ export default class Pokemon extends MapObject { }); }); } + updateDatabase() { + let query = ` + UPDATE ${CFG.MYSQL_OWNED_PKMN_TABLE} SET + owner_id=?, + dex_number=?, + cp=?, + stamina=?, + stamina_max=?, + move_1=?, + move_2=?, + height_m=?, + weight_kg=?, + individual_attack=?, + individual_defense=?, + individual_stamina=?, + cp_multiplier=?, + pokeball=?, + favorite=?, + nickname=? + WHERE + id=? + `; + let data = [ + this.owner.uid, this.dexNumber, this.cp, + this.stamina, this.staminaMax, + this.move1, this.move2, + this.height, this.weight, + this.ivAttack, this.ivDefense, this.ivStamina, + this.cpMultiplier, this.pokeball, this.favorite, this.nickname,this.uid || "" + ]; + return new Promise((resolve) => { + this.owner.world.db.query(query, data, (e, res) => { + if (e) return print(e, 31); + resolve(res); + }); + }); + } + /** * @return {Object} diff --git a/src/models/World/packets/FortSearch.js b/src/models/World/packets/FortSearch.js index 9f7867b..3dd5733 100644 --- a/src/models/World/packets/FortSearch.js +++ b/src/models/World/packets/FortSearch.js @@ -15,11 +15,13 @@ export default function FortSearch(msg) { this.getFortDataById(msg.fort_id).then((fort) => { if (!fort) return void 0; player.consumeFortRewards(fort); + let exp = fort.experience; // TODO: disable rewarding when on cooldown - let buffer = ({ + if(player.info.LuckyEggExp !=0 && player.info.LuckyEggExp > new Date() ){exp = exp*2;} + let buffer = ({ result: "SUCCESS", items_awarded: fort.serializeRewards(), - experience_awarded: fort.experience, + experience_awarded: exp, cooldown_complete_timestamp_ms: +new Date() + fort.cooldown, chain_hack_sequence_number: 2 }); diff --git a/src/response.js b/src/response.js index f9e39f7..c9de070 100644 --- a/src/response.js +++ b/src/response.js @@ -16,6 +16,7 @@ export function parseMessage(req, type) { let proto = `POGOProtos.Networking.Requests.Messages.${type}Message`; if (req.request_message) { try { + return (this.parseProtobuf(req.request_message, proto)); } catch (e) { print(`Failed to parse ${type}: ${e}`, 31); @@ -53,6 +54,10 @@ export function processResponse(player, req) { case "CHECK_AWARDED_BADGES": case "SET_FAVORITE_POKEMON": case "RECYCLE_INVENTORY_ITEM": + case "EVOLVE_POKEMON": + case "USE_ITEM_POTION": + case "USE_ITEM_REVIVE": + case "USE_ITEM_XP_BOOST": player.getPacket(req.request_type, msg).then((result) => { resolve(result); });