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/38] 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 ad0f8ae62c..c3c8ed87e0 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 26f01224ac..413dbe481a 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 2244530587..4f6aae03ed 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 0000000000..79aa183ed2 --- /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 ed4bf4a79a..9d8ecf086f 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 0000000000..7e14643820 --- /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 653c60c26b..0000000000 --- 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 0000000000..0e2763b1b5 --- /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 0000000000..6702f2b3b1 --- /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 0000000000..a2b5d1054f --- /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/38] 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 336b3b4dcc..974296beeb 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/38] 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 0623789c73..051bcb5d88 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 @@ */ 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 e126f64408..a23950f569 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 static li.cil.oc.api.fs.FileSystem fromComputerCraft(final Object mount) 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 b45bd5b3e9..69f06e6332 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 70ab6ab9f3..ca46dddb48 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 d87befa547..e7021dce9d 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 0000000000..8b8be08c50 --- /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/38] 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 3f9adc63c6..1f3d94450b 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/38] 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 25367c2867..b147bcc1e4 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 5c084a5ca0..a961a9aa54 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 26e719a25e..da7148a110 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 7edda653b5..dcbeb1d159 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/38] 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 e272d0b9d0..e511b45212 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 6ae500f365..71f0a4d46a 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/38] 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 ffb31dba31..af2d98fd3f 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/38] 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 ec831a03aa..b82ebd7cff 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/38] 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 c36b0e8561..d79c1db60d 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 61180803e8..cb28af4a94 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/38] 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 cb28af4a94..907282b41a 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/38] 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 af2d98fd3f..cfd9a5656e 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/38] 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 b880cbdc66..fe5d776758 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/38] 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 8a08680c9e..56e79e3c0b 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/38] 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 53d76de29d..9165e1cc9d 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/38] 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 a00364eeb0..804b6bb474 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 08355d98e2..dc20b94249 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/38] 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 6a8a874af1..ebdb3ba2c3 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 777e2b67ce..5e63c7c612 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/38] 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 b0299dcd98..4e8a8bd5d6 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/38] 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 48c19787ee..3cebc11426 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,32 +19,27 @@ 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 cable: Cable => - GL11.glScalef(1.6f, 1.6f, 1.6f) + case assembler: Assembler => GL11.glTranslatef(-0.5f, -0.5f, -0.5f) Tessellator.instance.startDrawingQuads() - Cable.render(block, metadata, renderer) + Assembler.render(block, metadata, renderer) 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 => + 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) Tessellator.instance.startDrawingQuads() - Assembler.render(block, metadata, renderer) + Cable.render(block, metadata, renderer) Tessellator.instance.draw() - RenderState.checkError(getClass.getName + ".renderInventoryBlock: assembler") + RenderState.checkError(getClass.getName + ".renderInventoryBlock: cable") 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/38] 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 1275d7a488..4aed941c87 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 0000000000..91c4189626 --- /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 c3c8ed87e0..ddee8cb385 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 1b52ce6237..d65482adc8 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 d79c1db60d..b9b514010a 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 9d8ecf086f..6d61adb771 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 49b537d2d1..8c8adaa778 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 3cebc11426..90098f7544 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 0000000000..4b783af5c9 --- /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 0000000000..5b919f433f --- /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 b6eb1c0d4f..2d90662f04 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 0000000000..fa66fba1f8 --- /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 fd51617373..5c86471d7a 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 0000000000..312a0d3c27 --- /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 7847db5e32..92ccccd863 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/38] 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 94047e9ee1..6ae6d04bf5 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 439e740574..b0050abc71 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 c72e37b85a..fe57294e35 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/38] 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 0280904d98..8635de86e5 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 void convert(final Object value, final Map output) { 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/38] 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 4aed941c87..a33f405575 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 91c4189626..230e4484f7 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 ddee8cb385..51d960d4aa 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 c4dc61addc..be4e6880fe 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 d65482adc8..ff3ecc7c4a 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 b9b514010a..9cf57901b4 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 6d61adb771..aa96dcb659 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 8c8adaa778..6e21bbc54f 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 16d7e61031..cd0768b643 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 90098f7544..782c7dcc97 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 4b783af5c9..a7f227d3f5 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 5b919f433f..b0eeca6ded 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 2d90662f04..770e3c3896 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 a7a6b1e891..4e934476a8 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 fa66fba1f8..64892defae 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 5c86471d7a..7acf21d27b 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 312a0d3c27..4922243a28 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 92ccccd863..df0ba86e4c 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/38] 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 98618ae27c..744c2497db 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/38] 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 8abbb7ff5f..8cc3586e41 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 e8a4331ec4..eaf66bb0f9 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 ade998ca30..2c37414f22 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 ee1f29ac75..728ee3d4f7 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 69afe5996a..78121cbb2f 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 d7de95eb5b..7487ff5a95 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 649f641fdb..37ed5e7bdc 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 d68c27e0c1..06eebf279c 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 744c2497db..0536d12b8a 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/38] 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 0536d12b8a..d16dda0d32 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 3b96f1ff6d2dde8100f5f30602a63a659fc2040e Mon Sep 17 00:00:00 2001 From: cyber01 Date: Sat, 11 Jul 2015 20:09:34 +0300 Subject: [PATCH 26/38] 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 0a412c4666..e7f37a7b5e 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 0000000000..13a1efa6fd --- /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 1f3d94450b..6389316447 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 27/38] 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 e7f37a7b5e..16169b6c5e 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 28/38] 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 16169b6c5e..5a8833c463 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 13a1efa6fd..78a3ed03a2 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 6389316447..658abedaf2 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 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 29/38] 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 78121cbb2f..59771cccea 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 0e2763b1b5..0c70c60fe8 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 0000000000..690e47056f --- /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 8a51f0d705..951498bd9e 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 db8726612879869ed113fa3564d8579745bc6c21 Mon Sep 17 00:00:00 2001 From: Kubuxu Date: Sun, 12 Jul 2015 11:08:10 +0200 Subject: [PATCH 30/38] 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 799b0ec781..c85d53611a 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 e22e68f439..b71d7d4128 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 31/38] 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 652c57049f..db5d279906 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 32/38] 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 5685f70ea6..df519361ee 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 8f061df85b..68cc3cacb6 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 33/38] 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 a41112f131..17493abaa9 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 df3cdd9979..14db126643 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 31b594c1dc..b39c4f4d85 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 34/38] 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 799b0ec781..647c2c92fa 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 e22e68f439..b71d7d4128 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 35/38] 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 652c57049f..db5d279906 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 36/38] 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 c85d53611a..2ad68a282d 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 b71d7d4128..2c2e55c766 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 c2509c5213..20b104df05 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 d5621d5d60..b3f56932eb 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 136e5e7983..c98579e37c 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 03f7f4284e..b79c2ea034 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 06da52a63d..069e4b2009 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 97f216e239..f2f88120fc 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 df519361ee..58e8fefcb4 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 97b410ff74..4a508be9dd 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 0000000000..c526975499 --- /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 37/38] Version bump. --- build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.properties b/build.properties index 2c2e55c766..98e9f2ea46 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 38/38] 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 4922243a28..60c37b5db6 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()