package dekk.pw.pokemate.tasks; import com.pokegoapi.api.player.PlayerLevelUpRewards; import com.pokegoapi.exceptions.LoginFailedException; import com.pokegoapi.exceptions.RemoteServerException; import dekk.pw.pokemate.Config; import dekk.pw.pokemate.Context; import dekk.pw.pokemate.PokeMate; import dekk.pw.pokemate.PokeMateUI; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Formatter; import static dekk.pw.pokemate.Context.millisToTimeString; import static dekk.pw.pokemate.util.StringConverter.convertItemAwards; /** * Created by Andrew Sidhu on 8/1/2016. */ public class UpdateInterface extends Task implements Runnable { private static final int[] REQUIRED_EXPERIENCES = new int[]{0, 1000, 3000, 6000, 10000, 15000, 21000, 28000, 36000, 45000, 55000, 65000, 75000, 85000, 100000, 120000, 140000, 160000, 185000, 210000, 260000, 335000, 435000, 560000, 710000, 900000, 1100000, 1350000, 1650000, 2000000, 2500000, 3000000, 3750000, 4750000, 6000000, 7500000, 9500000, 12000000, 15000000, 20000000}; private static int experienceGained = 0; private static long lastExperience = 0; private static int lastLevel; UpdateInterface(final Context context) { super(context); } @Override public void run() { // Clears old console output. System.out.print("\033[H\033[2J"); System.out.println(header()); context.getConsoleStrings().forEach( (key,value) -> { if (value.isEmpty()) { System.out.println(key + ":"); } else { System.out.printf("%-15.15s %-30s\n", "\t" + key, value); } }); } private String header() { try { long runTime = System.currentTimeMillis() - PokeMate.startTime; long curTotalXP = context.getProfile().getStats().getExperience(); if (curTotalXP > lastExperience) { if (lastExperience != 0) { experienceGained += curTotalXP - lastExperience; } lastExperience = curTotalXP; } int curLevel = context.getProfile().getStats().getLevel(); double nextXP = REQUIRED_EXPERIENCES[context.getProfile().getStats().getLevel()] - REQUIRED_EXPERIENCES[context.getProfile().getStats().getLevel() - 1]; double curLevelXP = context.getProfile().getStats().getExperience() - REQUIRED_EXPERIENCES[context.getProfile().getStats().getLevel() - 1]; if (curLevel > lastLevel) { PlayerLevelUpRewards rewards = context.getProfile().acceptLevelUpRewards(curLevel - 1); if (rewards.getStatus() == PlayerLevelUpRewards.Status.NEW && Config.isShowUI()) { final String levelUp = "New level: " + curLevel + convertItemAwards(rewards.getRewards()); PokeMateUI.toast(levelUp, "Level Up", "icons/items/backpack.png"); } lastLevel = curLevel; } return String.format("Name: %-15s [%s] Level %d - %,.2fXP/H (%,.0f/%,.0f) - Next Level in %,.0fXP - Runtime: %s", context.getProfile().getPlayerData().getUsername(), new SimpleDateFormat("HH:mm:ss").format(new Date()), curLevel, experienceGained / (runTime / 3.6E6), curLevelXP, nextXP, nextXP-curLevelXP, millisToTimeString(runTime)); } catch (LoginFailedException | RemoteServerException e) { e.printStackTrace(); return "Error Updating Header"; } } }