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

View File

@ -94,7 +94,7 @@ abstract class SimpleBlock(material: Material = Material.iron) extends BlockCont
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
override def colorMultiplier(world: IBlockAccess, pos: BlockPos, renderPass: Int) = override def colorMultiplier(world: IBlockAccess, pos: BlockPos, renderPass: Int) =
world.getTileEntity(pos) match { world.getTileEntity(pos) match {
case colored: Colored => colored.color case colored: Colored => colored.getColor
case _ => getRenderColor(world.getBlockState(pos)) 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) = override def recolorBlock(world: World, pos: BlockPos, side: EnumFacing, color: EnumDyeColor) =
world.getTileEntity(pos) match { world.getTileEntity(pos) match {
case colored: Colored if colored.color != Color.rgbValues(color) => case colored: Colored if colored.getColor != Color.rgbValues(color) =>
colored.color = Color.rgbValues(color) colored.setColor(Color.rgbValues(color))
world.markBlockForUpdate(pos) world.markBlockForUpdate(pos)
true // Blame Vexatos. true // Blame Vexatos.
case _ => super.recolorBlock(world, pos, side, color) 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) = override def onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, side: EnumFacing, hitX: Float, hitY: Float, hitZ: Float) =
world.getTileEntity(pos) match { world.getTileEntity(pos) match {
case colored: Colored if Color.isDye(player.getHeldItem) => 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) world.markBlockForUpdate(pos)
if (colored.consumesDye) { if (!player.capabilities.isCreativeMode && colored.consumesDye) {
player.getHeldItem.splitStack(1) player.getHeldItem.splitStack(1)
} }
true 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 { class Cable extends traits.Environment with traits.NotAnalyzable with traits.ImmibisMicroblock with traits.Colored {
val node = api.Network.newNode(this, Visibility.None).create() val node = api.Network.newNode(this, Visibility.None).create()
color = Color.rgbValues(EnumDyeColor.SILVER) setColor(Color.rgbValues(EnumDyeColor.SILVER))
def createItemStack() = { def createItemStack() = {
val stack = new ItemStack(Item.getItemFromBlock(getBlockType)) val stack = new ItemStack(Item.getItemFromBlock(getBlockType))
if (color != Color.rgbValues(EnumDyeColor.SILVER)) { if (getColor != Color.rgbValues(EnumDyeColor.SILVER)) {
ItemColorizer.setColor(stack, color) ItemColorizer.setColor(stack, getColor)
} }
stack stack
} }
def fromItemStack(stack: ItemStack): Unit = { def fromItemStack(stack: ItemStack): Unit = {
if (ItemColorizer.hasColor(stack)) { 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 lastFileSystemAccess = 0L
var lastNetworkActivity = 0L var lastNetworkActivity = 0L
color = Color.rgbValues(Color.byTier(tier)) setColor(Color.rgbValues(Color.byTier(tier)))
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
override protected def hasConnector(side: EnumFacing) = side != facing 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) { override def readFromNBTForServer(nbt: NBTTagCompound) {
tier = nbt.getByte(Settings.namespace + "tier") max 0 min 3 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) 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] private val arrows = mutable.Set.empty[EntityArrow]
color = Color.rgbValues(Color.byTier(tier)) setColor(Color.rgbValues(Color.byTier(tier)))
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
override def canConnect(side: EnumFacing) = toLocal(side) != EnumFacing.SOUTH 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) { override def readFromNBTForServer(nbt: NBTTagCompound) {
tier = nbt.getByte(Settings.namespace + "tier") max 0 min 2 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) super.readFromNBTForServer(nbt)
hadRedstoneInput = nbt.getBoolean(Settings.namespace + "hadRedstoneInput") hadRedstoneInput = nbt.getBoolean(Settings.namespace + "hadRedstoneInput")
invertTouchMode = nbt.getBoolean(Settings.namespace + "invertTouchMode") 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) = { def tryMergeTowards(dx: Int, dy: Int) = {
val npos = unproject(opos.x + dx, opos.y + dy, opos.z) val npos = unproject(opos.x + dx, opos.y + dy, opos.z)
world.blockExists(npos) && (world.getTileEntity(npos) match { 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 spos = project(s.origin)
val canMergeAlongX = spos.y == opos.y && s.height == height && s.width + width <= Settings.get.maxScreenWidth 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 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 { trait Colored extends TileEntity with internal.Colored {
private var _color = 0 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 _color = value
onColorChanged() onColorChanged()
} }
def consumesDye = false
override def getColor: Int = color
override def setColor(value: Int) = color = value
override def controlsConnectivity = false override def controlsConnectivity = false
protected def onColorChanged() { protected def onColorChanged() {

View File

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