diff --git a/src/main/scala/li/cil/oc/client/PacketHandler.scala b/src/main/scala/li/cil/oc/client/PacketHandler.scala index 0f0581f26..42ceab387 100644 --- a/src/main/scala/li/cil/oc/client/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/client/PacketHandler.scala @@ -38,6 +38,7 @@ class PacketHandler extends CommonPacketHandler { case PacketType.HologramPowerChange => onHologramPowerChange(p) case PacketType.HologramScale => onHologramScale(p) case PacketType.HologramSet => onHologramSet(p) + case PacketType.HologramPositionOffsetY => onHologramPositionOffsetY(p) case PacketType.PetVisibility => onPetVisibility(p) case PacketType.PowerState => onPowerState(p) case PacketType.RedstoneState => onRedstoneState(p) @@ -186,6 +187,13 @@ class PacketHandler extends CommonPacketHandler { case _ => // Invalid packet. } + def onHologramPositionOffsetY(p: PacketParser) = + p.readTileEntity[Hologram]() match { + case Some(t) => + t.projectionOffsetY = p.readDouble() + case _ => // Invalid packet. + } + def onPetVisibility(p: PacketParser) { val count = p.readInt() for (i <- 0 until count) { diff --git a/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRenderer.scala index e09618980..71aff1db3 100644 --- a/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRenderer.scala @@ -85,7 +85,7 @@ object HologramRenderer extends TileEntitySpecialRenderer with Callable[Int] wit } GL11.glScaled(1.001, 1.001, 1.001) // Avoid z-fighting with other blocks. - GL11.glTranslated(-1.5 * hologram.scale, 0, -1.5 * hologram.scale) + GL11.glTranslated(-1.5 * hologram.scale, hologram.projectionOffsetY, -1.5 * hologram.scale) // Do a bit of flickering, because that's what holograms do! if (Settings.get.hologramFlickerFrequency > 0 && random.nextDouble() < Settings.get.hologramFlickerFrequency) { diff --git a/src/main/scala/li/cil/oc/common/PacketType.scala b/src/main/scala/li/cil/oc/common/PacketType.scala index be574835e..89cf2f701 100644 --- a/src/main/scala/li/cil/oc/common/PacketType.scala +++ b/src/main/scala/li/cil/oc/common/PacketType.scala @@ -16,6 +16,7 @@ object PacketType extends Enumeration { HologramPowerChange, HologramScale, HologramSet, + HologramPositionOffsetY, PetVisibility, // Goes both ways. PowerState, RedstoneState, diff --git a/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala b/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala index 5a016cd5c..aeeabbed5 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala @@ -29,6 +29,9 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w // Render scale. var scale = 1.0 + // Projection Y position offset - consider adding X,Z later perhaps + var projectionOffsetY: Double = 0.0 + // Relative number of lit columns (for energy cost). var litRatio = -1.0 @@ -211,6 +214,19 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w null } + @Callback(doc = """function():number -- Returns the render projection offset of the hologram.""") + def getOffset(computer: Context, args: Arguments): Array[AnyRef] = { + result(projectionOffsetY) // consider adding a future axis parameter for X,Y or Z - but for now, just using Y + } + + @Callback(doc = """function(value:number) -- Sets the render projection offset of the hologram..""") + def setOffset(computer: Context, args: Arguments): Array[AnyRef] = { + val maxOffset = 3 // this wants to be a config setting / by tier - perhaps + projectionOffsetY = math.max(0, math.min(maxOffset, args.checkDouble(0))) + ServerPacketSender.sendHologramOffset(this) + null + } + @Callback(direct = true, doc = """function():number -- The color depth supported by the hologram.""") def maxDepth(context: Context, args: Arguments): Array[AnyRef] = { result(tier + 1) @@ -302,7 +318,7 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w def getFadeStartDistanceSquared = scale / Settings.get.hologramMaxScaleByTier.max * Settings.get.hologramFadeStartDistance * Settings.get.hologramFadeStartDistance - override def getRenderBoundingBox = AxisAlignedBB.getAABBPool.getAABB(xCoord + 0.5 - 1.5 * scale, yCoord, zCoord - scale, xCoord + 0.5 + 1.5 * scale, yCoord + 0.25 + 2 * scale, zCoord + 0.5 + 1.5 * scale) + override def getRenderBoundingBox = AxisAlignedBB.getAABBPool.getAABB(xCoord + 0.5 - 1.5 * scale, yCoord + projectionOffsetY, zCoord - scale, xCoord + 0.5 + 1.5 * scale, yCoord + 0.25 + projectionOffsetY + 2 * scale, zCoord + 0.5 + 1.5 * scale) // ----------------------------------------------------------------------- // @@ -319,6 +335,7 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w tag.getIntArray("colors").map(convertColor).copyToArray(colors) } scale = nbt.getDouble(Settings.namespace + "scale") + projectionOffsetY = nbt.getDouble(Settings.namespace + "offsetY") } override def writeToNBT(nbt: NBTTagCompound) = this.synchronized { @@ -329,6 +346,7 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w tag.setIntArray("colors", colors.map(convertColor)) }) nbt.setDouble(Settings.namespace + "scale", scale) + nbt.setDouble(Settings.namespace + "offsetY", projectionOffsetY) } @SideOnly(Side.CLIENT) @@ -338,6 +356,7 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w nbt.getIntArray("colors").copyToArray(colors) scale = nbt.getDouble("scale") hasPower = nbt.getBoolean("hasPower") + projectionOffsetY = nbt.getDouble("offsetY") } override def writeToNBTForClient(nbt: NBTTagCompound) { @@ -346,5 +365,6 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w nbt.setIntArray("colors", colors) nbt.setDouble("scale", scale) nbt.setBoolean("hasPower", hasPower) + nbt.setDouble("offsetY", projectionOffsetY) } } diff --git a/src/main/scala/li/cil/oc/server/PacketSender.scala b/src/main/scala/li/cil/oc/server/PacketSender.scala index 89418828d..d80139c3c 100644 --- a/src/main/scala/li/cil/oc/server/PacketSender.scala +++ b/src/main/scala/li/cil/oc/server/PacketSender.scala @@ -139,6 +139,16 @@ object PacketSender { pb.sendToNearbyPlayers(t) } + def sendHologramOffset(t: tileentity.Hologram) { + val pb = new SimplePacketBuilder(PacketType.HologramPositionOffsetY) + + pb.writeTileEntity(t) + pb.writeDouble(t.projectionOffsetY) + + pb.sendToNearbyPlayers(t) + } + + def sendPetVisibility(name: Option[String] = None, player: Option[EntityPlayerMP] = None) { val pb = new SimplePacketBuilder(PacketType.PetVisibility)