Merge branch 'master-MC1.7.10' of github.com:MightyPirates/OpenComputers into master-MC1.8

This commit is contained in:
Florian Nücke 2015-08-25 22:41:34 +02:00
commit a66bd22cd9
18 changed files with 197 additions and 51 deletions

View File

@ -12,7 +12,7 @@ import li.cil.oc.api.detail.*;
*/ */
public class API { public class API {
public static final String ID_OWNER = "OpenComputers|Core"; 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 DriverAPI driver = null;
public static FileSystemAPI fileSystem = null; public static FileSystemAPI fileSystem = null;

View File

@ -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);
}

View File

@ -2,6 +2,8 @@
![AAA](oredict:oc:accessPoint) ![AAA](oredict:oc:accessPoint)
*Этот блок устарел и будет удален в следующих версиях.* Замените его на [ретранслятор](relay.md).
Точки доступа, это беспроводные версии [коммутаторов](switch.md). Они могут быть использованы, когда требуется разделить подсети, чтобы устройства не видели [компоненты](../general/computer.md) в других сетях, однако сохраняя при этом возможность передачи сообщений между подсетями. Точки доступа, это беспроводные версии [коммутаторов](switch.md). Они могут быть использованы, когда требуется разделить подсети, чтобы устройства не видели [компоненты](../general/computer.md) в других сетях, однако сохраняя при этом возможность передачи сообщений между подсетями.
В дополнение к этому, точки доступа могут использоваться как повторители: они могут перенаправлять сообщения из проводной линии другим устройствам; или беспроводные сообщения как проводные, так и беспроводные. В дополнение к этому, точки доступа могут использоваться как повторители: они могут перенаправлять сообщения из проводной линии другим устройствам; или беспроводные сообщения как проводные, так и беспроводные.

View File

@ -39,6 +39,7 @@
* [Точка доступа](accessPoint.md) * [Точка доступа](accessPoint.md)
* [Кабель](cable.md) * [Кабель](cable.md)
* [Сетевой переключатель](netSplitter.md) * [Сетевой переключатель](netSplitter.md)
* [Ретранслятор](relay.md)
* [Коммутатор](switch.md) * [Коммутатор](switch.md)
## Управление питанием ## Управление питанием

View File

@ -2,6 +2,6 @@
![*.net *.split](oredict:oc:netSplitter) ![*.net *.split](oredict:oc:netSplitter)
Сетевой переключатель позволяет контролировать соединение между подсетями. В отличие от [коммутатора](switch.md) или [конвертера энергии](powerConverter.md) позволяет непосредственно соединить подсети, делая при этом доступными все компоненты. Соединение каждой стороны переключается [ключем](../item/wrench.md). При подаче редстоун-сигнала все соединения инвертируются. Сетевой переключатель позволяет контролировать соединение между подсетями. В отличие от [ретранслятора](relay.md) или [конвертера энергии](powerConverter.md) позволяет непосредственно соединить подсети, делая при этом доступными все компоненты. Соединение каждой стороны переключается [ключем](../item/wrench.md). При подаче редстоун-сигнала все соединения инвертируются.
Таким образом, этот блок может быть использован для переключения соединения определенных компонентов сети. Используйте [редстоун-I/O](redstone.md) или [редстоун карты](../item/redstoneCard1.md) для автоматизации сетевого переключателя. Таким образом, этот блок может быть использован для переключения соединения определенных компонентов сети. Используйте [редстоун-I/O](redstone.md) или [редстоун карты](../item/redstoneCard1.md) для автоматизации сетевого переключателя.

View File

@ -0,0 +1,13 @@
# Ретранслятор
![Строит мосты.](oredict:oc:relay)
Ретранслятор используется для передачи сообщений между несколькими подсетями, изолируя компоненты [компьютеров](../general/computer.md) в других сетях. Сохранение компонентов, как правило, хорошая идея, что не позволяет [компьютерам](../general/computer.md) использовать неверный [монитор](screen1.md) или не позволяет перенагружать их (в результате чего [компьютеры](../general/computer.md) выключатся и отказываются загружаться).
Может быть улучшен добавлением [беспроводной сетевой карты](../item/wlanCard.md), что позволит ретранслировать беспроводные сообщения. Сообщения, переданные по беспроводной линии могут быть получены или перенаправлены другими ретрансляторами или [компьютерами](../general/computer.md) с [беспроводной сетевой картой](../item/wlanCard.md).
Также ретранслятор может быть улучшен с помощью [соединенной карты](../item/linkedCard.md). Это позволит передавать сообщения внутри туннеля, предоставленного картой, также; с обычными затратами энергии, поэтому убедитесь, что на ретранслятор поступает нужное количество энергии.
Ретрансляторы *не* отслеживают, какие пакеты и куда они передали, поэтому для в сети могут образовываться петли или вы можете получать одно сообщение несколько раз. Из-за ограниченного буфера сообщений коммутатора, частое отправление сообщений приводит к их потере. Вы можете улучшить ретранслятор для увеличения скорости обработки сообщений, а также увеличения размера сообщений.
Сообщения, могут перенаправлены всего несколько раз, поэтому цепочки с произвольным количеством ретрансляторов невозможны. По умолчанию, сообщение может быть перенаправлено пять раз.

