From 9592ef6317b9ffbfdaca9a299b12bbb413e35ffd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 28 Jun 2015 14:27:45 +0200 Subject: [PATCH 01/42] Can now click address in output of analyzer in chat to copy it to clipboard. Also a bit of refactoring in command code. --- .../assets/opencomputers/lang/en_US.lang | 1 + src/main/scala/li/cil/oc/Localization.scala | 10 ++- src/main/scala/li/cil/oc/OpenComputers.scala | 2 +- .../li/cil/oc/client/CommandHandler.scala | 31 +++++++ src/main/scala/li/cil/oc/client/Proxy.scala | 2 + .../cil/oc/common/command/SimpleCommand.scala | 21 +++++ .../li/cil/oc/server/CommandHandler.scala | 89 ------------------- .../oc/server/command/CommandHandler.scala | 10 +++ .../NonDisassemblyAgreementCommand.scala | 48 ++++++++++ .../command/WirelessRenderingCommand.scala | 28 ++++++ 10 files changed, 151 insertions(+), 91 deletions(-) create mode 100644 src/main/scala/li/cil/oc/client/CommandHandler.scala create mode 100644 src/main/scala/li/cil/oc/common/command/SimpleCommand.scala delete mode 100644 src/main/scala/li/cil/oc/server/CommandHandler.scala create mode 100644 src/main/scala/li/cil/oc/server/command/CommandHandler.scala create mode 100644 src/main/scala/li/cil/oc/server/command/NonDisassemblyAgreementCommand.scala create mode 100644 src/main/scala/li/cil/oc/server/command/WirelessRenderingCommand.scala diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index ad0f8ae62..c3c8ed87e 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -155,6 +155,7 @@ oc:gui.Analyzer.AddressCopied=Address copied to clipboard. oc:gui.Analyzer.ChargerSpeed=§6Charge speed§f: %s oc:gui.Analyzer.ComponentName=§6Component name§f: %s oc:gui.Analyzer.Components=§6Number of connected components§f: %s +oc:gui.Analyzer.CopyToClipboard=Click to copy to clipboard. oc:gui.Analyzer.LastError=§6Last error§f: %s oc:gui.Analyzer.RobotName=§6Name§f: %s oc:gui.Analyzer.RobotOwner=§6Owner§f: %s diff --git a/src/main/scala/li/cil/oc/Localization.scala b/src/main/scala/li/cil/oc/Localization.scala index 26f01224a..413dbe481 100644 --- a/src/main/scala/li/cil/oc/Localization.scala +++ b/src/main/scala/li/cil/oc/Localization.scala @@ -1,6 +1,9 @@ package li.cil.oc import cpw.mods.fml.common.event.FMLFingerprintViolationEvent +import li.cil.oc.client.CommandHandler.SetClipboardCommand +import net.minecraft.event.ClickEvent +import net.minecraft.event.HoverEvent import net.minecraft.util.ChatComponentText import net.minecraft.util.ChatComponentTranslation import net.minecraft.util.StatCollector @@ -23,7 +26,12 @@ object Localization { def localizeImmediately(key: String) = StatCollector.translateToLocal(resolveKey(key)).split(nl).map(_.trim).mkString("\n") object Analyzer { - def Address(value: String) = localizeLater("gui.Analyzer.Address", value) + def Address(value: String) = { + val result = localizeLater("gui.Analyzer.Address", value) + result.getChatStyle.setChatClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, s"/${SetClipboardCommand.name} $value")) + result.getChatStyle.setChatHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, localizeLater("gui.Analyzer.CopyToClipboard"))) + result + } def AddressCopied = localizeLater("gui.Analyzer.AddressCopied") diff --git a/src/main/scala/li/cil/oc/OpenComputers.scala b/src/main/scala/li/cil/oc/OpenComputers.scala index 224453058..4f6aae03e 100644 --- a/src/main/scala/li/cil/oc/OpenComputers.scala +++ b/src/main/scala/li/cil/oc/OpenComputers.scala @@ -8,7 +8,7 @@ import cpw.mods.fml.common.event._ import cpw.mods.fml.common.network.FMLEventChannel import li.cil.oc.common.IMC import li.cil.oc.common.Proxy -import li.cil.oc.server.CommandHandler +import li.cil.oc.server.command.CommandHandler import org.apache.logging.log4j.LogManager @Mod(modid = OpenComputers.ID, name = OpenComputers.Name, diff --git a/src/main/scala/li/cil/oc/client/CommandHandler.scala b/src/main/scala/li/cil/oc/client/CommandHandler.scala new file mode 100644 index 000000000..79aa183ed --- /dev/null +++ b/src/main/scala/li/cil/oc/client/CommandHandler.scala @@ -0,0 +1,31 @@ +package li.cil.oc.client + +import li.cil.oc.common.command.SimpleCommand +import net.minecraft.client.gui.GuiScreen +import net.minecraft.command.ICommandSender +import net.minecraftforge.client.ClientCommandHandler + +object CommandHandler { + def register(): Unit = { + ClientCommandHandler.instance.registerCommand(SetClipboardCommand) + } + + object SetClipboardCommand extends SimpleCommand("oc_setclipboard") { + override def getCommandUsage(source: ICommandSender): String = name + " " + + override def processCommand(source: ICommandSender, command: Array[String]): Unit = { + if (source.getEntityWorld.isRemote && command != null && command.length > 0) { + GuiScreen.setClipboardString(command(0)) + } + } + + // OP levels for reference: + // 1 - Ops can bypass spawn protection. + // 2 - Ops can use /clear, /difficulty, /effect, /gamemode, /gamerule, /give, /summon, /setblock and /tp, and can edit command blocks. + // 3 - Ops can use /ban, /deop, /kick, and /op. + // 4 - Ops can use /stop. + + override def getRequiredPermissionLevel = 0 + } + +} diff --git a/src/main/scala/li/cil/oc/client/Proxy.scala b/src/main/scala/li/cil/oc/client/Proxy.scala index ed4bf4a79..9d8ecf086 100644 --- a/src/main/scala/li/cil/oc/client/Proxy.scala +++ b/src/main/scala/li/cil/oc/client/Proxy.scala @@ -36,6 +36,8 @@ private[oc] class Proxy extends CommonProxy { api.API.manual = client.Manual + CommandHandler.register() + MinecraftForge.EVENT_BUS.register(gui.Icons) } diff --git a/src/main/scala/li/cil/oc/common/command/SimpleCommand.scala b/src/main/scala/li/cil/oc/common/command/SimpleCommand.scala new file mode 100644 index 000000000..7e1464382 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/command/SimpleCommand.scala @@ -0,0 +1,21 @@ +package li.cil.oc.common.command + +import net.minecraft.command.CommandBase +import net.minecraft.command.ICommandSender + +import scala.collection.convert.WrapAsJava._ +import scala.collection.mutable + +abstract class SimpleCommand(val name: String) extends CommandBase { + protected var aliases = mutable.ListBuffer.empty[String] + + override def getCommandName = name + + override def getCommandAliases = aliases + + override def canCommandSenderUseCommand(source: ICommandSender) = true + + override def isUsernameIndex(command: Array[String], i: Int) = false + + override def addTabCompletionOptions(source: ICommandSender, command: Array[String]) = List.empty[AnyRef] +} diff --git a/src/main/scala/li/cil/oc/server/CommandHandler.scala b/src/main/scala/li/cil/oc/server/CommandHandler.scala deleted file mode 100644 index 653c60c26..000000000 --- a/src/main/scala/li/cil/oc/server/CommandHandler.scala +++ /dev/null @@ -1,89 +0,0 @@ -package li.cil.oc.server - -import cpw.mods.fml.common.event.FMLServerStartingEvent -import li.cil.oc.Settings -import net.minecraft.command.CommandBase -import net.minecraft.command.ICommandSender -import net.minecraft.command.WrongUsageException -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.nbt.NBTTagCompound - -import scala.collection.convert.wrapAsJava._ -import scala.collection.mutable - -object CommandHandler { - def register(e: FMLServerStartingEvent) { - e.registerServerCommand(WirelessRenderingCommand) - e.registerServerCommand(NonDisassemblyAgreementCommand) - } - - // OP levels for reference: - // 1 - Ops can bypass spawn protection. - // 2 - Ops can use /clear, /difficulty, /effect, /gamemode, /gamerule, /give, /summon, /setblock and /tp, and can edit command blocks. - // 3 - Ops can use /ban, /deop, /kick, and /op. - // 4 - Ops can use /stop. - - object WirelessRenderingCommand extends SimpleCommand("oc_renderWirelessNetwork") { - aliases += "oc_wlan" - - override def getCommandUsage(source: ICommandSender) = name + " " - - override def processCommand(source: ICommandSender, command: Array[String]) { - Settings.rTreeDebugRenderer = - if (command != null && command.length > 0) - CommandBase.parseBoolean(source, command(0)) - else - !Settings.rTreeDebugRenderer - } - - override def getRequiredPermissionLevel = 2 - } - - object NonDisassemblyAgreementCommand extends SimpleCommand("oc_preventDisassembling") { - aliases += "oc_nodis" - aliases += "oc_prevdis" - - override def getCommandUsage(source: ICommandSender) = name + " " - - override def processCommand(source: ICommandSender, command: Array[String]) { - source match { - case player: EntityPlayer => - val stack = player.getHeldItem - if (stack != null) { - if (!stack.hasTagCompound) { - stack.setTagCompound(new NBTTagCompound()) - } - val nbt = stack.getTagCompound - val preventDisassembly = - if (command != null && command.length > 0) - CommandBase.parseBoolean(source, command(0)) - else - !nbt.getBoolean(Settings.namespace + "undisassemblable") - if (preventDisassembly) - nbt.setBoolean(Settings.namespace + "undisassemblable", true) - else - nbt.removeTag(Settings.namespace + "undisassemblable") - if (nbt.hasNoTags) stack.setTagCompound(null) - } - case _ => throw new WrongUsageException("Can only be used by players.") - } - } - - override def getRequiredPermissionLevel = 2 - } - - abstract class SimpleCommand(val name: String) extends CommandBase { - protected var aliases = mutable.ListBuffer.empty[String] - - override def getCommandName = name - - override def getCommandAliases = aliases - - override def canCommandSenderUseCommand(source: ICommandSender) = true - - override def isUsernameIndex(command: Array[String], i: Int) = false - - override def addTabCompletionOptions(source: ICommandSender, command: Array[String]) = List.empty[AnyRef] - } - -} diff --git a/src/main/scala/li/cil/oc/server/command/CommandHandler.scala b/src/main/scala/li/cil/oc/server/command/CommandHandler.scala new file mode 100644 index 000000000..0e2763b1b --- /dev/null +++ b/src/main/scala/li/cil/oc/server/command/CommandHandler.scala @@ -0,0 +1,10 @@ +package li.cil.oc.server.command + +import cpw.mods.fml.common.event.FMLServerStartingEvent + +object CommandHandler { + def register(e: FMLServerStartingEvent) { + e.registerServerCommand(WirelessRenderingCommand) + e.registerServerCommand(NonDisassemblyAgreementCommand) + } +} diff --git a/src/main/scala/li/cil/oc/server/command/NonDisassemblyAgreementCommand.scala b/src/main/scala/li/cil/oc/server/command/NonDisassemblyAgreementCommand.scala new file mode 100644 index 000000000..6702f2b3b --- /dev/null +++ b/src/main/scala/li/cil/oc/server/command/NonDisassemblyAgreementCommand.scala @@ -0,0 +1,48 @@ +package li.cil.oc.server.command + +import li.cil.oc.Settings +import li.cil.oc.common.command.SimpleCommand +import net.minecraft.command.CommandBase +import net.minecraft.command.ICommandSender +import net.minecraft.command.WrongUsageException +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.nbt.NBTTagCompound + +object NonDisassemblyAgreementCommand extends SimpleCommand("oc_preventDisassembling") { + aliases += "oc_nodis" + aliases += "oc_prevdis" + + override def getCommandUsage(source: ICommandSender) = name + " " + + override def processCommand(source: ICommandSender, command: Array[String]) { + source match { + case player: EntityPlayer => + val stack = player.getHeldItem + if (stack != null) { + if (!stack.hasTagCompound) { + stack.setTagCompound(new NBTTagCompound()) + } + val nbt = stack.getTagCompound + val preventDisassembly = + if (command != null && command.length > 0) + CommandBase.parseBoolean(source, command(0)) + else + !nbt.getBoolean(Settings.namespace + "undisassemblable") + if (preventDisassembly) + nbt.setBoolean(Settings.namespace + "undisassemblable", true) + else + nbt.removeTag(Settings.namespace + "undisassemblable") + if (nbt.hasNoTags) stack.setTagCompound(null) + } + case _ => throw new WrongUsageException("Can only be used by players.") + } + } + + // OP levels for reference: + // 1 - Ops can bypass spawn protection. + // 2 - Ops can use /clear, /difficulty, /effect, /gamemode, /gamerule, /give, /summon, /setblock and /tp, and can edit command blocks. + // 3 - Ops can use /ban, /deop, /kick, and /op. + // 4 - Ops can use /stop. + + override def getRequiredPermissionLevel = 2 +} diff --git a/src/main/scala/li/cil/oc/server/command/WirelessRenderingCommand.scala b/src/main/scala/li/cil/oc/server/command/WirelessRenderingCommand.scala new file mode 100644 index 000000000..a2b5d1054 --- /dev/null +++ b/src/main/scala/li/cil/oc/server/command/WirelessRenderingCommand.scala @@ -0,0 +1,28 @@ +package li.cil.oc.server.command + +import li.cil.oc.Settings +import li.cil.oc.common.command.SimpleCommand +import net.minecraft.command.CommandBase +import net.minecraft.command.ICommandSender + +object WirelessRenderingCommand extends SimpleCommand("oc_renderWirelessNetwork") { + aliases += "oc_wlan" + + override def getCommandUsage(source: ICommandSender) = name + " " + + override def processCommand(source: ICommandSender, command: Array[String]) { + Settings.rTreeDebugRenderer = + if (command != null && command.length > 0) + CommandBase.parseBoolean(source, command(0)) + else + !Settings.rTreeDebugRenderer + } + + // OP levels for reference: + // 1 - Ops can bypass spawn protection. + // 2 - Ops can use /clear, /difficulty, /effect, /gamemode, /gamerule, /give, /summon, /setblock and /tp, and can edit command blocks. + // 3 - Ops can use /ban, /deop, /kick, and /op. + // 4 - Ops can use /stop. + + override def getRequiredPermissionLevel = 2 +} From bdf00872d4e704763dd3eb8f901d1be1b318dc89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 28 Jun 2015 15:16:48 +0200 Subject: [PATCH 02/42] Failsafe for drivers implementing an old version of the API. Closes #1237. --- .../li/cil/oc/common/template/AssemblerTemplates.scala | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/template/AssemblerTemplates.scala b/src/main/scala/li/cil/oc/common/template/AssemblerTemplates.scala index 336b3b4dc..974296bee 100644 --- a/src/main/scala/li/cil/oc/common/template/AssemblerTemplates.scala +++ b/src/main/scala/li/cil/oc/common/template/AssemblerTemplates.scala @@ -3,6 +3,7 @@ package li.cil.oc.common.template import java.lang.reflect.Method import com.google.common.base.Strings +import li.cil.oc.OpenComputers import li.cil.oc.api import li.cil.oc.api.driver.EnvironmentHost import li.cil.oc.common.IMC @@ -74,7 +75,11 @@ object AssemblerTemplates { def validate(inventory: IInventory, slot: Int, stack: ItemStack) = validator match { case Some(method) => IMC.tryInvokeStatic(method, inventory, slot.underlying(), tier.underlying(), stack)(false) case _ => Option(hostClass.fold(api.Driver.driverFor(stack))(api.Driver.driverFor(stack, _))) match { - case Some(driver) => driver.slot(stack) == kind && driver.tier(stack) <= tier + case Some(driver) => try driver.slot(stack) == kind && driver.tier(stack) <= tier catch { + case t: AbstractMethodError => + OpenComputers.log.warn(s"Error trying to query driver '${driver.getClass.getName}' for slot and/or tier information. Probably their fault. Yell at them before coming to OpenComputers for support. :P") + false + } case _ => false } } From 4cb81b32f596eb1adf0b75bcc771ade045c63d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 28 Jun 2015 19:20:15 +0200 Subject: [PATCH 03/42] Properly make loot disks added via the save dir readonly. Fixes #1252. --- src/main/java/li/cil/oc/api/API.java | 2 +- src/main/java/li/cil/oc/api/FileSystem.java | 13 +++++ .../li/cil/oc/api/detail/FileSystemAPI.java | 9 ++++ src/main/scala/li/cil/oc/common/Loot.scala | 2 +- .../li/cil/oc/server/fs/FileSystem.scala | 4 ++ .../li/cil/oc/server/fs/ReadOnlyWrapper.scala | 47 +++++++++++++++++++ 6 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/main/scala/li/cil/oc/server/fs/ReadOnlyWrapper.scala diff --git a/src/main/java/li/cil/oc/api/API.java b/src/main/java/li/cil/oc/api/API.java index 0623789c7..051bcb5d8 100644 --- a/src/main/java/li/cil/oc/api/API.java +++ b/src/main/java/li/cil/oc/api/API.java @@ -12,7 +12,7 @@ import li.cil.oc.api.detail.*; */ public class API { public static final String ID_OWNER = "OpenComputers|Core"; - public static final String VERSION = "5.5.2"; + public static final String VERSION = "5.5.3"; public static DriverAPI driver = null; public static FileSystemAPI fileSystem = null; diff --git a/src/main/java/li/cil/oc/api/FileSystem.java b/src/main/java/li/cil/oc/api/FileSystem.java index e126f6440..a23950f56 100644 --- a/src/main/java/li/cil/oc/api/FileSystem.java +++ b/src/main/java/li/cil/oc/api/FileSystem.java @@ -125,6 +125,19 @@ public final class FileSystem { return null; } + /** + * Wrap a file system retrieved via one of the from??? methods to + * make it read-only. + * + * @param fileSystem the file system to wrap. + * @return the specified file system wrapped to be read-only. + */ + public static li.cil.oc.api.fs.FileSystem asReadOnly(final li.cil.oc.api.fs.FileSystem fileSystem) { + if (API.fileSystem != null) + return API.fileSystem.asReadOnly(fileSystem); + return null; + } + /** * Creates a network node that makes the specified file system available via * the common file system driver. diff --git a/src/main/java/li/cil/oc/api/detail/FileSystemAPI.java b/src/main/java/li/cil/oc/api/detail/FileSystemAPI.java index b45bd5b3e..69f06e633 100644 --- a/src/main/java/li/cil/oc/api/detail/FileSystemAPI.java +++ b/src/main/java/li/cil/oc/api/detail/FileSystemAPI.java @@ -81,6 +81,15 @@ public interface FileSystemAPI { */ FileSystem fromComputerCraft(Object mount); + /** + * Wrap a file system retrieved via one of the from??? methods to + * make it read-only. + * + * @param fileSystem the file system to wrap. + * @return the specified file system wrapped to be read-only. + */ + FileSystem asReadOnly(final FileSystem fileSystem); + /** * Creates a network node that makes the specified file system available via * the common file system driver. diff --git a/src/main/scala/li/cil/oc/common/Loot.scala b/src/main/scala/li/cil/oc/common/Loot.scala index 70ab6ab9f..ca46dddb4 100644 --- a/src/main/scala/li/cil/oc/common/Loot.scala +++ b/src/main/scala/li/cil/oc/common/Loot.scala @@ -128,7 +128,7 @@ object Loot extends WeightedRandomChestContent(new ItemStack(null: Item), 1, 1, def createLootDisk(name: String, path: String, external: Boolean, color: Option[Int] = None) = { val callable = if (external) new Callable[FileSystem] { - override def call(): FileSystem = api.FileSystem.fromSaveDirectory("loot/" + path, 0, false) + override def call(): FileSystem = api.FileSystem.asReadOnly(api.FileSystem.fromSaveDirectory("loot/" + path, 0, false)) } else new Callable[FileSystem] { override def call(): FileSystem = api.FileSystem.fromClass(OpenComputers.getClass, Settings.resourceDomain, "loot/" + path) } diff --git a/src/main/scala/li/cil/oc/server/fs/FileSystem.scala b/src/main/scala/li/cil/oc/server/fs/FileSystem.scala index d87befa54..e7021dce9 100755 --- a/src/main/scala/li/cil/oc/server/fs/FileSystem.scala +++ b/src/main/scala/li/cil/oc/server/fs/FileSystem.scala @@ -107,6 +107,10 @@ object FileSystem extends api.detail.FileSystemAPI { } else null + override def asReadOnly(fileSystem: api.fs.FileSystem) = + if (fileSystem.isReadOnly) fileSystem + else new ReadOnlyWrapper(fileSystem) + def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: Label, host: EnvironmentHost, accessSound: String, speed: Int) = Option(fileSystem).flatMap(fs => Some(component.FileSystem(fs, label, Option(host), Option(accessSound), speed))).orNull diff --git a/src/main/scala/li/cil/oc/server/fs/ReadOnlyWrapper.scala b/src/main/scala/li/cil/oc/server/fs/ReadOnlyWrapper.scala new file mode 100644 index 000000000..8b8be08c5 --- /dev/null +++ b/src/main/scala/li/cil/oc/server/fs/ReadOnlyWrapper.scala @@ -0,0 +1,47 @@ +package li.cil.oc.server.fs + +import java.io.FileNotFoundException + +import li.cil.oc.api +import li.cil.oc.api.fs.Mode +import net.minecraft.nbt.NBTTagCompound + +private class ReadOnlyWrapper(val fileSystem: api.fs.FileSystem) extends api.fs.FileSystem { + override def isReadOnly = true + + override def spaceTotal = fileSystem.spaceUsed() + + override def spaceUsed = fileSystem.spaceUsed() + + override def exists(path: String) = fileSystem.exists(path) + + override def size(path: String) = fileSystem.size(path) + + override def isDirectory(path: String) = fileSystem.isDirectory(path) + + override def lastModified(path: String) = fileSystem.lastModified(path) + + override def list(path: String) = fileSystem.list(path) + + override def delete(path: String) = false + + override def makeDirectory(path: String) = false + + override def rename(from: String, to: String) = false + + override def setLastModified(path: String, time: Long) = false + + override def open(path: String, mode: Mode) = mode match { + case Mode.Read => fileSystem.open(path, mode) + case Mode.Write => throw new FileNotFoundException() + case Mode.Append => throw new FileNotFoundException() + } + + override def getHandle(handle: Int) = fileSystem.getHandle(handle) + + override def close() = fileSystem.close() + + override def load(nbt: NBTTagCompound) = fileSystem.load(nbt) + + override def save(nbt: NBTTagCompound) = fileSystem.save(nbt) +} From 6d12346f9845fd23162151fdf0f4fbdb5e53c6d7 Mon Sep 17 00:00:00 2001 From: cyber01 Date: Mon, 29 Jun 2015 02:28:58 +0300 Subject: [PATCH 04/42] Added Cpy to clipboard to lang --- src/main/resources/assets/opencomputers/lang/ru_RU.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/opencomputers/lang/ru_RU.lang b/src/main/resources/assets/opencomputers/lang/ru_RU.lang index 3f9adc63c..1f3d94450 100644 --- a/src/main/resources/assets/opencomputers/lang/ru_RU.lang +++ b/src/main/resources/assets/opencomputers/lang/ru_RU.lang @@ -154,6 +154,7 @@ oc:gui.Analyzer.AddressCopied=Адрес скопирован в буфер об oc:gui.Analyzer.ChargerSpeed=§6Скорость зарядки§f: %s oc:gui.Analyzer.ComponentName=§6Имя компонента§f: %s oc:gui.Analyzer.Components=§6Количество подключенных компонентов§f: %s +oc:gui.Analyzer.CopyToClipboard=Кликните для копирования в буфер обмена. oc:gui.Analyzer.LastError=§6Последняя ошибка§f: %s oc:gui.Analyzer.RobotName=§6Имя§f: %s oc:gui.Analyzer.RobotOwner=§6Владелец§f: %s From f8b0995b07a6bbe4745c5656ed9c87592233072f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 29 Jun 2015 21:57:10 +0200 Subject: [PATCH 05/42] Get rid of remaining "match start" `component.list` calls in BIOS/OpenOS, fixes #1255. --- .../assets/opencomputers/loot/OpenOS/bin/install.lua | 2 +- .../assets/opencomputers/loot/OpenOS/boot/04_component.lua | 2 +- src/main/resources/assets/opencomputers/loot/OpenOS/init.lua | 4 ++-- .../assets/opencomputers/loot/OpenOS/lib/filesystem.lua | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/install.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/install.lua index 25367c286..b147bcc1e 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/install.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/install.lua @@ -9,7 +9,7 @@ local args, options = shell.parse(...) local fromAddress = options.from and component.get(options.from) or filesystem.get(os.getenv("_")).address local candidates = {} -for address in component.list("filesystem") do +for address in component.list("filesystem", true) do local dev = component.proxy(address) if not dev.isReadOnly() and dev.address ~= computer.tmpAddress() and dev.address ~= fromAddress then table.insert(candidates, dev) diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/boot/04_component.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/boot/04_component.lua index 5c084a5ca..a961a9aa5 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/boot/04_component.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/boot/04_component.lua @@ -116,7 +116,7 @@ end ------------------------------------------------------------------------------- -for address in component.list('screen') do +for address in component.list('screen', true) do if #component.invoke(address,'getKeyboards') > 0 then component.setPrimary('screen',address) end diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/init.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/init.lua index 26e719a25..da7148a11 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/init.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/init.lua @@ -28,8 +28,8 @@ do function rom.inits() return ipairs(rom.invoke("list", "boot")) end function rom.isDirectory(path) return rom.invoke("isDirectory", path) end - local screen = component.list('screen')() - for address in component.list('screen') do + local screen = component.list('screen', true)() + for address in component.list('screen', true) do if #component.invoke(address, 'getKeyboards') > 0 then screen = address end diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/lib/filesystem.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/lib/filesystem.lua index 7edda653b..dcbeb1d15 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/lib/filesystem.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/lib/filesystem.lua @@ -242,7 +242,7 @@ end function filesystem.proxy(filter) checkArg(1, filter, "string") local address - for c in component.list("filesystem") do + for c in component.list("filesystem", true) do if component.invoke(c, "getLabel") == filter then address = c break From 2f899190a38894ae96b311504584743c9d9abe36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Thu, 2 Jul 2015 20:02:44 +0200 Subject: [PATCH 06/42] Fixes #1259. --- src/main/scala/li/cil/oc/common/block/SimpleBlock.scala | 6 +++--- src/main/scala/li/cil/oc/util/Color.scala | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala b/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala index e272d0b9d..e511b4521 100644 --- a/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala +++ b/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala @@ -179,10 +179,10 @@ class SimpleBlock(material: Material = Material.iron) extends Block(material) { override def recolourBlock(world: World, x: Int, y: Int, z: Int, side: ForgeDirection, colour: Int) = world.getTileEntity(x, y, z) match { - case colored: Colored if colored.color != colour => - colored.color = colour + case colored: Colored if colored.color != Color.byMeta(colour) => + colored.color = Color.byMeta(colour) world.markBlockForUpdate(x, y, z) - false // Don't consume items. + true // Blame Vexatos. case _ => super.recolourBlock(world, x, y, z, side, colour) } diff --git a/src/main/scala/li/cil/oc/util/Color.scala b/src/main/scala/li/cil/oc/util/Color.scala index 6ae500f36..71f0a4d46 100644 --- a/src/main/scala/li/cil/oc/util/Color.scala +++ b/src/main/scala/li/cil/oc/util/Color.scala @@ -69,6 +69,8 @@ object Color { val byTier = Array(LightGray, Yellow, Cyan, Magenta) + def byMeta(meta: Int) = byOreName(dyes(15 - meta)) + def findDye(stack: ItemStack) = byOreName.keys.find(OreDictionary.getOres(_).exists(oreStack => OreDictionary.itemMatches(stack, oreStack, false))) def isDye(stack: ItemStack) = findDye(stack).isDefined From b60c784eedfc822386f46cd4ba51a06db5d752c0 Mon Sep 17 00:00:00 2001 From: payonel Date: Fri, 3 Jul 2015 14:41:07 -0700 Subject: [PATCH 07/42] fix coroutine resume by forcing write on close --- .../resources/assets/opencomputers/loot/OpenOS/bin/sh.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/sh.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/sh.lua index ffb31dba3..af2d98fd3 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/sh.lua @@ -13,6 +13,9 @@ local unicode = require("unicode") local memoryStream = {} function memoryStream:close() + if (self.empty) then + self:write('') + end self.closed = true end @@ -37,6 +40,7 @@ function memoryStream:read(n) end function memoryStream:write(value) + self.empty = false if not self.redirect.write and self.closed then error("attempt to use a closed stream") end @@ -59,7 +63,7 @@ end function memoryStream.new() local stream = {closed = false, buffer = "", - redirect = {}, result = {}, args = {}} + redirect = {}, result = {}, args = {}, empty = true} local metatable = {__index = memoryStream, __gc = memoryStream.close, __metatable = "memorystream"} From 50f7f743533252c4ca0a3a99df97f8e8da11a059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 4 Jul 2015 01:33:14 +0200 Subject: [PATCH 08/42] Fixed lighting issue with hover boots. I think. --- .../li/cil/oc/client/renderer/item/HoverBootRenderer.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/client/renderer/item/HoverBootRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/item/HoverBootRenderer.scala index ec831a03a..b82ebd7cf 100644 --- a/src/main/scala/li/cil/oc/client/renderer/item/HoverBootRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/item/HoverBootRenderer.scala @@ -100,8 +100,8 @@ object HoverBootRenderer extends ModelBiped { class LightModelRenderer(modelBase: ModelBase, name: String) extends ModelRenderer(modelBase, name) { override def render(dt: Float): Unit = { - RenderState.disableLighting() GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) + RenderState.disableLighting() GL11.glDepthFunc(GL11.GL_LEQUAL) GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE) GL11.glColor3ub(0x66.toByte, 0xDD.toByte, 0x55.toByte) From 829038f612c8093fff9876d9d8fae65b62b4cb8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 4 Jul 2015 11:02:07 +0200 Subject: [PATCH 09/42] Might fix screens blanking out until the first update in some cases. Maybe. --- .../scala/li/cil/oc/client/PacketHandler.scala | 1 + .../li/cil/oc/common/component/TextBuffer.scala | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/main/scala/li/cil/oc/client/PacketHandler.scala b/src/main/scala/li/cil/oc/client/PacketHandler.scala index c36b0e856..d79c1db60 100644 --- a/src/main/scala/li/cil/oc/client/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/client/PacketHandler.scala @@ -445,6 +445,7 @@ object PacketHandler extends CommonPacketHandler { } buffer.data.load(nbt) buffer.proxy.markDirty() + buffer.markInitialized() case _ => // Invalid packet. } } diff --git a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala index 61180803e..cb28af4a9 100644 --- a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala @@ -63,6 +63,10 @@ class TextBuffer(val host: EnvironmentHost) extends prefab.ManagedEnvironment wi private var _pendingCommands: Option[PacketBuilder] = None + private val syncInterval = 100 + + private var syncCooldown = syncInterval + private def pendingCommands = _pendingCommands.getOrElse { val pb = new CompressedPacketBuilder(PacketType.TextBufferMulti) pb.writeUTF(node.address) @@ -89,6 +93,8 @@ class TextBuffer(val host: EnvironmentHost) extends prefab.ManagedEnvironment wi val data = new util.TextBuffer(maxResolution, PackedColor.Depth.format(maxDepth)) + def markInitialized(): Unit = syncCooldown = -1 // Stop polling for init state. + // ----------------------------------------------------------------------- // override val canUpdate = true @@ -128,6 +134,14 @@ class TextBuffer(val host: EnvironmentHost) extends prefab.ManagedEnvironment wi _pendingCommands.foreach(_.sendToPlayersNearHost(host, Option(Settings.get.maxWirelessRange * Settings.get.maxWirelessRange))) _pendingCommands = None } + + if (syncCooldown > 0) { + syncCooldown -= 1 + if (syncCooldown == 0) { + syncCooldown = syncInterval + ClientPacketSender.sendTextBufferInit(proxy.nodeAddress) + } + } } // ----------------------------------------------------------------------- // From fada3e43d9fdc85b6f3f53f61fd43de84aa3bcf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 4 Jul 2015 11:45:56 +0200 Subject: [PATCH 10/42] Should fix sided issue. --- src/main/scala/li/cil/oc/common/component/TextBuffer.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala index cb28af4a9..907282b41 100644 --- a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala @@ -135,7 +135,7 @@ class TextBuffer(val host: EnvironmentHost) extends prefab.ManagedEnvironment wi _pendingCommands = None } - if (syncCooldown > 0) { + if (SideTracker.isClient && syncCooldown > 0) { syncCooldown -= 1 if (syncCooldown == 0) { syncCooldown = syncInterval From 2efd2704f8bd6a10231d4bf452cb2fc277425445 Mon Sep 17 00:00:00 2001 From: payonel Date: Sun, 5 Jul 2015 09:38:41 -0700 Subject: [PATCH 11/42] ignore closed pipe writes to dead coroutines and fix stalled pipes ignore all writes to a closed pipe stream if next is dead and fix piped quiet commands from stalling the pipe chain resolves issue: #1267 resolves issue: #1265 this is a merge(a squish) of two previous PR's: https://github.com/MightyPirates/OpenComputers/pull/1266 https://github.com/MightyPirates/OpenComputers/pull/1268 --- .../assets/opencomputers/loot/OpenOS/bin/sh.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/sh.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/sh.lua index af2d98fd3..cfd9a5656 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/sh.lua @@ -13,9 +13,6 @@ local unicode = require("unicode") local memoryStream = {} function memoryStream:close() - if (self.empty) then - self:write('') - end self.closed = true end @@ -40,9 +37,12 @@ function memoryStream:read(n) end function memoryStream:write(value) - self.empty = false if not self.redirect.write and self.closed then - error("attempt to use a closed stream") + -- if next is dead, ignore all writes + if coroutine.status(self.next) ~= "dead" then + error("attempt to use a closed stream") + end + return true end if self.redirect.write then self.redirect.write:write(value) @@ -63,7 +63,7 @@ end function memoryStream.new() local stream = {closed = false, buffer = "", - redirect = {}, result = {}, args = {}, empty = true} + redirect = {}, result = {}, args = {}} local metatable = {__index = memoryStream, __gc = memoryStream.close, __metatable = "memorystream"} @@ -310,6 +310,7 @@ local function execute(env, command, ...) elseif pipes[i] then io.output(pipes[i]) end + io.write('') end, command) if not threads[i] then return false, reason From 726a6bcfcd0783dd53692eb2330e8712ad946095 Mon Sep 17 00:00:00 2001 From: Jeroen Akkerman Date: Mon, 6 Jul 2015 20:56:50 +0200 Subject: [PATCH 12/42] Corrected 2 small mistakes "will contain of the components" -> "will contain all of the components" on line 7 Added a comma on line 13, action -> result. --- .../assets/opencomputers/doc/en_US/general/quickstart.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/opencomputers/doc/en_US/general/quickstart.md b/src/main/resources/assets/opencomputers/doc/en_US/general/quickstart.md index b880cbdc6..fe5d77675 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/general/quickstart.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/general/quickstart.md @@ -4,13 +4,13 @@ Also know as "how to build your first computer". To get your first [computer](co **Disclaimer**: this will be step-by-step, and also provide some information on how to look for issues yourself later on, so this is quite long. If you have never built a computer in real life, and/or are completely new to the mod, it is highly recommended you read through it all. -First off, you will need a [computer case](../block/case1.md). This is the block which will contain of the components, defining the behavior of the computer you are building. +First off, you will need a [computer case](../block/case1.md). This is the block which will contain all of the components, defining the behavior of the computer you are building. ![A tier two computer case.](oredict:oc:case2) For example, you will need to choose what tier of [graphics card](../item/graphicsCard1.md) you wish to use, if you need a [network card](../item/lanCard.md), a [redstone card](../item/redstoneCard1.md) or, if you're just playing around in creative mode, maybe even a [debug card](../item/debugCard.md). -When you open the [computer case](../block/case1.md)'s GUI you will see a few slots to the right. The number of slots, and what tier of component can be placed into them (indicated by the small roman numeral in the slot) depends on the tier of the case itself. +When you open the [computer case](../block/case1.md)'s GUI, you will see a few slots to the right. The number of slots, and what tier of component can be placed into them (indicated by the small roman numeral in the slot) depends on the tier of the case itself. ![GUI of a tier two computer case.](opencomputers:doc/img/configuration_case1.png) In their empty state, [computer cases](../block/case1.md) are pretty useless. You can try to power up your [computer](computer.md) now, but it'll immediately print an error message to your chat log, and make its dissatisfaction heard by beeping at you. Good thing the error message is telling you what you can do to fix this situation: it requires energy. Connect your [computer](computer.md) to some power, either directly or via a [power converter](../block/powerConverter.md). From 70b689572676e1ab4328800eea71dd4cf585af01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 7 Jul 2015 20:03:35 +0200 Subject: [PATCH 13/42] Adjusted _VERSION to be standard compliant. --- src/main/resources/assets/opencomputers/lua/machine.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/lua/machine.lua b/src/main/resources/assets/opencomputers/lua/machine.lua index 8a08680c9..56e79e3c0 100644 --- a/src/main/resources/assets/opencomputers/lua/machine.lua +++ b/src/main/resources/assets/opencomputers/lua/machine.lua @@ -732,7 +732,7 @@ sandbox = { tonumber = tonumber, tostring = tostring, type = type, - _VERSION = _VERSION:match("5.3") and "Lua 5.3.0" or "Lua 5.2.4", + _VERSION = _VERSION:match("5.3") and "Lua 5.3" or "Lua 5.2", xpcall = function(f, msgh, ...) local handled = false local result = table.pack(xpcall(f, function(...) From 117a6a88881764d38bc5ef8459bee6f19f1c4f01 Mon Sep 17 00:00:00 2001 From: NPException Date: Wed, 8 Jul 2015 13:14:16 +0200 Subject: [PATCH 14/42] added David from the A.I. movie https://en.wikipedia.org/wiki/A.I._Artificial_Intelligence --- src/main/resources/assets/opencomputers/robot.names | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/opencomputers/robot.names b/src/main/resources/assets/opencomputers/robot.names index 53d76de29..9165e1cc9 100644 --- a/src/main/resources/assets/opencomputers/robot.names +++ b/src/main/resources/assets/opencomputers/robot.names @@ -30,6 +30,7 @@ Crypto # Kodos Curiosity # Mars Rover Daedalus # Deus Ex Dalek Sec # Doctor Who +David # A.I. (the movie) Death Trap # Borderlands 2's Mechromancer Deputy ANDY # Eureka Dog # Half-Life From 26eaf983f8c147159dfe3b58740ef00ca1b9e7d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 10 Jul 2015 23:07:34 +0200 Subject: [PATCH 15/42] May or may not fix assertion error in R-Tree. Time will tell. --- .../computercraft/SwitchPeripheral.scala | 2 +- src/main/scala/li/cil/oc/util/RTree.scala | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/scala/li/cil/oc/integration/computercraft/SwitchPeripheral.scala b/src/main/scala/li/cil/oc/integration/computercraft/SwitchPeripheral.scala index a00364eeb..804b6bb47 100644 --- a/src/main/scala/li/cil/oc/integration/computercraft/SwitchPeripheral.scala +++ b/src/main/scala/li/cil/oc/integration/computercraft/SwitchPeripheral.scala @@ -121,7 +121,7 @@ class SwitchPeripheral(val switch: Switch) extends IPeripheral { } private def checkPort(args: Array[AnyRef], index: Int) = { - if (args.length < index - 1 || !args(index).isInstanceOf[Double]) + if (args.length < index - 1 || !args(index).isInstanceOf[Number]) throw new IllegalArgumentException(s"bad argument #${index + 1} (number expected)") val port = args(index).asInstanceOf[Double].toInt if (port < 0 || port > 0xFFFF) diff --git a/src/main/scala/li/cil/oc/util/RTree.scala b/src/main/scala/li/cil/oc/util/RTree.scala index 08355d98e..dc20b9424 100644 --- a/src/main/scala/li/cil/oc/util/RTree.scala +++ b/src/main/scala/li/cil/oc/util/RTree.scala @@ -12,13 +12,14 @@ class RTree[Data](private val M: Int)(implicit val coordinate: Data => (Double, private var root = new NonLeaf() - def apply(value: Data): Option[(Double, Double, Double)] = + def apply(value: Data): Option[(Double, Double, Double)] = this.synchronized { entries.get(value).fold(None: Option[(Double, Double, Double)])(position => Some(position.bounds.min.asTuple)) + } // Allows debug rendering of the tree. - def allBounds = root.allBounds(0) + def allBounds = this.synchronized(root.allBounds(0)) - def add(value: Data): Boolean = { + def add(value: Data): Boolean = this.synchronized { val replaced = remove(value) val entry = new Leaf(value, new Point(value)) entries += value -> entry @@ -29,7 +30,7 @@ class RTree[Data](private val M: Int)(implicit val coordinate: Data => (Double, !replaced } - def remove(value: Data): Boolean = + def remove(value: Data): Boolean = this.synchronized { entries.remove(value) match { case Some(node) => val change = root.remove(node) @@ -43,9 +44,11 @@ class RTree[Data](private val M: Int)(implicit val coordinate: Data => (Double, true case _ => false } + } - def query(from: (Double, Double, Double), to: (Double, Double, Double)) = + def query(from: (Double, Double, Double), to: (Double, Double, Double)) = this.synchronized { root.query(new Rectangle(new Point(from), new Point(to))) + } private abstract class Node { def bounds: Rectangle From 3a930fa9389c9e6558c63b51adac81de3478d62e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 10 Jul 2015 23:08:46 +0200 Subject: [PATCH 16/42] Added newline to md5sum and sha256sum. Fixes #1275. --- .../assets/opencomputers/lua/component/data/bin/md5sum.lua | 2 +- .../assets/opencomputers/lua/component/data/bin/sha256sum.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/opencomputers/lua/component/data/bin/md5sum.lua b/src/main/resources/assets/opencomputers/lua/component/data/bin/md5sum.lua index 6a8a874af..ebdb3ba2c 100644 --- a/src/main/resources/assets/opencomputers/lua/component/data/bin/md5sum.lua +++ b/src/main/resources/assets/opencomputers/lua/component/data/bin/md5sum.lua @@ -22,6 +22,6 @@ else read = read .. current until current ~= "" file:close() - io.write(data.toHex(data.md5(read)) .. "\t".. args[i]) + io.write(data.toHex(data.md5(read)) .. "\t".. args[i] .. "\n") end end diff --git a/src/main/resources/assets/opencomputers/lua/component/data/bin/sha256sum.lua b/src/main/resources/assets/opencomputers/lua/component/data/bin/sha256sum.lua index 777e2b67c..5e63c7c61 100644 --- a/src/main/resources/assets/opencomputers/lua/component/data/bin/sha256sum.lua +++ b/src/main/resources/assets/opencomputers/lua/component/data/bin/sha256sum.lua @@ -22,6 +22,6 @@ else read = read .. current until current ~= "" file:close() - io.write(data.toHex(data.sha256(read)) .. "\t".. args[i]) + io.write(data.toHex(data.sha256(read)) .. "\t".. args[i] .. "\n") end end From b48e2fdc8fa5e47e7c47421517b35f9108c24fcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 13:55:31 +0200 Subject: [PATCH 17/42] Fixed initial redstone state of non-updating blocks such as prints. --- .../oc/common/tileentity/traits/RedstoneAware.scala | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala index b0299dcd9..4e8a8bd5d 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala @@ -4,6 +4,7 @@ import cpw.mods.fml.common.Optional import cpw.mods.fml.relauncher.Side import cpw.mods.fml.relauncher.SideOnly import li.cil.oc.Settings +import li.cil.oc.common.EventHandler import li.cil.oc.integration.Mods import li.cil.oc.integration.util.BundledRedstone import li.cil.oc.server.{PacketSender => ServerPacketSender} @@ -75,13 +76,18 @@ trait RedstoneAware extends RotationAware with IConnectable with IRedstoneEmitte if (isServer) { if (shouldUpdateInput) { shouldUpdateInput = false - for (side <- ForgeDirection.VALID_DIRECTIONS) { - updateRedstoneInput(side) - } + ForgeDirection.VALID_DIRECTIONS.foreach(updateRedstoneInput) } } } + override def validate(): Unit = { + super.validate() + if (!canUpdate) { + EventHandler.schedule(() => ForgeDirection.VALID_DIRECTIONS.foreach(updateRedstoneInput)) + } + } + def updateRedstoneInput(side: ForgeDirection) { input(side, BundledRedstone.computeInput(position, side)) } From 4f218cc4f872610680fed112c9d5c02f9d83cde4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 13:57:02 +0200 Subject: [PATCH 18/42] Also using patched block renderer for inventory rendering where applicable. Fixes item rendering of 3d printer, holograms etc. --- .../client/renderer/block/BlockRenderer.scala | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala index 48c19787e..3cebc1142 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala @@ -19,11 +19,19 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { override def shouldRender3DInInventory(modelID: Int) = true - override def renderInventoryBlock(block: Block, metadata: Int, modelID: Int, renderer: RenderBlocks) { + override def renderInventoryBlock(block: Block, metadata: Int, modelID: Int, realRenderer: RenderBlocks) { RenderState.checkError(getClass.getName + ".renderInventoryBlock: entering (aka: wasntme)") + val renderer = patchedRenderer(realRenderer, block) GL11.glPushMatrix() block match { + case assembler: Assembler => + GL11.glTranslatef(-0.5f, -0.5f, -0.5f) + Tessellator.instance.startDrawingQuads() + Assembler.render(block, metadata, renderer) + Tessellator.instance.draw() + + RenderState.checkError(getClass.getName + ".renderInventoryBlock: assembler") case cable: Cable => GL11.glScalef(1.6f, 1.6f, 1.6f) GL11.glTranslatef(-0.5f, -0.5f, -0.5f) @@ -32,19 +40,6 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { Tessellator.instance.draw() RenderState.checkError(getClass.getName + ".renderInventoryBlock: cable") - case proxy@(_: RobotProxy | _: RobotAfterimage) => - GL11.glScalef(1.5f, 1.5f, 1.5f) - GL11.glTranslatef(-0.5f, -0.4f, -0.5f) - RobotRenderer.renderChassis() - - RenderState.checkError(getClass.getName + ".renderInventoryBlock: robot") - case assembler: Assembler => - GL11.glTranslatef(-0.5f, -0.5f, -0.5f) - Tessellator.instance.startDrawingQuads() - Assembler.render(block, metadata, renderer) - Tessellator.instance.draw() - - RenderState.checkError(getClass.getName + ".renderInventoryBlock: assembler") case hologram: Hologram => GL11.glTranslatef(-0.5f, -0.5f, -0.5f) Tessellator.instance.startDrawingQuads() @@ -59,6 +54,12 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { Tessellator.instance.draw() RenderState.checkError(getClass.getName + ".renderInventoryBlock: printer") + case proxy@(_: RobotProxy | _: RobotAfterimage) => + GL11.glScalef(1.5f, 1.5f, 1.5f) + GL11.glTranslatef(-0.5f, -0.4f, -0.5f) + RobotRenderer.renderChassis() + + RenderState.checkError(getClass.getName + ".renderInventoryBlock: robot") case _ => block match { case simple: SimpleBlock => @@ -89,11 +90,23 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { val renderer = patchedRenderer(realRenderer, block) world.getTileEntity(x, y, z) match { + case assembler: tileentity.Assembler => + Assembler.render(assembler.block, assembler.getBlockMetadata, x, y, z, renderer) + + RenderState.checkError(getClass.getName + ".renderWorldBlock: assembler") + + true case cable: tileentity.Cable => Cable.render(world, x, y, z, block, renderer) RenderState.checkError(getClass.getName + ".renderWorldBlock: cable") + true + case hologram: tileentity.Hologram => + Hologram.render(hologram.block, hologram.getBlockMetadata, x, y, z, renderer) + + RenderState.checkError(getClass.getName + ".renderWorldBlock: hologram") + true case keyboard: tileentity.Keyboard => val result = Keyboard.render(keyboard, x, y, z, block, renderer) @@ -118,18 +131,6 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { RenderState.checkError(getClass.getName + ".renderWorldBlock: rack") - true - case assembler: tileentity.Assembler => - Assembler.render(assembler.block, assembler.getBlockMetadata, x, y, z, renderer) - - RenderState.checkError(getClass.getName + ".renderWorldBlock: assembler") - - true - case hologram: tileentity.Hologram => - Hologram.render(hologram.block, hologram.getBlockMetadata, x, y, z, renderer) - - RenderState.checkError(getClass.getName + ".renderWorldBlock: hologram") - true case _ => val result = renderer.renderStandardBlock(block, x, y, z) From b7ae7554fcc818f7c41c7b5f25dc2810efb011d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 13:58:57 +0200 Subject: [PATCH 19/42] Added toggle thinger. Closes #1273. Name still subject to change, but using the leading one from the poll for now. --- assets/blocks.psd | Bin 169836 -> 177490 bytes .../opencomputers/doc/en_US/block/index.md | 3 +- .../doc/en_US/block/toggleThinger.md | 7 + .../assets/opencomputers/lang/en_US.lang | 2 + .../textures/blocks/ToggleThingerOn.png | Bin 0 -> 157 bytes .../textures/blocks/ToggleThingerSide.png | Bin 0 -> 535 bytes .../textures/blocks/ToggleThingerTop.png | Bin 0 -> 423 bytes src/main/scala/li/cil/oc/Constants.scala | 1 + .../li/cil/oc/client/PacketHandler.scala | 10 ++ src/main/scala/li/cil/oc/client/Proxy.scala | 1 + .../scala/li/cil/oc/client/Textures.scala | 4 + .../client/renderer/block/BlockRenderer.scala | 16 ++- .../client/renderer/block/ToggleThinger.scala | 120 ++++++++++++++++++ .../tileentity/ToggleThingerRenderer.scala | 88 +++++++++++++ .../scala/li/cil/oc/common/PacketType.scala | 1 + .../cil/oc/common/block/ToggleThinger.scala | 55 ++++++++ .../scala/li/cil/oc/common/init/Blocks.scala | 4 + .../oc/common/tileentity/ToggleThinger.scala | 102 +++++++++++++++ .../scala/li/cil/oc/server/PacketSender.scala | 10 ++ 19 files changed, 422 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/doc/en_US/block/toggleThinger.md create mode 100644 src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerOn.png create mode 100644 src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerSide.png create mode 100644 src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerTop.png create mode 100644 src/main/scala/li/cil/oc/client/renderer/block/ToggleThinger.scala create mode 100644 src/main/scala/li/cil/oc/client/renderer/tileentity/ToggleThingerRenderer.scala create mode 100644 src/main/scala/li/cil/oc/common/block/ToggleThinger.scala create mode 100644 src/main/scala/li/cil/oc/common/tileentity/ToggleThinger.scala diff --git a/assets/blocks.psd b/assets/blocks.psd index e1c7f8ea90e08fad21896fd275c434d3d34baf58..6c585ac8ef8af627fc37bac68dd792efe5e9c830 100644 GIT binary patch delta 4210 zcmeHJeQZ-z6u*hYRV=!>3yv1bhye z2r4jM^h)>`BPJRHCgTZ>e~WWa=lZO?P>YfI^H;>776-nVyp z&b{aU&c{9Xyj}e)`s*vvn+=a2Z?fh+SEAJ-I+VI`?RAr*q!BnFC2!Qq$TNoyA1~Y; zUpTr|T*}l&Qmy(TxfEZ=ah7zRpTP@R#>_0USt{1p?w^tCG%GYC^79KV#)1rUrpZ!h z=J{N6zS$~RjYT$_#gu0*ke`WcwM(M@EkkB*-awW772qog7p7%6NIrwhuYI<_66JiiV7_ArIa;7RPO8DdOk~ zw##MpC0JTeKUCVeD+ceA8h7oM4(-wpVmj$m2k8(7&B?N};pm`Ixojbp&U3XuUS!UFdmqzlmsvNgkxm?4tTNfhrbS({BYeq<_DT9vHd6lv zHp$8{R|1(j1ZT@1wcd=CF0{WU$6smP0n7@rU@eaDE_oZ9BZ+4njv(($z$S8f6Q0Ue zPp*g6`ptNyj>8u6{hPQ(R}p`vWgaip{E|f)*5VXqA-}rHV<@ijxEux(%~$1ew+j-J z0&fheMpejz45*m>x{w2S6GBXHh06{)P~EK>MB<}-BFRf`r?I(nZ3J>5m{R3b;%iCP0E(W=X?rBFY3lL`JpBXP$q z-k5E;ES^@J#VhT>jYr7q9au-M<#Rgk!MWVKn27VZCUU{TMUg8dT&$>rL)U@R(IF4V z=3us6=~C{ZuKQ@af|MTA2`}mg7mla_c%lsBl0>z!IAI6^{0XWI43p=St8)1qRW1(> zD#KcNA|0tz%`eBn5JF{y`jDS5PYm0T3bqA5fKv$CD}S&7r`iAxhz{{P@0 zclRd}67yd^xkR|QH68d#QHyll=&sTYSG_}__x&F2hAYyo^i4zc5xNC9Di*DXkRdpo zY8kUj01IkOI-Q~umYhztB!Lk?FO})0QU>${Co5mdP$@BvR{I}G^k%R%08}x7QUgKr zObD6>`_zGec~wgc;fnCS&IQkogND+HS^_S!5Zy1n&7Ife|`Wr`o!$=D| zk3QodWnbdqW!z0@&mF8u|6K}57-`u>n5n&mPys9Ft&f1tzO{8Apv8Z}Yx>m;d@22W z4>W=vbQ>O|bh6Z|lyu$1(ITB!H6UiX7n+Ly(E=ZJTevMC;f{iYPIwDnEIgYR9p z&_fS}?hixh5xRVepi+kB12iA zk&73nhmQGzFg>(GctD2w4&E)l9OyPqDnpl3I|?vNrp>^A{e!Z<<@J_D00`Rv=&Avr zbOUw3-?Es&aEHL*fJ0Q@?g<_2KZQPs2nIsOKxaS}Fnt&yEK;leAKmsVmAOOV%3=GU5@vzNvb_y|heBRTuTWjOiE5`)4PT-dEd7Jls z$=&;&c6z~YYkRi#Fc{uqGm-4iznCTa<6C6H#=eY(8>)v=80O2hU-@qPF7wWHW-I~T;N+J3Z`(UN_70y`t?bmpmyH4wp{ zQyJ^ow#%(#+{HY70t;i|cF(np;(}mR+f(;3K0dTvtCvYbwO#@QB*i5qfCxlM`uT+h z1%?EN2Ko5~g@s6n`wIyPf&h>dk`0iQ@D~J7uDj{JaC?zQ^B`qx@B`qasEGcPdY;0m^ zXl!6?YG7<)4D_gkq$J4Cl9Eyq67^vAz=c4)vOVP?U`1pI7-5D0F#ZQL1nNPFfPNu> Mkp|d6i9k{k03r+Ni2wiq diff --git a/src/main/resources/assets/opencomputers/doc/en_US/block/index.md b/src/main/resources/assets/opencomputers/doc/en_US/block/index.md index 1275d7a48..4aed941c8 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/block/index.md @@ -23,7 +23,6 @@ Keep in mind that some of these may not be available, depending on the recipe se ### Extensions * [Adapter](adapter.md) -* [Cable](cable.md) * [Geolyzer](geolyzer.md) * [Motion Sensor](motionSensor.md) * [Redstone I/O](redstone.md) @@ -38,6 +37,8 @@ Keep in mind that some of these may not be available, depending on the recipe se ## Networking * [Access Point](accessPoint.md) +* [Cable](cable.md) +* [Net Splitter](toggleThinger.md) * [Switch](switch.md) ## Power management diff --git a/src/main/resources/assets/opencomputers/doc/en_US/block/toggleThinger.md b/src/main/resources/assets/opencomputers/doc/en_US/block/toggleThinger.md new file mode 100644 index 000000000..91c418962 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/en_US/block/toggleThinger.md @@ -0,0 +1,7 @@ +# Net Splitter + +![*.net *.split](oredict:oc:toggleThinger) + +The net splitter is a device that allows controlling connectivity between subnetworks. Unlike the [switch](switch.md) or [power converter](powerConverter.md) it directly connects adjacent subnetworks, i.e. components can be accessed. Each side's connectivity can be toggled using a wrench (e.g. the [scrench](../item/wrench.md)). When a redstone signal is applied to the net splitter, all sides' connectivity is inverted. + +This block can therefore be used to toggle connectivity to certain parts of a component network. Use a [redstone I/O block](redstone.md) or [redstone cards](../item/redstoneCard1.md) to automate the net splitter. diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index c3c8ed87e..ddee8cb38 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -36,6 +36,7 @@ tile.oc.screen2.name=Screen (Tier 2) tile.oc.screen3.name=Screen (Tier 3) tile.oc.serverRack.name=Server Rack tile.oc.switch.name=Switch +tile.oc.toggleThinger.name=Net Splitter tile.oc.waypoint.name=Waypoint # Items @@ -331,6 +332,7 @@ oc:tooltip.TabletCase=Basic case for tablets. Place it into the assembler to add oc:tooltip.Terminal=Allows controlling a server remotely, as long as you are in range of it. Acts like a portable screen and keyboard. Shift-right-click a server in a server rack to bind the terminal to it. oc:tooltip.TexturePicker=This tool allows showing a string describing a block's surface, for use in 3D printer shape definitions. Totally not texture names, nope. No sir. oc:tooltip.Tier=§8Tier %s +oc:tooltip.ToggleThinger=Acts as a dynamic connector. Connectivity of each side can be toggled by hitting it with a wrench. Connectivity of all sides can be inverted by applying a redstone signal. oc:tooltip.TooLong=Hold [§f%s§7] for a detailed tooltip. oc:tooltip.Transistor=A basic element in most other computer parts. It's a bit twisted, but it does the job. oc:tooltip.UpgradeAngel=Allows robots to place blocks in thin air, even if there is no point of reference. diff --git a/src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerOn.png b/src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerOn.png new file mode 100644 index 0000000000000000000000000000000000000000..9c61d76435e4363b9b274b1b4e82aa2bd7fb6d4b GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!fowg8_HSK~9r|NsAg>9fNdD8f_{&sDn85Jy)XoL7fl3)XUHx3vIVCg!07aH9 A+yDRo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerSide.png b/src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerSide.png new file mode 100644 index 0000000000000000000000000000000000000000..fcf2787f0b2786efdb01531766c53ffff6d70968 GIT binary patch literal 535 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h88v#Bcu9A|H5)u;p{QMRc7Mz@%92^|t;^Ol1@|KpCJUl#p zetuF?Qug-t?Ck7LPEMw#rhI&Sf`Wq5($YW!%*@RE{rz2BTx4ZsxwyELl$1|9-4gM)*Wm6a6~6f`w8y}Y~v z0|P@tL&L+v_4M?(xw(1y__VdPWn^UJ&bnFd#4_B*fd>TT4qz zM@Prm+1cIQU0+{cLqkJCLejv%z}m{n(b2KyuVf6+iB~;c978H@iA-qkYc>#YInLX0 zmeIX|fl=@6rFGx$dH?(0Z)CIf*rmyPcN@9z+i--{GbBd1?0&SlV_M>tO;aA8za=** za@PF2F$|9mmg%1jjhy!RkBR;B$xF{#&pC5@TkY#N+70fS{Y!IZ^!|wrw(+i2F-^?V zd5{_u-YLgds(LoHwb*S4l}p2?+^7K|wAqE)5M0At9lts3!fPmoOU_U><$jHc$kPrt42YY*apfQ1gfuW(HF)=YNE-qnVVe0DY zIyyS8uC5Ug5#izC&d$zKQc~L5+IDt!j*gBpGBW=D{;{#KzP`TmZyY}Y)PKm+#WAGf zmdu3qJ{CnDXJ!_OUt8wx`iT=Ue8Z7Cy>}jGs`d6NE}A`sk8Q=YJjRZo$OxtoL%ms! z?9(2WaIKlD`>1?l_yVmLQVeS+xp-_{vhG_!r>y;&t$k}5CH9^_apBfa-PzWi#rFPE zidvQT<5)UR1piL?Z4vbGx2SDY^0d=ebDr&;$!hD;{Nfk0%lB3BjBE^{1zgfh%Efbm PzG3im^>bP0l+XkKuZ@$) literal 0 HcmV?d00001 diff --git a/src/main/scala/li/cil/oc/Constants.scala b/src/main/scala/li/cil/oc/Constants.scala index 1b52ce623..d65482adc 100644 --- a/src/main/scala/li/cil/oc/Constants.scala +++ b/src/main/scala/li/cil/oc/Constants.scala @@ -38,6 +38,7 @@ object Constants { final val ScreenTier3 = "screen3" final val ServerRack = "serverRack" final val Switch = "switch" + final val ToggleThinger = "toggleThinger" final val Waypoint = "waypoint" def Case(tier: Int) = ItemUtils.caseNameWithTierSuffix("case", tier) diff --git a/src/main/scala/li/cil/oc/client/PacketHandler.scala b/src/main/scala/li/cil/oc/client/PacketHandler.scala index d79c1db60..b9b514010 100644 --- a/src/main/scala/li/cil/oc/client/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/client/PacketHandler.scala @@ -74,6 +74,7 @@ object PacketHandler extends CommonPacketHandler { case PacketType.TextBufferInit => onTextBufferInit(p) case PacketType.TextBufferPowerChange => onTextBufferPowerChange(p) case PacketType.TextBufferMulti => onTextBufferMulti(p) + case PacketType.ToggleThingerState => onToggleThingerState(p) case PacketType.ScreenTouchMode => onScreenTouchMode(p) case PacketType.ServerPresence => onServerPresence(p) case PacketType.Sound => onSound(p) @@ -591,6 +592,15 @@ object PacketHandler extends CommonPacketHandler { buffer.rawSetForeground(col, row, color) } + def onToggleThingerState(p: PacketParser) = + p.readTileEntity[ToggleThinger]() match { + case Some(t) => + t.isInverted = p.readBoolean() + t.openSides = t.uncompressSides(p.readByte()) + t.world.markBlockForUpdate(t.x, t.y, t.z) + case _ => // Invalid packet. + } + def onScreenTouchMode(p: PacketParser) = p.readTileEntity[Screen]() match { case Some(t) => t.invertTouchMode = p.readBoolean() diff --git a/src/main/scala/li/cil/oc/client/Proxy.scala b/src/main/scala/li/cil/oc/client/Proxy.scala index 9d8ecf086..6d61adb77 100644 --- a/src/main/scala/li/cil/oc/client/Proxy.scala +++ b/src/main/scala/li/cil/oc/client/Proxy.scala @@ -69,6 +69,7 @@ private[oc] class Proxy extends CommonProxy { ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.AccessPoint], SwitchRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.RobotProxy], RobotRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer) + ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.ToggleThinger], ToggleThingerRenderer) MinecraftForgeClient.registerItemRenderer(Items.get(Constants.ItemName.Floppy).createItemStack(1).getItem, ItemRenderer) MinecraftForgeClient.registerItemRenderer(Items.get(Constants.BlockName.Print).createItemStack(1).getItem, ItemRenderer) diff --git a/src/main/scala/li/cil/oc/client/Textures.scala b/src/main/scala/li/cil/oc/client/Textures.scala index 49b537d2d..8c8adaa77 100644 --- a/src/main/scala/li/cil/oc/client/Textures.scala +++ b/src/main/scala/li/cil/oc/client/Textures.scala @@ -97,6 +97,10 @@ object Textures { var iconSideActivity: IIcon = _ } + object ToggleThinger { + var iconOn: IIcon = _ + } + def init(tm: TextureManager) { tm.bindTexture(fontAntiAliased) tm.bindTexture(fontAliased) diff --git a/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala index 3cebc1142..90098f754 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala @@ -60,6 +60,13 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { RobotRenderer.renderChassis() RenderState.checkError(getClass.getName + ".renderInventoryBlock: robot") + case toggle: ToggleThinger => + GL11.glTranslatef(-0.5f, -0.5f, -0.5f) + Tessellator.instance.startDrawingQuads() + ToggleThinger.render(block, metadata, renderer) + Tessellator.instance.draw() + + RenderState.checkError(getClass.getName + ".renderInventoryBlock: toggleThinger") case _ => block match { case simple: SimpleBlock => @@ -131,6 +138,12 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { RenderState.checkError(getClass.getName + ".renderWorldBlock: rack") + true + case toggle: tileentity.ToggleThinger => + ToggleThinger.render(ForgeDirection.VALID_DIRECTIONS.map(toggle.isSideOpen), block, x, y, z, renderer) + + RenderState.checkError(getClass.getName + ".renderWorldBlock: toggleThinger") + true case _ => val result = renderer.renderStandardBlock(block, x, y, z) @@ -144,7 +157,8 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { private def needsFlipping(block: Block) = block.isInstanceOf[Hologram] || block.isInstanceOf[Printer] || - block.isInstanceOf[Print] + block.isInstanceOf[Print] || + block.isInstanceOf[ToggleThinger] // The texture flip this works around only seems to occur for blocks with custom block renderers? def patchedRenderer(renderer: RenderBlocks, block: Block) = diff --git a/src/main/scala/li/cil/oc/client/renderer/block/ToggleThinger.scala b/src/main/scala/li/cil/oc/client/renderer/block/ToggleThinger.scala new file mode 100644 index 000000000..4b783af5c --- /dev/null +++ b/src/main/scala/li/cil/oc/client/renderer/block/ToggleThinger.scala @@ -0,0 +1,120 @@ +package li.cil.oc.client.renderer.block + +import net.minecraft.block.Block +import net.minecraft.client.renderer.RenderBlocks +import net.minecraftforge.common.util.ForgeDirection + +object ToggleThinger { + def render(openSides: Array[Boolean], block: Block, x: Int, y: Int, z: Int, renderer: RenderBlocks) { + val previousRenderAllFaces = renderer.renderAllFaces + renderer.renderAllFaces = true + + // Bottom. + renderer.setRenderBounds(0 / 16f, 0 / 16f, 5 / 16f, 5 / 16f, 5 / 16f, 11 / 16f) + renderer.renderStandardBlock(block, x, y, z) + renderer.setRenderBounds(11 / 16f, 0 / 16f, 5 / 16f, 16 / 16f, 5 / 16f, 11 / 16f) + renderer.renderStandardBlock(block, x, y, z) + renderer.setRenderBounds(5 / 16f, 0 / 16f, 0 / 16f, 11 / 16f, 5 / 16f, 5 / 16f) + renderer.renderStandardBlock(block, x, y, z) + renderer.setRenderBounds(5 / 16f, 0 / 16f, 11 / 16f, 11 / 16f, 5 / 16f, 16 / 16f) + renderer.renderStandardBlock(block, x, y, z) + // Corners. + renderer.setRenderBounds(0 / 16f, 0 / 16f, 0 / 16f, 5 / 16f, 16 / 16f, 5 / 16f) + renderer.renderStandardBlock(block, x, y, z) + renderer.setRenderBounds(11 / 16f, 0 / 16f, 0 / 16f, 16 / 16f, 16 / 16f, 5 / 16f) + renderer.renderStandardBlock(block, x, y, z) + renderer.setRenderBounds(0 / 16f, 0 / 16f, 11 / 16f, 5 / 16f, 16 / 16f, 16 / 16f) + renderer.renderStandardBlock(block, x, y, z) + renderer.setRenderBounds(11 / 16f, 0 / 16f, 11 / 16f, 16 / 16f, 16 / 16f, 16 / 16f) + renderer.renderStandardBlock(block, x, y, z) + // Top. + renderer.setRenderBounds(0 / 16f, 11 / 16f, 5 / 16f, 5 / 16f, 16 / 16f, 11 / 16f) + renderer.renderStandardBlock(block, x, y, z) + renderer.setRenderBounds(11 / 16f, 11 / 16f, 5 / 16f, 16 / 16f, 16 / 16f, 11 / 16f) + renderer.renderStandardBlock(block, x, y, z) + renderer.setRenderBounds(5 / 16f, 11 / 16f, 0 / 16f, 11 / 16f, 16 / 16f, 5 / 16f) + renderer.renderStandardBlock(block, x, y, z) + renderer.setRenderBounds(5 / 16f, 11 / 16f, 11 / 16f, 11 / 16f, 16 / 16f, 16 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + // Sides. + val down = openSides(ForgeDirection.DOWN.ordinal()) + renderer.setRenderBounds(5 / 16f, if (down) 0 / 16f else 2 / 16f, 5 / 16f, 11 / 16f, 5 / 16f, 11 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + val up = openSides(ForgeDirection.UP.ordinal()) + renderer.setRenderBounds(5 / 16f, 11 / 16f, 5 / 16f, 11 / 16f, if (up) 16 / 16f else 14f / 16f, 11 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + val north = openSides(ForgeDirection.NORTH.ordinal()) + renderer.setRenderBounds(5 / 16f, 5 / 16f, if (north) 0 / 16f else 2 / 16f, 11 / 16f, 11 / 16f, 5 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + val south = openSides(ForgeDirection.SOUTH.ordinal()) + renderer.setRenderBounds(5 / 16f, 5 / 16f, 11 / 16f, 11 / 16f, 11 / 16f, if (south) 16 / 16f else 14 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + val west = openSides(ForgeDirection.WEST.ordinal()) + renderer.setRenderBounds(if (west) 0 / 16f else 2 / 16f, 5 / 16f, 5 / 16f, 5 / 16f, 11 / 16f, 11 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + val east = openSides(ForgeDirection.EAST.ordinal()) + renderer.setRenderBounds(11 / 16f, 5 / 16f, 5 / 16f, if (east) 16 / 16f else 14 / 16f, 11 / 16f, 11 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + renderer.renderAllFaces = previousRenderAllFaces + } + + def render(block: Block, metadata: Int, renderer: RenderBlocks) { + // Bottom. + renderer.setRenderBounds(0 / 16f, 0 / 16f, 5 / 16f, 5 / 16f, 5 / 16f, 11 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(11 / 16f, 0 / 16f, 5 / 16f, 16 / 16f, 5 / 16f, 11 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(5 / 16f, 0 / 16f, 0 / 16f, 11 / 16f, 5 / 16f, 5 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(5 / 16f, 0 / 16f, 11 / 16f, 11 / 16f, 5 / 16f, 16 / 16f) + renderAllFaces(block, metadata, renderer) + // Corners. + renderer.setRenderBounds(0 / 16f, 0 / 16f, 0 / 16f, 5 / 16f, 16 / 16f, 5 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(11 / 16f, 0 / 16f, 0 / 16f, 16 / 16f, 16 / 16f, 5 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(0 / 16f, 0 / 16f, 11 / 16f, 5 / 16f, 16 / 16f, 16 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(11 / 16f, 0 / 16f, 11 / 16f, 16 / 16f, 16 / 16f, 16 / 16f) + renderAllFaces(block, metadata, renderer) + // Top. + renderer.setRenderBounds(0 / 16f, 11 / 16f, 5 / 16f, 5 / 16f, 16 / 16f, 11 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(11 / 16f, 11 / 16f, 5 / 16f, 16 / 16f, 16 / 16f, 11 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(5 / 16f, 11 / 16f, 0 / 16f, 11 / 16f, 16 / 16f, 5 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(5 / 16f, 11 / 16f, 11 / 16f, 11 / 16f, 16 / 16f, 16 / 16f) + renderAllFaces(block, metadata, renderer) + + // Sides. + renderer.setRenderBounds(5 / 16f, 2 / 16f, 5 / 16f, 11 / 16f, 5 / 16f, 11 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(5 / 16f, 11 / 16f, 5 / 16f, 11 / 16f, 14 / 16f, 11 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(5 / 16f, 5 / 16f, 2 / 16f, 11 / 16f, 11 / 16f, 5 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(5 / 16f, 5 / 16f, 11 / 16f, 11 / 16f, 11 / 16f, 14 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(2 / 16f, 5 / 16f, 5 / 16f, 5 / 16f, 11 / 16f, 11 / 16f) + renderAllFaces(block, metadata, renderer) + renderer.setRenderBounds(11 / 16f, 5 / 16f, 5 / 16f, 14 / 16f, 11 / 16f, 11 / 16f) + renderAllFaces(block, metadata, renderer) + } + + private def renderAllFaces(block: Block, metadata: Int, renderer: RenderBlocks): Unit = { + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceYNeg(block, metadata, renderer) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + } +} diff --git a/src/main/scala/li/cil/oc/client/renderer/tileentity/ToggleThingerRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/tileentity/ToggleThingerRenderer.scala new file mode 100644 index 000000000..5b919f433 --- /dev/null +++ b/src/main/scala/li/cil/oc/client/renderer/tileentity/ToggleThingerRenderer.scala @@ -0,0 +1,88 @@ +package li.cil.oc.client.renderer.tileentity + +import li.cil.oc.client.Textures +import li.cil.oc.common.tileentity +import li.cil.oc.util.RenderState +import net.minecraft.client.renderer.Tessellator +import net.minecraft.client.renderer.texture.TextureMap +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import net.minecraftforge.common.util.ForgeDirection +import org.lwjgl.opengl.GL11 + +object ToggleThingerRenderer extends TileEntitySpecialRenderer { + override def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, f: Float) { + RenderState.checkError(getClass.getName + ".renderTileEntityAt: entering (aka: wasntme)") + + val toggleThinger = tileEntity.asInstanceOf[tileentity.ToggleThinger] + if (toggleThinger.openSides.contains(!toggleThinger.isInverted)) { + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) + + RenderState.disableLighting() + RenderState.makeItBlend() + + GL11.glPushMatrix() + + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + GL11.glScaled(1.0025, -1.0025, 1.0025) + GL11.glTranslatef(-0.5f, -0.5f, -0.5f) + + bindTexture(TextureMap.locationBlocksTexture) + val t = Tessellator.instance + t.startDrawingQuads() + + val sideActivity = Textures.ToggleThinger.iconOn + + if (toggleThinger.isSideOpen(ForgeDirection.DOWN)) { + t.addVertexWithUV(0, 1, 0, sideActivity.getMaxU, sideActivity.getMinV) + t.addVertexWithUV(1, 1, 0, sideActivity.getMinU, sideActivity.getMinV) + t.addVertexWithUV(1, 1, 1, sideActivity.getMinU, sideActivity.getMaxV) + t.addVertexWithUV(0, 1, 1, sideActivity.getMaxU, sideActivity.getMaxV) + } + + if (toggleThinger.isSideOpen(ForgeDirection.UP)) { + t.addVertexWithUV(0, 0, 0, sideActivity.getMaxU, sideActivity.getMaxV) + t.addVertexWithUV(0, 0, 1, sideActivity.getMaxU, sideActivity.getMinV) + t.addVertexWithUV(1, 0, 1, sideActivity.getMinU, sideActivity.getMinV) + t.addVertexWithUV(1, 0, 0, sideActivity.getMinU, sideActivity.getMaxV) + } + + if (toggleThinger.isSideOpen(ForgeDirection.NORTH)) { + t.addVertexWithUV(1, 1, 0, sideActivity.getMinU, sideActivity.getMaxV) + t.addVertexWithUV(0, 1, 0, sideActivity.getMaxU, sideActivity.getMaxV) + t.addVertexWithUV(0, 0, 0, sideActivity.getMaxU, sideActivity.getMinV) + t.addVertexWithUV(1, 0, 0, sideActivity.getMinU, sideActivity.getMinV) + } + + if (toggleThinger.isSideOpen(ForgeDirection.SOUTH)) { + t.addVertexWithUV(0, 1, 1, sideActivity.getMinU, sideActivity.getMaxV) + t.addVertexWithUV(1, 1, 1, sideActivity.getMaxU, sideActivity.getMaxV) + t.addVertexWithUV(1, 0, 1, sideActivity.getMaxU, sideActivity.getMinV) + t.addVertexWithUV(0, 0, 1, sideActivity.getMinU, sideActivity.getMinV) + } + + if (toggleThinger.isSideOpen(ForgeDirection.WEST)) { + t.addVertexWithUV(0, 1, 0, sideActivity.getMinU, sideActivity.getMaxV) + t.addVertexWithUV(0, 1, 1, sideActivity.getMaxU, sideActivity.getMaxV) + t.addVertexWithUV(0, 0, 1, sideActivity.getMaxU, sideActivity.getMinV) + t.addVertexWithUV(0, 0, 0, sideActivity.getMinU, sideActivity.getMinV) + } + + if (toggleThinger.isSideOpen(ForgeDirection.EAST)) { + t.addVertexWithUV(1, 1, 1, sideActivity.getMinU, sideActivity.getMaxV) + t.addVertexWithUV(1, 1, 0, sideActivity.getMaxU, sideActivity.getMaxV) + t.addVertexWithUV(1, 0, 0, sideActivity.getMaxU, sideActivity.getMinV) + t.addVertexWithUV(1, 0, 1, sideActivity.getMinU, sideActivity.getMinV) + } + + t.draw() + + RenderState.enableLighting() + + GL11.glPopMatrix() + GL11.glPopAttrib() + } + + RenderState.checkError(getClass.getName + ".renderTileEntityAt: leaving") + } +} diff --git a/src/main/scala/li/cil/oc/common/PacketType.scala b/src/main/scala/li/cil/oc/common/PacketType.scala index b6eb1c0d4..2d90662f0 100644 --- a/src/main/scala/li/cil/oc/common/PacketType.scala +++ b/src/main/scala/li/cil/oc/common/PacketType.scala @@ -50,6 +50,7 @@ object PacketType extends Enumeration { TextBufferMultiRawSetBackground, TextBufferMultiRawSetForeground, TextBufferPowerChange, + ToggleThingerState, ScreenTouchMode, ServerPresence, Sound, diff --git a/src/main/scala/li/cil/oc/common/block/ToggleThinger.scala b/src/main/scala/li/cil/oc/common/block/ToggleThinger.scala new file mode 100644 index 000000000..fa66fba1f --- /dev/null +++ b/src/main/scala/li/cil/oc/common/block/ToggleThinger.scala @@ -0,0 +1,55 @@ +package li.cil.oc.common.block + +import cpw.mods.fml.relauncher.Side +import cpw.mods.fml.relauncher.SideOnly +import li.cil.oc.Settings +import li.cil.oc.client.Textures +import li.cil.oc.common.tileentity +import li.cil.oc.integration.util.Wrench +import li.cil.oc.util.BlockPosition +import net.minecraft.client.renderer.texture.IIconRegister +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.world.IBlockAccess +import net.minecraft.world.World +import net.minecraftforge.common.util.ForgeDirection + +class ToggleThinger extends RedstoneAware { + override protected def customTextures = Array( + Some("ToggleThingerTop"), + Some("ToggleThingerTop"), + Some("ToggleThingerSide"), + Some("ToggleThingerSide"), + Some("ToggleThingerSide"), + Some("ToggleThingerSide") + ) + + @SideOnly(Side.CLIENT) override + def registerBlockIcons(iconRegister: IIconRegister): Unit = { + super.registerBlockIcons(iconRegister) + Textures.ToggleThinger.iconOn = iconRegister.registerIcon(Settings.resourceDomain + ":ToggleThingerOn") + } + + override def isSideSolid(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection): Boolean = false + + // ----------------------------------------------------------------------- // + + override def createTileEntity(world: World, metadata: Int) = new tileentity.ToggleThinger() + + // ----------------------------------------------------------------------- // + + override def onBlockActivated(world: World, x: Int, y: Int, z: Int, player: EntityPlayer, side: ForgeDirection, hitX: Float, hitY: Float, hitZ: Float) = { + if (Wrench.holdsApplicableWrench(player, BlockPosition(x, y, z))) { + val sideToToggle = if (player.isSneaking) side.getOpposite else side + world.getTileEntity(x, y, z) match { + case toggleThinger: tileentity.ToggleThinger => + if (!world.isRemote) { + val oldValue = toggleThinger.openSides(sideToToggle.ordinal()) + toggleThinger.setSideOpen(sideToToggle, !oldValue) + } + true + case _ => false + } + } + else super.onBlockActivated(world, x, y, z, player, side, hitX, hitY, hitZ) + } +} diff --git a/src/main/scala/li/cil/oc/common/init/Blocks.scala b/src/main/scala/li/cil/oc/common/init/Blocks.scala index fd5161737..5c86471d7 100644 --- a/src/main/scala/li/cil/oc/common/init/Blocks.scala +++ b/src/main/scala/li/cil/oc/common/init/Blocks.scala @@ -34,6 +34,7 @@ object Blocks { GameRegistry.registerTileEntity(classOf[tileentity.Switch], Settings.namespace + "switch") GameRegistry.registerTileEntity(classOf[tileentity.Screen], Settings.namespace + "screen") GameRegistry.registerTileEntity(classOf[tileentity.ServerRack], Settings.namespace + "serverRack") + GameRegistry.registerTileEntity(classOf[tileentity.ToggleThinger], Settings.namespace + "toggleThinger") GameRegistry.registerTileEntity(classOf[tileentity.Waypoint], Settings.namespace + "waypoint") Recipes.addBlock(new AccessPoint(), Constants.BlockName.AccessPoint, "oc:accessPoint") @@ -75,5 +76,8 @@ object Blocks { // v1.5.10 Recipes.addBlock(new FakeEndstone(), Constants.BlockName.Endstone, "oc:stoneEndstone") + + // v1.5.14 + Recipes.addBlock(new ToggleThinger(), Constants.BlockName.ToggleThinger, "oc:toggleThinger") } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/ToggleThinger.scala b/src/main/scala/li/cil/oc/common/tileentity/ToggleThinger.scala new file mode 100644 index 000000000..312a0d3c2 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/tileentity/ToggleThinger.scala @@ -0,0 +1,102 @@ +package li.cil.oc.common.tileentity + +import cpw.mods.fml.relauncher.Side +import cpw.mods.fml.relauncher.SideOnly +import li.cil.oc.Settings +import li.cil.oc.api +import li.cil.oc.api.network.Visibility +import li.cil.oc.common.EventHandler +import li.cil.oc.server.{PacketSender => ServerPacketSender} +import net.minecraft.nbt.NBTTagCompound +import net.minecraftforge.common.util.ForgeDirection + +class ToggleThinger extends traits.Environment with traits.RedstoneAware with api.network.SidedEnvironment { + private final val SideCount = ForgeDirection.VALID_DIRECTIONS.length + + val node = api.Network.newNode(this, Visibility.None). + create() + + var isInverted = false + + var openSides = Array.fill(SideCount)(false) + + def compressSides = (ForgeDirection.VALID_DIRECTIONS, openSides).zipped.foldLeft(0)((acc, entry) => acc | (if (entry._2) entry._1.flag else 0)).toByte + + def uncompressSides(byte: Byte) = ForgeDirection.VALID_DIRECTIONS.map(d => (d.flag & byte) != 0) + + def isSideOpen(side: ForgeDirection) = side != ForgeDirection.UNKNOWN && { + val isOpen = openSides(side.ordinal()) + if (isInverted) !isOpen else isOpen + } + + def setSideOpen(side: ForgeDirection, value: Boolean): Unit = if (side != ForgeDirection.UNKNOWN && openSides(side.ordinal()) != value) { + openSides(side.ordinal()) = value + if (isServer) { + node.remove() + api.Network.joinOrCreateNetwork(this) + ServerPacketSender.sendToggleThingerState(this) + } + else { + world.markBlockForUpdate(x, y, z) + } + } + + // ----------------------------------------------------------------------- // + + override def sidedNode(side: ForgeDirection) = if (isSideOpen(side)) node else null + + @SideOnly(Side.CLIENT) + override def canConnect(side: ForgeDirection) = isSideOpen(side) + + // ----------------------------------------------------------------------- // + + override def canUpdate = false + + override protected def initialize(): Unit = { + super.initialize() + EventHandler.schedule(this) + } + + // ----------------------------------------------------------------------- // + + override protected def onRedstoneInputChanged(side: ForgeDirection, oldMaxValue: Int, newMaxValue: Int): Unit = { + super.onRedstoneInputChanged(side, oldMaxValue, newMaxValue) + val oldIsInverted = isInverted + isInverted = newMaxValue > 0 + if (isInverted != oldIsInverted) { + if (isServer) { + node.remove() + api.Network.joinOrCreateNetwork(this) + ServerPacketSender.sendToggleThingerState(this) + } + else { + world.markBlockForUpdate(x, y, z) + } + } + } + + override def readFromNBTForServer(nbt: NBTTagCompound): Unit = { + super.readFromNBTForServer(nbt) + isInverted = nbt.getBoolean(Settings.namespace + "isInverted") + openSides = uncompressSides(nbt.getByte(Settings.namespace + "openSides")) + } + + override def writeToNBTForServer(nbt: NBTTagCompound): Unit = { + super.writeToNBTForServer(nbt) + nbt.setBoolean(Settings.namespace + "isInverted", isInverted) + nbt.setByte(Settings.namespace + "openSides", compressSides) + } + + @SideOnly(Side.CLIENT) override + def readFromNBTForClient(nbt: NBTTagCompound): Unit = { + super.readFromNBTForClient(nbt) + isInverted = nbt.getBoolean(Settings.namespace + "isInverted") + openSides = uncompressSides(nbt.getByte(Settings.namespace + "openSides")) + } + + override def writeToNBTForClient(nbt: NBTTagCompound): Unit = { + super.writeToNBTForClient(nbt) + nbt.setBoolean(Settings.namespace + "isInverted", isInverted) + nbt.setByte(Settings.namespace + "openSides", compressSides) + } +} diff --git a/src/main/scala/li/cil/oc/server/PacketSender.scala b/src/main/scala/li/cil/oc/server/PacketSender.scala index 7847db5e3..92ccccd86 100644 --- a/src/main/scala/li/cil/oc/server/PacketSender.scala +++ b/src/main/scala/li/cil/oc/server/PacketSender.scala @@ -529,6 +529,16 @@ object PacketSender { pb.sendToPlayersNearHost(host) } + def sendToggleThingerState(t: tileentity.ToggleThinger): Unit = { + val pb = new SimplePacketBuilder(PacketType.ToggleThingerState) + + pb.writeTileEntity(t) + pb.writeBoolean(t.isInverted) + pb.writeByte(t.compressSides) + + pb.sendToPlayersNearTileEntity(t) + } + def sendScreenTouchMode(t: tileentity.Screen, value: Boolean) { val pb = new SimplePacketBuilder(PacketType.ScreenTouchMode) From f71bf06a5995e7c1f1cae4743fc65b6d26420f45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 17:06:16 +0200 Subject: [PATCH 20/42] All the right offsets in all the wrong places. Should fix #1278. mktime is still borked kinda, but cba to fix that now ._. --- src/main/scala/li/cil/oc/server/machine/luac/OSAPI.scala | 2 +- src/main/scala/li/cil/oc/server/machine/luaj/OSAPI.scala | 2 +- src/main/scala/li/cil/oc/util/GameTimeFormatter.scala | 9 ++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/machine/luac/OSAPI.scala b/src/main/scala/li/cil/oc/server/machine/luac/OSAPI.scala index 94047e9ee..6ae6d04bf 100644 --- a/src/main/scala/li/cil/oc/server/machine/luac/OSAPI.scala +++ b/src/main/scala/li/cil/oc/server/machine/luac/OSAPI.scala @@ -25,7 +25,7 @@ class OSAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) { else "%d/%m/%y %H:%M:%S" val time = if (lua.getTop > 1 && lua.isNumber(2)) lua.toNumber(2) * 1000 / 60 / 60 - else machine.worldTime + 5000 + else machine.worldTime + 6000 val dt = GameTimeFormatter.parse(time) def fmt(format: String) { diff --git a/src/main/scala/li/cil/oc/server/machine/luaj/OSAPI.scala b/src/main/scala/li/cil/oc/server/machine/luaj/OSAPI.scala index 439e74057..b0050abc7 100644 --- a/src/main/scala/li/cil/oc/server/machine/luaj/OSAPI.scala +++ b/src/main/scala/li/cil/oc/server/machine/luaj/OSAPI.scala @@ -18,7 +18,7 @@ class OSAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) { else "%d/%m/%y %H:%M:%S" val time = if (args.narg > 1 && args.isnumber(2)) args.todouble(2) * 1000 / 60 / 60 - else machine.worldTime + 5000 + else machine.worldTime + 6000 val dt = GameTimeFormatter.parse(time) def fmt(format: String) = { diff --git a/src/main/scala/li/cil/oc/util/GameTimeFormatter.scala b/src/main/scala/li/cil/oc/util/GameTimeFormatter.scala index c72e37b85..fe57294e3 100644 --- a/src/main/scala/li/cil/oc/util/GameTimeFormatter.scala +++ b/src/main/scala/li/cil/oc/util/GameTimeFormatter.scala @@ -67,8 +67,8 @@ object GameTimeFormatter { def parse(time: Double) = { var day = (time / 24000).toLong val weekDay = ((4 + day) % 7).toInt - val year = 1970 + (day / 365.2425).toInt - val yearDay = (day % 365.2425).toInt + val year = 1970 + (day / 364.2425).toInt + val yearDay = (day % 364.2425).toInt day = yearDay val monthLengths = monthLengthsForYear(year) var month = 0 @@ -80,7 +80,7 @@ object GameTimeFormatter { var seconds = ((time % 24000) * 60 * 60 / 1000).toInt var minutes = seconds / 60 seconds = seconds % 60 - val hours = (1 + minutes / 60) % 24 + val hours = (minutes / 60) % 24 minutes = minutes % 60 new DateTime(year, month + 1, day.toInt + 1, weekDay + 1, yearDay + 1, hours, minutes, seconds) @@ -107,7 +107,6 @@ object GameTimeFormatter { val monthLengths = monthLengthsForYear(year) val days = ((year - 1970) * 365.2425).ceil.toInt + (0 until mon - 1).foldLeft(0)((d, m) => d + monthLengths(m)) + mday - 1 val secs = sec + (min + (hour - 1 + days * 24) * 60) * 60 - if (secs < 0) None - else Option(secs) + Option(secs) } } From 74763fa14175fbf0cf10e1540b0ca44551f90ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 17:14:27 +0200 Subject: [PATCH 21/42] Removed deprecated call in bee converter, closes #1283. --- .../li/cil/oc/integration/forestry/ConverterIIndividual.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/integration/forestry/ConverterIIndividual.java b/src/main/scala/li/cil/oc/integration/forestry/ConverterIIndividual.java index 0280904d9..8635de86e 100644 --- a/src/main/scala/li/cil/oc/integration/forestry/ConverterIIndividual.java +++ b/src/main/scala/li/cil/oc/integration/forestry/ConverterIIndividual.java @@ -245,7 +245,6 @@ public class ConverterIIndividual implements Converter { output.put("generation", bee.getGeneration()); output.put("hasEffect", bee.hasEffect()); output.put("isAlive", bee.isAlive()); - output.put("isIrregularMating", bee.isIrregularMating()); output.put("isNatural", bee.isNatural()); if (isAnalyzed) genomeReader = new BeeGenomeReader(bee.getGenome()); From 9540cb44fb797c57543f24a27c593a34afa94dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 18:04:21 +0200 Subject: [PATCH 22/42] Netsplitter it is. Also added a recipe for it and added sound when toggling states. --- assets/blocks.psd | Bin 177490 -> 176246 bytes .../opencomputers/doc/en_US/block/index.md | 2 +- .../{toggleThinger.md => netSplitter.md} | 2 +- .../assets/opencomputers/lang/en_US.lang | 4 +-- .../opencomputers/recipes/default.recipes | 5 ++++ ...{ToggleThingerOn.png => NetSplitterOn.png} | Bin ...gleThingerSide.png => NetSplitterSide.png} | Bin ...oggleThingerTop.png => NetSplitterTop.png} | Bin src/main/scala/li/cil/oc/Constants.scala | 2 +- .../li/cil/oc/client/PacketHandler.scala | 6 ++--- src/main/scala/li/cil/oc/client/Proxy.scala | 2 +- .../scala/li/cil/oc/client/Textures.scala | 2 +- .../cil/oc/client/renderer/PetRenderer.scala | 5 +++- .../client/renderer/block/BlockRenderer.scala | 24 +++++++++--------- ...{ToggleThinger.scala => NetSplitter.scala} | 2 +- ...nderer.scala => NetSplitterRenderer.scala} | 20 +++++++-------- .../scala/li/cil/oc/common/PacketType.scala | 2 +- src/main/scala/li/cil/oc/common/Proxy.scala | 6 ++--- ...{ToggleThinger.scala => NetSplitter.scala} | 24 +++++++++--------- .../scala/li/cil/oc/common/init/Blocks.scala | 4 +-- ...{ToggleThinger.scala => NetSplitter.scala} | 8 +++--- .../scala/li/cil/oc/server/PacketSender.scala | 4 +-- 22 files changed, 67 insertions(+), 57 deletions(-) rename src/main/resources/assets/opencomputers/doc/en_US/block/{toggleThinger.md => netSplitter.md} (93%) rename src/main/resources/assets/opencomputers/textures/blocks/{ToggleThingerOn.png => NetSplitterOn.png} (100%) rename src/main/resources/assets/opencomputers/textures/blocks/{ToggleThingerSide.png => NetSplitterSide.png} (100%) rename src/main/resources/assets/opencomputers/textures/blocks/{ToggleThingerTop.png => NetSplitterTop.png} (100%) rename src/main/scala/li/cil/oc/client/renderer/block/{ToggleThinger.scala => NetSplitter.scala} (99%) rename src/main/scala/li/cil/oc/client/renderer/tileentity/{ToggleThingerRenderer.scala => NetSplitterRenderer.scala} (83%) rename src/main/scala/li/cil/oc/common/block/{ToggleThinger.scala => NetSplitter.scala} (73%) rename src/main/scala/li/cil/oc/common/tileentity/{ToggleThinger.scala => NetSplitter.scala} (88%) diff --git a/assets/blocks.psd b/assets/blocks.psd index 6c585ac8ef8af627fc37bac68dd792efe5e9c830..950f8f81331487bfc7af6950f7a79978de23883f 100644 GIT binary patch delta 330 zcmccgitF10t_ccE=XY&XGGb&}=(stI@f#z%xs|b*m8r?(U}k$5d-F_YO(q3rBUcks zLsutbS0f`=V?#p=3m^t^O)OkYjoeI~CKn1QY~INl$;jw3**#BTvoZVI%*p(&?O<*U z%&f@=_>XT^D6G+EWY|1s!DVLNSr$&7zAQ`(K)@Kcxp7Gx)Kr)0w9-8gUdC+hxmminMt}2+MVFa*=U6y-`m!)F00Cpl=Eh~AjFTrUe08RVwNp^Dm4VlgI7yQmKnoloKWNcu+njv`OcAVklgLkc_f9__KneIKG z(T34zddGZ5Rbe9r29VV`m6<6(%UOUHTTMSOpK%eZ;ByDltJ59lFt)p}W#ktWq!vLG zmgZ#w6$$_`8$$*|K0^TzrZN20+$7M*lb#X7ChSibs6L9>r*c< ed2BzO!xX|a{j?>M$o2t(jB+ diff --git a/src/main/resources/assets/opencomputers/doc/en_US/block/index.md b/src/main/resources/assets/opencomputers/doc/en_US/block/index.md index 4aed941c8..a33f40557 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/block/index.md @@ -38,7 +38,7 @@ Keep in mind that some of these may not be available, depending on the recipe se ## Networking * [Access Point](accessPoint.md) * [Cable](cable.md) -* [Net Splitter](toggleThinger.md) +* [Net Splitter](netSplitter.md) * [Switch](switch.md) ## Power management diff --git a/src/main/resources/assets/opencomputers/doc/en_US/block/toggleThinger.md b/src/main/resources/assets/opencomputers/doc/en_US/block/netSplitter.md similarity index 93% rename from src/main/resources/assets/opencomputers/doc/en_US/block/toggleThinger.md rename to src/main/resources/assets/opencomputers/doc/en_US/block/netSplitter.md index 91c418962..230e4484f 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/block/toggleThinger.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/block/netSplitter.md @@ -1,6 +1,6 @@ # Net Splitter -![*.net *.split](oredict:oc:toggleThinger) +![*.net *.split](oredict:oc:netSplitter) The net splitter is a device that allows controlling connectivity between subnetworks. Unlike the [switch](switch.md) or [power converter](powerConverter.md) it directly connects adjacent subnetworks, i.e. components can be accessed. Each side's connectivity can be toggled using a wrench (e.g. the [scrench](../item/wrench.md)). When a redstone signal is applied to the net splitter, all sides' connectivity is inverted. diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index ddee8cb38..51d960d4a 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -36,7 +36,7 @@ tile.oc.screen2.name=Screen (Tier 2) tile.oc.screen3.name=Screen (Tier 3) tile.oc.serverRack.name=Server Rack tile.oc.switch.name=Switch -tile.oc.toggleThinger.name=Net Splitter +tile.oc.netSplitter.name=Net Splitter tile.oc.waypoint.name=Waypoint # Items @@ -332,7 +332,7 @@ oc:tooltip.TabletCase=Basic case for tablets. Place it into the assembler to add oc:tooltip.Terminal=Allows controlling a server remotely, as long as you are in range of it. Acts like a portable screen and keyboard. Shift-right-click a server in a server rack to bind the terminal to it. oc:tooltip.TexturePicker=This tool allows showing a string describing a block's surface, for use in 3D printer shape definitions. Totally not texture names, nope. No sir. oc:tooltip.Tier=§8Tier %s -oc:tooltip.ToggleThinger=Acts as a dynamic connector. Connectivity of each side can be toggled by hitting it with a wrench. Connectivity of all sides can be inverted by applying a redstone signal. +oc:tooltip.NetSplitter=Acts as a dynamic connector. Connectivity of each side can be toggled by hitting it with a wrench. Connectivity of all sides can be inverted by applying a redstone signal. oc:tooltip.TooLong=Hold [§f%s§7] for a detailed tooltip. oc:tooltip.Transistor=A basic element in most other computer parts. It's a bit twisted, but it does the job. oc:tooltip.UpgradeAngel=Allows robots to place blocks in thin air, even if there is no point of reference. diff --git a/src/main/resources/assets/opencomputers/recipes/default.recipes b/src/main/resources/assets/opencomputers/recipes/default.recipes index c4dc61add..be4e6880f 100644 --- a/src/main/resources/assets/opencomputers/recipes/default.recipes +++ b/src/main/resources/assets/opencomputers/recipes/default.recipes @@ -576,6 +576,11 @@ motionSensor { [daylightDetector, "oc:cpu2", daylightDetector] [ingotGold, "oc:materialCircuitBoardPrinted", ingotGold]] } +netSplitter { + input: [[ingotIron, "oc:cable", ingotIron] + ["oc:cable", craftingPiston, "oc:cable"] + [ingotIron, "oc:materialCircuitBoardPrinted", ingotIron]] +} printer { input: [[ingotIron, hopper, ingotIron] [craftingPiston, "oc:circuitChip3", craftingPiston] diff --git a/src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerOn.png b/src/main/resources/assets/opencomputers/textures/blocks/NetSplitterOn.png similarity index 100% rename from src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerOn.png rename to src/main/resources/assets/opencomputers/textures/blocks/NetSplitterOn.png diff --git a/src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerSide.png b/src/main/resources/assets/opencomputers/textures/blocks/NetSplitterSide.png similarity index 100% rename from src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerSide.png rename to src/main/resources/assets/opencomputers/textures/blocks/NetSplitterSide.png diff --git a/src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerTop.png b/src/main/resources/assets/opencomputers/textures/blocks/NetSplitterTop.png similarity index 100% rename from src/main/resources/assets/opencomputers/textures/blocks/ToggleThingerTop.png rename to src/main/resources/assets/opencomputers/textures/blocks/NetSplitterTop.png diff --git a/src/main/scala/li/cil/oc/Constants.scala b/src/main/scala/li/cil/oc/Constants.scala index d65482adc..ff3ecc7c4 100644 --- a/src/main/scala/li/cil/oc/Constants.scala +++ b/src/main/scala/li/cil/oc/Constants.scala @@ -38,7 +38,7 @@ object Constants { final val ScreenTier3 = "screen3" final val ServerRack = "serverRack" final val Switch = "switch" - final val ToggleThinger = "toggleThinger" + final val NetSplitter = "netSplitter" final val Waypoint = "waypoint" def Case(tier: Int) = ItemUtils.caseNameWithTierSuffix("case", tier) diff --git a/src/main/scala/li/cil/oc/client/PacketHandler.scala b/src/main/scala/li/cil/oc/client/PacketHandler.scala index b9b514010..9cf57901b 100644 --- a/src/main/scala/li/cil/oc/client/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/client/PacketHandler.scala @@ -56,6 +56,7 @@ object PacketHandler extends CommonPacketHandler { case PacketType.HologramTranslation => onHologramPositionOffsetY(p) case PacketType.HologramValues => onHologramValues(p) case PacketType.LootDisk => onLootDisk(p) + case PacketType.NetSplitterState => onNetSplitterState(p) case PacketType.ParticleEffect => onParticleEffect(p) case PacketType.PetVisibility => onPetVisibility(p) case PacketType.PowerState => onPowerState(p) @@ -74,7 +75,6 @@ object PacketHandler extends CommonPacketHandler { case PacketType.TextBufferInit => onTextBufferInit(p) case PacketType.TextBufferPowerChange => onTextBufferPowerChange(p) case PacketType.TextBufferMulti => onTextBufferMulti(p) - case PacketType.ToggleThingerState => onToggleThingerState(p) case PacketType.ScreenTouchMode => onScreenTouchMode(p) case PacketType.ServerPresence => onServerPresence(p) case PacketType.Sound => onSound(p) @@ -592,8 +592,8 @@ object PacketHandler extends CommonPacketHandler { buffer.rawSetForeground(col, row, color) } - def onToggleThingerState(p: PacketParser) = - p.readTileEntity[ToggleThinger]() match { + def onNetSplitterState(p: PacketParser) = + p.readTileEntity[NetSplitter]() match { case Some(t) => t.isInverted = p.readBoolean() t.openSides = t.uncompressSides(p.readByte()) diff --git a/src/main/scala/li/cil/oc/client/Proxy.scala b/src/main/scala/li/cil/oc/client/Proxy.scala index 6d61adb77..aa96dcb65 100644 --- a/src/main/scala/li/cil/oc/client/Proxy.scala +++ b/src/main/scala/li/cil/oc/client/Proxy.scala @@ -69,7 +69,7 @@ private[oc] class Proxy extends CommonProxy { ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.AccessPoint], SwitchRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.RobotProxy], RobotRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer) - ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.ToggleThinger], ToggleThingerRenderer) + ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.NetSplitter], NetSplitterRenderer) MinecraftForgeClient.registerItemRenderer(Items.get(Constants.ItemName.Floppy).createItemStack(1).getItem, ItemRenderer) MinecraftForgeClient.registerItemRenderer(Items.get(Constants.BlockName.Print).createItemStack(1).getItem, ItemRenderer) diff --git a/src/main/scala/li/cil/oc/client/Textures.scala b/src/main/scala/li/cil/oc/client/Textures.scala index 8c8adaa77..6e21bbc54 100644 --- a/src/main/scala/li/cil/oc/client/Textures.scala +++ b/src/main/scala/li/cil/oc/client/Textures.scala @@ -97,7 +97,7 @@ object Textures { var iconSideActivity: IIcon = _ } - object ToggleThinger { + object NetSplitter { var iconOn: IIcon = _ } 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 16d7e6103..cd0768b64 100644 --- a/src/main/scala/li/cil/oc/client/renderer/PetRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/PetRenderer.scala @@ -31,7 +31,10 @@ object PetRenderer { "DaKaTotal" ->(0.5, 0.7, 1.0), "MichiyoRavencroft" ->(1.0, 0.0, 0.0), "Vexatos" ->(0.18, 0.95, 0.922), - "StoneNomad" ->(0.8, 0.77, 0.75) + "StoneNomad" ->(0.8, 0.77, 0.75), + "LizzyTheSiren" ->(0.3, 0.3, 1.0), + "vifino" ->(0.2, 1.0, 0.1), + "Izaya" ->(0.0, 0.2, 0.6) ) private val petLocations = com.google.common.cache.CacheBuilder.newBuilder(). diff --git a/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala index 90098f754..782c7dcc9 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala @@ -25,14 +25,14 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { val renderer = patchedRenderer(realRenderer, block) GL11.glPushMatrix() block match { - case assembler: Assembler => + case _: Assembler => GL11.glTranslatef(-0.5f, -0.5f, -0.5f) Tessellator.instance.startDrawingQuads() Assembler.render(block, metadata, renderer) Tessellator.instance.draw() RenderState.checkError(getClass.getName + ".renderInventoryBlock: assembler") - case cable: Cable => + case _: Cable => GL11.glScalef(1.6f, 1.6f, 1.6f) GL11.glTranslatef(-0.5f, -0.5f, -0.5f) Tessellator.instance.startDrawingQuads() @@ -40,33 +40,33 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { Tessellator.instance.draw() RenderState.checkError(getClass.getName + ".renderInventoryBlock: cable") - case hologram: Hologram => + case _: Hologram => GL11.glTranslatef(-0.5f, -0.5f, -0.5f) Tessellator.instance.startDrawingQuads() Hologram.render(block, metadata, renderer) Tessellator.instance.draw() RenderState.checkError(getClass.getName + ".renderInventoryBlock: hologram") - case printer: Printer => + case _: Printer => GL11.glTranslatef(-0.5f, -0.5f, -0.5f) Tessellator.instance.startDrawingQuads() Printer.render(block, metadata, renderer) Tessellator.instance.draw() RenderState.checkError(getClass.getName + ".renderInventoryBlock: printer") - case proxy@(_: RobotProxy | _: RobotAfterimage) => + case _@(_: RobotProxy | _: RobotAfterimage) => GL11.glScalef(1.5f, 1.5f, 1.5f) GL11.glTranslatef(-0.5f, -0.4f, -0.5f) RobotRenderer.renderChassis() RenderState.checkError(getClass.getName + ".renderInventoryBlock: robot") - case toggle: ToggleThinger => + case _: NetSplitter => GL11.glTranslatef(-0.5f, -0.5f, -0.5f) Tessellator.instance.startDrawingQuads() - ToggleThinger.render(block, metadata, renderer) + NetSplitter.render(block, metadata, renderer) Tessellator.instance.draw() - RenderState.checkError(getClass.getName + ".renderInventoryBlock: toggleThinger") + RenderState.checkError(getClass.getName + ".renderInventoryBlock: splitter") case _ => block match { case simple: SimpleBlock => @@ -139,10 +139,10 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { RenderState.checkError(getClass.getName + ".renderWorldBlock: rack") true - case toggle: tileentity.ToggleThinger => - ToggleThinger.render(ForgeDirection.VALID_DIRECTIONS.map(toggle.isSideOpen), block, x, y, z, renderer) + case splitter: tileentity.NetSplitter => + NetSplitter.render(ForgeDirection.VALID_DIRECTIONS.map(splitter.isSideOpen), block, x, y, z, renderer) - RenderState.checkError(getClass.getName + ".renderWorldBlock: toggleThinger") + RenderState.checkError(getClass.getName + ".renderWorldBlock: splitter") true case _ => @@ -158,7 +158,7 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { block.isInstanceOf[Hologram] || block.isInstanceOf[Printer] || block.isInstanceOf[Print] || - block.isInstanceOf[ToggleThinger] + block.isInstanceOf[NetSplitter] // The texture flip this works around only seems to occur for blocks with custom block renderers? def patchedRenderer(renderer: RenderBlocks, block: Block) = diff --git a/src/main/scala/li/cil/oc/client/renderer/block/ToggleThinger.scala b/src/main/scala/li/cil/oc/client/renderer/block/NetSplitter.scala similarity index 99% rename from src/main/scala/li/cil/oc/client/renderer/block/ToggleThinger.scala rename to src/main/scala/li/cil/oc/client/renderer/block/NetSplitter.scala index 4b783af5c..a7f227d3f 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/ToggleThinger.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/NetSplitter.scala @@ -4,7 +4,7 @@ import net.minecraft.block.Block import net.minecraft.client.renderer.RenderBlocks import net.minecraftforge.common.util.ForgeDirection -object ToggleThinger { +object NetSplitter { def render(openSides: Array[Boolean], block: Block, x: Int, y: Int, z: Int, renderer: RenderBlocks) { val previousRenderAllFaces = renderer.renderAllFaces renderer.renderAllFaces = true diff --git a/src/main/scala/li/cil/oc/client/renderer/tileentity/ToggleThingerRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/tileentity/NetSplitterRenderer.scala similarity index 83% rename from src/main/scala/li/cil/oc/client/renderer/tileentity/ToggleThingerRenderer.scala rename to src/main/scala/li/cil/oc/client/renderer/tileentity/NetSplitterRenderer.scala index 5b919f433..b0eeca6de 100644 --- a/src/main/scala/li/cil/oc/client/renderer/tileentity/ToggleThingerRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/tileentity/NetSplitterRenderer.scala @@ -10,12 +10,12 @@ import net.minecraft.tileentity.TileEntity import net.minecraftforge.common.util.ForgeDirection import org.lwjgl.opengl.GL11 -object ToggleThingerRenderer extends TileEntitySpecialRenderer { +object NetSplitterRenderer extends TileEntitySpecialRenderer { override def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, f: Float) { RenderState.checkError(getClass.getName + ".renderTileEntityAt: entering (aka: wasntme)") - val toggleThinger = tileEntity.asInstanceOf[tileentity.ToggleThinger] - if (toggleThinger.openSides.contains(!toggleThinger.isInverted)) { + val splitter = tileEntity.asInstanceOf[tileentity.NetSplitter] + if (splitter.openSides.contains(!splitter.isInverted)) { GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) RenderState.disableLighting() @@ -31,44 +31,44 @@ object ToggleThingerRenderer extends TileEntitySpecialRenderer { val t = Tessellator.instance t.startDrawingQuads() - val sideActivity = Textures.ToggleThinger.iconOn + val sideActivity = Textures.NetSplitter.iconOn - if (toggleThinger.isSideOpen(ForgeDirection.DOWN)) { + if (splitter.isSideOpen(ForgeDirection.DOWN)) { t.addVertexWithUV(0, 1, 0, sideActivity.getMaxU, sideActivity.getMinV) t.addVertexWithUV(1, 1, 0, sideActivity.getMinU, sideActivity.getMinV) t.addVertexWithUV(1, 1, 1, sideActivity.getMinU, sideActivity.getMaxV) t.addVertexWithUV(0, 1, 1, sideActivity.getMaxU, sideActivity.getMaxV) } - if (toggleThinger.isSideOpen(ForgeDirection.UP)) { + if (splitter.isSideOpen(ForgeDirection.UP)) { t.addVertexWithUV(0, 0, 0, sideActivity.getMaxU, sideActivity.getMaxV) t.addVertexWithUV(0, 0, 1, sideActivity.getMaxU, sideActivity.getMinV) t.addVertexWithUV(1, 0, 1, sideActivity.getMinU, sideActivity.getMinV) t.addVertexWithUV(1, 0, 0, sideActivity.getMinU, sideActivity.getMaxV) } - if (toggleThinger.isSideOpen(ForgeDirection.NORTH)) { + if (splitter.isSideOpen(ForgeDirection.NORTH)) { t.addVertexWithUV(1, 1, 0, sideActivity.getMinU, sideActivity.getMaxV) t.addVertexWithUV(0, 1, 0, sideActivity.getMaxU, sideActivity.getMaxV) t.addVertexWithUV(0, 0, 0, sideActivity.getMaxU, sideActivity.getMinV) t.addVertexWithUV(1, 0, 0, sideActivity.getMinU, sideActivity.getMinV) } - if (toggleThinger.isSideOpen(ForgeDirection.SOUTH)) { + if (splitter.isSideOpen(ForgeDirection.SOUTH)) { t.addVertexWithUV(0, 1, 1, sideActivity.getMinU, sideActivity.getMaxV) t.addVertexWithUV(1, 1, 1, sideActivity.getMaxU, sideActivity.getMaxV) t.addVertexWithUV(1, 0, 1, sideActivity.getMaxU, sideActivity.getMinV) t.addVertexWithUV(0, 0, 1, sideActivity.getMinU, sideActivity.getMinV) } - if (toggleThinger.isSideOpen(ForgeDirection.WEST)) { + if (splitter.isSideOpen(ForgeDirection.WEST)) { t.addVertexWithUV(0, 1, 0, sideActivity.getMinU, sideActivity.getMaxV) t.addVertexWithUV(0, 1, 1, sideActivity.getMaxU, sideActivity.getMaxV) t.addVertexWithUV(0, 0, 1, sideActivity.getMaxU, sideActivity.getMinV) t.addVertexWithUV(0, 0, 0, sideActivity.getMinU, sideActivity.getMinV) } - if (toggleThinger.isSideOpen(ForgeDirection.EAST)) { + if (splitter.isSideOpen(ForgeDirection.EAST)) { t.addVertexWithUV(1, 1, 1, sideActivity.getMinU, sideActivity.getMaxV) t.addVertexWithUV(1, 1, 0, sideActivity.getMaxU, sideActivity.getMaxV) t.addVertexWithUV(1, 0, 0, sideActivity.getMaxU, sideActivity.getMinV) diff --git a/src/main/scala/li/cil/oc/common/PacketType.scala b/src/main/scala/li/cil/oc/common/PacketType.scala index 2d90662f0..770e3c389 100644 --- a/src/main/scala/li/cil/oc/common/PacketType.scala +++ b/src/main/scala/li/cil/oc/common/PacketType.scala @@ -50,7 +50,7 @@ object PacketType extends Enumeration { TextBufferMultiRawSetBackground, TextBufferMultiRawSetForeground, TextBufferPowerChange, - ToggleThingerState, + NetSplitterState, ScreenTouchMode, ServerPresence, Sound, diff --git a/src/main/scala/li/cil/oc/common/Proxy.scala b/src/main/scala/li/cil/oc/common/Proxy.scala index a7a6b1e89..4e934476a 100644 --- a/src/main/scala/li/cil/oc/common/Proxy.scala +++ b/src/main/scala/li/cil/oc/common/Proxy.scala @@ -119,9 +119,9 @@ class Proxy { // Example usage: OpenComputers.ID + ":tabletCase" -> "tabletCase1" private val itemRenames = Map[String, String]( - OpenComputers.ID + ":microcontrollerCase" -> "microcontrollerCase1", - OpenComputers.ID + ":droneCase" -> "droneCase1", - OpenComputers.ID + ":tabletCase" -> "tabletCase1" + OpenComputers.ID + ":microcontrollerCase" -> Constants.ItemName.MicrocontrollerCaseTier1, + OpenComputers.ID + ":droneCase" -> Constants.ItemName.DroneCaseTier1, + OpenComputers.ID + ":tabletCase" -> Constants.ItemName.TabletCaseTier1 ) def missingMappings(e: FMLMissingMappingsEvent) { diff --git a/src/main/scala/li/cil/oc/common/block/ToggleThinger.scala b/src/main/scala/li/cil/oc/common/block/NetSplitter.scala similarity index 73% rename from src/main/scala/li/cil/oc/common/block/ToggleThinger.scala rename to src/main/scala/li/cil/oc/common/block/NetSplitter.scala index fa66fba1f..64892defa 100644 --- a/src/main/scala/li/cil/oc/common/block/ToggleThinger.scala +++ b/src/main/scala/li/cil/oc/common/block/NetSplitter.scala @@ -13,27 +13,27 @@ import net.minecraft.world.IBlockAccess import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection -class ToggleThinger extends RedstoneAware { +class NetSplitter extends RedstoneAware { override protected def customTextures = Array( - Some("ToggleThingerTop"), - Some("ToggleThingerTop"), - Some("ToggleThingerSide"), - Some("ToggleThingerSide"), - Some("ToggleThingerSide"), - Some("ToggleThingerSide") + Some("NetSplitterTop"), + Some("NetSplitterTop"), + Some("NetSplitterSide"), + Some("NetSplitterSide"), + Some("NetSplitterSide"), + Some("NetSplitterSide") ) @SideOnly(Side.CLIENT) override def registerBlockIcons(iconRegister: IIconRegister): Unit = { super.registerBlockIcons(iconRegister) - Textures.ToggleThinger.iconOn = iconRegister.registerIcon(Settings.resourceDomain + ":ToggleThingerOn") + Textures.NetSplitter.iconOn = iconRegister.registerIcon(Settings.resourceDomain + ":NetSplitterOn") } override def isSideSolid(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection): Boolean = false // ----------------------------------------------------------------------- // - override def createTileEntity(world: World, metadata: Int) = new tileentity.ToggleThinger() + override def createTileEntity(world: World, metadata: Int) = new tileentity.NetSplitter() // ----------------------------------------------------------------------- // @@ -41,10 +41,10 @@ class ToggleThinger extends RedstoneAware { if (Wrench.holdsApplicableWrench(player, BlockPosition(x, y, z))) { val sideToToggle = if (player.isSneaking) side.getOpposite else side world.getTileEntity(x, y, z) match { - case toggleThinger: tileentity.ToggleThinger => + case splitter: tileentity.NetSplitter => if (!world.isRemote) { - val oldValue = toggleThinger.openSides(sideToToggle.ordinal()) - toggleThinger.setSideOpen(sideToToggle, !oldValue) + val oldValue = splitter.openSides(sideToToggle.ordinal()) + splitter.setSideOpen(sideToToggle, !oldValue) } true case _ => false diff --git a/src/main/scala/li/cil/oc/common/init/Blocks.scala b/src/main/scala/li/cil/oc/common/init/Blocks.scala index 5c86471d7..7acf21d27 100644 --- a/src/main/scala/li/cil/oc/common/init/Blocks.scala +++ b/src/main/scala/li/cil/oc/common/init/Blocks.scala @@ -34,7 +34,7 @@ object Blocks { GameRegistry.registerTileEntity(classOf[tileentity.Switch], Settings.namespace + "switch") GameRegistry.registerTileEntity(classOf[tileentity.Screen], Settings.namespace + "screen") GameRegistry.registerTileEntity(classOf[tileentity.ServerRack], Settings.namespace + "serverRack") - GameRegistry.registerTileEntity(classOf[tileentity.ToggleThinger], Settings.namespace + "toggleThinger") + GameRegistry.registerTileEntity(classOf[tileentity.NetSplitter], Settings.namespace + "netSplitter") GameRegistry.registerTileEntity(classOf[tileentity.Waypoint], Settings.namespace + "waypoint") Recipes.addBlock(new AccessPoint(), Constants.BlockName.AccessPoint, "oc:accessPoint") @@ -78,6 +78,6 @@ object Blocks { Recipes.addBlock(new FakeEndstone(), Constants.BlockName.Endstone, "oc:stoneEndstone") // v1.5.14 - Recipes.addBlock(new ToggleThinger(), Constants.BlockName.ToggleThinger, "oc:toggleThinger") + Recipes.addBlock(new NetSplitter(), Constants.BlockName.NetSplitter, "oc:netSplitter") } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/ToggleThinger.scala b/src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala similarity index 88% rename from src/main/scala/li/cil/oc/common/tileentity/ToggleThinger.scala rename to src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala index 312a0d3c2..4922243a2 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/ToggleThinger.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala @@ -10,7 +10,7 @@ import li.cil.oc.server.{PacketSender => ServerPacketSender} import net.minecraft.nbt.NBTTagCompound import net.minecraftforge.common.util.ForgeDirection -class ToggleThinger extends traits.Environment with traits.RedstoneAware with api.network.SidedEnvironment { +class NetSplitter extends traits.Environment with traits.RedstoneAware with api.network.SidedEnvironment { private final val SideCount = ForgeDirection.VALID_DIRECTIONS.length val node = api.Network.newNode(this, Visibility.None). @@ -34,7 +34,8 @@ class ToggleThinger extends traits.Environment with traits.RedstoneAware with ap if (isServer) { node.remove() api.Network.joinOrCreateNetwork(this) - ServerPacketSender.sendToggleThingerState(this) + ServerPacketSender.sendNetSplitterState(this) + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "tile.piston.out", 0.5f, world.rand.nextFloat() * 0.25f + 0.7f) } else { world.markBlockForUpdate(x, y, z) @@ -67,7 +68,8 @@ class ToggleThinger extends traits.Environment with traits.RedstoneAware with ap if (isServer) { node.remove() api.Network.joinOrCreateNetwork(this) - ServerPacketSender.sendToggleThingerState(this) + ServerPacketSender.sendNetSplitterState(this) + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "tile.piston.in", 0.5f, world.rand.nextFloat() * 0.25f + 0.7f) } else { world.markBlockForUpdate(x, y, z) diff --git a/src/main/scala/li/cil/oc/server/PacketSender.scala b/src/main/scala/li/cil/oc/server/PacketSender.scala index 92ccccd86..df0ba86e4 100644 --- a/src/main/scala/li/cil/oc/server/PacketSender.scala +++ b/src/main/scala/li/cil/oc/server/PacketSender.scala @@ -529,8 +529,8 @@ object PacketSender { pb.sendToPlayersNearHost(host) } - def sendToggleThingerState(t: tileentity.ToggleThinger): Unit = { - val pb = new SimplePacketBuilder(PacketType.ToggleThingerState) + def sendNetSplitterState(t: tileentity.NetSplitter): Unit = { + val pb = new SimplePacketBuilder(PacketType.NetSplitterState) pb.writeTileEntity(t) pb.writeBoolean(t.isInverted) From 5daac497fad3a9e8918f0421d74425900481ef7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 18:22:47 +0200 Subject: [PATCH 23/42] okthen intellij --- .../li/cil/oc/common/tileentity/traits/power/Common.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala index 98618ae27..744c2497d 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala @@ -38,7 +38,7 @@ trait Common extends TileEntity { !Settings.get.ignorePower && side != null && side != ForgeDirection.UNKNOWN && (if (isClient) hasConnector(side) else connector(side).isDefined) - def tryChangeBuffer(side: ForgeDirection, amount: Double, doReceive: Boolean = true) = + def tryChangeBuffer(side: ForgeDirection, amount: Double, doReceive: Boolean = true): Double = if (isClient || Settings.get.ignorePower) 0 else connector(side) match { case Some(node) => @@ -48,14 +48,14 @@ trait Common extends TileEntity { case _ => 0 } - def globalBuffer(side: ForgeDirection) = + def globalBuffer(side: ForgeDirection): Double = if (isClient) 0 else connector(side) match { case Some(node) => node.globalBuffer case _ => 0 } - def globalBufferSize(side: ForgeDirection) = + def globalBufferSize(side: ForgeDirection): Double = if (isClient) 0 else connector(side) match { case Some(node) => node.globalBufferSize From df3b5337a2fca3965edc4470153d72dd0110ae7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 18:33:05 +0200 Subject: [PATCH 24/42] Building a better tomorrow. --- src/main/scala/li/cil/oc/common/tileentity/AccessPoint.scala | 2 +- src/main/scala/li/cil/oc/common/tileentity/Assembler.scala | 2 +- src/main/scala/li/cil/oc/common/tileentity/Case.scala | 2 +- src/main/scala/li/cil/oc/common/tileentity/Charger.scala | 2 +- src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala | 2 +- .../scala/li/cil/oc/common/tileentity/Microcontroller.scala | 2 +- src/main/scala/li/cil/oc/common/tileentity/PowerConverter.scala | 2 +- src/main/scala/li/cil/oc/common/tileentity/ServerRack.scala | 2 +- .../scala/li/cil/oc/common/tileentity/traits/power/Common.scala | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/AccessPoint.scala b/src/main/scala/li/cil/oc/common/tileentity/AccessPoint.scala index 8abbb7ff5..8cc3586e4 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/AccessPoint.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/AccessPoint.scala @@ -35,7 +35,7 @@ class AccessPoint extends Switch with WirelessEndpoint with traits.PowerAcceptor case _ => None } - override protected def energyThroughput = Settings.get.accessPointRate + override def energyThroughput = Settings.get.accessPointRate // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala index e8a4331ec..eaf66bb0f 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala @@ -41,7 +41,7 @@ class Assembler extends traits.Environment with traits.PowerAcceptor with traits override protected def connector(side: ForgeDirection) = Option(if (side != ForgeDirection.UP) node else null) - override protected def energyThroughput = Settings.get.assemblerRate + override def energyThroughput = Settings.get.assemblerRate override def currentState = { if (isAssembling) util.EnumSet.of(traits.State.IsWorking) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Case.scala b/src/main/scala/li/cil/oc/common/tileentity/Case.scala index ade998ca3..2c37414f2 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Case.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Case.scala @@ -29,7 +29,7 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with override protected def connector(side: ForgeDirection) = Option(if (side != facing && machine != null) machine.node.asInstanceOf[Connector] else null) - override protected def energyThroughput = Settings.get.caseRate(tier) + override def energyThroughput = Settings.get.caseRate(tier) override def getWorld = world diff --git a/src/main/scala/li/cil/oc/common/tileentity/Charger.scala b/src/main/scala/li/cil/oc/common/tileentity/Charger.scala index ee1f29ac7..728ee3d4f 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Charger.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Charger.scala @@ -44,7 +44,7 @@ class Charger extends traits.Environment with traits.PowerAcceptor with traits.R override protected def connector(side: ForgeDirection) = Option(if (side != facing) node else null) - override protected def energyThroughput = Settings.get.chargerRate + override def energyThroughput = Settings.get.chargerRate override def currentState = { // TODO Refine to only report working if present robots/drones actually *need* power. diff --git a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala index 69afe5996..78121cbb2 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -51,7 +51,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra override protected def connector(side: ForgeDirection) = Option(if (side != ForgeDirection.UP) node else null) - override protected def energyThroughput = Settings.get.disassemblerRate + override def energyThroughput = Settings.get.disassemblerRate override def currentState = { if (isActive) util.EnumSet.of(traits.State.IsWorking) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Microcontroller.scala b/src/main/scala/li/cil/oc/common/tileentity/Microcontroller.scala index d7de95eb5..7487ff5a9 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Microcontroller.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Microcontroller.scala @@ -57,7 +57,7 @@ class Microcontroller extends traits.PowerAcceptor with traits.Hub with traits.C override protected def connector(side: ForgeDirection) = Option(if (side != facing) snooperNode else null) - override protected def energyThroughput = Settings.get.caseRate(Tier.One) + override def energyThroughput = Settings.get.caseRate(Tier.One) override def getWorld = world diff --git a/src/main/scala/li/cil/oc/common/tileentity/PowerConverter.scala b/src/main/scala/li/cil/oc/common/tileentity/PowerConverter.scala index 649f641fd..37ed5e7bd 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/PowerConverter.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/PowerConverter.scala @@ -17,7 +17,7 @@ class PowerConverter extends traits.PowerAcceptor with traits.Environment with t override protected def connector(side: ForgeDirection) = Option(node) - override protected def energyThroughput = Settings.get.powerConverterRate + override def energyThroughput = Settings.get.powerConverterRate override def canUpdate = isServer } diff --git a/src/main/scala/li/cil/oc/common/tileentity/ServerRack.scala b/src/main/scala/li/cil/oc/common/tileentity/ServerRack.scala index d68c27e0c..06eebf279 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/ServerRack.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/ServerRack.scala @@ -61,7 +61,7 @@ class ServerRack extends traits.PowerAcceptor with traits.Hub with traits.PowerB override protected def connector(side: ForgeDirection) = Option(if (side != facing) sidedNode(side).asInstanceOf[Connector] else null) - override protected def energyThroughput = Settings.get.serverRackRate + override def energyThroughput = Settings.get.serverRackRate override def getWorld = world diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala index 744c2497d..0536d12b8 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala @@ -15,7 +15,7 @@ trait Common extends TileEntity { // ----------------------------------------------------------------------- // - protected def energyThroughput: Double + def energyThroughput: Double protected def tryAllSides(provider: (Double, ForgeDirection) => Double, ratio: Double) { // We make sure to only call this every `Settings.get.tickFrequency` ticks, From e21667d3d7ebc4f9f1fa2d190a0cca647e8c5dd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 18:38:52 +0200 Subject: [PATCH 25/42] Only for the @return comment. Too confusing. --- .../li/cil/oc/common/tileentity/traits/power/Common.scala | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala index 0536d12b8..d16dda0d3 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/power/Common.scala @@ -38,6 +38,14 @@ trait Common extends TileEntity { !Settings.get.ignorePower && side != null && side != ForgeDirection.UNKNOWN && (if (isClient) hasConnector(side) else connector(side).isDefined) + /** + * Tries to inject the specified amount of energy into the buffer via the specified side. + * + * @param side the side to change the buffer through. + * @param amount the amount to change the buffer by. + * @param doReceive whether to actually inject energy or only simulate it. + * @return the amount of energy that was actually injected. + */ def tryChangeBuffer(side: ForgeDirection, amount: Double, doReceive: Boolean = true): Double = if (isClient || Settings.get.ignorePower) 0 else connector(side) match { From 45e76ca4529a61a26e0b58e44aba519620811486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 18:50:43 +0200 Subject: [PATCH 26/42] String with Power Advantage integration. --- build.gradle | 7 ++- build.properties | 1 + .../scala/li/cil/oc/integration/Mods.scala | 3 ++ .../LightWeightPowerAcceptor.scala | 45 +++++++++++++++++++ .../poweradvantage/ModPowerAdvantage.scala | 12 +++++ 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/main/scala/li/cil/oc/integration/poweradvantage/LightWeightPowerAcceptor.scala create mode 100644 src/main/scala/li/cil/oc/integration/poweradvantage/ModPowerAdvantage.scala diff --git a/build.gradle b/build.gradle index 3731bd8d1..5eef1831d 100644 --- a/build.gradle +++ b/build.gradle @@ -78,6 +78,10 @@ repositories { name = "mobius" url = "http://mobiusstrip.eu/maven" } + maven { + name = "fallback" + url = "http://maven.cil.li/" + } /* maven { name = "BluePower" @@ -209,8 +213,9 @@ dependencies { provided name: 'Railcraft', version: config.rc.version, ext: 'jar' provided name: 'BloodMagic', version: config.bloodmagic.version, ext: 'jar' provided name: 'ExtraCells', version: config.ec.version, ext: 'jar' - */ + provided "cyano.poweradvantage:PowerAdvantage-API:${config.poweradvantage.version}" + compile 'com.google.code.findbugs:jsr305:1.3.9' // Annotations used by google libs. embedded files('libs/OpenComputers-JNLua.jar', 'libs/OpenComputers-LuaJ.jar') diff --git a/build.properties b/build.properties index 7687330f9..5a2735d96 100644 --- a/build.properties +++ b/build.properties @@ -33,6 +33,7 @@ mfr.cf=2229/626 mfr.version=[1.7.10]2.8.0RC8-86 nei.version=1.0.5.82 nek.version=1.0.0b35dev +poweradvantage.version=1.2.0 projred.version=4.7.0pre2.87 qmunitylib.version=0.1.105 rc.cf=2219/321 diff --git a/src/main/scala/li/cil/oc/integration/Mods.scala b/src/main/scala/li/cil/oc/integration/Mods.scala index 0f30f2094..65464e5b7 100644 --- a/src/main/scala/li/cil/oc/integration/Mods.scala +++ b/src/main/scala/li/cil/oc/integration/Mods.scala @@ -56,6 +56,7 @@ object Mods { val NotEnoughKeys = new SimpleMod(IDs.NotEnoughKeys) val OpenComputers = new SimpleMod(IDs.OpenComputers) val PortalGun = new SimpleMod(IDs.PortalGun) + val PowerAdvantage = new SimpleMod(IDs.PowerAdvantage, version = "@[1.2.0,)", providesPower = true) val ProjectRedCore = new SimpleMod(IDs.ProjectRedCore) val ProjectRedTransmission = new SimpleMod(IDs.ProjectRedTransmission) val Railcraft = new SimpleMod(IDs.Railcraft) @@ -105,6 +106,7 @@ object Mods { // integration.mystcraft.ModMystcraft, // integration.nek.ModNotEnoughKeys, // integration.projectred.ModProjectRed, + integration.poweradvantage.ModPowerAdvantage, // integration.railcraft.ModRailcraft, // integration.redlogic.ModRedLogic, // integration.stargatetech2.ModStargateTech2, @@ -190,6 +192,7 @@ object Mods { final val NotEnoughKeys = "notenoughkeys" final val OpenComputers = "OpenComputers" final val PortalGun = "PortalGun" + final val PowerAdvantage = "poweradvantage" final val ProjectRedCore = "ProjRed|Core" final val ProjectRedTransmission = "ProjRed|Transmission" final val Railcraft = "Railcraft" diff --git a/src/main/scala/li/cil/oc/integration/poweradvantage/LightWeightPowerAcceptor.scala b/src/main/scala/li/cil/oc/integration/poweradvantage/LightWeightPowerAcceptor.scala new file mode 100644 index 000000000..a18c463ab --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/poweradvantage/LightWeightPowerAcceptor.scala @@ -0,0 +1,45 @@ +package li.cil.oc.integration.poweradvantage + +import cyano.poweradvantage.api.ConduitType +import cyano.poweradvantage.api.modsupport.ILightWeightPowerAcceptor +import cyano.poweradvantage.api.modsupport.LightWeightPowerRegistry +import li.cil.oc.Settings +import li.cil.oc.common.block +import li.cil.oc.common.tileentity.traits.PowerAcceptor +import net.minecraft.block.Block +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.EnumFacing + +import scala.collection.convert.WrapAsScala._ + +object LightWeightPowerAcceptor extends ILightWeightPowerAcceptor { + def init(): Unit = { + for (b: Block <- Block.blockRegistry if b.isInstanceOf[block.traits.PowerAcceptor]) { + LightWeightPowerRegistry.registerLightWeightPowerAcceptor(b, this) + } + } + + def canAcceptEnergyType(powerType: ConduitType) = ConduitType.areSameType(powerType, "electricity") + + def getEnergyDemand(tileEntity: TileEntity, powerType: ConduitType) = tileEntity match { + case acceptor: PowerAcceptor if canAcceptEnergyType(powerType) => + EnumFacing.values().map(side => { + val capacity = (acceptor.globalBufferSize(side) / Settings.get.ratioRedstoneFlux).toInt + val stored = (acceptor.globalBuffer(side) / Settings.get.ratioRedstoneFlux).toInt + capacity - stored + }).max + case _ => 0 + } + + def addEnergy(tileEntity: TileEntity, amountAdded: Float, powerType: ConduitType) = tileEntity match { + case acceptor: PowerAcceptor if canAcceptEnergyType(powerType) => + var remainingEnergy = math.min(amountAdded, acceptor.energyThroughput.toFloat) + // .exists() for early exit. + EnumFacing.values().exists(side => { + remainingEnergy -= acceptor.tryChangeBuffer(side, remainingEnergy) + remainingEnergy <= 0 + }) + amountAdded - remainingEnergy + case _ => 0 + } +} diff --git a/src/main/scala/li/cil/oc/integration/poweradvantage/ModPowerAdvantage.scala b/src/main/scala/li/cil/oc/integration/poweradvantage/ModPowerAdvantage.scala new file mode 100644 index 000000000..c512283d8 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/poweradvantage/ModPowerAdvantage.scala @@ -0,0 +1,12 @@ +package li.cil.oc.integration.poweradvantage + +import li.cil.oc.integration.ModProxy +import li.cil.oc.integration.Mods + +object ModPowerAdvantage extends ModProxy { + override def getMod = Mods.PowerAdvantage + + override def initialize(): Unit = { + LightWeightPowerAcceptor.init() + } +} From 3b96f1ff6d2dde8100f5f30602a63a659fc2040e Mon Sep 17 00:00:00 2001 From: cyber01 Date: Sat, 11 Jul 2015 20:09:34 +0300 Subject: [PATCH 27/42] Add Netsplitter to RU lang --- .../assets/opencomputers/doc/ru_RU/block/index.md | 3 ++- .../assets/opencomputers/doc/ru_RU/block/netSplitter.md | 7 +++++++ src/main/resources/assets/opencomputers/lang/ru_RU.lang | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md index 0a412c466..e7f37a7b5 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md @@ -23,7 +23,6 @@ ### Расширения * [Адаптер](adapter.md) -* [Кабель](cable.md) * [Геоанализатор](geolyzer.md) * [Датчик движения](motionSensor.md) * [Редстоун I/O](redstone.md) @@ -38,6 +37,8 @@ ## Сеть * [Точка доступа](accessPoint.md) +* [Кабель](cable.md) +* [Сетевой сплиттер](netSplitter.md) * [Коммутатор](switch.md) ## Управление питанием diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md new file mode 100644 index 000000000..13a1efa6f --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md @@ -0,0 +1,7 @@ +# Сетевой переключатель/сплиттер (KVM) + +![*.net *.split](oredict:oc:netSplitter) + +Сетевой переключатель/сплиттер позволяет контролировать соединение между подсетями. В отличие от [коммутатора](switch.md) или [конвертера энергии](powerConverter.md) позволяет непосредственно соединить подсети, делая при этом доступными все компоненты. Соединение каждой стороны может быть переключено с помощью [ключа](../item/wrench.md). Когда редстоун сигнал подается на сетевой переключатель/сплиттер, соединения всех сторон инвертируются. + +Таким образом, этот блок может быть использован для переключения соединения определенных компонентов сети. Используйте [редстоун I/O](redstone.md) или [редстоун карты](../item/redstoneCard1.md) для автоматизации сетевого переключателя/сплиттера. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/lang/ru_RU.lang b/src/main/resources/assets/opencomputers/lang/ru_RU.lang index 1f3d94450..638931644 100644 --- a/src/main/resources/assets/opencomputers/lang/ru_RU.lang +++ b/src/main/resources/assets/opencomputers/lang/ru_RU.lang @@ -36,6 +36,7 @@ tile.oc.screen2.name=Монитор (2-ой уровень) tile.oc.screen3.name=Монитор (3-ий уровень) tile.oc.serverRack.name=Серверная стойка tile.oc.switch.name=Коммутатор +tile.oc.netSplitter.name=Сетевой переключатель/сплиттер tile.oc.waypoint.name=Путевая точка # Items @@ -330,6 +331,7 @@ oc:tooltip.TabletCase=Простой корпус для планшета. По oc:tooltip.Terminal=Позволяет дистанционно управлять сервером, пока вы находитесь в радиусе его действия. Действует как портативный дисплей с клавиатурой.[nl] Shift+ПКМ по серверу в стойке для привязки к нему терминала. oc:tooltip.TexturePicker=Простой инструмент, позволяющий узнать название текстуры блока, которое можно использовать в 3D печати. oc:tooltip.Tier=§8Уровень %s +oc:tooltip.NetSplitter=Работает как активных коннектор. Соединение каждой из сторон может быть переключено с помощью ключа. При подаче редстоун сигнала, все соединения инвертируются. oc:tooltip.TooLong=Удерживайте [§f%s§7], чтобы отобразить описание. oc:tooltip.Transistor=Базовый элемент для других частей компьютера. Он немного деформирован, но отлично выполняет свою работу. oc:tooltip.UpgradeAngel=Позволяет роботам размещать блоки в воздухе, даже если отсутствует точка опоры. From c3958ff6429a1e8f981ce0b91c9ad8e0ca1e5bb1 Mon Sep 17 00:00:00 2001 From: cyber01 Date: Sat, 11 Jul 2015 20:12:11 +0300 Subject: [PATCH 28/42] Correction --- .../resources/assets/opencomputers/doc/ru_RU/block/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md index e7f37a7b5..16169b6c5 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md @@ -38,7 +38,7 @@ ## Сеть * [Точка доступа](accessPoint.md) * [Кабель](cable.md) -* [Сетевой сплиттер](netSplitter.md) +* [Сетевой переключатель/сплиттер](netSplitter.md) * [Коммутатор](switch.md) ## Управление питанием From dd46e54cbd60e1b0af9ed0917543dc0ab6224332 Mon Sep 17 00:00:00 2001 From: cyber01 Date: Sat, 11 Jul 2015 20:28:06 +0300 Subject: [PATCH 29/42] Correction2 --- .../resources/assets/opencomputers/doc/ru_RU/block/index.md | 2 +- .../assets/opencomputers/doc/ru_RU/block/netSplitter.md | 6 +++--- src/main/resources/assets/opencomputers/lang/ru_RU.lang | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md index 16169b6c5..5a8833c46 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md @@ -38,7 +38,7 @@ ## Сеть * [Точка доступа](accessPoint.md) * [Кабель](cable.md) -* [Сетевой переключатель/сплиттер](netSplitter.md) +* [Сетевой переключатель](netSplitter.md) * [Коммутатор](switch.md) ## Управление питанием diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md index 13a1efa6f..78a3ed03a 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md @@ -1,7 +1,7 @@ -# Сетевой переключатель/сплиттер (KVM) +# Сетевой переключатель ![*.net *.split](oredict:oc:netSplitter) -Сетевой переключатель/сплиттер позволяет контролировать соединение между подсетями. В отличие от [коммутатора](switch.md) или [конвертера энергии](powerConverter.md) позволяет непосредственно соединить подсети, делая при этом доступными все компоненты. Соединение каждой стороны может быть переключено с помощью [ключа](../item/wrench.md). Когда редстоун сигнал подается на сетевой переключатель/сплиттер, соединения всех сторон инвертируются. +Сетевой переключатель позволяет контролировать соединение между подсетями. В отличие от [коммутатора](switch.md) или [конвертера энергии](powerConverter.md) позволяет непосредственно соединить подсети, делая при этом доступными все компоненты. Соединение каждой стороны переключается [ключем](../item/wrench.md). При подаче сигнала красного камня все соединения инвертируются. -Таким образом, этот блок может быть использован для переключения соединения определенных компонентов сети. Используйте [редстоун I/O](redstone.md) или [редстоун карты](../item/redstoneCard1.md) для автоматизации сетевого переключателя/сплиттера. \ No newline at end of file +Таким образом, этот блок может быть использован для переключения соединения определенных компонентов сети. Используйте [редстоун I/O](redstone.md) или [редстоун карты](../item/redstoneCard1.md) для автоматизации сетевого переключателя. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/lang/ru_RU.lang b/src/main/resources/assets/opencomputers/lang/ru_RU.lang index 638931644..658abedaf 100644 --- a/src/main/resources/assets/opencomputers/lang/ru_RU.lang +++ b/src/main/resources/assets/opencomputers/lang/ru_RU.lang @@ -36,7 +36,7 @@ tile.oc.screen2.name=Монитор (2-ой уровень) tile.oc.screen3.name=Монитор (3-ий уровень) tile.oc.serverRack.name=Серверная стойка tile.oc.switch.name=Коммутатор -tile.oc.netSplitter.name=Сетевой переключатель/сплиттер +tile.oc.netSplitter.name=Сетевой переключатель tile.oc.waypoint.name=Путевая точка # Items @@ -331,7 +331,7 @@ oc:tooltip.TabletCase=Простой корпус для планшета. По oc:tooltip.Terminal=Позволяет дистанционно управлять сервером, пока вы находитесь в радиусе его действия. Действует как портативный дисплей с клавиатурой.[nl] Shift+ПКМ по серверу в стойке для привязки к нему терминала. oc:tooltip.TexturePicker=Простой инструмент, позволяющий узнать название текстуры блока, которое можно использовать в 3D печати. oc:tooltip.Tier=§8Уровень %s -oc:tooltip.NetSplitter=Работает как активных коннектор. Соединение каждой из сторон может быть переключено с помощью ключа. При подаче редстоун сигнала, все соединения инвертируются. +oc:tooltip.NetSplitter=Работает как переключатель. Соединение каждой стороны переключается ключем. При подаче сигнала красного камня все соединения инвертируются. oc:tooltip.TooLong=Удерживайте [§f%s§7], чтобы отобразить описание. oc:tooltip.Transistor=Базовый элемент для других частей компьютера. Он немного деформирован, но отлично выполняет свою работу. oc:tooltip.UpgradeAngel=Позволяет роботам размещать блоки в воздухе, даже если отсутствует точка опоры. From 7366d8d07ad7c9197227bc3634a59cb8c310bb16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 19:55:54 +0200 Subject: [PATCH 30/42] Some more adjustments for 1.8. --- ...NetSplitterSide.png => netSplitter_side.png} | Bin .../{NetSplitterTop.png => netSplitter_top.png} | Bin .../netSplitter_on.png} | Bin src/main/scala/li/cil/oc/client/Textures.scala | 3 ++- .../renderer/block/ModelInitialization.scala | 5 +++++ .../renderer/block/NetSplitterModel.scala | 9 ++++++++- .../tileentity/NetSplitterRenderer.scala | 16 +++++++++------- 7 files changed, 24 insertions(+), 9 deletions(-) rename src/main/resources/assets/opencomputers/textures/blocks/{NetSplitterSide.png => netSplitter_side.png} (100%) rename src/main/resources/assets/opencomputers/textures/blocks/{NetSplitterTop.png => netSplitter_top.png} (100%) rename src/main/resources/assets/opencomputers/textures/blocks/{NetSplitterOn.png => overlay/netSplitter_on.png} (100%) diff --git a/src/main/resources/assets/opencomputers/textures/blocks/NetSplitterSide.png b/src/main/resources/assets/opencomputers/textures/blocks/netSplitter_side.png similarity index 100% rename from src/main/resources/assets/opencomputers/textures/blocks/NetSplitterSide.png rename to src/main/resources/assets/opencomputers/textures/blocks/netSplitter_side.png diff --git a/src/main/resources/assets/opencomputers/textures/blocks/NetSplitterTop.png b/src/main/resources/assets/opencomputers/textures/blocks/netSplitter_top.png similarity index 100% rename from src/main/resources/assets/opencomputers/textures/blocks/NetSplitterTop.png rename to src/main/resources/assets/opencomputers/textures/blocks/netSplitter_top.png diff --git a/src/main/resources/assets/opencomputers/textures/blocks/NetSplitterOn.png b/src/main/resources/assets/opencomputers/textures/blocks/overlay/netSplitter_on.png similarity index 100% rename from src/main/resources/assets/opencomputers/textures/blocks/NetSplitterOn.png rename to src/main/resources/assets/opencomputers/textures/blocks/overlay/netSplitter_on.png diff --git a/src/main/scala/li/cil/oc/client/Textures.scala b/src/main/scala/li/cil/oc/client/Textures.scala index 24a1a5e6c..624df6b7e 100644 --- a/src/main/scala/li/cil/oc/client/Textures.scala +++ b/src/main/scala/li/cil/oc/client/Textures.scala @@ -144,7 +144,8 @@ object Textures { val Cable = L("cable") val CableCap = L("cableCap") val GenericTop = L("generic_top", load = false) - val NetSplitter = L("netSplitter") + val NetSplitterSide = L("netSplitter_side") + val NetSplitterTop = L("netSplitter_top") val RackFront = L("serverRack_front", load = false) val RackSide = L("serverRack_side", load = false) diff --git a/src/main/scala/li/cil/oc/client/renderer/block/ModelInitialization.scala b/src/main/scala/li/cil/oc/client/renderer/block/ModelInitialization.scala index 3766b7f99..463682427 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/ModelInitialization.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/ModelInitialization.scala @@ -29,6 +29,8 @@ import scala.collection.mutable object ModelInitialization { final val CableBlockLocation = new ModelResourceLocation(Settings.resourceDomain + ":" + Constants.BlockName.Cable, "normal") final val CableItemLocation = new ModelResourceLocation(Settings.resourceDomain + ":" + Constants.BlockName.Cable, "inventory") + final val NetSplitterBlockLocation = new ModelResourceLocation(Settings.resourceDomain + ":" + Constants.BlockName.NetSplitter, "normal") + final val NetSplitterItemLocation = new ModelResourceLocation(Settings.resourceDomain + ":" + Constants.BlockName.NetSplitter, "inventory") final val PrintBlockLocation = new ModelResourceLocation(Settings.resourceDomain + ":" + Constants.BlockName.Print, "normal") final val PrintItemLocation = new ModelResourceLocation(Settings.resourceDomain + ":" + Constants.BlockName.Print, "inventory") final val RobotBlockLocation = new ModelResourceLocation(Settings.resourceDomain + ":" + Constants.BlockName.Robot, "normal") @@ -45,6 +47,7 @@ object ModelInitialization { MinecraftForge.EVENT_BUS.register(this) registerModel(Constants.BlockName.Cable, CableBlockLocation, CableItemLocation) + registerModel(Constants.BlockName.NetSplitter, NetSplitterBlockLocation, NetSplitterItemLocation) registerModel(Constants.BlockName.Print, PrintBlockLocation, PrintItemLocation) registerModel(Constants.BlockName.Robot, RobotBlockLocation, RobotItemLocation) registerModel(Constants.BlockName.RobotAfterimage, RobotAfterimageBlockLocation, RobotAfterimageItemLocation) @@ -137,6 +140,8 @@ object ModelInitialization { registry.putObject(CableBlockLocation, CableModel) registry.putObject(CableItemLocation, CableModel) + registry.putObject(NetSplitterBlockLocation, NetSplitterModel) + registry.putObject(NetSplitterItemLocation, NetSplitterModel) registry.putObject(PrintBlockLocation, PrintModel) registry.putObject(PrintItemLocation, PrintModel) registry.putObject(RobotBlockLocation, RobotModel) diff --git a/src/main/scala/li/cil/oc/client/renderer/block/NetSplitterModel.scala b/src/main/scala/li/cil/oc/client/renderer/block/NetSplitterModel.scala index f6575df67..9a6d41ff9 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/NetSplitterModel.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/NetSplitterModel.scala @@ -23,7 +23,14 @@ object NetSplitterModel extends SmartBlockModelBase with ISmartItemModel { override def handleItemState(stack: ItemStack) = new ItemModel(stack) - protected def splitterTexture = Array.fill(6)(Textures.getSprite(Textures.Block.NetSplitter)) + protected def splitterTexture = Array( + Textures.getSprite(Textures.Block.NetSplitterTop), + Textures.getSprite(Textures.Block.NetSplitterTop), + Textures.getSprite(Textures.Block.NetSplitterSide), + Textures.getSprite(Textures.Block.NetSplitterSide), + Textures.getSprite(Textures.Block.NetSplitterSide), + Textures.getSprite(Textures.Block.NetSplitterSide) + ) protected final val BaseModel = { val faces = mutable.ArrayBuffer.empty[BakedQuad] diff --git a/src/main/scala/li/cil/oc/client/renderer/tileentity/NetSplitterRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/tileentity/NetSplitterRenderer.scala index 35e14b4dd..c09061dbf 100644 --- a/src/main/scala/li/cil/oc/client/renderer/tileentity/NetSplitterRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/tileentity/NetSplitterRenderer.scala @@ -16,20 +16,22 @@ object NetSplitterRenderer extends TileEntitySpecialRenderer { val splitter = tileEntity.asInstanceOf[tileentity.NetSplitter] if (splitter.openSides.contains(!splitter.isInverted)) { - GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) - - RenderState.disableLighting() + RenderState.pushAttrib() + RenderState.disableEntityLighting() RenderState.makeItBlend() - GL11.glPushMatrix() + RenderState.pushMatrix() GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) GL11.glScaled(1.0025, -1.0025, 1.0025) GL11.glTranslatef(-0.5f, -0.5f, -0.5f) bindTexture(TextureMap.locationBlocksTexture) + val t = Tessellator.getInstance val r = t.getWorldRenderer + + Textures.Block.bind() r.startDrawingQuads() val sideActivity = Textures.getSprite(Textures.Block.NetSplitterOn) @@ -78,10 +80,10 @@ object NetSplitterRenderer extends TileEntitySpecialRenderer { t.draw() - RenderState.enableLighting() + RenderState.enableEntityLighting() - GL11.glPopMatrix() - GL11.glPopAttrib() + RenderState.popMatrix() + RenderState.popAttrib() } RenderState.checkError(getClass.getName + ".renderTileEntityAt: leaving") From 94fd8d14b13d6e1ec11755ff6231a53a21aaf59a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 21:52:47 +0200 Subject: [PATCH 31/42] Finished Power Advantage integration, looks like it works the way it should! Closes #1248. --- src/main/resources/application.conf | 1 + src/main/scala/li/cil/oc/Settings.scala | 2 ++ .../poweradvantage/LightWeightPowerAcceptor.scala | 12 ++++++------ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 97aa94738..02775cf50 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -780,6 +780,7 @@ opencomputers { Galacticraft: 48.0 IndustrialCraft2: 400.0 Mekanism: 1333.33 + PowerAdvantage: 31.25 RedstoneFlux: 100.0 } } diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index d4e8bf8ba..14d025294 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -218,6 +218,7 @@ class Settings(val config: Config) { private val valueGalacticraft = config.getDouble("power.value.Galacticraft") private val valueIndustrialCraft2 = config.getDouble("power.value.IndustrialCraft2") private val valueMekanism = config.getDouble("power.value.Mekanism") + private val valuePowerAdvantage = config.getDouble("power.value.PowerAdvantage") private val valueRedstoneFlux = config.getDouble("power.value.RedstoneFlux") private val valueInternal = 1000 @@ -227,6 +228,7 @@ class Settings(val config: Config) { val ratioGalacticraft = valueGalacticraft / valueInternal val ratioIndustrialCraft2 = valueIndustrialCraft2 / valueInternal val ratioMekanism = valueMekanism / valueInternal + val ratioPowerAdvantage = valuePowerAdvantage / valueInternal val ratioRedstoneFlux = valueRedstoneFlux / valueInternal // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/integration/poweradvantage/LightWeightPowerAcceptor.scala b/src/main/scala/li/cil/oc/integration/poweradvantage/LightWeightPowerAcceptor.scala index 8a2d4f2f2..9f540b9e7 100644 --- a/src/main/scala/li/cil/oc/integration/poweradvantage/LightWeightPowerAcceptor.scala +++ b/src/main/scala/li/cil/oc/integration/poweradvantage/LightWeightPowerAcceptor.scala @@ -24,23 +24,23 @@ object LightWeightPowerAcceptor extends ILightWeightPowerAcceptor { def getEnergyDemand(tileEntity: TileEntity, powerType: ConduitType) = tileEntity match { case acceptor: PowerAcceptor if canAcceptEnergyType(powerType) => - EnumFacing.values().map(side => { - val capacity = (acceptor.globalBufferSize(side) / Settings.get.ratioRedstoneFlux).toInt - val stored = (acceptor.globalBuffer(side) / Settings.get.ratioRedstoneFlux).toInt + (EnumFacing.values().map(side => { + val capacity = acceptor.globalBufferSize(side) + val stored = acceptor.globalBuffer(side) capacity - stored - }).max + }).max / Settings.get.ratioPowerAdvantage).toInt case _ => 0 } def addEnergy(tileEntity: TileEntity, amountAdded: Float, powerType: ConduitType) = tileEntity match { case acceptor: PowerAcceptor if canAcceptEnergyType(powerType) => - var remainingEnergy = math.min(amountAdded, acceptor.energyThroughput) + var remainingEnergy = math.min(amountAdded, acceptor.energyThroughput) * Settings.get.ratioPowerAdvantage // .exists() for early exit. EnumFacing.values().exists(side => { remainingEnergy -= acceptor.tryChangeBuffer(side, remainingEnergy) remainingEnergy <= 0 }) - amountAdded - remainingEnergy.toFloat + amountAdded - (remainingEnergy / Settings.get.ratioPowerAdvantage).toFloat case _ => 0 } } From 5c8572ba379ce0bc0ba2be0d47eab0da32aebb67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 22:48:41 +0200 Subject: [PATCH 32/42] Added command to spawn a creative computer with the basic stuff built-in. Closes #1289. --- .../oc/common/tileentity/Disassembler.scala | 6 +- .../oc/server/command/CommandHandler.scala | 3 +- .../server/command/SpawnComputerCommand.scala | 72 +++++++++++++++++++ .../scala/li/cil/oc/util/InventoryUtils.scala | 4 +- 4 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala diff --git a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala index 78121cbb2..59771ccce 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -36,7 +36,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra var disassembleNextInstantly = false - def progress = if (queue.isEmpty) 0 else (1 - (queue.size * Settings.get.disassemblerItemCost - buffer) / totalRequiredEnergy) * 100 + def progress = if (queue.isEmpty) 0.0 else (1 - (queue.size * Settings.get.disassemblerItemCost - buffer) / totalRequiredEnergy) * 100 private def setActive(value: Boolean) = if (value != isActive) { isActive = value @@ -113,7 +113,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra private def drop(stack: ItemStack) { if (stack != null) { for (side <- ForgeDirection.VALID_DIRECTIONS if stack.stackSize > 0) { - InventoryUtils.insertIntoInventoryAt(stack, BlockPosition(this).offset(side), side.getOpposite) + InventoryUtils.insertIntoInventoryAt(stack, BlockPosition(this).offset(side), Some(side.getOpposite)) } if (stack.stackSize > 0) { spawnStackInWorld(stack, Option(ForgeDirection.UP)) @@ -160,7 +160,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra override def isItemValidForSlot(i: Int, stack: ItemStack) = allowDisassembling(stack) && (((Settings.get.disassembleAllTheThings || api.Items.get(stack) != null) && ItemUtils.getIngredients(stack).nonEmpty) || - DisassemblerTemplates.select(stack) != None) + DisassemblerTemplates.select(stack).isDefined) private def allowDisassembling(stack: ItemStack) = stack != null && (!stack.hasTagCompound || !stack.getTagCompound.getBoolean(Settings.namespace + "undisassemblable")) diff --git a/src/main/scala/li/cil/oc/server/command/CommandHandler.scala b/src/main/scala/li/cil/oc/server/command/CommandHandler.scala index 0e2763b1b..0c70c60fe 100644 --- a/src/main/scala/li/cil/oc/server/command/CommandHandler.scala +++ b/src/main/scala/li/cil/oc/server/command/CommandHandler.scala @@ -4,7 +4,8 @@ import cpw.mods.fml.common.event.FMLServerStartingEvent object CommandHandler { def register(e: FMLServerStartingEvent) { - e.registerServerCommand(WirelessRenderingCommand) e.registerServerCommand(NonDisassemblyAgreementCommand) + e.registerServerCommand(WirelessRenderingCommand) + e.registerServerCommand(SpawnComputerCommand) } } diff --git a/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala b/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala new file mode 100644 index 000000000..690e47056 --- /dev/null +++ b/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala @@ -0,0 +1,72 @@ +package li.cil.oc.server.command + +import li.cil.oc.Constants +import li.cil.oc.api +import li.cil.oc.common.command.SimpleCommand +import li.cil.oc.common.tileentity +import li.cil.oc.util.BlockPosition +import li.cil.oc.util.ExtendedWorld._ +import li.cil.oc.util.InventoryUtils +import net.minecraft.command.ICommandSender +import net.minecraft.command.WrongUsageException +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.util.ChatComponentText +import net.minecraft.util.MovingObjectPosition +import net.minecraft.util.Vec3 +import net.minecraftforge.common.util.ForgeDirection + +object SpawnComputerCommand extends SimpleCommand("oc_spawnComputer") { + aliases += "oc_sc" + + final val MaxDistance = 16 + + override def getCommandUsage(source: ICommandSender): String = name + + override def processCommand(source: ICommandSender, command: Array[String]) { + source match { + case player: EntityPlayer => + val world = player.getEntityWorld + val origin = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight, player.posZ) + val direction = player.getLookVec + val lookAt = origin.addVector(direction.xCoord * MaxDistance, direction.yCoord * MaxDistance, direction.zCoord * MaxDistance) + world.rayTraceBlocks(origin, lookAt) match { + case hit: MovingObjectPosition if hit.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK => + val hitPos = BlockPosition(hit.blockX, hit.blockY, hit.blockZ, world) + val casePos = hitPos.offset(ForgeDirection.getOrientation(hit.sideHit)) + val screenPos = casePos.offset(ForgeDirection.UP) + val keyboardPos = screenPos.offset(ForgeDirection.UP) + + if (!world.isAirBlock(casePos) || !world.isAirBlock(screenPos) || !world.isAirBlock(keyboardPos)) { + player.addChatMessage(new ChatComponentText("Target position obstructed.")) + return + } + + world.setBlock(casePos, api.Items.get(Constants.BlockName.CaseCreative).block()) + world.setBlock(screenPos, api.Items.get(Constants.BlockName.ScreenTier2).block()) + world.setBlock(keyboardPos, api.Items.get(Constants.BlockName.Keyboard).block()) + world.getTileEntity(keyboardPos) match { + case t: tileentity.traits.Rotatable => t.setFromFacing(ForgeDirection.UP) + case _ => // ??? + } + + api.Network.joinOrCreateNetwork(world.getTileEntity(casePos)) + + InventoryUtils.insertIntoInventoryAt(api.Items.get(Constants.ItemName.APUCreative).createItemStack(1), casePos) + InventoryUtils.insertIntoInventoryAt(api.Items.get(Constants.ItemName.RAMTier6).createItemStack(2), casePos) + InventoryUtils.insertIntoInventoryAt(api.Items.get(Constants.ItemName.HDDTier3).createItemStack(1), casePos) + InventoryUtils.insertIntoInventoryAt(api.Items.get(Constants.ItemName.LuaBios).createItemStack(1), casePos) + InventoryUtils.insertIntoInventoryAt(api.Items.get(Constants.ItemName.OpenOS).createItemStack(1), casePos) + case _ => player.addChatMessage(new ChatComponentText("You need to be looking at a nearby block.")) + } + case _ => throw new WrongUsageException("Can only be used by players.") + } + } + + // OP levels for reference: + // 1 - Ops can bypass spawn protection. + // 2 - Ops can use /clear, /difficulty, /effect, /gamemode, /gamerule, /give, /summon, /setblock and /tp, and can edit command blocks. + // 3 - Ops can use /ban, /deop, /kick, and /op. + // 4 - Ops can use /stop. + + override def getRequiredPermissionLevel = 2 +} diff --git a/src/main/scala/li/cil/oc/util/InventoryUtils.scala b/src/main/scala/li/cil/oc/util/InventoryUtils.scala index 8a51f0d70..951498bd9 100644 --- a/src/main/scala/li/cil/oc/util/InventoryUtils.scala +++ b/src/main/scala/li/cil/oc/util/InventoryUtils.scala @@ -211,8 +211,8 @@ object InventoryUtils { * Utility method for calling insertIntoInventory on an inventory * in the world. */ - def insertIntoInventoryAt(stack: ItemStack, position: BlockPosition, side: ForgeDirection, limit: Int = 64, simulate: Boolean = false): Boolean = - inventoryAt(position).exists(insertIntoInventory(stack, _, Option(side), limit, simulate)) + def insertIntoInventoryAt(stack: ItemStack, position: BlockPosition, side: Option[ForgeDirection] = None, limit: Int = 64, simulate: Boolean = false): Boolean = + inventoryAt(position).exists(insertIntoInventory(stack, _, side, limit, simulate)) /** * Utility method for calling extractFromInventory on an inventory From 2ee0715bffe6dd71d0bc135a64346bbd73965073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 23:18:21 +0200 Subject: [PATCH 33/42] Adjust default orientation of screen. --- .../scala/li/cil/oc/server/command/SpawnComputerCommand.scala | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala b/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala index 7fe54fb06..f3d240ac6 100644 --- a/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala +++ b/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala @@ -48,6 +48,10 @@ object SpawnComputerCommand extends SimpleCommand("oc_spawnComputer") { case t: tileentity.traits.Rotatable => t.setFromFacing(EnumFacing.UP) case _ => // ??? } + world.getTileEntity(screenPos) match { + case t: tileentity.traits.Rotatable => t.setFromFacing(EnumFacing.NORTH) + case _ => // ??? + } api.Network.joinOrCreateNetwork(world.getTileEntity(casePos)) From db8726612879869ed113fa3564d8579745bc6c21 Mon Sep 17 00:00:00 2001 From: Kubuxu Date: Sun, 12 Jul 2015 11:08:10 +0200 Subject: [PATCH 34/42] Fix ProjectRed dependency --- build.gradle | 21 +++++++++++++-------- build.properties | 4 +++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 799b0ec78..c85d53611 100644 --- a/build.gradle +++ b/build.gradle @@ -106,7 +106,10 @@ repositories { name 'DVS1 Maven FS' url 'http://dvs1.progwml6.com/files/maven' } - + maven { + name 'ProjectRed' + url 'http://files.projectredwiki.com/maven/' + } ivy { name "BuildCraft" artifactPattern "http://www.mod-buildcraft.com/releases/BuildCraft/[revision]/[module]-[revision]-[classifier].[ext]" @@ -119,19 +122,18 @@ repositories { name 'Mekanism' artifactPattern "http://ci.cil.li/job/Mekanism/${config.mekanism.build}/artifact/output/[module]-${config.minecraft.version}-[revision].${config.mekanism.build}.[ext]" } - ivy { - name 'ProjectRed' - artifactPattern "http://projectredwiki.com/maven/mrtjp/[module]/${config.minecraft.version}-[revision]/[module]-${config.minecraft.version}-[revision]-dev.[ext]" - } ivy { name 'immibis' artifactPattern "https://dl.dropboxusercontent.com/u/2944265/mods/autobuilt/files/[module]-[revision].[ext]" } - ivy { name 'CoFHLib' artifactPattern "http://addons-origin.cursecdn.com/files/${config.cofhlib.cf}/[module]-[revision].[ext]" } + ivy { + name 'CoFHCore' + artifactPattern "http://addons-origin.cursecdn.com/files/${config.cofhcore.cf}/[module]-[revision].[ext]" + } ivy { name 'MineFactoryReloaded' artifactPattern "http://addons-origin.cursecdn.com/files/${config.mfr.cf}/[module]-[revision].[ext]" @@ -182,14 +184,17 @@ dependencies { provided "notenoughkeys:NeK:${config.minecraft.version}-${config.nek.version}:deobf-dev" provided "qmunity:QmunityLib:${config.qmunitylib.version}:deobf" provided "tmech:TMechworks:${config.minecraft.version}-${config.tmech.version}:deobf" + provided("mrtjp:ProjectRed:${config.projred.version}:dev") { + exclude module: 'CoFHCore' + } - provided name: "buildcraft", version: "${config.bc.version}", classifier: "dev", ext: 'jar' + provided name: 'buildcraft', version: config.bc.version, classifier: "dev", ext: 'jar' provided name: 'GalacticraftCoreAll', version: config.gc.version, ext: 'jar' provided name: 'MekanismAll', version: config.mekanism.version, ext: 'jar' - provided name: 'ProjectRed', version: config.projred.version, ext: 'jar' provided name: 'redlogic', version: config.redlogic.version, ext: 'jar' provided name: 'CoFHLib', version: config.cofhlib.version, ext: 'jar' + provided name: 'CoFHCore', version: config.cofhcore.version, ext: 'jar' provided name: 'MineFactoryReloaded', version: config.mfr.version, ext: 'jar' provided name: 'ComputerCraft', version: config.cc.version, ext: 'jar' provided name: 'EnderIO', version: config.eio.version, ext: 'jar' diff --git a/build.properties b/build.properties index e22e68f43..b71d7d412 100644 --- a/build.properties +++ b/build.properties @@ -32,7 +32,7 @@ mfr.cf=2229/626 mfr.version=[1.7.10]2.8.0RC8-86 nei.version=1.0.3.57 nek.version=1.0.0b35dev -projred.version=4.7.0pre2.87 +projred.version=1.7.10-4.6.2.82 qmunitylib.version=0.1.105 rc.cf=2219/321 rc.version=1.7.10-9.4.0.0 @@ -42,5 +42,7 @@ tmech.version=75.0afb56c re.version=3.0.0.342 waila.version=1.5.8a wrcbe.version=1.4.1.2 +cofhcore.cf=2246/697 +cofhcore.version=[1.7.10]3.0.3B4-302-dev maven.url=file:///home/www/maven.cil.li/web \ No newline at end of file From 6b3c3f98d75daf61d4bbceef17b18800fadb16c2 Mon Sep 17 00:00:00 2001 From: Kubuxu Date: Sun, 12 Jul 2015 11:08:41 +0200 Subject: [PATCH 35/42] Make hollow covers from FMP close on Cables --- src/main/scala/li/cil/oc/integration/fmp/CablePart.scala | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/integration/fmp/CablePart.scala b/src/main/scala/li/cil/oc/integration/fmp/CablePart.scala index 652c57049..db5d27990 100644 --- a/src/main/scala/li/cil/oc/integration/fmp/CablePart.scala +++ b/src/main/scala/li/cil/oc/integration/fmp/CablePart.scala @@ -4,6 +4,7 @@ import codechicken.lib.data.MCDataInput import codechicken.lib.data.MCDataOutput import codechicken.lib.vec.Cuboid6 import codechicken.lib.vec.Vector3 +import codechicken.microblock.ISidedHollowConnect import codechicken.multipart._ import cpw.mods.fml.relauncher.Side import cpw.mods.fml.relauncher.SideOnly @@ -31,7 +32,7 @@ import net.minecraft.util.MovingObjectPosition import scala.collection.convert.WrapAsJava import scala.collection.convert.WrapAsScala._ -class CablePart(val original: Option[tileentity.Cable] = None) extends SimpleBlockPart with TCuboidPart with TNormalOcclusion with network.Environment { +class CablePart(val original: Option[tileentity.Cable] = None) extends SimpleBlockPart with TCuboidPart with TSlottedPart with ISidedHollowConnect with TNormalOcclusion with network.Environment { val node = api.Network.newNode(this, Visibility.None).create() private var _color = Color.LightGray @@ -68,6 +69,11 @@ class CablePart(val original: Option[tileentity.Cable] = None) extends SimpleBlo override def getRenderBounds = new Cuboid6(Cable.bounds(world, x, y, z).offset(x, y, z)) + override def getHollowSize(side: Int) = 4 // 4 pixels as this is width of cable. + + override def getSlotMask = 1 << 6 // 6 is center part. + + // ----------------------------------------------------------------------- // override def activate(player: EntityPlayer, hit: MovingObjectPosition, item: ItemStack) = { From e0f9f04e357b7181470fc1a8545d0fa6fc6b7a61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 12 Jul 2015 12:20:33 +0200 Subject: [PATCH 36/42] Made the touch inversion check in screens use the origin block as it should. First part of #1291. --- src/main/scala/li/cil/oc/common/block/Screen.scala | 2 +- src/main/scala/li/cil/oc/common/tileentity/Screen.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/block/Screen.scala b/src/main/scala/li/cil/oc/common/block/Screen.scala index 5685f70ea..df519361e 100644 --- a/src/main/scala/li/cil/oc/common/block/Screen.scala +++ b/src/main/scala/li/cil/oc/common/block/Screen.scala @@ -337,7 +337,7 @@ class Screen(val tier: Int) extends RedstoneAware { if (Wrench.holdsApplicableWrench(player, BlockPosition(x, y, z)) && getValidRotations(world, x, y, z).contains(side) && !force) false else if (api.Items.get(player.getHeldItem) == api.Items.get(Constants.ItemName.Analyzer)) false else world.getTileEntity(x, y, z) match { - case screen: tileentity.Screen if screen.hasKeyboard && (force || player.isSneaking == screen.invertTouchMode) => + case screen: tileentity.Screen if screen.hasKeyboard && (force || player.isSneaking == screen.origin.invertTouchMode) => // Yep, this GUI is actually purely client side. We could skip this // if, but it is clearer this way (to trigger it from the server we // would have to give screens a "container", which we do not want). diff --git a/src/main/scala/li/cil/oc/common/tileentity/Screen.scala b/src/main/scala/li/cil/oc/common/tileentity/Screen.scala index 8f061df85..68cc3cacb 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Screen.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Screen.scala @@ -243,7 +243,7 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with } }) } - if (arrows.size > 0) { + if (arrows.nonEmpty) { for (arrow <- arrows) { val hitX = arrow.posX - x val hitY = arrow.posY - y From 919e3c9397cd39745111be93f4c908e0568571ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 12 Jul 2015 12:21:09 +0200 Subject: [PATCH 37/42] Fixes drivers to use proper tier getter. Closes #1291. --- .../scala/li/cil/oc/integration/opencomputers/DriverAPU.scala | 2 +- .../scala/li/cil/oc/integration/opencomputers/DriverCPU.scala | 2 +- .../cil/oc/integration/opencomputers/DriverGraphicsCard.scala | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverAPU.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverAPU.scala index a41112f13..17493abaa 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverAPU.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverAPU.scala @@ -27,7 +27,7 @@ object DriverAPU extends DriverCPU with HostAware with EnvironmentAware { override def cpuTier(stack: ItemStack) = Delegator.subItem(stack) match { - case Some(apu: common.item.APU) => apu.tier + case Some(apu: common.item.APU) => apu.cpuTier case _ => Tier.One } diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala index df3cdd997..14db12664 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverCPU.scala @@ -33,7 +33,7 @@ abstract class DriverCPU extends Item with Processor { def cpuTier(stack: ItemStack): Int = Delegator.subItem(stack) match { - case Some(cpu: item.CPU) => cpu.tier + case Some(cpu: item.CPU) => cpu.cpuTier case _ => Tier.One } diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverGraphicsCard.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverGraphicsCard.scala index 31b594c1d..b39c4f4d8 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverGraphicsCard.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverGraphicsCard.scala @@ -30,7 +30,7 @@ object DriverGraphicsCard extends Item with HostAware with EnvironmentAware { override def tier(stack: ItemStack) = Delegator.subItem(stack) match { - case Some(gpu: common.item.GraphicsCard) => gpu.tier + case Some(gpu: common.item.GraphicsCard) => gpu.gpuTier case _ => Tier.One } From 77751ffb158efe41487c2ad7bbc01beea8d370b6 Mon Sep 17 00:00:00 2001 From: Kubuxu Date: Sun, 12 Jul 2015 11:08:10 +0200 Subject: [PATCH 38/42] Fix ProjectRed dependency --- build.gradle | 25 ++++++++++++++++--------- build.properties | 4 +++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 799b0ec78..647c2c92f 100644 --- a/build.gradle +++ b/build.gradle @@ -106,7 +106,10 @@ repositories { name 'DVS1 Maven FS' url 'http://dvs1.progwml6.com/files/maven' } - + maven { + name 'ProjectRed' + url 'http://files.projectredwiki.com/maven/' + } ivy { name "BuildCraft" artifactPattern "http://www.mod-buildcraft.com/releases/BuildCraft/[revision]/[module]-[revision]-[classifier].[ext]" @@ -119,19 +122,18 @@ repositories { name 'Mekanism' artifactPattern "http://ci.cil.li/job/Mekanism/${config.mekanism.build}/artifact/output/[module]-${config.minecraft.version}-[revision].${config.mekanism.build}.[ext]" } - ivy { - name 'ProjectRed' - artifactPattern "http://projectredwiki.com/maven/mrtjp/[module]/${config.minecraft.version}-[revision]/[module]-${config.minecraft.version}-[revision]-dev.[ext]" - } ivy { name 'immibis' artifactPattern "https://dl.dropboxusercontent.com/u/2944265/mods/autobuilt/files/[module]-[revision].[ext]" } - ivy { name 'CoFHLib' artifactPattern "http://addons-origin.cursecdn.com/files/${config.cofhlib.cf}/[module]-[revision].[ext]" } + ivy { + name 'CoFHCore' + artifactPattern "http://addons-origin.cursecdn.com/files/${config.cofhcore.cf}/[module]-[revision].[ext]" + } ivy { name 'MineFactoryReloaded' artifactPattern "http://addons-origin.cursecdn.com/files/${config.mfr.cf}/[module]-[revision].[ext]" @@ -166,7 +168,9 @@ configurations { dependencies { provided "appeng:RotaryCraft:${config.rotc.version}:api" - provided "appeng:appliedenergistics2:${config.ae2.version}:dev" + provided ("appeng:appliedenergistics2:${config.ae2.version}:dev") { + exclude module: 'buildcraft' + } provided "codechicken:CodeChickenLib:${config.minecraft.version}-${config.ccl.version}:dev" provided "codechicken:EnderStorage:${config.minecraft.version}-${config.es.version}:dev" provided "codechicken:ForgeMultipart:${config.minecraft.version}-${config.fmp.version}:dev" @@ -182,14 +186,17 @@ dependencies { provided "notenoughkeys:NeK:${config.minecraft.version}-${config.nek.version}:deobf-dev" provided "qmunity:QmunityLib:${config.qmunitylib.version}:deobf" provided "tmech:TMechworks:${config.minecraft.version}-${config.tmech.version}:deobf" + provided ("mrtjp:ProjectRed:${config.projred.version}:dev") { + exclude module: 'CoFHCore' + } - provided name: "buildcraft", version: "${config.bc.version}", classifier: "dev", ext: 'jar' + provided name: 'buildcraft', version: config.bc.version, classifier: "dev", ext: 'jar' provided name: 'GalacticraftCoreAll', version: config.gc.version, ext: 'jar' provided name: 'MekanismAll', version: config.mekanism.version, ext: 'jar' - provided name: 'ProjectRed', version: config.projred.version, ext: 'jar' provided name: 'redlogic', version: config.redlogic.version, ext: 'jar' provided name: 'CoFHLib', version: config.cofhlib.version, ext: 'jar' + provided name: 'CoFHCore', version: config.cofhcore.version, ext: 'jar' provided name: 'MineFactoryReloaded', version: config.mfr.version, ext: 'jar' provided name: 'ComputerCraft', version: config.cc.version, ext: 'jar' provided name: 'EnderIO', version: config.eio.version, ext: 'jar' diff --git a/build.properties b/build.properties index e22e68f43..b71d7d412 100644 --- a/build.properties +++ b/build.properties @@ -32,7 +32,7 @@ mfr.cf=2229/626 mfr.version=[1.7.10]2.8.0RC8-86 nei.version=1.0.3.57 nek.version=1.0.0b35dev -projred.version=4.7.0pre2.87 +projred.version=1.7.10-4.6.2.82 qmunitylib.version=0.1.105 rc.cf=2219/321 rc.version=1.7.10-9.4.0.0 @@ -42,5 +42,7 @@ tmech.version=75.0afb56c re.version=3.0.0.342 waila.version=1.5.8a wrcbe.version=1.4.1.2 +cofhcore.cf=2246/697 +cofhcore.version=[1.7.10]3.0.3B4-302-dev maven.url=file:///home/www/maven.cil.li/web \ No newline at end of file From 4305aae16d512362d44a861da5bf93653a2efca9 Mon Sep 17 00:00:00 2001 From: Kubuxu Date: Sun, 12 Jul 2015 11:08:41 +0200 Subject: [PATCH 39/42] Make hollow covers from FMP close on Cables --- src/main/scala/li/cil/oc/integration/fmp/CablePart.scala | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/integration/fmp/CablePart.scala b/src/main/scala/li/cil/oc/integration/fmp/CablePart.scala index 652c57049..db5d27990 100644 --- a/src/main/scala/li/cil/oc/integration/fmp/CablePart.scala +++ b/src/main/scala/li/cil/oc/integration/fmp/CablePart.scala @@ -4,6 +4,7 @@ import codechicken.lib.data.MCDataInput import codechicken.lib.data.MCDataOutput import codechicken.lib.vec.Cuboid6 import codechicken.lib.vec.Vector3 +import codechicken.microblock.ISidedHollowConnect import codechicken.multipart._ import cpw.mods.fml.relauncher.Side import cpw.mods.fml.relauncher.SideOnly @@ -31,7 +32,7 @@ import net.minecraft.util.MovingObjectPosition import scala.collection.convert.WrapAsJava import scala.collection.convert.WrapAsScala._ -class CablePart(val original: Option[tileentity.Cable] = None) extends SimpleBlockPart with TCuboidPart with TNormalOcclusion with network.Environment { +class CablePart(val original: Option[tileentity.Cable] = None) extends SimpleBlockPart with TCuboidPart with TSlottedPart with ISidedHollowConnect with TNormalOcclusion with network.Environment { val node = api.Network.newNode(this, Visibility.None).create() private var _color = Color.LightGray @@ -68,6 +69,11 @@ class CablePart(val original: Option[tileentity.Cable] = None) extends SimpleBlo override def getRenderBounds = new Cuboid6(Cable.bounds(world, x, y, z).offset(x, y, z)) + override def getHollowSize(side: Int) = 4 // 4 pixels as this is width of cable. + + override def getSlotMask = 1 << 6 // 6 is center part. + + // ----------------------------------------------------------------------- // override def activate(player: EntityPlayer, hit: MovingObjectPosition, item: ItemStack) = { From 5a9a6ef3bc0fa2c19413f6df39821d2d83ed5faa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 12 Jul 2015 13:57:53 +0200 Subject: [PATCH 40/42] Make assembler render without fake full bright to avoid Colored Lights' rendering to break. Also added Colored Lights integration while I was at it. --- build.gradle | 7 +++++- build.properties | 1 + .../oc/client/renderer/block/Assembler.scala | 5 ++-- .../li/cil/oc/common/block/Assembler.scala | 3 ++- .../li/cil/oc/common/block/Capacitor.scala | 5 +++- .../li/cil/oc/common/block/Geolyzer.scala | 3 ++- .../li/cil/oc/common/block/Hologram.scala | 3 ++- .../oc/common/block/PowerDistributor.scala | 3 ++- .../scala/li/cil/oc/common/block/Screen.scala | 3 ++- .../scala/li/cil/oc/integration/Mods.scala | 2 ++ .../coloredlights/ModColoredLights.scala | 25 +++++++++++++++++++ 11 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 src/main/scala/li/cil/oc/integration/coloredlights/ModColoredLights.scala diff --git a/build.gradle b/build.gradle index c85d53611..2ad68a282 100644 --- a/build.gradle +++ b/build.gradle @@ -110,6 +110,10 @@ repositories { name 'ProjectRed' url 'http://files.projectredwiki.com/maven/' } + maven { + name 'ColoredLightCore' + url "http://coloredlightscore.us.to/maven/clc/" + } ivy { name "BuildCraft" artifactPattern "http://www.mod-buildcraft.com/releases/BuildCraft/[revision]/[module]-[revision]-[classifier].[ext]" @@ -185,8 +189,9 @@ dependencies { provided "qmunity:QmunityLib:${config.qmunitylib.version}:deobf" provided "tmech:TMechworks:${config.minecraft.version}-${config.tmech.version}:deobf" provided("mrtjp:ProjectRed:${config.projred.version}:dev") { - exclude module: 'CoFHCore' + exclude module: 'CoFHCore' } + provided "coloredlightscore:ColoredLightsCore:${config.coloredlights.version}:api" provided name: 'buildcraft', version: config.bc.version, classifier: "dev", ext: 'jar' provided name: 'GalacticraftCoreAll', version: config.gc.version, ext: 'jar' diff --git a/build.properties b/build.properties index b71d7d412..2c2e55c76 100644 --- a/build.properties +++ b/build.properties @@ -14,6 +14,7 @@ cc.version=1.73 ccl.version=1.1.1.104 cofhlib.cf=2230/207 cofhlib.version=[1.7.10]1.0.0RC7-127 +coloredlights.version=1.3.7.35 ec.cf=2242/839 ec.version=deobf-1.7.10-2.2.73b129 eio.cf=2219/296 diff --git a/src/main/scala/li/cil/oc/client/renderer/block/Assembler.scala b/src/main/scala/li/cil/oc/client/renderer/block/Assembler.scala index c2509c521..20b104df0 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/Assembler.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/Assembler.scala @@ -4,6 +4,7 @@ import li.cil.oc.client.Textures import li.cil.oc.util.RenderState import net.minecraft.block.Block import net.minecraft.client.renderer.RenderBlocks +import net.minecraft.client.renderer.RenderHelper import org.lwjgl.opengl.GL11 object Assembler { @@ -55,7 +56,7 @@ object Assembler { GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) RenderState.makeItBlend() - RenderState.disableLighting() + RenderHelper.disableStandardItemLighting() renderer.setOverrideBlockTexture(Textures.Assembler.iconTopOn) renderer.setRenderBounds(0, 0, 0, 1, 1.05, 1) @@ -70,7 +71,7 @@ object Assembler { BlockRenderer.renderFaceZNeg(block, metadata, renderer) renderer.clearOverrideBlockTexture() - RenderState.enableLighting() + RenderHelper.enableStandardItemLighting() GL11.glPopAttrib() } } diff --git a/src/main/scala/li/cil/oc/common/block/Assembler.scala b/src/main/scala/li/cil/oc/common/block/Assembler.scala index d5621d5d6..b3f56932e 100644 --- a/src/main/scala/li/cil/oc/common/block/Assembler.scala +++ b/src/main/scala/li/cil/oc/common/block/Assembler.scala @@ -4,13 +4,14 @@ import li.cil.oc.Settings import li.cil.oc.client.Textures import li.cil.oc.common.GuiType import li.cil.oc.common.tileentity +import li.cil.oc.integration.coloredlights.ModColoredLights import net.minecraft.client.renderer.texture.IIconRegister import net.minecraft.world.IBlockAccess import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection class Assembler extends SimpleBlock with traits.SpecialBlock with traits.PowerAcceptor with traits.StateAware with traits.GUI { - setLightLevel(0.34f) + ModColoredLights.setLightLevel(this, 0, 3, 5) override protected def customTextures = Array( None, diff --git a/src/main/scala/li/cil/oc/common/block/Capacitor.scala b/src/main/scala/li/cil/oc/common/block/Capacitor.scala index 136e5e798..c98579e37 100644 --- a/src/main/scala/li/cil/oc/common/block/Capacitor.scala +++ b/src/main/scala/li/cil/oc/common/block/Capacitor.scala @@ -3,11 +3,14 @@ package li.cil.oc.common.block import java.util.Random import li.cil.oc.common.tileentity +import li.cil.oc.integration.Mods +import li.cil.oc.integration.coloredlights.ModColoredLights import net.minecraft.block.Block import net.minecraft.world.World class Capacitor extends SimpleBlock { - setLightLevel(0.34f) + ModColoredLights.setLightLevel(this, 5, 5, 5) + setTickRandomly(true) override protected def customTextures = Array( diff --git a/src/main/scala/li/cil/oc/common/block/Geolyzer.scala b/src/main/scala/li/cil/oc/common/block/Geolyzer.scala index 03f7f4284..b79c2ea03 100644 --- a/src/main/scala/li/cil/oc/common/block/Geolyzer.scala +++ b/src/main/scala/li/cil/oc/common/block/Geolyzer.scala @@ -3,11 +3,12 @@ package li.cil.oc.common.block import li.cil.oc.Settings import li.cil.oc.client.Textures import li.cil.oc.common.tileentity +import li.cil.oc.integration.coloredlights.ModColoredLights import net.minecraft.client.renderer.texture.IIconRegister import net.minecraft.world.World class Geolyzer extends SimpleBlock { - setLightLevel(0.14f) + ModColoredLights.setLightLevel(this, 3, 1, 1) override protected def customTextures = Array( None, diff --git a/src/main/scala/li/cil/oc/common/block/Hologram.scala b/src/main/scala/li/cil/oc/common/block/Hologram.scala index 06da52a63..069e4b200 100644 --- a/src/main/scala/li/cil/oc/common/block/Hologram.scala +++ b/src/main/scala/li/cil/oc/common/block/Hologram.scala @@ -5,6 +5,7 @@ import java.util import cpw.mods.fml.relauncher.Side import cpw.mods.fml.relauncher.SideOnly import li.cil.oc.common.tileentity +import li.cil.oc.integration.coloredlights.ModColoredLights import li.cil.oc.util.Rarity import li.cil.oc.util.Tooltip import net.minecraft.entity.player.EntityPlayer @@ -14,7 +15,7 @@ import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection class Hologram(val tier: Int) extends SimpleBlock with traits.SpecialBlock { - setLightLevel(1) + ModColoredLights.setLightLevel(this, 15, 15, 15) setBlockBounds(0, 0, 0, 1, 0.5f, 1) // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/common/block/PowerDistributor.scala b/src/main/scala/li/cil/oc/common/block/PowerDistributor.scala index 97f216e23..f2f88120f 100644 --- a/src/main/scala/li/cil/oc/common/block/PowerDistributor.scala +++ b/src/main/scala/li/cil/oc/common/block/PowerDistributor.scala @@ -3,11 +3,12 @@ package li.cil.oc.common.block import li.cil.oc.Settings import li.cil.oc.client.Textures import li.cil.oc.common.tileentity +import li.cil.oc.integration.coloredlights.ModColoredLights import net.minecraft.client.renderer.texture.IIconRegister import net.minecraft.world.World class PowerDistributor extends SimpleBlock { - setLightLevel(0.34f) + ModColoredLights.setLightLevel(this, 5, 5, 3) override protected def customTextures = Array( None, diff --git a/src/main/scala/li/cil/oc/common/block/Screen.scala b/src/main/scala/li/cil/oc/common/block/Screen.scala index df519361e..58e8fefcb 100644 --- a/src/main/scala/li/cil/oc/common/block/Screen.scala +++ b/src/main/scala/li/cil/oc/common/block/Screen.scala @@ -10,6 +10,7 @@ import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.common.GuiType import li.cil.oc.common.tileentity +import li.cil.oc.integration.coloredlights.ModColoredLights import li.cil.oc.integration.util.Wrench import li.cil.oc.util._ import net.minecraft.client.Minecraft @@ -25,7 +26,7 @@ import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection class Screen(val tier: Int) extends RedstoneAware { - setLightLevel(0.34f) + ModColoredLights.setLightLevel(this, 5, 5, 5) override def isSideSolid(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = toLocal(world, x, y, z, side) != ForgeDirection.SOUTH diff --git a/src/main/scala/li/cil/oc/integration/Mods.scala b/src/main/scala/li/cil/oc/integration/Mods.scala index 97b410ff7..4a508be9d 100644 --- a/src/main/scala/li/cil/oc/integration/Mods.scala +++ b/src/main/scala/li/cil/oc/integration/Mods.scala @@ -32,6 +32,7 @@ object Mods { val CoFHItem = new SimpleMod(IDs.CoFHItem) val CoFHTileEntity = new SimpleMod(IDs.CoFHTileEntity) val CoFHTransport = new SimpleMod(IDs.CoFHTransport) + val ColoredLights = new SimpleMod(IDs.ColoredLights) val ComputerCraft = new SimpleMod(IDs.ComputerCraft, version = "@[1.73,)") val CraftingCosts = new SimpleMod(IDs.CraftingCosts) val DeepStorageUnit = new ClassBasedMod(IDs.DeepStorageUnit, "powercrystals.minefactoryreloaded.api.IDeepStorageUnit")() @@ -166,6 +167,7 @@ object Mods { final val CoFHItem = "CoFHAPI|item" final val CoFHTileEntity = "CoFHAPI|tileentity" final val CoFHTransport = "CoFHAPI|transport" + final val ColoredLights = "easycoloredlights" final val ComputerCraft = "ComputerCraft" final val CraftingCosts = "CraftingCosts" final val ElectricalAge = "Eln" diff --git a/src/main/scala/li/cil/oc/integration/coloredlights/ModColoredLights.scala b/src/main/scala/li/cil/oc/integration/coloredlights/ModColoredLights.scala new file mode 100644 index 000000000..c52697549 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/coloredlights/ModColoredLights.scala @@ -0,0 +1,25 @@ +package li.cil.oc.integration.coloredlights + +import coloredlightscore.src.api.CLApi +import li.cil.oc.integration.Mods +import net.minecraft.block.Block + +// Doesn't need initialization, just a thin wrapper for block light value initialization. +object ModColoredLights { + def setLightLevel(block: Block, r: Int, g: Int, b: Int): Unit = { + // Extra layer of indirection because I've learned to be paranoid when it comes to class loading... + if (Mods.ColoredLights.isAvailable) + setColoredLightLevel(block, r, g, b) + else + setPlainLightLevel(block, r, g, b) + } + + private def setColoredLightLevel(block: Block, r: Int, g: Int, b: Int): Unit = { + CLApi.setBlockColorRGB(block, r, g, b) + } + + private def setPlainLightLevel(block: Block, r: Int, g: Int, b: Int): Unit = { + val brightness = Array(r, g, b).max + block.setLightLevel((brightness + 0.1f) / 15f) + } +} From 0fa31e854e734136f386f64cc2b2006602083519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 12 Jul 2015 13:58:10 +0200 Subject: [PATCH 41/42] Version bump. --- build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.properties b/build.properties index 2c2e55c76..98e9f2ea4 100644 --- a/build.properties +++ b/build.properties @@ -1,7 +1,7 @@ minecraft.version=1.7.10 forge.version=10.13.4.1448-1.7.10 -oc.version=1.5.13 +oc.version=1.5.14 oc.subversion=dev ae2.version=rv2-beta-26 From f1360f81581800460ff916b5f7646f39e7358e51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 12 Jul 2015 14:04:28 +0200 Subject: [PATCH 42/42] Make redstone visually connect to net splitter. Closes #1293. --- src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala b/src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala index 4922243a2..60c37b5db 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/NetSplitter.scala @@ -13,6 +13,8 @@ import net.minecraftforge.common.util.ForgeDirection class NetSplitter extends traits.Environment with traits.RedstoneAware with api.network.SidedEnvironment { private final val SideCount = ForgeDirection.VALID_DIRECTIONS.length + _isOutputEnabled = true + val node = api.Network.newNode(this, Visibility.None). create()