diff --git a/li/cil/oc/client/PacketSender.scala b/li/cil/oc/client/PacketSender.scala index a3185d353..bcf6a6657 100644 --- a/li/cil/oc/client/PacketSender.scala +++ b/li/cil/oc/client/PacketSender.scala @@ -14,32 +14,35 @@ object PacketSender { pb.sendToServer() } - def sendKeyDown[T <: Buffer](t: T, char: Char, code: Int) = if (t.hasKeyboard) { - val pb = new PacketBuilder(PacketType.KeyDown) + def sendKeyDown[T <: Buffer](t: T, char: Char, code: Int) = + if (t.hasKeyboard) { + val pb = new PacketBuilder(PacketType.KeyDown) - pb.writeTileEntity(t) - pb.writeChar(char) - pb.writeInt(code) + pb.writeTileEntity(t) + pb.writeChar(char) + pb.writeInt(code) - pb.sendToServer() - } + pb.sendToServer() + } - def sendKeyUp[T <: Buffer](t: T, char: Char, code: Int) = if (t.hasKeyboard) { - val pb = new PacketBuilder(PacketType.KeyUp) + def sendKeyUp[T <: Buffer](t: T, char: Char, code: Int) = + if (t.hasKeyboard) { + val pb = new PacketBuilder(PacketType.KeyUp) - pb.writeTileEntity(t) - pb.writeChar(char) - pb.writeInt(code) + pb.writeTileEntity(t) + pb.writeChar(char) + pb.writeInt(code) - pb.sendToServer() - } + pb.sendToServer() + } - def sendClipboard[T <: Buffer](t: T, value: String) = if (!value.isEmpty && t.hasKeyboard) { - val pb = new PacketBuilder(PacketType.Clipboard) + def sendClipboard[T <: Buffer](t: T, value: String) = + if (!value.isEmpty && t.hasKeyboard) { + val pb = new PacketBuilder(PacketType.Clipboard) - pb.writeTileEntity(t) - pb.writeUTF(value.substring(0, value.length min 1024)) + pb.writeTileEntity(t) + pb.writeUTF(value.substring(0, value.length min 1024)) - pb.sendToServer() - } + pb.sendToServer() + } } \ No newline at end of file diff --git a/li/cil/oc/client/gui/Buffer.scala b/li/cil/oc/client/gui/Buffer.scala index 44070bce4..d283670b9 100644 --- a/li/cil/oc/client/gui/Buffer.scala +++ b/li/cil/oc/client/gui/Buffer.scala @@ -16,7 +16,7 @@ trait Buffer extends GuiScreen { private val pressedKeys = mutable.Map.empty[Int, Char] - private var currentWidth, currentHeight = -1.0 + protected var currentWidth, currentHeight = -1 private var shouldRecompileDisplayLists = true @@ -34,6 +34,7 @@ trait Buffer extends GuiScreen { BufferRenderer.init(Minecraft.getMinecraft.renderEngine) Keyboard.enableRepeatEvents(true) buffer.owner.currentGui = Some(this) + recompileDisplayLists() } override def onGuiClosed() = { @@ -47,12 +48,11 @@ trait Buffer extends GuiScreen { protected def drawBufferLayer() { if (shouldRecompileDisplayLists) { + shouldRecompileDisplayLists = false val (w, h) = buffer.resolution - if (w != currentWidth || h != currentHeight) { - currentWidth = w - currentHeight = h - scale = changeSize(currentWidth, currentHeight) - } + currentWidth = w + currentHeight = h + scale = changeSize(currentWidth, currentHeight) BufferRenderer.compileText(scale, buffer.lines, buffer.color, buffer.depth) } GL11.glPushMatrix() diff --git a/li/cil/oc/common/PacketBuilder.scala b/li/cil/oc/common/PacketBuilder.scala index 5e7f0f371..cf2fa32aa 100644 --- a/li/cil/oc/common/PacketBuilder.scala +++ b/li/cil/oc/common/PacketBuilder.scala @@ -1,8 +1,8 @@ package li.cil.oc.common -import cpw.mods.fml.common.FMLCommonHandler import cpw.mods.fml.common.network.PacketDispatcher import cpw.mods.fml.common.network.Player +import cpw.mods.fml.common.{ObfuscationReflectionHelper, FMLCommonHandler} import java.io.ByteArrayOutputStream import java.io.DataOutputStream import li.cil.oc.common.tileentity.TileEntity @@ -45,7 +45,8 @@ class PacketBuilder(packetType: PacketType.Value, private val stream: ByteArrayO val server = FMLCommonHandler.instance.getMinecraftServerInstance val manager = server.getConfigurationManager for (player <- manager.playerEntityList.map(_.asInstanceOf[EntityPlayerMP]) if player.dimension == dimension) { - val playerSpecificRange = range min ((manager.getViewDistance min PacketBuilder.tryGetPlayerRenderDistance(player)) * 16) + val playerRenderDistance = ObfuscationReflectionHelper.getPrivateValue(classOf[EntityPlayerMP], player, "renderDistance").asInstanceOf[Integer] + val playerSpecificRange = range min ((manager.getViewDistance min playerRenderDistance) * 16) if (player.getDistanceSq(x, y, z) < playerSpecificRange * playerSpecificRange) { sendToPlayer(player.asInstanceOf[Player]) } @@ -64,27 +65,3 @@ class PacketBuilder(packetType: PacketType.Value, private val stream: ByteArrayO p } } - -object PacketBuilder { - private val renderDistanceField = try { - val field = classOf[EntityPlayerMP].getDeclaredField("renderDistance") - field.setAccessible(true) - Some(field) - } - catch { - case _: Throwable => None - } - - private def tryGetPlayerRenderDistance(player: EntityPlayerMP): Int = { - try { - renderDistanceField match { - case Some(field) => return field.get(player).asInstanceOf[Integer] - case _ => - } - } - catch { - case _: Throwable => - } - Int.MaxValue - } -} \ No newline at end of file diff --git a/li/cil/oc/common/container/Player.scala b/li/cil/oc/common/container/Player.scala index a2cee4fda..65a8aa618 100644 --- a/li/cil/oc/common/container/Player.scala +++ b/li/cil/oc/common/container/Player.scala @@ -9,7 +9,6 @@ import net.minecraft.inventory.IInventory import net.minecraft.inventory.Slot import net.minecraft.item.ItemStack -/** Utility for inventory containers providing basic re-usable functionality. */ abstract class Player(protected val playerInventory: InventoryPlayer, val otherInventory: IInventory) extends Container { /** Number of player inventory slots to display horizontally. */ protected val playerInventorySizeX = InventoryPlayer.getHotbarSize diff --git a/li/cil/oc/common/tileentity/Screen.scala b/li/cil/oc/common/tileentity/Screen.scala index 9b3eb87af..f924f8945 100644 --- a/li/cil/oc/common/tileentity/Screen.scala +++ b/li/cil/oc/common/tileentity/Screen.scala @@ -41,11 +41,11 @@ class Screen(var tier: Int) extends Buffer with SidedEnvironment with Rotatable def sidedNode(side: ForgeDirection) = if (canConnect(side)) node else null - override def hasKeyboard = ForgeDirection.VALID_DIRECTIONS. - map(side => (side, world.getBlockTileEntity(x + side.offsetX, y + side.offsetY, z + side.offsetZ))). + override def hasKeyboard = screens.exists(screen => ForgeDirection.VALID_DIRECTIONS. + map(side => (side, world.getBlockTileEntity(screen.x + side.offsetX, screen.y + side.offsetY, screen.z + side.offsetZ))). collect { case (side, keyboard: Keyboard) if keyboard.facing == side => keyboard - }.nonEmpty + }.nonEmpty) // ----------------------------------------------------------------------- //