mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-18 11:48:02 -04:00
parent
b7c7ed8221
commit
eb3e6d8727
@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
28
src/main/scala/li/cil/oc/util/UpgradeExperience.scala
Normal file
28
src/main/scala/li/cil/oc/util/UpgradeExperience.scala
Normal 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)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user