diff --git a/resources/assets/bdlib/lang/en_US.lang b/resources/assets/bdlib/lang/en_US.lang index e631441..7dd3def 100644 --- a/resources/assets/bdlib/lang/en_US.lang +++ b/resources/assets/bdlib/lang/en_US.lang @@ -9,6 +9,10 @@ bdlib.multiblock.disabled=Disabled bdlib.multiblock.incomplete=This machine is incomplete, it requires at least: bdlib.multiblock.notconnected=Not connected to a valid machine bdlib.multiblock.toomanyoutputs=Too many outputs connected, unable to attach new connection +bdlib.multiblock.tip.module=Can be installed in: +bdlib.multiblock.tip.controller=Possible modules: +bdlib.multiblock.tip.module.range= * %s (%s - %s) +bdlib.multiblock.tip.module.max= * %s (up to %s) bdlib.rsmode.always=Always ON bdlib.rsmode.never=Disabled diff --git a/src/net/bdew/lib/config/MachineManager.scala b/src/net/bdew/lib/config/MachineManager.scala index 21dc9aa..30c417d 100644 --- a/src/net/bdew/lib/config/MachineManager.scala +++ b/src/net/bdew/lib/config/MachineManager.scala @@ -9,8 +9,11 @@ package net.bdew.lib.config +import net.bdew.lib.Misc import net.bdew.lib.gui.{GuiHandler, GuiProvider} import net.bdew.lib.machine.Machine +import net.bdew.lib.multiblock.MachineCore +import net.bdew.lib.multiblock.block.BlockModule import net.bdew.lib.recipes.gencfg.ConfigSection import net.minecraft.creativetab.CreativeTabs @@ -25,5 +28,27 @@ class MachineManager(val tuning: ConfigSection, guiHandler: GuiHandler, creative } return machine } + def load() {} } + +trait MachineManagerMultiblock extends MachineManager { + var controllers = Set.empty[MachineCore] + + override def registerMachine[R <: Machine[_]](machine: R): R = { + super.registerMachine(machine) + if (machine.enabled) { + Misc.asInstanceOpt(machine, classOf[MachineCore]) foreach { controllerMachine => + controllers += controllerMachine + controllerMachine.getController.machine = controllerMachine + } + } + machine + } + + def getMachinesForBlock(b: BlockModule[_]): Map[MachineCore, (Int, Int)] = { + (for (machine <- controllers; max <- machine.modules.get(b.kind)) yield { + machine ->(machine.required.getOrElse(b.kind, 0), max) + }).toMap + } +} \ No newline at end of file diff --git a/src/net/bdew/lib/multiblock/MachineCore.scala b/src/net/bdew/lib/multiblock/MachineCore.scala index b7e7591..36e7f96 100644 --- a/src/net/bdew/lib/multiblock/MachineCore.scala +++ b/src/net/bdew/lib/multiblock/MachineCore.scala @@ -9,11 +9,16 @@ package net.bdew.lib.multiblock +import net.bdew.lib.machine.Machine +import net.bdew.lib.multiblock.block.BlockController import net.bdew.lib.recipes.gencfg.{ConfigSection, EntryDouble} -trait MachineCore { +trait MachineCore extends { + this: Machine[_ <: BlockController[_]] => var tuning: ConfigSection + def getController: BlockController[_] = block + def cfgSectionToMap(name: String) = tuning.getSection(name).map({ case (n, EntryDouble(v)) => n -> v.toInt case (n, x) => sys.error("Invalid config value in section %s%s.%s = %s".format(tuning.pfx, name, n, x)) diff --git a/src/net/bdew/lib/multiblock/block/BlockController.scala b/src/net/bdew/lib/multiblock/block/BlockController.scala index 5e7c353..2a8e5e7 100644 --- a/src/net/bdew/lib/multiblock/block/BlockController.scala +++ b/src/net/bdew/lib/multiblock/block/BlockController.scala @@ -9,17 +9,22 @@ package net.bdew.lib.multiblock.block -import net.bdew.lib.block.{BlockRef, HasTE} -import net.bdew.lib.multiblock.ResourceProvider +import net.bdew.lib.Misc +import net.bdew.lib.block.{BlockRef, BlockTooltip, HasTE} import net.bdew.lib.multiblock.tile.TileController +import net.bdew.lib.multiblock.{MachineCore, ResourceProvider} import net.bdew.lib.render.connected.ConnectedTextureBlock import net.minecraft.block.Block import net.minecraft.block.material.Material import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.util.EnumChatFormatting import net.minecraft.world.{IBlockAccess, World} abstract class BlockController[T <: TileController](val name: String, material: Material, val TEClass: Class[T]) - extends Block(material) with HasTE[T] with ConnectedTextureBlock { + extends Block(material) with HasTE[T] with ConnectedTextureBlock with BlockTooltip { + + var machine: MachineCore = null def resources: ResourceProvider @@ -39,6 +44,23 @@ abstract class BlockController[T <: TileController](val name: String, material: getTE(world, x, y, z).onClick(player) return true } + + override def getTooltip(stack: ItemStack, player: EntityPlayer, advanced: Boolean): List[String] = { + List(Misc.toLocal("bdlib.multiblock.tip.controller")) ++ ( + for ((kind, max) <- machine.modules) yield { + val name = Misc.toLocalF(resources.getModuleName(kind)) + if (machine.required.getOrElse(kind, 0) > 0) { + Misc.toLocalF("bdlib.multiblock.tip.module.range", + EnumChatFormatting.YELLOW + name + EnumChatFormatting.RESET, + EnumChatFormatting.YELLOW + machine.required(kind).toString + EnumChatFormatting.RESET, + EnumChatFormatting.YELLOW + max.toString + EnumChatFormatting.RESET) + } else { + Misc.toLocalF("bdlib.multiblock.tip.module.max", + EnumChatFormatting.YELLOW + name + EnumChatFormatting.RESET, + EnumChatFormatting.YELLOW + max.toString + EnumChatFormatting.RESET) + } + }) + } } diff --git a/src/net/bdew/lib/multiblock/block/BlockModule.scala b/src/net/bdew/lib/multiblock/block/BlockModule.scala index 3629a0b..bb09ece 100644 --- a/src/net/bdew/lib/multiblock/block/BlockModule.scala +++ b/src/net/bdew/lib/multiblock/block/BlockModule.scala @@ -9,7 +9,9 @@ package net.bdew.lib.multiblock.block -import net.bdew.lib.block.{BlockRef, HasTE} +import net.bdew.lib.Misc +import net.bdew.lib.block.{BlockRef, BlockTooltip, HasTE} +import net.bdew.lib.config.MachineManagerMultiblock import net.bdew.lib.multiblock.tile.TileModule import net.bdew.lib.multiblock.{ResourceProvider, Tools} import net.bdew.lib.render.connected.ConnectedTextureBlock @@ -18,11 +20,11 @@ import net.minecraft.block.material.Material import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack -import net.minecraft.util.ChatComponentTranslation +import net.minecraft.util.{ChatComponentTranslation, EnumChatFormatting} import net.minecraft.world.{IBlockAccess, World} -abstract class BlockModule[T <: TileModule](val name: String, val kind: String, material: Material, val TEClass: Class[T]) - extends Block(material) with HasTE[T] with ConnectedTextureBlock { +abstract class BlockModule[T <: TileModule](val name: String, val kind: String, material: Material, val TEClass: Class[T], val machines: MachineManagerMultiblock) + extends Block(material) with HasTE[T] with ConnectedTextureBlock with BlockTooltip { def resources: ResourceProvider @@ -60,10 +62,27 @@ abstract class BlockModule[T <: TileModule](val name: String, val kind: String, p <- te.connected.value bl <- p.block(world) } yield { - bl.onBlockActivated(world, p.x, p.y, p.z, player, meta, 0, 0, 0) - }) getOrElse { + bl.onBlockActivated(world, p.x, p.y, p.z, player, meta, 0, 0, 0) + }) getOrElse { player.addChatMessage(new ChatComponentTranslation("bdlib.multiblock.notconnected")) } true } + + override def getTooltip(stack: ItemStack, player: EntityPlayer, advanced: Boolean): List[String] = { + List(Misc.toLocal("bdlib.multiblock.tip.module")) ++ ( + for ((machine, (min, max)) <- machines.getMachinesForBlock(this)) yield { + val name = machine.getController.getLocalizedName + if (min > 0) { + Misc.toLocalF("bdlib.multiblock.tip.module.range", + EnumChatFormatting.YELLOW + name + EnumChatFormatting.RESET, + EnumChatFormatting.YELLOW + min.toString + EnumChatFormatting.RESET, + EnumChatFormatting.YELLOW + max.toString + EnumChatFormatting.RESET) + } else { + Misc.toLocalF("bdlib.multiblock.tip.module.max", + EnumChatFormatting.YELLOW + name + EnumChatFormatting.RESET, + EnumChatFormatting.YELLOW + max.toString + EnumChatFormatting.RESET) + } + }) + } }