Added detailed tooltips to multiblock controllers/modules

This commit is contained in:
bdew committed 2015-08-02 16:34:28 +03:00
1 parent ece84599f9
commit 7fd040e65a
5 files changed
+85 -10

No files matched your search

+4
View File
@@ -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
@@ -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
}
}
@@ -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))
@@ -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)
}
})
}
}
@@ -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)
}
})
}
}