Merge branch master-MC1.7.10 into master-MC1.10

# Conflicts:
#	src/main/resources/assets/opencomputers/textures/items/WirelessNetworkCard.png
#	src/main/resources/assets/opencomputers/textures/items/WirelessNetworkCard1.png
#	src/main/resources/assets/opencomputers/textures/items/wlanCard.png
#	src/main/scala/li/cil/oc/Settings.scala
#	src/main/scala/li/cil/oc/common/Proxy.scala
#	src/main/scala/li/cil/oc/common/init/Items.scala
#	src/main/scala/li/cil/oc/common/tileentity/AccessPoint.scala
#	src/main/scala/li/cil/oc/common/tileentity/Relay.scala
#	src/main/scala/li/cil/oc/server/component/WirelessNetworkCard.scala
This commit is contained in:
payonel 2017-12-26 07:49:29 -08:00
commit 3b40a8e1b8
90 changed files with 672 additions and 344 deletions

Binary file not shown.

View File

@ -192,7 +192,7 @@ repositories {
configurations {
provided
embedded
compile.extendsFrom provided, embedded
compile.extendsFrom embedded
}
dependencies {
@ -285,6 +285,9 @@ dependencies {
testCompile "org.scalatest:scalatest_2.11:2.2.6"
}
// Add the "provided" dependencies to the compile (but NOT runtime) classpath.
sourceSets.main.compileClasspath += [configurations.provided]
idea.module.scopes.PROVIDED.plus += [configurations.provided]
// eclipse.classpath.plusConfigurations += [configurations.provided]

View File

@ -145,11 +145,12 @@ opencomputers {
eepromDataSize: 256
# The number of components the different CPU tiers support. This list
# must contain exactly three entries, or it will be ignored.
# must contain exactly four entries, or it will be ignored.
cpuComponentCount: [
8
12
16
1024
]
# The provided call budgets by the three tiers of CPU and memory. Higher
@ -702,7 +703,8 @@ opencomputers {
# 400 * `wirelessCostPerRange`. In other words, the higher this value,
# the higher the cost of wireless messages.
# See also: `maxWirelessRange`.
wirelessCostPerRange: 0.05
# These values are for the tier 1 and 2 wireless cards, in that order.
wirelessCostPerRange: [0.05, 0.05]
# The cost of a single packet sent via StargateTech 2's abstract bus.
abstractBusPacket: 1
@ -1228,7 +1230,9 @@ opencomputers {
# The maximum number of ports a single network card can have opened at
# any given time.
maxOpenPorts: 16
# Note that the order for this list is: Wired Network Card -> Tier 1 Wireless
# Network Card -> Tier 2 Wireless Network Card
maxOpenPorts: [16, 1, 16]
# The maximum distance a wireless message can be sent. In other words,
# this is the maximum signal strength a wireless network card supports.
@ -1236,7 +1240,8 @@ opencomputers {
# which may or may not lead to performance issues for ridiculous ranges -
# like, you know, more than the loaded area.
# See also: `wirelessCostPerRange`.
maxWirelessRange: 400
# These values are for the tier 1 and 2 wireless cards, in that order.
maxWirelessRange: [16, 400]
# The number of remote terminals supported by each server tier.
terminalsPerTier: [2, 4, 8]

View File

@ -4,7 +4,7 @@
Das Relay kann verwendet werden um verschiedene Subnetzwerken das Senden von Nachrichten zueinander zu ermöglichen, ohne Komponenten Computern in anderen Netzen zugänglich zu machen. Grundsätzlich ist es eine gute Idee Komponenten lokal zu behalten, damit [Computer](../general/computer.md) nicht die falschen Komponenten ansprechen oder Komponenten-Overflows zu verursachen (welche dazu führen, dass Computer crashen und nicht hochfahren.)
Mit einer [Drahtlosnetzwerkkarte](../item/wlanCard.md) können auch kabellose Nachrichten weitergeleitet werden. Dann kann dieser Block als Repeater verwendet werden: Es kann Nachrichten aus verkabelten Netzwerken zu anderen Geräten in verkabelten Netzwerken weiterleiten, oder Nachrichten aus kabellosen Netzwerken zu verkabelten oder kabellosen Netzwerken.
Mit einer [Drahtlosnetzwerkkarte](../item/wlanCard1.md) können auch kabellose Nachrichten weitergeleitet werden. Dann kann dieser Block als Repeater verwendet werden: Es kann Nachrichten aus verkabelten Netzwerken zu anderen Geräten in verkabelten Netzwerken weiterleiten, oder Nachrichten aus kabellosen Netzwerken zu verkabelten oder kabellosen Netzwerken.
Relays führen *kein Protokoll* über kürzlich versendete Nachrichten, also ist es wichtig, Kreisläufe im Netzwerk zu vermeiden, oder das selbe Paket kann mehrmals empfangen werden. Aufgrund der geringen Puffergröße von Switches kann Paketverlust zu einem Problem werden, wenn Netzwerknachrichten zu oft gesendet werden. Ein Upgrade für Switches und Access Points zur Beschleunigung der Nachrichtenweiterleitung ist möglich, genau wie die interne Nachrichtenqueue erweitert werden kann.

View File

@ -2,7 +2,7 @@
![Er hieß Retobor.](block:OpenComputers:robot)
Im Gegensatz zu [Computern](../general/computer.md) können Roboter sich bewegen und mit der Welt fast wie ein Spieler interagieren. Sie können jedoch *nicht* mit externen Komponenten interagieren. Wenn die Kommunikation mit einem Computer benötigt wird, muss eine [kabellose Netzwerkkarte](../item/wlanCard.md) verwendet werden, oder ein Low-Level-Protokoll mit Redstonesignalen erstellt werden.
Im Gegensatz zu [Computern](../general/computer.md) können Roboter sich bewegen und mit der Welt fast wie ein Spieler interagieren. Sie können jedoch *nicht* mit externen Komponenten interagieren. Wenn die Kommunikation mit einem Computer benötigt wird, muss eine [kabellose Netzwerkkarte](../item/wlanCard1.md) verwendet werden, oder ein Low-Level-Protokoll mit Redstonesignalen erstellt werden.
Roboter werden gebaut, indem ein [Computergehäuse](case1.md) jeder Stufe in einer [Elektronik-Werkbank](assembler.md) verwendet werden. Hochstufige [Computergehäuse](case1.md) erlauben komplexere Roboter, da sie eine bessere [CPU](../item/cpu1.md) verwalten können. Die Komplexität des Roboters ist von den Stufen der verwendeten Komponenten und Upgrades abhängig, wobei hochstufige Komponenten komplexer sind als niedrigstufige Komponenten. Wenn der Roboter zu komplex ist, kann die [Elektronik-Werkbank](assembler.md) den Roboter nicht bauen.

View File

@ -0,0 +1 @@
#REDIRECT componentBus1.md

View File

@ -27,7 +27,7 @@ Je nach dem, welches Recipe Set verwendet wird können einzelne Items nicht verf
* [Verknüpfte Karte](linkedCard.md)
* [Netzwerkkarte](lanCard.md)
* [Redstonekarte](redstoneCard1.md)
* [Drahtlosnetzwerkkarte](wlanCard.md)
* [Drahtlosnetzwerkkarte](wlanCard1.md)
* [Weltsensorkarte](worldSensorCard.md)
### Upgrades

View File

@ -1,6 +1,6 @@
# Drahtlosnetzwerkkarte
![Kann Krebs verursachen. Oder nicht.](oredict:oc:wlanCard)
![Kann Krebs verursachen. Oder nicht.](oredict:oc:wlanCard2)
Die kabellose Netzwerkkarte ist eine aufgewertete [Netzwerkkarte](lanCard.md) die, zusätzlich zu verkabelten Nachrichten, zudem das Senden von Nachrichten über kabellose Netzwerke ermöglicht. Die Signalstärke kontrolliert die Distanz über die Nachrichten versendet werden können. Die Signalstärke gleicht der Distanz in Blöcken.

View File

@ -0,0 +1 @@
#REDIRECT wlanCard1.md

View File

@ -4,7 +4,7 @@
The relay can be used to allow different subnetworks to send network messages to each other, without exposing components to [computers](../general/computer.md) in other networks. Keeping components local is usually a good idea, to avoid [computers](../general/computer.md) using the wrong [screen](screen1.md) or to avoid component overflows to happen (causing [computers](../general/computer.md) to crash and refuse to boot up).
The relay can be upgraded by inserting a [wireless network card](../item/wlanCard.md) to also relay messages wirelessly. Wireless messages can be received and relayed by other relays with a wireless network card, or by [computers](../general/computer.md) with a wireless network card.
The relay can be upgraded by inserting a [wireless network card](../item/wlanCard1.md) to also relay messages wirelessly. Wireless messages can be received and relayed by other relays with a wireless network card, or by [computers](../general/computer.md) with a wireless network card.
Alternatively the relay can be upgraded using [linked cards](../item/linkedCard.md). In this case it will forward messages through the tunnel provided by the linked card, too; at the usual cost, so make sure the relay is sufficiently powered.

View File

@ -2,7 +2,7 @@
![His name was Tobor.](block:OpenComputers:robot)
Unlike [computers](../general/computer.md), robots can move around and interact with the world much like a player can. They can *not* interact with external components, however! If you need to communicate with a [computer](../general/computer.md) or other robots, use a [wireless network card](../item/wlanCard.md), or create some low-level protocol using redstone signals via a [redstone card](../item/redstoneCard1.md), for example.
Unlike [computers](../general/computer.md), robots can move around and interact with the world much like a player can. They can *not* interact with external components, however! If you need to communicate with a [computer](../general/computer.md) or other robots, use a [wireless network card](../item/wlanCard1.md), or create some low-level protocol using redstone signals via a [redstone card](../item/redstoneCard1.md), for example.
Robots are built by placing a [computer case](case1.md) of any tier in an [assembler](assembler.md). Higher tier [computer cases](case1.md) can build more complex robots, due to being able to hold a higher tier [CPU](../item/cpu1.md). Complexity of the robot (as shown in the [assembler](assembler.md)) is determined by the tier of the components and upgrades placed in the robot slots; higher tier components will increase the complexity more than a lower tier component. If the complexity of the robot is too high, the [assembler](assembler.md) will not build the robot.

View File

@ -6,7 +6,7 @@
The switch can be used to allow different subnetworks to send network messages to each other, without exposing components to [computers](../general/computer.md) in other networks. Keeping components local is usually a good idea, to avoid [computers](../general/computer.md) using the wrong [screen](screen1.md) or to avoid component overflows to happen (causing [computers](../general/computer.md) to crash and refuse to boot up).
There is also a wireless variation of this block, called the [access point](accessPoint.md), which will also relay messages wirelessly. Wireless messages can be received and relayed by other [access points](accessPoint.md), or by [computers](../general/computer.md) with a [wireless network card](../item/wlanCard.md).
There is also a wireless variation of this block, called the [access point](accessPoint.md), which will also relay messages wirelessly. Wireless messages can be received and relayed by other [access points](accessPoint.md), or by [computers](../general/computer.md) with a [wireless network card](../item/wlanCard1.md).
Switches and [access points](accessPoint.md) do *not* keep track of which packets they relayed recently, so avoid cycles in your network or you may receive the same packet multiple times. Due to the limited buffer size of switches, sending messages too frequently will result in packet loss. You can upgrade your switches and [access points](accessPoint.md) to increase the speed with which they relay messages, as well as their internal message queue size.

View File

@ -27,7 +27,7 @@ Keep in mind that some of these may not be available, depending on the recipe se
* [Linked Card](linkedCard.md)
* [Network Card](lanCard.md)
* [Redstone Card](redstoneCard1.md)
* [Wireless Network Card](wlanCard.md)
* [Wireless Network Card](wlanCard1.md)
* [World Sensor Card](worldSensorCard.md)
### Upgrades

View File

@ -10,7 +10,7 @@ Nanomachines provide a certain number of "inputs" that can be triggered, causing
Which input triggers what effect depends on the current configuration of the nanomachines, the actual "connections" being random per configuration. This means you'll have to try enabling different inputs to see what they do. If you're unhappy with a configuration, you can always reconfigure your nanomachines by injecting a new batch (just eat some more). To completely get rid of the nanomachines in you, consider drinking some [grog](acid.md). Beware that enabling too many inputs at a time has severe negative effects on you!
By default, the nanomachines will be on standby. You'll need to control them using wireless messages, so carrying a [tablet](tablet.md) with a [wireless network card](wlanCard.md) is strongly recommended. Nanomachines will only react to wireless signals emitted by devices no further than two meters away, but they will react to messages on any port, and from any device!
By default, the nanomachines will be on standby. You'll need to control them using wireless messages, so carrying a [tablet](tablet.md) with a [wireless network card](wlanCard1.md) is strongly recommended. Nanomachines will only react to wireless signals emitted by devices no further than two meters away, but they will react to messages on any port, and from any device!
Nanomachines react to a simple, proprietary protocol: each packet must consist of multiple parts, the first of which is the "header" and must equal the string `nanomachines`. The second part must be the command name. Additional parts are parameters for the command. The following commands are available, formatted as `commandName(arg1, ...)`:

View File

@ -1,7 +1,7 @@
# WLAN Card
![May cause cancer. May not.](oredict:oc:wlanCard)
![May cause cancer. May not.](oredict:oc:wlanCard2)
The wireless network card is an upgraded [network card](lanCard.md) that, in addition to wired network messages, can also send and receive wireless network messages. The signal strength directly controls the distance up to which a sent message can be received, where the strength is equal to the distance in blocks.
The wireless network card is an upgraded [network card](lanCard.md) that can send and receive wireless network messages. Tier two cards can also send and receive wired messages. The signal strength directly controls the distance up to which a sent message can be received, where the strength is equal to the distance in blocks.
The higher the signal strength, the more energy it will take to send a single message. The terrain between the sender and receiver also determines whether a message will be successfully transmitted or not. To penetrate a block, the blocks hardness is subtracted from the signal strength - with the minimum being one for air blocks. If no strength remains to reach the receiver, the message will not be received. This is not an exact science however - sometimes messages may still reach the target. In general you will want to make sure the line of sight between the sender and receiver is clear.

View File

@ -0,0 +1 @@
#REDIRECT wlanCard1.md

View File

@ -0,0 +1 @@
#REDIRECT componentBus1.md

View File

@ -2,6 +2,6 @@
![Is this the real life? Is this just fantasy?](oredict:oc:hologram1)
Le projecteur d'hologramme est un afficheur volumétrique, c'est à dire qu'il fournit un tableau de voxels en trois dimensions qui peuvent être individuellement par un [ordinateur](../general/computer.md) auquel il serait connecté. Le deuxième niveau de projecteur, même s'il a la même résolution que le projecteur de niveau 1, gère l'affichage de chaque voxel avec trois couleurs définissable par l'utilisateur.
Le projecteur d'hologramme est un afficheur volumétrique, c'est à dire qu'il fournit un tableau de voxels en trois dimensions qui peuvent être contrôlés individuellement par un [ordinateur](../general/computer.md) auquel il serait connecté. Le deuxième niveau de projecteur, même s'il a la même résolution que le projecteur de niveau 1, gère l'affichage de chaque voxel avec trois couleurs définissable par l'utilisateur.
Les hologrammes peuvent être pivotés sur leur axe vertical en les frappant sur le haut ou le bas du projecteur avec une [clé](../item/wrench.md). Cela peut économiser beaucoup d'efforts, pour que la sortie ne soit pas transformée côté programme. Les hologrammes peuvent également être redimensionnés à volonté.

View File

@ -18,7 +18,7 @@ Gardez en tête que certains d'entre eux ne sont pas disponibles, en fonction de
* [Ecran](screen1.md)
### Stockage
* [Lecteur de disquette](diskDrive.md)
* [Lecteur de disquettes](diskDrive.md)
* [RAID](raid.md)
### Extensions

View File

@ -8,4 +8,4 @@ Le RAID fonctionne uniquement (et se présente en tant que système de fichiers)
Faites attention, car l'ajout d'un [disque dur](../item/hdd1.md) au bloc de RAID effacera son contenu. Retirer un [disque dur](../item/hdd1.md) du RAID effacera le contenu complet du RAID. Remettre le disque en place *ne restaurera pas* les anciens fichiers; le RAID sera ré-initialisé en tant que système de fichiers vierge.
Casser un bloc de RAID gardera son contenu, dons il peut être déplacé en tout sécurité sans risque de perte de données.
Casser un bloc de RAID gardera son contenu, il peut donc être déplacé en tout sécurité sans risque de perte de données.

View File

@ -4,7 +4,7 @@
Le relai peut être utilisé pour permettre à différents sous-réseaux de s'envoyer des messages réseau entre eux, sans exposer leurs composants aux [ordinateurs](../general/computer.md) des autres réseaux. Maintenir l'état "local" d'un composant est généralement une bonne idée, pour éviter aux [ordinateurs](../general/computer.md) d'utiliser le mauvais [écran](screen1.md) ou pour éviter qu'une surcharge de composants survienne (ce qui provoque le crash de l'[ordinateur](../general/computer.md) et l'empêche de démarrer).
Le relai peut être amélioré en insérant une [carte de réseau sans-fil](../item/wlanCard.md) pour relayer aussi des messages sans-fil. Les messages sans-fil peuvent être reçus et relayés par d'autres relais avec une carte de réseau sans-fil, ou par des ordinateurs équipés d'une carte réseau sans-fil.
Le relai peut être amélioré en insérant une [carte de réseau sans-fil](../item/wlanCard1.md) pour relayer aussi des messages sans-fil. Les messages sans-fil peuvent être reçus et relayés par d'autres relais avec une carte de réseau sans-fil, ou par des ordinateurs équipés d'une carte réseau sans-fil.
Par ailleurs, le relai peut être amélioré en utilisé des [cartes liées](../item/linkedCard.md). Dans ce cas, il transmettra aussi les messages à travers le tunnel de la carte liée; ceci aura le coût habituel, donc assurez vous que le relai a suffisamment d'énergie.

View File

@ -2,8 +2,8 @@
![Son nom était Tobor.](block:OpenComputers:robot)
Contrairement aux [ordinateurs](../general/computer.md), les robots peuvent se déplacer et interagir avec le monde un peu comme un joueur. Ils *ne peuvent pas* interagir avec des composants externes, cependant ! Si vous avez besoin de communiquer avec un [ordinateur](../general/computer.md) ou d'autres robots, utilisez une [carte réseau sans-fil](../item/wlanCard.md), ou créez une sorte de protocle de bas niveau en utilisant les signaux de redstone via une [carte de redstone](../item/redstoneCard1.md), par exemple.
Contrairement aux [ordinateurs](../general/computer.md), les robots peuvent se déplacer et interagir avec le monde un peu comme un joueur. Ils *ne peuvent pas* interagir avec des composants externes, cependant ! Si vous avez besoin de communiquer avec un [ordinateur](../general/computer.md) ou d'autres robots, utilisez une [carte réseau sans-fil](../item/wlanCard1.md), ou créez une sorte de protocle de bas niveau en utilisant les signaux de redstone via une [carte de redstone](../item/redstoneCard1.md), par exemple.
Les robots sont construits en plaçant un [boîtier d'ordinateur](case1.md) de n'importe quel niveau dans un [assembleur](assembler.md). Des [boîtiers](case1.md) de plus haut niveau permettent de construire des robots plus complexes, grâce à leur capacité à contenir un [processeur](../item/cpu1.md) plus puissant. La complexité du robot (affichée dans l'[assembleur](assembler.md)) est déterminée par le niveau des composants et améliorations placés dans les emplacements du robot; des composants de plus haut niveau augmenteront d'avantage la complexité qu'un composant de plus bas niveau. Si la complexité du robot est trop élevée, l'[assembleur](assembler.md) ne construira pas le robot.
De nombreuses améliorations peuvent être placées dans les robots pour augmenter les fonctionnalités. Cela inclut les amélioration d'[inventaire](../item/inventoryUpgrade.md) et de [contrôle d'inventaire](../item/inventoryControllerUpgrade.md), de [réservoir](../item/tankUpgrade.md), de [navigation](../item/navigationUpgrade.md), entre autres. Les conteneurs d'[amélioration](../item/upgradeContainer1.md) et de [carte](../item/cardContainer1.md) et de [carte](../item/cardContainer1.md) peuvent être placés dans le robot pour insérer et retirer des composants et des améliorations à la volée. Un [lecteur de disquettes](diskDrive.md) peut également être placé dans le robot pour permettre l'insertion de [disquettes](../item/floppy.md), ce qui vous permettra d'installer [OpenOS](../general/openOS.md) sur le robot (une alternative est d'installer [OpenOS](../general/openOS.md) sur un [disque dur](../item/hdd1.md) vierge en utilisant un [ordinateur](../general/computer.md), et d'utiliser le [disque dur](../item/hdd1.md) pré-installé comme un composant dans l'assembleur de robot).
De nombreuses améliorations peuvent être placées dans les robots pour augmenter les fonctionnalités. Cela inclut les amélioration d'[inventaire](../item/inventoryUpgrade.md) et de [contrôle d'inventaire](../item/inventoryControllerUpgrade.md), de [réservoir](../item/tankUpgrade.md), de [navigation](../item/navigationUpgrade.md), entre autres. Les conteneurs d'[amélioration](../item/upgradeContainer1.md) et de [carte](../item/cardContainer1.md) peuvent être placés dans le robot pour insérer et retirer des composants et des améliorations à la volée. Un [lecteur de disquettes](diskDrive.md) peut également être placé dans le robot pour permettre l'insertion de [disquettes](../item/floppy.md), ce qui vous permettra d'installer [OpenOS](../general/openOS.md) sur le robot (une alternative est d'installer [OpenOS](../general/openOS.md) sur un [disque dur](../item/hdd1.md) vierge en utilisant un [ordinateur](../general/computer.md), et d'utiliser le [disque dur](../item/hdd1.md) pré-installé comme un composant dans l'assembleur de robot).

View File

@ -6,7 +6,7 @@
Le routeur peut être utilisé pour permettre à différents sous-réseaux de s'envoyer des messages réseau entre eux, sans exposer leurs composants aux [ordinateurs](../general/computer.md) des autres réseaux. Maintenir l'état "local" d'un composant est généralement une bonne idée, pour éviter aux [ordinateurs](../general/computer.md) d'utiliser le mauvais [écran](screen1.md) ou pour éviter qu'une surcharge de composants survienne (ce qui provoque le crash de l'[ordinateur](../general/computer.md) et l'empêche de démarrer).
Il y a également une version sans-fil de ce bloc, appelée le [point d'accès](accessPoint.md), qui peut aussi relayer des messages sans-fil. Les messages sans-fil peuvent être reçus et relayés par d'autres [points d'accès](accessPoint.md), ou par des [ordinateurs](../general/computer.md) équipés d'une [carte réseau sans-fil](../item/wlanCard.md).
Il y a également une version sans-fil de ce bloc, appelée le [point d'accès](accessPoint.md), qui peut aussi relayer des messages sans-fil. Les messages sans-fil peuvent être reçus et relayés par d'autres [points d'accès](accessPoint.md), ou par des [ordinateurs](../general/computer.md) équipés d'une [carte réseau sans-fil](../item/wlanCard1.md).
Les routeurs et [points d'accès](accessPoint.md) ne gardent *pas* de trace des paquets qu'ils ont récemment relayé, donc évitez les boucles dans votre réseau ou vous pourriez recevoir le même paquet plusieurs fois. A cause de la taille limitée de la mémoire tampon des routeurs, une perte des paquets peut survenir si vous essayez d'envoyer des messages réseau trop fréquemment. Vous pouvez améliorer vos routeurs et points d'accès pour augmenter la vitesse à laquelle ils relaient les messages, ainsi que la taille interne de la file des messages.

View File

@ -1,6 +1,6 @@
# Lua
Le [manuel de référence](http://www.lua.org/manual/5.2/manual.html) en Lua et le livre [Programming Lua](http://www.lua.org/pil/) (la première édition est disponible gratuitement en ligne) sont un bon endroit pour démarrer avec les bases de Lua et se familiariser avec la synntaxe de base et les bibliothèques standard. [OpenOS](openOS.md) s'efforce d'émuler les bibliothèques standard au plus près, avec quelques écarts, comme la bibliothèque de débogage qui est principalement absente (pour des raisons de sécurité liées au mode "bac à sable"). Ces différences sont [documentées sur le wiki](http://ocdoc.cil.li/api:non-standard-lua-libs).
Le [manuel de référence](http://www.lua.org/manual/5.2/manual.html) en Lua et le livre [Programming Lua](http://www.lua.org/pil/) (la première édition est disponible gratuitement en ligne) sont un bon endroit pour démarrer avec les bases de Lua et se familiariser avec la syntaxe de base et les bibliothèques standard. [OpenOS](openOS.md) s'efforce d'émuler les bibliothèques standard au plus près, avec quelques écarts, comme la bibliothèque de débogage qui est principalement absente (pour des raisons de sécurité liées au mode "bac à sable"). Ces différences sont [documentées sur le wiki](http://ocdoc.cil.li/api:non-standard-lua-libs).
Les bibliothèques non-standard devront être importées avec `require` pour les utiliser dans un script. Par exemple :

View File

@ -2,8 +2,8 @@
OpenOS est un système d'exploitation basique disponible dans OpenComputers. Il est nécessaire pour faire démarrer un [ordinateur](computer.md) pour la première fois, et peut être fabriqué en plaçant une [disquette](../item/floppy.md) vide et un manuel d'OpenComputers dans une table de craft.
Une fois créée, la [disquette](../item/floppy.md) peut être placée dans un [lecteur de disquette](../block/diskDrive.md) connectée à un système [informatique](computer.md) [correctement configuré](quickstart.md), ce qui permettra à l'[ordinateur](computer.md) de lancer OpenOS.
Une fois démarré, il est conseillé d'installer OpenOS sur un [disque dur](../item/hdd1.md) vierge, ce qui évite la nécessité d'une [disquette](../item/floppy.md) et donne accès à un système de fichiers en lecture/écriture (la [disquette](../item/floppy.md) d'OpenOS et les autres disquettes "trouvées" sont en lecture seule). Un [boîtier](../block/case3.md) de niveau 3 n'a pas besoin de [lecteur de disquette](../block/diskDrive.md), car il a un emplacement intégré pour les [disquettes](../item/floppy.md).
Une fois créée, la [disquette](../item/floppy.md) peut être placée dans un [lecteur de disquettes](../block/diskDrive.md) connectée à un système [informatique](computer.md) [correctement configuré](quickstart.md), ce qui permettra à l'[ordinateur](computer.md) de lancer OpenOS.
Une fois démarré, il est conseillé d'installer OpenOS sur un [disque dur](../item/hdd1.md) vierge, ce qui évite la nécessité d'une [disquette](../item/floppy.md) et donne accès à un système de fichiers en lecture/écriture (la [disquette](../item/floppy.md) d'OpenOS et les autres disquettes "trouvées" sont en lecture seule). Un [boîtier](../block/case3.md) de niveau 3 n'a pas besoin de [lecteur de disquettes](../block/diskDrive.md), car il a un emplacement intégré pour les [disquettes](../item/floppy.md).
OpenOS peut être installé en écrivant simplement `install`, et en suivant les informations affichées à l'écran pour finaliser l'installation. La [disquette](../item/floppy.md) peut être retirée une fois que le système a été redémarré. OpenOS peut être installé sur tous les appareils sauf les [drones](../item/drone.md) et les [micro-contrôleurs](../block/microcontroller.md) (ils nécessitent tous les deux une programmation manuelle d'une [EEPROM](../item/eeprom.md) pour fournir des fonctionnalités, parce qu'ils n'ont pas de système de fichiers intégré).

View File

@ -32,8 +32,8 @@ Tous les appareils sont modulaires et peuvent être assemblés avec une grande v
Les appareils d'OpenComputers sont compatibles avec différents mods pour la manipulation de blocs et d'entités (à travers l'[adaptateur](block/adapter.md), ou des améliorations spécifiques d'un [robot](block/robot.md) ou d'un [drone](item/drone.md)). L'énergie peut être fournie grâce à une large gamme de mods, incluant, sans limitation, les Redstone Flux, les EU d'IndustrialCraft2, les Joules de Mekanism, l'énergie d'Applied Energistics 2 autant que la charge de Factorization.
Les appareils d'OpenComputers ont des fonctionnalités supplémentaires ainsi que quelques limitations. Les [ordinateurs](general/computer.md) sont la base, et sont capables de contenir un bon nombre de composants, contrôlés par le niveau du processeur utilisé. Les [ordinateurs](general/computer.md) ont également accès aux composants par leurs six faces. Les [serveurs](item/server1.md) sont capables de se connecter à plus de composants (en interne ou en externe) qu'un [ordinateur](general/computer.md), en utilisant des [bus de composants](item/componentBus1.md); cependant, à cause du [support de serveur](block/serverRack.md), le [serveur](item/server1.md) est seulement capable d'accéder aux composants par une unique face du [support de serveur](block/serverRack.md), tel que configuré dans l'interface du [server rack](block/serverRack.md). Les [micro-contrôleurs](block/microcontroller.md) sont encore plus limités (comparés aux [ordinateurs](general/computer.md)) par leur manque d'emplacements de [disque dur](item/hdd1.md) et de [lecteur de disquette](block/diskDrive.md), ce qui veut dire qu'[OpenOS](general/openOS.md) ne peut pas être installé sur un [micro-contrôleur](block/microcontroller.md). Les [micro-contrôleurs](block/microcontroller.md) ont un emplacement pour une [EEPROM](item/eeprom.md), et peuvent être programmés avec un système d'exploitation plus spécifique pour un ensemble limité de tâches.
Les appareils d'OpenComputers ont des fonctionnalités supplémentaires ainsi que quelques limitations. Les [ordinateurs](general/computer.md) sont la base, et sont capables de contenir un bon nombre de composants, contrôlés par le niveau du processeur utilisé. Les [ordinateurs](general/computer.md) ont également accès aux composants par leurs six faces. Les [serveurs](item/server1.md) sont capables de se connecter à plus de composants (en interne ou en externe) qu'un [ordinateur](general/computer.md), en utilisant des [bus de composants](item/componentBus1.md); cependant, à cause du [support de serveur](block/serverRack.md), le [serveur](item/server1.md) est seulement capable d'accéder aux composants par une unique face du [support de serveur](block/serverRack.md), tel que configuré dans l'interface du [server rack](block/serverRack.md). Les [micro-contrôleurs](block/microcontroller.md) sont encore plus limités (comparés aux [ordinateurs](general/computer.md)) par leur manque d'emplacements de [disque dur](item/hdd1.md) et de [lecteur de disquettes](block/diskDrive.md), ce qui veut dire qu'[OpenOS](general/openOS.md) ne peut pas être installé sur un [micro-contrôleur](block/microcontroller.md). Les [micro-contrôleurs](block/microcontroller.md) ont un emplacement pour une [EEPROM](item/eeprom.md), et peuvent être programmés avec un système d'exploitation plus spécifique pour un ensemble limité de tâches.
Les [robots](block/robot.md) sont des [ordinateurs](general/computer.md) mobiles, et sont capables d'interagir avec le monde (mais ne peuvent pas interagir avec d'autres blocs d'OpenComputers). Contrairement aux [ordinateurs](general/computer.md), une fois qu'un robot est construit, les composants à l'intérieur du [robot](block/robot.md) ne peuvent pas être retirés. Pour contourner cette limitation, les [robots](block/robot.md) peuvent être construits avec des conteneurs d'[amélioration](item/upgradeContainer1.md) ou de [carte](item/cardContainer1.md), ce qui permettra d'échanger à la volée des cartes ou des améliorations, si nécessaire. [OpenOS](general/openOS.md) peut être installé sur les [robots](block/robot.md) en plaçant un [lecteur de disquette](block/diskDrive.md) dans un emplacement de conteneur, ce qui permettra l'insertion de [disquettes](item/floppy.md), ou en plaçant un [disque dur](item/hdd1.md) avec [OpenOS](general/openOS.md) pré-installé dans l'un des emplacements de [disque dur](item/hdd1.md). Pour complètement reconfigurer un [robot](block/robot.md), il devra être [désassemblé](block/disassembler.md) avant. Les [drones](item/drone.md) sont une version limitée des [robots](block/robot.md). Ils se déplacent différemment, ont moins d'emplacements d'inventaire, et n'ont pas de système d'exploitation (à l'instar des [micro-contrôleurs](block/microcontroller.md), les [drones](item/drone.md) peuvent être configurés avec une [EEPROM](item/eeprom.md) programmée pour un ensemble limité de tâches). Pour la plupart, les [robots](block/robot.md) et les [drones](item/drone.md) partagent les mêmes améliorations et composants; cependant, les améliorations se comportent différemment avec les [drones](item/drone.md), comme les [améliorations d'inventaire](item/inventoryUpgrade.md) qui fournissent seulement 4 emplacements par amélioration, pour un total de 8 emplacements, tandis que les [robots](block/robot.md) sont capables d'accepter plus d'[améliorations d'inventaire](item/inventoryUpgrade.md) (pour un total de 4) ainsi que l'obtention de plus d'emplacements par amélioration (16 emplacements par amélioration).
Les [robots](block/robot.md) sont des [ordinateurs](general/computer.md) mobiles, et sont capables d'interagir avec le monde (mais ne peuvent pas interagir avec d'autres blocs d'OpenComputers). Contrairement aux [ordinateurs](general/computer.md), une fois qu'un robot est construit, les composants à l'intérieur du [robot](block/robot.md) ne peuvent pas être retirés. Pour contourner cette limitation, les [robots](block/robot.md) peuvent être construits avec des conteneurs d'[amélioration](item/upgradeContainer1.md) ou de [carte](item/cardContainer1.md), ce qui permettra d'échanger à la volée des cartes ou des améliorations, si nécessaire. [OpenOS](general/openOS.md) peut être installé sur les [robots](block/robot.md) en plaçant un [lecteur de disquettes](block/diskDrive.md) dans un emplacement de conteneur, ce qui permettra l'insertion de [disquettes](item/floppy.md), ou en plaçant un [disque dur](item/hdd1.md) avec [OpenOS](general/openOS.md) pré-installé dans l'un des emplacements de [disque dur](item/hdd1.md). Pour complètement reconfigurer un [robot](block/robot.md), il devra être [désassemblé](block/disassembler.md) avant. Les [drones](item/drone.md) sont une version limitée des [robots](block/robot.md). Ils se déplacent différemment, ont moins d'emplacements d'inventaire, et n'ont pas de système d'exploitation (à l'instar des [micro-contrôleurs](block/microcontroller.md), les [drones](item/drone.md) peuvent être configurés avec une [EEPROM](item/eeprom.md) programmée pour un ensemble limité de tâches). Pour la plupart, les [robots](block/robot.md) et les [drones](item/drone.md) partagent les mêmes améliorations et composants; cependant, les améliorations se comportent différemment avec les [drones](item/drone.md), comme les [améliorations d'inventaire](item/inventoryUpgrade.md) qui fournissent seulement 4 emplacements par amélioration, pour un total de 8 emplacements, tandis que les [robots](block/robot.md) sont capables d'accepter plus d'[améliorations d'inventaire](item/inventoryUpgrade.md) (pour un total de 4) ainsi que l'obtention de plus d'emplacements par amélioration (16 emplacements par amélioration).
Ce manuel contient des informations détaillées concernant tous les blocs et objets, comment mettre en place différents types de systèmes et d'appareils, ainsi qu'une introduction à la programmation.

View File

@ -0,0 +1 @@
#REDIRECT componentBus1.md

View File

@ -2,7 +2,7 @@
![Je suis dans la matrice!](oredict:oc:databaseUpgrade1)
L'amélioration de base de données peut être configurée pour stocker un liste de représentation de groupes d'objets, qui peuvent ensuite être utilisés par d'autres composants. C'est particulièrement utile pour les objets qui sont uniquement distinguables par leurs données NBT, ce qui ne fait pas partie des données affichées de base pour un groupe d'objets.
L'amélioration de base de données peut être configurée pour stocker une liste de représentations de groupes d'objets, qui peuvent ensuite être utilisés par d'autres composants. C'est particulièrement utile pour les objets qui sont uniquement distinguables par leurs données NBT, ce qui ne fait pas partie des données affichées de base pour un groupe d'objets.
Pour configurer une base de données, ouvrez la en faisant un clic droit avec la base de données dans la main. Placez les objets avec lesquels vous souhaitez la configurer dans l'inventaire du haut. Cela stockera un "objet fantôme", ce qui veut dire qu'aucun objet "réel" n'est stocké dans la base de données.

View File

@ -2,4 +2,4 @@
![Spaaaace.](oredict:oc:hdd1)
Le disque dur est un moyen de stockage de données de haut niveau dans OpenComputers. Tous les moyens de stockage de données fonctionnent à la même vitesse ; un moyen de stockage de plus haut niveau fournit juste plus d'espace. Il y a également quelques appareils qui peuvent seulement utiliser les disques durs (bien que les serveurs pourraient utiliser un [lecteur de disquette](../block/diskDrive.md) externe, par exemple). Les disques durs peuvent être placés dans un [raid](../block/raid.md), ce qui permet à plusieurs disques de partager le même système de fichiers. Remarquez que placer un disque dur dans un [raid](../block/raid.md) efface le contenu du disque.
Le disque dur est un moyen de stockage de données de haut niveau dans OpenComputers. Tous les moyens de stockage de données fonctionnent à la même vitesse ; un moyen de stockage de plus haut niveau fournit juste plus d'espace. Il y a également quelques appareils qui peuvent seulement utiliser les disques durs (bien que les serveurs pourraient utiliser un [lecteur de disquettes](../block/diskDrive.md) externe, par exemple). Les disques durs peuvent être placés dans un [raid](../block/raid.md), ce qui permet à plusieurs disques de partager le même système de fichiers. Remarquez que placer un disque dur dans un [raid](../block/raid.md) efface le contenu du disque.

View File

@ -27,7 +27,7 @@ Gardez en tête que certains d'entre eux ne sont pas disponibles, en fonction de
* [Carte liée](linkedCard.md)
* [Carte réseau](lanCard.md)
* [Carte de Redstone](redstoneCard1.md)
* [Carte de réseau sans-fil](wlanCard.md)
* [Carte de réseau sans-fil](wlanCard1.md)
* [Carte de capteur du monde](worldSensorCard.md)
### Améliorations

View File

@ -2,6 +2,6 @@
![J'ai le contrôle.](oredict:oc:inventoryControllerUpgrade)
L'amélioration du contrôleur d'inventaire permet aux [robots](../block/robot.md) et aux [drones](drone.md) des capacités d'interaction étendues avec les inventaires. Elle permet à un appareil de viser spécifiquement un emplacement dans un inventaire externe quand il lâche ou ramasse un objet. Elle permet également à un appareil de lire des informations détaillées à propos d'un objet. Enfin, elle fournit aux [robots](../block/robot.md) un moyen de changer leur outil équipé sans aide extérieure.
L'amélioration du contrôleur d'inventaire donne aux [robots](../block/robot.md) et aux [drones](drone.md) des capacités d'interactions étendues avec les inventaires. Elle permet à un appareil de viser spécifiquement un emplacement dans un inventaire externe quand il lâche ou ramasse un objet. Elle permet également à un appareil de lire des informations détaillées à propos d'un objet. Enfin, elle fournit aux [robots](../block/robot.md) un moyen de changer leur outil équipé sans aide extérieure.
Cette amélioration peut également être placée dans un [adaptateur](../block/adapter.md), ce qui lui permet d'utiliser des méthodes d'inspection d'inventaires adjacents similaires à celles des [robots](../block/robot.md). Cependant, elle ne permet pas à l'[adaptateur](../block/adapter.md) de déplacer des objets hors et vers ces inventaires. Cette fonctionnalité est seulement disponible pour les [robots](../block/robot.md) et les [drones](drone.md).

View File

@ -10,7 +10,7 @@ Les nanomachines fournissent un certain nombre "d'entrées" qui peuvent être ac
En fonction de la configuration des nanomachines, les entrées déclenchent différents effets, les "connexions" étant aléatoires par configuration. Cela signifie que vous devrez essayer d'activer différentes entrées pour découvrir ce qu'elles activent. Si vous n'êtes pas satisfaits d'une configuration, vous pouvez reconfigurer vos nanomachines en en injectant d'autres (mangez en d'autres). Pour vous débarrasser complètement des nanomachines en vous, buvez du [grog](acid.md). Faites attention, activer trop d'entrées à la fois peut avoir de sérieuses conséquences sur votre organisme !
Par défaut, les nanomachines seront passives. Vous devrez les contrôler en utilisant des messages sans fil, donc transporter une [tablette](tablet.md) avec une [carte de réseau sans-fil](wlanCard.md) est vivement recommandé. Les nanomachines réagiront seulement aux signaux sans fil émis par des appareils situés à moins de 2 mètres, mais elles réagiront aux messages provenant de n'importe quel port, et de n'importe quel appareil !
Par défaut, les nanomachines seront passives. Vous devrez les contrôler en utilisant des messages sans fil, donc transporter une [tablette](tablet.md) avec une [carte de réseau sans-fil](wlanCard1.md) est vivement recommandé. Les nanomachines réagiront seulement aux signaux sans fil émis par des appareils situés à moins de 2 mètres, mais elles réagiront aux messages provenant de n'importe quel port, et de n'importe quel appareil !
Les nanomachines réagissent à un protocole propriétaire très simple : chaque paquet doit être constitué de plusieurs parties, la première étant le "header" (en-tête) et qui doit valoir `nanomachines`. La deuxième partie doit être le nom de la commande. Les parties supplémentaires sont les paramètres de la commande. Les commandes suivantes sont disponibles, avec le format `nomDeLaCommande(argument1, ...)` :

View File

@ -4,6 +4,6 @@
La carte de redstone permet aux [ordinateurs](../general/computer.md) de lire et émettre des signaux de redstone analogiques dans les blocs adjacents. Quand la force d'un signal entrant change, un signal est injecté dans l'[ordinateur](../general/computer.md).
Si un des mods supportés fournissant des câbles empaquetés (bundled) est présent, comme RedLogic, Project:Red ou Minefactory Reloaded; ou un mod qui fournit des capacités de signal sans fil, comme WirelessRedstone-ChickenBonesEdition (WR-CBE), ou le Slimevoid's Wireless mod, un carte de redstone de niveau 2 est disponible pour interagir avec ces systèmes.
Si un des mods supportés fournissant des câbles empaquetés (bundled) est présent, comme RedLogic, Project:Red ou Minefactory Reloaded; ou un mod qui fournit des capacités de signal sans fil, comme WirelessRedstone-ChickenBonesEdition (WR-CBE), ou le Slimevoid's Wireless mod, une carte de redstone de niveau 2 est disponible pour interagir avec ces systèmes.
Le côté renseigné dans les méthodes de la carte est relatif à l'orientation du [boîtier d'ordinateur](../block/case1.md) / [robot](../block/robot.md) / [support de serveur](../block/serverRack.md). Cela signifie que quand vous regardez l'avant d'un ordinateur, le côté `sides.right` est à votre gauche, et inversement.

View File

@ -1,6 +1,6 @@
# Carte de réseau sans-fil
![Peut provoquer le cancer. Ou pas.](oredict:oc:wlanCard)
![Peut provoquer le cancer. Ou pas.](oredict:oc:wlanCard2)
La carte de réseau sans fil est une [carte réseau](lanCard.md) améliorée qui, en plus de gérer les messages réseaux filaires, peut également envoyer et recevoir des messages réseaux sans fil. La force du signal contrôle directement la distance jusqu'à laquelle un message peut être reçu, avec cette force étant égale à la distance en blocs.

View File

@ -0,0 +1 @@
#REDIRECT wlanCard1.md

View File

@ -4,7 +4,7 @@
Ретранслятор используется для передачи сообщений между несколькими подсетями без предоставления компонентов [компьютерам](../general/computer.md) в других подсетях. Как правило, изоляция компонентов - хорошая идея, чтобы не позволить [компьютерам](../general/computer.md) использовать не тот [монитор](screen1.md) или избежать достижения лимита компонентов (в результате чего [компьютеры](../general/computer.md) выключатся и отказываются загружаться).
Может быть улучшен добавлением [беспроводной сетевой карты](../item/wlanCard.md), что позволит ретранслировать беспроводные сообщения. Сообщения, переданные по беспроводной линии, могут быть получены или перенаправлены другими ретрансляторами или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard.md).
Может быть улучшен добавлением [беспроводной сетевой карты](../item/wlanCard1.md), что позволит ретранслировать беспроводные сообщения. Сообщения, переданные по беспроводной линии, могут быть получены или перенаправлены другими ретрансляторами или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard1.md).
Также ретранслятор может быть улучшен с помощью [соединенной карты](../item/linkedCard.md). Это позволит передавать сообщения внутри туннеля, предоставленного картой, с соответствующими затратами энергии, поэтому убедитесь, что ретранслятору поступает достаточное количество энергии.

View File

@ -2,7 +2,7 @@
![Его имя Тобор.](block:OpenComputers:robot)
В отличие от [компьютеров](../general/computer.md), роботы могут двигаться и взаимодействовать с игровым миром, как и игроки. Но они *не* могут взаимодействовать с внешними компонентами! Если вам нужно связать робота с [компьютером](../general/computer.md) или другими роботами, используйте [беспроводные сетевые карты](../item/wlanCard.md) или, например, создайте низкоуровневый протокол на основе красных сигналов и [плат на красном камне](../item/redstoneCard1.md).
В отличие от [компьютеров](../general/computer.md), роботы могут двигаться и взаимодействовать с игровым миром, как и игроки. Но они *не* могут взаимодействовать с внешними компонентами! Если вам нужно связать робота с [компьютером](../general/computer.md) или другими роботами, используйте [беспроводные сетевые карты](../item/wlanCard1.md) или, например, создайте низкоуровневый протокол на основе красных сигналов и [плат на красном камне](../item/redstoneCard1.md).
Роботы создаются путем помещения [системного блока](case1.md) любого уровня в [сборщик](assembler.md). Чем выше уровень [системного блока](case1.md), тем более сложных роботов можно построить, благодаря возможности использовать [процессоры](../item/cpu1.md) высокого уровня. Сложность робота (показываемая в [сборщике](assembler.md)) определяется уровнем компонентов и улучшений, помещенных в слоты робота; компонент более высокого уровня увеличивает сложность больше, чем компонент уровня ниже. Если сложность робота превысила предел, тогда [сборщик](assembler.md) не сможет создать робота.

View File

@ -6,7 +6,7 @@
Коммутатор используется для передачи сообщений между несколькими подсетями, без предоставления компонентов [компьютерам](../general/computer.md) в других подсетях. Как правило, изоляция компонентов - хорошая идея, чтобы не позволить [компьютерам](../general/computer.md) использовать не тот [монитор](screen1.md) или избежать достижения лимита компонентов (в результате чего [компьютеры](../general/computer.md) выключатся и отказываются загружаться).
Также есть беспроводная версия коммутатора, называемая [точкой доступа](accessPoint.md). С ее помощью сообщения передаются по беспроводному каналу. Беспроводные сообщения могут быть получены или перенаправлены другими [точками доступа](accessPoint.md) или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard.md).
Также есть беспроводная версия коммутатора, называемая [точкой доступа](accessPoint.md). С ее помощью сообщения передаются по беспроводному каналу. Беспроводные сообщения могут быть получены или перенаправлены другими [точками доступа](accessPoint.md) или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard1.md).
Коммутаторы и [точки доступа](accessPoint.md) *не* отслеживают, какие пакеты и куда они передали, поэтому для в сети могут образовываться петли или вы можете получать одно сообщение несколько раз. Из-за ограниченного буфера сообщений коммутатора пакеты могут теряться, если их отсылать слишком часто. Вы можете улучшить коммутатор или [точку доступа](accessPoint.md) для увеличения скорости обработки сообщений, а также увеличения размера буфера сообщений.

View File

@ -0,0 +1 @@
#REDIRECT componentBus1.md

View File

@ -27,7 +27,7 @@
* [Связанная карта](linkedCard.md)
* [Сетевая карта](lanCard.md)
* [Карта на красном камне](redstoneCard1.md)
* [Беспроводная сетевая карта](wlanCard.md)
* [Беспроводная сетевая карта](wlanCard1.md)
* [Карта-мировой сенсор](worldSensorCard.md)
### Улучшения

View File

@ -10,7 +10,7 @@
Какой эффект получится при активации контакта, зависит от текущей конфигурации нанороботов, где сами связи между контактами и эффектами случайны для каждой конфигурации. Это означает, что потребуется активировать различные контакты, чтобы узнать, что они делают. Если вам не повезло с конфигурацией, вы всегда можете переконфигурировать ваших нанороботов, съев еще. Если вы захотите избавиться от них, выпейте [кислоту](acid.md). Помните, что большое количество одновременно активных контактов будет давать серьезные отрицательные эффекты!
По умолчанию нанороботы находятся в режиме ожидания. Вы можете контролировать их с помощью беспроводных сообщений, поэтому рекомендуется носить с собою [планшет](tablet.md) с [беспроводной сетевой картой](wlanCard.md). Нанороботы реагируют только на беспроводные сигналы, источник которых находится не дальше двух метров, но они реагируют на все сообщения на любом порту и с любых устройств!
По умолчанию нанороботы находятся в режиме ожидания. Вы можете контролировать их с помощью беспроводных сообщений, поэтому рекомендуется носить с собою [планшет](tablet.md) с [беспроводной сетевой картой](wlanCard1.md). Нанороботы реагируют только на беспроводные сигналы, источник которых находится не дальше двух метров, но они реагируют на все сообщения на любом порту и с любых устройств!
Нанороботы работают по простому проепритарному протоколу: каждый пакет должен состоять из множества частей, где первый - это "заголовок", и он должен быть строкой с текстом `nanomachines`. Вторая часть должна быть именем команды. Остальные части - это параметры для команды. Доступны следующие команды (форматировано как `имякоманды(параметр1, ...)`):

View File

@ -1,6 +1,6 @@
# Беспроводная сетевая карта
![Может вызвать рак. Не может.](oredict:oc:wlanCard)
![Может вызвать рак. Не может.](oredict:oc:wlanCard2)
Беспроводная сетевая карта - это улучшенная версия [сетевой карты](lanCard.md), которая в дополнение к сообщениям по проводной линии также может принимать сообщения и по беспроводной сети. Сила сигнала напрямую контролирует, на каком расстоянии может быть получено отправленное сообщение, и равна расстоянию в блоках.

View File

@ -0,0 +1 @@
#REDIRECT wlanCard1.md

View File

@ -1,6 +1,6 @@
# Robot
![His name was Tobor.](block:OpenComputers:robot)
和电脑不同 ,机器人可以如同实体那样在地图上移动,但机器人无法和外界组件交互,但!如果要和电脑或者其他机器人通讯,请安装 [无线网卡](../item/wlanCard.md),或者是通过[红石卡](../item/redstoneCard1.md)收发红石信号建立底层的协议
和电脑不同 ,机器人可以如同实体那样在地图上移动,但机器人无法和外界组件交互,但!如果要和电脑或者其他机器人通讯,请安装 [无线网卡](../item/wlanCard1.md),或者是通过[红石卡](../item/redstoneCard1.md)收发红石信号建立底层的协议
把[任意机箱](case1.md)放进[组装机](assembler.md)就可以制作机器人.
高级的机箱由于有更高级的[CPU](../item/cpu1.md),可以制造更复杂的机器人. 机器人的复杂度 (显示在 [组装机](assembler.md)GUI) 由槽内安装的组件和升级决定;

View File

@ -6,7 +6,7 @@
可避免电脑链接到错误的屏幕,或者避免组件崩溃(可能崩掉电脑,并使之无法启动).
中继器可以安装[无线网卡](../item/wlanCard.md),发送无线消息.其他的中继器可接受并转发,或者是被有无线网卡的电脑收到.
中继器可以安装[无线网卡](../item/wlanCard1.md),发送无线消息.其他的中继器可接受并转发,或者是被有无线网卡的电脑收到.
中继器也可以安装[连接卡](../item/linkedCard.md).消息被转发到链接卡的信道里面, 记得保持中继器能源.

View File

@ -2,7 +2,7 @@
![His name was Tobor.](block:OpenComputers:robot)
机器人不像 [电脑](../general/computer.md), 他们是可以像一个玩家一样去和世界交互的. 不过它们不能直接和其他设备交互! 如果需要和 [电脑](../general/computer.md) 和其他机器人通讯, 那么用[无线网卡](../item/wlanCard.md), 或者通过[红石卡](../item/redstoneCard1.md)实现更底层的协议去通信.
机器人不像 [电脑](../general/computer.md), 他们是可以像一个玩家一样去和世界交互的. 不过它们不能直接和其他设备交互! 如果需要和 [电脑](../general/computer.md) 和其他机器人通讯, 那么用[无线网卡](../item/wlanCard1.md), 或者通过[红石卡](../item/redstoneCard1.md)实现更底层的协议去通信.
机器人通过将任意等级[机箱](case1.md) 放入 [组装机](assembler.md)制作的. 更高规格的[机箱](case1.md) 可以做出更复杂的机器人. 机器人的复杂度会显示在 [组装机](assembler.md),复杂度取决于携带和安装的卡片和扩展数量; 级别越高,数量越多,越复杂,达到一定程度组装机将罢工.

View File

@ -6,7 +6,7 @@
The switch can be used to allow different subnetworks to send network messages to each other, without exposing components to [computers](../general/computer.md) in other networks. Keeping components local is usually a good idea, to avoid [computers](../general/computer.md) using the wrong [screen](screen1.md) or to avoid component overflows to happen (causing [computers](../general/computer.md) to crash and refuse to boot up).
There is also a wireless variation of this block, called the [access point](accessPoint.md), which will also relay messages wirelessly. Wireless messages can be received and relayed by other [access points](accessPoint.md), or by [computers](../general/computer.md) with a [wireless network card](../item/wlanCard.md).
There is also a wireless variation of this block, called the [access point](accessPoint.md), which will also relay messages wirelessly. Wireless messages can be received and relayed by other [access points](accessPoint.md), or by [computers](../general/computer.md) with a [wireless network card](../item/wlanCard1.md).
Switches and [access points](accessPoint.md) do *not* keep track of which packets they relayed recently, so avoid cycles in your network or you may receive the same packet multiple times. Due to the limited buffer size of switches, sending messages too frequently will result in packet loss. You can upgrade your switches and [access points](accessPoint.md) to increase the speed with which they relay messages, as well as their internal message queue size.

View File

@ -0,0 +1 @@
#REDIRECT componentBus1.md

View File

@ -27,7 +27,7 @@
* [连接卡](linkedCard.md)
* [网卡](lanCard.md)
* [红石卡](redstoneCard1.md)
* [无线网卡](wlanCard.md)
* [无线网卡](wlanCard1.md)
* [世界传感器卡](worldSensorCard.md)
### 升级

View File

@ -1,6 +1,6 @@
# WLAN Card
![May cause cancer. May not.](oredict:oc:wlanCard)
![May cause cancer. May not.](oredict:oc:wlanCard2)
无线网卡是 [网卡](lanCard.md) 的升级, 添加了收发无线信号的能力.无线信号发射强度决定了信息可以传多远, 信号强度等于方块距离.

View File

@ -0,0 +1 @@
#REDIRECT wlanCard1.md

View File

@ -186,8 +186,8 @@
00B9:00307030303030300000000000000000
00BA:0000003C6666663C007E000000000000
00BB:0000000000CC663366CC000000000000
00BC:000066E66C6C18183032666ACFC20000
00BD:000066E66C6C181830306C66CCCE0000
00BC:000046C64C4C58183032666ACFC20000
00BD:000046C64C4C581830306C66CCCE0000
00BE:0000C6266C2CD8183032666ACFC20000
00BF:0018180000183030606066663C000000
00C0:301800183C6666667E66666666000000
@ -910,13 +910,14 @@
201D:66CC0000000000000000000000000000
2020:00001818187E18181818181818000000
2021:00001818187E1818187E181818000000
2022:0000000018183C3C3C3C181800000000
2022:000000000000183C3C18000000000000
2024:00000000000000000000181818000000
2025:00000000000000000000666666660000
2026:00000000000000000000009292000000
2030:0000C6C6CCCC18186060DBDBDBDB0000
2031:0000C6C6CCCC18186060D5D5D5D50000
203C:66666666666666666666000066660000
2044:000006060C0C181830306060C0C00000
2047:CCCC66666666CCCCCCCC0000CCCC0000
2048:E6E6363636366666C6C60000C6C60000
2049:DCDCC6C6C6C6CCCCD8D80000D8D80000
@ -928,11 +929,31 @@
2078:00386C6C386C6C380000000000000000
2079:00386C6C3C0C0C380000000000000000
207F:000000786C6C6C6C0000000000000000
20A3:00007E6060607C6060F8606060000000
20A4:0000386C6C60F060F0606666FC000000
20A7:00FC66667C62666F666666F300000000
20AA:000000FA8AAAAAAAAAA2BE0000000000
20AC:00003C666660FC60F86066663C000000
2117:7E7E8181B9B9A5A5B9B9A1A181817E7E
2120:006A8E8E4A2A2ACA0000000000000000
2122:00EA4E4E4A4A4A4A0000000000000000
2150:000046C64C4C581830376162C2C20000
2151:000046C64C4C581830366967C1C60000
2152:000046C64C4C581A36326062C5C20000
2153:000046C64C4C581830366162C1C60000
2154:0000C6264C8CF81830366162C1C60000
2155:000046C64C4C5818303E686CC2CC0000
2156:0000C6264C8CF818303E686CC2CC0000
2157:0000C6266C2CD818303E686CC2CC0000
2158:00002666ACFC3818303E686CC2CC0000
2159:000046C64C4C58183036686EC9C60000
215A:0000E686CC2CD8183036686EC9C60000
215B:000046C64C4C581830366966C9C60000
215C:0000C6266C2CD81830366966C9C60000
215D:0000E686CC2CD81830366966C9C60000
215E:0000E6264C4C581830366966C9C60000
215F:000046C64C4C581830306060C0C00000
2189:000046A6ACAC581830366162C1C60000
2190:000000000010307F7F30100000000000
2191:183C7E18181818181818181818181818
2192:0000000000080CFEFE0C080000000000
@ -943,26 +964,53 @@
2199:000004040E0E1C1CB8B8F0F0E0E0F0F0
21A5:183C7E181818181818181818187E3C18
21A8:183C7E1818181818181818187E3C18FF
21E6:181838386F6FC1C1C1C16F6F38381818
21E7:18183C3C6666C3C3E7E7242424243C3C
21E8:18181C1CF6F683838383F6F61C1C1818
21E9:3C3C24242424E7E7C3C366663C3C1818
21E6:0000000018386FC1C16F381800000000
21E7:00000000183C66C3E724243C00000000
21E8:00000000181CF68383F61C1800000000
21E9:000000003C2424E7C3663C1800000000
220E:00000000007E7E7E7E7E7E0000000000
2211:0000FEC06030180C183060C0FE000000
2212:000000000000007E0000000000000000
2218:000000003C3C666666663C3C00000000
2213:000000007E001818187E181818000000
2214:0000001818001818187E181818000000
2215:000006060C0C181830306060C0C00000
2218:0000000000003C66663C000000000000
2219:000000000000183C3C18000000000000
221A:0003030606060606CCCC6C3818000000
221B:0063132616660606CCCC6C3818000000
221C:002363A6F6262606CCCC6C3818000000
221E:000000000076DBDBDB6E000000000000
221F:000000000000FE060606060000000000
2223:00001818181818181818181818000000
2224:000018181A1C18183858181818000000
2225:00006C6C6C6C6C6C6C6C6C6C6C000000
2226:00006C6C6E6C6C7C6C6CEC6C6C000000
2229:0000003C666666666666666600000000
222A:00000066666666666666663C00000000
222B:00000E1B18181818181818D870000000
2248:0000000072D69C0072D69C0000000000
2261:000000007E00007E00007E0000000000
2264:000000000C18306030180C007E000000
2265:0000000030180C060C1830007E000000
2295:0000000000385492FE92543800000000
2296:0000000000384482FE82443800000000
2297:00000000003844AA92AA443800000000
2298:000000000038448A92A2443800000000
2299:00000000003844829282443800000000
229A:0000000000384492AA92443800000000
229C:00000000003844BA82BA443800000000
229D:0000000000384482BA82443800000000
229E:0000000000FE9292FE9292FE00000000
229F:0000000000FE8282FE8282FE00000000
22A0:0000000000FEC6AA92AAC6FE00000000
22A1:0000000000FE8282928282FE00000000
22C5:00000000181818180000000000000000
2320:00000E1B1B1B18181818181818181818
2321:181818181818181818D8D8D870000000
23E9:000000008888CCCCEEEECCCC88880000
23EA:0000000022226666EEEE666622220000
23EB:101038387C7C0000101038387C7C0000
23EC:000000008888CCCCEEEECCCC88880000
23EC:7C7C3838101000007C7C383810100000
2500:00000000000000FFFF00000000000000
2501:000000000000FFFFFFFF000000000000
2502:18181818181818181818181818181818
@ -1123,20 +1171,20 @@
259D:0F0F0F0F0F0F0F0F0000000000000000
259E:0F0F0F0F0F0F0F0FF0F0F0F0F0F0F0F0
259F:0F0F0F0F0F0F0F0FFFFFFFFFFFFFFFFF
25A0:00007E7E7E7E7E7E7E7E7E7E7E7E0000
25A1:00007E7E66666666666666667E7E0000
25A2:7C7CC6C6C6C6C6C6C6C6C6C67C7C0000
25A3:FEFE8282BABABABABABA8282FEFE0000
25A0:00000000007E7E7E7E7E7E0000000000
25A1:00000000007E666666667E0000000000
25A2:000000007CC6C6C6C6C67C0000000000
25A3:00000000FE82BABABA82FE0000000000
25A4:FF00FF00FF00FF00FF00FF00FF00FF00
25A5:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
25A6:44FF444444FF444444FF444444FF4444
25A7:88884444222211118888444422221111
25A8:11112222444488881111222244448888
25A9:AAAA4444AAAA1111AAAA4444AAAA1111
25AA:00000000383838383838000000000000
25AB:00000000383828283838000000000000
25AC:00000000000000007E7E7E7E7E7E0000
25AD:00000000000000007E7E66667E7E0000
25AA:00000000000038383800000000000000
25AB:00000000000038283800000000000000
25AC:0000000000000000007E7E7E00000000
25AD:0000000000000000007E667E00000000
25AE:3C3C3C3C3C3C3C3C3C3C3C3C3C3C0000
25AF:3C3C242424242424242424243C3C0000
25B0:00000000000000003F3F7E7EFCFC0000
@ -1147,8 +1195,8 @@
25B5:000010103828286C4444C68282FE0000
25B6:80C0E0F0F8FCFEFFFEFCF8F0E0C08000
25B7:80C0E0F0D8CCC6C3C6CCD8F0E0C08000
25B8:00000000406070787C78706040000000
25B9:00000000406050484448506040000000
25B8:000000002030383C3E3C383020000000
25B9:00000000203028242224283020000000
25BA:00000000C0F0FCFFFCF0C00000000000
25BB:00000000C0F0DCC7DCF0C00000000000
25BC:FEFEFEFE7C7C7C7C3838383810101010
@ -1164,25 +1212,25 @@
25C6:18183C3C7E7EFFFFFFFF7E7E3C3C1818
25C7:18183C3C6666C3C3C3C366663C3C1818
25C8:181824245A5ABDBDBDBD5A5A24241818
25C9:3C3C6666C3C3DBDBDBDBC3C366663C3C
25C9:000000003C66C3DBDBC3663C00000000
25CA:101038386C6CC6C6C6C66C6C38381010
25CB:00003C3C66664242424266663C3C0000
25CC:10104444000082820000444410100000
25CD:000038386C6CAAAAAAAA6C6C38380000
25CE:383844449292AAAA9292444438380000
25CF:00003C3C7E7E7E7E7E7E7E7E3C3C0000
25D0:3C3C7676F3F3F3F3F3F3F3F376763C3C
25D1:3C3C6E6ECFCFCFCFCFCFCFCF6E6E3C3C
25D2:3C3C6666C3C3C3C3FFFFFFFF7E7E3C3C
25D3:3C3C7E7EFFFFFFFFC3C3C3C366663C3C
25D4:3C3C6E6ECFCFCFCFC3C3C3C366663C3C
25D5:3C3C6E6ECFCFCFCFFFFFFFFF7E7E3C3C
25CB:00000000003C664242663C0000000000
25CC:00000000104400820044100000000000
25CD:0000000000386CAAAA6C380000000000
25CE:00000000384492AA9244380000000000
25CF:00000000003C7E7E7E7E3C0000000000
25D0:000000003C76F3F3F3F3763C00000000
25D1:000000003C6ECFCFCFCF6E3C00000000
25D2:000000003C66C3C3FFFF7E3C00000000
25D3:000000003C7EFFFFC3C3663C00000000
25D4:000000003C6ECFCFC3C3663C00000000
25D5:000000003C6ECFCFFFFF7E3C00000000
25D6:00030F1F1F3F3F3F3F3F1F1F0F030000
25D7:00C0F0F8F8FCFCFCFCFCF8F8F0C00000
25D8:FFFFFFFFE7E7C3C3C3C3E7E7FFFFFFFF
25D9:FFFFC3C39999BDBDBDBD9999C3C3FFFF
25DA:FFFFC3C39999BDBD0000000000000000
25DB:0000000000000000BDBD9999C3C3FFFF
25D8:FFFFFFFFFFFFE7C3C3E7FFFFFFFFFFFF
25D9:FFFFFFFFFFC399BDBD99C3FFFFFFFFFF
25DA:FFFFFFFFFFC399BD0000000000000000
25DB:0000000000000000BD99C3FFFFFFFFFF
25DC:38386060C0C0C0C00000000000000000
25DD:1C1C0606030303030000000000000000
25DE:00000000000000000303030306061C1C
@ -1193,32 +1241,38 @@
25E3:8080C0C0E0E0F0F0F8F8FCFCFEFEFFFF
25E4:FFFFFEFEFCFCF8F8F0F0E0E0C0C08080
25E5:FFFF7F7F3F3F1F1F0F0F070703030101
25E6:00000000181824242424181800000000
25E7:FFFFF3F3F3F3F3F3F3F3F3F3F3F3FFFF
25E8:FFFFCFCFCFCFCFCFCFCFCFCFCFCFFFFF
25E9:FFFFFFFFFFFFFBFBF3F3E3E3C3C3FFFF
25EA:FFFFC3C3C7C7CFCFDFDFFFFFFFFFFFFF
25EB:FFFFDBDBDBDBDBDBDBDBDBDBDBDBFFFF
25E6:00000000000018242418000000000000
25E7:00000000FFF3F3F3F3F3F3FF00000000
25E8:00000000FFCFCFCFCFCFCFFF00000000
25E9:00000000FFFFFFFBF3E3C3FF00000000
25EA:00000000FFC3C7CFDFFFFFFF00000000
25EB:00000000FFDBDBDBDBDBDBFF00000000
25EC:18181818242442425A5A99998181FFFF
25ED:181818183C3C76767676F3F3F3F3FFFF
25EE:181818183C3C6E6E6E6ECFCFCFCFFFFF
25EF:3C3C6666C3C3C3C3C3C3C3C366663C3C
25F0:FFFFDBDBDBDBDBDBFBFBC3C3C3C3FFFF
25F1:FFFFC3C3C3C3C3C3FBFBDBDBDBDBFFFF
25F2:FFFFC3C3C3C3C3C3DFDFDBDBDBDBFFFF
25F3:FFFFDBDBDBDBDBDBDFDFC3C3C3C3FFFF
25F4:3C3C7E7EDBDBDBDBFBFBC3C366663C3C
25F5:3C3C6666C3C3FBFBDBDBDBDB7E7E3C3C
25F6:3C3C6666C3C3DFDFDBDBDBDB7E7E3C3C
25F7:3C3C7E7EDBDBDBDBDFDFC3C366663C3C
25EF:000000003C66C3C3C3C3663C00000000
25F0:00000000FFDBDBDBFBC3C3FF00000000
25F1:00000000FFC3C3C3FBDBDBFF00000000
25F2:00000000FFC3C3C3DFDBDBFF00000000
25F3:00000000FFDBDBDBDFC3C3FF00000000
25F4:000000003C7EDBDBFBC3663C00000000
25F5:000000003C66C3FBDBDB7E3C00000000
25F6:000000003C66C3DFDBDB7E3C00000000
25F7:000000003C7EDBDBDFC3663C00000000
25F8:FFFFC6C6CCCCD8D8F0F0E0E0C0C08080
25F9:FFFF636333331B1B0F0F070703030101
25FA:0101030307070F0F1B1B33336363FFFF
25FB:00007C7C6C6C6C6C6C6C7C7C00000000
25FC:00007C7C7C7C7C7C7C7C7C7C00000000
25FD:000000003C3C242424243C3C00000000
25FE:000000003C3C3C3C3C3C3C3C00000000
25FF:8080C0C0E0E0F0F0D8D8CCCCC6C6FFFF
25FA:8080C0C0E0E0F0F0D8D8CCCCC6C6FFFF
25FB:00000000007C6C6C6C7C000000000000
25FC:00000000007C7C7C7C7C000000000000
25FD:0000000000003C24243C000000000000
25FE:0000000000003C3C3C3C000000000000
25FF:0101030307070F0F1B1B33336363FFFF
2605:000001000380038007C03FF87FFC3FF80FE00FE01FF03C783018000000000000
2606:000001000380038006C03C78600C38380C600C601BB03C783018000000000000
2609:00000000003C425A5A423C0000000000
2610:00000000FE8282828282FE0000000000
2611:00000000FE868AAA9282FE0000000000
2612:00000000FE82AA92AA82FE0000000000
2625:00007CC6C66C38FE3838383838000000
2628:000018183C18187E1818181818000000
262F:0000003C428D81B3FFCF7E3C00000000
@ -1230,9 +1284,12 @@
2635:00000000C6C60000FEFE0000C6C60000
2636:00000000FEFE0000C6C60000C6C60000
2637:00000000C6C60000C6C60000C6C60000
2639:00003C4281A5818199BD81423C000000
263A:00003C4281A58181BD9981423C000000
263B:00003C7EFFDBFFFFC3E7FF7E3C000000
2639:0000007E81A5A5818199BD817E000000
263A:0000007E81A5A58181BD99817E000000
263B:0000007EFFDBDBFFFFC3E7FF7E000000
2640:0000003C6666663C187E181800000000
2641:00000018187E183C6666663C00000000
2642:0000001E0E1A78CCCCCCCC7800000000
2660:00000010387CFEFEFE38387C00000000
2661:0000006CFEC6C6C66C6C381000000000
2662:0000001038386CC66C38381000000000
@ -1251,9 +1308,9 @@
268D:0000000000000000C6C60000FEFE0000
268E:0000000000000000FEFE0000C6C60000
268F:0000000000000000C6C60000C6C60000
26AA:000000003C3C4242424242423C3C0000
26AB:000000003C3C7E7E7E7E7E7E3C3C0000
26AC:000038387C7C6C6C7C7C383800000000
26AA:0000000000003C4242423C0000000000
26AB:0000000000003C7E7E7E3C0000000000
26AC:0000000000387C6C7C38000000000000
2708:303038389C9CFFFFFFFF9C9C38383030
2734:929254543838FEFE3838545492920000
2800:00000000000000000000000000000000
@ -1513,10 +1570,17 @@
28FE:0F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFF
28FF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
2913:181818181818181818181818187E3C18
2A00:000007C01C7030183018600C638C638C638C600C301830181C7007C000000000
2A01:000007C01D7031183118610C610C7FFC610C610C311831181D7007C000000000
2A02:000007C01C70301838386C6C66CC638C66CC6C6C383830181C7007C000000000
2A03:44444444444454544444444438380000
2A04:4444444454547C7C5454444438380000
2A05:7C7C4444444444444444444444440000
2A06:4444444444444444444444447C7C0000
2B1D:00000000000018181818000000000000
2B24:3C3C7E7EFFFFFFFFFFFFFFFF7E7E3C3C
2B55:3C3C7E7EE7E7C3C3C3C3E7E77E7E3C3C
2B58:00003C3C7E7E666666667E7E3C3C0000
2B24:000000003C7EFFFFFFFF7E3C00000000
2B55:000000003C7EE7C3C3E77E3C00000000
2B58:00000000003C7E66667E3C0000000000
2E2E:3C3C6666666630301818000018180000
3000:0000000000000000000000000000000000000000000000000000000000000000
3001:0000000000000000000000000000000000000000000000002000100008000800
@ -8509,125 +8573,6 @@ EC03:000052523434060660602C2C4A4A0000
EC04:000010102C2C3A3A5C5C343404040000
EC05:525244442D2DC4C41111B4B423234A4A
EC06:9191525200000303C0C000004A4A8989
EC07:00003C7EFF99FFFFC3BDFF7E3C000000
EC08:7E7EC3C3D3D3D3D3DBDBC3C3C3C37E7E
EC09:18183C3C3C3C3C3C7E7E101038381010
EC0A:0505050505050D0D0D0D191979797171
EC0B:A0A0A0A0A0A0B0B0B0B098989E9E8E8E
EC0C:10105454545454545454545454549292
EC0D:7070C6C6C4C4C0C0C4C4C6C670700000
EC0E:181818183C3C7E7EFFFFDBDB18183C3C
EC0F:3C3C1818DBDBFFFF7E7E3C3C18181818
EC10:0C0C1C1C3939FFFFFFFF39391C1C0C0C
EC11:BABAEEEEAAAA38383838BABAFEFEBABA
EC12:BABAFEFEBABA38383838AAAAEEEEBABA
EC13:E7E74242FFFFF9F9FFFF4242E7E70000
EC14:E7E74242FFFF9F9FFFFF4242E7E70000
EC15:22226363F7F7B7B7FFFF7E7E3C3C3C3C
EC16:3C3C7E7EFFFFBFBFFFFF7E7E3C3C3C3C
EC17:3C3C3C3C18183C3C3C3C3C3C3C3C1818
EC18:18183C3C3C3C3C3C3C3C18183C3C3C3C
EC19:000000007B7BFFFFFFFF7B7B00000000
EC1A:00000000DEDEFFFFFFFFDEDE00000000
EC1B:2020606020202020303028283C3C3C3C
EC1C:000030305858FDFDFFFF797930300000
EC1D:00000C0C1A1ABFBFFFFF9E9E0C0C0000
EC1E:000030305858FDFD3F3FF9F930300000
EC1F:00000C0C1A1ABFBFFCFC9F9F0C0C0000
EC20:101028286868BCBCFCFC787810103838
EC21:00000000FCFC1C1C7F7F63633E3E0000
EC22:3838383892927C7C1010282828282828
EC23:383838381010FEFE1010282844448282
EC24:8282444428281010FEFE101038383838
EC25:11111212D4D4F8F8D4D4121211110000
EC26:888848482B2B1F1F2B2B484888880000
EC27:3838383812127C7C9090282824242222
EC28:3838383890907C7C1212282848488888
EC29:383838381010FEFE101038387C7CFEFE
EC2A:8181C3C3E7E7FFFFFFFF99992424C3C3
EC2B:00007C7CD6D67C7C3838545492920000
EC2C:0000000038385454FEFE000000000000
EC2D:3C3C5A5AFFFFE7E77E7E242442428181
EC2E:3C3C5A5AFFFFE7E77E7E242424246666
EC2F:08081C1C2A2A7F7F77773E3E36366363
EC30:08081C1C2A2A7F7F77773E3E36361414
EC31:4141A2A23C3C5A5A7E7EFFFF42426363
EC32:828245453C3C5A5A7E7EFFFF4242C6C6
EC33:00005A5ABDBD99992424424224240000
EC34:8181A5A55A5A181818182424C3C30000
EC35:000024247E7EBDBD7E7E24242424E7E7
EC36:24247E7EBDBD7E7E242442424242C3C3
EC37:3C3C5A5AFFFFABABD5D5FFFFDDDD8989
EC38:3C3C5A5AFFFFABABD5D5FFFF77772222
EC39:3C3C4242A5A5818199998181D5D5AAAA
EC3A:3C3C4242A5A5818199998181ABAB5555
EC3B:181824247E7EFFFF5A5A242400000000
EC3C:3C3CFFFFFFFF18180C0C181830301818
EC3D:3C3C4242ABABD5D51010101014140808
EC3E:0000C0C0C8C854545454555522220000
EC3F:FFFF89899191C5C5A3A389899191FFFF
EC40:FFFFC3C3A5A599999999A5A5C3C3FFFF
EC41:FFFF99999999FFFFFFFF99999999FFFF
EC42:FFFF8181A5A581818181A5A58181FFFF
EC43:E7E7818181810000000081818181E7E7
EC44:92925454383810101010101010101010
EC45:38381010383810103838101038381010
EC46:000000000000AAAAFFFFAAAA00000000
EC47:7E7E42427E7E42427E7E42427E7E4242
EC48:0000FFFF5555555555555555FFFF0000
EC49:000000000000C0C0B0B08C8C8383FFFF
EC4A:00000000000003030D0D3131C1C1FFFF
EC4B:0F0F303040404E4E8A8A8E8E80808181
EC4C:F0F00C0C020272725151717101018181
EC4D:0F0F3030404040408E8E808080808181
EC4E:F0F00C0C020202027171010101018181
EC4F:81818080888884844343404030300F0F
EC50:8181010111112121C2C202020C0CF0F0
EC51:81818080808087874040404030300F0F
EC52:818101010101E1E1020202020C0CF0F0
EC53:81818080838384844343404030300F0F
EC54:81810101C1C12121C2C202020C0CF0F0
EC55:81818080878788884848404030300F0F
EC56:81810101E1E11111121202020C0CF0F0
EC57:07070F0F1F1F1818181810101E1E1717
EC58:F0F0F8F8ECEC0404040404043C3C5454
EC59:11110B0B0D0D060607072E2E39393838
EC5A:04042828D8D82828D0D01010E0E00000
EC5B:00000303040408083F3F7F7FFFFF3F3F
EC5C:0000C0C020201010FCFCFEFEFFFFFCFC
EC5D:03030C0C3F3F3F3FFFFF7F7F37371F1F
EC5E:C0C03030B8B8DCDCEEEEF6F6FBFBFBFB
EC5F:04044E4EE4E446466F6F7F7F60603F3F
EC60:2020727227276262F6F6FEFE0606FCFC
EC61:3B3B31311B1B1F1F10101F1F0F0F0707
EC62:DCDC8C8CD8D8F8F80808F8F8F0F0E0E0
EC63:010133337B7B59598C8CDFDF7F7F3F3F
EC64:8080CCCCDEDE9A9A3131FBFBFEFEFCFC
EC65:01010303070706060E0E3E3E70703030
EC66:8080C0C0E0E0606070707C7C0E0E0C0C
EC67:787870706060E0E0C0C0ECECFEFED1D1
EC68:1E1E0E0E06060707030337377F7F8B8B
EC69:3F3F1F1F1F1F0F0F0F0F7F7F0000FFFF
EC6A:FCFCF8F8F8F8F0F0F0F0FEFE0000FFFF
EC6B:0000010102020404020201011F1F1F1F
EC6C:000080804040202040408080F8F8F8F8
EC6D:02020202020202021F1F20207F7F0000
EC6E:4040404040404040F8F80404FEFE0000
EC6F:7373737373737F7F3F3F1F1F0F0F0F0F
EC70:CECECECECECEFEFEFCFCF8F8F0F0F0F0
EC71:0F0F0F0F0F0F18187F7F40407F7FFFFF
EC72:F0F0F0F0F0F01818FEFE0202FEFEFFFF
EC73:F8F8444442422121212142424444F8F8
EC74:FFFF050507070000000007070505FFFF
EC75:FCFC868682828181818182828686FCFC
EC76:00000000808040407F7F808000000000
EC77:0000010106061D1D2A2A2A2A2A2A1F1F
EC78:1B1B8F8F65651111C9C9A9A9B1B1F3F3
EC79:4C4CF7F7F0F01818070702023E3EFEFE
EC7A:7F7F9F9F3131414181818181F9F9FDFD
EC7B:5F5F60606363626264647B7B60605F5F
EC7C:FFFF04040303FCFC0202FCFC0404F8F8
EC7D:FCFC0202FCFC00000000000000000000
FE81:7E801010101010101010000000000000
FE82:3C401010101010101F0F000000000000
FE84:30403840101010101F0F000000000000
@ -8781,7 +8726,9 @@ FF37:00000000781E781E781E781E781E799E7BDE7FFE7E7E7C3E781E000000000000
FF38:00000000F00F781E3C3C1E780FF007E00FF01E783C3C781EF00F000000000000
FF39:00000000F00F781E3C3C1E780FF007E003C003C003C003C003C0000000000000
FF3A:000000003FFC003C007800F001E003C007800F001E003C003FFC000000000000
FF3B:00000FF00F000F000F000F000F000F000F000F000F000F000F000FF000000000
FF3C:F00078003C001E000F00078003C001E000F00078003C001E000F000700000000
FF3D:00000FF000F000F000F000F000F000F000F000F000F000F000F00FF000000000
FF3E:000003C007E00FF01E783C3C781E000000000000000000000000000000000000
FF3F:0000000000000000000000000000000000000000000000000000000000007FFE
FF40:000003C001E000F0003C00000000000000000000000000000000000000000000
@ -8811,9 +8758,12 @@ FF57:000000000000000000000000781E781E799E7BDE7FFE3FFC1E78000000000000
FF58:000000000000000000000000781E3C3C1E780FF01E783C3C781E000000000000
FF59:0000000000000000000000003C3C3C3C3C3C3C3C3C3C3C3C0FFC003C003C0FF0
FF5A:0000000000000000000000003FFC003C00F003C00F003C003FFC000000000000
FF5C:0000007E01E001E001E001E003C07F8003C001E001E001E001E0007E00000000
FF5B:0000007E01E001E001E001E003C07F8003C001E001E001E001E0007E00000000
FF5C:03C003C003C003C003C003C003C003C003C003C003C003C003C003C000000000
FF5D:00007E00078007800780078003C001FE03C007800780078007807E0000000000
FF5E:00001F867BDE60F8000000000000000000000000000000000000000000000000
FF5F:00000330066006600CC00CC00CC00CC00CC00CC00CC006600660033000000000
FF60:00000CC0066006600330033003300330033003300330066006600CC000000000
FF61:000000000000000000386C6C38000000
FF62:001E1818181800000000000000000000
FF63:00000000000000000018181818780000
@ -8964,7 +8914,3 @@ FF9F:00386C6C380000000000000000000000
1D354:929200009292000092920000FEFE0000
1D355:929200009292000092920000C6C60000
1D356:92920000929200009292000092920000
1F34E:080810106C6CFEFEFCFCFCFC7E7E6C6C
1F34F:080810106C6C82828484848452526C6C
1F352:00000606080810103030787878783030
1F860:1010383838383838383838387C7CD6D6

View File

@ -153,7 +153,8 @@ item.oc.UpgradeTank.name=Tank-Upgrade
item.oc.UpgradeTankController.name=Tankbedienungs-Upgrade
item.oc.UpgradeTractorBeam.name=Traktorstrahl-Upgrade
item.oc.UpgradeTrading.name=Handels-Upgrade
item.oc.WirelessNetworkCard.name=Drahtlosnetzwerkkarte
item.oc.WirelessNetworkCard0.name=Drahtlosnetzwerkkarte (Stufe 1)
item.oc.WirelessNetworkCard1.name=Drahtlosnetzwerkkarte (Stufe 2)
item.oc.WorldSensorCard.name=Weltsensorkarte
item.oc.wrench.name=Schraubenziehschlüssel

View File

@ -57,6 +57,7 @@ item.oc.CircuitBoard.name=Circuit Board
item.oc.ComponentBus0.name=Component Bus (Tier 1)
item.oc.ComponentBus1.name=Component Bus (Tier 2)
item.oc.ComponentBus2.name=Component Bus (Tier 3)
item.oc.ComponentBus3.name=Component Bus (Creative)
item.oc.ControlUnit.name=Control Unit (CU)
item.oc.CPU0.name=Central Processing Unit (CPU) (Tier 1)
item.oc.CPU1.name=Central Processing Unit (CPU) (Tier 2)
@ -153,7 +154,8 @@ item.oc.UpgradeTank.name=Tank Upgrade
item.oc.UpgradeTankController.name=Tank Controller Upgrade
item.oc.UpgradeTractorBeam.name=Tractor Beam Upgrade
item.oc.UpgradeTrading.name=Trading Upgrade
item.oc.WirelessNetworkCard.name=Wireless Network Card
item.oc.WirelessNetworkCard0.name=Wireless Network Card (Tier 1)
item.oc.WirelessNetworkCard1.name=Wireless Network Card (Tier 2)
item.oc.WorldSensorCard.name=World Sensor Card
item.oc.wrench.name=Scrench

View File

@ -144,7 +144,8 @@ item.oc.UpgradeSolarGenerator.name=Amélioration du générateur solaire
item.oc.UpgradeTank.name=Amélioration de réservoir
item.oc.UpgradeTankController.name=Amélioration du contrôleur de réservoir
item.oc.UpgradeTractorBeam.name=Amélioration du rayon tracteur
item.oc.WirelessNetworkCard.name=Carte de réseau sans-fils
item.oc.WirelessNetworkCard0.name=Carte de réseau sans-fils (Niveau 1)
item.oc.WirelessNetworkCard1.name=Carte de réseau sans-fils (Niveau 2)
item.oc.WorldSensorCard.name=Carte de capteur du monde
item.oc.wrench.name=Crisseur

View File

@ -107,7 +107,8 @@ item.oc.UpgradeSolarGenerator.name=Upgrade Panneli Solari
item.oc.UpgradeTank.name=Upgrade Taniche
item.oc.UpgradeTankController.name=Upgrade Controllore Taniche
item.oc.UpgradeTractorBeam.name=Upgrade Raggio Traente
item.oc.WirelessNetworkCard.name=Scheda di Rete Wireless
item.oc.WirelessNetworkCard0.name=Scheda di Rete Wireless (Livello 1)
item.oc.WirelessNetworkCard1.name=Scheda di Rete Wireless (Livello 2)
# GUI
oc:gui.Analyzer.Address=§6Indirizzo§f: %s

View File

@ -151,7 +151,8 @@ item.oc.UpgradeTank.name=Aprimoramento de Tanque
item.oc.UpgradeTankController.name=Aprimoramento de Controlador de Tanque
item.oc.UpgradeTractorBeam.name=Aprimoramento de Raio Trator
item.oc.UpgradeTrading.name=Aprimoramento de Troca
item.oc.WirelessNetworkCard.name=Cartão de Rede Sem Fio
item.oc.WirelessNetworkCard0.name=Cartão de Rede Sem Fio (Nível 1)
item.oc.WirelessNetworkCard1.name=Cartão de Rede Sem Fio (Nível 2)
item.oc.WorldSensorCard.name=Cartão de Sensor de Mundo
item.oc.wrench.name=Chave de fenda-boca

View File

@ -63,7 +63,8 @@ item.oc.UpgradeGenerator.name=Melhoramento: Gerador
item.oc.UpgradeNavigation.name=Melhoramento: Navegação
item.oc.UpgradeSign.name=Melhoramento: Escrita e Leitura de Placas
item.oc.UpgradeSolarGenerator.name=Melhoramento: Gerador Solar
item.oc.WirelessNetworkCard.name=Placa de Rede sem Fios
item.oc.WirelessNetworkCard0.name=Placa de Rede sem Fios
item.oc.WirelessNetworkCard1.name=Placa de Rede sem Fios
# GUI
oc:gui.Analyzer.Address=§6Endereço§f: %s

View File

@ -153,7 +153,8 @@ item.oc.UpgradeTank.name=Улучшение "Бак для жидкостей"
item.oc.UpgradeTankController.name=Улучшение "Контроллер бака"
item.oc.UpgradeTractorBeam.name=Улучшение "Притягивающий луч"
item.oc.UpgradeTrading.name=Улучшение "Торговля"
item.oc.WirelessNetworkCard.name=Плата беспроводной сети
item.oc.WirelessNetworkCard0.name=Плата беспроводной сети (1-ый уровень)
item.oc.WirelessNetworkCard1.name=Плата беспроводной сети (2-ой уровень)
item.oc.WorldSensorCard.name=Карта-мировой сенсор
item.oc.wrench.name=Ключ

View File

@ -152,7 +152,8 @@ item.oc.UpgradeTank.name=水箱升级
item.oc.UpgradeTankController.name=高级水箱升级
item.oc.UpgradeTractorBeam.name=牵引光束升级
item.oc.UpgradeTrading.name=交易升级
item.oc.WirelessNetworkCard.name=无线网卡
item.oc.WirelessNetworkCard0.name=无线网卡
item.oc.WirelessNetworkCard1.name=无线网卡
item.oc.WorldSensorCard.name=世界感应卡
item.oc.wrench.name=螺丝刀扳手

View File

@ -147,7 +147,8 @@ item.oc.UpgradeSolarGenerator.name=太陽能發電升級
item.oc.UpgradeTank.name=水箱升級
item.oc.UpgradeTankController.name=高級水箱升級
item.oc.UpgradeTractorBeam.name=牽引光束升級
item.oc.WirelessNetworkCard.name=無線網卡
item.oc.WirelessNetworkCard0.name=無線網卡
item.oc.WirelessNetworkCard1.name=無線網卡
item.oc.WorldSensorCard.name=世界傳感器卡
item.oc.wrench.name=螺絲刀扳手

View File

@ -16,7 +16,7 @@ manual {
input: [book, "oc:circuitChip1"]
}
nanomachines {
input: [["oc:chamelium", "oc:wlanCard", "oc:chamelium"]
input: [["oc:chamelium", "oc:wlanCard2", "oc:chamelium"]
["oc:cpu2", "oc:materialAcid", "oc:ram1"]
["oc:chamelium", "oc:capacitor", "oc:chamelium"]]
}
@ -69,7 +69,7 @@ microcontrollerCase2 {
}
terminal {
input: [[nuggetIron, "oc:solarGeneratorUpgrade", nuggetIron]
["oc:circuitChip3", "oc:screen2", "oc:wlanCard"]
["oc:circuitChip3", "oc:screen2", "oc:wlanCard2"]
[nuggetIron, "oc:keyboard", nuggetIron]]
}
tabletCase1 {
@ -104,8 +104,8 @@ server3 {
[obsidian, "oc:materialCircuitBoardPrinted", obsidian]]
}
terminalServer {
input: [[obsidian, "oc:wlanCard", obsidian]
["oc:wlanCard", "oc:circuitChip2", "oc:wlanCard"]
input: [[obsidian, "oc:wlanCard2", obsidian]
["oc:wlanCard2", "oc:circuitChip2", "oc:wlanCard2"]
[obsidian, "oc:materialCircuitBoardPrinted", obsidian]]
}
@ -200,7 +200,11 @@ lanCard {
input: [["oc:cable", "oc:circuitChip1", ""]
["", "oc:materialCard", ""]]
}
wlanCard {
wlanCard1 {
input: [[torchRedstoneActive, "oc:circuitChip1", torchRedstoneActive]
["", "oc:materialCard", ""]]
}
wlanCard2 {
input: [[materialEnderPearl, "oc:circuitChip2", ""]
["", "oc:materialCard", ""]]
}
@ -643,7 +647,7 @@ powerDistributor {
[ingotIron, "oc:materialCircuitBoardPrinted", ingotIron]]
}
rack {
input: [[gemDiamond, "oc:wlanCard", gemDiamond]
input: [[gemDiamond, "oc:wlanCard2", gemDiamond]
[fenceIron, chest, fenceIron]
["oc:relay", "oc:materialCircuitBoardPrinted", "oc:powerDistributor"]]
}

View File

@ -124,7 +124,12 @@ lanCard {
["oc:cable", "oc:materialCard", "oc:cable"]
[screwStainlessSteel , craftingToolScrewdriver, screwStainlessSteel]]
}
wlanCard {
wlanCard1 {
input: [[screwAluminium , "oc:circuitChip2" , screwAluminium]
[torchRedstoneActive, "oc:lanCard", torchRedstoneActive]
[screwAluminium , craftingToolScrewdriver, screwAluminium]]
}
wlanCard2 {
input: [[screwTitanium , "oc:circuitChip3" , screwTitanium]
[materialEnderPearl, "oc:lanCard", materialEnderPearl]
[screwTitanium , craftingToolScrewdriver, screwTitanium]]
@ -312,7 +317,7 @@ powerDistributor {
["oc:materialCircuitBoardPrinted", plateAluminium, craftingToolWrench]]
}
rack {
input: [[craftingToolScrewdriver, "oc:wlanCard", craftingToolWrench]
input: [[craftingToolScrewdriver, "oc:wlanCard2", craftingToolWrench]
[{item="ic2.reactorVentDiamond", subID=1}, chest, {item="ic2.reactorVentDiamond", subID=1}]
["oc:relay", "oc:materialCircuitBoardPrinted","oc:powerDistributor"]]
}

View File

@ -10,7 +10,7 @@ analyzer {
}
terminal {
input: [[nuggetIron, "oc:solarGeneratorUpgrade", nuggetIron]
["oc:circuitChip3", "oc:screen2", "oc:wlanCard"]
["oc:circuitChip3", "oc:screen2", "oc:wlanCard2"]
[nuggetIron, "oc:keyboard", nuggetIron]]
}
@ -102,7 +102,7 @@ graphicsCard3 {
}
internetCard {
input: [["oc:materialInterweb", "oc:circuitChip3", torchRedstoneActive]
["", "oc:wlanCard", obsidian]]
["", "oc:wlanCard2", obsidian]]
}
redstoneCard1 {
input: [[torchRedstoneActive, "oc:circuitChip1", ""]
@ -116,13 +116,17 @@ lanCard {
input: [["oc:cable", "oc:circuitChip1", ""]
["", "oc:materialCard", ""]]
}
wlanCard {
wlanCard1 {
input: [[torchRedstoneActive, "oc:circuitChip1", torchRedstoneActive]
["", "oc:lanCard", ""]]
}
wlanCard2 {
input: [[materialEnderPearl, "oc:circuitChip2", ""]
["", "oc:lanCard", ""]]
}
linkedCard {
input: [[eyeOfEnder, "", eyeOfEnder]
["oc:wlanCard", "oc:materialInterweb", "oc:wlanCard"]
["oc:wlanCard2", "oc:materialInterweb", "oc:wlanCard2"]
["oc:circuitChip3", "", "oc:circuitChip3"]]
output: 2 # Note: all resulting cards are linked to each other.
}
@ -372,7 +376,7 @@ powerDistributor {
[ingotIron, "oc:materialCircuitBoardPrinted", ingotIron]]
}
rack {
input: [["oc:circuitChip3", "oc:wlanCard", "oc:circuitChip3"]
input: [["oc:circuitChip3", "oc:wlanCard2", "oc:circuitChip3"]
[fenceIron, chest, fenceIron]
["oc:relay", "oc:materialCircuitBoardPrinted","oc:powerDistributor"]]
}

View File

@ -4,7 +4,11 @@ redstoneCard2 {
input: [[blockRedstone, "oc:circuitChip2", gemDiamond]
["", "oc:materialCard", ""]]
}
wlanCard {
wlanCard1 {
input: [[torchRedstoneActive, "oc:circuitChip1", torchRedstoneActive]
["", "oc:materialCard", ""]]
}
wlanCard2 {
input: [[gemDiamond, "oc:circuitChip2", ""]
["", "oc:materialCard", ""]]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 B

View File

@ -73,6 +73,7 @@ object Constants {
final val ComponentBusTier1 = "componentBus1"
final val ComponentBusTier2 = "componentBus2"
final val ComponentBusTier3 = "componentBus3"
final val ComponentBusCreative = "componentBusCreative"
final val CPUTier1 = "cpu1"
final val CPUTier2 = "cpu2"
final val CPUTier3 = "cpu3"
@ -160,7 +161,8 @@ object Constants {
final val UpgradeContainerTier1 = "upgradeContainer1"
final val UpgradeContainerTier2 = "upgradeContainer2"
final val UpgradeContainerTier3 = "upgradeContainer3"
final val WirelessNetworkCard = "wlanCard"
final val WirelessNetworkCardTier1 = "wlanCard1"
final val WirelessNetworkCardTier2 = "wlanCard2"
final val WorldSensorCard = "worldSensorCard"
final val Wrench = "wrench"

View File

@ -62,11 +62,11 @@ class Settings(val config: Config) {
val eepromSize = config.getInt("computer.eepromSize") max 0
val eepromDataSize = config.getInt("computer.eepromDataSize") max 0
val cpuComponentSupport = Array(config.getIntList("computer.cpuComponentCount"): _*) match {
case Array(tier1, tier2, tier3) =>
Array(tier1: Int, tier2: Int, tier3: Int)
case Array(tier1, tier2, tier3, tierCreative) =>
Array(tier1: Int, tier2: Int, tier3: Int, tierCreative: Int)
case _ =>
OpenComputers.log.warn("Bad number of CPU component counts, ignoring.")
Array(8, 12, 16)
Array(8, 12, 16, 1024)
}
val callBudgets = Array(config.getDoubleList("computer.callBudgets"): _*) match {
case Array(tier1, tier2, tier3) =>
@ -191,7 +191,13 @@ class Settings(val config: Config) {
val robotTurnCost = config.getDouble("power.cost.robotTurn") max 0
val robotMoveCost = config.getDouble("power.cost.robotMove") max 0
val robotExhaustionCost = config.getDouble("power.cost.robotExhaustion") max 0
val wirelessCostPerRange = config.getDouble("power.cost.wirelessCostPerRange") max 0
val wirelessCostPerRange = Array(config.getDoubleList("power.cost.wirelessCostPerRange"): _*) match {
case Array(tier1, tier2) =>
Array((tier1: Double) max 0.0, (tier2: Double) max 0.0)
case _ =>
OpenComputers.log.warn("Bad number of wireless card energy costs, ignoring.")
Array(0.05, 0.05)
}
val abstractBusPacketCost = config.getDouble("power.cost.abstractBusPacket") max 0
val geolyzerScanCost = config.getDouble("power.cost.geolyzerScan") max 0
val robotBaseCost = config.getDouble("power.cost.robotAssemblyBase") max 0
@ -332,8 +338,20 @@ class Settings(val config: Config) {
val maxNetworkPacketSize = config.getInt("misc.maxNetworkPacketSize") max 0
// Need at least 4 for nanomachine protocol. Because I can!
val maxNetworkPacketParts = config.getInt("misc.maxNetworkPacketParts") max 4
val maxOpenPorts = config.getInt("misc.maxOpenPorts") max 0
val maxWirelessRange = config.getDouble("misc.maxWirelessRange") max 0
val maxOpenPorts = Array(config.getIntList("misc.maxOpenPorts"): _*) match {
case Array(wired, tier1, tier2) =>
Array((wired: Int) max 0, (tier1: Int) max 0, (tier2: Int) max 0)
case _ =>
OpenComputers.log.warn("Bad number of max open ports, ignoring.")
Array(16, 1, 16)
}
val maxWirelessRange = Array(config.getDoubleList("misc.maxWirelessRange"): _*) match {
case Array(tier1, tier2) =>
Array((tier1: Double) max 0.0, (tier2: Double) max 0.0)
case _ =>
OpenComputers.log.warn("Bad number of wireless card max ranges, ignoring.")
Array(16.0, 400.0)
}
val rTreeMaxEntries = 10
val terminalsPerServer = 4
val updateCheck = config.getBoolean("misc.updateCheck")
@ -517,6 +535,13 @@ object Settings {
// Potion whitelist was fixed in 1.6.2.
VersionRange.createFromVersionSpec("[0.0, 1.6.2)") -> Array(
"nanomachines.potionWhitelist"
),
// Upgrading past version 1.7.1, changed wireless card stuff for t1 card.
VersionRange.createFromVersionSpec("[0.0, 1.7.2)") -> Array(
"power.cost.wirelessCostPerRange",
"misc.maxWirelessRange",
"misc.maxOpenPorts",
"computer.cpuComponentCount"
)
)

View File

@ -17,7 +17,7 @@ public class FontParserHex implements IGlyphProvider {
private static final byte[] OPAQUE = {(byte) 255, (byte) 255, (byte) 255, (byte) 255};
private static final byte[] TRANSPARENT = {0, 0, 0, 0};
private final byte[][] glyphs = new byte[0x10000][];
private final byte[][] glyphs = new byte[FontUtils.codepoint_limit()][];
@Override
public void initialize() {
@ -26,7 +26,6 @@ public class FontParserHex implements IGlyphProvider {
}
try {
final InputStream font = Minecraft.getMinecraft().getResourceManager().getResource(new ResourceLocation(Settings.resourceDomain(), "font.hex")).getInputStream();
OpenComputers.log().info("Initialized unicode glyph provider.");
try {
OpenComputers.log().info("Initializing unicode glyph provider.");
final BufferedReader input = new BufferedReader(new InputStreamReader(font));

View File

@ -196,7 +196,8 @@ object Achievement {
val WirelessNetworkCard = newAchievement("wirelessNetworkCard").
at(2, -6).
withParent(NetworkCard).
whenCrafting(Constants.ItemName.WirelessNetworkCard).
whenCrafting(Constants.ItemName.WirelessNetworkCardTier1).
whenCrafting(Constants.ItemName.WirelessNetworkCardTier2).
add()
val Cable = newAchievement("cable").

View File

@ -47,6 +47,9 @@ class Proxy {
OreDictionary.registerOre("torchRedstoneActive", net.minecraft.init.Blocks.REDSTONE_TORCH)
OreDictionary.registerOre("materialEnderPearl", net.minecraft.init.Items.ENDER_PEARL)
// Make mods that use old wireless card name not have broken recipes
OreDictionary.registerOre("oc:wlanCard", Items.get(Constants.ItemName.WirelessNetworkCardTier2).createItemStack(1))
tryRegisterNugget[item.IronNugget](Constants.ItemName.IronNugget, "nuggetIron", net.minecraft.init.Items.IRON_INGOT, "ingotIron")
tryRegisterNugget[item.DiamondChip](Constants.ItemName.DiamondChip, "chipDiamond", net.minecraft.init.Items.DIAMOND, "gemDiamond")
@ -147,7 +150,8 @@ class Proxy {
// Example usage: OpenComputers.ID + ":tabletCase" -> "tabletCase1"
private val itemRenames = Map[String, String](
OpenComputers.ID + ":dataCard" -> Constants.ItemName.DataCardTier1,
OpenComputers.ID + ":serverRack" -> Constants.BlockName.Rack
OpenComputers.ID + ":serverRack" -> Constants.BlockName.Rack,
OpenComputers.ID + ":wlanCard" -> Constants.ItemName.WirelessNetworkCardTier2
)
def missingMappings(e: FMLMissingMappingsEvent) {

View File

@ -63,7 +63,7 @@ class TerminalServer(val rack: api.internal.Rack, val slot: Int) extends Environ
keyboard
}
var range = Settings.get.maxWirelessRange
var range = Settings.get.maxWirelessRange(Tier.Two)
val keys = mutable.ListBuffer.empty[String]
def address = rack.getMountableData(slot).getString("terminalAddress")

View File

@ -157,7 +157,7 @@ class TextBuffer(val host: EnvironmentHost) extends prefab.ManagedEnvironment wi
}
this.synchronized {
_pendingCommands.foreach(_.sendToPlayersNearHost(host, Option(Settings.get.maxWirelessRange * Settings.get.maxWirelessRange)))
_pendingCommands.foreach(_.sendToPlayersNearHost(host, Option(Settings.get.maxWirelessRange(Tier.Two) * Settings.get.maxWirelessRange(Tier.Two))))
_pendingCommands = None
}

View File

@ -41,7 +41,8 @@ object Items extends ItemAPI {
val names = mutable.Map.empty[Any, String]
val aliases = Map(
"dataCard" -> Constants.ItemName.DataCardTier1
"dataCard" -> Constants.ItemName.DataCardTier1,
"wlanCard" -> Constants.ItemName.WirelessNetworkCardTier2
)
override def get(name: String): ItemInfo = descriptors.get(name).orNull
@ -210,7 +211,7 @@ object Items extends ItemAPI {
safeGetStack(Constants.ItemName.TankControllerUpgrade),
safeGetStack(Constants.ItemName.LeashUpgrade),
safeGetStack(Constants.ItemName.WirelessNetworkCard),
safeGetStack(Constants.ItemName.WirelessNetworkCardTier2),
safeGetStack(Constants.ItemName.CPUTier3),
safeGetStack(Constants.ItemName.RAMTier6),
@ -230,7 +231,7 @@ object Items extends ItemAPI {
safeGetStack(Constants.ItemName.PistonUpgrade),
safeGetStack(Constants.ItemName.RedstoneCardTier2),
safeGetStack(Constants.ItemName.WirelessNetworkCard),
safeGetStack(Constants.ItemName.WirelessNetworkCardTier2),
safeGetStack(Constants.ItemName.CPUTier3),
safeGetStack(Constants.ItemName.RAMTier6),
@ -261,7 +262,7 @@ object Items extends ItemAPI {
safeGetStack(Constants.ItemName.GraphicsCardTier3),
safeGetStack(Constants.ItemName.RedstoneCardTier2),
safeGetStack(Constants.ItemName.WirelessNetworkCard),
safeGetStack(Constants.ItemName.WirelessNetworkCardTier2),
safeGetStack(Constants.ItemName.InternetCard),
safeGetStack(Constants.ItemName.CPUTier3),
@ -298,7 +299,7 @@ object Items extends ItemAPI {
Option(safeGetStack(Constants.ItemName.GraphicsCardTier2)),
Option(safeGetStack(Constants.ItemName.RedstoneCardTier2)),
Option(safeGetStack(Constants.ItemName.WirelessNetworkCard)),
Option(safeGetStack(Constants.ItemName.WirelessNetworkCardTier2)),
Option(safeGetStack(Constants.ItemName.CPUTier3)),
Option(safeGetStack(Constants.ItemName.RAMTier6)),
@ -494,6 +495,10 @@ object Items extends ItemAPI {
// 1.6
Recipes.addSubItem(new item.UpgradeTrading(upgrades), Constants.ItemName.TradingUpgrade, "oc:tradingUpgrade")
Recipes.addSubItem(new item.UpgradeMF(upgrades), Constants.ItemName.MFU, "oc:mfu")
// 1.7.2
Recipes.addSubItem(new item.WirelessNetworkCard(multi, Tier.One), Constants.ItemName.WirelessNetworkCardTier1, "oc:wlanCard1")
registerItem(new item.ComponentBus(multi, Tier.Four), Constants.ItemName.ComponentBusCreative)
}
// Storage media of all kinds.

View File

@ -1,10 +1,20 @@
package li.cil.oc.common.item
import li.cil.oc.Settings
import li.cil.oc.common.Tier
import li.cil.oc.util.Rarity
import net.minecraft.item.EnumRarity
import net.minecraft.item.ItemStack
class ComponentBus(val parent: Delegator, val tier: Int) extends traits.Delegate with traits.ItemTier {
override val unlocalizedName = super.unlocalizedName + tier
// Because the driver considers the creative bus to be tier 3, the superclass
// will believe it has T3 rarity. We override that here.
override def rarity(stack: ItemStack): EnumRarity =
if (tier == Tier.Four) Rarity.byTier(Tier.Four)
else super.rarity(stack)
override protected def tooltipName = Option(super.unlocalizedName)
override protected def tooltipData = Seq(Settings.get.cpuComponentSupport(tier))

View File

@ -76,6 +76,7 @@ object Present {
add(Constants.ItemName.Alu, 45)
add(Constants.ItemName.BatteryUpgradeTier1, 43)
add(Constants.ItemName.NetworkCard, 38)
add(Constants.ItemName.WirelessNetworkCardTier1, 37)
add(Constants.ItemName.HDDTier1, 36)
add(Constants.ItemName.GeneratorUpgrade, 35)
add(Constants.ItemName.CPUTier1, 31)
@ -90,7 +91,7 @@ object Present {
add(Constants.ItemName.ChipTier2, 15)
add(Constants.ItemName.ComponentBusTier1, 13)
add(Constants.ItemName.BatteryUpgradeTier2, 12)
add(Constants.ItemName.WirelessNetworkCard, 11)
add(Constants.ItemName.WirelessNetworkCardTier2, 11)
add(Constants.ItemName.RAMTier3, 10)
add(Constants.ItemName.ServerTier1, 10)
add(Constants.ItemName.InternetCard, 9)

View File

@ -1,3 +1,9 @@
package li.cil.oc.common.item
class WirelessNetworkCard(val parent: Delegator) extends traits.Delegate with traits.ItemTier
import li.cil.oc.common.Tier
class WirelessNetworkCard(val parent: Delegator, var tier: Int) extends traits.Delegate with traits.ItemTier {
override val unlocalizedName = super.unlocalizedName + tier
override protected def tooltipName = Option(super.unlocalizedName)
}

View File

@ -14,6 +14,7 @@ import li.cil.oc.api.nanomachines.DisableReason
import li.cil.oc.api.network.Packet
import li.cil.oc.api.network.WirelessEndpoint
import li.cil.oc.common.item.data.NanomachineData
import li.cil.oc.common.Tier
import li.cil.oc.integration.util.DamageSourceWithRandomCause
import li.cil.oc.server.PacketSender
import li.cil.oc.util.BlockPosition
@ -151,7 +152,7 @@ class ControllerImpl(val player: EntityPlayer) extends Controller with WirelessE
def respond(endpoint: WirelessEndpoint, data: Any*): Unit = {
queuedCommand = Option(() => {
if (responsePort > 0) {
val cost = Settings.get.wirelessCostPerRange * CommandRange
val cost = Settings.get.wirelessCostPerRange(Tier.Two) * CommandRange
val epsilon = 0.1
if (changeBuffer(-cost) > -epsilon) {
val packet = api.Network.newPacket(uuid, null, responsePort, (Iterable("nanomachines") ++ data.map(_.asInstanceOf[AnyRef])).toArray)

View File

@ -1,5 +1,6 @@
package li.cil.oc.common.tileentity
import li.cil.oc.Constants
import li.cil.oc.Localization
import li.cil.oc.Settings
import li.cil.oc.api
@ -7,6 +8,7 @@ import li.cil.oc.api.machine.Arguments
import li.cil.oc.api.machine.Callback
import li.cil.oc.api.machine.Context
import li.cil.oc.api.network._
import li.cil.oc.common.Tier
import li.cil.oc.util.ExtendedNBT._
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.nbt.NBTTagCompound
@ -15,9 +17,9 @@ import net.minecraftforge.common.util.Constants.NBT
import net.minecraftforge.fml.relauncher.Side
import net.minecraftforge.fml.relauncher.SideOnly
// TODO Remove in 1.7
// Removed in MC 1.11
class AccessPoint extends Switch with WirelessEndpoint with traits.PowerAcceptor {
var strength = Settings.get.maxWirelessRange
var strength = Settings.get.maxWirelessRange(Tier.Two)
var isRepeater = true
@ -53,7 +55,7 @@ class AccessPoint extends Switch with WirelessEndpoint with traits.PowerAcceptor
@Callback(doc = """function(strength:number):number -- Set the signal strength (range) used when relaying messages.""")
def setStrength(context: Context, args: Arguments): Array[AnyRef] = synchronized {
strength = math.max(args.checkDouble(0), math.min(0, Settings.get.maxWirelessRange))
strength = math.max(args.checkDouble(0), math.min(0, Settings.get.maxWirelessRange(Tier.Two)))
result(strength)
}
@ -75,7 +77,7 @@ class AccessPoint extends Switch with WirelessEndpoint with traits.PowerAcceptor
override protected def relayPacket(sourceSide: Option[EnumFacing], packet: Packet) {
super.relayPacket(sourceSide, packet)
if (strength > 0 && (sourceSide.isDefined || isRepeater)) {
val cost = Settings.get.wirelessCostPerRange
val cost = Settings.get.wirelessCostPerRange(Tier.Two)
val tryChangeBuffer = sourceSide match {
case Some(side) =>
(amount: Double) => plugs(side.ordinal).node.asInstanceOf[Connector].tryChangeBuffer(amount)
@ -121,7 +123,7 @@ class AccessPoint extends Switch with WirelessEndpoint with traits.PowerAcceptor
override def readFromNBTForServer(nbt: NBTTagCompound) = {
super.readFromNBTForServer(nbt)
if (nbt.hasKey(Settings.namespace + "strength")) {
strength = nbt.getDouble(Settings.namespace + "strength") max 0 min Settings.get.maxWirelessRange
strength = nbt.getDouble(Settings.namespace + "strength") max 0 min Settings.get.maxWirelessRange(Tier.Two)
}
if (nbt.hasKey(Settings.namespace + "isRepeater")) {
isRepeater = nbt.getBoolean(Settings.namespace + "isRepeater")

View File

@ -18,6 +18,7 @@ import li.cil.oc.api.network.Visibility
import li.cil.oc.api.network.WirelessEndpoint
import li.cil.oc.common.InventorySlots
import li.cil.oc.common.Slot
import li.cil.oc.common.Tier
import li.cil.oc.common.item
import li.cil.oc.common.item.Delegator
import li.cil.oc.integration.Mods
@ -33,15 +34,24 @@ import net.minecraftforge.fml.relauncher.Side
import net.minecraftforge.fml.relauncher.SideOnly
class Relay extends traits.SwitchLike with traits.ComponentInventory with traits.PowerAcceptor with Analyzable with WirelessEndpoint with QuantumNetwork.QuantumNode {
lazy final val WirelessNetworkCard = api.Items.get(Constants.ItemName.WirelessNetworkCard)
lazy final val WirelessNetworkCardTier1 = api.Items.get(Constants.ItemName.WirelessNetworkCardTier1)
lazy final val WirelessNetworkCardTier2 = api.Items.get(Constants.ItemName.WirelessNetworkCardTier2)
lazy final val LinkedCard = api.Items.get(Constants.ItemName.LinkedCard)
var strength = Settings.get.maxWirelessRange
var wirelessTier = -1
override def isWirelessEnabled = wirelessTier >= Tier.One
def maxWirelessRange = if (wirelessTier == Tier.One || wirelessTier == Tier.Two)
Settings.get.maxWirelessRange(wirelessTier) else 0
def wirelessCostPerRange = if (wirelessTier == Tier.One || wirelessTier == Tier.Two)
Settings.get.wirelessCostPerRange(wirelessTier) else 0
var strength = maxWirelessRange
var isRepeater = true
var isWirelessEnabled = false
var isLinkedEnabled = false
var tunnel = "creative"
@ -79,7 +89,7 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits
@Callback(doc = """function(strength:number):number -- Set the signal strength (range) used when relaying messages.""")
def setStrength(context: Context, args: Arguments): Array[AnyRef] = synchronized {
strength = math.max(args.checkDouble(0), math.min(0, Settings.get.maxWirelessRange))
strength = math.max(args.checkDouble(0), math.min(0, maxWirelessRange))
result(strength)
}
@ -140,14 +150,14 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits
}
if (isWirelessEnabled && strength > 0 && (sourceSide.isDefined || isRepeater)) {
val cost = Settings.get.wirelessCostPerRange
val cost = wirelessCostPerRange
if (tryChangeBuffer(-strength * cost)) {
api.Network.sendWirelessPacket(this, strength, packet)
}
}
if (isLinkedEnabled && sourceSide.isDefined) {
val cost = packet.size / 32.0 + Settings.get.wirelessCostPerRange * Settings.get.maxWirelessRange * 5
val cost = packet.size / 32.0 + wirelessCostPerRange * maxWirelessRange * 5
if (tryChangeBuffer(-cost)) {
val endpoints = QuantumNetwork.getEndpoints(tunnel).filter(_ != this)
for (endpoint <- endpoints) {
@ -207,9 +217,8 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits
maxQueueSize = math.max(1, queueBaseSize + (driver.tier(stack) + 1) * queueSizePerUpgrade)
case Some(driver) if driver.slot(stack) == Slot.Card =>
val descriptor = api.Items.get(stack)
if (descriptor == WirelessNetworkCard) {
isWirelessEnabled = true
}
if (descriptor == WirelessNetworkCardTier1 || descriptor == WirelessNetworkCardTier2)
wirelessTier = if (descriptor == WirelessNetworkCardTier1) Tier.One else Tier.Two
if (descriptor == LinkedCard) {
val data = DriverLinkedCard.dataTag(stack)
if (data.hasKey(Settings.namespace + "tunnel")) {
@ -229,7 +238,7 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits
case driver if driver.slot(stack) == Slot.Memory => relayAmount = relayBaseAmount
case driver if driver.slot(stack) == Slot.HDD => maxQueueSize = queueBaseSize
case driver if driver.slot(stack) == Slot.Card =>
isWirelessEnabled = false
wirelessTier = -1
isLinkedEnabled = false
QuantumNetwork.remove(this)
}
@ -241,7 +250,8 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits
Option(Driver.driverFor(stack, getClass)).fold(false)(driver => {
val provided = InventorySlots.relay(slot)
val tierSatisfied = driver.slot(stack) == provided.slot && driver.tier(stack) <= provided.tier
val cardTypeSatisfied = if (provided.slot == Slot.Card) api.Items.get(stack) == WirelessNetworkCard || api.Items.get(stack) == LinkedCard else true
val cardTypeSatisfied = if (provided.slot == Slot.Card) api.Items.get(stack) == WirelessNetworkCardTier1 ||
api.Items.get(stack) == WirelessNetworkCardTier2 || api.Items.get(stack) == LinkedCard else true
tierSatisfied && cardTypeSatisfied
})
@ -258,7 +268,7 @@ class Relay extends traits.SwitchLike with traits.ComponentInventory with traits
}
if (nbt.hasKey(StrengthTag)) {
strength = nbt.getDouble(StrengthTag) max 0 min Settings.get.maxWirelessRange
strength = nbt.getDouble(StrengthTag) max 0 min maxWirelessRange
}
if (nbt.hasKey(IsRepeaterTag)) {
isRepeater = nbt.getBoolean(IsRepeaterTag)

View File

@ -15,15 +15,17 @@ object DriverComponentBus extends Item with Processor {
override def worksWith(stack: ItemStack) = isOneOf(stack,
api.Items.get(Constants.ItemName.ComponentBusTier1),
api.Items.get(Constants.ItemName.ComponentBusTier2),
api.Items.get(Constants.ItemName.ComponentBusTier3))
api.Items.get(Constants.ItemName.ComponentBusTier3),
api.Items.get(Constants.ItemName.ComponentBusCreative))
override def createEnvironment(stack: ItemStack, host: EnvironmentHost) = null
override def slot(stack: ItemStack) = Slot.ComponentBus
// Clamp item tier because the creative bus needs to fit into tier 3 slots.
override def tier(stack: ItemStack) =
Delegator.subItem(stack) match {
case Some(bus: item.ComponentBus) => bus.tier
case Some(bus: item.ComponentBus) => bus.tier min Tier.Three
case _ => Tier.One
}

View File

@ -4,27 +4,41 @@ import li.cil.oc.Constants
import li.cil.oc.api
import li.cil.oc.api.driver.EnvironmentProvider
import li.cil.oc.api.network.EnvironmentHost
import li.cil.oc.common
import li.cil.oc.common.Slot
import li.cil.oc.common.Tier
import li.cil.oc.common.item.Delegator
import li.cil.oc.server.component
import net.minecraft.item.ItemStack
object DriverWirelessNetworkCard extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack,
api.Items.get(Constants.ItemName.WirelessNetworkCard))
api.Items.get(Constants.ItemName.WirelessNetworkCardTier1),
api.Items.get(Constants.ItemName.WirelessNetworkCardTier2))
override def createEnvironment(stack: ItemStack, host: EnvironmentHost) =
if (host.world != null && host.world.isRemote) null
else new component.WirelessNetworkCard(host)
else tier(stack) match {
case Tier.One => new component.WirelessNetworkCard.Tier1(host)
case Tier.Two => new component.WirelessNetworkCard.Tier2(host)
case _ => null
}
override def slot(stack: ItemStack) = Slot.Card
override def tier(stack: ItemStack) = Tier.Two
override def tier(stack: ItemStack) =
Delegator.subItem(stack) match {
case Some(card: common.item.WirelessNetworkCard) => card.tier
case _ => Tier.One
}
object Provider extends EnvironmentProvider {
override def getEnvironment(stack: ItemStack) =
if (worksWith(stack))
classOf[component.WirelessNetworkCard]
override def getEnvironment(stack: ItemStack): Class[_] =
if (worksWith(stack)) tier(stack) match {
case Tier.One => classOf[component.WirelessNetworkCard.Tier1]
case Tier.Two => classOf[component.WirelessNetworkCard.Tier2]
case _ => null
}
else null
}

View File

@ -13,6 +13,7 @@ import li.cil.oc.api.machine.Context
import li.cil.oc.api.network._
import li.cil.oc.api.driver.DeviceInfo
import li.cil.oc.api.prefab
import li.cil.oc.common.Tier
import li.cil.oc.server.network.QuantumNetwork
import net.minecraft.nbt.NBTTagCompound
@ -47,7 +48,7 @@ class LinkedCard extends prefab.ManagedEnvironment with QuantumNetwork.QuantumNo
val endpoints = QuantumNetwork.getEndpoints(tunnel).filter(_ != this)
// Cast to iterable to use Scala's toArray instead of the Arguments' one (which converts byte arrays to Strings).
val packet = Network.newPacket(node.address, null, 0, args.asInstanceOf[java.lang.Iterable[AnyRef]].toArray)
if (node.tryChangeBuffer(-(packet.size / 32.0 + Settings.get.wirelessCostPerRange * Settings.get.maxWirelessRange * 5))) {
if (node.tryChangeBuffer(-(packet.size / 32.0 + Settings.get.wirelessCostPerRange(Tier.Two) * Settings.get.maxWirelessRange(Tier.Two) * 5))) {
for (endpoint <- endpoints) {
endpoint.receivePacket(packet)
}

View File

@ -4,6 +4,7 @@ import java.util
import com.google.common.base.Charsets
import li.cil.oc.Constants
import li.cil.oc.common.Tier
import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute
import li.cil.oc.api.driver.DeviceInfo.DeviceClass
import li.cil.oc.Settings
@ -37,6 +38,9 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w
protected val openPorts = mutable.Set.empty[Int]
// wired network card is the 1st in the max ports list (before both wireless cards)
protected def maxOpenPorts = Settings.get.maxOpenPorts(Tier.One)
protected var wakeMessage: Option[String] = None
protected var wakeMessageFuzzy = false
@ -48,7 +52,9 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w
DeviceAttribute.Description -> "Ethernet controller",
DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor,
DeviceAttribute.Product -> "42i520 (MPN-01)",
DeviceAttribute.Version -> "1.0",
DeviceAttribute.Capacity -> Settings.get.maxNetworkPacketSize.toString,
DeviceAttribute.Size -> maxOpenPorts.toString,
DeviceAttribute.Width -> Settings.get.maxNetworkPacketParts.toString
)
@ -60,7 +66,7 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w
def open(context: Context, args: Arguments): Array[AnyRef] = {
val port = checkPort(args.checkInteger(0))
if (openPorts.contains(port)) result(false)
else if (openPorts.size >= Settings.get.maxOpenPorts) {
else if (openPorts.size >= maxOpenPorts) {
throw new java.io.IOException("too many open ports")
}
else result(openPorts.add(port))
@ -85,9 +91,12 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w
result(openPorts.contains(port))
}
@Callback(direct = true, doc = """function():boolean -- Whether this is a wireless network card.""")
@Callback(direct = true, doc = """function():boolean -- Whether this card has wireless networking capability.""")
def isWireless(context: Context, args: Arguments): Array[AnyRef] = result(false)
@Callback(direct = true, doc = """function():boolean -- Whether this card has wired networking capability.""")
def isWired(context: Context, args: Arguments): Array[AnyRef] = result(true)
@Callback(doc = """function(address:string, port:number, data...) -- Sends the specified data to the specified target.""")
def send(context: Context, args: Arguments): Array[AnyRef] = {
val address = args.checkString(0)
@ -107,7 +116,7 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment w
result(true)
}
// TODO 1.7 Remove, covered by device info now
//Removed in MC 1.11
@Callback(direct = true, doc = """function():number -- Gets the maximum packet size (config setting).""")
def maxPacketSize(context: Context, args: Arguments): Array[AnyRef] = result(Settings.get.maxNetworkPacketSize)

View File

@ -18,6 +18,7 @@ import li.cil.oc.api.network.EnvironmentHost
import li.cil.oc.api.network._
import li.cil.oc.api.prefab
import li.cil.oc.common.item.data.NavigationUpgradeData
import li.cil.oc.common.Tier
import li.cil.oc.server.network.Waypoints
import li.cil.oc.util.BlockPosition
import net.minecraft.entity.player.EntityPlayer
@ -68,9 +69,9 @@ class UpgradeNavigation(val host: EnvironmentHost with Rotatable) extends prefab
@Callback(doc = """function(range:number):table -- Find waypoints in the specified range.""")
def findWaypoints(context: Context, args: Arguments): Array[AnyRef] = {
val range = args.checkDouble(0) max 0 min Settings.get.maxWirelessRange
val range = args.checkDouble(0) max 0 min Settings.get.maxWirelessRange(Tier.Two)
if (range <= 0) return result(Array.empty)
if (!node.tryChangeBuffer(-range * Settings.get.wirelessCostPerRange * 0.25)) return result(Unit, "not enough energy")
if (!node.tryChangeBuffer(-range * Settings.get.wirelessCostPerRange(Tier.Two) * 0.25)) return result(Unit, "not enough energy")
context.pause(0.5)
val position = BlockPosition(host)
val positionVec = position.toVec3

View File

@ -7,6 +7,7 @@ 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.Settings
import li.cil.oc.common.Tier
import li.cil.oc.api
import li.cil.oc.api.Network
import li.cil.oc.api.network.EnvironmentHost
@ -21,12 +22,13 @@ import net.minecraft.nbt.NBTTagCompound
import scala.collection.convert.WrapAsJava._
import scala.language.implicitConversions
class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with WirelessEndpoint {
abstract class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with WirelessEndpoint {
override val node = Network.newNode(this, Visibility.Network).
withComponent("modem", Visibility.Neighbors).
withConnector().
create()
<<<<<<< HEAD
var strength = Settings.get.maxWirelessRange
// ----------------------------------------------------------------------- //
@ -45,6 +47,36 @@ class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with
// ----------------------------------------------------------------------- //
def position = BlockPosition(host)
||||||| merged common ancestors
var strength = Settings.get.maxWirelessRange
// ----------------------------------------------------------------------- //
private final lazy val deviceInfo = Map(
DeviceAttribute.Class -> DeviceClass.Network,
DeviceAttribute.Description -> "Wireless ethernet controller",
DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor,
DeviceAttribute.Product -> "62i230 (MPW-01)",
DeviceAttribute.Capacity -> Settings.get.maxNetworkPacketSize.toString,
DeviceAttribute.Width -> Settings.get.maxWirelessRange.toString
)
override def getDeviceInfo: util.Map[String, String] = deviceInfo
// ----------------------------------------------------------------------- //
override def x = BlockPosition(host).x
=======
protected def wirelessCostPerRange: Double
protected def maxWirelessRange: Double
protected def shouldSendWiredTraffic: Boolean
var strength = maxWirelessRange
override def x = BlockPosition(host).x
>>>>>>> master-MC1.7.10
override def x = position.x
@ -67,17 +99,20 @@ class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with
@Callback(doc = """function(strength:number):number -- Set the signal strength (range) used when sending messages.""")
def setStrength(context: Context, args: Arguments): Array[AnyRef] = {
strength = math.max(0, math.min(args.checkDouble(0), Settings.get.maxWirelessRange))
strength = math.max(0, math.min(args.checkDouble(0), maxWirelessRange))
result(strength)
}
override def isWireless(context: Context, args: Arguments): Array[AnyRef] = result(true)
override def isWired(context: Context, args: Arguments): Array[AnyRef] = result(shouldSendWiredTraffic)
override protected def doSend(packet: Packet) {
if (strength > 0) {
checkPower()
api.Network.sendWirelessPacket(this, strength, packet)
}
if (shouldSendWiredTraffic)
super.doSend(packet)
}
@ -86,11 +121,12 @@ class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with
checkPower()
api.Network.sendWirelessPacket(this, strength, packet)
}
if (shouldSendWiredTraffic)
super.doBroadcast(packet)
}
private def checkPower() {
val cost = Settings.get.wirelessCostPerRange
val cost = wirelessCostPerRange
if (cost > 0 && !Settings.get.ignorePower) {
if (!node.tryChangeBuffer(-strength * cost)) {
throw new IOException("not enough energy")
@ -130,7 +166,7 @@ class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with
override def load(nbt: NBTTagCompound) {
super.load(nbt)
if (nbt.hasKey(StrengthTag)) {
strength = nbt.getDouble(StrengthTag) max 0 min Settings.get.maxWirelessRange
strength = nbt.getDouble(StrengthTag) max 0 min maxWirelessRange
}
}
@ -139,3 +175,57 @@ class WirelessNetworkCard(host: EnvironmentHost) extends NetworkCard(host) with
nbt.setDouble(StrengthTag, strength)
}
}
object WirelessNetworkCard {
class Tier1(host: EnvironmentHost) extends WirelessNetworkCard(host) {
override protected def wirelessCostPerRange = Settings.get.wirelessCostPerRange(Tier.One)
override protected def maxWirelessRange = Settings.get.maxWirelessRange(Tier.One)
// wired network card is before wireless cards in max port list
override protected def maxOpenPorts = Settings.get.maxOpenPorts(Tier.One + 1)
override protected def shouldSendWiredTraffic = false
// ----------------------------------------------------------------------- //
private final lazy val deviceInfo = Map(
DeviceAttribute.Class -> DeviceClass.Network,
DeviceAttribute.Description -> "Wireless ethernet controller",
DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor,
DeviceAttribute.Product -> "39i110 (LPPW-01)",
DeviceAttribute.Version -> "1.0",
DeviceAttribute.Capacity -> Settings.get.maxNetworkPacketSize.toString,
DeviceAttribute.Size -> maxOpenPorts.toString,
DeviceAttribute.Width -> maxWirelessRange.toString
)
override def getDeviceInfo: util.Map[String, String] = deviceInfo
}
class Tier2(host: EnvironmentHost) extends Tier1(host) {
override protected def wirelessCostPerRange = Settings.get.wirelessCostPerRange(Tier.Two)
override protected def maxWirelessRange = Settings.get.maxWirelessRange(Tier.Two)
// wired network card is before wireless cards in max port list
override protected def maxOpenPorts = Settings.get.maxOpenPorts(Tier.Two + 1)
override protected def shouldSendWiredTraffic = true
// ----------------------------------------------------------------------- //
private final lazy val deviceInfo = Map(
DeviceAttribute.Class -> DeviceClass.Network,
DeviceAttribute.Description -> "Wireless ethernet controller",
DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor,
DeviceAttribute.Product -> "62i230 (MPW-01)",
DeviceAttribute.Version -> "2.0",
DeviceAttribute.Capacity -> Settings.get.maxNetworkPacketSize.toString,
DeviceAttribute.Size -> maxOpenPorts.toString,
DeviceAttribute.Width -> maxWirelessRange.toString
)
override def getDeviceInfo: util.Map[String, String] = deviceInfo
}
}

View File

@ -1,28 +1,182 @@
package li.cil.oc.util
import java.io.IOException
import java.io.{BufferedReader, InputStreamReader}
import java.nio.charset.StandardCharsets
import scala.collection.mutable.BitSet
import li.cil.oc.OpenComputers
object FontUtils {
// Note: we load the widths from a file (one byte per width) because the Scala
// compiler craps its pants when we try to have it as an array in the source
// file... seems having an array with 0x10000 entries leads to stack overflows,
// who would have known!
private val widths = {
val ba = Array.fill[Byte](0x10000)(-1)
// Note to self: NOT VIA THE FUCKING RESOURCE SYSTEM BECAUSE IT'S FUCKING CLIENT ONLY YOU IDIOT.
val is = FontUtils.getClass.getResourceAsStream("/assets/opencomputers/wcwidth.bin")
if (is != null) {
try {
is.read(ba)
is.close()
} catch {
case e: IOException => OpenComputers.log.warn("Failed loading character widths. Font rendering will probably be derpy as all hell.", e)
}
}
ba
}
private val defined_double_wide: BitSet = BitSet()
def wcwidth(ch: Int) = if (ch < 0 || ch >= widths.length) -1 else widths(ch)
// font.hex actually has some codepoints larger than 0x10000
// but, UnicodeAPI.scala is using java's Integer.ToChar which only supports the utf-16 range
// and thus will truncate any incoming codepoint, forcing it below 0x10000
// I believe the solution is to use StringBuffer.appendCodePoint
// but that change would deserve a bit of testing first, postponing for a later update
// review http://www.oracle.com/us/technologies/java/supplementary-142654.html
val codepoint_limit: Int = 0x10000
def wcwidth(charCode: Int): Int = if (defined_double_wide(charCode)) 2 else 1
{
val table = Array[Int](
16,16,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31,16,16,32,16,16,16,33,34,35,
36,37,38,39,16,16,40,16,16,16,16,16,16,16,16,16,16,16,41,42,16,16,43,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,44,16,45,46,47,48,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,49,16,16,50,51,16,52,16,16,
16,16,16,16,16,16,53,16,16,16,16,16,54,55,16,16,16,16,56,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,57,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,58,59,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,3,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,191,
182,0,0,0,0,0,0,0,31,0,255,7,0,0,0,0,0,248,255,255,0,0,1,0,0,0,0,0,0,0,0,0,0,
0,192,191,159,61,0,0,0,128,2,0,0,0,255,255,255,7,0,0,0,0,0,0,0,0,0,0,192,255,
1,0,0,0,0,0,0,248,15,0,0,0,192,251,239,62,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,240,255,255,127,7,0,0,0,0,0,0,20,254,33,254,0,12,0,0,0,2,0,0,0,0,0,
0,16,30,32,0,0,12,0,0,0,6,0,0,0,0,0,0,16,134,57,2,0,0,0,35,0,6,0,0,0,0,0,0,16,
190,33,0,0,12,0,0,0,2,0,0,0,0,0,0,144,30,32,64,0,12,0,0,0,4,0,0,0,0,0,0,0,1,
32,0,0,0,0,0,0,0,0,0,0,0,0,0,192,193,61,96,0,12,0,0,0,0,0,0,0,0,0,0,144,64,48,
0,0,12,0,0,0,0,0,0,0,0,0,0,0,30,32,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,4,92,0,0,0,
0,0,0,0,0,0,0,0,242,7,128,127,0,0,0,0,0,0,0,0,0,0,0,0,242,27,0,63,0,0,0,0,0,0,
0,0,0,3,0,0,160,2,0,0,0,0,0,0,254,127,223,224,255,254,255,255,255,31,64,0,0,0,
0,0,0,0,0,0,0,0,0,224,253,102,0,0,0,195,1,0,30,0,100,32,0,32,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
28,0,0,0,28,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,176,63,64,254,15,32,0,0,0,0,0,56,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,1,4,
14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,1,0,0,0,0,0,0,64,
127,229,31,248,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,208,23,4,0,0,
0,0,248,15,0,3,0,0,0,60,11,0,0,0,0,0,0,64,163,3,0,0,0,0,0,0,240,207,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,255,253,33,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,255,255,255,255,127,0,0,240,0,248,0,0,0,124,0,0,0,0,0,0,31,
252,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,
0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,247,63,0,0,0,128,0,0,0,0,0,
0,0,0,0,0,3,0,68,8,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,255,
255,3,0,0,0,0,0,192,63,0,0,128,255,3,0,0,0,0,0,7,0,0,0,0,0,200,19,0,0,0,0,0,0,
0,0,0,0,0,0,0,126,102,0,8,16,0,0,0,0,0,0,0,0,0,0,0,0,157,193,2,0,0,0,0,48,64,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,64,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,127,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,32,110,240,0,0,0,0,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,255,127,0,0,0,0,0,0,0,3,0,0,0,0,0,120,38,0,0,
0,0,0,0,0,0,7,0,0,0,128,239,31,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,192,127,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,191,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,128,3,248,255,231,15,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
)
val wtable = Array[Int](
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,19,16,16,16,16,16,16,16,16,16,16,20,21,22,23,24,17,
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,25,
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
17,17,17,17,17,17,17,17,26,16,16,16,16,27,16,16,17,17,17,17,17,17,17,17,17,17,
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
17,17,17,17,17,17,17,28,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,16,16,16,29,30,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,31,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,32,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,
0,248,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255,
255,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15,
255,255,255,255,255,255,255,127,254,255,255,255,255,255,255,255,255,255,127,
254,255,255,255,255,255,255,255,255,255,255,255,255,224,255,255,255,255,63,
254,255,255,255,255,255,255,255,255,255,255,127,255,255,255,255,255,7,255,255,
255,255,15,0,255,255,255,255,255,127,255,255,255,255,255,0,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,31,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,
255,127,248,255,255,255,255,255,15,0,0,255,3,0,0,255,255,255,255,247,255,127,
15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,255,
255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,255,255,255,255,255,7,255,1,3,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
)
def c_wcwidth(charCode: Int): Int = {
if (charCode < 0xFF) {
if (((charCode + 1) & 0x7F) >= 0x21) 1
else if (charCode > 0) -1
else 0
}
else if ((charCode & 0xfffeffff) < 0xfffe) {
if (((table(table(charCode >> 8) * 32 + ((charCode & 0xFF) >> 3)) >> (charCode & 7)) & 1) == 1) 0
else if (((wtable(wtable(charCode >> 8) * 32 + ((charCode & 0xFF) >> 3)) >> (charCode & 7)) & 1) == 1) 2
else 1
}
else if ((charCode & 0xfffe) == 0xfffe) -1
else if ((charCode - 0x20000) < 0x20000) 2
else if ((charCode == 0xe0001) || ((charCode - 0xe0020) < 0x5f) || ((charCode - 0xe0100) < 0xef)) 0
else 1
}
OpenComputers.log.info("Initializing unicode wcwidth.")
for (i <- 0 until codepoint_limit) {
if (c_wcwidth(i) == 2)
defined_double_wide += i
}
try {
OpenComputers.log.info("Initializing font glyph widths.")
val font = FontUtils.getClass.getResourceAsStream("/assets/opencomputers/font.hex")
try {
var line: String = null
val input = new BufferedReader(new InputStreamReader(font, StandardCharsets.UTF_8))
while ({line = input.readLine; line != null}) {
val info = line.split(":")
val charCode = Integer.parseInt(info(0), 16)
if (charCode >= 0 && charCode < codepoint_limit) {
info(1).trim.length match {
case 64 => defined_double_wide += charCode
case 32 => defined_double_wide -= charCode
case n => OpenComputers.log.warn(s"Invalid glyph size detected in font.hex. Expected 64 or 32, got: $n")
}
} else {
OpenComputers.log.warn(f"Invalid glyph char code detected in font.hex. Expected 0<= charCode <$codepoint_limit%X, got: $charCode%X")
}
}
} finally {
try {
font.close()
} catch {
case ex: Throwable => OpenComputers.log.error(s"Error closing font.hex: $ex")
}
}
} catch {
case ex: Throwable => OpenComputers.log.error(s"Error parsing glyphs to determine widths: $ex")
}
OpenComputers.log.info("glyph width ready.")
}
}