mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-17 03:05:30 -04:00
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:
commit
200a49d3bf
Binary file not shown.
Binary file not shown.
@ -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
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
@ -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"
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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) {
|
||||
|
97
src/main/scala/li/cil/oc/integration/jei/DrawableIcon.scala
Normal file
97
src/main/scala/li/cil/oc/integration/jei/DrawableIcon.scala
Normal 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
|
||||
}
|
@ -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
|
||||
|
@ -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)) {
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user