diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeExperience.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeExperience.scala index e1336b0be..8ef4f7ea2 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeExperience.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeExperience.scala @@ -5,6 +5,7 @@ import li.cil.oc.api import li.cil.oc.api.driver.EnvironmentAware import li.cil.oc.api.driver.EnvironmentHost import li.cil.oc.api.driver.item.HostAware +import li.cil.oc.api.internal import li.cil.oc.common.Slot import li.cil.oc.common.Tier import li.cil.oc.server.component @@ -14,7 +15,11 @@ object DriverUpgradeExperience extends Item with HostAware with EnvironmentAware override def worksWith(stack: ItemStack) = isOneOf(stack, api.Items.get(Constants.ItemName.ExperienceUpgrade)) - override def createEnvironment(stack: ItemStack, host: EnvironmentHost) = new component.UpgradeExperience() + override def createEnvironment(stack: ItemStack, host: EnvironmentHost) = + host match { + case host: internal.Agent => new component.UpgradeExperience(host) + case _ => null + } override def slot(stack: ItemStack) = Slot.Upgrade diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeGenerator.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeGenerator.scala index 9f5eb2a5a..c43f05f7d 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeGenerator.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeGenerator.scala @@ -5,7 +5,7 @@ import li.cil.oc.api import li.cil.oc.api.driver.EnvironmentAware import li.cil.oc.api.driver.EnvironmentHost import li.cil.oc.api.driver.item.HostAware -import li.cil.oc.api.internal.Robot +import li.cil.oc.api.internal import li.cil.oc.common.Slot import li.cil.oc.common.Tier import li.cil.oc.server.component @@ -17,7 +17,7 @@ object DriverUpgradeGenerator extends Item with HostAware with EnvironmentAware override def createEnvironment(stack: ItemStack, host: EnvironmentHost) = host match { - case robot: Robot => new component.UpgradeGenerator(robot) + case host: internal.Agent => new component.UpgradeGenerator(host) case _ => null } diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala b/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala index 19a274cf2..7ae85d195 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala @@ -160,7 +160,6 @@ object ModOpenComputers extends ModProxy { Constants.BlockName.ScreenTier1, Constants.ItemName.AngelUpgrade, Constants.ItemName.CraftingUpgrade, - Constants.ItemName.ExperienceUpgrade, Constants.ItemName.HoverUpgradeTier1, Constants.ItemName.HoverUpgradeTier2) blacklistHost(classOf[internal.Microcontroller], diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeExperience.scala b/src/main/scala/li/cil/oc/server/component/UpgradeExperience.scala index 6f98d4df7..125e20f4d 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeExperience.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeExperience.scala @@ -2,14 +2,21 @@ package li.cil.oc.server.component import li.cil.oc.Settings import li.cil.oc.api +import li.cil.oc.api.driver.EnvironmentHost +import li.cil.oc.api.internal 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 net.minecraft.enchantment.Enchantment +import net.minecraft.enchantment.EnchantmentHelper +import net.minecraft.init.Items import net.minecraft.nbt.NBTTagCompound -class UpgradeExperience extends prefab.ManagedEnvironment { +import scala.collection.convert.WrapAsScala._ + +class UpgradeExperience(val host: EnvironmentHost with internal.Agent) extends prefab.ManagedEnvironment { override val node = api.Network.newNode(this, Visibility.Network). withComponent("experience"). withConnector(30 * Settings.get.bufferPerLevel). @@ -19,7 +26,7 @@ class UpgradeExperience extends prefab.ManagedEnvironment { var level = 0 - def xpForLevel(level: Int) = + def xpForLevel(level: Int): Double = if (level == 0) 0 else Settings.get.baseXpToLevel + Math.pow(level * Settings.get.constantXpGrowth, Settings.get.exponentialXpGrowth) @@ -50,6 +57,35 @@ class UpgradeExperience extends prefab.ManagedEnvironment { result(level + xpProgress / xpNeeded) } + @Callback(doc = """function():boolean -- Tries to consume an enchanted item to add experience to the upgrade.""") + def consume(context: Context, args: Arguments): Array[AnyRef] = { + val stack = host.mainInventory.getStackInSlot(host.selectedSlot) + if (stack == null || stack.stackSize < 1) { + return result(Unit, "no item") + } + var xp = 0 + if (stack.getItem == Items.experience_bottle) { + xp += 3 + host.world.rand.nextInt(5) + host.world.rand.nextInt(5) + } + else { + for ((id: Int, level: Int) <- EnchantmentHelper.getEnchantments(stack)) { + val enchantment = Enchantment.enchantmentsList(id) + if (enchantment != null) { + xp += enchantment.getMinEnchantability(level) + } + } + if (xp <= 0) { + return result(Unit, "could not extract experience from item") + } + } + val consumed = host.mainInventory().decrStackSize(host.selectedSlot, 1) + if (consumed == null || consumed.stackSize < 1) { + return result(Unit, "could not consume item") + } + addExperience(xp * Settings.get.constantXpGrowth) + result(true) + } + override def save(nbt: NBTTagCompound) { super.save(nbt) nbt.setDouble(Settings.namespace + "xp", experience)