Profile Viewer Skill Page v1
This commit is contained in:
@@ -10,6 +10,7 @@ import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.UseSerializers
|
||||
import kotlin.reflect.KProperty1
|
||||
import net.minecraft.util.DyeColor
|
||||
import moe.nea.firmament.util.json.DashlessUUIDSerializer
|
||||
import moe.nea.firmament.util.json.InstantAsLongSerializer
|
||||
|
||||
@@ -30,18 +31,18 @@ data class Profile(
|
||||
val members: Map<UUID, Member>,
|
||||
)
|
||||
|
||||
enum class Skill(val accessor: KProperty1<Member, Double>) {
|
||||
FARMING(Member::experienceSkillFarming),
|
||||
FORAGING(Member::experienceSkillForaging),
|
||||
MINING(Member::experienceSkillMining),
|
||||
ALCHEMY(Member::experienceSkillAlchemy),
|
||||
TAMING(Member::experienceSkillTaming),
|
||||
FISHING(Member::experienceSkillFishing),
|
||||
RUNECRAFTING(Member::experienceSkillRunecrafting),
|
||||
CARPENTRY(Member::experienceSkillCarpentry),
|
||||
COMBAT(Member::experienceSkillCombat),
|
||||
SOCIAL(Member::experienceSkillSocial),
|
||||
ENCHANTING(Member::experienceSkillEnchanting),
|
||||
enum class Skill(val accessor: KProperty1<Member, Double>, val color: DyeColor) {
|
||||
FARMING(Member::experienceSkillFarming, DyeColor.YELLOW),
|
||||
FORAGING(Member::experienceSkillForaging, DyeColor.BROWN),
|
||||
MINING(Member::experienceSkillMining, DyeColor.LIGHT_GRAY),
|
||||
ALCHEMY(Member::experienceSkillAlchemy, DyeColor.PURPLE),
|
||||
TAMING(Member::experienceSkillTaming, DyeColor.GREEN),
|
||||
FISHING(Member::experienceSkillFishing, DyeColor.BLUE),
|
||||
RUNECRAFTING(Member::experienceSkillRunecrafting, DyeColor.PINK),
|
||||
CARPENTRY(Member::experienceSkillCarpentry, DyeColor.ORANGE),
|
||||
COMBAT(Member::experienceSkillCombat, DyeColor.RED),
|
||||
SOCIAL(Member::experienceSkillSocial, DyeColor.WHITE),
|
||||
ENCHANTING(Member::experienceSkillEnchanting, DyeColor.MAGENTA),
|
||||
;
|
||||
|
||||
fun getMaximumLevel(leveling: Leveling) = leveling.maximumLevels[name.lowercase()] ?: TODO("Repo error")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package moe.nea.firmament.gui
|
||||
|
||||
import com.mojang.blaze3d.systems.RenderSystem
|
||||
import io.github.cottonmc.cotton.gui.client.ScreenDrawing
|
||||
import io.github.cottonmc.cotton.gui.widget.WWidget
|
||||
import io.github.cottonmc.cotton.gui.widget.data.Texture
|
||||
@@ -7,17 +8,19 @@ import me.shedaniel.math.Color
|
||||
import net.minecraft.client.util.math.MatrixStack
|
||||
import moe.nea.firmament.Firmament
|
||||
|
||||
data class WBar(
|
||||
open class WBar(
|
||||
var progress: Double,
|
||||
val total: Double,
|
||||
val fillColor: Color,
|
||||
val emptyColor: Color,
|
||||
) : WWidget() {
|
||||
companion object {
|
||||
val resource = Firmament.identifier("textures/gui/bar.png")
|
||||
val left = Texture(resource, 0 / 64F, 0 / 64F, 4 / 64F, 8 / 64F)
|
||||
val middle = Texture(resource, 4 / 64F, 0 / 64F, 4 / 64F, 8 / 64F)
|
||||
val right = Texture(resource, 8 / 64F, 0 / 64F, 4 / 64F, 8 / 64F)
|
||||
val middle = Texture(resource, 4 / 64F, 0 / 64F, 8 / 64F, 8 / 64F)
|
||||
val right = Texture(resource, 8 / 64F, 0 / 64F, 12 / 64F, 8 / 64F)
|
||||
val segmentOverlay = Texture(resource, 12 / 64F, 0 / 64F, 15 / 64F, 8 / 64F)
|
||||
}
|
||||
|
||||
override fun canResize(): Boolean {
|
||||
return true
|
||||
@@ -65,5 +68,6 @@ data class WBar(
|
||||
i += 4
|
||||
}
|
||||
drawSection(matrices, right, x + width - 4, y, 4, (width - 4) * total / width, total)
|
||||
RenderSystem.setShaderColor(1F, 1F, 1F, 1F)
|
||||
}
|
||||
}
|
||||
|
||||
34
src/main/kotlin/moe/nea/firmament/gui/WCenteringPanel.kt
Normal file
34
src/main/kotlin/moe/nea/firmament/gui/WCenteringPanel.kt
Normal file
@@ -0,0 +1,34 @@
|
||||
package moe.nea.firmament.gui
|
||||
|
||||
import io.github.cottonmc.cotton.gui.widget.WPanel
|
||||
import io.github.cottonmc.cotton.gui.widget.WWidget
|
||||
import io.github.cottonmc.cotton.gui.widget.data.Axis
|
||||
|
||||
data class WCenteringPanel(
|
||||
val child: WWidget,
|
||||
val axis: Axis,
|
||||
) : WPanel() {
|
||||
init {
|
||||
child.parent = this
|
||||
}
|
||||
|
||||
override fun setSize(x: Int, y: Int) {
|
||||
super.setSize(x, y)
|
||||
if (!child.canResize()) return
|
||||
if (axis == Axis.HORIZONTAL) {
|
||||
child.setSize(child.width, y)
|
||||
} else {
|
||||
child.setSize(x, child.height)
|
||||
}
|
||||
}
|
||||
|
||||
override fun layout() {
|
||||
super.layout()
|
||||
child.setLocation(
|
||||
axis.choose((child.width + width) / 2, child.x),
|
||||
axis.choose(child.y, (child.height + height) / 2),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package moe.nea.firmament.gui.profileviewer
|
||||
|
||||
import io.github.cottonmc.cotton.gui.widget.WWidget
|
||||
|
||||
interface ProfilePage {
|
||||
fun getElements(profileViewer: ProfileViewer): WWidget
|
||||
}
|
||||
@@ -1,49 +1,36 @@
|
||||
package moe.nea.firmament.gui.profileviewer
|
||||
|
||||
import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription
|
||||
import io.github.cottonmc.cotton.gui.widget.TooltipBuilder
|
||||
import io.github.cottonmc.cotton.gui.widget.WGridPanel
|
||||
import io.github.cottonmc.cotton.gui.widget.WTabPanel
|
||||
import io.github.cottonmc.cotton.gui.widget.WText
|
||||
import io.github.cottonmc.cotton.gui.widget.data.Insets
|
||||
import io.github.cottonmc.cotton.gui.widget.icon.ItemIcon
|
||||
import java.util.UUID
|
||||
import net.minecraft.item.Items
|
||||
import net.minecraft.text.Text
|
||||
import net.minecraft.util.DyeColor
|
||||
import moe.nea.firmament.apis.Member
|
||||
import moe.nea.firmament.apis.Profile
|
||||
import moe.nea.firmament.apis.Skill
|
||||
import moe.nea.firmament.repo.RepoManager
|
||||
import moe.nea.firmament.gui.WBar
|
||||
import moe.nea.firmament.util.toShedaniel
|
||||
|
||||
class ProfileViewer(
|
||||
val primaryPlayer: UUID,
|
||||
val playerNames: Map<UUID, String>,
|
||||
val profile: Profile,
|
||||
) : LightweightGuiDescription() {
|
||||
|
||||
val member: Member = profile.members[primaryPlayer] ?: error("Primary player not in profile")
|
||||
val primaryName: String = playerNames[primaryPlayer] ?: error("Primary player has no name")
|
||||
|
||||
init {
|
||||
val primaryMember = profile.members[primaryPlayer] ?: error("Primary player not in profile")
|
||||
val panel = WTabPanel().also { rootPanel = it }
|
||||
panel.backgroundPainter
|
||||
panel.add(WGridPanel().also {
|
||||
it.insets = Insets.ROOT_PANEL
|
||||
it.add(WText(Text.literal(playerNames[primaryPlayer] ?: error("Primary player has no name"))), 0, 0, 6, 1)
|
||||
for ((i, skill) in Skill.values().withIndex()) {
|
||||
val leveling = RepoManager.neuRepo.constants.leveling
|
||||
val exp = skill.accessor.get(primaryMember)
|
||||
val maxLevel = skill.getMaximumLevel(leveling)
|
||||
val level = skill.getLadder(leveling)
|
||||
.runningFold(0.0) { a, b -> a + b }
|
||||
.filter { it <= exp }.size
|
||||
.coerceAtMost(maxLevel)
|
||||
it.add(WText(Text.translatable("firmament.pv.skills.${skill.name.lowercase()}")), 0, i + 1, 5, 1)
|
||||
it.add(object : WText(Text.literal("$level/$maxLevel")) {
|
||||
override fun addTooltip(tooltip: TooltipBuilder) {
|
||||
tooltip.add(Text.translatable("firmament.pv.skills.total", exp))
|
||||
}
|
||||
}, 5, i + 1, 2, 1)
|
||||
}
|
||||
}) {
|
||||
panel.add(SkillPage.getElements(this)) {
|
||||
it.icon(ItemIcon(Items.IRON_SWORD))
|
||||
it.title(Text.translatable("firmament.pv.skills"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
package moe.nea.firmament.gui.profileviewer
|
||||
|
||||
import io.github.cottonmc.cotton.gui.widget.TooltipBuilder
|
||||
import io.github.cottonmc.cotton.gui.widget.WGridPanel
|
||||
import io.github.cottonmc.cotton.gui.widget.WText
|
||||
import io.github.cottonmc.cotton.gui.widget.WWidget
|
||||
import io.github.cottonmc.cotton.gui.widget.data.Insets
|
||||
import net.minecraft.text.Text
|
||||
import moe.nea.firmament.apis.Skill
|
||||
import moe.nea.firmament.gui.WBar
|
||||
import moe.nea.firmament.repo.RepoManager
|
||||
import moe.nea.firmament.util.toShedaniel
|
||||
|
||||
object SkillPage : ProfilePage {
|
||||
override fun getElements(profileViewer: ProfileViewer): WWidget {
|
||||
return WGridPanel().also {
|
||||
it.insets = Insets.ROOT_PANEL
|
||||
it.add(WText(Text.literal(profileViewer.primaryName /* with rank? */)), 0, 0, 6, 1)
|
||||
for ((i, skill) in Skill.values().withIndex()) {
|
||||
val leveling = RepoManager.neuRepo.constants.leveling
|
||||
val exp = skill.accessor.get(profileViewer.member)
|
||||
val maxLevel = skill.getMaximumLevel(leveling)
|
||||
val level = skill.getLadder(leveling)
|
||||
.runningFold(0.0) { a, b -> a + b }
|
||||
.filter { it <= exp }.size
|
||||
.coerceAtMost(maxLevel)
|
||||
it.add(WText(Text.translatable("firmament.pv.skills.${skill.name.lowercase()}")), 0, i + 1, 4, 1)
|
||||
it.add(object : WBar(
|
||||
level.toDouble(), maxLevel.toDouble(),
|
||||
skill.color.toShedaniel(), skill.color.toShedaniel().darker(2.0)
|
||||
) {
|
||||
override fun addTooltip(tooltip: TooltipBuilder) {
|
||||
tooltip.add(Text.literal("$level/$maxLevel"))
|
||||
tooltip.add(Text.translatable("firmament.pv.skills.total", exp))
|
||||
}
|
||||
}, 4, i + 1, 4, 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user