diff options
3 files changed, 164 insertions, 21 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryData.kt b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryData.kt index bcf86206..358d1c3a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryData.kt +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryData.kt @@ -23,6 +23,7 @@ import com.google.gson.JsonObject import io.github.moulberry.notenoughupdates.util.Constants import io.github.moulberry.notenoughupdates.util.ItemUtils import io.github.moulberry.notenoughupdates.util.Utils +import io.github.moulberry.notenoughupdates.util.roundToDecimals import kotlin.math.min object BestiaryData { @@ -169,7 +170,7 @@ object BestiaryData { ) } } - return Category(categoryId, categoryName, categoryIcon, emptyList(), subCategories) + return Category(categoryId, categoryName, categoryIcon, emptyList(), subCategories, calculateFamilyDataOfSubcategories(subCategories)) } else { val categoryMobs = categoryData["mobs"].asJsonArray.map { it.asJsonObject } @@ -199,7 +200,7 @@ object BestiaryData { val levelData = calculateLevel(bracket, kills, cap) computedMobs.add(Mob(mobName, mobIcon, kills, deaths, levelData)) } - return Category(categoryId, categoryName, categoryIcon, computedMobs, emptyList()) + return Category(categoryId, categoryName, categoryIcon, computedMobs, emptyList(), calculateFamilyData(computedMobs)) } } @@ -214,6 +215,9 @@ object BestiaryData { val bracketData = Constants.BESTIARY["brackets"].asJsonObject[bracket.toString()].asJsonArray.map { it.asDouble } var maxLevel = false + var progress = 0.0 + var effKills = 0.0 + var effReq = 0.0 val effectiveKills = if (kills >= cap) { maxLevel = true @@ -222,14 +226,47 @@ object BestiaryData { kills } + val totalProgress = (effectiveKills/cap*100).roundToDecimals(1) + var level = 0 for (requiredKills in bracketData) { if (effectiveKills >= requiredKills) { level++ } else { + val prevTierKills = if (level != 0) bracketData[(level - 1).coerceAtLeast(0)].toInt() else 0 + effKills = kills - prevTierKills + effReq = requiredKills - prevTierKills + progress = (effKills / effReq * 100).roundToDecimals(1) break } } - return MobLevelData(level, maxLevel) + return MobLevelData(level, maxLevel, progress, totalProgress, MobKillData(effKills, effReq, effectiveKills, cap)) + } + + private fun calculateFamilyData(mobs: List<Mob>): FamilyData { + var found = 0 + var completed = 0 + + for (mob in mobs) { + if(mob.kills > 0) found++ + if(mob.mobLevelData.maxLevel) completed++ + } + + return FamilyData(found, completed, mobs.size) + } + + private fun calculateFamilyDataOfSubcategories(subCategories: List<Category>): FamilyData { + var found = 0 + var completed = 0 + var total = 0 + + for (category in subCategories) { + val data = category.familyData + found += data.found + completed += data.completed + total += data.total + } + + return FamilyData(found, completed, total) } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.kt b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.kt index 62847ea6..c25cbe34 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.kt +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.kt @@ -48,13 +48,34 @@ data class Mob( * A Bestiary category as defined in `constants/bestiary.json` */ data class Category( - val id: String, val name: String, val icon: ItemStack, val mobs: List<Mob>, val subCategories: List<Category> + val id: String, + val name: String, + val icon: ItemStack, + val mobs: List<Mob>, + val subCategories: List<Category>, + val familyData: FamilyData ) /** * Level data for one specific mob */ -data class MobLevelData(val level: Int, val maxLevel: Boolean) +data class MobLevelData( + val level: Int, val maxLevel: Boolean, val progress: Double, val totalProgress: Double, val mobKillData: MobKillData +) + +/** + * Kills data for one specific mob + */ +data class MobKillData( + val tierKills: Double, val tierReq: Double, val cappedKills: Double, val cap: Double +) + +/** + * Family data for one specific category + */ +data class FamilyData( + val found: Int, val completed: Int, val total: Int +) class BestiaryPage(instance: GuiProfileViewer?) : GuiProfileViewerPage(instance) { private var selectedCategory = "dynamic" @@ -231,6 +252,64 @@ class BestiaryPage(instance: GuiProfileViewer?) : GuiProfileViewerPage(instance) selectedSubCategory = "" } + // Render family information + var catData = selectedCategory.familyData + Utils.renderAlignedString( + EnumChatFormatting.RED.toString() + "Families Found:", + (if (catData.found == catData.total) "§6" else "§7") + "${catData.found}/${catData.total}", + guiLeft + 280F, + guiTop + 70F, + 110 + ) + if (catData.found == catData.total) { + instance.renderGoldBar(guiLeft + 280F, guiTop + 80F, 112F) + } else { + instance.renderBar(guiLeft + 280F, guiTop + 80F, 112F, catData.found / catData.total.toFloat()) + } + + Utils.renderAlignedString( + EnumChatFormatting.RED.toString() + "Families Completed:", + (if (catData.completed == catData.total) "§6" else "§7") + "${catData.completed}/${catData.total}", + guiLeft + 280F, + guiTop + 90F, + 110 + ) + if (catData.completed == catData.total) { + instance.renderGoldBar(guiLeft + 280F, guiTop + 100F, 112F) + } else { + instance.renderBar(guiLeft + 280F, guiTop + 100F, 112F, catData.completed / catData.total.toFloat()) + } + + // Render subcategory family information, if possible + if (selectedSubCategory != "") { + catData = selectedCategory.subCategories.find { it.id == selectedSubCategory }!!.familyData + Utils.renderAlignedString( + EnumChatFormatting.RED.toString() + "Families Found:", + (if (catData.found == catData.total) "§6" else "§7") + "${catData.found}/${catData.total}", + guiLeft + 280F, + guiTop + 120F, + 110 + ) + if (catData.found == catData.total) { + instance.renderGoldBar(guiLeft + 280F, guiTop + 130F, 112F) + } else { + instance.renderBar(guiLeft + 280F, guiTop + 130F, 112F, catData.found / catData.total.toFloat()) + } + + Utils.renderAlignedString( + EnumChatFormatting.RED.toString() + "Families Completed:", + (if (catData.completed == catData.total) "§6" else "§7") + "${catData.completed}/${catData.total}", + guiLeft + 280F, + guiTop + 140F, + 110 + ) + if (catData.completed == catData.total) { + instance.renderGoldBar(guiLeft + 280F, guiTop + 150F, 112F) + } else { + instance.renderBar(guiLeft + 280F, guiTop + 150F, 112F, catData.completed / catData.total.toFloat()) + } + } + // Determine which mobs should be displayed val mobs = if (selectedSubCategory != "") { selectedCategory.subCategories.first { it.id == selectedSubCategory }.mobs @@ -245,7 +324,6 @@ class BestiaryPage(instance: GuiProfileViewer?) : GuiProfileViewerPage(instance) val yIndex = i / mobListXCount val x = 23 + mobListXPadding + (mobListXPadding + 20) * xIndex val y = 30 + mobListYPadding + (mobListYPadding + 20) * yIndex - val completedness = 0f GlStateManager.disableLighting() RenderHelper.enableGUIStandardItemLighting() @@ -255,24 +333,11 @@ class BestiaryPage(instance: GuiProfileViewer?) : GuiProfileViewerPage(instance) guiLeft + x, guiTop + y, 20f, - 20 * (1 - completedness), - 0f, - 20 / 256f, - 0f, - 20 * (1 - completedness) / 256f, - GL11.GL_NEAREST - ) - //GlStateManager.color(1, 185 / 255f, 0, 1); - Minecraft.getMinecraft().textureManager.bindTexture(GuiProfileViewer.pv_elements) - Utils.drawTexturedRect( - guiLeft + x, - guiTop + y + 20 * (1 - completedness), 20f, - 20 * completedness, 0f, 20 / 256f, - 20 * (1 - completedness) / 256f, - 20 / 256f, + 0f, + 20f / 256f, GL11.GL_NEAREST ) Utils.drawItemStack(stack, guiLeft + x.toInt() + 2, guiTop + y.toInt() + 2) @@ -293,6 +358,47 @@ class BestiaryPage(instance: GuiProfileViewer?) : GuiProfileViewerPage(instance) EnumChatFormatting.GRAY.toString() + "Deaths: " + EnumChatFormatting.GREEN + StringUtils.formatNumber(deaths) ) + tooltipToDisplay.add("") + + if (!mob.mobLevelData.maxLevel) { + tooltipToDisplay.add( + EnumChatFormatting.GRAY.toString() + "Progress to Tier ${mob.mobLevelData.level + 1}: " + + EnumChatFormatting.AQUA + "${mob.mobLevelData.progress}%" + ) + + var bar = "§3§l§m" + for (j in 1..14) { + var col = "" + if (mob.mobLevelData.progress < j * (100 / 14)) col = "§f§l§m" + bar += "$col " + } + tooltipToDisplay.add( + "${bar}§r§b ${StringUtils.formatNumber(mob.mobLevelData.mobKillData.tierKills)}/${ + StringUtils.formatNumber( + mob.mobLevelData.mobKillData.tierReq + ) + }" + ) + tooltipToDisplay.add("") + } + + tooltipToDisplay.add( + EnumChatFormatting.GRAY.toString() + "Overall Progress: " + EnumChatFormatting.AQUA + "${mob.mobLevelData.totalProgress}%" + + if (mob.mobLevelData.maxLevel) " §7(§c§lMAX!§r§7)" else "" + ) + var bar = "§3§l§m" + for (j in 1..14) { + var col = "" + if (mob.mobLevelData.totalProgress < j * (100 / 14)) col = "§f§l§m" + bar += "$col " + } + tooltipToDisplay.add( + "${bar}§r§b ${StringUtils.formatNumber(mob.mobLevelData.mobKillData.cappedKills)}/${ + StringUtils.formatNumber( + mob.mobLevelData.mobKillData.cap + ) + }" + ) } } GlStateManager.color(1f, 1f, 1f, 1f) diff --git a/src/main/resources/assets/notenoughupdates/pv_bestiary_tab.png b/src/main/resources/assets/notenoughupdates/pv_bestiary_tab.png Binary files differindex 620c156b..a3ba742e 100644 --- a/src/main/resources/assets/notenoughupdates/pv_bestiary_tab.png +++ b/src/main/resources/assets/notenoughupdates/pv_bestiary_tab.png |