mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-12 16:57:32 -04:00
Merge branch 'master-MC1.7.10' of github.com:MightyPirates/OpenComputers into master-MC1.8
This commit is contained in:
commit
a66bd22cd9
@ -12,7 +12,7 @@ import li.cil.oc.api.detail.*;
|
||||
*/
|
||||
public class API {
|
||||
public static final String ID_OWNER = "OpenComputers|Core";
|
||||
public static final String VERSION = "5.5.3";
|
||||
public static final String VERSION = "5.5.4";
|
||||
|
||||
public static DriverAPI driver = null;
|
||||
public static FileSystemAPI fileSystem = null;
|
||||
|
@ -0,0 +1,27 @@
|
||||
package li.cil.oc.api.driver.item;
|
||||
|
||||
import li.cil.oc.api.machine.Architecture;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* May be implemented in processor drivers of processors that can be reconfigured.
|
||||
* <p/>
|
||||
* This is the case for OC's built-in CPUs, for example, which can be reconfigured
|
||||
* to any registered architecture. It a CPU has such a driver, it may also be
|
||||
* reconfigured by the machine it is running in (e.g. in the Lua case via
|
||||
* <tt>computer.setArchitecture</tt>).
|
||||
*/
|
||||
public interface MutableProcessor extends Processor {
|
||||
/**
|
||||
* Get a list of all architectures supported by this processor.
|
||||
*/
|
||||
java.util.Collection<Class<? extends Architecture>> allArchitectures();
|
||||
|
||||
/**
|
||||
* Set the architecture to use for the specified processor.
|
||||
*
|
||||
* @param stack the processor to set the architecture for.
|
||||
* @param architecture the architecture to use on the processor.
|
||||
*/
|
||||
void setArchitecture(ItemStack stack, Class<? extends Architecture> architecture);
|
||||
}
|
@ -2,6 +2,8 @@
|
||||
|
||||

|
||||
|
||||
*Этот блок устарел и будет удален в следующих версиях.* Замените его на [ретранслятор](relay.md).
|
||||
|
||||
Точки доступа, это беспроводные версии [коммутаторов](switch.md). Они могут быть использованы, когда требуется разделить подсети, чтобы устройства не видели [компоненты](../general/computer.md) в других сетях, однако сохраняя при этом возможность передачи сообщений между подсетями.
|
||||
|
||||
В дополнение к этому, точки доступа могут использоваться как повторители: они могут перенаправлять сообщения из проводной линии другим устройствам; или беспроводные сообщения как проводные, так и беспроводные.
|
||||
|
@ -39,6 +39,7 @@
|
||||
* [Точка доступа](accessPoint.md)
|
||||
* [Кабель](cable.md)
|
||||
* [Сетевой переключатель](netSplitter.md)
|
||||
* [Ретранслятор](relay.md)
|
||||
* [Коммутатор](switch.md)
|
||||
|
||||
## Управление питанием
|
||||
|
@ -2,6 +2,6 @@
|
||||
|
||||

|
||||
|
||||
Сетевой переключатель позволяет контролировать соединение между подсетями. В отличие от [коммутатора](switch.md) или [конвертера энергии](powerConverter.md) позволяет непосредственно соединить подсети, делая при этом доступными все компоненты. Соединение каждой стороны переключается [ключем](../item/wrench.md). При подаче редстоун-сигнала все соединения инвертируются.
|
||||
Сетевой переключатель позволяет контролировать соединение между подсетями. В отличие от [ретранслятора](relay.md) или [конвертера энергии](powerConverter.md) позволяет непосредственно соединить подсети, делая при этом доступными все компоненты. Соединение каждой стороны переключается [ключем](../item/wrench.md). При подаче редстоун-сигнала все соединения инвертируются.
|
||||
|
||||
Таким образом, этот блок может быть использован для переключения соединения определенных компонентов сети. Используйте [редстоун-I/O](redstone.md) или [редстоун карты](../item/redstoneCard1.md) для автоматизации сетевого переключателя.
|
@ -0,0 +1,13 @@
|
||||
# Ретранслятор
|
||||
|
||||

|
||||
|
||||
Ретранслятор используется для передачи сообщений между несколькими подсетями, изолируя компоненты [компьютеров](../general/computer.md) в других сетях. Сохранение компонентов, как правило, хорошая идея, что не позволяет [компьютерам](../general/computer.md) использовать неверный [монитор](screen1.md) или не позволяет перенагружать их (в результате чего [компьютеры](../general/computer.md) выключатся и отказываются загружаться).
|
||||
|
||||
Может быть улучшен добавлением [беспроводной сетевой карты](../item/wlanCard.md), что позволит ретранслировать беспроводные сообщения. Сообщения, переданные по беспроводной линии могут быть получены или перенаправлены другими ретрансляторами или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard.md).
|
||||
|
||||
Также ретранслятор может быть улучшен с помощью [соединенной карты](../item/linkedCard.md). Это позволит передавать сообщения внутри туннеля, предоставленного картой, также; с обычными затратами энергии, поэтому убедитесь, что на ретранслятор поступает нужное количество энергии.
|
||||
|
||||
Ретрансляторы *не* отслеживают, какие пакеты и куда они передали, поэтому для в сети могут образовываться петли или вы можете получать одно сообщение несколько раз. Из-за ограниченного буфера сообщений коммутатора, частое отправление сообщений приводит к их потере. Вы можете улучшить ретранслятор для увеличения скорости обработки сообщений, а также увеличения размера сообщений.
|
||||
|
||||
Сообщения, могут перенаправлены всего несколько раз, поэтому цепочки с произвольным количеством ретрансляторов невозможны. По умолчанию, сообщение может быть перенаправлено пять раз.
|
@ -6,4 +6,4 @@
|
||||
|
||||
Каждый [сервер](../item/server1.md) в серверной стойке может взаимодействовать только с одной "стороной" стойки или ни с какой. К какой стороне, какой [сервер](../item/server1.md) подключен, настраивается в интерфейсе стойки. Будьте внимательны, стороны считаются относительно самой стойки, например, если вы смотрите на стойку спереди, то `правая сторона` стойки для вас будет слева.
|
||||
|
||||
Серверные стойки взаимодействуют с [коммутаторами](switch.md) и [распределителями энергии](powerDistributor.md). Переключатель режимов работы стойки, может быть настроен в интерфейсе самой стойки, он имеет 2 режима: внешний и внутренний. Во внешнем режиме сервер будет работать как обычный [коммутатор](switch.md). Во внутреннем режиме, сообщения будут передаваться только к [серверам](../item/server1.md) в стойке и не будут автоматически связаны со сторонами стойки. [Серверы](../item/server1.md) все также будут иметь возможность передачи сообщений друг другу. Это позволяет использовать серверные стойки как продвинутые [коммутаторы](switch.md) для операций фильтрации и направления данных, например.
|
||||
Серверные стойки взаимодействуют с [ретрансляторами](relay.md) и [распределителями энергии](powerDistributor.md). Переключатель режимов работы стойки, может быть настроен в интерфейсе самой стойки, он имеет 2 режима: внешний и внутренний. Во внешнем режиме сервер будет работать как обычный [ретранслятор](relay.md). Во внутреннем режиме, сообщения будут передаваться только к [серверам](../item/server1.md) в стойке и не будут автоматически связаны со сторонами стойки. [Серверы](../item/server1.md) все также будут иметь возможность передачи сообщений друг другу. Это позволяет использовать серверные стойки как продвинутые [ретрансляторы](relay.md) для операций фильтрации и направления данных, например.
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||

