From b236b01dd00e14fe5edb85fc1ecc1489a822e644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 21 Jun 2014 16:41:04 +0200 Subject: [PATCH 1/5] Moved some stuff into centralized event handler to sync that up with 1.7 better. --- src/main/resources/reference.conf | 3 + src/main/scala/li/cil/oc/Settings.scala | 1 + .../li/cil/oc/client/PacketHandler.scala | 18 ++- .../scala/li/cil/oc/client/PacketSender.scala | 9 ++ .../cil/oc/client/renderer/PetRenderer.scala | 5 +- .../li/cil/oc/common/ConnectionHandler.scala | 50 ------ .../li/cil/oc/common/CraftingHandler.scala | 30 ---- .../scala/li/cil/oc/common/EventHandler.scala | 142 ++++++++++++++++++ .../scala/li/cil/oc/common/PacketType.scala | 1 + src/main/scala/li/cil/oc/common/Proxy.scala | 6 +- .../cil/oc/common/multipart/CablePart.scala | 5 +- .../tileentity/traits/Environment.scala | 6 +- .../traits/power/IndustrialCraft2.scala | 8 +- .../li/cil/oc/server/PacketHandler.scala | 17 +++ .../scala/li/cil/oc/server/PacketSender.scala | 22 +++ .../li/cil/oc/server/PetVisibility.scala | 7 + .../scala/li/cil/oc/server/TickHandler.scala | 64 -------- 17 files changed, 234 insertions(+), 160 deletions(-) delete mode 100644 src/main/scala/li/cil/oc/common/ConnectionHandler.scala delete mode 100644 src/main/scala/li/cil/oc/common/CraftingHandler.scala create mode 100644 src/main/scala/li/cil/oc/common/EventHandler.scala create mode 100644 src/main/scala/li/cil/oc/server/PetVisibility.scala delete mode 100644 src/main/scala/li/cil/oc/server/TickHandler.scala diff --git a/src/main/resources/reference.conf b/src/main/resources/reference.conf index 1d431b931..29cf160cd 100644 --- a/src/main/resources/reference.conf +++ b/src/main/resources/reference.conf @@ -835,5 +835,8 @@ opencomputers { # on computers' save and load performance, so you should not enable # this unless you're asked to. verbosePersistenceErrors: false + + # Whether to not show your special thinger (if you have one you know it). + hideOwnSpecial: false } } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index d37c14888..667791678 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -219,6 +219,7 @@ class Settings(config: Config) { val geolyzerRange = config.getInt("misc.geolyzerRange") val disassembleAllTheThings = config.getBoolean("misc.disassembleAllTheThings") val disassemblerBreakChance = config.getDouble("misc.disassemblerBreakChance") max 0 min 1 + val hideOwnPet = config.getBoolean("misc.hideOwnSpecial") } object Settings { diff --git a/src/main/scala/li/cil/oc/client/PacketHandler.scala b/src/main/scala/li/cil/oc/client/PacketHandler.scala index f92614ac7..92c285376 100644 --- a/src/main/scala/li/cil/oc/client/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/client/PacketHandler.scala @@ -1,15 +1,15 @@ package li.cil.oc.client import cpw.mods.fml.common.network.Player -import li.cil.oc.{Localization, Settings} +import li.cil.oc.Localization import li.cil.oc.api.component +import li.cil.oc.client.renderer.PetRenderer import li.cil.oc.common.tileentity._ import li.cil.oc.common.tileentity.traits._ import li.cil.oc.common.{PacketType, PacketHandler => CommonPacketHandler} import li.cil.oc.util.Audio import net.minecraft.client.gui.GuiScreen import net.minecraft.entity.player.EntityPlayer -import net.minecraft.util.ChatMessageComponent import net.minecraftforge.common.ForgeDirection import org.lwjgl.input.Keyboard @@ -34,6 +34,7 @@ class PacketHandler extends CommonPacketHandler { case PacketType.HologramPowerChange => onHologramPowerChange(p) case PacketType.HologramScale => onHologramScale(p) case PacketType.HologramSet => onHologramSet(p) + case PacketType.PetVisibility => onPetVisibility(p) case PacketType.PowerState => onPowerState(p) case PacketType.RedstoneState => onRedstoneState(p) case PacketType.RobotAnimateSwing => onRobotAnimateSwing(p) @@ -172,6 +173,19 @@ class PacketHandler extends CommonPacketHandler { case _ => // Invalid packet. } + def onPetVisibility(p: PacketParser) { + val count = p.readInt() + for (i <- 0 until count) { + val name = p.readUTF() + if (p.readBoolean()) { + PetRenderer.hidden -= name + } + else { + PetRenderer.hidden += name + } + } + } + def onPowerState(p: PacketParser) = p.readTileEntity[PowerInformation]() match { case Some(t) => diff --git a/src/main/scala/li/cil/oc/client/PacketSender.scala b/src/main/scala/li/cil/oc/client/PacketSender.scala index a19ec175b..b636bd866 100644 --- a/src/main/scala/li/cil/oc/client/PacketSender.scala +++ b/src/main/scala/li/cil/oc/client/PacketSender.scala @@ -1,5 +1,6 @@ package li.cil.oc.client +import li.cil.oc.Settings import li.cil.oc.common.tileentity._ import li.cil.oc.common.tileentity.traits.Computer import li.cil.oc.common.{CompressedPacketBuilder, PacketBuilder, PacketType} @@ -96,6 +97,14 @@ object PacketSender { pb.sendToServer() } + def sendPetVisibility() { + val pb = new PacketBuilder(PacketType.PetVisibility) + + pb.writeBoolean(Settings.get.hideOwnPet) + + pb.sendToServer() + } + def sendRobotAssemblerStart(t: RobotAssembler) { val pb = new PacketBuilder(PacketType.RobotAssemblerStart) diff --git a/src/main/scala/li/cil/oc/client/renderer/PetRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/PetRenderer.scala index c86f08ca6..71dbd0f2c 100644 --- a/src/main/scala/li/cil/oc/client/renderer/PetRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/PetRenderer.scala @@ -14,8 +14,11 @@ import net.minecraftforge.event.{EventPriority, ForgeSubscribe} import org.lwjgl.opengl.{GL11, GL12} import scala.collection.convert.WrapAsScala._ +import scala.collection.mutable object PetRenderer extends ITickHandler { + val hidden = mutable.Set.empty[String] + private val entitledPlayers = Map("Kethtar" ->(0.3, 0.9, 0.6)) private val petLocations = com.google.common.cache.CacheBuilder.newBuilder(). @@ -28,7 +31,7 @@ object PetRenderer extends ITickHandler { @ForgeSubscribe def onPlayerRender(e: RenderPlayerEvent.Pre) { val name = e.entityPlayer.getCommandSenderName - if (!entitledPlayers.contains(name)) return + if (hidden.contains(name) || !entitledPlayers.contains(name)) return rendering = Some(entitledPlayers(name)) val worldTime = e.entityPlayer.getEntityWorld.getWorldTime diff --git a/src/main/scala/li/cil/oc/common/ConnectionHandler.scala b/src/main/scala/li/cil/oc/common/ConnectionHandler.scala deleted file mode 100644 index 345a33de0..000000000 --- a/src/main/scala/li/cil/oc/common/ConnectionHandler.scala +++ /dev/null @@ -1,50 +0,0 @@ -package li.cil.oc.common - -import cpw.mods.fml.common.network.{IConnectionHandler, Player} -import li.cil.oc.util.LuaStateFactory -import li.cil.oc.util.mods.{Mods, ProjectRed} -import li.cil.oc.{Localization, OpenComputers, Settings, UpdateCheck} -import net.minecraft.entity.player.EntityPlayerMP -import net.minecraft.network.packet.{NetHandler, Packet1Login} -import net.minecraft.network.{INetworkManager, NetLoginHandler} -import net.minecraft.server.MinecraftServer - -object ConnectionHandler extends IConnectionHandler { - def playerLoggedIn(player: Player, netHandler: NetHandler, manager: INetworkManager) { - if (netHandler.isServerHandler) player match { - case p: EntityPlayerMP => - if (!LuaStateFactory.isAvailable) { - p.sendChatToPlayer(Localization.Chat.WarningLuaFallback) - } - if (Mods.ProjectRed.isAvailable && !ProjectRed.isAPIAvailable) { - p.sendChatToPlayer(Localization.Chat.WarningProjectRed) - } - if (!Settings.get.pureIgnorePower && Settings.get.ignorePower) { - p.sendChatToPlayer(Localization.Chat.WarningPower) - } - OpenComputers.tampered match { - case Some(event) => p.sendChatToPlayer(Localization.Chat.WarningFingerprint(event)) - case _ => - } - // Do update check in local games and for OPs. - if (!MinecraftServer.getServer.isDedicatedServer || MinecraftServer.getServer.getConfigurationManager.isPlayerOpped(p.getCommandSenderName)) { - UpdateCheck.checkForPlayer(p) - } - case _ => - } - } - - def connectionReceived(netHandler: NetLoginHandler, manager: INetworkManager) = null - - def connectionOpened(netClientHandler: NetHandler, server: String, port: Int, manager: INetworkManager) { - } - - def connectionOpened(netClientHandler: NetHandler, server: MinecraftServer, manager: INetworkManager) { - } - - def connectionClosed(manager: INetworkManager) { - } - - def clientLoggedIn(clientHandler: NetHandler, manager: INetworkManager, login: Packet1Login) { - } -} diff --git a/src/main/scala/li/cil/oc/common/CraftingHandler.scala b/src/main/scala/li/cil/oc/common/CraftingHandler.scala deleted file mode 100644 index fa6c83ef8..000000000 --- a/src/main/scala/li/cil/oc/common/CraftingHandler.scala +++ /dev/null @@ -1,30 +0,0 @@ -package li.cil.oc.common - -import cpw.mods.fml.common.ICraftingHandler -import li.cil.oc.{Settings, api} -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.inventory.IInventory -import net.minecraft.item.ItemStack - -object CraftingHandler extends ICraftingHandler { - lazy val navigationUpgrade = api.Items.get("navigationUpgrade") - - override def onCrafting(player: EntityPlayer, craftedStack: ItemStack, inventory: IInventory) = { - if (api.Items.get(craftedStack) == navigationUpgrade) { - Option(api.Driver.driverFor(craftedStack)).foreach(driver => - for (i <- 0 until inventory.getSizeInventory) { - val stack = inventory.getStackInSlot(i) - if (stack != null && api.Items.get(stack) == navigationUpgrade) { - // Restore the map currently used in the upgrade. - val nbt = driver.dataTag(stack) - val map = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(Settings.namespace + "map")) - if (!player.inventory.addItemStackToInventory(map)) { - player.dropPlayerItemWithRandomChoice(map, false) - } - } - }) - } - } - - override def onSmelting(player: EntityPlayer, item: ItemStack) {} -} diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala new file mode 100644 index 000000000..a4fea6088 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -0,0 +1,142 @@ +package li.cil.oc.common + +import java.util +import java.util.logging.Level + +import codechicken.multipart.TMultiPart +import cpw.mods.fml.common._ +import cpw.mods.fml.common.network.{IConnectionHandler, Player} +import ic2.api.energy.event.{EnergyTileLoadEvent, EnergyTileUnloadEvent} +import li.cil.oc._ +import li.cil.oc.api.Network +import li.cil.oc.client.renderer.PetRenderer +import li.cil.oc.client.{PacketSender => ClientPacketSender} +import li.cil.oc.common.tileentity.traits.power +import li.cil.oc.server.{PacketSender => ServerPacketSender} +import li.cil.oc.util.LuaStateFactory +import li.cil.oc.util.mods.{Mods, ProjectRed} +import net.minecraft.client.Minecraft +import net.minecraft.entity.player.{EntityPlayer, EntityPlayerMP} +import net.minecraft.inventory.IInventory +import net.minecraft.item.ItemStack +import net.minecraft.network.packet.{NetHandler, Packet1Login} +import net.minecraft.network.{INetworkManager, NetLoginHandler} +import net.minecraft.server.MinecraftServer +import net.minecraft.tileentity.TileEntity +import net.minecraftforge.common.MinecraftForge + +import scala.collection.mutable + +object EventHandler extends ITickHandler with IConnectionHandler with ICraftingHandler { + val pending = mutable.Buffer.empty[() => Unit] + + def schedule(tileEntity: TileEntity) = + if (FMLCommonHandler.instance.getEffectiveSide.isServer) pending.synchronized { + pending += (() => Network.joinOrCreateNetwork(tileEntity)) + } + + @Optional.Method(modid = "ForgeMultipart") + def schedule(part: TMultiPart) = + if (FMLCommonHandler.instance.getEffectiveSide.isServer) pending.synchronized { + pending += (() => Network.joinOrCreateNetwork(part.tile)) + } + + @Optional.Method(modid = "IC2") + def scheduleIC2Add(tileEntity: power.IndustrialCraft2) = pending.synchronized { + pending += (() => if (!tileEntity.addedToPowerGrid && !tileEntity.isInvalid) { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(tileEntity)) + tileEntity.addedToPowerGrid = true + }) + } + + @Optional.Method(modid = "IC2") + def scheduleIC2Remove(tileEntity: power.IndustrialCraft2) = pending.synchronized { + pending += (() => if (tileEntity.addedToPowerGrid) { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(tileEntity)) + tileEntity.addedToPowerGrid = false + }) + } + + override def getLabel = "OpenComputers Network Initialization Ticker" + + override def ticks() = util.EnumSet.of(TickType.SERVER) + + override def tickStart(`type`: util.EnumSet[TickType], tickData: AnyRef*) { + pending.synchronized { + val adds = pending.toArray + pending.clear() + adds + } foreach (callback => { + try callback() catch { + case t: Throwable => OpenComputers.log.log(Level.WARNING, "Error in scheduled tick action.", t) + } + }) + } + + override def tickEnd(`type`: util.EnumSet[TickType], tickData: AnyRef*) = {} + + def playerLoggedIn(player: Player, netHandler: NetHandler, manager: INetworkManager) { + if (netHandler.isServerHandler) player match { + case p: EntityPlayerMP => + if (!LuaStateFactory.isAvailable) { + p.sendChatToPlayer(Localization.Chat.WarningLuaFallback) + } + if (Mods.ProjectRed.isAvailable && !ProjectRed.isAPIAvailable) { + p.sendChatToPlayer(Localization.Chat.WarningProjectRed) + } + if (!Settings.get.pureIgnorePower && Settings.get.ignorePower) { + p.sendChatToPlayer(Localization.Chat.WarningPower) + } + OpenComputers.tampered match { + case Some(event) => p.sendChatToPlayer(Localization.Chat.WarningFingerprint(event)) + case _ => + } + ServerPacketSender.sendPetVisibility(None, Some(p)) + // Do update check in local games and for OPs. + if (!MinecraftServer.getServer.isDedicatedServer || MinecraftServer.getServer.getConfigurationManager.isPlayerOpped(p.getCommandSenderName)) { + UpdateCheck.checkForPlayer(p) + } + case _ => + } + } + + def connectionReceived(netHandler: NetLoginHandler, manager: INetworkManager) = null + + def connectionOpened(netClientHandler: NetHandler, server: String, port: Int, manager: INetworkManager) { + } + + def connectionOpened(netClientHandler: NetHandler, server: MinecraftServer, manager: INetworkManager) { + } + + def connectionClosed(manager: INetworkManager) { + } + + def clientLoggedIn(clientHandler: NetHandler, manager: INetworkManager, login: Packet1Login) { + PetRenderer.hidden.clear() + if (Settings.get.hideOwnPet) { + PetRenderer.hidden += Minecraft.getMinecraft.thePlayer.getCommandSenderName + } + ClientPacketSender.sendPetVisibility() + } + + lazy val navigationUpgrade = api.Items.get("navigationUpgrade") + + override def onCrafting(player: EntityPlayer, craftedStack: ItemStack, inventory: IInventory) = { + if (api.Items.get(craftedStack) == navigationUpgrade) { + Option(api.Driver.driverFor(craftedStack)).foreach(driver => + for (i <- 0 until inventory.getSizeInventory) { + val stack = inventory.getStackInSlot(i) + if (stack != null && api.Items.get(stack) == navigationUpgrade) { + // Restore the map currently used in the upgrade. + val nbt = driver.dataTag(stack) + val map = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(Settings.namespace + "map")) + if (!player.inventory.addItemStackToInventory(map)) { + player.dropPlayerItemWithRandomChoice(map, false) + } + } + }) + } + } + + override def onSmelting(player: EntityPlayer, item: ItemStack) {} +} diff --git a/src/main/scala/li/cil/oc/common/PacketType.scala b/src/main/scala/li/cil/oc/common/PacketType.scala index 7e7bdf8d2..391731975 100644 --- a/src/main/scala/li/cil/oc/common/PacketType.scala +++ b/src/main/scala/li/cil/oc/common/PacketType.scala @@ -15,6 +15,7 @@ object PacketType extends Enumeration { HologramPowerChange, HologramScale, HologramSet, + PetVisibility, // Goes both ways. PowerState, RedstoneState, RobotAnimateSwing, diff --git a/src/main/scala/li/cil/oc/common/Proxy.scala b/src/main/scala/li/cil/oc/common/Proxy.scala index e0fd08a66..3ceea9e72 100644 --- a/src/main/scala/li/cil/oc/common/Proxy.scala +++ b/src/main/scala/li/cil/oc/common/Proxy.scala @@ -120,7 +120,7 @@ class Proxy { OpenComputers.log.info("Initializing event handlers.") - GameRegistry.registerCraftingHandler(CraftingHandler) + GameRegistry.registerCraftingHandler(EventHandler) ForgeChunkManager.setForcedChunkLoadingCallback(OpenComputers, ChunkloaderUpgradeHandler) @@ -146,10 +146,10 @@ class Proxy { // Don't allow driver registration after this point, to avoid issues. driver.Registry.locked = true - TickRegistry.registerTickHandler(TickHandler, Side.SERVER) + TickRegistry.registerTickHandler(EventHandler, Side.SERVER) TickRegistry.registerTickHandler(SimpleComponentTickHandler.Instance, Side.SERVER) GameRegistry.registerPlayerTracker(Keyboard) - NetworkRegistry.instance.registerConnectionHandler(ConnectionHandler) + NetworkRegistry.instance.registerConnectionHandler(EventHandler) MinecraftForge.EVENT_BUS.register(WirelessNetwork) MinecraftForge.EVENT_BUS.register(SaveHandler) } diff --git a/src/main/scala/li/cil/oc/common/multipart/CablePart.scala b/src/main/scala/li/cil/oc/common/multipart/CablePart.scala index 20426ee92..478892897 100644 --- a/src/main/scala/li/cil/oc/common/multipart/CablePart.scala +++ b/src/main/scala/li/cil/oc/common/multipart/CablePart.scala @@ -7,9 +7,8 @@ import li.cil.oc.api.network.{Message, Node, Visibility} import li.cil.oc.api.{Items, network} import li.cil.oc.client.renderer.tileentity.CableRenderer import li.cil.oc.common.block.{Cable, Delegator} -import li.cil.oc.server.TickHandler import li.cil.oc.util.ExtendedNBT._ -import li.cil.oc.{Settings, api} +import li.cil.oc.{Settings, api, common} import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.AxisAlignedBB import org.lwjgl.opengl.GL11 @@ -44,7 +43,7 @@ class CablePart(val original: Option[Node] = None) extends DelegatePart with TCu override def onWorldJoin() { super.onWorldJoin() - TickHandler.schedule(this) + common.EventHandler.schedule(this) } override def onWorldSeparate() { diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala index 62fd1b26b..0104c7f50 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala @@ -1,9 +1,9 @@ package li.cil.oc.common.tileentity.traits import li.cil.oc.Settings -import li.cil.oc.api.{driver, network} import li.cil.oc.api.network.{Connector, SidedEnvironment} -import li.cil.oc.server.TickHandler +import li.cil.oc.api.{driver, network} +import li.cil.oc.common.EventHandler import li.cil.oc.util.ExtendedNBT._ import net.minecraft.nbt.NBTTagCompound import net.minecraftforge.common.ForgeDirection @@ -24,7 +24,7 @@ trait Environment extends TileEntity with network.Environment with driver.Contai override protected def initialize() { super.initialize() if (isServer) { - TickHandler.schedule(this) + EventHandler.schedule(this) } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2.scala index 29ea7d704..f702f302a 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/IndustrialCraft2.scala @@ -3,7 +3,7 @@ package li.cil.oc.common.tileentity.traits.power import cpw.mods.fml.common.Optional import ic2.api.energy.tile.IEnergySink import li.cil.oc.Settings -import li.cil.oc.server.TickHandler +import li.cil.oc.common.EventHandler import li.cil.oc.util.mods.Mods import net.minecraftforge.common.ForgeDirection @@ -17,17 +17,17 @@ trait IndustrialCraft2 extends Common with IEnergySink { override def validate() { super.validate() - if (useIndustrialCraft2Power && !addedToPowerGrid) TickHandler.scheduleIC2Add(this) + if (useIndustrialCraft2Power && !addedToPowerGrid) EventHandler.scheduleIC2Add(this) } override def invalidate() { super.invalidate() - if (useIndustrialCraft2Power && addedToPowerGrid) TickHandler.scheduleIC2Remove(this) + if (useIndustrialCraft2Power && addedToPowerGrid) EventHandler.scheduleIC2Remove(this) } override def onChunkUnload() { super.onChunkUnload() - if (useIndustrialCraft2Power && addedToPowerGrid) TickHandler.scheduleIC2Remove(this) + if (useIndustrialCraft2Power && addedToPowerGrid) EventHandler.scheduleIC2Remove(this) } // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/server/PacketHandler.scala b/src/main/scala/li/cil/oc/server/PacketHandler.scala index 82a79a28a..2b24889ac 100644 --- a/src/main/scala/li/cil/oc/server/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/server/PacketHandler.scala @@ -25,6 +25,7 @@ class PacketHandler extends CommonPacketHandler { case PacketType.MouseScroll => onMouseScroll(p) case PacketType.MouseUp => onMouseUp(p) case PacketType.MultiPartPlace => onMultiPartPlace(p) + case PacketType.PetVisibility => onPetVisibility(p) case PacketType.RobotAssemblerStart => onRobotAssemblerStart(p) case PacketType.RobotStateRequest => onRobotStateRequest(p) case PacketType.ServerRange => onServerRange(p) @@ -118,6 +119,22 @@ class PacketHandler extends CommonPacketHandler { } } + def onPetVisibility(p: PacketParser) { + p.player match { + case player: EntityPlayerMP => + if (if (p.readBoolean()) { + PetVisibility.hidden.remove(player.getCommandSenderName) + } + else { + PetVisibility.hidden.add(player.getCommandSenderName) + }) { + // Something changed. + PacketSender.sendPetVisibility(Some(player.getCommandSenderName)) + } + case _ => // Invalid packet. + } + } + def onRobotAssemblerStart(p: PacketParser) = p.readTileEntity[RobotAssembler]() match { case Some(assembler) => assembler.start() diff --git a/src/main/scala/li/cil/oc/server/PacketSender.scala b/src/main/scala/li/cil/oc/server/PacketSender.scala index 0d9c8815c..d081c10b0 100644 --- a/src/main/scala/li/cil/oc/server/PacketSender.scala +++ b/src/main/scala/li/cil/oc/server/PacketSender.scala @@ -129,6 +129,28 @@ object PacketSender { pb.sendToNearbyPlayers(t) } + def sendPetVisibility(name: Option[String] = None, player: Option[EntityPlayerMP] = None) { + val pb = new PacketBuilder(PacketType.ComputerState) + + name match { + case Some(n) => + pb.writeInt(1) + pb.writeUTF(n) + pb.writeBoolean(!PetVisibility.hidden.contains(n)) + case _ => + pb.writeInt(PetVisibility.hidden.size) + for (n <- PetVisibility.hidden) { + pb.writeUTF(n) + pb.writeBoolean(false) + } + } + + player match { + case Some(p) => pb.sendToPlayer(p) + case _ => pb.sendToAllPlayers() + } + } + def sendPowerState(t: PowerInformation) { val pb = new PacketBuilder(PacketType.PowerState) diff --git a/src/main/scala/li/cil/oc/server/PetVisibility.scala b/src/main/scala/li/cil/oc/server/PetVisibility.scala new file mode 100644 index 000000000..4fb68fdf2 --- /dev/null +++ b/src/main/scala/li/cil/oc/server/PetVisibility.scala @@ -0,0 +1,7 @@ +package li.cil.oc.server + +import scala.collection.mutable + +object PetVisibility { + val hidden = mutable.Set.empty[String] +} diff --git a/src/main/scala/li/cil/oc/server/TickHandler.scala b/src/main/scala/li/cil/oc/server/TickHandler.scala deleted file mode 100644 index b30d4dc80..000000000 --- a/src/main/scala/li/cil/oc/server/TickHandler.scala +++ /dev/null @@ -1,64 +0,0 @@ -package li.cil.oc.server - -import java.util -import java.util.logging.Level - -import codechicken.multipart.TMultiPart -import cpw.mods.fml.common.{FMLCommonHandler, ITickHandler, Optional, TickType} -import ic2.api.energy.event.{EnergyTileLoadEvent, EnergyTileUnloadEvent} -import li.cil.oc.OpenComputers -import li.cil.oc.api.Network -import li.cil.oc.common.tileentity.traits.power -import net.minecraft.tileentity.TileEntity -import net.minecraftforge.common.MinecraftForge - -import scala.collection.mutable - -object TickHandler extends ITickHandler { - val pending = mutable.Buffer.empty[() => Unit] - - def schedule(tileEntity: TileEntity) = - if (FMLCommonHandler.instance.getEffectiveSide.isServer) pending.synchronized { - pending += (() => Network.joinOrCreateNetwork(tileEntity)) - } - - @Optional.Method(modid = "ForgeMultipart") - def schedule(part: TMultiPart) = - if (FMLCommonHandler.instance.getEffectiveSide.isServer) pending.synchronized { - pending += (() => Network.joinOrCreateNetwork(part.tile)) - } - - @Optional.Method(modid = "IC2") - def scheduleIC2Add(tileEntity: power.IndustrialCraft2) = pending.synchronized { - pending += (() => if (!tileEntity.addedToPowerGrid && !tileEntity.isInvalid) { - MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(tileEntity)) - tileEntity.addedToPowerGrid = true - }) - } - - @Optional.Method(modid = "IC2") - def scheduleIC2Remove(tileEntity: power.IndustrialCraft2) = pending.synchronized { - pending += (() => if (tileEntity.addedToPowerGrid) { - MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(tileEntity)) - tileEntity.addedToPowerGrid = false - }) - } - - override def getLabel = "OpenComputers Network Initialization Ticker" - - override def ticks() = util.EnumSet.of(TickType.SERVER) - - override def tickStart(`type`: util.EnumSet[TickType], tickData: AnyRef*) { - pending.synchronized { - val adds = pending.toArray - pending.clear() - adds - } foreach (callback => { - try callback() catch { - case t: Throwable => OpenComputers.log.log(Level.WARNING, "Error in scheduled tick action.", t) - } - }) - } - - override def tickEnd(`type`: util.EnumSet[TickType], tickData: AnyRef*) = {} -} From fed7007259bc666f82d62a8a76d900921f514cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 21 Jun 2014 16:42:13 +0200 Subject: [PATCH 2/5] Allow getting robot name via `robot.player().getDisplayName()`. --- src/main/scala/li/cil/oc/server/component/robot/Player.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/scala/li/cil/oc/server/component/robot/Player.scala b/src/main/scala/li/cil/oc/server/component/robot/Player.scala index 5e39fff8b..226039c36 100644 --- a/src/main/scala/li/cil/oc/server/component/robot/Player.scala +++ b/src/main/scala/li/cil/oc/server/component/robot/Player.scala @@ -50,6 +50,8 @@ class Player(val robot: tileentity.Robot) extends FakePlayer(robot.world.asInsta override def getDefaultEyeHeight = 0f + override def getDisplayName = robot.name + // ----------------------------------------------------------------------- // def updatePositionAndRotation(facing: ForgeDirection, side: ForgeDirection) { From 7cd99e8e793c4ff64c59ba4c3691f19cb787e1dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 21 Jun 2014 19:55:15 +0200 Subject: [PATCH 3/5] Moved the _OSVERSION global to OpenOs's init script, where it should be now. --- .../assets/opencomputers/loot/OpenOS/init.lua | 2 ++ .../assets/opencomputers/lua/kernel.lua | 3 +-- .../event/ChunkloaderUpgradeHandler.scala | 17 ++++++++++++++--- .../scala/li/cil/oc/server/PacketSender.scala | 2 +- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/init.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/init.lua index 5640b476e..63d22ff03 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/init.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/init.lua @@ -1,4 +1,6 @@ do + _G._OSVERSION = "OpenOS 1.2" + local component = component local computer = computer local unicode = unicode diff --git a/src/main/resources/assets/opencomputers/lua/kernel.lua b/src/main/resources/assets/opencomputers/lua/kernel.lua index 87be3e92e..d81190e50 100644 --- a/src/main/resources/assets/opencomputers/lua/kernel.lua +++ b/src/main/resources/assets/opencomputers/lua/kernel.lua @@ -249,7 +249,6 @@ sandbox = { traceback = debug.traceback }, - _OSVERSION = "OpenOS 1.2", checkArg = checkArg } sandbox._G = sandbox @@ -622,7 +621,7 @@ local function bootstrap() end end if not init then - error("no bootable medium found" .. (reason and (": " .. tostring(reason)) or "")) + error("no bootable medium found" .. (reason and (": " .. tostring(reason)) or ""), 0) end return coroutine.create(init), {n=0} diff --git a/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala b/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala index f12a83670..b4b1709df 100644 --- a/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala +++ b/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala @@ -18,7 +18,13 @@ object ChunkloaderUpgradeHandler extends LoadingCallback { override def ticketsLoaded(tickets: util.List[Ticket], world: World) { for (ticket <- tickets) { - restoredTickets += ticket.getModData.getString("address") -> ticket + val data = ticket.getModData + restoredTickets += data.getString("address") -> ticket + if (data.hasKey("x") && data.hasKey("z")) { + val x = data.getInteger("x") + val z = data.getInteger("z") + ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(x, z)) + } } } @@ -35,9 +41,12 @@ object ChunkloaderUpgradeHandler extends LoadingCallback { restoredTickets.clear() } - // TODO it might be necessary to use pre move to force load the target chunk + // Note: it might be necessary to use pre move to force load the target chunk // in case the robot moves across a chunk border into an otherwise unloaded - // chunk (I think it would just fail to move otherwise) + // chunk (I think it would just fail to move otherwise). + // Update 2014-06-21: did some testing, seems not to be necessary. My guess + // is that the access to the block in the direction the robot moves causes + // the chunk it might move into to get loaded. @ForgeSubscribe def onMove(e: RobotMoveEvent.Post) { @@ -57,6 +66,8 @@ object ChunkloaderUpgradeHandler extends LoadingCallback { } ForgeChunkManager.forceChunk(ticket, robotChunk) ticket.getModData.setString("address", loader.node.address) + ticket.getModData.setInteger("x", robotChunk.chunkXPos) + ticket.getModData.setInteger("z", robotChunk.chunkZPos) }) } } diff --git a/src/main/scala/li/cil/oc/server/PacketSender.scala b/src/main/scala/li/cil/oc/server/PacketSender.scala index d081c10b0..7c6585dcc 100644 --- a/src/main/scala/li/cil/oc/server/PacketSender.scala +++ b/src/main/scala/li/cil/oc/server/PacketSender.scala @@ -130,7 +130,7 @@ object PacketSender { } def sendPetVisibility(name: Option[String] = None, player: Option[EntityPlayerMP] = None) { - val pb = new PacketBuilder(PacketType.ComputerState) + val pb = new PacketBuilder(PacketType.PetVisibility) name match { case Some(n) => From b91c8e839db049cd7a3e7dd591df868b59464e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 21 Jun 2014 21:16:59 +0200 Subject: [PATCH 4/5] Left-aligned bluescreen messages and replacing tabs with two spaces to avoid the question marks. --- .../li/cil/oc/server/component/GraphicsCard.scala | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/component/GraphicsCard.scala b/src/main/scala/li/cil/oc/server/component/GraphicsCard.scala index 830b07bf9..df379898a 100644 --- a/src/main/scala/li/cil/oc/server/component/GraphicsCard.scala +++ b/src/main/scala/li/cil/oc/server/component/GraphicsCard.scala @@ -282,12 +282,17 @@ abstract class GraphicsCard extends component.ManagedComponent { else s.setBackgroundColor(0x000000) s.fill(0, 0, w, h, ' ') try { - val message = "Unrecoverable error:\n" + Localization.localizeImmediately(machine.lastError) + "\n" val wrapRegEx = s"(.{1,${math.max(1, w - 2)}})\\s".r - val lines = wrapRegEx.replaceAllIn(message, m => m.group(1) + "\n").lines.toArray + val lines = wrapRegEx.replaceAllIn(Localization.localizeImmediately(machine.lastError).replace("\t", " ") + "\n", m => m.group(1) + "\n").lines.toArray + val firstRow = ((h - lines.length) / 2) max 2 + + val message = "Unrecoverable Error" + s.set((w - message.length) / 2, firstRow - 2, message, false) + + val maxLineLength = lines.map(_.length).max + val col = ((w - maxLineLength) / 2) max 0 for ((line, idx) <- lines.zipWithIndex) { - val col = (w - line.length) / 2 - val row = (h - lines.length) / 2 + idx + val row = firstRow + idx s.set(col, row, line, false) } } From 1cd65bd2b3d1fba5ca569fcf67144b33516320cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 21 Jun 2014 21:49:11 +0200 Subject: [PATCH 5/5] Fixed screen GUI size not being properly updated when Minecraft windows was resized. --- src/main/scala/li/cil/oc/client/PacketSender.scala | 2 +- src/main/scala/li/cil/oc/client/gui/TextBuffer.scala | 6 ++++-- src/main/scala/li/cil/oc/server/PacketHandler.scala | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/scala/li/cil/oc/client/PacketSender.scala b/src/main/scala/li/cil/oc/client/PacketSender.scala index b636bd866..19f61097f 100644 --- a/src/main/scala/li/cil/oc/client/PacketSender.scala +++ b/src/main/scala/li/cil/oc/client/PacketSender.scala @@ -100,7 +100,7 @@ object PacketSender { def sendPetVisibility() { val pb = new PacketBuilder(PacketType.PetVisibility) - pb.writeBoolean(Settings.get.hideOwnPet) + pb.writeBoolean(!Settings.get.hideOwnPet) pb.sendToServer() } diff --git a/src/main/scala/li/cil/oc/client/gui/TextBuffer.scala b/src/main/scala/li/cil/oc/client/gui/TextBuffer.scala index db3d6d93b..98a4c4dc0 100644 --- a/src/main/scala/li/cil/oc/client/gui/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/client/gui/TextBuffer.scala @@ -24,8 +24,9 @@ trait TextBuffer extends GuiScreen { protected def bufferY: Int - protected var currentWidth, currentHeight = -1 + protected var guiSizeChanged = false + protected var currentWidth, currentHeight = -1 private var showKeyboardMissing = 0L @@ -37,6 +38,7 @@ trait TextBuffer extends GuiScreen { super.initGui() BufferRenderer.init(Minecraft.getMinecraft.renderEngine) Keyboard.enableRepeatEvents(true) + guiSizeChanged = true } override def onGuiClosed() = { @@ -58,7 +60,7 @@ trait TextBuffer extends GuiScreen { currentWidth = 0 currentHeight = 0 } - scale = changeSize(currentWidth, currentHeight, oldWidth != currentWidth || oldHeight != currentHeight) + scale = changeSize(currentWidth, currentHeight, guiSizeChanged || oldWidth != currentWidth || oldHeight != currentHeight) RenderState.checkError(getClass.getName + ".drawBufferLayer: entering (aka: wasntme)") diff --git a/src/main/scala/li/cil/oc/server/PacketHandler.scala b/src/main/scala/li/cil/oc/server/PacketHandler.scala index 2b24889ac..76ff9c09e 100644 --- a/src/main/scala/li/cil/oc/server/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/server/PacketHandler.scala @@ -7,6 +7,7 @@ import li.cil.oc.common.tileentity._ import li.cil.oc.common.tileentity.traits.{Computer, TileEntity} import li.cil.oc.common.{PacketType, PacketHandler => CommonPacketHandler} import li.cil.oc.{Settings, api} +import net.minecraft.client.Minecraft import net.minecraft.entity.player.{EntityPlayer, EntityPlayerMP} import net.minecraft.util.ChatMessageComponent import net.minecraftforge.common.{DimensionManager, ForgeDirection} @@ -121,7 +122,7 @@ class PacketHandler extends CommonPacketHandler { def onPetVisibility(p: PacketParser) { p.player match { - case player: EntityPlayerMP => + case player: EntityPlayerMP if player != Minecraft.getMinecraft.thePlayer => if (if (p.readBoolean()) { PetVisibility.hidden.remove(player.getCommandSenderName) }