Merge branch 'master-MC1.10' of github.com:MightyPirates/OpenComputers into master-MC1.11

# Conflicts:
#	build.properties
#	src/main/scala/li/cil/oc/common/entity/Drone.scala
#	src/main/scala/li/cil/oc/integration/jei/ManualUsageHandler.scala
This commit is contained in:
Florian Nücke 2017-02-25 18:11:57 +01:00
commit 200a49d3bf
16 changed files with 208 additions and 52 deletions

Binary file not shown.

Binary file not shown.

View File

@ -103,7 +103,7 @@ public interface Network {
Iterable<Node> nodes();
/**
* The list of addressed nodes in the network visible to the specified node.
* The list of addressed nodes in the network reachable by the specified node.
* <p/>
* This does <em>not</em> include nodes with a visibility of <tt>None</tt>
* or a visibility of <tt>Neighbors</tt> when there is no direct connection

View File

@ -23,12 +23,14 @@ tile.oc.hologram2.name=Hologrammprojektor (Stufe 2)
tile.oc.keyboard.name=Tastatur
tile.oc.microcontroller.name=Mikrocontroller
tile.oc.motionSensor.name=Bewegungsmelder
tile.oc.netSplitter.name=Net Splitter
tile.oc.powerConverter.name=Leistungswandler
tile.oc.powerDistributor.name=Stromverteiler
tile.oc.print.name=3D-Druck
tile.oc.printer.name=3D-Drucker
tile.oc.raid.name=Raid
tile.oc.redstone.name=Redstone-I/O
tile.oc.relay.name=Relais
tile.oc.robot.name=Roboter
tile.oc.robotAfterimage.name=Roboter
tile.oc.screen1.name=Bildschirm (Stufe 1)
@ -36,7 +38,7 @@ tile.oc.screen2.name=Bildschirm (Stufe 2)
tile.oc.screen3.name=Bildschirm (Stufe 3)
tile.oc.rack.name=Serverschrank
tile.oc.switch.name=Switch
tile.oc.netSplitter.name=Net Splitter
tile.oc.transposer.name=Transposer
tile.oc.waypoint.name=Wegpunkt
# Items
@ -65,7 +67,9 @@ item.oc.DataCard1.name=Datenkarte (Stufe 2)
item.oc.DataCard2.name=Datenkarte (Stufe 3)
item.oc.DebugCard.name=Debug-Karte
item.oc.Debugger.name=Netzwerk-Debugger
item.oc.DiamondChip.name=Diamantsplitter
item.oc.Disk.name=Platte
item.oc.DiskDriveMountable.name=Diskettenlaufwerk
item.oc.Drone.name=Drohne
item.oc.DroneCase0.name=Drohnengehäuse (Stufe 1)
item.oc.DroneCase1.name=Drohnengehäuse (Stufe 2)
@ -98,6 +102,7 @@ item.oc.Microchip2.name=Microchip (Stufe 3)
item.oc.MicrocontrollerCase0.name=Mikrocontroller-Gehäuse (Stufe 1)
item.oc.MicrocontrollerCase1.name=Mikrocontroller-Gehäuse (Stufe 2)
item.oc.MicrocontrollerCase3.name=Mikrocontroller-Gehäuse (Kreativ)
item.oc.Nanomachines.name=Nanomaschinen
item.oc.NetworkCard.name=Netzwerkkarte
item.oc.NumPad.name=Ziffernblock
item.oc.Present.name=Ein kleines Etwas...
@ -114,6 +119,7 @@ item.oc.TabletCase0.name=Tablet-Gehäuse (Stufe 1)
item.oc.TabletCase1.name=Tablet-Gehäuse (Stufe 2)
item.oc.TabletCase3.name=Tablet-Gehäuse (Kreativ)
item.oc.Terminal.name=Fernbedienung
item.oc.TerminalServer.name=Terminalserver
item.oc.TexturePicker.name=Textur-Leser
item.oc.Transistor.name=Transistor
item.oc.UpgradeAngel.name=Schwebe-Upgrade
@ -138,6 +144,7 @@ item.oc.UpgradeHover1.name=Schwebe-Upgrade (Stufe 2)
item.oc.UpgradeInventory.name=Inventar-Upgrade
item.oc.UpgradeInventoryController.name=Inventarbedienungs-Upgrade
item.oc.UpgradeLeash.name=Leinen-Upgrade
item.oc.UpgradeMF.name=MFU
item.oc.UpgradeNavigation.name=Navigations-Upgrade
item.oc.UpgradePiston.name=Kolben-Upgrade
item.oc.UpgradeSign.name=Schild-I/O-Upgrade
@ -235,6 +242,7 @@ oc:container.Disassembler=Recycler
oc:container.DiskDrive=Diskettenlaufwerk
oc:container.Printer=Drucker
oc:container.Raid=Raid
oc:container.Relay=Relais
oc:container.Server=Server
oc:container.Rack=Serverschrank
oc:container.Switch=Switch
@ -271,10 +279,12 @@ oc:tooltip.DataCard1=Stellt einige komplexe Algorithmen wie Hash-Funktionen und
oc:tooltip.DataCard2=Stellt einige komplexe Algorithmen wie Hash-Funktionen und deflate/inflate bereit.
oc:tooltip.DebugCard=Kreativ-Modus-Gegenstand, erlaubt es die Welt zu manipulieren um das Testen zu erleichtern. Verwendung auf eigene Gefahr.
oc:tooltip.Debugger=Erlaubt, Informationen über OCs internes Netzwerk auszugeben. Nur verwenden, wenn von einem Entwickler dazu aufgefordert.
oc:tooltip.DiamondChip=Ein kleines Stück eines einst wunderschönen Diamanten. Er wird niemals wieder so sein, wie er war.
oc:tooltip.Disassembler=Zerlegt Gegenstände in ihre Einzelteile. §lWarnung§7: zurückgewonnene Gegenstände haben eine %s%%-ige Chance beim Extrahieren kaputt zu gehen!
oc:tooltip.Disk=Sehr einfaches Speichermedium, das verwendet werden kann, um Disketten und Festplatten zu fertigen.
oc:tooltip.DiskDrive.CC=ComputerCraft-Disketten werden §aauch unterstützt§7.
oc:tooltip.DiskDrive=Erlaubt es, Disketten zu lesen und zu beschreiben. Kann in Robotern installiert werden, um später Disketten einlegen zu können.
oc:tooltip.DiskDriveMountable=Funktioniert genauso wie ein normales Diskettenlaufwerk, wird aber in einem Serverschrank installiert.
oc:tooltip.DiskUsage=Festplattennutzung: %s/%s Byte
oc:tooltip.DiskModeManaged=Modus: Managed
oc:tooltip.DiskModeUnmanaged=Modus: Unmanaged
@ -303,6 +313,7 @@ oc:tooltip.Microchip=Tritt auch unter dem Alias Integrierter Schaltkreis auf. Ke
oc:tooltip.Microcontroller=Mikrocontroller sind einfachst-mögliche Computer. Sie sind dazu gedacht, für Spezialfälle verwendet zu werden, bei denen sie einfach das Programm auf dem in ihnen eingebauten EEPROM ausführen.
oc:tooltip.MicrocontrollerCase=Dieses Gehäuse wird verwendet, um Mikrocontroller in der Elektronik-Werkbank zu bauen. Platziere es in eine solche und füge weitere Komponenten hinzu, um einen Mikrocontroller zu erstellen.
oc:tooltip.MotionSensor=Kann Bewegungen sich in der Nähe befindender Lebewesen erkennen. Benötigt eine klare Sichtlinie.
oc:tooltip.Nanomachines=Kontrolleinheit und eine Menge Nanomaschinen zur Einnahme, sofern du dich traust.
oc:tooltip.NetworkCard=Erlaubt es Computern, die über mehrere Blöcke miteinander verbunden sind (z.B. Kabel), mittels Netzwerknachrichten zu kommunizieren.
oc:tooltip.PowerAcceptor=Energiewandelgeschwindigkeit: §f%s/t§7
oc:tooltip.PowerConverter.BuildCraft=§fBuildCraft MJ§7: §a%s:%s§7
@ -328,6 +339,7 @@ oc:tooltip.RedstoneCard.RedNet=§fRedNet§7 wird §aunterstützt§7.
oc:tooltip.RedstoneCard.WirelessCBE=§fWireless Redstone (ChickenBones)§7 wird §aunterstützt§7.
oc:tooltip.RedstoneCard.WirelessSV=§fWireless Redstone (SlimeVoid)§7 wird §aunterstützt§7.
oc:tooltip.RedstoneCard=Erlaubt das Lesen und Ausgeben von Redstonesignalen um den Computer oder Roboter herum.
oc:tooltip.Relay=Erlaubt es, mehrere Netzwerke miteinander zu verbinden. Leitet ausschließlich Netzwerknachrichten weiter, Komponenten "hinter" dem Switch sind nicht sichtbar. Nützlich, um Netzwerke zu trennen, jedoch nach wie vor Kommunikation zwischen den Netzwerken zu erlauben, z.b. mittels Netzwerkkarten.
oc:tooltip.Robot=Im Gegensatz zu normalen Computern können sich Roboter in der Welt bewegen und ähnlich wie Spieler mit der Welt interagieren. Sie können jedoch §onicht§r§7 mit externen Komponenten interagieren!
# The underscore makes sure this isn't hidden with the rest of the tooltip.
oc:tooltip.Robot_Level=§fStufe§7: §a%s§7.
@ -340,11 +352,13 @@ oc:tooltip.Switch=Erlaubt es, mehrere Netzwerke miteinander zu verbinden. Leitet
oc:tooltip.Tablet=Ein Tablet-PC, für Lua unterwegs. Kann durch Sneak-Aktivierung zwangsgestoppt werden.
oc:tooltip.TabletCase=Einfaches Gehäuse für Tablet-PCs. Kann in der Elektronik-Werkbank mit Komponenten bestückt werden, um einen Tablet-PC zu fertigen.
oc:tooltip.Terminal=Erlaubt es, einen Server aus der Ferne zu steuern, so lange man sich in Reichweite des Servers befindet. Verhält sich wie Bildschirm und Tastatur in einem. Kann mit Shift-Rechtsklick an einen Server in einem Serverschrank gebunden werden.
oc:tooltip.TerminalServer=Das Rückgrat für Fernzugriff. Fernbedienungen können hiermit verbunden werden. Enthält virtuelle Tastatur und Bildschirm.
oc:tooltip.TexturePicker=Dieses Werkzeug erlaubt es, eine Zeichenkette anzuzeigen, die die Oberfläche eines Blocks beschreibt und in Form-Definitionen für 3D-Drucker verwendet werden kann. Definiv keine Texturnamen, oh nein. Nix da.
oc:tooltip.Tier=§8Stufe %s
oc:tooltip.NetSplitter=Kann Netzwerke dynamisch verbinden. Die Konnektivität jeder Seite kann umgeschaltet werden, in dem man "Professionelle Wartungsarbeiten" mit einem Schraubenschlüssel durchführt. Sie kann auch mit einem Redstone-Signal an entsprechenden Seiten invertiert werden.
oc:tooltip.TooLong=Halte [§f%s§7] gedrückt für mehr Infos.
oc:tooltip.Transistor=Elementarer Baustein der meisten Computerkomponenten. Nicht zu verwechseln mit Steinelementaren.
oc:tooltip.Transposer=Ermöglicht automatischen Transfer von Items und Flüssigkeiten zwischen angrenzenden Blöcken.
oc:tooltip.UpgradeAngel=Erlaubt es Robotern, Blöcke in die Luft zu setzen, selbst wenn kein Referenzblock daneben existiert.
oc:tooltip.UpgradeBattery=Erhöht die Energiespeicherkapazität eines Roboters, was ihm erlaubt, länger zu arbeiten, ohne erneut aufgeladen werden zu müssen.[nl] Kapazität: §f%s§7
oc:tooltip.UpgradeChunkloader=Wenn sich im Wald ein Roboter bewegt, und niemand da ist, ihn zu sehen, bewegt er sich dann wirklich? Dieses Upgrade stellt sicher, dass dem so ist. Es hält den Chunk, in dem sich der Roboter befindet, geladen, verbraucht jedoch Energie, während es aktiv ist.
@ -357,6 +371,9 @@ oc:tooltip.UpgradeGenerator=Kann verwendet werden, um unterwegs Energie aus Bren
oc:tooltip.UpgradeHover=Erlaubt Robotern höher zu fliegen, ohne an Wänden klettern zu müssen.[nl] Maximalhöhe: §f%s§7
oc:tooltip.UpgradeInventory=Dieses Upgrade gibt Robotern ein internes Inventar. Ohne ein solches Upgrade können Roboter keine Gegenstände verwahren.
oc:tooltip.UpgradeInventoryController=Dieses Upgrade erlaubt es dem Roboter, präziser mit externen Inventaren zu interagieren, und erlaubt es ihm, das angelegte Werkzeug mit einem Gegenstand in seinem Inventar auszutauschen.
oc:tooltip.UpgradeMF=Erlaubt es Adaptern, mit Blöcken zu interagieren, die etwas weiter weg sind.
oc:tooltip.UpgradeMF.Linked=§fVerbindung hergestellt§7
oc:tooltip.UpgradeMF.Unlinked=§fKeine Verbindung§7
oc:tooltip.UpgradeLeash=Erlaubt es manchen Geräten, wie etwa Drohnen, B- *getuschel* Verzeihung. Mir wurde soeben zugetragen, dass es tatsächlich dazu verwendet werden kann, Tiere an die Leine zu legen. Sogar viele Viecher.
oc:tooltip.UpgradeNavigation=Erlaubt es Robotern, ihre Position und Ausrichtung zu bestimmen. Die Position ist relativ zur Mitte der Karte, die in diesem Upgrade verbaut wurde.
oc:tooltip.UpgradePiston=Dieses Upgrade erlaubt es zu drängeln. Es macht es möglich Blöcke zu verschieben, ähnlich dem Kolben. Es kann jedoch §lkeine§7 Entities bewegen.
@ -444,6 +461,15 @@ achievement.oc.transistor.desc=Jetzt kannst du dir den Soundtrack anhören.
achievement.oc.wirelessNetworkCard=Das WLAN - Unendliche Weiten
achievement.oc.wirelessNetworkCard.desc=Netzwerke, die nie ein Paket zuvor gesehen hat.
# Death messages. Note that the number of entries here must match the number
# set in the actual damage source in code.
death.attack.oc.nanomachinesOverload.1=%s ist zu gierig geworden.
death.attack.oc.nanomachinesOverload.2=%s erlitt einen Nervenzusammenbruch.
death.attack.oc.nanomachinesOverload.3=Die Nanomaschinen von %s gerieten wohl außer Kontrolle. Ups.
death.attack.oc.nanomachinesHungry.1=%s wurde von Nanomaschinen verspeist.
death.attack.oc.nanomachinesHungry.2=%s hat wohl seine Nanomaschinen nicht gefüttert.
death.attack.oc.nanomachinesHungry.3=%s wurde verdaut.
# NEI Integration
nei.options.inventory.oredict=OreDictionary-Namen anzeigen
nei.options.inventory.oredict.true=True

View File

@ -21,7 +21,7 @@ local function get(pasteId, filename)
end
io.write("Downloading from pastebin.com... ")
local url = "http://pastebin.com/raw.php?i=" .. pasteId
local url = "http://pastebin.com/raw/" .. pasteId
local result, response = pcall(internet.request, url)
if result then
io.write("success.\n")

View File

@ -15,7 +15,8 @@ function loadfile(filename, mode, env)
end
table.insert(buffer, data)
end
buffer = table.concat(buffer):gsub("^#![^\n]+", "") -- remove shebang if any
buffer[1] = (buffer[1] or ""):gsub("^#![^\n]+", "") -- remove shebang if any
buffer = table.concat(buffer)
return load(buffer, "=" .. filename, mode, env)
end

View File

@ -11,10 +11,10 @@ function internet.request(url, data, headers)
checkArg(2, data, "string", "table", "nil")
checkArg(3, headers, "table", "nil")
local inet = component.internet
if not inet then
if not component.isAvailable("internet") then
error("no primary internet card found", 2)
end
local inet = component.internet
local post
if type(data) == "string" then
@ -31,23 +31,35 @@ function internet.request(url, data, headers)
error(reason, 2)
end
return function()
while true do
local data, reason = request.read()
if not data then
request.close()
if reason then
error(reason, 2)
else
return nil -- eof
return setmetatable(
{
["()"] = "function():string -- Tries to read data from the socket stream and return the read byte array.",
close = setmetatable({},
{
__call = request.close,
__tostring = function() return "function() -- closes the connection" end
})
},
{
__call = function()
while true do
local data, reason = request.read()
if not data then
request.close()
if reason then
error(reason, 2)
else
return nil -- eof
end
elseif #data > 0 then
return data
end
elseif #data > 0 then
return data
-- else: no data, block
os.sleep(0)
end
-- else: no data, block
os.sleep(0)
end
end
end,
__index = request,
})
end
-------------------------------------------------------------------------------

View File

@ -390,7 +390,13 @@ function term.drawText(value, wrap, window)
local function scroll(_sy,_y)
return _sy + term.internal.scroll(window,_y-h), math.min(_y,h)
end
local uptime = computer.uptime
local last_sleep = uptime()
while index <= vlen do
if uptime() - last_sleep > 4 then
os.sleep(0)
last_sleep = uptime()
end
local si,ei = value:find("[\t\r\n\a]", index)
si = si or vlen+1
if index==si then
@ -401,7 +407,7 @@ function term.drawText(value, wrap, window)
x,y=1,y+1
sy,y = scroll(sy,y)
elseif delim=="\a" and not beeped then
require("computer").beep()
computer.beep()
beeped = true
end
cr_last = delim == "\r"

View File

@ -656,7 +656,7 @@ object Settings {
}
def checkAccess(ctxOpt: Option[DebugCard.AccessContext]): Option[String] = ctxOpt match {
case Some(ctx) => values.get(ctx.player) match {
case Some(ctx) => values.get(ctx.player.toLowerCase) match {
case Some(x) =>
if (x == ctx.nonce) None
else Some("debug card is invalidated, please re-bind it to yourself")

View File

@ -475,6 +475,7 @@ class Drone(world: World) extends Entity(world) with MachineHost with internal.D
}
override def processInitialInteract(player: EntityPlayer, hand: EnumHand): Boolean = {
if (isDead) return false
if (player.isSneaking) {
if (Wrench.isWrench(player.getHeldItemMainhand)) {
if(!world.isRemote) {
@ -546,6 +547,7 @@ class Drone(world: World) extends Entity(world) with MachineHost with internal.D
}
override def kill(): Unit = {
if (isDead) return
super.kill()
if (!world.isRemote) {
val stack = api.Items.get(Constants.ItemName.Drone).createItemStack(1)

View File

@ -22,7 +22,7 @@ class DebugCard(val parent: Delegator) extends traits.Delegate {
}
override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer): ActionResult[ItemStack] = {
if (player.isSneaking) {
if (!world.isRemote && player.isSneaking) {
val data = new DebugCardData(stack)
val name = player.getName

View File

@ -5,6 +5,7 @@ import javax.annotation.Nonnull
import com.google.common.base.Strings
import com.mojang.realmsclient.gui.ChatFormatting
import li.cil.oc.Settings
import li.cil.oc.api
import li.cil.oc.api.driver.EnvironmentAware
import li.cil.oc.api.prefab.DriverTileEntity
@ -20,6 +21,7 @@ import mezz.jei.api.recipe.BlankRecipeWrapper
import mezz.jei.api.recipe.IRecipeHandler
import net.minecraft.client.Minecraft
import net.minecraft.item.ItemStack
import net.minecraft.util.ResourceLocation
import scala.collection.convert.WrapAsJava._
import scala.collection.convert.WrapAsScala._
@ -119,11 +121,15 @@ object CallbackDocHandler {
val recipeWidth: Int = 160
val recipeHeight: Int = 125
private var background: IDrawable = _
private var icon: IDrawable = _
def initialize(guiHelper: IGuiHelper) {
background = guiHelper.createBlankDrawable(recipeWidth, recipeHeight)
icon = new DrawableAnimatedIcon(new ResourceLocation(Settings.resourceDomain, "textures/items/tablet_on.png"), 0, 0, 16, 16, 16, 32, new TickTimer(20, 1, countDown = true), 0, 16)
}
override def getIcon: IDrawable = icon
override def getBackground: IDrawable = background
override def setRecipe(recipeLayout: IRecipeLayout, recipeWrapper: CallbackDocRecipe, ingredients: IIngredients) {

View File

@ -0,0 +1,97 @@
package li.cil.oc.integration.jei
import mezz.jei.api.gui.IDrawableAnimated
import mezz.jei.api.gui.IDrawableStatic
import mezz.jei.api.gui.ITickTimer
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.Gui
import net.minecraft.util.ResourceLocation
import net.minecraftforge.fml.relauncher.Side
import net.minecraftforge.fml.relauncher.SideOnly
/**
* Taken from The 1.11 version of JEI to support different texture sizes
*
* @author mezz, Vexatos
*/
class DrawableIcon(resourceLocation: ResourceLocation, u: Int, v: Int, width: Int, height: Int, textureWidth: Int, textureHeight: Int,
paddingTop: Int = 0, paddingBottom: Int = 0, paddingLeft: Int = 0, paddingRight: Int = 0) extends IDrawableStatic {
// TODO Remove entire class in 1.11, replace with createDrawable
override def getWidth: Int = width + paddingLeft + paddingRight
override def getHeight: Int = height + paddingTop + paddingBottom
@SideOnly(Side.CLIENT)
override def draw(minecraft: Minecraft): Unit = draw(minecraft, 0, 0)
@SideOnly(Side.CLIENT)
override def draw(minecraft: Minecraft, xOffset: Int, yOffset: Int): Unit = draw(minecraft, xOffset, yOffset, 0, 0, 0, 0)
@SideOnly(Side.CLIENT)
override def draw(minecraft: Minecraft, xOffset: Int, yOffset: Int, maskTop: Int, maskBottom: Int, maskLeft: Int, maskRight: Int) {
minecraft.getTextureManager.bindTexture(this.resourceLocation)
val x = xOffset + this.paddingLeft + maskLeft
val y = yOffset + this.paddingTop + maskTop
val u = this.u + maskLeft
val v = this.v + maskTop
val width = this.width - maskRight - maskLeft
val height = this.height - maskBottom - maskTop
Gui.drawModalRectWithCustomSizedTexture(x, y, u, v, width, height, textureWidth, textureHeight)
}
}
/**
* Used to simulate an animated texture.
* @author Vexatos
*/
class DrawableAnimatedIcon(resourceLocation: ResourceLocation, u: Int, v: Int, width: Int, height: Int, textureWidth: Int, textureHeight: Int,
tickTimer: ITickTimer, uOffset: Int, vOffset: Int,
paddingTop: Int = 0, paddingBottom: Int = 0, paddingLeft: Int = 0, paddingRight: Int = 0) extends IDrawableAnimated {
override def getWidth: Int = width + paddingLeft + paddingRight
override def getHeight: Int = height + paddingTop + paddingBottom
@SideOnly(Side.CLIENT)
override def draw(minecraft: Minecraft): Unit = draw(minecraft, 0, 0)
@SideOnly(Side.CLIENT)
override def draw(minecraft: Minecraft, xOffset: Int, yOffset: Int) {
val animationValue = tickTimer.getValue
val uOffsetTotal = uOffset * animationValue
val vOffsetTotal = vOffset * animationValue
minecraft.getTextureManager.bindTexture(resourceLocation)
val x = xOffset + this.paddingLeft
val y = yOffset + this.paddingTop
val u = this.u + uOffsetTotal
val v = this.v + vOffsetTotal
Gui.drawModalRectWithCustomSizedTexture(x, y, u, v, width, height, textureWidth, textureHeight)
}
}
/**
* Fixed implementation of TickTimer.
* @author mezz, Vexatos
*/
class TickTimer(ticksPerCycle: Int, maxValue: Int, countDown: Boolean = false) extends ITickTimer {
// TODO Replace with createTickTimer with JEI 3.14.6
private var lastUpdateWorldTime: Long = 0
private var tickCount: Int = 0
def getValue: Int = {
val worldTime = Minecraft.getMinecraft.theWorld.getTotalWorldTime
val ticksPassed = worldTime - lastUpdateWorldTime
lastUpdateWorldTime = worldTime
tickCount += ticksPassed.toInt
if (tickCount >= ticksPerCycle) tickCount = 0
val value = Math.round((tickCount * maxValue).toFloat / ticksPerCycle)
if(countDown) maxValue - value
else value
}
def getMaxValue: Int = maxValue
}

View File

@ -4,6 +4,7 @@ import java.util
import javax.annotation.Nonnull
import li.cil.oc.Localization
import li.cil.oc.Settings
import li.cil.oc.api
import mezz.jei.api.IGuiHelper
import mezz.jei.api.IModRegistry
@ -15,6 +16,7 @@ import mezz.jei.api.recipe.BlankRecipeWrapper
import mezz.jei.api.recipe.IRecipeHandler
import net.minecraft.client.Minecraft
import net.minecraft.item.ItemStack
import net.minecraft.util.ResourceLocation
import net.minecraftforge.fml.client.config.GuiButtonExt
import scala.collection.convert.WrapAsJava._
@ -65,10 +67,12 @@ object ManualUsageHandler {
object ManualUsageRecipeCategory extends BlankRecipeCategory[ManualUsageRecipe] {
val recipeWidth: Int = 160
val recipeHeight: Int = 125
private var background: IDrawable = null
private var background: IDrawable = _
private var icon: IDrawable = _
def initialize(guiHelper: IGuiHelper) {
background = guiHelper.createBlankDrawable(recipeWidth, recipeHeight)
icon = new DrawableIcon(new ResourceLocation(Settings.resourceDomain, "textures/items/manual.png"), 0, 0, 16, 16, 16, 16)
}
override def getBackground: IDrawable = background

View File

@ -3,13 +3,13 @@ package li.cil.oc.server.component
import java.util
import li.cil.oc.Constants
import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute
import li.cil.oc.api.driver.DeviceInfo.DeviceClass
import li.cil.oc.Localization
import li.cil.oc.Settings
import li.cil.oc.api
import li.cil.oc.api.Network
import li.cil.oc.api.driver.DeviceInfo
import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute
import li.cil.oc.api.driver.DeviceInfo.DeviceClass
import li.cil.oc.api.machine.Arguments
import li.cil.oc.api.machine.Callback
import li.cil.oc.api.machine.Context
@ -72,32 +72,15 @@ class GraphicsCard(val tier: Int) extends prefab.ManagedEnvironment with DeviceI
)
def capacityInfo = (maxResolution._1 * maxResolution._2).toString
def widthInfo = Array("1", "4", "8").apply(maxDepth.ordinal())
def clockInfo = ((2000 / setBackgroundCosts(tier)).toInt / 100).toString + "/" + ((2000 / setForegroundCosts(tier)).toInt / 100).toString + "/" + ((2000 / setPaletteColorCosts(tier)).toInt / 100).toString + "/" + ((2000 / setCosts(tier)).toInt / 100).toString + "/" + ((2000 / copyCosts(tier)).toInt / 100).toString + "/" + ((2000 / fillCosts(tier)).toInt / 100).toString
override def getDeviceInfo: util.Map[String, String] = deviceInfo
// ----------------------------------------------------------------------- //
override val canUpdate = true
override def update() {
super.update()
if (node.network != null && screenInstance.isEmpty && screenAddress.isDefined) {
Option(node.network.node(screenAddress.get)) match {
case Some(node: Node) if node.host.isInstanceOf[api.internal.TextBuffer] =>
screenInstance = Some(node.host.asInstanceOf[api.internal.TextBuffer])
case _ =>
// This could theoretically happen after loading an old address, but
// if the screen either disappeared between saving and now or changed
// type. The first scenario is more likely, and could happen if the
// chunk the screen is in isn't loaded when the chunk the GPU is in
// gets loaded.
screenAddress = None
}
}
}
@Callback(doc = """function(address:string[, reset:boolean=true]):boolean -- Binds the GPU to the screen with the specified address and resets screen settings if `reset` is true.""")
def bind(context: Context, args: Arguments): Array[AnyRef] = {
val address = args.checkString(0)
@ -395,6 +378,17 @@ class GraphicsCard(val tier: Int) extends prefab.ManagedEnvironment with DeviceI
}
}
override def onConnect(node: Node): Unit = {
super.onConnect(node)
if (screenInstance.isEmpty && screenAddress.fold(false)(_ == node.address)) {
node.host match {
case buffer: api.internal.TextBuffer =>
screenInstance = Some(buffer)
case _ => // Not the screen node we're looking for.
}
}
}
override def onDisconnect(node: Node) {
super.onDisconnect(node)
if (node == this.node || screenAddress.contains(node.address)) {

View File

@ -160,12 +160,20 @@ private class Network private(private val data: mutable.Map[String, Network.Vert
def nodes: Iterable[ImmutableNode] = data.values.map(_.data)
def nodes(reference: ImmutableNode): Iterable[ImmutableNode] = {
def reachableNodes(reference: ImmutableNode): Iterable[ImmutableNode] = {
val referenceNeighbors = neighbors(reference).toSet
nodes.filter(node => node != reference && (node.reachability == Visibility.Network ||
(node.reachability == Visibility.Neighbors && referenceNeighbors.contains(node))))
}
def reachingNodes(reference: ImmutableNode): Iterable[ImmutableNode] = {
if (reference.reachability == Visibility.Network) nodes.filter(node => node != reference)
else if (reference.reachability == Visibility.Neighbors) {
val referenceNeighbors = neighbors(reference).toSet
nodes.filter(node => node != reference && referenceNeighbors.contains(node))
} else Iterable.empty
}
def neighbors(node: ImmutableNode): Iterable[ImmutableNode] = {
data.get(node.address) match {
case Some(n) if n.data == node => n.edges.map(_.other(n).data)
@ -194,13 +202,13 @@ private class Network private(private val data: mutable.Map[String, Network.Vert
def sendToReachable(source: ImmutableNode, name: String, args: AnyRef*) = {
if (source.network != wrapper)
throw new IllegalArgumentException("Source node must be in this network.")
send(source, nodes(source), name, args: _*)
send(source, reachableNodes(source), name, args: _*)
}
def sendToVisible(source: ImmutableNode, name: String, args: AnyRef*) = {
if (source.network != wrapper)
throw new IllegalArgumentException("Source node must be in this network.")
send(source, nodes(source) collect {
send(source, reachableNodes(source) collect {
case component: api.network.Component if component.canBeSeenFrom(source) => component
}, name, args: _*)
}
@ -236,11 +244,11 @@ private class Network private(private val data: mutable.Map[String, Network.Vert
connects += ((addedNode, Iterable(addedNode)))
case Visibility.Neighbors =>
connects += ((addedNode, Iterable(addedNode) ++ neighbors(addedNode)))
nodes(addedNode).foreach(node => connects += ((node, Iterable(addedNode))))
reachingNodes(addedNode).foreach(node => connects += ((node, Iterable(addedNode))))
case Visibility.Network =>
// Explicitly send to the added node itself first.
connects += ((addedNode, Iterable(addedNode) ++ nodes.filter(_ != addedNode)))
nodes(addedNode).foreach(node => connects += ((node, Iterable(addedNode))))
reachingNodes(addedNode).foreach(node => connects += ((node, Iterable(addedNode))))
}
}
else {
@ -746,7 +754,7 @@ object Network extends api.detail.NetworkAPI {
def nodes = network.nodes.asJava
def nodes(reference: ImmutableNode) = network.nodes(reference).asJava
def nodes(reference: ImmutableNode) = network.reachableNodes(reference).asJava
def neighbors(node: ImmutableNode) = network.neighbors(node).asJava