blob: 62bd2448202ec48a471c16bcffc732511b0c82f7 [file] [log] [blame] [raw]
package li.cil.oc.server.driver
import li.cil.oc.api.driver
import net.minecraft.block.Block
import net.minecraft.item.{Item, ItemStack}
import net.minecraft.world.World
class CompoundBlockDriver(val blocks: driver.Block*) extends driver.Block {
override def createEnvironment(world: World, x: Int, y: Int, z: Int) = {
val list = blocks.map {
driver => Option(driver.createEnvironment(world, x, y, z)) match {
case Some(environment) => (driver, environment)
case _ => null
}
} filter (_ != null)
if (list.isEmpty) null
else new CompoundBlockEnvironment(tryGetName(world, x, y, z), list: _*)
}
override def worksWith(world: World, x: Int, y: Int, z: Int) = blocks.forall(_.worksWith(world, x, y, z))
override def equals(obj: Any) = obj match {
case multi: CompoundBlockDriver if multi.blocks.length == blocks.length =>
(multi.blocks, blocks).zipped.forall((a, b) => a.getClass.getName == b.getClass.getName)
true
case _ => false
}
private def tryGetName(world: World, x: Int, y: Int, z: Int) = {
val blockId = world.getBlockId(x, y, z)
val isValidBlock = blockId >= 0 && blockId < Block.blocksList.length && Block.blocksList(blockId) != null
if (isValidBlock) {
val block = Block.blocksList(blockId)
val itemStack = try Option(block.getPickBlock(null, world, x, y, z)) catch {
case _: Throwable =>
if (Item.itemsList(blockId) != null) {
Some(new ItemStack(blockId, 1, block.getDamageValue(world, x, y, z)))
}
else None
}
itemStack match {
case Some(stack) => cleanName(stack.getUnlocalizedName)
case _ => "multi"
}
}
else "multi"
}
private def cleanName(name: String) = {
val withoutNameSpace = if (name.contains(":")) name.substring(name.indexOf(":") + 1) else name
val withoutPrefixes = if (withoutNameSpace.contains(".")) withoutNameSpace.substring(withoutNameSpace.lastIndexOf(".") + 1) else withoutNameSpace
val safeStart = if (withoutPrefixes.matches("""^[^a-zA-Z_]""")) "_" + withoutPrefixes else withoutPrefixes
val identifier = safeStart.replaceAll("""[^\w_]""", "_")
identifier
}
}