add experience upgrade tooltip to show level

closes #2664
This commit is contained in:
payonel 2019-08-24 22:23:08 -07:00
parent b7c7ed8221
commit eb3e6d8727
4 changed files with 60 additions and 18 deletions

View File

@ -177,6 +177,8 @@ object Localization {
def PrintRedstoneLevel(level: Int): String = localizeImmediately("tooltip.print.RedstoneLevel", level.toString)
def MFULinked(isLinked: Boolean): String = localizeImmediately(if (isLinked) "tooltip.upgrademf.Linked" else "tooltip.upgrademf.Unlinked")
def ExperienceLevel(level: Double): String = localizeImmediately("tooltip.robot_level", level.toString)
}
}

View File

@ -1,3 +1,25 @@
package li.cil.oc.common.item
class UpgradeExperience(val parent: Delegator) extends traits.Delegate with traits.ItemTier
import java.util
import li.cil.oc.util.UpgradeExperience
import net.minecraft.client.util.ITooltipFlag
import net.minecraft.item.ItemStack
import net.minecraft.world.World
import net.minecraftforge.fml.relauncher.{Side, SideOnly}
import li.cil.oc.Localization;
class UpgradeExperience(val parent: Delegator) extends traits.Delegate with traits.ItemTier {
@SideOnly(Side.CLIENT) override
def tooltipLines(stack: ItemStack, world: World, tooltip: util.List[String], flag: ITooltipFlag): Unit = {
if (stack.hasTagCompound) {
val nbt = li.cil.oc.integration.opencomputers.Item.dataTag(stack)
val experience = UpgradeExperience.getExperience(nbt)
val level = UpgradeExperience.calculateLevelFromExperience(experience)
val reportedLevel = UpgradeExperience.calculateExperienceLevel(level, experience)
tooltip.add(Localization.Tooltip.ExperienceLevel(reportedLevel))
}
super.tooltipLines(stack, world, tooltip, flag)
}
}

View File

@ -14,9 +14,8 @@ import li.cil.oc.api.machine.Arguments
import li.cil.oc.api.machine.Callback
import li.cil.oc.api.machine.Context
import li.cil.oc.api.network.Visibility
import li.cil.oc.api.prefab
import li.cil.oc.api.prefab.AbstractManagedEnvironment
import net.minecraft.enchantment.Enchantment
import li.cil.oc.util.UpgradeExperience
import net.minecraft.enchantment.EnchantmentHelper
import net.minecraft.entity.item.EntityXPOrb
import net.minecraft.init.Items
@ -47,11 +46,7 @@ class UpgradeExperience(val host: EnvironmentHost with internal.Agent) extends A
var level = 0
def xpForLevel(level: Int): Double =
if (level == 0) 0
else Settings.get.baseXpToLevel + Math.pow(level * Settings.get.constantXpGrowth, Settings.get.exponentialXpGrowth)
def xpForNextLevel = xpForLevel(level + 1)
def xpForNextLevel: Double = UpgradeExperience.xpForLevel(level + 1)
def addExperience(value: Double) {
if (level < MaxLevel) {
@ -71,7 +66,7 @@ class UpgradeExperience(val host: EnvironmentHost with internal.Agent) extends A
// xp(level) = base + (level * const) ^ exp
// pow(xp(level) - base, 1/exp) / const = level
val oldLevel = level
level = math.min((Math.pow(experience - Settings.get.baseXpToLevel, 1 / Settings.get.exponentialXpGrowth) / Settings.get.constantXpGrowth).toInt, 30)
level = UpgradeExperience.calculateLevelFromExperience(experience)
if (node != null) {
if (level != oldLevel) {
updateClient()
@ -81,11 +76,8 @@ class UpgradeExperience(val host: EnvironmentHost with internal.Agent) extends A
}
@Callback(direct = true, doc = """function():number -- The current level of experience stored in this experience upgrade.""")
def level(context: Context, args: Arguments): Array[AnyRef] = {
val xpNeeded = xpForNextLevel - xpForLevel(level)
val xpProgress = math.max(0, experience - xpForLevel(level))
result(level + xpProgress / xpNeeded)
}
def level(context: Context, args: Arguments): Array[AnyRef] =
result(UpgradeExperience.calculateExperienceLevel(level, experience))
@Callback(doc = """function():boolean -- Tries to consume an enchanted item to add experience to the upgrade.""")
def consume(context: Context, args: Arguments): Array[AnyRef] = {
@ -123,16 +115,14 @@ class UpgradeExperience(val host: EnvironmentHost with internal.Agent) extends A
case _ =>
}
private final val XpTag = Settings.namespace + "xp"
override def save(nbt: NBTTagCompound) {
super.save(nbt)
nbt.setDouble(XpTag, experience)
UpgradeExperience.setExperience(nbt, experience)
}
override def load(nbt: NBTTagCompound) {
super.load(nbt)
experience = nbt.getDouble(XpTag) max 0
experience = UpgradeExperience.getExperience(nbt)
updateXpInfo()
}
}

View File

@ -0,0 +1,28 @@
package li.cil.oc.util
import li.cil.oc.Settings
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
object UpgradeExperience {
final val XpTag = Settings.namespace + "xp"
def getExperience(nbt: NBTTagCompound): Double = nbt.getDouble(XpTag) max 0
def getExperience(stack: ItemStack): Double = if (!stack.hasTagCompound) 0 else getExperience(stack.getTagCompound)
def setExperience(nbt: NBTTagCompound, experience: Double): Unit = nbt.setDouble(XpTag, experience)
def xpForLevel(level: Int): Double =
if (level == 0) 0
else Settings.get.baseXpToLevel + Math.pow(level * Settings.get.constantXpGrowth, Settings.get.exponentialXpGrowth)
def calculateExperienceLevel(level: Int, experience: Double): Double = {
val xpNeeded = xpForLevel(level + 1) - xpForLevel(level)
val xpProgress = math.max(0, experience - xpForLevel(level))
level + xpProgress / xpNeeded
}
def calculateLevelFromExperience(experience: Double): Int =
math.min((Math.pow(experience - Settings.get.baseXpToLevel, 1 / Settings.get.exponentialXpGrowth) / Settings.get.constantXpGrowth).toInt, 30)
}