|
||||
|
||||
*Этот блок устарел и будет удален в следующих версиях.* Замените его на [ретранслятор](relay.md).
|
||||
|
||||
Коммутатор используется для передачи сообщений между несколькими подсетями, не используя компоненты [компьютеров](../general/computer.md) в других сетях. Сохранение компонентов, как правило, хорошая идея, что не позволяет [компьютерам](../general/computer.md) использовать неверный [монитор](screen1.md) или не позволяет перенагружать их (в результате чего [компьютеры](../general/computer.md) выключатся и отказываются загружаться).
|
||||
|
||||
Также есть беспроводная версия коммутатора, называемая [точка доступа](accessPoint.md), с ее помощью сообщения передаются по беспроводной линии. Сообщения, переданные по беспроводной линии могут быть получены или перенаправлены другими [точками доступа](accessPoint.md) или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard.md).
|
||||
|
@ -2,4 +2,4 @@
|
||||
|
||||

|
||||
|
||||
Сетевая карта позволяет [компьютерам](../general/computer.md) отправлять и получать сетевые сообщения. Сообщения (или пакеты) будут отправлены всем принимающим устройствам в подсети или конкретной сетевой карте (после указания ее адреса). [Коммутаторы](../block/switch.md) и [точки доступа](../block/accessPoint.md) могут быть использованы для связи нескольких подсетей друг с другом, для передачи сообщений в них. Также возможно отправить письмо получателю, даже если он находится в другой подсети, если сеть подключена к одному или нескольким [коммутаторам](../block/switch.md).
|
||||
Сетевая карта позволяет [компьютерам](../general/computer.md) отправлять и получать сетевые сообщения. Сообщения (или пакеты) будут отправлены всем принимающим устройствам в подсети или конкретной сетевой карте (при указании её адреса). [Ретрансляторы](../block/relay.md) могут быть использованы для связи нескольких подсетей друг с другом и передачи сообщений. Также возможно отправить письмо получателю, даже если он находится в другой подсети, если сеть подключена к одному или нескольким [ретрасляторами](../block/relay.md).
|
||||
|
@ -3,7 +3,7 @@
|
||||
# Use [nl] to for a line break.
|
||||
|
||||
# Blocks
|
||||
tile.oc.accessPoint.name=Точка доступа
|
||||
tile.oc.accessPoint.name=§cТочка доступа§7
|
||||
tile.oc.adapter.name=Адаптер
|
||||
tile.oc.assembler.name=Сборщик роботов
|
||||
tile.oc.cable.name=Кабель
|
||||
@ -35,7 +35,7 @@ tile.oc.screen1.name=Монитор (1-ый уровень)
|
||||
tile.oc.screen2.name=Монитор (2-ой уровень)
|
||||
tile.oc.screen3.name=Монитор (3-ий уровень)
|
||||
tile.oc.serverRack.name=Серверная стойка
|
||||
tile.oc.switch.name=Коммутатор
|
||||
tile.oc.switch.name=§cКоммутатор§7
|
||||
tile.oc.netSplitter.name=Сетевой переключатель
|
||||
tile.oc.waypoint.name=Путевая точка
|
||||
|
||||
@ -232,6 +232,7 @@ oc:container.Disassembler=Разборщик
|
||||
oc:container.DiskDrive=Дисковод
|
||||
oc:container.Printer=Принтер
|
||||
oc:container.Raid=RAID
|
||||
oc:container.Relay=Ретранслятор
|
||||
oc:container.Server=Сервер
|
||||
oc:container.ServerRack=Серверная стойка
|
||||
oc:container.Switch=Коммутатор
|
||||
@ -325,6 +326,7 @@ oc:tooltip.RedstoneCard.RedNet=Мод §fRedNet§7 §aподдерживаетс
|
||||
oc:tooltip.RedstoneCard.WirelessCBE=Мод §fWireless Redstone (ChickenBones)§7 §aподдерживается§7.
|
||||
oc:tooltip.RedstoneCard.WirelessSV=Мод §fWireless Redstone (SlimeVoid)§7 §aподдерживается§7.
|
||||
oc:tooltip.RedstoneCard=Позволяет принимать и излучать сигналы красного камня вокруг компьютера или робота.
|
||||
oc:tooltip.Relay=Позволяет соединять различные сети между собой. Передаются только сообщения, компоненты между сетями недоступны. Используйте его для разделения сетей с возможностью пересылать сообщения между ними.
|
||||
oc:tooltip.Robot=В отличие от компьютеров, роботы могут передвигаться и взаимодействовать с миром, как игрок.[nl] §cНе могут взаимодействовать с внешними компонентами.§7
|
||||
# The underscore makes sure this isn't hidden with the rest of the tooltip.
|
||||
oc:tooltip.Robot_Level=§fУровень§7: §a%s§7.
|
||||
|
@ -12,7 +12,7 @@ Most programs can be interrupted by pressing Ctrl+Alt+C.
|
||||
Paste the contents of the clipboard using the middle mouse button or a configurable key (default: insert).
|
||||
Computers will consume less power while idling - i.e. when os.sleep(n > 0.05) is called.
|
||||
Screens will consume more power the more lit characters they display.
|
||||
Most blocks act as 'cables' - use switches and power distributers to create separate networks.
|
||||
Most blocks act as 'cables' - use relays and power distributors to create separate networks.
|
||||
Welcome to the dark side - here, have some cookies.
|
||||
Screens can display Unicode - paste the special chars or use unicode.char.
|
||||
Run `help` or `man programname` for ingame help on programs shipped with OpenOS - start with `man man`.
|
||||
@ -25,4 +25,4 @@ Have you tried turning it off and on again?
|
||||
To disable this greeting, install OpenOS to a writeable medium and delete `/etc/motd`.
|
||||
Did you know OpenComputers has a forum? No? Well, it's at http://oc.cil.li/.
|
||||
Please report bugs on the Github issue tracker, thank you!
|
||||
Beware of cycles when building networks, or you may get duplicate messages!
|
||||
Beware of cycles when building networks, or you may get duplicate messages!
|
||||
|
@ -1320,6 +1320,23 @@ local libcomputer = {
|
||||
|
||||
beep = function(...)
|
||||
libcomponent.invoke(computer.address(), "beep", ...)
|
||||
end,
|
||||
|
||||
getArchitectures = function(...)
|
||||
return spcall(computer.getArchitectures, ...)
|
||||
end,
|
||||
getArchitecture = function(...)
|
||||
return spcall(computer.getArchitecture, ...)
|
||||
end,
|
||||
setArchitecture = function(...)
|
||||
local result, reason = spcall(computer.setArchitecture, ...)
|
||||
if not result then
|
||||
if reason then
|
||||
return result, reason
|
||||
end
|
||||
else
|
||||
coroutine.yield(true) -- reboot
|
||||
end
|
||||
end
|
||||
}
|
||||
sandbox.computer = libcomputer
|
||||
|
@ -19,7 +19,7 @@ object OpenComputers {
|
||||
|
||||
final val Name = "OpenComputers"
|
||||
|
||||
final val Version = "1.5.16"
|
||||
final val Version = "@VERSION@"
|
||||
|
||||
var log = LogManager.getLogger(Name)
|
||||
|
||||
|
@ -3,12 +3,10 @@ package li.cil.oc.common.item.traits
|
||||
import java.util
|
||||
|
||||
import li.cil.oc.Settings
|
||||
import li.cil.oc.api
|
||||
import li.cil.oc.api.machine.Architecture
|
||||
import li.cil.oc.integration.opencomputers.DriverCPU
|
||||
import li.cil.oc.util.Tooltip
|
||||
import net.minecraft.entity.player.EntityPlayer
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.nbt.NBTTagCompound
|
||||
import net.minecraft.util.ChatComponentTranslation
|
||||
import net.minecraft.world.World
|
||||
|
||||
@ -21,37 +19,19 @@ trait CPULike extends Delegate {
|
||||
override protected def tooltipData: Seq[Any] = Seq(Settings.get.cpuComponentSupport(cpuTier))
|
||||
|
||||
override protected def tooltipExtended(stack: ItemStack, tooltip: util.List[String]) {
|
||||
(if (stack.hasTagCompound) {
|
||||
Option(stack.getTagCompound.getString(Settings.namespace + "archName"))
|
||||
}
|
||||
else {
|
||||
val architectures = allArchitectures
|
||||
architectures.headOption.map(_._2)
|
||||
}) match {
|
||||
case Some(archName) if !archName.isEmpty => tooltip.addAll(Tooltip.get("CPU.Architecture", archName))
|
||||
case _ => allArchitectures.headOption.collect {
|
||||
case ((_, name)) => tooltip.addAll(Tooltip.get("CPU.Architecture", name))
|
||||
}
|
||||
}
|
||||
tooltip.addAll(Tooltip.get("CPU.Architecture", DriverCPU.getArchitectureName(DriverCPU.architecture(stack))))
|
||||
}
|
||||
|
||||
override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = {
|
||||
if (player.isSneaking) {
|
||||
if (!world.isRemote) {
|
||||
val architectures = allArchitectures
|
||||
if (architectures.length > 0) {
|
||||
val currentIndex = if (stack.hasTagCompound) {
|
||||
val currentArch = stack.getTagCompound.getString(Settings.namespace + "archClass")
|
||||
architectures.indexWhere(_._1.getName == currentArch)
|
||||
}
|
||||
else {
|
||||
stack.setTagCompound(new NBTTagCompound())
|
||||
-1
|
||||
}
|
||||
val index = (currentIndex + 1) % architectures.length
|
||||
val (archClass, archName) = architectures(index)
|
||||
stack.getTagCompound.setString(Settings.namespace + "archClass", archClass.getName)
|
||||
stack.getTagCompound.setString(Settings.namespace + "archName", archName)
|
||||
val architectures = DriverCPU.allArchitectures.toList
|
||||
if (architectures.nonEmpty) {
|
||||
val currentIndex = architectures.indexOf(DriverCPU.architecture(stack))
|
||||
val newIndex = (currentIndex + 1) % architectures.length
|
||||
val archClass = architectures(newIndex)
|
||||
val archName = DriverCPU.getArchitectureName(archClass)
|
||||
DriverCPU.setArchitecture(stack, archClass)
|
||||
player.addChatMessage(new ChatComponentTranslation(Settings.namespace + "tooltip.CPU.Architecture", archName))
|
||||
}
|
||||
player.swingItem()
|
||||
@ -59,11 +39,4 @@ trait CPULike extends Delegate {
|
||||
}
|
||||
stack
|
||||
}
|
||||
|
||||
private def allArchitectures = api.Machine.architectures.map { arch =>
|
||||
arch.getAnnotation(classOf[Architecture.Name]) match {
|
||||
case annotation: Architecture.Name => (arch, annotation.value)
|
||||
case _ => (arch, arch.getSimpleName)
|
||||
}
|
||||
}.toArray
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ import li.cil.oc.OpenComputers
|
||||
import li.cil.oc.Settings
|
||||
import li.cil.oc.api
|
||||
import li.cil.oc.api.driver.EnvironmentHost
|
||||
import li.cil.oc.api.driver.item.Processor
|
||||
import li.cil.oc.api.driver.item.MutableProcessor
|
||||
import li.cil.oc.api.machine.Architecture
|
||||
import li.cil.oc.api.network.ManagedEnvironment
|
||||
import li.cil.oc.common.Slot
|
||||
@ -14,12 +14,14 @@ import li.cil.oc.common.item
|
||||
import li.cil.oc.common.item.Delegator
|
||||
import li.cil.oc.server.machine.luac.NativeLuaArchitecture
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.nbt.NBTTagCompound
|
||||
|
||||
import scala.collection.convert.WrapAsJava._
|
||||
import scala.collection.convert.WrapAsScala._
|
||||
|
||||
object DriverCPU extends DriverCPU
|
||||
|
||||
abstract class DriverCPU extends Item with Processor {
|
||||
abstract class DriverCPU extends Item with MutableProcessor {
|
||||
override def worksWith(stack: ItemStack) = isOneOf(stack,
|
||||
api.Items.get(Constants.ItemName.CPUTier1),
|
||||
api.Items.get(Constants.ItemName.CPUTier2),
|
||||
@ -39,6 +41,8 @@ abstract class DriverCPU extends Item with Processor {
|
||||
|
||||
override def supportedComponents(stack: ItemStack) = Settings.get.cpuComponentSupport(cpuTier(stack))
|
||||
|
||||
override def allArchitectures = api.Machine.architectures.toList
|
||||
|
||||
override def architecture(stack: ItemStack): Class[_ <: Architecture] = {
|
||||
if (stack.hasTagCompound) {
|
||||
val archClass = stack.getTagCompound.getString(Settings.namespace + "archClass") match {
|
||||
@ -57,4 +61,18 @@ abstract class DriverCPU extends Item with Processor {
|
||||
}
|
||||
api.Machine.architectures.headOption.orNull
|
||||
}
|
||||
|
||||
override def setArchitecture(stack: ItemStack, architecture: Class[_ <: Architecture]): Unit = {
|
||||
if (!worksWith(stack)) throw new IllegalArgumentException("Unsupported processor type.")
|
||||
if (!stack.hasTagCompound) stack.setTagCompound(new NBTTagCompound())
|
||||
stack.getTagCompound.setString(Settings.namespace + "archClass", architecture.getName)
|
||||
stack.getTagCompound.setString(Settings.namespace + "archName", getArchitectureName(architecture))
|
||||
}
|
||||
|
||||
// TODO Move to Machine API in 1.6
|
||||
def getArchitectureName(architecture: Class[_ <: Architecture]) =
|
||||
architecture.getAnnotation(classOf[Architecture.Name]) match {
|
||||
case annotation: Architecture.Name => annotation.value
|
||||
case _ => architecture.getSimpleName
|
||||
}
|
||||
}
|
||||
|
@ -478,7 +478,7 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
|
||||
|
||||
// Check if we should switch states. These are all the states in which we're
|
||||
// guaranteed that the executor thread isn't running anymore.
|
||||
state.synchronized(state.top match {
|
||||
state.synchronized(state.top) match {
|
||||
// Booting up.
|
||||
case Machine.State.Starting =>
|
||||
verifyComponents()
|
||||
@ -539,10 +539,8 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
|
||||
finally {
|
||||
inSynchronizedCall = false
|
||||
}
|
||||
|
||||
assert(!isExecuting)
|
||||
case _ => // Nothing special to do, just avoid match errors.
|
||||
})
|
||||
}
|
||||
|
||||
// Finally check if we should stop the computer. We cannot lock the state
|
||||
// because we may have to wait for the executor thread to finish, which
|
||||
@ -946,6 +944,8 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
|
||||
case Machine.State.Stopping =>
|
||||
state.clear()
|
||||
state.push(Machine.State.Stopping)
|
||||
case Machine.State.Restarting =>
|
||||
// Nothing to do!
|
||||
case _ => throw new AssertionError("Invalid state in executor post-processing.")
|
||||
}
|
||||
assert(!isExecuting)
|
||||
|
@ -1,9 +1,15 @@
|
||||
package li.cil.oc.server.machine.luac
|
||||
|
||||
import li.cil.oc.Settings
|
||||
import li.cil.oc.api
|
||||
import li.cil.oc.api.driver.item.MutableProcessor
|
||||
import li.cil.oc.api.driver.item.Processor
|
||||
import li.cil.oc.api.network.Connector
|
||||
import li.cil.oc.integration.opencomputers.DriverCPU
|
||||
import li.cil.oc.util.ExtendedLuaState.extendLuaState
|
||||
|
||||
import scala.collection.convert.WrapAsScala._
|
||||
|
||||
class ComputerAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) {
|
||||
def initialize() {
|
||||
// Computer API, stuff that kinda belongs to os, but we don't want to
|
||||
@ -105,6 +111,51 @@ class ComputerAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) {
|
||||
})
|
||||
lua.setField(-2, "maxEnergy")
|
||||
|
||||
lua.pushScalaFunction(lua => {
|
||||
machine.host.internalComponents.map(stack => (stack, api.Driver.driverFor(stack))).collectFirst {
|
||||
case (stack, processor: MutableProcessor) => processor.allArchitectures.toSeq
|
||||
case (stack, processor: Processor) => Seq(processor.architecture(stack))
|
||||
} match {
|
||||
case Some(architectures) =>
|
||||
lua.pushValue(architectures.map(DriverCPU.getArchitectureName))
|
||||
case _ =>
|
||||
lua.newTable()
|
||||
}
|
||||
1
|
||||
})
|
||||
lua.setField(-2, "getArchitectures")
|
||||
|
||||
lua.pushScalaFunction(lua => {
|
||||
machine.host.internalComponents.map(stack => (stack, api.Driver.driverFor(stack))).collectFirst {
|
||||
case (stack, processor: Processor) =>
|
||||
lua.pushString(DriverCPU.getArchitectureName(processor.architecture(stack)))
|
||||
1
|
||||
}.getOrElse(0)
|
||||
})
|
||||
lua.setField(-2, "getArchitecture")
|
||||
|
||||
lua.pushScalaFunction(lua => {
|
||||
val archName = lua.checkString(1)
|
||||
machine.host.internalComponents.map(stack => (stack, api.Driver.driverFor(stack))).collectFirst {
|
||||
case (stack, processor: MutableProcessor) => processor.allArchitectures.find(arch => DriverCPU.getArchitectureName(arch) == archName) match {
|
||||
case Some(archClass) =>
|
||||
if (archClass != processor.architecture(stack)) {
|
||||
processor.setArchitecture(stack, archClass)
|
||||
lua.pushBoolean(true)
|
||||
}
|
||||
else {
|
||||
lua.pushBoolean(false)
|
||||
}
|
||||
1
|
||||
case _ =>
|
||||
lua.pushNil()
|
||||
lua.pushString("unknown architecture")
|
||||
2
|
||||
}
|
||||
}.getOrElse(0)
|
||||
})
|
||||
lua.setField(-2, "setArchitecture")
|
||||
|
||||
// Set the computer table.
|
||||
lua.setGlobal("computer")
|
||||
}
|
||||
|
@ -1,11 +1,17 @@
|
||||
package li.cil.oc.server.machine.luaj
|
||||
|
||||
import li.cil.oc.Settings
|
||||
import li.cil.oc.api
|
||||
import li.cil.oc.api.driver.item.MutableProcessor
|
||||
import li.cil.oc.api.driver.item.Processor
|
||||
import li.cil.oc.api.network.Connector
|
||||
import li.cil.oc.integration.opencomputers.DriverCPU
|
||||
import li.cil.oc.util.ScalaClosure._
|
||||
import li.cil.repack.org.luaj.vm2.LuaValue
|
||||
import li.cil.repack.org.luaj.vm2.Varargs
|
||||
|
||||
import scala.collection.convert.WrapAsScala._
|
||||
|
||||
class ComputerAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) {
|
||||
override def initialize() {
|
||||
// Computer API, stuff that kinda belongs to os, but we don't want to
|
||||
@ -54,6 +60,40 @@ class ComputerAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) {
|
||||
|
||||
computer.set("maxEnergy", (_: Varargs) => LuaValue.valueOf(node.asInstanceOf[Connector].globalBufferSize))
|
||||
|
||||
computer.set("getArchitectures", (args: Varargs) => {
|
||||
machine.host.internalComponents.map(stack => (stack, api.Driver.driverFor(stack))).collectFirst {
|
||||
case (stack, processor: MutableProcessor) => processor.allArchitectures.toSeq
|
||||
case (stack, processor: Processor) => Seq(processor.architecture(stack))
|
||||
} match {
|
||||
case Some(architectures) => LuaValue.listOf(architectures.map(DriverCPU.getArchitectureName).map(LuaValue.valueOf).toArray)
|
||||
case _ => LuaValue.tableOf()
|
||||
}
|
||||
})
|
||||
|
||||
computer.set("getArchitecture", (args: Varargs) => {
|
||||
machine.host.internalComponents.map(stack => (stack, api.Driver.driverFor(stack))).collectFirst {
|
||||
case (stack, processor: Processor) => LuaValue.valueOf(DriverCPU.getArchitectureName(processor.architecture(stack)))
|
||||
}.getOrElse(LuaValue.NONE)
|
||||
})
|
||||
|
||||
computer.set("setArchitecture", (args: Varargs) => {
|
||||
val archName = args.checkjstring(1)
|
||||
machine.host.internalComponents.map(stack => (stack, api.Driver.driverFor(stack))).collectFirst {
|
||||
case (stack, processor: MutableProcessor) => processor.allArchitectures.find(arch => DriverCPU.getArchitectureName(arch) == archName) match {
|
||||
case Some(archClass) =>
|
||||
if (archClass != processor.architecture(stack)) {
|
||||
processor.setArchitecture(stack, archClass)
|
||||
LuaValue.TRUE
|
||||
}
|
||||
else {
|
||||
LuaValue.FALSE
|
||||
}
|
||||
case _ =>
|
||||
LuaValue.varargsOf(LuaValue.NIL, LuaValue.valueOf("unknown architecture"))
|
||||
}
|
||||
}.getOrElse(LuaValue.NONE)
|
||||
})
|
||||
|
||||
// Set the computer table.
|
||||
lua.set("computer", computer)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user