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