diff options
| author | Lulonaut <lulonaut@lulonaut.dev> | 2024-07-31 16:34:03 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-31 16:34:03 +0200 |
| commit | 4dd6977ffda1256e269f70644a6eb88276980869 (patch) | |
| tree | 71afdc3d6fc16b43ac6fd62f36e88e12537ac88d | |
| parent | 2f7968721361b6667bf6bb9d69310b532aff668f (diff) | |
| download | notenoughupdates-4dd6977ffda1256e269f70644a6eb88276980869.tar.gz notenoughupdates-4dd6977ffda1256e269f70644a6eb88276980869.tar.bz2 notenoughupdates-4dd6977ffda1256e269f70644a6eb88276980869.zip | |
Add toggle to sort pets on the PV page alphabetically (#1282)
* Add toggle to sort pets in pv alphabetically
* Reset page and pet selection when switching sorting method
| -rw-r--r-- | src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java | 194 |
1 files changed, 130 insertions, 64 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java index ca785623..4770f2ac 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java @@ -27,11 +27,13 @@ import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.ItemUtils; import io.github.moulberry.notenoughupdates.util.PetLeveling; +import io.github.moulberry.notenoughupdates.util.Rectangle; import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; @@ -42,8 +44,11 @@ import org.lwjgl.opengl.GL11; import java.awt.*; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer.pv_elements; + public class PetsPage extends GuiProfileViewerPage { public static final ResourceLocation pv_pets = new ResourceLocation("notenoughupdates:pv_pets.png"); @@ -51,11 +56,15 @@ public class PetsPage extends GuiProfileViewerPage { private static final int COLLS_YCOUNT = 4; private static final float COLLS_XPADDING = (190 - COLLS_XCOUNT * 20) / (float) (COLLS_XCOUNT + 1); private static final float COLLS_YPADDING = (202 - COLLS_YCOUNT * 20) / (float) (COLLS_YCOUNT + 1); + private static final Rectangle switchSortingMethodButton = new Rectangle(180, 8, 16, 16); + + private boolean sortPetsAlphabetically = false; private List<JsonObject> sortedPets = null; private List<ItemStack> sortedPetsStack = null; private int selectedPet = -1; private int petsPage = 0; + public PetsPage(GuiProfileViewer instance) { super(instance); } @@ -99,72 +108,11 @@ public class PetsPage extends GuiProfileViewerPage { JsonArray pets = petsInfo.get("pets").getAsJsonArray(); if (sortedPets == null) { - sortedPets = new ArrayList<>(); - sortedPetsStack = new ArrayList<>(); - for (int i = 0; i < pets.size(); i++) { - sortedPets.add(pets.get(i).getAsJsonObject()); - } - sortedPets.sort((pet1, pet2) -> { - String tier1 = pet1.get("tier").getAsString(); - String tierNum1 = GuiProfileViewer.RARITY_TO_NUM.get(tier1); - if (tierNum1 == null) return 1; - int tierNum1I = Integer.parseInt(tierNum1); - if ("PET_ITEM_TIER_BOOST".equals(Utils.getElementAsString(pet1.get("heldItem"), null))) { - PetInfoOverlay.Pet parsedPet = new PetInfoOverlay.Pet(); - PetInfoOverlay.Rarity tier = PetInfoOverlay.Rarity.valueOf(pet1.get("tier").getAsString()); - parsedPet.petType = pet1.get("type").getAsString(); - parsedPet.rarity = tier; - if (Utils.canPetBeTierBoosted(parsedPet, tier.nextRarity())) { - tierNum1I += 1; - } - } - float exp1 = pet1.get("exp").getAsFloat(); - - String tier2 = pet2.get("tier").getAsString(); - String tierNum2 = GuiProfileViewer.RARITY_TO_NUM.get(tier2); - if (tierNum2 == null) return -1; - int tierNum2I = Integer.parseInt(tierNum2); - if ("PET_ITEM_TIER_BOOST".equals(Utils.getElementAsString(pet2.get("heldItem"), null))) { - PetInfoOverlay.Pet parsedPet = new PetInfoOverlay.Pet(); - PetInfoOverlay.Rarity tier = PetInfoOverlay.Rarity.valueOf(pet2.get("tier").getAsString()); - parsedPet.petType = pet2.get("type").getAsString(); - parsedPet.rarity = tier; - if (Utils.canPetBeTierBoosted(parsedPet, tier.nextRarity())) { - tierNum2I += 1; - } - } - float exp2 = pet2.get("exp").getAsFloat(); - - if (tierNum1I != tierNum2I) { - return tierNum2I - tierNum1I; - } else { - return (int) (exp2 - exp1); - } - }); - for (JsonObject pet : sortedPets) { - PetInfoOverlay.Pet parsedPet = new PetInfoOverlay.Pet(); - parsedPet.petType = pet.get("type").getAsString(); - parsedPet.rarity = PetInfoOverlay.Rarity.valueOf(pet.get("tier").getAsString()); - parsedPet.petItem = Utils.getElementAsString(pet.get("heldItem"), null); - if ("PET_ITEM_TIER_BOOST".equals(parsedPet.petItem)) { - PetInfoOverlay.Rarity nextRarity = parsedPet.rarity.nextRarity(); - if (Utils.canPetBeTierBoosted(parsedPet, nextRarity)) parsedPet.rarity = nextRarity; - } - parsedPet.petLevel = PetLeveling.getPetLevelingForPet( - parsedPet.petType, - parsedPet.rarity - ).getPetLevel(pet.get("exp").getAsFloat()); - parsedPet.petXpType = "unknown"; - parsedPet.skin = Utils.getElementAsString(pet.get("skin"), null); - parsedPet.candyUsed = pet.get("candyUsed").getAsInt(); - sortedPetsStack.add(ItemUtils.createPetItemstackFromPetInfo(parsedPet)); - pet.addProperty("level", parsedPet.petLevel.getCurrentLevel()); - pet.addProperty("currentLevelRequirement", parsedPet.petLevel.getExpRequiredForNextLevel()); - pet.addProperty("maxXP", parsedPet.petLevel.getExpRequiredForMaxLevel()); - pet.addProperty("percentageToNextLevel", parsedPet.petLevel.getPercentageToNextLevel()); - } + sortPets(pets); } + renderSortingButton(guiLeft, guiTop); + Panorama.drawPanorama( -getInstance().backgroundRotation, guiLeft + 212, @@ -364,6 +312,117 @@ public class PetsPage extends GuiProfileViewerPage { } } + private void renderSortingButton(int guiLeft, int guiTop) { + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + Utils.drawTexturedRect( + switchSortingMethodButton.getX() + guiLeft - 2, + switchSortingMethodButton.getY() + guiTop - 2, + 20, + 20, + 20 / 256f, + 0, + 20 / 256f, + 0, + GL11.GL_NEAREST + ); + + ItemStack itemStack = new ItemStack(Blocks.hopper); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI( + itemStack, + switchSortingMethodButton.getX() + guiLeft, + switchSortingMethodButton.getY() + guiTop + ); + + int mouseX = Utils.getMouseX() - guiLeft; + int mouseY = Utils.getMouseY() - guiTop; + if (switchSortingMethodButton.contains(mouseX, mouseY)) { + getInstance().tooltipToDisplay = Arrays.asList( + EnumChatFormatting.GREEN + "Sort", + "", + (sortPetsAlphabetically + ? EnumChatFormatting.GRAY + " " + : EnumChatFormatting.DARK_AQUA + "▶") + " Pet Exp", + (!sortPetsAlphabetically + ? EnumChatFormatting.GRAY + " " + : EnumChatFormatting.DARK_AQUA + "▶") + " Alphabetical", + "", + EnumChatFormatting.YELLOW + "Click to switch!" + ); + } + } + + private void sortPets(JsonArray pets) { + sortedPets = new ArrayList<>(); + sortedPetsStack = new ArrayList<>(); + for (int i = 0; i < pets.size(); i++) { + sortedPets.add(pets.get(i).getAsJsonObject()); + } + sortedPets.sort((pet1, pet2) -> { + String petType1 = pet1.get("type").getAsString(); + String tier1 = pet1.get("tier").getAsString(); + String tierNum1 = GuiProfileViewer.RARITY_TO_NUM.get(tier1); + if (tierNum1 == null) return 1; + int tierNum1I = Integer.parseInt(tierNum1); + if ("PET_ITEM_TIER_BOOST".equals(Utils.getElementAsString(pet1.get("heldItem"), null))) { + PetInfoOverlay.Pet parsedPet = new PetInfoOverlay.Pet(); + PetInfoOverlay.Rarity tier = PetInfoOverlay.Rarity.valueOf(pet1.get("tier").getAsString()); + parsedPet.petType = pet1.get("type").getAsString(); + parsedPet.rarity = tier; + if (Utils.canPetBeTierBoosted(parsedPet, tier.nextRarity())) { + tierNum1I += 1; + } + } + float exp1 = pet1.get("exp").getAsFloat(); + + String petType2 = pet2.get("type").getAsString(); + String tier2 = pet2.get("tier").getAsString(); + String tierNum2 = GuiProfileViewer.RARITY_TO_NUM.get(tier2); + if (tierNum2 == null) return -1; + int tierNum2I = Integer.parseInt(tierNum2); + if ("PET_ITEM_TIER_BOOST".equals(Utils.getElementAsString(pet2.get("heldItem"), null))) { + PetInfoOverlay.Pet parsedPet = new PetInfoOverlay.Pet(); + PetInfoOverlay.Rarity tier = PetInfoOverlay.Rarity.valueOf(pet2.get("tier").getAsString()); + parsedPet.petType = pet2.get("type").getAsString(); + parsedPet.rarity = tier; + if (Utils.canPetBeTierBoosted(parsedPet, tier.nextRarity())) { + tierNum2I += 1; + } + } + float exp2 = pet2.get("exp").getAsFloat(); + + if (tierNum1I != tierNum2I) { + return tierNum2I - tierNum1I; + } else if (sortPetsAlphabetically && petType1.compareTo(petType2) != 0) { + return petType1.compareTo(petType2); + } else { + return (int) (exp2 - exp1); + } + }); + + for (JsonObject pet : sortedPets) { + PetInfoOverlay.Pet parsedPet = new PetInfoOverlay.Pet(); + parsedPet.petType = pet.get("type").getAsString(); + parsedPet.rarity = PetInfoOverlay.Rarity.valueOf(pet.get("tier").getAsString()); + parsedPet.petItem = Utils.getElementAsString(pet.get("heldItem"), null); + if ("PET_ITEM_TIER_BOOST".equals(parsedPet.petItem)) { + PetInfoOverlay.Rarity nextRarity = parsedPet.rarity.nextRarity(); + if (Utils.canPetBeTierBoosted(parsedPet, nextRarity)) parsedPet.rarity = nextRarity; + } + parsedPet.petLevel = PetLeveling.getPetLevelingForPet( + parsedPet.petType, + parsedPet.rarity + ).getPetLevel(pet.get("exp").getAsFloat()); + parsedPet.petXpType = "unknown"; + parsedPet.skin = Utils.getElementAsString(pet.get("skin"), null); + parsedPet.candyUsed = pet.get("candyUsed").getAsInt(); + sortedPetsStack.add(ItemUtils.createPetItemstackFromPetInfo(parsedPet)); + pet.addProperty("level", parsedPet.petLevel.getCurrentLevel()); + pet.addProperty("currentLevelRequirement", parsedPet.petLevel.getExpRequiredForNextLevel()); + pet.addProperty("maxXP", parsedPet.petLevel.getExpRequiredForMaxLevel()); + pet.addProperty("percentageToNextLevel", parsedPet.petLevel.getPercentageToNextLevel()); + } + } + @Override public boolean mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { if (sortedPets == null) return false; @@ -402,6 +461,13 @@ public class PetsPage extends GuiProfileViewerPage { } } } + + if (switchSortingMethodButton.contains(mouseX - guiLeft, mouseY - guiTop)) { + sortPetsAlphabetically = !sortPetsAlphabetically; + // Causes the pets to be sorted again next frame, this time taking into account the new sorting preference. + resetCache(); + Utils.playPressSound(); + } } @Override |