View File

@ -6,4 +6,4 @@
Каждый [сервер](../item/server1.md) в серверной стойке может взаимодействовать только с одной "стороной" стойки или ни с какой. К какой стороне, какой [сервер](../item/server1.md) подключен, настраивается в интерфейсе стойки. Будьте внимательны, стороны считаются относительно самой стойки, например, если вы смотрите на стойку спереди, то `правая сторона` стойки для вас будет слева. Каждый [сервер](../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) для операций фильтрации и направления данных, например.

View File

@ -2,6 +2,8 @@
![Строит мосты.](oredict:oc:switch) ![Строит мосты.](oredict:oc:switch)
*Этот блок устарел и будет удален в следующих версиях.* Замените его на [ретранслятор](relay.md).
Коммутатор используется для передачи сообщений между несколькими подсетями, не используя компоненты [компьютеров](../general/computer.md) в других сетях. Сохранение компонентов, как правило, хорошая идея, что не позволяет [компьютерам](../general/computer.md) использовать неверный [монитор](screen1.md) или не позволяет перенагружать их (в результате чего [компьютеры](../general/computer.md) выключатся и отказываются загружаться). Коммутатор используется для передачи сообщений между несколькими подсетями, не используя компоненты [компьютеров](../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/wlanCard.md).

View File

@ -2,4 +2,4 @@
![Войди в сеть.](oredict:oc:lanCard) ![Войди в сеть.](oredict:oc:lanCard)
Сетевая карта позволяет [компьютерам](../general/computer.md) отправлять и получать сетевые сообщения. Сообщения (или пакеты) будут отправлены всем принимающим устройствам в подсети или конкретной сетевой карте (после указания ее адреса). [Коммутаторы](../block/switch.md) и [точки доступа](../block/accessPoint.md) могут быть использованы для связи нескольких подсетей друг с другом, для передачи сообщений в них. Также возможно отправить письмо получателю, даже если он находится в другой подсети, если сеть подключена к одному или нескольким [коммутаторам](../block/switch.md). Сетевая карта позволяет [компьютерам](../general/computer.md) отправлять и получать сетевые сообщения. Сообщения (или пакеты) будут отправлены всем принимающим устройствам в подсети или конкретной сетевой карте (при указании её адреса). [Ретрансляторы](../block/relay.md) могут быть использованы для связи нескольких подсетей друг с другом и передачи сообщений. Также возможно отправить письмо получателю, даже если он находится в другой подсети, если сеть подключена к одному или нескольким [ретрасляторами](../block/relay.md).

View File

