blob: db3146d5241f64a7808d47f8ab1094363fac05cb [file] [log] [blame] [raw]
package li.cil.oc.common.block
import java.util
import cpw.mods.fml.common.Optional
import cpw.mods.fml.relauncher.{Side, SideOnly}
import li.cil.oc.Settings
import li.cil.oc.common.tileentity.traits.{Colored, Inventory}
import li.cil.oc.util.Tooltip
import li.cil.oc.util.mods.Mods
import mcp.mobius.waila.api.{IWailaConfigHandler, IWailaDataAccessor}
import net.minecraft.block.Block
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.entity.{Entity, EntityLivingBase}
import net.minecraft.item.{EnumRarity, ItemStack}
import net.minecraft.tileentity.TileEntity
import net.minecraft.util._
import net.minecraft.world.{IBlockAccess, World}
import net.minecraftforge.common.util.ForgeDirection
trait Delegate {
type Icon = net.minecraft.util.IIcon
type IconRegister = net.minecraft.client.renderer.texture.IIconRegister
def unlocalizedName = getClass.getSimpleName
var showInItemList = true
def blockId: Int
def parent: Delegator[_]
val icons = new Array[Icon](6)
protected def customTextures = Array.fill[Option[String]](6)(None)
def setBlock(world: World, x: Int, y: Int, z: Int, flags: Int) = {
world.setBlock(x, y, z, parent, blockId, flags)
}
def createItemStack(amount: Int = 1) = new ItemStack(parent, amount, itemDamage)
// ----------------------------------------------------------------------- //
def itemDamage = blockId
def pick(target: MovingObjectPosition, world: World, x: Int, y: Int, z: Int): ItemStack = createItemStack()
def drops(world: World, x: Int, y: Int, z: Int, fortune: Int): Option[java.util.ArrayList[ItemStack]] = None
def explosionResistance(entity: Entity): Float = parent.getExplosionResistance(entity)
def isAir(world: IBlockAccess, x: Int, y: Int, z: Int) = false
def isNormalCube(world: IBlockAccess, x: Int, y: Int, z: Int) = true
def validRotations(world: World, x: Int, y: Int, z: Int) = validRotations_
// DEPRECATED Seems this isn't available anymore with stack info, use real
// items in 1.7 when needed since IDs are no problem anymore.
// def canPlaceBlockOnSide(world: World, x: Int, y: Int, z: Int, side: ForgeDirection) = true
def bounds(world: IBlockAccess, x: Int, y: Int, z: Int) =
AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1)
def updateBounds(world: IBlockAccess, x: Int, y: Int, z: Int) =
parent.setBlockBounds(bounds(world, x, y, z))
def intersect(world: World, x: Int, y: Int, z: Int, origin: Vec3, direction: Vec3) =
parent.superCollisionRayTrace(world, x, y, z, origin, direction)
// ----------------------------------------------------------------------- //
def canConnectToRedstone(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = false
def isProvidingStrongPower(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = 0
def isProvidingWeakPower(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = 0
// ----------------------------------------------------------------------- //
def hasTileEntity = false
def createTileEntity(world: World): Option[TileEntity] = None
// ----------------------------------------------------------------------- //
def update(world: World, x: Int, y: Int, z: Int) = {}
def addedToWorld(world: World, x: Int, y: Int, z: Int) {}
def addedByEntity(world: World, x: Int, y: Int, z: Int, player: EntityLivingBase, stack: ItemStack) {}
def aboutToBeRemoved(world: World, x: Int, y: Int, z: Int) =
if (!world.isRemote) world.getTileEntity(x, y, z) match {
case inventory: Inventory => inventory.dropAllSlots()
case _ => // Ignore.
}
def removedFromWorld(world: World, x: Int, y: Int, z: Int, block: Block) {}
def removedByEntity(world: World, x: Int, y: Int, z: Int, player: EntityPlayer) = true
def neighborBlockChanged(world: World, x: Int, y: Int, z: Int, block: Block) {}
def neighborTileChanged(world: IBlockAccess, x: Int, y: Int, z: Int, tileX: Int, tileY: Int, tileZ: Int) {}
def leftClick(world: World, x: Int, y: Int, z: Int, player: EntityPlayer) {}
def rightClick(world: World, x: Int, y: Int, z: Int, player: EntityPlayer, side: ForgeDirection, hitX: Float, hitY: Float, hitZ: Float) = false
def walk(world: World, x: Int, y: Int, z: Int, entity: Entity) {}
def collide(world: World, x: Int, y: Int, z: Int, entity: Entity) {}
// ----------------------------------------------------------------------- //
def rarity = EnumRarity.common
@SideOnly(Side.CLIENT)
def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: java.util.List[String], advanced: Boolean) {
tooltip.addAll(Tooltip.get(unlocalizedName))
}
@Optional.Method(modid = Mods.IDs.Waila)
def wailaBody(stack: ItemStack, tooltip: util.List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler) {
}
def opacity(world: IBlockAccess, x: Int, y: Int, z: Int) = 255
def luminance(world: IBlockAccess, x: Int, y: Int, z: Int) = 0
@SideOnly(Side.CLIENT)
def mixedBrightness(world: IBlockAccess, x: Int, y: Int, z: Int) = -1
@SideOnly(Side.CLIENT)
def color = 0xFFFFFF
@SideOnly(Side.CLIENT)
def color(world: IBlockAccess, x: Int, y: Int, z: Int): Int =
world.getTileEntity(x, y, z) match {
case colored: Colored => colored.color
case _ => color
}
@SideOnly(Side.CLIENT)
def icon(side: ForgeDirection): Option[Icon] = Some(icons(side.ordinal))
@SideOnly(Side.CLIENT)
def icon(world: IBlockAccess, x: Int, y: Int, z: Int, worldSide: ForgeDirection, localSide: ForgeDirection): Option[Icon] = icon(localSide)
def itemBounds(): Unit = parent.setBlockBoundsForItemRender()
@SideOnly(Side.CLIENT)
def preItemRender() {}
@SideOnly(Side.CLIENT)
def registerIcons(iconRegister: IconRegister) {
icons(ForgeDirection.DOWN.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":GenericTop")
icons(ForgeDirection.UP.ordinal) = icons(ForgeDirection.DOWN.ordinal)
icons(ForgeDirection.NORTH.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":GenericSide")
icons(ForgeDirection.SOUTH.ordinal) = icons(ForgeDirection.NORTH.ordinal)
icons(ForgeDirection.WEST.ordinal) = icons(ForgeDirection.NORTH.ordinal)
icons(ForgeDirection.EAST.ordinal) = icons(ForgeDirection.NORTH.ordinal)
val custom = customTextures
for (side <- ForgeDirection.VALID_DIRECTIONS) {
custom(side.ordinal) match {
case Some(name) => icons(side.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":" + name)
case _ =>
}
}
}
// ----------------------------------------------------------------------- //
protected val validRotations_ = Array(ForgeDirection.UP, ForgeDirection.DOWN)
}
trait SimpleDelegate extends Delegate {
val parent: SimpleDelegator
val blockId = parent.add(this)
}
trait SpecialDelegate extends Delegate {
val parent: SpecialDelegator
val blockId = parent.add(this)
// ----------------------------------------------------------------------- //
def isSolid(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = true
@SideOnly(Side.CLIENT)
def shouldSideBeRendered(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) =
!world.isSideSolid(x, y, z, side, true)
}