Simple colored trait, don't consume dyes when in creative mode.

This commit is contained in:
Florian Nücke 2016-03-27 17:33:34 +02:00
parent c7715c346e
commit 933f51ccef
9 changed files with 24 additions and 38 deletions

View File

@ -116,7 +116,7 @@ object PacketHandler extends CommonPacketHandler {
def onColorChange(p: PacketParser) =
p.readTileEntity[Colored]() match {
case Some(t) =>
t.color = p.readInt()
t.setColor(p.readInt())
t.world.markBlockForUpdate(t.position)
case _ => // Invalid packet.
}

View File

@ -4,16 +4,13 @@ import li.cil.oc.client.Textures
import li.cil.oc.common.block
import li.cil.oc.common.block.Cable
import li.cil.oc.common.tileentity
import li.cil.oc.integration.Mods
import li.cil.oc.util.BlockPosition
import li.cil.oc.util.Color
import li.cil.oc.util.ExtendedWorld._
import net.minecraft.block.state.IBlockState
import net.minecraft.client.renderer.block.model.BakedQuad
import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.item.EnumDyeColor
import net.minecraft.item.ItemStack
import net.minecraft.tileentity.TileEntity
import net.minecraft.util.EnumFacing
import net.minecraft.util.Vec3
import net.minecraftforge.client.model.ISmartItemModel
@ -88,7 +85,7 @@ object CableModel extends SmartBlockModelBase with ISmartItemModel {
case t: tileentity.Cable =>
val faces = mutable.ArrayBuffer.empty[BakedQuad]
val color = Some(t.color)
val color = Some(t.getColor)
val mask = Cable.neighbors(t.world, t.getPos)
faces ++= bakeQuads(Middle, cableTexture, color)
for (side <- EnumFacing.values) {
@ -112,20 +109,13 @@ object CableModel extends SmartBlockModelBase with ISmartItemModel {
case _ => super.getGeneralQuads
}
private def isCable(pos: BlockPosition) = {
protected def isCable(pos: BlockPosition) = {
pos.world match {
case Some(world) =>
val tileEntity = world.getTileEntity(pos)
tileEntity.isInstanceOf[tileentity.Cable] || (Mods.ForgeMultipart.isAvailable && isCableFMP(tileEntity))
world.getTileEntity(pos).isInstanceOf[tileentity.Cable]
case _ => false
}
}
private def isCableFMP(tileEntity: TileEntity) = false
/* TODO FMP
tileEntity.isInstanceOf[TileMultipart]
*/
}
}

View File

@ -68,7 +68,7 @@ object ScreenModel extends SmartBlockModelBase with ISmartItemModel {
Textures.Block.Screen.Multi(pitch)(py)(px)(facing.getIndex)
}
seqAsJavaList(Seq(bakeQuad(side, Textures.getSprite(texture), Some(screen.color), rotation)))
seqAsJavaList(Seq(bakeQuad(side, Textures.getSprite(texture), Some(screen.getColor), rotation)))
case _ => super.getFaceQuads(side)
}

View File

@ -94,7 +94,7 @@ abstract class SimpleBlock(material: Material = Material.iron) extends BlockCont
@SideOnly(Side.CLIENT)
override def colorMultiplier(world: IBlockAccess, pos: BlockPos, renderPass: Int) =
world.getTileEntity(pos) match {
case colored: Colored => colored.color
case colored: Colored => colored.getColor
case _ => getRenderColor(world.getBlockState(pos))
}
@ -192,8 +192,8 @@ abstract class SimpleBlock(material: Material = Material.iron) extends BlockCont
override def recolorBlock(world: World, pos: BlockPos, side: EnumFacing, color: EnumDyeColor) =
world.getTileEntity(pos) match {
case colored: Colored if colored.color != Color.rgbValues(color) =>
colored.color = Color.rgbValues(color)
case colored: Colored if colored.getColor != Color.rgbValues(color) =>
colored.setColor(Color.rgbValues(color))
world.markBlockForUpdate(pos)
true // Blame Vexatos.
case _ => super.recolorBlock(world, pos, side, color)
@ -205,9 +205,9 @@ abstract class SimpleBlock(material: Material = Material.iron) extends BlockCont
override def onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, side: EnumFacing, hitX: Float, hitY: Float, hitZ: Float) =
world.getTileEntity(pos) match {
case colored: Colored if Color.isDye(player.getHeldItem) =>
colored.color = Color.rgbValues(Color.dyeColor(player.getHeldItem))
colored.setColor(Color.rgbValues(Color.dyeColor(player.getHeldItem)))
world.markBlockForUpdate(pos)
if (colored.consumesDye) {
if (!player.capabilities.isCreativeMode && colored.consumesDye) {
player.getHeldItem.splitStack(1)
}
true

View File

@ -12,19 +12,19 @@ import net.minecraft.item.ItemStack
class Cable extends traits.Environment with traits.NotAnalyzable with traits.ImmibisMicroblock with traits.Colored {
val node = api.Network.newNode(this, Visibility.None).create()
color = Color.rgbValues(EnumDyeColor.SILVER)
setColor(Color.rgbValues(EnumDyeColor.SILVER))
def createItemStack() = {
val stack = new ItemStack(Item.getItemFromBlock(getBlockType))
if (color != Color.rgbValues(EnumDyeColor.SILVER)) {
ItemColorizer.setColor(stack, color)
if (getColor != Color.rgbValues(EnumDyeColor.SILVER)) {
ItemColorizer.setColor(stack, getColor)
}
stack
}
def fromItemStack(stack: ItemStack): Unit = {
if (ItemColorizer.hasColor(stack)) {
color = ItemColorizer.getColor(stack)
setColor(ItemColorizer.getColor(stack))
}
}

View File

@ -24,7 +24,7 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with
var lastFileSystemAccess = 0L
var lastNetworkActivity = 0L
color = Color.rgbValues(Color.byTier(tier))
setColor(Color.rgbValues(Color.byTier(tier)))
@SideOnly(Side.CLIENT)
override protected def hasConnector(side: EnumFacing) = side != facing
@ -64,7 +64,7 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with
override def readFromNBTForServer(nbt: NBTTagCompound) {
tier = nbt.getByte(Settings.namespace + "tier") max 0 min 3
color = Color.rgbValues(Color.byTier(tier))
setColor(Color.rgbValues(Color.byTier(tier)))
super.readFromNBTForServer(nbt)
}

View File

@ -58,7 +58,7 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with
private val arrows = mutable.Set.empty[EntityArrow]
color = Color.rgbValues(Color.byTier(tier))
setColor(Color.rgbValues(Color.byTier(tier)))
@SideOnly(Side.CLIENT)
override def canConnect(side: EnumFacing) = toLocal(side) != EnumFacing.SOUTH
@ -291,7 +291,7 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with
override def readFromNBTForServer(nbt: NBTTagCompound) {
tier = nbt.getByte(Settings.namespace + "tier") max 0 min 2
color = Color.rgbValues(Color.byTier(tier))
setColor(Color.rgbValues(Color.byTier(tier)))
super.readFromNBTForServer(nbt)
hadRedstoneInput = nbt.getBoolean(Settings.namespace + "hadRedstoneInput")
invertTouchMode = nbt.getBoolean(Settings.namespace + "invertTouchMode")
@ -374,7 +374,7 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with
def tryMergeTowards(dx: Int, dy: Int) = {
val npos = unproject(opos.x + dx, opos.y + dy, opos.z)
world.blockExists(npos) && (world.getTileEntity(npos) match {
case s: Screen if s.tier == tier && s.pitch == pitch && s.color == color && s.yaw == yaw && !screens.contains(s) =>
case s: Screen if s.tier == tier && s.pitch == pitch && s.getColor == getColor && s.yaw == yaw && !screens.contains(s) =>
val spos = project(s.origin)
val canMergeAlongX = spos.y == opos.y && s.height == height && s.width + width <= Settings.get.maxScreenWidth
val canMergeAlongY = spos.x == opos.x && s.width == width && s.height + height <= Settings.get.maxScreenHeight

View File

@ -12,19 +12,15 @@ import net.minecraftforge.fml.relauncher.SideOnly
trait Colored extends TileEntity with internal.Colored {
private var _color = 0
def color = _color
def consumesDye = false
def color_=(value: Int) = if (value != _color) {
override def getColor: Int = _color
override def setColor(value: Int) = if (value != _color) {
_color = value
onColorChanged()
}
def consumesDye = false
override def getColor: Int = color
override def setColor(value: Int) = color = value
override def controlsConnectivity = false
protected def onColorChanged() {

View File

@ -48,7 +48,7 @@ object PacketSender {
val pb = new SimplePacketBuilder(PacketType.ColorChange)
pb.writeTileEntity(t)
pb.writeInt(t.color)
pb.writeInt(t.getColor)
pb.sendToPlayersNearTileEntity(t)
}