@ -3,7 +3,7 @@
# Use [nl] to for a line break. # Use [nl] to for a line break.
# Blocks # Blocks
tile.oc.accessPoint.name=Точка доступа tile.oc.accessPoint.name=§cТочка доступа§7
tile.oc.adapter.name=Адаптер tile.oc.adapter.name=Адаптер
tile.oc.assembler.name=Сборщик роботов tile.oc.assembler.name=Сборщик роботов
tile.oc.cable.name=Кабель tile.oc.cable.name=Кабель
@ -35,7 +35,7 @@ tile.oc.screen1.name=Монитор (1-ый уровень)
tile.oc.screen2.name=Монитор (2-ой уровень) tile.oc.screen2.name=Монитор (2-ой уровень)
tile.oc.screen3.name=Монитор (3-ий уровень) tile.oc.screen3.name=Монитор (3-ий уровень)
tile.oc.serverRack.name=Серверная стойка tile.oc.serverRack.name=Серверная стойка
tile.oc.switch.name=Коммутатор tile.oc.switch.name=§cКоммутатор§7
tile.oc.netSplitter.name=Сетевой переключатель tile.oc.netSplitter.name=Сетевой переключатель
tile.oc.waypoint.name=Путевая точка tile.oc.waypoint.name=Путевая точка
@ -232,6 +232,7 @@ oc:container.Disassembler=Разборщик
oc:container.DiskDrive=Дисковод oc:container.DiskDrive=Дисковод
oc:container.Printer=Принтер oc:container.Printer=Принтер
oc:container.Raid=RAID oc:container.Raid=RAID
oc:container.Relay=Ретранслятор
oc:container.Server=Сервер oc:container.Server=Сервер
oc:container.ServerRack=Серверная стойка oc:container.ServerRack=Серверная стойка
oc:container.Switch=Коммутатор 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.WirelessCBE=Мод §fWireless Redstone (ChickenBones)§7 §aподдерживается§7.
oc:tooltip.RedstoneCard.WirelessSV=Мод §fWireless Redstone (SlimeVoid)§7 §aподдерживается§7. oc:tooltip.RedstoneCard.WirelessSV=Мод §fWireless Redstone (SlimeVoid)§7 §aподдерживается§7.
oc:tooltip.RedstoneCard=Позволяет принимать и излучать сигналы красного камня вокруг компьютера или робота. oc:tooltip.RedstoneCard=Позволяет принимать и излучать сигналы красного камня вокруг компьютера или робота.
oc:tooltip.Relay=Позволяет соединять различные сети между собой. Передаются только сообщения, компоненты между сетями недоступны. Используйте его для разделения сетей с возможностью пересылать сообщения между ними.
oc:tooltip.Robot=В отличие от компьютеров, роботы могут передвигаться и взаимодействовать с миром, как игрок.[nl] §cНе могут взаимодействовать с внешними компонентами.§7 oc:tooltip.Robot=В отличие от компьютеров, роботы могут передвигаться и взаимодействовать с миром, как игрок.[nl] §cНе могут взаимодействовать с внешними компонентами.§7
# The underscore makes sure this isn't hidden with the rest of the tooltip. # The underscore makes sure this isn't hidden with the rest of the tooltip.
oc:tooltip.Robot_Level=§fУровень§7: §a%s§7. oc:tooltip.Robot_Level=§fУровень§7: §a%s§7.

View File

