fixed keyboard detection on multiblock screens; fixed screen gui not being centered

This commit is contained in:
Florian Nücke 2013-11-29 21:34:51 +01:00
parent 19c2f7db23
commit 40755b9279
5 changed files with 35 additions and 56 deletions

View File

@ -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()
}
}

View File

@ -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()

View File

@ -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
}
}

View File

@ -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

View File

@ -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)
// ----------------------------------------------------------------------- //