@ -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). 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. 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. 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. Welcome to the dark side - here, have some cookies.
Screens can display Unicode - paste the special chars or use unicode.char. 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`. Run `help` or `man programname` for ingame help on programs shipped with OpenOS - start with `man man`.

View File

@ -1320,6 +1320,23 @@ local libcomputer = {
beep = function(...) beep = function(...)
libcomponent.invoke(computer.address(), "beep", ...) 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 end
} }
sandbox.computer = libcomputer sandbox.computer = libcomputer

View File

@ -19,7 +19,7 @@ object OpenComputers {
final val Name = "OpenComputers" final val Name = "OpenComputers"
final val Version = "1.5.16" final val Version = "@VERSION@"
var log = LogManager.getLogger(Name) var log = LogManager.getLogger(Name)

View File

@ -3,12 +3,10 @@ package li.cil.oc.common.item.traits
import java.util import java.util
import li.cil.oc.Settings import li.cil.oc.Settings
import li.cil.oc.api import li.cil.oc.integration.opencomputers.DriverCPU
import li.cil.oc.api.machine.Architecture
import li.cil.oc.util.Tooltip import li.cil.oc.util.Tooltip
import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.util.ChatComponentTranslation import net.minecraft.util.ChatComponentTranslation
import net.minecraft.world.World 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 tooltipData: Seq[Any] = Seq(Settings.get.cpuComponentSupport(cpuTier))
override protected def tooltipExtended(stack: ItemStack, tooltip: util.List[String]) { override protected def tooltipExtended(stack: ItemStack, tooltip: util.List[String]) {
(if (stack.hasTagCompound) { tooltip.addAll(Tooltip.get("CPU.Architecture", DriverCPU.getArchitectureName(DriverCPU.architecture(stack))))
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))
}
}
} }
override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = { override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = {
if (player.isSneaking) { if (player.isSneaking) {
if (!world.isRemote) { if (!world.isRemote) {
val architectures = allArchitectures val architectures = DriverCPU.allArchitectures.toList
if (architectures.length > 0) { if (architectures.nonEmpty) {
val currentIndex = if (stack.hasTagCompound) { val currentIndex = architectures.indexOf(DriverCPU.architecture(stack))
val currentArch = stack.getTagCompound.getString(Settings.namespace + "archClass") val newIndex = (currentIndex + 1) % architectures.length
architectures.indexWhere(_._1.getName == currentArch) val archClass = architectures(newIndex)
} val archName = DriverCPU.getArchitectureName(archClass)
else { DriverCPU.setArchitecture(stack, archClass)
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)
player.addChatMessage(new ChatComponentTranslation(Settings.namespace + "tooltip.CPU.Architecture", archName)) player.addChatMessage(new ChatComponentTranslation(Settings.namespace + "tooltip.CPU.Architecture", archName))
} }
player.swingItem() player.swingItem()
@ -59,11 +39,4 @@ trait CPULike extends Delegate {
} }
stack 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
} }

View File

@ -5,7 +5,7 @@ import li.cil.oc.OpenComputers
import li.cil.oc.Settings import li.cil.oc.Settings
import li.cil.oc.api import li.cil.oc.api
import li.cil.oc.api.driver.EnvironmentHost 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.machine.Architecture
import li.cil.oc.api.network.ManagedEnvironment import li.cil.oc.api.network.ManagedEnvironment
import li.cil.oc.common.Slot 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.common.item.Delegator
import li.cil.oc.server.machine.luac.NativeLuaArchitecture import li.cil.oc.server.machine.luac.NativeLuaArchitecture
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import scala.collection.convert.WrapAsJava._
import scala.collection.convert.WrapAsScala._ import scala.collection.convert.WrapAsScala._
object DriverCPU extends DriverCPU 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, override def worksWith(stack: ItemStack) = isOneOf(stack,
api.Items.get(Constants.ItemName.CPUTier1), api.Items.get(Constants.ItemName.CPUTier1),
api.Items.get(Constants.ItemName.CPUTier2), 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 supportedComponents(stack: ItemStack) = Settings.get.cpuComponentSupport(cpuTier(stack))
override def allArchitectures = api.Machine.architectures.toList
override def architecture(stack: ItemStack): Class[_ <: Architecture] = { override def architecture(stack: ItemStack): Class[_ <: Architecture] = {
if (stack.hasTagCompound) { if (stack.hasTagCompound) {
val archClass = stack.getTagCompound.getString(Settings.namespace + "archClass") match { 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 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
}
} }

View File

@ -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 // Check if we should switch states. These are all the states in which we're
// guaranteed that the executor thread isn't running anymore. // guaranteed that the executor thread isn't running anymore.
state.synchronized(state.top match { state.synchronized(state.top) match {
// Booting up. // Booting up.
case Machine.State.Starting => case Machine.State.Starting =>
verifyComponents() verifyComponents()
@ -539,10 +539,8 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
finally { finally {
inSynchronizedCall = false inSynchronizedCall = false
} }
assert(!isExecuting)
case _ => // Nothing special to do, just avoid match errors. case _ => // Nothing special to do, just avoid match errors.
}) }
// Finally check if we should stop the computer. We cannot lock the state // 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 // 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 => case Machine.State.Stopping =>
state.clear() state.clear()
state.push(Machine.State.Stopping) state.push(Machine.State.Stopping)
case Machine.State.Restarting =>
// Nothing to do!
case _ => throw new AssertionError("Invalid state in executor post-processing.") case _ => throw new AssertionError("Invalid state in executor post-processing.")
} }
assert(!isExecuting) assert(!isExecuting)

View File

@ -1,9 +1,15 @@
package li.cil.oc.server.machine.luac package li.cil.oc.server.machine.luac
import li.cil.oc.Settings 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.api.network.Connector
import li.cil.oc.integration.opencomputers.DriverCPU
import li.cil.oc.util.ExtendedLuaState.extendLuaState import li.cil.oc.util.ExtendedLuaState.extendLuaState
import scala.collection.convert.WrapAsScala._
class ComputerAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) { class ComputerAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) {
def initialize() { def initialize() {
// Computer API, stuff that kinda belongs to os, but we don't want to // 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.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. // Set the computer table.
lua.setGlobal("computer") lua.setGlobal("computer")
} }

View File

@ -1,11 +1,17 @@
package li.cil.oc.server.machine.luaj package li.cil.oc.server.machine.luaj
import li.cil.oc.Settings 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.api.network.Connector
import li.cil.oc.integration.opencomputers.DriverCPU
import li.cil.oc.util.ScalaClosure._ import li.cil.oc.util.ScalaClosure._
import li.cil.repack.org.luaj.vm2.LuaValue import li.cil.repack.org.luaj.vm2.LuaValue
import li.cil.repack.org.luaj.vm2.Varargs import li.cil.repack.org.luaj.vm2.Varargs
import scala.collection.convert.WrapAsScala._
class ComputerAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) { class ComputerAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) {
override def initialize() { override def initialize() {
// Computer API, stuff that kinda belongs to os, but we don't want to // 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("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. // Set the computer table.
lua.set("computer", computer) lua.set("computer", computer)
} }